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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.06.2015, 19:31   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,719 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Хм.. Вроде как и есть что сказать по теме, но, вроде бы и так уже все сказано. Только систематизировано несколько по другому, из-за чего и "едет крыша". Как мне кажется, критически важным является ответ на первую "хотелку".

Цитата:
Сообщение от mazzy Посмотреть сообщение
Какие манипуляции хотелось бы делать с подобными значениями в Аксапте:
  • хранить в базе
Возможные варианты:
  1. Выделить (интерпретировать) одно из значений как null
    • Выделенное значение отображается как пустое значение в диалоге с пользователем (255 для Base Enum, num2char(160) для String, 0.0001 для AmountCur, 0.1 для CheckBox и т.д и т.п.)
    • Выделенное значение не может быть отображено "как есть" в диалоге с пользователем. Требуется "перевод" (maxDate() для Date, maxInt() для int и т.п.)
  2. Добавить еще один признак (поле), показывающий, что "основное" значение надо интерпретировать как null. Одно дополнительное поле может "обслуживать" несколько "основных" полей.
    • Отдельный признак имеет самостоятельное значение и отдельно отображается в диалоге с пользователем. Например, признак "Контролировать кредитный лимит" определяет учитывать ли значения полей "Сумма лимита" и "Дата установки контроля"
    • Отдельный признак является "системным" (служебным) полем и для пользователя недоступен. Например, признак значения NULL для контрольной суммы (Хотя... Впрочем, за не именеем более наглядного примера)

Дальнейшая реализация будет существенным образом зависеть от выбранного способа хранения значения NULL в базе данных. Ну, с первыми 3 вариантами дальнейшая работа понятна. Обычный набор переменных. Некоторые сложности может доставить перекодировка из maxdate() в пустое значение для отображения, но не думаю, что эта такая уж большая проблема.

Проблемным является последний вариант, когда дополнительный признак является служебным полем, недоступным для прямого просмотра/изменения пользователем. Вот здесь на первое место выступает вторая ключевая "хотелка"

Цитата:
Сообщение от mazzy Посмотреть сообщение
  • спрашивать значения у пользователя на формах и в программных диалогах
Каким образом будет построен интерфейс с пользователем, чтобы пользователь мог понять, где значение будет интерпретировано как null, а где - как указанное значение? Пусть даже пользователь и "не трогал" этого значения. Или "потрогал", но вернул назад

Вообще-то, мне приходит в голову только один вариант на подобный случай. Это когда речь идет о полях, которые пользователь изменить не может. Максимум посмотреть. Та же контрольная сумма. Но это значит, что речь идет о неких расчетных значениях, которые, очевидно, зависят от других реквизитов. Так может, можно эти самые "другие реквизиты" и использовать как признак значения NULL?


Если же рассматривать вопрос БЕЗ учета этих двух основных "хотелок", например, как передача неких параметров при расчетах, то можно рассмотреть еще парочку вариантов.
  • Очень ограниченно можно использовать (prmIsDefault() == 1) как признак того, что параметр передан не был. Т.е. интерпретировать это как передачу null. Правда, для pack/unpack это не пригодно, но ведь интерфейс с пользователем нас не интересует
  • В среде Axapta значение NULL физически может быть сохранено в переменной типа ComVariant. В принципе, тот же класс, но чуть проще

X++:
    COMVariant comVariant;
    ;
    comVariant = new ComVariant(COMVariantInOut::In_out, ComVariantType::VT_BOOL);
    info(comVariant.toString());
    info(strFmt('%1',comVariant.variantType()));

    comVariant.variantType(ComVariantType::VT_NULL);
    info(comVariant.toString());
    info(strFmt('%1',comVariant.variantType()));
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: mazzy (2).
Старый 11.06.2015, 09:06   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Для checksum хорошее null-значение - 0.
в общем, одно из значений трактовать как null...

Цитата:
Сообщение от gl00mie Посмотреть сообщение
Что-то еще в хотелках/требованиях - чтобы код работы с этими... кортежами не был громоздким Иначе почему громоздкость фигурирует в оценке каждого варианта?
хз. лично мне просто лениво писать громоздкие конструкции. из-за этого я, например, не люблю использовать struct в аксапте.

но может быть сформулировать по-другому хотелки/требования?
я бы с удовольствием послушал.

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

в общем, временная таблица? надо подумать. надо попробовать. я этот вариант всегда рассматривал как чисто теоретический.
Старый 11.06.2015, 09:16   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Возможные варианты:
угу. а еще есть? а можно всех посмотреть?

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Каким образом будет построен интерфейс с пользователем, чтобы пользователь мог понять, где значение будет интерпретировано как null, а где - как указанное значение? Пусть даже пользователь и "не трогал" этого значения. Или "потрогал", но вернул назад
Вот!
Для примера возьмем MS SQL и Аксапту 2012, которые умеют отображать null значение, полученное из базы. там в поле отображается специальное значение null, а поле становится недоступным для редактирования.

В аксапте 2012 со специальным значением напряжно. Но, думаю, что надо делать поле недоступным для пользователя.

