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

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


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

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

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

То есть было ли залито какое-то недефолтное значение в заданное поле.
За это сообщение автора поблагодарили: mazzy (2).
Старый 10.01.2017, 13:03   #3  
gl00mie is offline
gl00mie
Участник
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
MCBMSS
Most Valuable Professional
 
3,468 / 4365 (152) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Цитата:
Сообщение от 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
Участник
Лучший по профессии 2014
 
2,798 / 1436 (53) ++++++++
Регистрация: 12.10.2004
Цитата:
Сообщение от 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
 
473 / 382 (13) ++++++
Регистрация: 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
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
Сотрудники Microsoft Dynamics
 
3,864 / 1982 (74) ++++++++
Регистрация: 16.01.2004
Адрес: Москва
Цитата:
Сообщение от Logger Посмотреть сообщение
Я бы это перевел как "true - если в поле задано какое-то значение или стоит значение по умолчанию. Иначе false".
У поля есть состояние, возвращаемое методом fieldState. Соответственно, поле находится в состоянии Set или Defaulted (да, я ошибся с недефолтным).

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

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

а как сейчас работает логика defaulting'а?
сейчас это просто значение, отличное от записанного в базу? или как-то по-другому?
Старый 10.01.2017, 15:06   #8  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
1,504 / 458 (19) +++++++
Регистрация: 10.10.2005
Адрес: PHP
Цитата:
Сообщение от 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
Участник
Аватар для ax_mct
 
1,504 / 458 (19) +++++++
Регистрация: 10.10.2005
Адрес: PHP
Цитата:
Сообщение от 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
Участник
Аватар для ax_mct
 
1,504 / 458 (19) +++++++
Регистрация: 10.10.2005
Адрес: PHP
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
 
1,658 / 809 (30) +++++++
Регистрация: 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
Administrator
Аватар для mazzy
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
Most Valuable Professional
 
20,620 / 3252 (150) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
ну... там вообще нужно было бы использовать SysDictTable.fields() и енумератор.
но не будем придираться к оформлению. со стороны ритейл-модулей много кода от людей, которые похоже плохо знают аксапту )

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

Последний раз редактировалось mazzy; 10.01.2017 в 17:38.
Старый 10.01.2017, 17:37   #13  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
1,504 / 458 (19) +++++++
Регистрация: 10.10.2005
Адрес: PHP
Цитата:
Сообщение от 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
 
384 / 136 (5) +++++
Регистрация: 25.06.2009
Адрес: Омск
Цитата:
Сообщение от 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
Участник
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
MCBMSS
Most Valuable Professional
 
3,468 / 4365 (152) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Цитата:
Сообщение от 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
Участник
Аватар для ax_mct
 
1,504 / 458 (19) +++++++
Регистрация: 10.10.2005
Адрес: PHP
Как понимаю все сходится на том что .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
 
1,658 / 809 (30) +++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Ну просто значение, записанное в initValue явно не отследишь как дефолтное. Мало ли как его записали (непосредственно в initValue, в методе, вызванном из initValue или как-то еще).
Старый 11.01.2017, 20:09   #18  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
1,504 / 458 (19) +++++++
Регистрация: 10.10.2005
Адрес: PHP
Цитата:
Сообщение от 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:28.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.