Страница 1 из 2

Мастер докомпиляции интерфейсов(Консоль Управления)

Добавлено: 08 фев 2010, 12:56
Maverick
Может кому интересно будет:
Стоит глобальная задача: с помощью дизайнера (!) изменить абстрактный стандартный интерфейс следующим образом:
1. добавить свою вьюху
2. модифицировать стандартную глобальную вьюху интерфейса
3. добавить собственную таблицу в словарь и в интерфейс
4. попытаться заюзать в обработчиках элементов интерфейса (окно, панель, скрин, брауз) стандартные переменные, определенные разработчиком
5. попытаться вытащить на визуальный элемент интерфейса (окно, брауз, скрин) свои элементы, значения которым самостоятельно буду присваивать
6. попытаться реализовать обработчик данных собственных элементов

Эксперименты провожу на интерфейсе L_Basedoc::VSchet (Основания на продажу)
Ниже буду публиковать, стараясь следовать вышеописанному плану, результаты: что получилось, что не получилось, по ходу будут также свои выкладки кода, вопросы и рассуждения.
К сожалению, не имею возможности прикреплять скрины, посему буду описывать подробно текстом :-)

Соответственно, кто уже юзал, кому интересно - присоединяйтесь к обсуждению.

ИТАК

локализуем задачу:
Допустим,
Необходимо персонализировать ДО на продажу по продавцам-консультантам (выпиской занимается оператор, занимающий галактическую лицензию, а данные по продажам к нему попадают, ну например в устной или письменной форме от N продавцов: пока некий продавец "Дядя Вася" работает непосредственно с клиентом, оператор оформляет док-ты для продавца "дядя Вася").
В дальнейшем, данная персонализация будет, к примеру, будет нужна для оценки работы продавцов с помощью неких аналитических отчетов


Рассуждения на тему "как это можно сделать"
Предварительные рассуждения по хотелками и возможным ограничениям.

Код: Выделить всё

Нужна сущность, где хранились бы продавцы - сотрудники компании. 
При этом не хотелось бы использовать 
- лицевые счета, 
- кадровские карточки сотрудников 
Связано с тем, что
 Пришлось бы использовать стандартные интерфейсы выбора сотрудников, а следовательно: 
 - из них можно посмотреть что-то лишнее, а оператору этого нельзя,
 - они отжирают зарплатно-кадровские лицензии. 
Свой интерфейс выбора писать лениво, да и с точки зрения постановки задачи - дополнительный напряг при дальнейшем сопровождении.
ПОСЕМУ - нужно заюзать стандартные возможности Галактики.
При переборе вариантов остановился на простом решении: 
Использую внешнюю классификацию. Этим я убиваю нескольких зайцев:
1. Юзаю стандартные free-интерфейсы, которые и так доступны из стандартного интерфейса ДО
2. Имею возможность сделать иерархию продавцов. Например с группировкой по отделам/филиалам
Реализация
1. Открываю консоль управления (естественно - текущая система galnet).
2. В интерфейсах нахожу реализацию интерфейса L_Basedoc::VSchetObj и раскрываю его.
3. Затем последовательно перехожу по цепочке VSchetObj->Vschet_Release-VSchet
4. Для объекта Vschet запускаю Мастер докомпиляции (Alt+W)
5. В открывшемся окне перехожу на закладку "Логические таблицы"
6. Создаю логическую таблицу (F7) и задаю ей имя, например vExtClassDoc. Жму Enter. Попадаю в окно логической таблицы
7. Имею 3 закладки Конструктор, Фильтры и SQL. Перехожу на последнюю закладку (ручками мне проще запрос написать - несколько раз пробовал с помощью конструктора строить связи - в итоге сам исходник запроса не в нужном порядке строился).
реализую такую вьюху:

Код: Выделить всё

create view vExtClassDoc
var
 cCurDoc : comp; //ссылка на текущий ДО
  as
  select
    *
  from
   exclassval, // значение классификатора
   exclassseg, // название классификатора
   exclassseg parseg // ссылка на родителя связанного с ДО классификатора
  Where
  ((
    cCurDoc == exclassval.crec and // ссылка на значение
    word(КОД)== exclassval.classcode and //КОД - код заведенного классификатора
    exclassval.cclassseg == exclassseg.nrec and // ссылка на название
    exclassseg.cgroup == parseg.nrec // ссылка на вышестоящий уровень
  ))
;


8. сохраняю (Alt+S) и компилирую (Alt+C)
9. закрываю окно и перехожу на закладку Обработчики
10. для начала попытаюсь просто протестить - корректно ли работает моя вьюха или нет.
Для этого пробую на cmInit окна WVSCHETZ повешать выдачу мессаг:

Код: Выделить всё

