Тема: DAX2009 crash
Показать сообщение отдельно
Старый 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.