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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.08.2012, 08:40   #1  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Недоступность источника данных формы в display/edit-методах таблицы - баг или фича с глубоким смыслом?
В стандартных табличных методах, которые инициируются пользовательскими действиями при работе с данными таблицы на форме, является доступным источник данных формы.
В пользовательских табличных методах, вызываемых на формах при обращении к табличной переменной источника данных, является доступным источник данных формы.
В табличных display/edit-методах, при их вызове на таблице в момент обновления контролов формы, завязанных на источник данных с использованием этой таблицы, источник данных формы недоступен.

Есть какие-нибудь идеи по поводу причин такой дискриминации по отношению к этим методам ?

P.S. Эта тема последовательно вышла отсюда. Исследуется возможность заменить N однотипных display/edit-методов таблицы, работающих на поле с EDT-массивом размерностью N и отличающихся друг от друга только индексом обрабатываемого поля внутри EDT-массива, одним display/edit-методом, определяющим внутри себя этот индекс на основании связи "табличный метод >> источник данных >> форма >> вызывающий контрол"
__________________
Мы летаем, кружимся, нагоняем ужасы ...

Последний раз редактировалось TasmanianDevil; 03.08.2012 в 08:58.
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 03.08.2012, 09:56   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Каким образом будет работать кэширование display-методов (а их "обсчет" в принципе может выполняться на сервере), если им будет доступен источник данных формы?
Старый 03.08.2012, 10:14   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А можно ли display-метод сделать клиентским? Не поможет?
Старый 03.08.2012, 10:23   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А можно ли display-метод сделать клиентским? Не поможет?
Не указывать модификатор server для метода или указать client - будет выполняться на клиенте (для 2009-й, по крайней мере).
Только сторона выполнения, в данном случае, не имеет никакого значения, так же как и возможность кэширования (при чем здесь оно вообще? Метод же в любом случае будет вызван для стороки таблицы, хоть и один раз.).

Просто, при создании табличной переменной для вызова дисплейного метода не стали привязывать ее к датасорсу. Почему так было сделано - мне не ведомо
__________________
Axapta v.3.0 sp5 kr2
Старый 03.08.2012, 11:50   #5  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
gl00mie, вот тут у меня пробел имеет место быть в точном понимании механики работы в трехзвенки - живем до сих пор на тройке в двухзвенной архитектуре и только готовим переход на трехзвенку в 2009-ую.

Я почему-то считал и пока продолжаю считать (вполне возможно, что не понимаю истинной картины и заблуждаюсь), что независимо от модификатора client/server у display/edit-метода таблицы, равно как от отсутствия такого модификатора, при вызове такого метода на табличной переменной источника данных формы, кеширование и само исполнение данного метода будут исполняться на клиенте (формы живут на клиенте, источник данных есть внутренний объект формы, табличная переменная источника данных тоже внутренний объект формы и метод таблицы добавляется к механизму кэширования методом датасорса - т.е. все живет на клиенте).

Тем не менее, понимаю, что display/edit-метод может исполняться на сервере, если он был вызван в каком-либо методе какого-либо класса, исполняемого на сервере.

Исходя из этих предпосылок, я считал, что :
  • при исполнении таких методов на сервере методы таблицы будут isFormDataSource() == false и datasource() == null
  • при исполнении таких методов на клиенте методы таблицы будут isFormDataSource() == true и datasource() != null

Не расскажите ли по-подробнее или может ткнете пальцем где подробно можно этот момент изучить ?

P.S. Все методы не имеют явного модификатора места исполнения, т.е. по моему скромному разумению имеют эквивалент CalledFrom. Т.е. выполняются там, откуда вызваны - а вызываются они с формы, т.е. на клиенте.
__________________
Мы летаем, кружимся, нагоняем ужасы ...

Последний раз редактировалось TasmanianDevil; 03.08.2012 в 11:59.
Старый 03.08.2012, 12:06   #6  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от AndyD Посмотреть сообщение
Просто, при создании табличной переменной для вызова дисплейного метода не стали привязывать ее к датасорсу. Почему так было сделано - мне не ведомо
Погодите, т.е. для вызова табличного display/edit-метода с формы где-то создается копия табличной переменной, идентичная локальной табличной переменной на форме ? Привязка к источнику данных осуществляется только для того, чтобы скопировать для исполнения табличную переменную, а не исполнить метод на уже имеющейся ?