vExtClassDoc.cCurDoc:=Basedoc.NRec;
If vExtClassDoc.GetFirst ExClassVal = tsOk then
    {
     If vExtClassDoc.GetFirst ExClassSeg = tsOk then
      {
       If vExtClassDoc.ExClassSeg.cGroup <> 0 then
       {
        If vExtClassDoc.GetFirst ParSeg = tsOk
          Message (vExtClassDoc.ParSeg.Name+ ' - '+vExtClassDoc.ExClassSeg.Name);
       }
       Else Message (vExtClassDoc.ExClassSeg.Name);
      }
     Else Message ('Прикладная ошибка - Нет ссылки на сегмент (нарушение целостности данных)');
    }
Else Message ('Нет ссылки на продавца');   
11. Опять сохраняю (Alt+S) и компиляю (Alt+C)
12. Выхожу из Саппорта, беру ресурсник подкладываю в Галку, запускаю и смотрю.
Все работает ОК.

По сути тест прошел корректно.

Теперь, что НЕ ПОЛУЧИЛОСЬ:
1. В моей логической таблице я так и не смог обратиться к переменным, уже объявленным в стандартном интерфейсе (даже к глобальному параметру BASENREC)
2. Не смог добавить на объект scVSсhet (экран редактирования текущего ДО) никакой своей текстовой переменной, в которую пихал текстовое значение, выводимое в мессаге (код выше).
3. В окне конфигуратора (вызываемом при настройке визуальных элементов) не нашел ни своих переменных, ни логической таблицы. Даже после перезахода в Саппорт, когда мой интерфейс подхватился. Естественно, не смог также в этом окне создать вычисляемого поля, которое брало бы значения из моей логической таблицы.

Добавлено: 08 фев 2010, 12:57
Maverick
Хотелось бы увидеть комментарии по последним 3м пунктам.

Добавлено: 08 фев 2010, 13:03
edward_K
и не увидите наверное - берутся только переменные и таблицы из первой логической таблицы. Соотв. и вычислить по ctrl+F4 вы их не сможете. А кто мешает вам добавить в первую? Гланое правильно имя первой вьюхи узнать.

Добавлено: 08 фев 2010, 13:03
evchic
Maverick писал(а):1. В моей логической таблице я так и не смог обратиться к переменным, уже объявленным в стандартном интерфейсе (даже к глобальному параметру BASENREC)
что касается BASENREC то там банально можно вытащить BASEDOC.NREC
он точно передается проверенно

Добавлено: 08 фев 2010, 13:08
Maverick
edward_K писал(а):и не увидите наверное - берутся только переменные и таблицы из первой логической таблицы. Соотв. и вычислить по ctrl+F4 вы их не сможете. А кто мешает вам добавить в первую? Гланое правильно имя первой вьюхи узнать.
первая вьюха - она без названия :-)
хотя... надо попробовать обратиться к ней по имени интерфейса.. возможно прокатит...
evchic писал(а): что касается BASENREC то там банально можно вытащить BASEDOC.NREC
он точно передается проверенно
собственно так и пришлось делать - для этого сCurDoc и завел

Код: Выделить всё

vExtClassDoc.cCurDoc:=Basedoc.NRec; 

Добавлено: 08 фев 2010, 14:25
edward_K
если вьюха без названия то и в докомпиляции так и пишите
create view
as select
from ...
и все попадет куда нужно.

Добавлено: 08 фев 2010, 14:33
Maverick
1) в общем, получилось реализовать и визуальное отображение собственных переменных. правда, по прежнему доступны только переменные из главной вьюхи. Но это уже что-то :-)

отрабатывается такой код:

Код: Выделить всё

create view VSCHET_RELEASE
(
 strClassifier
)
  as
  select
   If(isvalid(tnparseg),parseg.name+' ,'+exclassseg.name,exclassseg.name ),
    *
  from
   exclassval,
   exclassseg,
   exclassseg parseg
  Where
  ((
    basedoc.nrec == exclassval.crec and
    word(102)== exclassval.classcode and
    exclassval.cclassseg == exclassseg.nrec and
    exclassseg.cgroup == parseg.nrec
  )); 
при этом переменная strClassifier доступна для выбора через закладку "Вычисляемые поля"
получилось данное поле добавить и в browse и в screen

2) получилось добавить в интерфейс собственную таблицу, подцепить ее в основную вьюху, соответственно поюзать ее поля :-)

ВАЖНОЕ НАБЛЮДЕНИЕ:
При добавлении собственной таблицы, необходимо убрать компонентную принадлежность USER. В противном случае таблица не будет видна.



Исследования продолжаются :-)

Re: Мастер докомпиляции интерфейсов(Консоль Управления)

