|  16.01.2008, 18:49 | #1 | 
| Участник | Неверный откат сопоставленных транзакций 
			
			Проблема: при импорте транзакций из внешней системы в главный журнал была допущена ошибка, в результате которой журнал был проведен неверно. Чтобы вручную не откатывать 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 | 
|  | 
|  16.01.2008, 19:27 | #2 | 
| Участник | 
			
			а бэкап есть?
		 | 
|  | 
|  16.01.2008, 19:58 | #3 | 
| Участник | 
			
			Бэкап есть, только после этого много модификаций было проделано
		 | 
|  | 
|  16.01.2008, 22:22 | #4 | 
| Участник | 
			
			Пугает вот это. Цитата: внимание, при неправильных действиях мой совет может ухудшить ситуацию. Сначала потренируйтесь на тестовой базе. Восстановите бэкап в соседнюю базу. сравните по recid. если изменения вызваны только вашими действиями, то замените записи в рабочей на записи из бэкапа. Таблицы: custTrans custTransOpen custSettlement vendTrans vendTransOpen vendSettlement предупредите всех, что вы отмените галочки сопоставления и удалите все записи в specTrans. Теперь удаление ваших отмен. придется удалить лишние записи в перечисленных таблицах плюс, возможно ledgerTrans taxTrans custinvoicejour custinvoicejourtrans vendinvoicejour vendinvoicejourtrans если у вас не дай бог ведется книга продаж и книга покупок, то придется чистить и там. если ведутся письма напоминания и штрафы, то и их чистить. если у вас автоматически начисляется агентские вознаграждения, то их тоже чистить. если есть свои таблицы, то и их тоже. связующее поле - Voucher (Документ ГК) после всех этих действий сделайте пересчет перидов в главной книге (внимание, пересчет может занять продолжительное время. он заблокирует всех пользователей, поэтому пересчет лучше делать ночью или выгнать всех пользователей) в общем, сделайте анализ, на что повлияли ваши действия и попытайтесь восстановить эти данные из бэкапа. | 
|  | |
| За это сообщение автора поблагодарили: sgt.Pepper (1). | |
|  17.01.2008, 09:16 | #5 | 
| Участник | 
			
			А может стоит поиграться с Проверкой целостности данных компании. У меня как то проводки с остатками не сходились я запустил с галами складские проводки, в наличии в режими коррекция ошибок система всё сама корректно исправила. Правда база была не рабочая. Без экстрима. Но поиграться было интересно. Вообщем может вам тоже поставить необходимые галки и поставить режим проверки Проверка. Может то что вам нужно система сама найдёт. | 
|  |