AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
NAV
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.04.2005, 13:51   #1  
JohnXZ_imported is offline
JohnXZ_imported
Участник
 
22 / 10 (1) +
Регистрация: 28.01.2005
Всем Привет!
Понимаю, что задаю глупый вопрос, но все же может кто заморачивался на тему порядка вызова триггеров в формах?
Просто поставив message во всех триггерах, никакой логичной закономерности в работе триггеров (OnFindRecord, OnNextRecord, OnAfterGetRecord, OnAfterGetCurrRecord) обнаружить не удалось.

PS:
Вопрос всплыл в связи с необходимостью показывать в форме "анализ по измерениям" записи только с определенным отступом.
Старый 11.04.2005, 14:27   #2  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Закономерность вполне логичная:

1) При открытии формы первым вызывается триггер OnOpenForm()
2) При закрытии формы сначала вызывается OnQueryCloseForm(), а после OnCloseForm()

При открытии формы происходят несколько многопоточных операций:
- получение формой фокуса
- поиск и выборка записей из источника

Триггеры этих операций при открытии формы могут вызываться вперемешку, например, OnActivateForm() может отработать до OnFindRecord(), а может после. Все зависит от сложности формы.

Операция получения фокуса: триггер OnActivateForm(), потеря фокуса - OnDeactivateForm(). Обычно при закрытии формы последовательность триггеров такая: OnDeactivateForm(), OnQueryCloseForm(), OnCloseForm().

Теперь про триггеры выборки записи:
Алгоритм выборки и заполнения таблицы работет по вот такой схеме
FIND;
REPEAT
GETRECORD;
GETCURRRECORD только для выбранной записиl
UNTIL NEXT = 0;

FIND - OnFindRecord()
GETRECORD - OnAfterGetRecord()
GETCURRRECORD - OnAfterGetCurrRecord()
NEXT - OnNextRecord();
Старый 11.04.2005, 14:47   #3  
JohnXZ_imported is offline
JohnXZ_imported
Участник
 
22 / 10 (1) +
Регистрация: 28.01.2005
Хмм...
А каким образом получена такая закономерность?
Мне, например, на пустой таблице 367 выдается следующая последовательность messag'ов выдается:

Код:
FIND - OnFindRecord()
GETCURRRECORD - OnAfterGetCurrRecord()
NEXT - OnNextRecord()
NEXT - OnNextRecord()
FIND - OnFindRecord()
GETRECORD - OnAfterGetRecord()
FIND - OnFindRecord()
Старый 11.04.2005, 16:03   #4  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Почему такой странный порядок - не знаю. Вообще применение постороннего кода в OnNextRecord() изменяет логику работы этого триггера. Быть может в причина в этом.

У меня триггеры отрабатывают так:

1) OnFindRecord
2) OnAfterGetRecord
3) OnAfterGetCurrRecord
4) OnAfterGetRecord
Старый 11.04.2005, 16:19   #5  
JohnXZ_imported is offline
JohnXZ_imported
Участник
 
22 / 10 (1) +
Регистрация: 28.01.2005
To Tirex:
И все таки - каким образом вы получили такой результат?
Старый 11.04.2005, 16:43   #6  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
Цитата:
Сообщение от tyrex
Вообще применение постороннего кода в OnNextRecord() изменяет логику работы этого триггера.
Точно. Мало того, наличие просто одного комментария в этом триггере и в OnFindRecord меняет логику работы.
__________________
MBS Certified Master in Navision Developer
Старый 11.04.2005, 18:15   #7  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Ну с OnFindRecord() все просто. Пишем EXIT(FIND(Which)); в конце триггера и все работает, а вот с OnNextRecord() не все так просто.

2JohnXZ:
Я сделал так. Завел глобальную переменную Str, а в триггерах понаставил Str+= 'OnFindRecord()\'; и т п.
Затем эту переменую вывел на форму.
Старый 12.04.2005, 10:02   #8  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
Цитата:
Сообщение от tyrex
Ну с OnFindRecord() все просто. Пишем EXIT(FIND(Which)); в конце триггера и все работает, а вот с OnNextRecord() не все так просто.
С OnNextRecord() аналогично можно поступить:
Пишем EXIT(NEXT(Steps))
P.S.
А вообще Wizard в одной теме мне очень популярно объяснил как эта конструкция работает(оптимизация работы формы, подмена фильтров), за что ему большое спасибо.
__________________
MBS Certified Master in Navision Developer
Старый 12.04.2005, 12:11   #9  
JohnXZ_imported is offline
JohnXZ_imported
Участник
 
22 / 10 (1) +
Регистрация: 28.01.2005
Ага, стало немного более понятно
Получается, что триггеры OnFindRecord и OnNextRecord это и не триггеры вовсе, а скорее функции процедуры выборки(грубо говоря), которые можно переписать и изменить стандартую прицедуру выборки.
Если же их не трогать, то все работает как описал tyrex
Цитата:
Алгоритм выборки и заполнения таблицы работет по вот такой схеме
FIND;
REPEAT
GETRECORD;
GETCURRRECORD только для выбранной записиl
UNTIL NEXT = 0;
Может у кого есть еще какие соображения?
Старый 12.04.2005, 13:51   #10  
Wizard_imported is offline
Wizard_imported
Участник
 