Добавлено: 08 фев 2010, 14:43
Den
Maverick писал(а):1. В моей логической таблице я так и не смог обратиться к переменным, уже объявленным в стандартном интерфейсе (даже к глобальному параметру BASENREC)
....
Тоже недавно было интересно как получить в свой интер-с некоторое значение, которое передаеться в стандартной реализации в качестве параметра. Навсидку быстро так и не получилось(просто снаследоваться...) :

VipInterface my_inter(PrintSopr);
Parameters (pNRec: comp; MarkerNZ: longint;wParam: word);
end;
Interface my_inter ;
....

Может кто сталкивался и знает как это сделать, если это возможно вообще

Добавлено: 08 фев 2010, 15:36
Screw
По умолчанию логическая таблица именуется так же, как и интерфейс.

Добавлено: 08 фев 2010, 15:48
Maverick
Screw писал(а):По умолчанию логическая таблица именуется так же, как и интерфейс.
Спасибо, Виталий. До этого уже допер, когда стал анализировать в Мастере доступные вьюхи стандартных интерфейсов :-)

Добавлено: 08 фев 2010, 18:14
LaaLaa
Maverick писал(а): Исследования продолжаются :-)


А вы запишите свои исследования на видео и опубликуйте.

Для этого можно использовать программу "Windows Media Encoder 9 Series". Адрес для загрузки http://www.microsoft.com/windows/window ... fault.mspx. Это бесплатное ПО. На выходе получается wmv-формат. Воспроизвести можно с помощью стандартного "Windows Media Player".

Добавлено: 09 фев 2010, 17:20
Maverick
LaaLaa писал(а):
А вы запишите свои исследования на видео и опубликуйте.
чукча не видеописатель, чукча - программер :-)

а если серьезно, то постараюсь :-)
жаль сюда прицепить файло не получится :-)

Добавлено: 03 мар 2010, 16:52
Maverick
так...
теперь пытаюсь понять - как все эти изменения можно
а) получить в виде исходного текста
б) пересобирать строчником после патчевания

кто подскажет чего почитать, или краткий инстракшн что в конфиге выставить и где смотреть чего :-)

буду премного благодарен :-)

Добавлено: 03 мар 2010, 17:06
edward_K
нужно вторгнутся в какое то событие и сделать там ошибку, при попытке скомпильнуть будет сказано ошибка в таком то файле - вот его за основу и берете для доработки и компиляции строчником. У меня обычно парой все идет - сначала собираю vip c докомпиляцией, потом cnf конфигуратора с добавлением визуальных элементов( в том числе и введенных в докомпиляции) - главное все это собирать в одном проекте и в один и тот же рес, иначе нужно возится с подключением ресов.

Добавлено: 03 мар 2010, 18:38
LaaLaa
Maverick писал(а):так...
теперь пытаюсь понять - как все эти изменения можно
а) получить в виде исходного текста
б) пересобирать строчником после патчевания

кто подскажет чего почитать, или краткий инстракшн что в конфиге выставить и где смотреть чего :-)

буду премного благодарен :-)
Встречный вопрос. А для чего вам нужно получать исходный код того, что наконфигурировали в консоли? Чтобы дальше дорабатывать код в текстовом редакторе? Или только для того, чтобы перекомпилировать на новых обновлениях галактики?


Если только для того чтобы перекомпилировать на новых патчах. Код доставать не нужно. В менеджере обновлений есть функция "Операции - Переинициализация доработок". Попробуйте воспользоваться ею.


Меню Переинициализация доработок

Данная функция предназначена для обеспечения возможности оценки необходимости перекомпиляции пользовательских доработок в зависимости от изменений инсталляции текущей системы, вызванных установкой или откатом обновлений компонентов.

Для этого изменения инсталляции системы регистрируются программой Менеджер обновлений.

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

Выбор пользовательских компонентов, подлежащих оценке на необходимость перекомпиляции, выполняется в окне свойств системы.

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

В противном случае пользователь должен самостоятельно внести необходимые изменения в исходный текст пользовательского компонента и выполнить перекомпиляцию.

Данная функция обеспечивает обработку следующих видов пользовательских доработок:

· Изменения, сделанные в модуле Консоль управления, в объеме следующих объектов:
— интерфейсы;
— меню;
— кнопки главного меню;
— статус-строки;

· Изменения видимой части интерфейсов, сделанные конфигуратором;

· Присоединенные формы.

Переинициализация доработок выполняется для текущей системы, заданной в меню Настройка => Текущей системы или параметром PatchManager.CurrentSystem конфигурационного файла программы.

Если текущая система не задана, то при активизации меню Операции->Переинициализация доработок вызывается окно =Выбор текущей системы=, в котором необходимо выбрать систему.