Показать сообщение отдельно
Старый 17.11.2020, 19:47   #1  
alicedr is offline
alicedr
Участник
 
173 / 43 (2) +++
Регистрация: 06.07.2012
Адрес: Канада
D365FO queryBuildDataSource.FindRange() не работает??
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;
    }