Проблема: при импорте транзакций из внешней системы в главный журнал была допущена ошибка, в результате которой журнал был проведен неверно. Чтобы вручную не откатывать 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