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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.12.2011, 13:06   #1  
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:37   #2  
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   #3  
stalker25 is offline
stalker25
Участник
 
20 / 15 (1) ++
Регистрация: 04.03.2009
Цитата:
Сообщение от lev Посмотреть сообщение
Но метод getValue() НЕ ВОЗВРАЩАЕТ значение поля ИЗ ТЕКУЩЕЙ, СОЗДАВАЕМОЙ строки, а возвращает значение этого поля из УЖЕ СУЩЕСТВУЮЩИХ строк в таблице, которые ОТОБРАЖАЮТСЯ на датасорсе формы (по крайней мере так он работает, возможно задумывалось по другому). Если ему (методу getValue()) не передали никаких параметров (т.е. _indexRow = 0), то по умолчанию возвращается значение из ПОСЛЕДНЕЙ строки, отображаемой на датасорсе формы (если строк нет, то приложение падает, это, как я уже писал, косяк ядра). Если параметр передан, то система пытается найти нужную строку, и если не находит, то просто ничего не возвращает (не падает).)
Почему "уже существующих", если мы создали рекорд и он ещё не сохранен(buffer), то getValue сработает, более того он вернет как раз таки актуальное значение, даже если там несколько строк, независимо от параметра.
Старый 14.12.2011, 14:03   #4  
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   #5  
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, время: 10:06.