Показать сообщение отдельно
Старый 01.08.2005, 12:47   #1  
Maximin is offline
Maximin
NavAx
NavAx Club
 
415 / 361 (13) ++++++
Регистрация: 09.10.2002
Адрес: Москва
How-to. Слетание пользовательских настроек в формах после вызова lookup, или MS - suxx.
В общем, выкладываю на общее обозрение решение проблемки.
Сразу проиллюстрирую примером. Описывать долго...
Проблемка состоит в следующем:
Создаем на таблице, скажем, ProdTable, lookup-метод по любому полю.

Скажем, так:
PHP код:
client static void lookupProdId(FormStringControl   lookupCtrl)
{
    
SysTableLookup          sysTableLookup SysTableLookup::newParameters(tableNum(ProdTable), lookupCtrl);
    ;
    
SysTableLookup.addLookupfield(FieldNum(ProdTableProdId));
    
sysTableLookup.performFormLookup();

Далее - создаем формочку с единственным полем, у которого перекрыт метод lookup:
PHP код:
public void lookup()
{
    ;
    
ProdTable::lookupProdId_flx(this);

Всё. Приготовления закончены.

Внимание: дробь барабанов....
Открываем форму Производственные заказы (aka ProdTable), меняем в ней поля на gridе местами.. любые (Настройка - Выходная форма - Tab -Обзор - Grid) .
Внимательно смотрим... красота... всё, так нам нужно....
Закрываем - открываем, все отлично...
Так... настало время вызвать нашу вновь созданную форму с единственным полем.
Вызываем, щелкаем на lookup кнопку, вываливается lookup. Достаточно.

Теперь можно открыть снова "Производственные заказы".
Но что это?! Где все наши в стройном порядке стоящие поля?!!
----- тут я случайно нажал Enter и мессага осталась недописанной -----

Загвоздка вот в чем. Системный класс SysTableLookup в методе formRun создает динамическую lookup-форму таким макаром:
PHP код:
.....
dictTable = new DictTable(tableId);
form.name(dictTable.name());
....... 
:-\
Т.е. название формы, созданной этим классом, совпадает с уже существующей в репозитарии.
После чего в таблицу SysLastValue, в которой хранятся настройки форм, попадают левые (с точки зрения юзера) настройки. Видимо, никто в Damgaard (aka Navision aka MS ) не предполагал, что таблица может совпадать по названию с формой.

Всё это лечится достаточно тривиально, редактированием вышеупомянутого метода класса SysTableLookup, к примеру, так:
PHP код:
dictTable = new DictTable(tableId);
form.name(dictTable.name()+"_SysAutoLookup"); 
Собственно, это всё, что я хотел сказать.
Пользуйтесь. ^^-
За это сообщение автора поблагодарили: SHiSHok (2), Logger (5).