МЕТОД JOIN КЛАССОВ МЕТАСХЕМЫ

Процедура контекстного меню, вызываемого по нажатию ENTER на объектах в браузере указывается в методе JOIN класса метасхемы. Процедура должна иметь 6-ть входных параметров описанных в joinpar.i. Следовательно, данный инклюд-файл должен быть подключен в процедуре метода.

За создание контекстного меню отвечает инклюд-файл procjoin.i. Данный инклюд-файл должен быть подключен исключительно в конце процедуры метода JOIN.

Данному инклюд-файлу могут переданы следующие аргументы:

  • &FrameTitle - заголовок меню;
  • &Prefix - префикс таблицы контекстного меню;
  • &Params - параметры процедур по умолчанию;
  • &F6Disable - если установлен в NO - отключается показ скрытых пунктов по F6;
  • &ChkDown - сравнивается значение &ChkDown и класса для BrowseLd;
  • &showsingle - показывать единственный пункт меню (параметр определен) или нет (не определен);

Создание пунктов меню и определение вызываемых ими процедур осуществляется двумя процедурами CreateJoin и CreateJoinLd, описанными в procjoin.i. Процедура CreateJoin предназначена для вызова произвольной процедуры, в то время как, CreateJoinLd осуществляет вызов процедур браузеров объектов метасхемы  и обладает соответствующим набором параметров.

CreateJoin (in-name, in-proc, in-flag).

  • in-name - значение CHAR типа, определяющее наименование создаваемого пункта меню;
  • in-proc - значение CHAR типа, определяющее имя вызываемой процедуры и передаваемых ей параметров. Разделителем между значением имени процедуры и передаваемых ей параметров является символ верхней одиночной кавычки - "'". Имя вызываемой процедуры  указывается без расширения ".p". Параметры передаются списком с разделителем запятая - ",". proc-name + "'" + param1 + "," ... + "," + paramN;
  • in-flag - значение LOGICAL типа, определяющее видим ли пункт меню сразу, или по нажатию F6.

CreateJoinLd (in-name,
                       in-proc,
                       ipClassChar,
                       ipCodeLstChar,
                       ipValLstChar,
                       ipLockFldChar,
                       ipLevel,
                       in-flag).

  • in-name - значение CHAR типа, определяющее наименование создаваемого пункта меню;
  • in-proc - значение CHAR типа, определяющее процедуру запуска - browseld;
  • ipClassChar - значение CHAR типа, определяющее класс объекта браузера;
  • ipCodeLstChar - значение CHAR типа, определяющее список полей для предустановки;
  • ipValLstChar - значение CHAR типа, определяющее список значений полей;
  • ipLockFldChar - значение CHAR типа, определяющее список полей для блокировки;
  • ipLevel - значение INT64 типа, определяющее уровень отображения фрейма браузера;
  • in-flag - значение LOGICAL типа, определяющее видим ли пункт меню сразу, или по нажатию F6.

Создаваемые пункты меню записываются во временную таблицу {&Prefix}join, объявляемую в инклюд-файле tt-join.i. Данная временная таблица содержит всю основную информацию о создаваемом меню: наименование пунктов меню, вызываемые ими процедуры и передаваемые им параметры.

Если при создании пункта меню не были указаны параметры вызываемой им процедуры, то по умолчанию процедуре будут переданы параметры указанные в аргументе &Params.

При вызове контекстного меню в нем отображаются не все его пункты, а только те, для которых флаг видим имеет значение TRUE. Скрытые пункты меню могут быть отображены по нажатию клавиши F6. Аргумент &F6Disable позволяет отключить такую возможность вывода скрытых пунктов меню по F6. Если все пункты контекстного меню являются скрытыми, то при его вызове будет отображено соответствующее сообщение и вывод меню не будут осуществлен.

Если контекстное меню содержит всего один единственный пункт (учитывая и скрытые пункты меню), то возможен его автоматический вызов без отображения самого контекстного меню. Такое поведение определяется аргументом &showsingle.

Вызов контекстного меню может быть реализован по нажатию произвольной клавиши отличной от ENTER. Для этого используется специальный инклюд-файл run.i, который необходимо указать в качестве аргумента &join в navigate.cqr, передав ему два аргумента:

{navigate.cqr
   &join="RUN.i
            &proc=<процедура метода join>
            &key=<label клавиши> "
}

Пример:

{joinpar.i}
{globals.i}             

FIND loan WHERE ROWID(loan) = TO-ROWID(iROWID) NO-LOCK NO-ERROR.

IF NOT AVAIL loan THEN RETURN "-1".

RUN CreateJoin("Картотека счетов",
               "lacc`" +
                loan.contract + "," +
                loan.cont-code  + "," +
                "1" + "," + "1" + "," +
                STRING(level + 1),
                YES).


RUN CreateJoinLd ("Обеспечение",
                  "browseld",
                  "term-obl-gar",
                  "contract"     + CHR(1) + "cont-code"   
+ CHR(1) + "since",
                  loan.contract  + CHR(1) + loan.cont-code
+ CHR(1) + STRING(loan.open-date),
                  "",
                  level + 1,
                  YES).

{procjoin.i
    &Prefix = "loan"
    &frametitle = "'[ ДОГОВОР ' + loan.doc-ref + ' ]'"
}

RETURN '0'.