Показать сообщение отдельно
Старый 18.11.2009, 16:22   #1  
Alexanderrrr is offline
Alexanderrrr
Участник
Аватар для Alexanderrrr
 
54 / 19 (1) ++
Регистрация: 06.03.2009
Адрес: Саратов
Проблема с CustTrans
Доброго времени суток, уважаемые программисты, гуру Аксапты
У нас существует отчет "Оплата по группам финансирования", выбирающий данные из таблиц Custtrans, CustInvoiceJour и LedgerJournalTrans (Axapta 3.0 SP5). Работал он работал, и вот однажды утром снова стал работать гораздо медленнее. Включив мониторинг запросов, выяснил, что очень долго проходит кверик по custtrans.
Привожу код метода:

X++:
void insertTmpFromCustTrans()
{
    CustTrans           qCustTrans;
    RContractTable      qContractTable,
                        contractTable;
    ;

    queryRun.query().dataSourceTable(tableNum(CustTrans)).addRange(fieldNum(CustTrans,TransDate)).value(queryRange(dateNull(),datefrom-1));

    if (accountNum)
        queryRun.query().dataSourceTable(tableNum(CustTrans)).addRange(fieldNum(CustTrans,AccountNum)).value(accountNum);
    if (contractAccount)
    {
        queryRun.query().dataSourceTable(tableNum(RContractTable)).addRange(fieldNum(RContractTable,RContractCode)).value(contractCode);
        queryRun.query().dataSourceTable(tableNum(RContractTable)).addRange(fieldNum(RContractTable,RContractAccount)).value(contractAccount);
        queryRun.query().dataSourceTable(tableNum(RContractTable)).addRange(fieldNum(RContractTable,RContractPartnerCode)).value(accountNum);
    }

    while (queryRun.next())
    {
        qCustTrans      = queryRun.get(tableNum(CustTrans));
        qContractTable  = queryRun.get(tableNum(RContractTable));

        if (qCustTrans)
        {
            tmpTable.clear();
            tmpTable.GroupFinancName    = GroupsFinancTable::find(qContractTable.GroupFinancId).GroupFinancName;
            tmpTable.AccountNum         = qCustTrans.AccountNum;
            tmpTable.AccountName        = CustTable::find(qCustTrans.AccountNum).NameAlias;
            tmpTable.ContractNumberDate = qContractTable.contractNumberDate;
            tmpTable.Voucher            = qCustTrans.Voucher;
            tmpTable.Advance            = NoYes::No;
            tmpTable.DebtBeginPeriod    = qCustTrans.AmountCur;
            tmpTable.CurrentPayTotal    = tmpTable.BPayCurrent + tmpTable.PayCurrent;
            tmpTable.PayPeriodTotal     = tmpTable.BPay + tmpTable.Pay + tmpTable.CurrentPayTotal;
            tmpTable.CurrentDebt        = tmpTable.AddAmount + tmpTable.CurrentPayTotal;
            tmpTable.EndDebt            = tmpTable.DebtBeginPeriod + tmpTable.AddAmount + tmpTable.PayPeriodTotal;

            tmpTable.insert();
        }

    }

    queryRun.query().addDataSource(tableNum(TmpGroupFinancingTable));
}
Проблемы с этим отчетом уже были (Проблема с LedgerJournalTrans), но они не касались этого метода..

Реиндексацию индексов custtrans делал, не помогло..
__________________
..в каждой программе есть хотя бы одна ошибка..

Последний раз редактировалось Alexanderrrr; 18.11.2009 в 16:53.