Но, опять же, хотелось бы выслушать варианты.

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Вообще-то, мне приходит в голову только один вариант на подобный случай. Это когда речь идет о полях, которые пользователь изменить не может. Максимум посмотреть. Та же контрольная сумма. Но это значит, что речь идет о неких расчетных значениях, которые, очевидно, зависят от других реквизитов. Так может, можно эти самые "другие реквизиты" и использовать как признак значения NULL?
другие реквизиты могут находится за тысячу километров таблиц от данного места и метода, где пара значений применяется. я уже приводил примеры

"если для данного клиента включен контроль кредитного лимита, то спросить и хранить этот кредитный лимит"

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Очень ограниченно можно использовать (prmIsDefault() == 1) как признак того, что параметр передан не был. Т.е. интерпретировать это как передачу null.
не совсем.
чтобы срабатывал prmIsDefault в вызывающем классе параметр не должен быть указан.

если же у нас есть каскад методов с параметрами по-умолчанию, то параметр отсутствует только в самом внешнем. остальные передают тот параметр, который получили. и в каскаде prmIsDefaul сработает только один раз в каскаде.

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
В среде Axapta значение NULL физически может быть сохранено в переменной типа ComVariant.
Ну... Насколько я помню он не pack/unpack-совместимый.
И как он передается между клиентом и сервером?
Старый 11.06.2015, 12:06   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,719 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от mazzy Посмотреть сообщение
угу. а еще есть? а можно всех посмотреть?
Варианты хранения доп.признака в базе данных? Так вроде все перечислил. Ну, если не считать собственно поддержку NULL для поля. Или интересует вариант технической реализации? Так это у кого на что фантазии хватит. Например, для хранения признака создавать не по отдельному полю для каждого поля с возможным NULL, а одно общее поле, где хранить битовую маску...

Ну, и уже упоминались варианты, когда значение, эквивалентное NULL не надо прятать, а наоборот, выставить как одно из возможных значений.

Например, заменить CheckBox на ComboBox с 3 вариантами выбора (All / Yes / No). Для текста (кода справочника) создать специальный элемент справочника с пустым кодом.

Цитата:
Сообщение от mazzy Посмотреть сообщение
Вот!
Для примера возьмем MS SQL и Аксапту 2012, которые умеют отображать null значение, полученное из базы. там в поле отображается специальное значение null, а поле становится недоступным для редактирования.
Как мне кажется, это не правильное решение разработчиков. Ведь получается, что если поле приняло значение null, то пользователь его не может изменить напрямую. Чтобы пользователь смог изменить это поле, его значение должно быть программно установлено в пустое значение. Фактически, создается доп.поле, содержащее признак необходимости изменить основное поле. Что возвращает к реализации с двумя полями.

Цитата:
Сообщение от mazzy Посмотреть сообщение
другие реквизиты могут находится за тысячу километров таблиц от данного места и метода, где пара значений применяется. я уже приводил примеры

"если для данного клиента включен контроль кредитного лимита, то спросить и хранить этот кредитный лимит"
Опять я не в курсе "новых веяний" в Ax2012, но в младших версиях Axapta все ключевые реквизиты, необходимые для расчета копировались в подчиненные и связанные таблицы. Т.е. находится за тысячу километров таблиц он не должен. Это ошибка проектирования (хотя и нарушает принципы нормализации)

В данном примере, где будет хранится сумма кредитного лимита? Ну, предположительно, либо в таблице клиента, либо в таблице договоров. В обоих случаях признак контроля кредитного лимита должен быть в той же таблице.

Цитата:
Сообщение от mazzy Посмотреть сообщение
не совсем.
чтобы срабатывал prmIsDefault в вызывающем классе параметр не должен быть указан.
Угу. Так я так и написал "очень ограниченно" Т.е. в очень специфических ситуациях.

------------------

Если просто "перечислять варианты", то вот еще парочка идей
  1. Объект Map из одного элемента: ключ - признак NULL, значение - значение
  2. Объект Struct из одной "строки". Одно "поле" - признак NULL, другое - значение. Если добавить 3 поле-идентификатор, то можно в один объект Struct собрать все переменные для обработки, сделав несколько "строк". Аналог временной таблицы
  3. Объект Set или List из одного элемента. В случае, если значение эквивалентно NULL, то не создавать (или удалять) элемент. Нет элементов - значение NULL
Эти объекты позволяют сделать частичный контроль типов (правда, только на уровне базовых типов), а также имеют встроенные методы pack/create, что упрощает их передачу в pack/unpack
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: mazzy (2).
Теги
null, nullable, tuple, как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Универсальный изменятель значений полей wojzeh DAX: Программирование 17 26.09.2013 17:47
Как лучше хранить ссылки на записи - (RefTableId, Company, RefRecId) mazzy DAX: Программирование 41 08.07.2011 13:18
Как правильно хранить статичный набор начальных данных в классах? mazzy DAX: Программирование 58 14.04.2011 12:10
Последовательная замена множества уникальных значений на другие без возникновения дубликатов gl00mie DAX: Программирование 23 24.11.2010 15:05
Проверки заполненных значений в связанных таблицах. miklenew DAX: База знаний и проекты 11 25.12.2007 14:40
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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