Работа видеоконформа.
Одна из главных задач видео-системы -
автоматическая перерисовывка всех поднятых на
экране окон, чтобы всегда отображать в них те
записи, которые соответствуют текущей записи
текущей зоны верхнего окна. Этот процесс далее
будем называть видеоконформом. Для
выполнения видеоконформа в каждой зоне окна
имеется курсор для работы с
собственным мастер-файлом, кроме того в окне
имеется курсор для работы с мастером окна. Будем
называть их соответственно курсором зоны и
курсором окна. Общая схема видеоконформа
выглядит следующим образом:
- Отрисовывается верхнее окно.
Если
видеоконформ выполняется по одной из следующих
причин:
- переход в зону Y одного окна из зоны X другого
окна, если из мастера зоны X невозможно построить
транзитивную справочную связь в мастер окна зоны
Y;
- переход в зону Y из неоконного процесса,
например, после выполнения программы, отчета;
- переход в другую зону Y того же окна,
то для отрисовки верхнего окна (окна зоны Y)
выполняется процедура "межзонного
видеоконформа с перепозиционированием в
главенствующих зонах".
Если видеоконформ выполняется в других
случаях, т.е. при работе внутри зоны, например, при
перемещении по записям зоны, поиске нужной
записи внутри зоны, смене индекса сортировки
записей зоны и т.п., то при отрисовке верхнего
окна выполняется процедура "межзонного
видеоконформа", лидером которого является
текущая зона верхнего окна. В зоны,
главенствующие к текущей, видеоконформ в этом
случае не ходит, полагая что они не могли
измениться (сетевая работа здесь не принимается
в расчет).
- Отрисовываются все остальные окна (в
произвольном порядке).
Если окно W является независимым, то
видеоконформ из текущей зоны верхнего окна идет
в мастер окна W, а если окно является подчиненным или зависимым, то видеоконформ
в его мастер идет из порождающей зоны.
Если между этими мастерами можно построить
транзитивную справочную связь, то в курсоре
мастера окна W выполняется позиционирование на
основе этой связи, назовем этот процесс "межоконным видеоконформом", после
чего в окне W выполняется "межзонный
видеоконформ", лидером которого является
мастер окна. Этот "межзонный видеоконформ"
имеет особенность: позиционирование в каждой
зоне окна выполняется с учетом позиции лидера
всего видеоконформа (текущей записи текущей зоны
верхнего окна), см. п.2 в описании
межзонного видеоконформа.
Если из мастера текущей зоны верхнего окна
невозможно построить транзитивную справочную
связь в мастер окна W, то в окне W выполняется
процедура "межзонного
видеоконформа с перепозиционированием в
главенствующих зонах".
Очевидно, что проход в подчиненное и зависимые
окна выполняется только после того, как
выполнится позиционирование в соответствующей
порождающей зоне.
Опишем более подробно отдельные процедуры
видеоконформа.
- Межзонный видеоконформ.
Это
проход из зоны-лидера конформа окна во все
остальные транзитивно подчиненные ей зоны этого
окна, чтобы спозиционироваться в курсорах этих
зон. Для этого из зоны-лидера видеоконформ идет
во все непосредственно подчиненные ей зоны, а из
этих зон в непосредственно подчиненные им зоны и
т.д.
Далее приводится алгоритм одного шага
межзонного конформа - это проход из зоны-лидера (с
точки зрения данного шага) в непосредственно
подчиненную ей зону
- Если в целевой зоне идет процесс
редактирования, в этой зоне никакого
позиционирования не выполняется, и текущей
остается редактируемая позиция
- Иначе, если целевая зона - это панель
подчиненного окна, то в курсор целевой зоны
копируется вся информация о позиции из курсора
порождающей зоны. Из этого следует, например, что
панели подчиненного окна всегда установлен тот
же селект, что и в порождающей зоне
- Иначе в целевой зоне выполняется
позиционирование.
- Если в мастере зоны-лидера определена позиция,
то в ней отображаются записи, ближайшие к
текущей, а сама текущая запись отображается
выделенной цветом. Назовем это выделение HighLight.
Из такой зоны конформ в подчиненные выполняется
в несколько этапов
- В подчиненной зоне определяется позиция и
селект на основании условия подчиненности. Для
этого на временном курсоре выполняется
позиционирование:
- Если зона подчинена на основе представления с
участием полей мастер-файла (или его
транзитивного справочника) зоны-лидера: на
основании условий представления выполняется
SELECT. Если (начиная с версии 14.44.5) представление
определяет в зоне единственную запись, т.е. в представлении
указаны все поля уникального ключа, то на эту единственную
запись выполняется позиционирование и в случае удачи эта
запись будет выделена HighLight, иначе текущая позиция в
зоне будет не определенной,
поэтому в целевой зоне будут отображаться
записи, удовлетворяющие полученному селекту, но
ни одна из них не будет выделена HighLight. Следует
заметить, что если на зону наложено
представление, то связь Lend-Borrow между мастерами
зон не учитывается.
- Если мастер подчиненной зоны совпадает с
мастером зоны-лидера: временный курсор получает
селект и позицию из курсора зоны лидера.
- Если мастером подчиненной зоны является
непосредственный Borrow-файл к мастеру (или его
транзитивному справочнику) зоны-лидера: во
временном курсоре выполняется SELECT на основании
значений полей связи Lend-Borrow, текущая позиция при
этом не определена, поэтому в целевой зоне будут
отображаться записи, удовлетворяющие
полученному селекту, но ни одна из них не будет
выделена HighLight. Это же правило относится и к
историческим Borrow-файлам.
- Если зона подчинена на основе фильтра с
участием полей мастер-файла (или его
транзитивного справочника) зоны-лидера:
позиционирование во временном курсоре не
выполняется.
Из вышеперечисленного видно, что позиция во
временном курсоре почти всегда становится
неопределенной, а селект, наоборот почти всегда
определяется. Дополнительной причиной, почему
селект во временном курсоре может оказаться
неопределенным, является невозможность
получения информации из зоны-лидера для его
выполнения. Причины здесь могут быть, например,
такие:
- текущая запись или весь мастер-файл зоны-лидера
монопольно заблокированы с другой рабочей
станции
- монопольно заблокирована с другой рабочей
станции запись (или весь файл), через которую
проходит путь к транзитивному справочнику
мастера зоны-лидера, если поля этого справочника
участвуют в условиях подчиненной зоны или
подчиненная зона - это Borrow к этому справочнику.
Например, для в окне "Виды расчета зарплаты"
конформ идет из зоны 2 с мастером Methods в зону 3 с
мастером MoneyRul
(Methods<----MoneyMth-->>>MMthLog--->>MoneyRul), и если файл
MoneyMth будет монопольно заблокирован, то
невозможно определить селект в MoneyRul.
- ситуация, аналогичная описанной в предыдущем
пункте, но мешает не блокировка, а неверное
заполнена базы - нужная запись в справочнике
просто отсутствует
- Если после выполнения первого
этапа позиция во временном курсоре оказалась
неопределенной, а данный внутриоконный конформ
выполняется для неверхнего окна, то выполняется
попытка спозиционироваться в нем (в пределах
полученного на первом этапе селекта) на
основании значений полей записи-лидера всего
конформа, т.е. текущей записи текущей зоны
верхнего окна. Это позволяет показывать позиции
в справочниках, отображенных в подчиненных
зонах.
Например, поднимем окно
"Маршруты"(Route) и с помощью ShiftEnter подчиненное
окно "Маршрут", которое имеет зону
"Модификации"(RoutMod; Route--->>RoutMod). Затем
поднимем окно "Выходы"(StExit) и с помощью ShiftEnter
подчиненное окно "Выход", которое имеет зону
"Рейсы"(SEJobs; StExit--->>SEJobs). Перемещаясь по
записям "рейсов" наблюдаем HighLight в
"модификациях маршрутов", т.к. RoutMod является
справочником к SEJobs, и в "модификациях
маршрутов"(RoutMod) кроме селекта из
главенствующей зоны(Route) выполняется еще и
позиционирование на основе значений полей
зоны-лидера конформа (SEJobs).
- Курсор подчиненной зоны адаптируется к позиции
временного курсора. Выполняется попытка не
потеряв ручных настроек (например, ручной селект)
спозиционироваться на ту же запись, что и во
ременном курсоре. Если это не удалось, то в
курсоре подчиненной зоны позиция становится
неопределенной и записи будут отображаться без
HighLight.
- Если зона имеет фильтр, то позиция курсора зоны
адаптируется к условиям фильтра.
- Если ViewOnly-зона построена так, что в ней может отображаться
только единственная запись, т.е. отображаемые записи ограничены
селектом по всем полям уникального ключа, то запись в такой зоне
отображается без HighLight, хотя позиция в зоне определена.
- Если в мастере зоны-лидера текущая позиция не
определена, ни одна из записей в ней не
выделяется с помощью HighLight. Если у такой зоны
имеются подчиненные, то при выполнении конформа
невозможно в них определить даже селект из-за
отсутствия позиции в зоне-лидере. Поэтому вместо
записей в них отображаются символы "сетка".
- Если в мастере зоны-лидера не определен селект,
то селект будет неопределенным и во всех
подчиненных ей зонах - они тоже будут заполнены
символами "сетка".
- Межзонный видеоконформ с
перепозиционированием в главенствующих зонах.
В
дополнение к обычному межзонному видеоконформу
здесь выполняется перепозиционирование во всех
зонах, главенствующих над текущей. Выполняется
оно по цепочке подчиненности, начиная с мастера
окна, и заканчивая текущей зоной окна. В каждой
такой зоне выполняется попытка
спозиционироваться на ту же запись, которая уже
была текущей в данной зоне (т.е. под HighLight). Если
при этом окажется, что в некоторой зоне Z
невозможно спозиционироваться на запись,
которая раньше была текущей, то в оставшихся
зонах цепочки перепозиционирование не
осуществляется и текущей зоной окна теперь
станет эта зона Z.
Пример: окно с мастер-файлом A имеет зону 1 с
мастер файлом A, зону 2 с мастер-файлом B (B - это BORROW
к A), зону 3 с мастер-файлом C (C - это BORROW к B). Текущая
- зона 3. Текущая запись в зоне 3 - запись со
значениями ключевых полей соответственно 10 - 20 -
40, следовательно в зоне 2 текущая запись со
значениями полей 10 - 20, а в зоне 1 со значениями
полей 10. Чтобы выйти из процесса работы с нашей
зоной нажимаем, например, CtrlF1 - поднимается
окошко "System information". В это время на другой
станции из файла B удаляют запись со значениями
полей 10 - 20. Мы нажимаем Esc и возвращаемся наше
окно, но текущей зоной теперь станет зона 2, а
текущей записью будет ближайшая запись к
удаленной, например, запись со значениями полей 10
- 21.
- Межоконный видеоконформ. Должен
выполнить позиционирование в его курсоре
целевого окна. В мастер независимого окна идет из
мастера текущей зоны верхнего окна, если между
этими мастерами можно построить транзитивную
справочную связь, в мастер зависимого окна идет
из его порождающей зоны. Если в курсоре исходной
зоны позиция определена, то (при правильном
заполнении базы данных, а также если не помешают
блокировки других станций) позиция будет
определена и в курсоре мастера целевого окна,
поскольку она будет получена выполнением серии
SEARCH, если мастер окна является справочником к
мастеру исходной зоны, или копированием
курсоров, если мастера исходной зоны и целевого
окна совпадают. Если в курсоре мастера текущей
зоны верхнего окна позиция не определена (пустой
селект), то позиция не будет определена и в
курсоре мастера целевого окна. Подробнее см. межоконное взаимодействие в
видео-системе.
- Внутризонный видеоконформ. Это отрисовка
панели или строки таблицы. И то и другое может
содержать не только поля собственного
мастер-файла, но и поля его
файлов-справочников(транзитивных). Позиции в
таких файлах получаются выполнением серии SEARCH из
курсора мастер-файла.
Следует еще раз обратить внимание, что не
всегда конформ доходит до зоны, которая доступна
на основе принципа подчиненности зон. Помеху
может создать состояние самих данных -
отсутствие записей в зоне-лидере (пустой селект),
отсутствие справочных записей (неверное
заполнение базы данных), конфликты блокировок и
т.п.
Еще особенности видеоконформа
- При прохождении видеоконформа в мастер окна в курсоре окна выполняется
позиционирование на основе отработки Link-пути в
мастер данного окна, и результирующая информация о
позиции присваивается курсору окна. Но если это независимое окно или в этом окна работает процесс Ask, то в
курсоре окна полностью снимается селект, т.е., не меняя текущий индекс и
позицию, устанавливается селект на 0 полей. В курсоре зависимого окна селект
остается.
- При прохождении видеоконформа в зону, непосредственно подчиненную
зависимому окну, и имеющую такой же мастер-файл, что и мастер-файл окна, и
при условии, что в этой зоне не работает процесс Ask,
в
курсор мастера зоны копируется вся информация о позиции из курсора
мастера окна - и индекс, и селект, и позицию.
Во всех других случаях видеоконформ не подменяет в курсоре мастера зоны ни
индекс, ни селект, а только адаптирует к ним результирующую позицию.
Посмотреть как связаны между собой мастера
окон, мастера зон в окне и файлы полей зоны можно
с помощью диалога "Loaded Windows".