D365FO 10.0.12
Пишу RunBaseBatch. который делает автоматичские платежи по custTransOpen. где due date <= сегодня.
Хотелось бы добавить возможность для пользователя выбрать вручную dueDate в фильтре запроса.
Задумывалась такая логика:
Изначально due date range очищается,
Если пользователь выбирает вручную due date, то используем его.
В данном случае пользователь выбрал неправильно- просто значение вместо диапазона: - due date == 2020-11-16
Если пользователь ничего не выбрал, автоматически добавляем диапазон: due date <= сегодня (2020-11-17)
В реальности, пользователь выбрал значение вручную, но система все равно добавляет автоматический диапазон...
Разве if(!qbds.findRange(fieldnum(CustTransOpen, dueDate))) не должен был увидеть уже имеющееся условие?
X++:
void run()
{
....
q = QueryRun.query();
/*в дебаггере: текущее значение имеет выбранный пользователем DueDate=2020-11-16:
{SELECT MIN(dataAreaId), MIN(AccountNum), SUM(AmountCur)
FROM CustTransOpen(CustTransOpen_1)
GROUP BY CustTransOpen.AccountNum
WHERE ((CustTransOpen(CustTransOpen_1).AccountNum = N'000000001'))
AND ((CustTransOpen(CustTransOpen_1).DueDate = {ts '2020-11-16 00:00:00.000'}))}
*/
QueryBuildDataSource qbds = q.dataSourceTable(tableNum(CustTransOpen));
if(!qbds.findRange(fieldnum(CustTransOpen, dueDate)))
{
//несмотря на наличие DueDate range, дебаггер идет сюда и добавляется новый range
qbds.addRange(fieldnum(CustTransOpen, dueDate)).value(queryRange(dateNull(), systemDateGet()));
}
Info(strFmt("Due date used: %1", qbds.rangeField(fieldnum(CustTransOpen, dueDate)).value()));
/*в итоге получаем странный запрос с двумя разными фильтрами по due date:
{SELECT MIN(dataAreaId), MIN(AccountNum), SUM(AmountCur)
FROM CustTransOpen(CustTransOpen_1)
GROUP BY CustTransOpen.AccountNum
WHERE ((DueDate<={ts '2020-11-17 00:00:00.000'}))
AND ((CustTransOpen(CustTransOpen_1).AccountNum = N'000000001'))
AND ((CustTransOpen(CustTransOpen_1).DueDate = {ts '2020-11-16 00:00:00.000'}))}
*/
.....
}
boolean unpack(container packedClass)
{
Integer locVersion = conPeek(packedClass,1);
container locPackedQuery;
switch (locVersion)
{
case #CurrentVersion:
[locVersion,#CurrentList,locPackedQuery] = packedClass;
break;
default :
return false;
}
if (locPackedQuery)
{
queryRun = new QueryRun(locPackedQuery);
Query q = QueryRun.query();
QueryBuildDataSource qbds = q.dataSourceTable(tableNum(CustTransOpen));
if(qbds.findRange(fieldnum(CustTransOpen, dueDate)))
{
qbds.clearRange(fieldnum(CustTransOpen, dueDate));
}
}
else
{
return false;
}
return true;
}