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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.01.2017, 11:46   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
xRecord.isFieldSet() - что это? как сейчас правильно проверять наличие поля в базе данных?
https://msdn.microsoft.com/en-us/lib...sfieldset.aspx
xRecord.isFieldSet() - что это? как сейчас правильно проверять наличие поля в базе данных?


причем в ax2012 этот метод почти не используется, судя по перекрестным ссылкам.
а в ax7 этот метод используется, похоже, для проверки существования поля в базе. (вместо нормальных dictTable)

А что это за хрень-метод?
и что за свойство может быть установлено в "a Set or Defaulted state; otherwise..."?
Миниатюры
Нажмите на изображение для увеличения
Название: ax6.PNG
Просмотров: 564
Размер:	137.4 Кб
ID:	11134   Нажмите на изображение для увеличения
Название: ax7.PNG
Просмотров: 376
Размер:	32.4 Кб
ID:	11135  

Старый 10.01.2017, 12:46   #2  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
true if field is has a Set or Defaulted state; otherwise, false.

То есть было ли залито какое-то недефолтное значение в заданное поле.
За это сообщение автора поблагодарили: mazzy (2).
Старый 10.01.2017, 13:03   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от mazzy Посмотреть сообщение
xRecord.isFieldSet() - что это? как сейчас правильно проверять наличие поля в базе данных? что это за хрень-метод?
По-моему, этот метод относится не к наличию данных в БД, а к тому, было ли установлено значение поля в табличном буфере извне либо соотв. логикой defaulting'а, в 12-ке это то же, что до нее реализовывалось через \Classes\AxInternalBase\isFieldSet. Т.е. раньше логику default'инга нужно было реализовывать через AxBC-классы, в 12-ке стало возможным реализовать ее в методах самой таблицы. Только че-то, по-моему, не пошла эта затея в массы, default'инг в 12-ке как-то выродился...
См. также давнишнее обсуждение В чем преимущество ax-классов перед непосредственной работой с таблицами?

Последний раз редактировалось gl00mie; 10.01.2017 в 13:07.
За это сообщение автора поблагодарили: mazzy (2), Logger (1).
Старый 10.01.2017, 13:06   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от belugin Посмотреть сообщение
true if field is has a Set or Defaulted state; otherwise, false.
Я бы это перевел как "true - если в поле задано какое-то значение или стоит значение по умолчанию. Иначе false". Может этот метод проверяет null значения ?

Кстати, подчеркнутый код какой то странный.
X++:
if (!fieldId && !_common.isFieldSet(fieldId))
Получается что вызов
X++:
_common.isFieldSet(fieldId)
произойдет только для fieldId == 0. Похоже на опечатку.
Может имелось в виду
X++:
if (!fieldId || !_common.isFieldSet(fieldId))
т.е. fieldId не задан или значение _common.isFieldSet равно false (т.е. не задано)

Последний раз редактировалось Logger; 10.01.2017 в 13:08.
За это сообщение автора поблагодарили: mazzy (2), S.Kuskov (1).
Старый 10.01.2017, 13:09   #5  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Как я понял, это просто "признак редактирования" - устанавливается после любой записи в поле и сбрасывается после clear() / update():

X++:
static void Job(Args _args)
{    
    FieldId         fieldId = fieldNum(CustTable, AccountNum);    
    CustTable       custTable;    
    
    ttsBegin;
    
    info(strFmt('%1', custTable.isFieldSet(fieldId)));  // false
    
    custTable.AccountNum = "XXX";    
    info(strFmt('%1', custTable.isFieldSet(fieldId)));  // true
    
    custTable.clear();    
    info(strFmt('%1', custTable.isFieldSet(fieldId)));  // false
    
    select forupdate firstonly custTable;
    info(strFmt('%1', custTable.isFieldSet(fieldId)));  // false
    
    custTable.AccountNum = "";    
    info(strFmt('%1', custTable.isFieldSet(fieldId)));  // true
    
    custTable.doUpdate();
    info(strFmt('%1', custTable.isFieldSet(fieldId)));  // false
    
    ttsAbort;
}
__________________
За это сообщение автора поблагодарили: mazzy (5), Logger (1), dech (4).
Старый 10.01.2017, 13:23   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Logger Посмотреть сообщение
Я бы это перевел как "true - если в поле задано какое-то значение или стоит значение по умолчанию. Иначе false".
У поля есть состояние, возвращаемое методом fieldState. Соответственно, поле находится в состоянии Set или Defaulted (да, я ошибся с недефолтным).

То есть если вы в табличный буфер что-то записали, состояние поля изменится.
За это сообщение автора поблагодарили: mazzy (2), Logger (1).
Старый 10.01.2017, 13:27   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
ага. понятно - дефолтные значения.

