Показать сообщение отдельно
Старый 16.01.2008, 18:49   #1  
sgt.Pepper is offline
sgt.Pepper
Участник
Аватар для sgt.Pepper
 
43 / 15 (1) ++
Регистрация: 05.10.2007
Адрес: Германия
Неверный откат сопоставленных транзакций
Проблема: при импорте транзакций из внешней системы в главный журнал была допущена ошибка, в результате которой журнал был проведен неверно. Чтобы вручную не откатывать 1500 транзакций, я написал скрипт, который откатывает их автоматически. Пример:
X++:
    LedgerJournalTrans          ledgerJournalTrans;
    LedgerTrans                 ledgerTrans;
    CustTrans                   custTrans;
    VendTrans                   vendTrans;

    Args                        reverseArgs = new Args();
    MenuFunction                menuFunction;
    SysOperationProgress        progress;
    TempStr                     message;
    TmkImportStatus             journalImportStatus = TmkImportStatus::Imported;

// find ledgerJournalTrans
...

            switch(ledgerJournalTrans.AccountType)
            {
                case LedgerJournalAcType::Cust:
                    custTrans = CustTrans::findFromInvoice(line.InvoiceId, line.AccountNum);
                    reverseArgs.record(custTrans);
                    menuFunction = new MenuFunction(menuitemactionstr(TransactionReversal_Cust), MenuItemType::Action);
                    menuFunction.run(reverseArgs);
                    break;
                case LedgerJournalAcType::Vend:
                    vendTrans = VendTrans::findVoucherDateAmount(ledgerJournalTrans.Voucher, ledgerJournalTrans.DocumentDate, line.GrossAmountCur);
                    reverseArgs.record(vendTrans);
                    menuFunction = new MenuFunction(menuitemactionstr(TransactionReversal_Vend), MenuItemType::Action);
                    menuFunction.run(reverseArgs);
                    break;
                case LedgerJournalAcType::Ledger:
                    ledgerTrans = LedgerTrans::findVoucher(ledgerJournalTrans.Voucher);
                    while select ledgerTrans
                        index VoucherDateIdx
                        where ledgerTrans.Voucher == ledgerJournalTrans.Voucher
                    {
                        reverseArgs.record(ledgerTrans);
                        menuFunction = new MenuFunction(menuitemactionstr(TransactionReversal_Ledger), MenuItemType::Action);
                        menuFunction.run(reverseArgs);
                    }
                    break;
                default:
                    error("@TMK180"); // This type of transaction cannot be reversed
            }
Тлько я не учел одной вещи - при поиске обнаружились такие же транзакции за более ранний период, которые уже были сопоставлены.
В результате отката появилась разница между сальдо на общем счете клиентов и суммой открытых транзакций по клиентам.
Провел исследования - при если откатывать откат или производить другие манипуляции, это приводит к ухужшению ситуации.

Единственное что пока нашел - это откатить сопоставленный платеж. Но тогда обе откаченные транзакции появляются в листе закрытых транзакций,
причем lastSettledVoucher у них равен ваучеру отката.

Может кто посоветует что делать в этой ситуации, может просто почистить таблицы CustSettlement, CustOpenTrans и подправить в CustTrans все что связано с settlement? Но тогда есть еще налоги, курсовые разницы и прочие интересные штуки.

Ax 4.0 SP1