07.04.2006, 12:19 | #1 |
Участник
|
Самопроизвольная смена компании (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)); Или, может, DataAreaId у табличных переменных вообще не считывается из собственно таблицы, а всегда соответствует коду текущей компании? Но как тогда быть? Мне нужно, чтобы display-метод в форме, открытой в одной компании, всегда работал в контексте именно этой компании, даже если пользователь переключился на другую компанию. Т.е. даже не в контексте - у меня select используется с использованием DataAreaId... Последний раз редактировалось gl00mie; 07.04.2006 в 12:29. Причина: возникла идея |
|
07.04.2006, 12:43 | #2 |
NavAx
|
Все правильно работает. Если хочешь видеть данные из другой компании, оберни код в changeCompany. А еще лучше, вынести эти данные в шареную таблицу
__________________
Isn't it nice when things just work? |
|
07.04.2006, 13:44 | #3 |
Участник
|
Цитата:
Сообщение от macklakov
Все правильно работает. Если хочешь видеть данные из другой компании, оберни код в changeCompany.
Я вообще не понимаю логики: если у меня есть переменная - экземпляр класса, куда из таблицы в SQL'ной базе закачаны какие-то данные, то почему какие-то данные-члены в этом экземпляре класса меняются, а точнее, не закачиваются из таблицы, а подставляются системой автоматически в зависимости от текущей компании? Меня ведь не волнует текущая компания - я хочу работать с теми данными, которые я считал из определенной компании Цитата:
Сообщение от macklakov
А еще лучше, вынести эти данные в шареную таблицу
|
|
07.04.2006, 13:53 | #4 |
Участник
|
Цитата:
Сообщение от macklakov
Все правильно работает. Если хочешь видеть данные из другой компании, оберни код в changeCompany
X++: select firstonly salesLine where salesLine.RecId==this.RecId; |
|
07.04.2006, 13:59 | #5 |
NavAx
|
Цитата:
Сообщение от 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 |
Участник
|
Цитата:
Сообщение от macklakov
Меня удивляет одина единственная вещь, как ты вообще можешь видеть хоть какие-то данные из другой компании? Ты на печать выводишь пустую переменную типа SalesLine, а у нее dataAreaId всегда соответствует текущей компании
|
|
07.04.2006, 17:55 | #7 |
Участник
|
Цитата:
Сообщение от macklakov
Все правильно работает. Если хочешь видеть данные из другой компании, оберни код в changeCompany.
Собственно, у меня пока получается следующая ситуация: на форме нужно показывать данные, которые как-то вычисляются по другим данным в строке и по другим таблицам. Для этого выбран, как мне казалось, наиболее подходящий выход - в grid добавлено дополнительное поле, которое связано с display-методом. В условиях того, что форма может быть открыта в одной компании, пользователь переключится на другую компанию, и тогда display-метод при перерисовке формы будет вызываться в контексте другой компании и показывать лажу, необходимо его всегда выполнять в "нужной" компании - той, в которой была открыта форма, например. С одной стороны, видится простое решение: в ClassDeclaration формы добавляется переменная - код компании, она инициализируется с помощью init() формы, затем display-метод использует эту переменную. все бы хорошо, но в моем случае использовать display-метод на чем-то, связанном с формой (читай, на DataSource), не выходит - метод показывает фигню, потому что для разных строк использует одни и те же данные, ведь DataSource ссылается на какую-то одну запись (строку), а в гриде этих строк может быть больше одной... Чтобы таких визуальных глюков не было, был использован display-метод таблицы, а не DataSource'а (в моем случае SalesLine). Все работает замечательно, показывается то, что нужно, вот только мне не приходит в голову, как в метод таблицы, вызываемый без параметров, передать информацию о том, в контексте какой "правильной" компании он должен отрабатывать, - ведь у SalesLine нет доступа к переменным, объявленным в форме И дополнительную "переменную" в SalesLine не заведешь - это же таблица, там только поля записи. Что же остается, создавать в форме временную таблицу, заполнять ее, когда заполняется grid строчной части формы, и потом брать данные оттуда? И все это - только чтобы отобразить лишнее "вычисляемое" поле в строке? |
|
07.04.2006, 18:40 | #8 |
Участник
|
Вообще-то форма открытая в одной компании работает в контексте этой компании, переход в другую компанию сделает вашу форму неактивной ... она потеряет фокус и т.д., при возвращении к форме, установка текущей компании вновь вернется обратно (пользователь продолжит работу в рамках предыдущей компании) ... что в этой стандартной ситуации вас неустраивает и на что хочется поменять?
С уважением, itfs. |
|
07.04.2006, 18:48 | #9 |
NavAx
|
Цитата:
Сообщение от 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 |
Участник
|
Цитата:
Сообщение от itfs
Вообще-то форма открытая в одной компании работает в контексте этой компании, переход в другую компанию сделает вашу форму неактивной ... она потеряет фокус и т.д., при возвращении к форме, установка текущей компании вновь вернется обратно (пользователь продолжит работу в рамках предыдущей компании) ... что в этой стандартной ситуации вас неустраивает и на что хочется поменять?
|
|
10.04.2006, 10:03 | #11 |
Участник
|
Используйте кэширование дисплейных методов - данные в кэш будут попадать во время работы в нужной компании
__________________
Axapta v.3.0 sp5 kr2 |
|
10.04.2006, 10:22 | #12 |
Участник
|
Цитата:
Сообщение от macklakov
Ничего не понял. Давайте конкретно обсуждать, где и что Вы хотите увидеть?
Если бы display-методы нормально работали на DataSource формы, прикрутить в них changecompany в нужную компанию было бы проще простого, но вот как из формы передать информацию о нужном коде компании в таблицу SalesLine, мне в голову не приходит Остается еще один вариант: поскольку данные, по которым пересчитывается отображаемая информация, меняются только в самой форме, можно выводить их не display-методами, а через временную таблицу, значения которой изменять в соответствии с изменениями в данных на форме. Однако, вариант с временной таблицей мне пока кажется более геморройным, чем просто display-методы, поэтому я хочу оставить это решение на тот случай, если вариант с changecompany реализовать не удастся... |
|
10.04.2006, 10:29 | #13 |
Moderator
|
Цитата:
Сообщение от gl00mie
... но в моем случае использовать display-метод на чем-то, связанном с формой (читай, на DataSource), не выходит - метод показывает фигню, потому что для разных строк использует одни и те же данные, ведь DataSource ссылается на какую-то одну запись (строку), а в гриде этих строк может быть больше одной... Если я прав в своих подозрениях, рекомендую посмотреть соответствующий раздел Руководства разработчика.
__________________
Андрей. |
|
10.04.2006, 11:37 | #14 |
NavAx
|
Проблему подтверждаю.
Проверить можно просто, достаточно открыть форму Заказы, переключить компанию и посмотреть что произойдет с названием номенклатуры в строках заказа. Варианты борьбы: 1. при инициализации формы запоминаем компанию. используем дисплейные методы датасорса. в методе проверяем компанию, если надо меняем. 2. используем дисплейные методы датасорса. в методе проверяем компанию у текущей строки датасорса (не переданной в метод), если надо меняем. |
|
10.04.2006, 12:18 | #15 |
Участник
|
Цитата:
Сообщение от Dron AKA andy
Это вы, похоже, неправильно используете display-метод. Ему в качестве параметра передается строка, для которой и должен быть выполнен расчет. Соответственно, вызывается он для каждой строки грида, и все работает правильно.
|
|
|
Похожие темы | ||||
Тема | Ответов | |||
dataareaid conpeek | 5 | |||
DataAreaId в виртуальной компании. | 1 | |||
Смена компании через Сервис->Параметры | 4 | |||
Смена компании | 1 | |||
Компании: Одна большая или много маленьких? | 4 |
|