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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.04.2006, 12:19   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Angry Самопроизвольная смена компании (DataAreaId) у табличной переменной
Есть такая ситуация: в форму SalesTable, в строчную часть добавлена пара полей, работающих через display-методы таблицы SalesLine. Они должны показывать для текущей строчки кое-какую информацию. Все работает хорошо, пока не открыть какую-нить форму в другой компании и не переключиться на нее - в этот момент картинка в исходной форме SalesTable обновляется, и эти два поля начинают показывать совсем не то, что нужно. В результате добавления отладочного print'а в методы было выяснено, что в момент, когда переключаешься на форму другой компании, у этих SalesLine поле DataAreaId принимает значение кода этой другой компании! Более того, код компании меняется и у таблицы SalesTable, с которой связаны эти SalesLine Отладочный print выглядит так:
X++:
print(strfmt(
"%1(): this.dataAreaId %2, this.RecId %3, this.SalesTable().dataAreaId %4",
funcname(), this.dataAreaId, this.recId, this.SalesTable().dataAreaId));
RecId при всем при этом один и тот же, но код компании у this (SalesLine) и у соотв. SalesTable меняется в зависимости от того, на какую компанию переключишься (на исходную формочку SalesTable из первой компании или на другую формочку из второй компании). Что за фигня? Это так и задумано?..
Или, может, DataAreaId у табличных переменных вообще не считывается из собственно таблицы, а всегда соответствует коду текущей компании? Но как тогда быть? Мне нужно, чтобы display-метод в форме, открытой в одной компании, всегда работал в контексте именно этой компании, даже если пользователь переключился на другую компанию. Т.е. даже не в контексте - у меня select используется с использованием DataAreaId...

Последний раз редактировалось gl00mie; 07.04.2006 в 12:29. Причина: возникла идея
Старый 07.04.2006, 12:43   #2  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,233 / 974 (37) +++++++
Регистрация: 03.04.2002
Все правильно работает. Если хочешь видеть данные из другой компании, оберни код в changeCompany. А еще лучше, вынести эти данные в шареную таблицу
__________________
Isn't it nice when things just work?
Старый 07.04.2006, 13:44   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от macklakov
Все правильно работает. Если хочешь видеть данные из другой компании, оберни код в changeCompany.
И в какую компанию мне переходить?.. Получается, что мне надо где-то запоминать исходный DataAreaId, но где? как? В форме при ее создании - и потом передавать куда-то? А как табличному методу объяснить, что ему надо брать данные в форме?..
Я вообще не понимаю логики: если у меня есть переменная - экземпляр класса, куда из таблицы в SQL'ной базе закачаны какие-то данные, то почему какие-то данные-члены в этом экземпляре класса меняются, а точнее, не закачиваются из таблицы, а подставляются системой автоматически в зависимости от текущей компании? Меня ведь не волнует текущая компания - я хочу работать с теми данными, которые я считал из определенной компании
Цитата:
Сообщение от macklakov
А еще лучше, вынести эти данные в шареную таблицу
Дык, эти данные считаются каждый раз динамически, а кроме как в форме, они больше нигде не нужны.
Старый 07.04.2006, 13:53   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от macklakov
Все правильно работает. Если хочешь видеть данные из другой компании, оберни код в changeCompany
Еще один прикол по поводу того, что все работает правильно. RecId ведь уникален, и запись с определенным RecId должна относиться к строго определенной компании, правда? Из несчастного display-метода делаю выборку
X++:
select firstonly salesLine where salesLine.RecId==this.RecId;
т.е. надеюсь, что если я считаю строку из SQL-таблицы SalesLine с заданным RecId, то смогу определить нужный DataAreaId, - фигу. Выходит, что даже при выборке записи я получу тот DataAreaId, который мне захочет подсунуть система, а не тот, что реально значится для записи в БД...
Старый 07.04.2006, 13:59   #5  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,233 / 974 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от gl00mie
Еще один прикол по поводу того, что все работает правильно. RecId ведь уникален, и запись с определенным RecId должна относиться к строго определенной компании, правда? Из несчастного display-метода делаю выборку
X++:
select firstonly salesLine where salesLine.RecId==this.RecId;
Меня удивляет одина единственная вещь, как ты вообще можешь видеть хоть какие-то данные из другой компании?
Вернее, на экране ты их видеть можешь, на как только активируешь форму, текущая компания сменится. Но ты ведь их дебажить пытаешься?
P.S. Ты другие поля salesLine посмотри, там пусто. Ты на печать выводишь пустую переменную типа SalesLine, а у нее dataAreaId всегда соответствует текущей компании
__________________
Isn't it nice when things just work?