157 / 10 (1) +
Регистрация: 25.11.2004
Цитата:
Может у кого есть еще какие соображения?
всё таки чего добиться-то хочется?
Старый 12.04.2005, 14:28   #11  
JohnXZ_imported is offline
JohnXZ_imported
Участник
 
22 / 10 (1) +
Регистрация: 28.01.2005
to Wizard
На данный момент, хочу добиться понимания как вообще работает форма.

Цитата:
JohnXZ Дата 11.04.2005, 12:51
PS:
Вопрос всплыл в связи с необходимостью показывать в форме "анализ по измерениям" записи только с определенным отступом. 
Старый 12.04.2005, 14:56   #12  
Wizard_imported is offline
Wizard_imported
Участник
 
157 / 10 (1) +
Регистрация: 25.11.2004
Цитата:
На данный момент, хочу добиться понимания как вообще работает форма
Цель похвальная.
Цитата:
показывать в форме "анализ по измерениям" записи только с определенным отступом
ну-с.. приступим.
Где отступы-то рисуются? - Правильно,<div class='CALtop'>C/AL</div><div class='CAL'>Name - OnFormat(VAR Text : Text[1024]
CurrForm.Name.UPDATEFONTBOLD("Show in Bold");
CurrForm.Name.UPDATEINDENT(220 * Indentation);</div>
Значит есть этот Indentation - поле в таблице очевидно..
Ctrl+F7 - точно, есть. пишем, скажем, 2. нет эффекта.
понятно - переписаны триггеры получения данных.
Смотрим - действительно, несущей таблицей формы является какой-то ...Buf, временная структура данных то бишь.
Как же туда Indentation попадает? ищем Ctrl+F...
видим - <div class='CALtop'>C/AL</div><div class='CAL'>  Indentation := TheGLAcc.Indentation;</div>
а так же <div class='CALtop'>C/AL</div><div class='CAL'>  Indentation := TheDimVal.Indentation;</div>больше нету.
Понятно - иерархия поддерживается у плана счетов и измерений.
Надо пользовательский фильтр по этому полю перенести в секцию получения данных для этих таблиц, а именно в функциях FindRec и NextRec, на примере секции для плана счетов:
<div class='CALtop'>C/AL</div><div class='CAL'>FindRec(.......)
CASE DimOption OF
 DimOption::"G/L Account" :
   BEGIN
     GLAcc."No." := DimCodeBuf.Code;
     IF GLAccFilter <> '' THEN
       GLAcc.SETFILTER("No.",GLAccFilter);
     Rec.COPYFILTER(Indentation, GLAcc.Indentation); //<вот это добавим, перед Found.
     Found := GLAcc.FIND(Which);
     IF Found THEN
       CopyGLAccToBuf(GLAcc,DimCodeBuf);
   END;</div>
ну и <div class='CALtop'>C/AL</div><div class='CAL'>NextRec(......)
CASE DimOption OF
 DimOption::"G/L Account" :
   BEGIN
     GLAcc."No." := DimCodeBuf.Code;
     IF GLAccFilter <> '' THEN
       GLAcc.SETFILTER("No.",GLAccFilter);
     Rec.COPYFILTER(Indentation, GLAcc.Indentation); //<вот это добавим, перед Next.
     ResultSteps := GLAcc.NEXT(Steps);
     IF ResultSteps <> 0 THEN
       CopyGLAccToBuf(GLAcc,DimCodeBuf);
   END;</div>

компилируем, запускаем, Ctrl+F7, Отступ, 2.... смотрим.
На мой взгляд польза сомнительная, но.. если очень хочется...
секции для измерений доработать аналогично.
Старый 12.04.2005, 16:09   #13  
JohnXZ_imported is offline
JohnXZ_imported
Участник
 
22 / 10 (1) +
Регистрация: 28.01.2005
И получилось ??? Пробовал?
Это решение - первое что приходит в голову
Но вот результата то нет - при постановки фильтра суммы перестают отражаться
Поэтому я и занялся алгоритмом работы формы(вдруг здесь что накопаю).... и понял, что я его не понимаю))
Насчет пользы - в проекте вовсю юзаются измерения - "таблицы значений" некоторых измерений сравнимы с "таблицей плана счетов"))
Старый 12.04.2005, 16:43   #14  
JohnXZ_imported is offline
JohnXZ_imported
Участник
 
22 / 10 (1) +
Регистрация: 28.01.2005
ЕЕЕ получилось!!!!
Посыпаю голову пеплом
Надо было перекомпилить еще форму по ДриллДауну)
Спасибо всем за помощь, ща плюсики проставлю
Старый 12.04.2005, 17:51   #15  
Wizard_imported is offline
Wizard_imported
Участник
 
157 / 10 (1) +
Регистрация: 25.11.2004
Понимаю, что опоздал, но всё же...
пробовал, конечно. Всё работает.
Почему суммы перестали отображаться? При чем тут форма для дрилл-даун?
Старый 14.04.2005, 09:45   #16  
JohnXZ_imported is offline
JohnXZ_imported
Участник
 
22 / 10 (1) +
Регистрация: 28.01.2005
Действительно ни при чем
Почему суммы перестали отбражаться я так и не понял, ну да и фиг с ними..
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:45.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.