Цитата:
Сообщение от gl00mie Посмотреть сообщение
По-моему, этот метод относится не к наличию данных в БД, а к тому, было ли установлено значение поля в табличном буфере извне либо соотв. логикой defaulting'а
ага. спасибо!

а как сейчас работает логика defaulting'а?
сейчас это просто значение, отличное от записанного в базу? или как-то по-другому?
Старый 10.01.2017, 15:06   #8  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от mazzy Посмотреть сообщение
ага. понятно - дефолтные значения.


ага. спасибо!

а как сейчас работает логика defaulting'а?
сейчас это просто значение, отличное от записанного в базу? или как-то по-другому?
https://ax.help.dynamics.com/en/wiki...mapped-fields/

как думаю initValue() делает defaulting.
И получается что то что не охвачено initValue() или присвоением значения становится "Not in Use" и имеет isFieldSet как false? Чтобы избежать неуправляемого defaulting?
За это сообщение автора поблагодарили: mazzy (2).
Старый 10.01.2017, 15:45   #9  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от belugin Посмотреть сообщение
true if field is has a Set or Defaulted state; otherwise, false.

То есть было ли залито какое-то недефолтное значение в заданное поле.
true if field is has a (Set or Defaulted state); otherwise, false.
Скобки.

Главное сейчас согласится или нет что isFieldSet дает true если (Set or Defaulted state).

И понять что такое Defaulted.
Старый 10.01.2017, 15:59   #10  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
https://ax.help.dynamics.com/en/wiki...elds/#defaults

DataEntity.initValue: A data entity is initialized with default values and by using any custom logic that is present in entity-level initValue. This method isn’t called automatically when an insert or update is performed on a data entity from X++. It must be called explicitly if it’s required. The method is called automatically by the form engine when a new record is created. DataEntity.initValue doesn’t call the initValue method for back-end tables that are used in the data entity.

Table.initValue: Table-level initValue, as defined for back-end tables, is fired when you perform a data entity insert. This is true for all paths (X++, OData, and so on). Table.initValue is run just before the entity is mapped to data source fields.

Можно предположить что все default state случается при вызове super() в initValue(). И Set state при присвоении значения оператором присвоения.
Чисто фантазирую.
Старый 10.01.2017, 17:11   #11  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Logger Посмотреть сообщение
Получается что вызов
X++:
_common.isFieldSet(fieldId)
произойдет только для fieldId == 0. Похоже на опечатку.
Может имелось в виду
X++:
if (!fieldId || !_common.isFieldSet(fieldId))
Больше похоже, что код вообще непонятно что делает. Как может быть fieldId == 0, если этот fieldId только что получен при помощи table.fieldCnt2Id(...) вызываемого при переборе полей из SysDictTable.
Или бывает такое, что в пределах от 1 до table.fieldCnt() есть что-то, не имеющее идентификатора поля?
Старый 10.01.2017, 17:35   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
ну... там вообще нужно было бы использовать SysDictTable.fields() и енумератор.
но не будем придираться к оформлению. со стороны ритейл-модулей много кода от людей, которые похоже плохо знают аксапту )

а вот isFieldSet... это уже бизнес-логика.

Последний раз редактировалось mazzy; 10.01.2017 в 17:38.
Старый 10.01.2017, 17:37   #13  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Больше похоже, что код вообще непонятно что делает. Как может быть fieldId == 0, если этот fieldId только что получен при помощи table.fieldCnt2Id(...) вызываемого при переборе полей из SysDictTable.
Или бывает такое, что в пределах от 1 до table.fieldCnt() есть что-то, не имеющее идентификатора поля?
Как варианты:
  • Виртуальные поля как SaveContent = No
  • Временные таблицы
  • DataEntity тоже непонятно как относятся с xRecord
  • Поля с отключенной моделью
  • Что-то что используется при маппинге

Кто его знает что они накрутили сейчас. От AX2012 уже много что отличается.
Старый 11.01.2017, 09:12   #14  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Ruff Посмотреть сообщение
X++:
    // ...
    custTable.AccountNum = "";    
    info(strFmt('%1', custTable.isFieldSet(fieldId)));  // true
    // ...