Последний раз редактировалось macklakov; 07.04.2006 в 14:11.
Старый 07.04.2006, 14:23   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от macklakov
Меня удивляет одина единственная вещь, как ты вообще можешь видеть хоть какие-то данные из другой компании? Ты на печать выводишь пустую переменную типа SalesLine, а у нее dataAreaId всегда соответствует текущей компании
И то верно... Ладно, буду сохранять куда-нить код компании и использовать changecompany.
Старый 07.04.2006, 17:55   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от macklakov
Все правильно работает. Если хочешь видеть данные из другой компании, оберни код в changeCompany.
Все-таки, как можно увязать changecompany и display-метод на таблице?
Собственно, у меня пока получается следующая ситуация: на форме нужно показывать данные, которые как-то вычисляются по другим данным в строке и по другим таблицам. Для этого выбран, как мне казалось, наиболее подходящий выход - в grid добавлено дополнительное поле, которое связано с display-методом. В условиях того, что форма может быть открыта в одной компании, пользователь переключится на другую компанию, и тогда display-метод при перерисовке формы будет вызываться в контексте другой компании и показывать лажу, необходимо его всегда выполнять в "нужной" компании - той, в которой была открыта форма, например. С одной стороны, видится простое решение: в ClassDeclaration формы добавляется переменная - код компании, она инициализируется с помощью init() формы, затем display-метод использует эту переменную. все бы хорошо, но в моем случае использовать display-метод на чем-то, связанном с формой (читай, на DataSource), не выходит - метод показывает фигню, потому что для разных строк использует одни и те же данные, ведь DataSource ссылается на какую-то одну запись (строку), а в гриде этих строк может быть больше одной... Чтобы таких визуальных глюков не было, был использован display-метод таблицы, а не DataSource'а (в моем случае SalesLine). Все работает замечательно, показывается то, что нужно, вот только мне не приходит в голову, как в метод таблицы, вызываемый без параметров, передать информацию о том, в контексте какой "правильной" компании он должен отрабатывать, - ведь у SalesLine нет доступа к переменным, объявленным в форме И дополнительную "переменную" в SalesLine не заведешь - это же таблица, там только поля записи. Что же остается, создавать в форме временную таблицу, заполнять ее, когда заполняется grid строчной части формы, и потом брать данные оттуда? И все это - только чтобы отобразить лишнее "вычисляемое" поле в строке?
Старый 07.04.2006, 18:40   #8  
itfs is offline
itfs
Участник
 
277 / 43 (2) +++
Регистрация: 18.07.2005
Адрес: Moscow
Вообще-то форма открытая в одной компании работает в контексте этой компании, переход в другую компанию сделает вашу форму неактивной ... она потеряет фокус и т.д., при возвращении к форме, установка текущей компании вновь вернется обратно (пользователь продолжит работу в рамках предыдущей компании) ... что в этой стандартной ситуации вас неустраивает и на что хочется поменять?

С уважением, itfs.
Старый 07.04.2006, 18:48   #9  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,233 / 974 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от gl00mie
Все-таки, как можно увязать changecompany и display-метод на таблице?
Собственно, у меня пока получается следующая ситуация: на форме нужно показывать данные, которые как-то вычисляются по другим данным в строке и по другим таблицам. Для этого выбран, как мне казалось, наиболее подходящий выход - в grid добавлено дополнительное поле, которое связано с display-методом. В условиях того, что форма может быть открыта в одной компании, пользователь переключится на другую компанию, и тогда display-метод при перерисовке формы будет вызываться в контексте другой компании и показывать лажу, необходимо его всегда выполнять в "нужной" компании - той, в которой была открыта форма, например. С одной стороны, видится простое решение: в ClassDeclaration формы добавляется переменная - код компании, она инициализируется с помощью init() формы, затем display-метод использует эту переменную. все бы хорошо, но в моем случае использовать display-метод на чем-то, связанном с формой (читай, на DataSource), не выходит - метод показывает фигню, потому что для разных строк использует одни и те же данные, ведь DataSource ссылается на какую-то одну запись (строку), а в гриде этих строк может быть больше одной... Чтобы таких визуальных глюков не было, был использован display-метод таблицы, а не DataSource'а (в моем случае SalesLine). Все работает замечательно, показывается то, что нужно, вот только мне не приходит в голову, как в метод таблицы, вызываемый без параметров, передать информацию о том, в контексте какой "правильной" компании он должен отрабатывать, - ведь у SalesLine нет доступа к переменным, объявленным в форме И дополнительную "переменную" в SalesLine не заведешь - это же таблица, там только поля записи. Что же остается, создавать в форме временную таблицу, заполнять ее, когда заполняется grid строчной части формы, и потом брать данные оттуда? И все это - только чтобы отобразить лишнее "вычисляемое" поле в строке?
Ничего не понял. Давайте конкретно обсуждать, где и что Вы хотите увидеть?
__________________
Isn't it nice when things just work?
Старый 10.04.2006, 09:39   #10  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от itfs
Вообще-то форма открытая в одной компании работает в контексте этой компании, переход в другую компанию сделает вашу форму неактивной ... она потеряет фокус и т.д., при возвращении к форме, установка текущей компании вновь вернется обратно (пользователь продолжит работу в рамках предыдущей компании) ... что в этой стандартной ситуации вас неустраивает и на что хочется поменять?
Форма, даже потеряв фокус из-за переключения на другую форму в другой компании, продолжает обрабатывать сообщения, в частности, при перерисовке она продолжает вызывать display-методы, но вся фигня в том, что они работают уже в контексте другой компании и в результате, ессно, показывают, мягко говоря, не то, что ожидается
Старый 10.04.2006, 10:03   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Используйте кэширование дисплейных методов - данные в кэш будут попадать во время работы в нужной компании
__________________
Axapta v.3.0 sp5 kr2
Старый 10.04.2006, 10:22   #12  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от macklakov
Ничего не понял. Давайте конкретно обсуждать, где и что Вы хотите увидеть?
Стало быть, ситуация такая:
  1. В гриде на форме SalesTable, в части, где выводятся строки заказа, мне необходимо отображать по каждой строке дополнительную информацию, вычисляемую динамически в зависимости от того, что в эту строку вбито (номенклатура, комбинация номенклатурных и складских аналитик, etc).
  2. Был обнаружен один побочный эффект: при вызове формы в другой компании (через внутренние расчеты, например) эта форма SalesTable (как, подозреваю, и любая другая) начинает работать в контексте другой компании, со всеми вытекающими...
