Формы. Как сделать зависимые поля в таблице (Страна, Город)

Т.е. при обновлении одного поля, необходимо, чтобы другое также меняло свое состояние.

  1. Ставим у колонки поле Зависимые поля (dependentCols) списком через запятую (указываем те поля, которые должны обновляться при изменении данного поля).
  2. В процедуре Источника будет необязательный параметр @fields DictionaryParameter, который передает текущее состоние формы (он должен быть необязательный как в примере).  ВАЖНО! Он используется только в зависимых столбцах. В обычных элементов с выбором из списка не нужно его указывать.

Ведущий запрос (Страны). fields можно здесь не использовать в параметрах (если использовать то по умолчанию ‘’).

CREATE PROCEDURE [dbo].[fm_user_country_dict]
  @username nvarchar(256)
  @itemID int
AS
BEGIN
    select 'Не выбрано' Text, 0 Value, 0 Selected
    union
    select name Text, id Value, 0 Selected from as_geo_regions where typeID = 1
    order by Text

END

Ведомый запрос (города). Важно соблюсти все нюансы использования fields+ искать и по id и по name через or как в примере.

CREATE PROCEDURE [dbo].[fm_user_country_dict]
  @username nvarchar(256)
  @itemID int
  @fields DictionaryParameter READONLY

AS
BEGIN
    declare @country nvarchar(128)
    select @country = Value from @fields where [key] = 'country'
    exec dbo.as_print @str = @country

        select 'Не выбрано' Text, 0 Value, 0 Selected
    union
    select name Text, id Value, 0 Selected from as_geo_regions where typeID = and
        (cast(parentID as nvarchar) = @country or isnull(@country, '') = '' or parentID in (select id from as_geo_regions where name = @country))
    order by Text
END
  1. Разметка в форме любая, можно использовать например такую:
    <label>Страна / город </label> {colcontrol-country} {colcontrol-city}
    

  1. В процедуре GetItem устанавливайте значения для обоих полей.
isnull((select name from as_geo_regions
    where id = (select parentID from as_geo_regions where id = regionID)), 'Не указан') country,
isnull((select name from as_geo_regions
    where id = regionID), 'Не указан') city 

  1. В итоге поля будут работать как зависимые.

Примечание:

Зависимые столбцы работают не только для списковых элементов, но и для полей типа text и др.

Для этого указываем также зависимые поля и устанавливаем не для спискового значения хранимку значений, которая должна возвращать 1 строку с Text и Value:

  1. Text - устанавливает значение элемента.
  2. Value - если 0, то прячет элемент.

Пример:

CREATE PROCEDURE [dbo].[fm_user_email_dict]
   @username nvarchar(256),
   @itemID nvarchar(128),
   @fields DictionaryParameter READONLY --- если нужно сделать зависимые столбцы (в
                                            коллекции передаются состояние всех столбцов)
AS
BEGIN
        
        DECLARE @skype nvarchar(128)
        SELECT @skype = Value FROM @fields WHERE [Key] = 'skype'
       
        if(@skype<>'')BEGIN
            SELECT 'Есть скайп' Text, 1 Value, 0 Selected
        END else BEGIN
            SELECT '' Text, 0 Value, 0 Selected
        END
END

ВАЖНО. Скрытие видимости не будет действовать для списковых полей!

Примечание