AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.09.2009, 09:34   #1  
Alexanderrrr is offline
Alexanderrrr
Участник
Аватар для Alexanderrrr
 
54 / 19 (1) ++
Регистрация: 06.03.2009
Адрес: Саратов
Проблема с LedgerJournalTrans
Доброго времени суток, уважаемые жители axforuma!

Возможно мой вопрос покажется глупым.

У нас существует отчет "Оплата по группам финансирования", выбирающий данные из таблиц Custtrans, CustInvoiceJour и LedgerJournalTrans (Axapta 3.0 SP5). Работал он работал, и вот однажды утром стал работать гораздо медленнее. Своими разработками мы этот отчет не трогали. Включив мониторинг запросов, выяснил, что очень долго производится выборка из LedgerJournalTrans. Сделав реиндексацию по всем индексам этой таблицы, временно решил проблему. Но к этому вопросу постоянно приходится обращаться.


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

Код:
void insertTmpFromLedgerJournalTrans()
{
    QueryRun            qrLedgerJour;
    RContractTable      qContractTable;
    LedgerJournalTrans  qLedgerTrans;
    LedgerJournalTrans  ledgerTrans;
    LedgerJournalTable  ledgerTable;
    CustSettlement      custSettlement;
    CustSettlement      settlement;
    CustTrans           custTrans, custTransSelect;
    ;


    qrLedgerJour = new QueryRun(queryStr(GroupFinancLedgerJournalTrans));

    qrLedgerJour.query().dataSourceTable(tableNum(LedgerJournalTrans)).addRange(fieldnum(LedgerJournalTrans,TransDate)).value(queryRange(dateFrom,dateTo));
    qrLedgerJour.query().dataSourceTable(tableNum(LedgerJournalTrans)).addRange(fieldnum(LedgerJournalTrans,AmountCurCredit)).value("!=0");
    qrLedgerJour.query().dataSourceTable(tableNum(LedgerJournalTrans)).addRange(fieldnum(LedgerJournalTrans,AccountType)).value(enum2str(LedgerJournalACType::Cust));
    qrLedgerJour.query().dataSourceTable(tableNum(RContractTable)).addRange(fieldnum(RContractTable,RContractPartnerType)).value(enum2str(RContractPartnerType::Cust));

    if (rangeDimension)
        qrLedgerJour.query().dataSourceTable(tableNum(LedgerJournalTrans)).addRange(fieldId2ext(fieldnum(LedgerJournalTrans, Dimension),2)).value(rangeDimension);
    if (rangeGroupFinanc)
        qrLedgerJour.query().dataSourceTable(tableNum(RContractTable)).addRange(fieldnum(RContractTable,GroupFinancId)).value(rangeGroupFinanc);
    if (accountNum)
        qrLedgerJour.query().dataSourceTable(tableNum(LedgerJournalTrans)).addRange(fieldNum(LedgerJournalTrans,AccountNum)).value(accountNum);
    if (contractAccount)
    {
        qrLedgerJour.query().dataSourceTable(tableNum(RContractTable)).addRange(fieldNum(RContractTable,RContractCode)).value(contractCode);
        qrLedgerJour.query().dataSourceTable(tableNum(RContractTable)).addRange(fieldNum(RContractTable,RContractAccount)).value(contractAccount);
        qrLedgerJour.query().dataSourceTable(tableNum(RContractTable)).addRange(fieldNum(RContractTable,RContractPartnerCode)).value(accountNum);
    }

    while (qrLedgerJour.next())
    {
        qLedgerTrans    = qrLedgerJour.get(tableNum(LedgerJournalTrans));
        qContractTable  = qrLedgerJour.get(tableNum(RContractTable));

        while select RecId, budget, JournalNum, Voucher, AccountNum, AmountCurCredit from ledgerTrans
            where ledgerTrans.RecId        == qLedgerTrans.RecId
        join JournalNum, Posted, JournalType from ledgerTable
            index hint PostedJournalNumIdx
            where ledgerTable.JournalNum    == ledgerTrans.JournalNum   &&
                  ledgerTable.Posted        == NoYes::Yes
        {

            //select firstonly Voucher,AccountNum,SettleAmountCur,TransDate,AmountCur from custTrans
            while select Voucher, AccountNum, SettleAmountCur, TransDate, AmountCur from custTrans
                index hint AccountDateIdx
                where custTrans.Voucher     == ledgerTrans.Voucher  &&
                      custTrans.AccountNum  == ledgerTrans.AccountNum
            {

                if (custTrans.AmountCur - custTrans.SettleAmountCur != 0)
                {
                    tmpTable.clear();

                    if (ledgerTrans.budget == NoYes::Yes)
                    {
                        tmpTable.BPayCurrent    = custTrans.AmountCur - custTrans.SettleAmountCur;
                        tmpTable.PayCurrent     = 0;
                    }
                    else
                    {
                        tmpTable.PayCurrent     = custTrans.AmountCur - custTrans.SettleAmountCur;
                        tmpTable.BPayCurrent    = 0;
                    }
                    tmpTable.GroupFinancName    = ICLGroupsFinancTable::find(qContractTable.GroupFinancId).GroupFinancName;
                    tmpTable.AccountNum         = qLedgerTrans.AccountNum;
                    tmpTable.AccountName        = CustTable::find(qLedgerTrans.AccountNum).NameAlias;
                    tmpTable.ContractNumberDate = qContractTable.contractNumberDate;
                    tmpTable.Voucher            = qLedgerTrans.Voucher;
                    tmpTable.AddQty             = 0;
                    tmpTable.AddAmount          = 0;
                    tmpTable.DebtBeginPeriod    = 0;
                    tmpTable.Advance            = NoYes::Yes;
                    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/*CurrentPayTotal*/;

                    tmpTable.insert();
                }
                while select OffsetTransVoucher, AccountNum, OffsetRecid, TransRecId, SettleAmountCur from custSettlement
                    index hint OffsetVoucherIdx
                    //where custSettlement.OffsetTransVoucher == ledgerTrans.Voucher      &&
                    //      custSettlement.AccountNum         == ledgerTrans.AccountNum   &&
                    where custSettlement.TransRecId    == custTrans.RecId      &&
                          custSettlement.AccountNum    == custTrans.AccountNum &&
                          custSettlement.CanBeReversed == NoYes::Yes

                {
                   select firstonly Voucher, AccountNum, SettleAmountCur, TransDate from custTransSelect
                        index hint AccountDateIdx
                        //where custTransSelect.Voucher     == settlement.OffsetTransVoucher  &&
                        where custTransSelect.RecId      == custSettlement.OffsetRecid  &&
                              custTransSelect.AccountNum == custSettlement.AccountNum;

                    tmpTable.clear();

                    if (ledgerTrans.budget == NoYes::Yes)
                    {
                        if (custTransSelect.TransDate >= dateFrom)
                        {
                            tmpTable.BPayCurrent    = custSettlement.SettleAmountCur;
                            tmpTable.BPay           = 0;
                            tmpTable.PayCurrent     = 0;
                            tmpTable.Pay            = 0;
                        }
                        else
                        {
                            tmpTable.BPayCurrent    = 0;
                            tmpTable.BPay           = custSettlement.SettleAmountCur;
                            tmpTable.PayCurrent     = 0;
                            tmpTable.Pay            = 0;
                        }
                    }
                    else
                    {
                        if (custTransSelect.TransDate >= dateFrom)
                        {
                            tmpTable.BPayCurrent    = 0;
                            tmpTable.BPay           = 0;
                            tmpTable.PayCurrent     = custSettlement.SettleAmountCur;
                            tmpTable.Pay            = 0;
                        }
                        else
                        {
                            tmpTable.BPayCurrent    = 0;
                            tmpTable.BPay           = 0;
                            tmpTable.PayCurrent     = 0;
                            tmpTable.Pay            = custSettlement.SettleAmountCur;
                        }
                    }

                    tmpTable.GroupFinancName    = ICLGroupsFinancTable::find(qContractTable.GroupFinancId).GroupFinancName;
                    tmpTable.AccountNum         = qLedgerTrans.AccountNum;
                    tmpTable.AccountName        = CustTable::find(qLedgerTrans.AccountNum).NameAlias;
                    tmpTable.ContractNumberDate = qContractTable.contractNumberDate;
                    tmpTable.Voucher            = qLedgerTrans.Voucher;
                    tmpTable.AddQty             = 0;
                    tmpTable.AddAmount          = 0;
                    tmpTable.DebtBeginPeriod    = 0;
                    tmpTable.Advance            = (custTransSelect.TransDate > dateTo ? NoYes::Yes : NoYes::No);NoYes::No;
                    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/*CurrentPayTotal*/;

                    tmpTable.insert();

                }
           }
        }
    }

}
Не подскажите, в чем может быть дело?
__________________
..в каждой программе есть хотя бы одна ошибка..

Последний раз редактировалось Alexanderrrr; 18.09.2009 в 09:37.
Теги
ax3.0, ledgerjournaltrans, sql 2000, производительность

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проблема при рестарте AOS DenisS DAX: Администрирование 4 20.07.2009 17:33
Проблема с единицей измерения longson DAX: Программирование 4 16.07.2007 14:35
Проблема с созданием объекта Lelya DAX: Администрирование 33 27.06.2005 16:38
Проблема: русские шрифты в отчетах, формируемых на сервере. Anais DAX: Администрирование 3 17.11.2003 13:20
ПРОБЛЕМА С ФИЛЬТРАЦИЕЙ В ФОРМЕ!!! VES DAX: Программирование 9 25.04.2003 15:28

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:12.