Принципы построения видеоокон.

Видео-окна, далее для краткости окна, содержат от 1 до 10 зон. Зоны нумеруются от нуля. Нулевая зона не может содержать область прокрутки и называется панелью. По умолчанию панель в окне присутствует всегда, но если в ней не выведено ни одного поля, при загрузке окна такая панель автоматически удаляется из перечня зон окна. Остальные зоны не могут содержать ничего, кроме области прокрутки и называются рулонами.

Каждая зона обязана иметь мастер-файл (для краткости - мастер). Это главный файл зоны: в нем выполняется позиционирование, его поля можно редактировать в данной зоне, по ключам этого файла устанавливается сортировка записей в рулонах, на его поля можно накладывать условия фильтров и т.п. Кроме того, каждое окно имеет мастер-файл окна. Из этого правила имеются исключения:

  1. Если выражения полей панельной зоны не содержат ни одного поля файла БД, то такая панель может не иметь мастер-файла.
  2. Если окно не содержит рулонных зон, а панельная зона не имеет мастер-файла, то окно может не иметь мастер-файла.

Выражения полей зоны могут содержать поля ее мастера, поля транзитивных справочников мастера (исторический Borrow здесь считается справочником), перманентные и зонные переменные, константы.

Все зоны окна обязаны быть связанными друг с другом через свои мастер-файлы. Эта связь определяется при загрузке окна. В правильно спроектированном окне все зоны объединены в дерево (именно дерево, не граф), корнем которого является некая фиктивная, не отображаемая на экране зона, мастером, которой является мастер окна (далее для краткости будем называть ее просто окном). Зоны, которые логически непосредственно связаны с ней, будем называть подчиненными окну зонами. Каждой зоне могут быть подчинены другие несколько зон. Зону, обратную к подчиненной, будем называть главенствующей.

Если две рулонные зоны окна имеют одинаковый мастер-файл и одинаковые условия, т.е. представление и фильтр, и при этом одна из них является View-only зоной, а другая нет, то View-only зона становится добавочной зоной, а другая основной. Для каждой основной зоны в окне может быть несколько добавочных. Смысл добавочной зоны - продолжение основной зоны. Добавочную приходится заводить, когда не хватает длины основной зоны для размещения всех полей. Специфические свойства добавочной зоны:

Если подчиненность зоны не указана явно, то она определяется автоматически по следующему алгоритму

  1. Определяются добавочные зоны. Они становятся подчиненными к своим основным зонам и далее не рассматриваются как кандидаты на главенствующие зоны к другим зонам окна.
  2. Ищется главенствующая зона для каждой зоны-рулона X. Для этого
    1. Вычисляются зоны-кандидаты на эту роль. Зона Y становится кандидатом, если выполняется одно из условий (в порядке убывания приоритета)
      1. на мастер зоны X наложены условия, в которых участвуют поля только одного  файла F, и этот файл F - есть мастер M зоны Y или транзитивный справочник файла M
      2. мастер F зоны X - это непосредственный Borrow-файл (в том числе и исторический) к мастеру M зоны Y или транзитивному справочнику файла M
      Под транзитивным справочником к файлу M здесь понимается файл, в который из файла M можно построить link-путь, содержащий связи только следующего типа
      • в справочник
      • в Lend
      • в исторический Borrow
    2. Из всех зон-кандидатов, выбираются зоны, путь из мастера которых в файл F совпадает с конечным отрезком путей из мастеров других зон-кандидатов в файл F. Если
      • найдена более чем одна такая рулонная зона, возникает ошибка.
      • ни одной такой зоны не найдено, а мастер зоны X совпадает с мастером окна, то зона X становится подчиненной окну.
      • среди отобранных главенствующей зоной становится (в порядке убывания приоритета)
        1. Рулон
        2. Панель
        3. Окно
  3. Ищется главенствующая зона к 0-й зоне (панели). Ею становится (в порядке убывания приоритета)
    1. окно, если панель не имеет мастера
    2. зона-рулон Y, если это единственный рулон, мастер-файл которого совпадает с мастер-файлом зоны 0
    3. окно, если мастер-файл окна совпадает с мастер-файлом зоны 0
    В противном случае возникает ошибка.

Из этого алгоритма следуют правила построения окон, например

  1. Мастерами зон окна могут быть либо непосредственные BORROW-файлы к мастеру окна или мастеру другой зоны, а также к транзитивным справочникам этих мастеров, либо файлы, на которые наложены условия с участием полей мастера окна или мастера другой зоны, а также транзитивных справочников этих мастеров.

    Разрешено, например, следующее окно ("Вид работы"):

    Путь из мастера 1-й зоны в мастер 2-й проходит через справочник и исторический Borrow. Это окно демонстрирует еще и нелинейную подчиненность зон - 2-я и 3-я зоны здесь подчинены 1-й.

  2. В окне должна быть единственная зона рулона Y, из мастера которой строится оптимальный путь в подчиненную зону X

    Возникает ошибка "неоднозначность", например, в следующем окне (бывшее "виды расчета зарплаты"):

    При попытке найти главенствующую зону к 3-й зоне невозможно сделать выбор между 2-й и 4-й при условии, что и 2-я и 4-я не ViewOnly-зоны. Если 4-я - это ViewOnly-зона, то конфликт разрешается, т.к. она становится добавочной к зоне 2.

  3. Если несколько зон имеют мастер-файлы, образующие цепочку LEND-BORROW, то такая цепочка обязана иметь все непосредственно связанные между собой файлы, т.е. пропуски не допускаются.
  4. На мастер-файл зоны может быть наложено несколько условий, но в этих условиях могут присутствовать поля только одного файла, не считая констант и перманентных переменных, причем в этот файл обязан быть мастером окна или одной из его зон либо транзитивным справочником мастера окна или зоны.

    Нельзя, например, сделать зону с мастером PCalc и условиями

  5. Допускается несколько рулонных зон, имеющих такой же мастер-файл, что и окно, и при этом не имеющее в условиях полей мастер-файлов других зон (даже без учета случаев, когда одна зона является добавочной к другой).

    Разрешено, например, окно:

    Другой пример - окно "образование и трудовая деятельность"

  6. Мастерами зон не могут быть файлы-справочники к мастерам других зон, если на эти справочники не наложены условия с участием полей мастеров других зон или их транзитивных справочников. Запрещено, например, окно

    Но разрешено окно (переделанное мною StExit - "Выходы", поднимается по F5 из "Разнарядки путевого листа")

  7. Запрещено окно, содержащее две зоны с несвязанными мастер-файлами, например, Staff и Car, если на одну из них не наложены условия с использованием полей мастера другой зоны.

Пока имеется ограничение: 0-я зона не может иметь представление или фильтр. Этим, например, отвергается существование такого окна:

Посмотреть как связаны между собой мастера окон, мастера зон в окне и файлы полей зоны можно с помощью диалога "Loaded Windows".