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

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

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

Сообщение 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. В окне конфигуратора (вызываемом при настройке визуальных элементов) не нашел ни своих переменных, ни логической таблицы. Даже после перезахода в Саппорт, когда мой интерфейс подхватился. Естественно, не смог также в этом окне создать вычисляемого поля, которое брало бы значения из моей логической таблицы.
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Сообщение Maverick »

Хотелось бы увидеть комментарии по последним 3м пунктам.
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

и не увидите наверное - берутся только переменные и таблицы из первой логической таблицы. Соотв. и вычислить по ctrl+F4 вы их не сможете. А кто мешает вам добавить в первую? Гланое правильно имя первой вьюхи узнать.
evchic
Местный житель
Сообщения: 216
Зарегистрирован: 25 апр 2006, 12:05
Откуда: г.Ростов-на-Дону
Контактная информация:

Сообщение evchic »

Maverick писал(а):1. В моей логической таблице я так и не смог обратиться к переменным, уже объявленным в стандартном интерфейсе (даже к глобальному параметру BASENREC)
что касается BASENREC то там банально можно вытащить BASEDOC.NREC
он точно передается проверенно
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Сообщение Maverick »

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

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

vExtClassDoc.cCurDoc:=Basedoc.NRec; 
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

если вьюха без названия то и в докомпиляции так и пишите
create view
as select
from ...
и все попадет куда нужно.
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Сообщение 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. В противном случае таблица не будет видна.



Исследования продолжаются :-)
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

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

Сообщение Den »

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

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

Может кто сталкивался и знает как это сделать, если это возможно вообще
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

По умолчанию логическая таблица именуется так же, как и интерфейс.
Виталий
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Сообщение Maverick »

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

Сообщение LaaLaa »

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


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

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

Сообщение Maverick »

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

а если серьезно, то постараюсь :-)
жаль сюда прицепить файло не получится :-)
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Сообщение Maverick »

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

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

буду премного благодарен :-)
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

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

Сообщение LaaLaa »

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

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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

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