Показать сообщение отдельно
Старый 06.11.2008, 18:30   #1  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
! Оптимизация кода с LedgerTrans
Есть в Axapte 3 SP6 class LedgerRRGOperationBalanceTotal_RU метод
X++:
public AmountMST calc()
{
    AmountMST   sumTmp, balanceAmountMST;

    balanceAmountMST = 0;

    if (m_PEriodType == LedgerRRGBalancePeriodType_RU::Incoming)
        m_CalculateDate -=  1;

    while select  m_AccountList
    outer join    m_LedgerTrans
        where m_LedgerTrans.TransDate  <= m_CalculateDate          &&
              m_AccountList.AccountNum == m_LedgerTrans.AccountNum &&
              m_LedgerTrans.PeriodCode == PeriodCode::Regular
    {
        if (this.checkTransaction(m_LedgerTrans.TransType,
                                  m_LedgerTrans.OperationsTax,
                                  m_LedgerTrans.Correct,
                                  m_LedgerTrans.Dimension,
                                  ''))
        {
            if (m_currencyForCalc == LedgerRRGCurrencyForCalc_RU::AmountMST)
            {
                sumTmp = m_LedgerTrans.AmountMST;
            }
            else
            {
                sumTmp = m_LedgerTrans.AmountMSTSecond;
            }

            balanceAmountMST    += (m_AccountList.ReverseSign ? (-1) : 1) * sumTmp;
        }
    }

    return  balanceAmountMST;
}
Как его можно оптимизировать? Ощутимо долго цикл пробегается по LedgerTrans, да при этом еще вызывает postLoad каждый раз.