Для п.1 я решил использовать display-методы, поскольку мне это показалось наиболее простым и прозрачным решением (конечно, можно возразить, что "у каждой сложной задачи существует простое, ясное и неправильное решение", но мне эта задача сложной не казалась ). Изначально display-методы я пробовал сделать на DataSource формы, но это, как оказалось, тупиковый вариант: для каждой строки вызывается display-метод, который смотрит через DataSource на текущую строку, а не на ту, для которой он должен показывать данные. В результате я перенес display-метод из DataSource формы на таблицу SalesLine - и все начало показываться нормально... пока не переключишься на другую компанию: из-за п.2 display-методы начинают показывать лажу Очевидное решение этой проблемы: при вызове формы запоминать, в какой компании она была вызвана, и в display-методах делать принудительное changecompany в нужную компанию - тогда они будут работать нормально независимо от того, переключились ли мы на другую компанию (а они даже при неактивности формы продолжают вызываться для перерисовки).
Если бы display-методы нормально работали на DataSource формы, прикрутить в них changecompany в нужную компанию было бы проще простого, но вот как из формы передать информацию о нужном коде компании в таблицу SalesLine, мне в голову не приходит Остается еще один вариант: поскольку данные, по которым пересчитывается отображаемая информация, меняются только в самой форме, можно выводить их не display-методами, а через временную таблицу, значения которой изменять в соответствии с изменениями в данных на форме. Однако, вариант с временной таблицей мне пока кажется более геморройным, чем просто display-методы, поэтому я хочу оставить это решение на тот случай, если вариант с changecompany реализовать не удастся...
Старый 10.04.2006, 10:29   #13  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Цитата:
Сообщение от gl00mie

...
но в моем случае использовать display-метод на чем-то, связанном с формой (читай, на DataSource), не выходит - метод показывает фигню, потому что для разных строк использует одни и те же данные, ведь DataSource ссылается на какую-то одну запись (строку), а в гриде этих строк может быть больше одной...
Это вы, похоже, неправильно используете display-метод. Ему в качестве параметра передается строка, для которой и должен быть выполнен расчет. Соответственно, вызывается он для каждой строки грида, и все работает правильно.
Если я прав в своих подозрениях, рекомендую посмотреть соответствующий раздел Руководства разработчика.
__________________
Андрей.
Старый 10.04.2006, 11:37   #14  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Проблему подтверждаю.
Проверить можно просто, достаточно открыть форму Заказы, переключить компанию и посмотреть что произойдет с названием номенклатуры в строках заказа.

Варианты борьбы:
1. при инициализации формы запоминаем компанию. используем дисплейные методы датасорса. в методе проверяем компанию, если надо меняем.

2. используем дисплейные методы датасорса. в методе проверяем компанию у текущей строки датасорса (не переданной в метод), если надо меняем.
Старый 10.04.2006, 12:18   #15  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Dron AKA andy
Это вы, похоже, неправильно используете display-метод. Ему в качестве параметра передается строка, для которой и должен быть выполнен расчет. Соответственно, вызывается он для каждой строки грида, и все работает правильно.
Да, похоже на то Сейчас переписал display-методы на DataSource в предположении, что им передается параметр, и все заработало
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dataareaid conpeek Logger DAX: Программирование 5 02.02.2009 12:11
DataAreaId в виртуальной компании. vasiliy DAX: Программирование 1 17.04.2008 15:30
Смена компании через Сервис->Параметры Dronas DAX: Программирование 4 06.12.2006 11:15
Смена компании Aslan DAX: Программирование 1 19.04.2006 12:29
Компании: Одна большая или много маленьких? George Nordic DAX: Функционал 4 28.07.2004 20:39

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

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

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