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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.12.2011, 20:26   #1  
stalker25 is offline
stalker25
Участник
 
20 / 15 (1) ++
Регистрация: 04.03.2009
DAX2009 crash
Добрый день, есть такая проблема:

Есть:
---------------------------------
Table1.field1(Enum:NoYesId)
---------------------------------
Forma1
DataSource
Table1
InitValue():

X++:
Table1.Field1 = NoYes::Yes;
Table1_ds.object(fieldNum(Table1, Field1)).modified();
----------------------------------
Form1
DataSource
Table1
Fields
Field1
Methods
modified():

X++:
NoYes noYes = this.getValue();
------------------------------------

открываем форму, инициализируем значение field1, выполняется modified(), на getValue(), axapta падает, а вот getValue(1) работает ... не подскажете почему?
Старый 14.12.2011, 00:14   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Предположительно щас все бросятся лепить тестовую форму и проверять ее на всех доступных сборках ядра...
Рекомендации - Как правильно задать вопрос, чтобы быть услышанным

PS. Проект хоть выложите что ли...
Старый 14.12.2011, 00:15   #3  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от stalker25 Посмотреть сообщение
Добрый день, есть такая проблема:

Есть:
---------------------------------
Table1.field1(Enum:NoYesId)
---------------------------------
Forma1
DataSource
Table1
InitValue():

X++:
Table1.Field1 = NoYes::Yes;
Table1_ds.object(fieldNum(Table1, Field1)).modified();
----------------------------------
Form1
DataSource
Table1
Fields
Field1
Methods
modified():

X++:
NoYes noYes = this.getValue();
------------------------------------

открываем форму, инициализируем значение field1, выполняется modified(), на getValue(), axapta падает, а вот getValue(1) работает ... не подскажете почему?
1. Для выполнения каких либо действий по изменению какого либо поля, лучше перекрывать метод modifiedField() на самой таблице, а не на поле формы. В этом случае использование бизнес логики расширяет свои горизонты на всю систему, и её можно использовать откуда угодно. + Все что вы напишите на форме будет вызываться на клиенте, что скажется на производительности.
2. В initValue() таблицы Вы уже проинициализировали поле Field1 значением, поэтому в методе modified() на поле датасорса формы можно это поле и использовать. Т.е. можно написать вот такой код (и мне кажется это более нагляным вариантом):
X++:
NoYes  noYes = Table1.Field1;
В таком варианте точно аксапта не "упадет"
3. Метод getValue() возвращает значение поля, в котором он (метод) вызывается. У этого поля есть параметр _rowIndex (тип Integer по умолчанию = 0), который указывает системе номер строки датасорса формы, из которой вернуть значение поля. В случае нулевое значение этого параметра, возвращается значение этого поля из последней строки датасорса. Если строк в датасорсе на форме нет, то этот метод ничего не возвращает, более того аксапта просто валится (это воспроизводится только для полей с типом Enum, для поля с типом String не воспроизвелось). Так как в вашем случае строка ещё не создана, то этот метод Вам использовать не надо. Для того, что бы определить какое значение проставлено в поле Field1 воспользуйтесь способом из второго пункта.

P.S. старайтесь как можно меньше программировать на форме, только в крайних случаях. В данном вашем случае, лучше воспользуйтесь моим советом из первого пункта.
P.S1. А лучше опишите задачу, возможно, она решается как то более просто (уж больно странно в методе initValue() проинициализировать поле, потом вызвать его метод modified() и в этом методе получать его же значение...).
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем

Последний раз редактировалось lev; 14.12.2011 в 00:19.
Старый 14.12.2011, 00:17   #4  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Предположительно щас все бросятся лепить тестовую форму и проверять ее на всех доступных сборках ядра...
Рекомендации - Как правильно задать вопрос, чтобы быть услышанным

PS. Проект хоть выложите что ли...
метод getValue() не делает то, чего желает топик стартер
случай, которые описан в первом сообщении скорее относится к теме: "Как завалить аксапту (клиента)".
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 14.12.2011, 10:46   #5  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Angry
Мда...
Сегодня утром решил посмотреть, а что же про этот метод пишет сам Microsoft...
достаточно скудное описание, а точнее отсутствие его
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 14.12.2011, 13:06   #6  
stalker25 is offline
stalker25
Участник
 
20 / 15 (1) ++
Регистрация: 04.03.2009
Добавил проект.
Артём, спасибо за предложенные альтернативы, но меня смущает именно текущая проблема getValue(), и вот собственно откуда это пришло:
\Forms\LedgerJournalTransVendInvoice\Data Sources\LedgerJournalTrans\Fields\AccountType\Methods\modified
(кстати не понятно зачем использовать getValue, если можно вызвать ledgerJournalTrans.AccountType, при чём в локализации добвленнный код как раз таки и использует ledgerJournalTrans.AccountType, кстати в 2012 getValue так же используется)

LedgerJournalACType ledgerJournalACType = this.getValue();

если при инициализации новой линии журнала, мы хотим задать определённый тип журанала:
\Classes\LedgerJournalEngine_VendInvoice\initValue

X++:
ledgerJournalTrans.AccountType = newAccountType;
        ledgerJournalTrans_ds.object(fieldNum(LedgerJournalTrans, AccountType)).modified();
кстати для типа Инт дакс тоже валится.

