08.12.2020, 13:26 | #1 |
Участник
|
Как в addRange написать условие что дата равна пустому значению
Как в addRange написать условие что дата равна пустому значению?
Вот мой код он не работает. Пробовал по всякому. formQuery.dataSourceNo(2).addRange(fieldNum(DocsInner_ICL, PeriodEnd)). value(strFmt("( (%1 > %2) || (%1 = dateNull()) )", // fieldStr(DocsInner_ICL, PeriodEnd), transDate, dateNull())); должно быть условие что PeriodEnd либо больше указанной даты или не заданно. Почти весь день с этим копаюсь |
|
08.12.2020, 13:36 | #2 |
Участник
|
Посмотрите global\date2StrXpp по перекрёстным ссылкам, например вот так это выглядит в методе SalesLine\buildDateRangeStr ax2013 r3
X++: /// <summary> /// build date range string with confirmed date. If confirmed is not filled, build with requested date. /// </summary> /// <param name="_dataSourceName"> /// The data source name which need the range. /// </param> /// <param name="_fieldNameConfirmed"> /// The field name of confirmed date. /// </param> /// <param name="_fieldNameRequested"> /// The field name of requested date. /// </param> /// <param name="_dateFrom"> /// The from date for the range. /// </param> /// <param name="_dateTo"> /// The to date for the range. /// </param> /// <returns> /// The query range string. /// </returns> public static str buildDateRangeStr(str _dataSourceName, str _fieldNameConfirmed, str _fieldNameRequested, date _dateFrom, date _dateTo) { if (_dateTo == dateNull()) { _dateTo = dateMax(); } //we select based on confirmed and if confirmed is not filled we add criteria on requested. return strFmt("(((%5.%1 != %6) && (%5.%1 >= %3) && (%5.%1 <= %4)) || ((%5.%1 == %6) && (%5.%2 >= %3) && (%5.%2 <= %4)))", _fieldNameConfirmed, _fieldNameRequested, date2StrXpp(_dateFrom), date2StrXpp(_dateTo), _dataSourceName, date2StrXpp(dateNull())); }
__________________
Sergey Nefedov |
|
08.12.2020, 13:41 | #3 |
Участник
|
Ещё я посмотрел, по идее у вас достаточно простые условия для одного поля, поэтому чтобы было по || можно два раза подряд вызвать addRange.
Т.е. код будет примерно такой : X++: formQuery.dataSourceNo(2).addRange(fieldNum(DocsInner_ICL, PeriodEnd)).value(SysQuery::dateRange(transdate, datemax())); formQuery.dataSourceNo(2).addRange(fieldNum(DocsInner_ICL, PeriodEnd)).value(SysQuery::valueNot(dateNull()));
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: DaniilT (1). |
08.12.2020, 14:50 | #4 |
Участник
|
Немного синтаксис подправлю
X++: formQuery.dataSourceNo(2).addRange(fieldNum(DocsInner_ICL, PeriodEnd)).value(SysQuery::range(transdate+1, datenull())); formQuery.dataSourceNo(2).addRange(fieldNum(DocsInner_ICL, PeriodEnd)).value(SysQuery::value(dateNull())); Здесь используются 2 правила формирования запросов в Axapta 1. Если использовать несколько addRange() по одному и тому же полю, то в итоговом запросе эти условия будут объединены по ИЛИ 2. SysQuery::range(_from, _to) - это метод, который формирует условия для диапазонов. Т.е. условие "от" и "до" включительно. Однако если один из параметров не указан (в отношении даты - это dateNul()), то вместо диапазона будет сформировано условие вида "больше или равно" или "меньше или равно" в зависимости от того, какой параметр нулевой Ну и поскольку Вам надо строго больше, то просто увеличиваем дату на 1 день = transdate+1
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
09.12.2020, 08:34 | #5 |
Участник
|
Спасибо. всем
Спасибо всем кто ответил. + не все получилось поставить.
|
|
|
|