Если да - жуть , мрак !!!
__________________
Мы летаем, кружимся, нагоняем ужасы ...

Последний раз редактировалось TasmanianDevil; 03.08.2012 в 12:10.
Старый 03.08.2012, 12:11   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Что в данном случае имеется в виду под копией?

Да, создается новая табличная переменная, которая не привязана датасорсу и к серверному курсору, в которую копируются данные из кэша датасорса.
Табличная переменная на форме в это время живет своей жизнью и содержит данные из текущей записи датасорса
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: sukhanchik (2).
Старый 03.08.2012, 12:23   #8  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
AndyD, именно это я и имел ввиду (новая табличная переменная, копия содержимого локальной).
На первый взгляд оно, конечно, странно весьма, но тут уже ничего не поделаешь.
Ладно, остановимся на том, что есть ...

Огромное спасибо на наставление на путь истинный!!!

P.S. Жадный форум не дает горку плюсиков отсыпать одному и тому же участнику чаще, чем раз в три дня
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 03.08.2012, 12:35   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
На первый взгляд оно, конечно, странно весьма, но тут уже ничего не поделаешь.
Если учесть, что табличная переменная формы всегда смотрит на текущую запись, а дисплейные методы вызываются для всех видимых строк, то тут все логично, с моей точки зрения.
Это хорошо заметно на дисплейном методе на датасорсе - переменная, передаваемая в него и переменная на форме содержат разные данные

Другой вопрос, почему привязку к датасорсу не восстанавливают для нее, но тут, возможно, ограничения внутренней реализации этой самой привязки
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: TasmanianDevil (3).
Старый 03.08.2012, 13:01   #10  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от AndyD Посмотреть сообщение
табличная переменная формы всегда смотрит на текущую запись, а дисплейные методы вызываются для всех видимых строк
Да-да-да, именно так и именно про это я забыл, когда написал, что странно - просто давно привык писать display/edit методы именно на таблице, а не на датасорсе, где обязательным отдельным входящим параметром является табличная переменная с обновляемой в тек. момент строки, независимая от текущей локальной позиции по датасорсу.

Все теперича встало на свои места в голове
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 03.08.2012, 15:00   #11  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Я почему-то считал, что независимо от модификатора client/server у display/edit-метода таблицы, равно как от отсутствия такого модификатора, при вызове такого метода на табличной переменной источника данных формы, кеширование и само исполнение данного метода будут исполняться на клиенте
Это не так, модификаторы влияют на то, где будет выполняться экземплярный табличный метод. На счет кэширования, см., например, FormDataSource.cacheAddMethod Method:
Цитата:
Cached methods perform calculations on fetched data, and then the calculated values are passed to the client together with the data.
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
понимаю, что display/edit-метод может исполняться на сервере, если он был вызван в каком-либо методе какого-либо класса, исполняемого на сервере.
Когда будете переходить на 2009-ю, обратите внимание на такие методы, как SalesTable.validateWrite_server(). Это экземплярный метод с модификатором server, куда вынесена вся логика из обычного validateWrite(), и если последний дергается на клиенте, то вызываемый им validateWrite_server() уже всегда работает на сервере. Так что вызывающий код не обязательно должен сам работать на сервере.
За это сообщение автора поблагодарили: TasmanianDevil (3).
Теги
display метод, edit метод, formdatasource, isformdatasource, кэширование

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
How to overwrite a display value of the edit field ideveloper DAX in English 1 26.07.2011 07:54
TwC: Validate access to return value from display/edit method. HorrR DAX: Программирование 10 05.03.2008 12:17
Импорт данных из ODBC источника JohNick DAX: Программирование 4 09.04.2004 10:17
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Зачем нужны display и edit методы Андре DAX: Программирование 4 15.08.2002 13:24

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:24.