так что на данный момент меня интересует почему getValue() не работает, а getValue(1) работает?
почему не выходит ошибка, что object not initialized или что-нить в этом духе, а сразу падает дакс
Старый 14.12.2011, 13:33   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
В последнем билде AX 6.1 не крэшится
Старый 14.12.2011, 13:37   #8  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от stalker25 Посмотреть сообщение
Добавил проект.
Артём, спасибо за предложенные альтернативы, но меня смущает именно текущая проблема getValue(), и вот собственно откуда это пришло:
\Forms\LedgerJournalTransVendInvoice\Data Sources\LedgerJournalTrans\Fields\AccountType\Methods\modified
(кстати не понятно зачем использовать getValue, если можно вызвать ledgerJournalTrans.AccountType, при чём в локализации добвленнный код как раз таки и использует ledgerJournalTrans.AccountType, кстати в 2012 getValue так же используется)

LedgerJournalACType ledgerJournalACType = this.getValue();

если при инициализации новой линии журнала, мы хотим задать определённый тип журанала:
\Classes\LedgerJournalEngine_VendInvoice\initValue

X++:
ledgerJournalTrans.AccountType = newAccountType;
        ledgerJournalTrans_ds.object(fieldNum(LedgerJournalTrans, AccountType)).modified();
кстати для типа Инт дакс тоже валится.

так что на данный момент меня интересует почему getValue() не работает, а getValue(1) работает?
почему не выходит ошибка, что object not initialized или что-нить в этом духе, а сразу падает дакс
Ответ на вопрос "Почему падает?", это просто так написано ядро системы, видимо внутри него возникает критическая ошибка, которая приводит к остановке приложения.

как я уже писал, судя по тестам, которые я вчера вечером проводил, метод getValue() не делает того, что от него хотят.
Судя по контексту кода напрашивается вывод, что в методе modified() нужно получить значение определенного поля (с типом Enum) текущей, создаваемой строки.

Но метод getValue() НЕ ВОЗВРАЩАЕТ значение поля ИЗ ТЕКУЩЕЙ, СОЗДАВАЕМОЙ строки, а возвращает значение этого поля из УЖЕ СУЩЕСТВУЮЩИХ строк в таблице, которые ОТОБРАЖАЮТСЯ на датасорсе формы (по крайней мере так он работает, возможно задумывалось по другому). Если ему (методу getValue()) не передали никаких параметров (т.е. _indexRow = 0), то по умолчанию возвращается значение из ПОСЛЕДНЕЙ строки, отображаемой на датасорсе формы (если строк нет, то приложение падает, это, как я уже писал, косяк ядра). Если параметр передан, то система пытается найти нужную строку, и если не находит, то просто ничего не возвращает (не падает).

Я не знаю, что на самом деле там задумывали разработчики в этом методе, так же не знаю почему они его используют. Но что то мне подсказывает, что в методе modified() поля AccountType нужно переписать строку с:
X++:
LedgerJournalACType ledgerJournalACType = this.getValue();
на:
X++:
LedgerJournalACType ledgerJournalACType = ledgerJournalTrans.AccountType;
Если это не так, то сведущие в этом плане люди меня поправят.

З.Ы. сейчас подумал, возможно разработчики расчитывали, что метод вернет значение из СОЗДАВАЕМОЙ строки, если не передать параметр, так как по идее она последняя. Но либо метод как то косячно написан, либо ещё чего, но он возвращает значения только уже СОЗДАННЫХ строк
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем

Последний раз редактировалось lev; 14.12.2011 в 13:42.
За это сообщение автора поблагодарили: Bega (1), stalker25 (1).
Старый 14.12.2011, 13:54   #9  
stalker25 is offline
stalker25
Участник
 
20 / 15 (1) ++
Регистрация: 04.03.2009
Цитата:
Сообщение от lev Посмотреть сообщение
Но метод getValue() НЕ ВОЗВРАЩАЕТ значение поля ИЗ ТЕКУЩЕЙ, СОЗДАВАЕМОЙ строки, а возвращает значение этого поля из УЖЕ СУЩЕСТВУЮЩИХ строк в таблице, которые ОТОБРАЖАЮТСЯ на датасорсе формы (по крайней мере так он работает, возможно задумывалось по другому). Если ему (методу getValue()) не передали никаких параметров (т.е. _indexRow = 0), то по умолчанию возвращается значение из ПОСЛЕДНЕЙ строки, отображаемой на датасорсе формы (если строк нет, то приложение падает, это, как я уже писал, косяк ядра). Если параметр передан, то система пытается найти нужную строку, и если не находит, то просто ничего не возвращает (не падает).)
Почему "уже существующих", если мы создали рекорд и он ещё не сохранен(buffer), то getValue сработает, более того он вернет как раз таки актуальное значение, даже если там несколько строк, независимо от параметра.
Старый 14.12.2011, 14:03   #10  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от stalker25 Посмотреть сообщение
Почему "уже существующих", если мы создали рекорд и он ещё не сохранен(buffer), то getValue сработает, более того он вернет как раз таки актуальное значение, даже если там несколько строк, независимо от параметра.
Очень странно, у меня вчера он делал именно то, что я описал.
проверял на AX2009 RU5.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 14.12.2011, 14:15   #11  
stalker25 is offline
stalker25
Участник
 
20 / 15 (1) ++
Регистрация: 04.03.2009
Иван, я вижу последнюю версию 6.0.947.280, как я понимаю 6.1 будет релиз в первом квартале 2012 года, тем не менее в 6,0 уже выскакивает ошибка, без крэша
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: Finding the X++ call stack that caused a crash Blog bot DAX Blogs 2 14.01.2020 13:20
emeadaxsupport: What to do if you have a crash Blog bot DAX Blogs 0 15.06.2011 18:11
emeadaxsupport: Finding the AX user that caused an AOS crash Blog bot DAX Blogs 0 11.04.2011 00:12
maheshtej: Performance on server degrades after an AOS crash Blog bot DAX Blogs 0 28.01.2011 23:14
Вопросы по OLAP в DAX2009 oleg_e DAX: Функционал 9 10.12.2008 02:02

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

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

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