Очевидно, что после любого присваивания, даже дефолтного метод вернет true.
False, если поле вообще не трогали.
__________________
// no comments
Старый 11.01.2017, 11:12   #15  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от mazzy Посмотреть сообщение
а как сейчас работает логика defaulting'а? сейчас это просто значение, отличное от записанного в базу? или как-то по-другому?
Насколько я знаю, точно так же, как и раньше, поддерживается набор флажков для полей, показывающих, устанавливалось ли значение поля (любое, даже "пустое", типа 0 или dateNull()) после clear/select/update или еще не устанавливалось. Не важно значение поля, важен факт того, было ли оно явно установлено. Хотя, конечно, с точки зрения экономии на объеме передаваемых данных следовало как раз-таки сравнивать значение поля с "пустым" значением для данного базового типа, и если они совпадают, то не сериализовывать такое значение - зачем передавать, что называется, детерминированный сигнал?..
Цитата:
Сообщение от ax_mct Посмотреть сообщение
как думаю initValue() делает defaulting.
По-моему, тут о разных понятиях речь. В моем понимании задача логики defaulting'а - неявно подтягивать значения по умолчанию либо значения связанных полей на основе тех полей, которые заданы явно. Например, проставили в шапку заказа на продажу код клиента - defaulting должен подтянуть из клиента фин.аналитики, адрес доставки, способ оплаты, налоговую группу, etc. Особенность работы defaulting'а была и есть в том, что он не должен перезаписывать явно заданные "извне" значения, скажем, если мы вместе с кодом клиента явно прописали адрес доставки не по умолчанию, до defaulting не должен его перезаписывать "своим" значением. Именно для отслеживания того, какие поля были заданы, а какие нет, и использовался прежде метод isFieldSet(). В том числе он использовался для того, чтобы в defaulting'е одного поля понять, было ли задано явно или "по умолчанию" другое поле.
Цитата:
Сообщение от dech Посмотреть сообщение
Очевидно, что после любого присваивания, даже дефолтного метод вернет true. False, если поле вообще не трогали.
Очень хорошее замечание - в исходном классе AxInternalBase метод isFieldSet() анализировал множество идентификаторов под названием fieldTouched Также там был метод setFieldAsTouched(), вызывавшийся из setField(), который, в свою очередь, использовался для установки значений полей. В 2012-й всю эту логику запихали в ядро, насколько я понимаю. В общем, действительно, дело в том, трогали ли поле
Цитата:
Сообщение от mazzy Посмотреть сообщение
ну... там вообще нужно было бы использовать SysDictTable.fields() и енумератор. но не будем придираться к оформлению. со стороны ритейл-модулей много кода от людей, которые похоже плохо знают аксапту )
Возможно, люди, писавшие ритейл-модуль, просто гоняли тесты производительности перед выпуском, посмотрели в каком-нить профайлере, сколько новых объектов в памяти генерит вызов SysDictTable.fields(), сопоставили это с особенностью работы сборщика мусора в CIL, ужаснулись - и сделали перебор полей по-старинке
За это сообщение автора поблагодарили: mazzy (2), Logger (3), ax_mct (4).
Старый 11.01.2017, 15:51   #16  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Как понимаю все сходится на том что .isFieldSet() аналог "isTouched including defaulting".

Интересный вопрос в каком случае имеем Default state для поля.
и будет ли данный Default state установлен (и как результат .isFieldSet() == true)
при вызове super() в initValue().

Предполагаемые варианты получения Default state == true
Вариант 1: значение, отличное от записанного в базу
Вариант 2: дефолтное присваивание, если отличается от варианта 1. Например присваивание сделанное в initValue()
Вариант 3. вызов super() в initValue(). То есть Default state не может получаться при использовании оператора присваивания.

Лично мне ближе Вариант 3.

Цитата:
Сообщение от mazzy Посмотреть сообщение
а как сейчас работает логика defaulting'а?
сейчас это просто значение, отличное от записанного в базу? или как-то по-другому?
Цитата:
Сообщение от dech Посмотреть сообщение
Очевидно, что после любого присваивания, даже дефолтного метод вернет true.
False, если поле вообще не трогали.
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Не важно значение поля, важен факт того, было ли оно явно установлено.
...
В моем понимании задача логики defaulting'а - неявно подтягивать значения по умолчанию либо значения связанных полей на основе тех полей, которые заданы явно.
...
В общем, действительно, дело в том, трогали ли поле
Старый 11.01.2017, 17:54   #17  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Ну просто значение, записанное в initValue явно не отследишь как дефолтное. Мало ли как его записали (непосредственно в initValue, в методе, вызванном из initValue или как-то еще).
Старый 11.01.2017, 20:09   #18  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Ну просто значение, записанное в initValue явно не отследишь как дефолтное. Мало ли как его записали (непосредственно в initValue, в методе, вызванном из initValue или как-то еще).
Поэтому и предполагаю что вызов super() в initValue() может ставить Default state для поля. А иначе как отличить присвоение дефолтное от недефолтного.

Но это я фантазирую, проверить нет возможности сейчас.
Теги
ax2012, ax7

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX 2012 R2: импорт данных через Excel Add-in и добавление поля в стандартную таблицу Kabardian DAX: Программирование 1 13.02.2014 22:40
Использование условия if и запроса к базе данных kadet DAX: Программирование 14 11.03.2013 12:30
Как выключить калькулятор при вводе данных в поля? Ace of Database DAX: Функционал 16 16.11.2004 12:37
Разрешение на доступ к базе данных nicko DAX: Администрирование 3 18.05.2004 18:49
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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