11.04.2005, 13:51 | #1 |
Участник
|
Всем Привет!
Понимаю, что задаю глупый вопрос, но все же может кто заморачивался на тему порядка вызова триггеров в формах? Просто поставив message во всех триггерах, никакой логичной закономерности в работе триггеров (OnFindRecord, OnNextRecord, OnAfterGetRecord, OnAfterGetCurrRecord) обнаружить не удалось. PS: Вопрос всплыл в связи с необходимостью показывать в форме "анализ по измерениям" записи только с определенным отступом. |
|
11.04.2005, 14:27 | #2 |
Moderator
|
Закономерность вполне логичная:
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 |
Участник
|
Хмм...
А каким образом получена такая закономерность? Мне, например, на пустой таблице 367 выдается следующая последовательность messag'ов выдается: Код: FIND - OnFindRecord() GETCURRRECORD - OnAfterGetCurrRecord() NEXT - OnNextRecord() NEXT - OnNextRecord() FIND - OnFindRecord() GETRECORD - OnAfterGetRecord() FIND - OnFindRecord() |
|
11.04.2005, 16:03 | #4 |
Moderator
|
Почему такой странный порядок - не знаю. Вообще применение постороннего кода в OnNextRecord() изменяет логику работы этого триггера. Быть может в причина в этом.
У меня триггеры отрабатывают так: 1) OnFindRecord 2) OnAfterGetRecord 3) OnAfterGetCurrRecord 4) OnAfterGetRecord |
|
11.04.2005, 16:19 | #5 |
Участник
|
To Tirex:
И все таки - каким образом вы получили такой результат? |
|
11.04.2005, 16:43 | #6 |
Участник
|
Цитата:
Сообщение от tyrex
Вообще применение постороннего кода в OnNextRecord() изменяет логику работы этого триггера.
__________________
MBS Certified Master in Navision Developer |
|
11.04.2005, 18:15 | #7 |
Moderator
|
Ну с OnFindRecord() все просто. Пишем EXIT(FIND(Which)); в конце триггера и все работает, а вот с OnNextRecord() не все так просто.
2JohnXZ: Я сделал так. Завел глобальную переменную Str, а в триггерах понаставил Str+= 'OnFindRecord()\'; и т п. Затем эту переменую вывел на форму. |
|
12.04.2005, 10:02 | #8 |
Участник
|
Цитата:
Сообщение от tyrex
Ну с OnFindRecord() все просто. Пишем EXIT(FIND(Which)); в конце триггера и все работает, а вот с OnNextRecord() не все так просто.
Пишем EXIT(NEXT(Steps)) P.S. А вообще Wizard в одной теме мне очень популярно объяснил как эта конструкция работает(оптимизация работы формы, подмена фильтров), за что ему большое спасибо.
__________________
MBS Certified Master in Navision Developer |
|
12.04.2005, 12:11 | #9 |
Участник
|
Ага, стало немного более понятно
Получается, что триггеры OnFindRecord и OnNextRecord это и не триггеры вовсе, а скорее функции процедуры выборки(грубо говоря), которые можно переписать и изменить стандартую прицедуру выборки. Если же их не трогать, то все работает как описал tyrex Цитата:
Алгоритм выборки и заполнения таблицы работет по вот такой схеме
FIND; REPEAT GETRECORD; GETCURRRECORD только для выбранной записиl UNTIL NEXT = 0; |
|
12.04.2005, 13:51 | #10 |
Участник
|
Цитата:
Может у кого есть еще какие соображения?
|
|
12.04.2005, 14:28 | #11 |
Участник
|
to Wizard
На данный момент, хочу добиться понимания как вообще работает форма. Цитата:
JohnXZ Дата 11.04.2005, 12:51
PS: Вопрос всплыл в связи с необходимостью показывать в форме "анализ по измерениям" записи только с определенным отступом. |
|
12.04.2005, 14:56 | #12 |
Участник
|
Цитата:
На данный момент, хочу добиться понимания как вообще работает форма
Цитата:
показывать в форме "анализ по измерениям" записи только с определенным отступом
Где отступы-то рисуются? - Правильно,<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 |
Участник
|
И получилось ??? Пробовал?
Это решение - первое что приходит в голову Но вот результата то нет - при постановки фильтра суммы перестают отражаться Поэтому я и занялся алгоритмом работы формы(вдруг здесь что накопаю).... и понял, что я его не понимаю)) Насчет пользы - в проекте вовсю юзаются измерения - "таблицы значений" некоторых измерений сравнимы с "таблицей плана счетов")) |
|
12.04.2005, 16:43 | #14 |
Участник
|
ЕЕЕ получилось!!!!
Посыпаю голову пеплом Надо было перекомпилить еще форму по ДриллДауну) Спасибо всем за помощь, ща плюсики проставлю |
|
12.04.2005, 17:51 | #15 |
Участник
|
Понимаю, что опоздал, но всё же...
пробовал, конечно. Всё работает. Почему суммы перестали отображаться? При чем тут форма для дрилл-даун? |
|
14.04.2005, 09:45 | #16 |
Участник
|
Действительно ни при чем
Почему суммы перестали отбражаться я так и не понял, ну да и фиг с ними.. |
|