Показать сообщение отдельно
Старый 10.02.2010, 02:10   #1  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Customer Aging Report / Отчет по срокам оплаты для клиента
продолжаем препарировать этот отчётик. обнаружились новые "открытия", которые хотелось бы обсудить с компетентными товарищами с точки зрения правильного учёта.

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

(см. рисунки во вложении)

происходит это из-за того (смотрим код метода calculateDetails класса CustBalancelistDocumentDate), что при детализации в методе queryRunOpenTransactions используется запрос CustTransCustTransOpen с сортировкой по дате транзакции, а без детализации - в методе queryRunOpenTransactionsSummary идёт создание запроса в коде, где уже группировка включается по полю даты документа.

X++:
    switch (_dateTransactionDuedate)
    {
        case DateTransactionDuedate::TransactionDate:
            groupByDataSourceNo = 1;
            groupByFieldId = fieldnum(CustTransOpen, TransDate);
            break;
        case DateTransactionDuedate::DueDate:
            groupByDataSourceNo = 1;
            groupByFieldId = fieldnum(CustTransOpen, DueDate);
            break;
        case DateTransactionDuedate::DocumentDate:
            groupByDataSourceNo = 2;
            groupByFieldId = fieldnum(CustTrans, DocumentDate);
            break;
        default:
            throw error(Error::wrongUseOfFunction(funcname()));
    }

    query = new Query();
    query.addDataSource(tablenum(CustTransOpen));

    query.dataSourceNo(1).addDataSource(tablenum(CustTrans));
    query.dataSourceNo(2).joinMode(JoinMode::InnerJoin);
    query.dataSourceNo(2).addLink(fieldnum(CustTransOpen, RefRecId), fieldnum(CustTrans, RecId));
и чуть ниже:

X++:
 query.dataSourceNo(1).orderMode(OrderMode::GroupBy);
    query.dataSourceNo(groupByDataSourceNo).addSortField(groupByFieldId);
    query.dataSourceNo(2).orderMode(OrderMode::GroupBy);
    query.dataSourceNo(2).addSortField(fieldnum(CustTrans, CurrencyCode));

    query.dataSourceNo(1).fields().addField(fieldnum(CustTransOpen, AmountMST), SelectionField::Sum);
    query.dataSourceNo(1).fields().addField(fieldnum(CustTransOpen, AmountCur), SelectionField::Sum);
    query.dataSourceNo(groupByDataSourceNo).fields().addField(groupByFieldId);
    query.dataSourceNo(2).fields().addField(fieldnum(CustTrans, CurrencyCode));

в следующем же сегменте кода того же метода calculateDetails мы видим, что анализ на "пустую" дату документа смысла не имеет, ибо все транзакции уже сгруппированы, и оба варианта нулевые.

X++:
queryRun = this.queryRunOpenTransactions(_custTable);
        while (queryRun.next())
        {
            custTrans = queryRun.get(tablenum(CustTrans));
            custTransOpen = queryRun.get(tablenum(CustTransOpen));
            this.addTrans(_custTable.AccountNum,
                          custTrans.Voucher,
                          custTrans.Invoice,
                          [U]custTrans.DocumentDate ? custTrans.DocumentDate : custTrans.TransDate,[/U]
                          this.isTransactionAPayment(custTrans),
                          '',
                          custTransOpen.AmountMST);
в этой связи вопрос к залу: а как должно выдавать эти данные, где дата документа нулевая (когда проводим фактуру, не указывая даты документа)? который из этих вариантов правильный? или есть третий путь?

спасибо за внимание.
__________________
Felix nihil admirari

Последний раз редактировалось wojzeh; 27.10.2019 в 19:35.