13.12.2011, 20:26 | #1 |
Участник
|
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 |
Участник
|
Предположительно щас все бросятся лепить тестовую форму и проверять ее на всех доступных сборках ядра...
Рекомендации - Как правильно задать вопрос, чтобы быть услышанным PS. Проект хоть выложите что ли... |
|
14.12.2011, 00:15 | #3 |
Ищущий знания...
|
Цитата:
Сообщение от 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) работает ... не подскажете почему? 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 |
Ищущий знания...
|
Цитата:
Сообщение от gl00mie
Предположительно щас все бросятся лепить тестовую форму и проверять ее на всех доступных сборках ядра...
Рекомендации - Как правильно задать вопрос, чтобы быть услышанным PS. Проект хоть выложите что ли... случай, которые описан в первом сообщении скорее относится к теме: "Как завалить аксапту (клиента)".
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
14.12.2011, 10:46 | #5 |
Ищущий знания...
|
Мда...
Сегодня утром решил посмотреть, а что же про этот метод пишет сам Microsoft... достаточно скудное описание, а точнее отсутствие его
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
14.12.2011, 13:06 | #6 |
Участник
|
Добавил проект.
Артём, спасибо за предложенные альтернативы, но меня смущает именно текущая проблема 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 |
Участник
|
В последнем билде AX 6.1 не крэшится
|
|
14.12.2011, 13:37 | #8 |
Ищущий знания...
|
Цитата:
Сообщение от 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 |
Участник
|
Цитата:
Сообщение от lev
Но метод getValue() НЕ ВОЗВРАЩАЕТ значение поля ИЗ ТЕКУЩЕЙ, СОЗДАВАЕМОЙ строки, а возвращает значение этого поля из УЖЕ СУЩЕСТВУЮЩИХ строк в таблице, которые ОТОБРАЖАЮТСЯ на датасорсе формы (по крайней мере так он работает, возможно задумывалось по другому). Если ему (методу getValue()) не передали никаких параметров (т.е. _indexRow = 0), то по умолчанию возвращается значение из ПОСЛЕДНЕЙ строки, отображаемой на датасорсе формы (если строк нет, то приложение падает, это, как я уже писал, косяк ядра). Если параметр передан, то система пытается найти нужную строку, и если не находит, то просто ничего не возвращает (не падает).)
|
|
14.12.2011, 14:03 | #10 |
Ищущий знания...
|
Цитата:
проверял на AX2009 RU5.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
14.12.2011, 14:15 | #11 |
Участник
|
Иван, я вижу последнюю версию 6.0.947.280, как я понимаю 6.1 будет релиз в первом квартале 2012 года, тем не менее в 6,0 уже выскакивает ошибка, без крэша
|
|