Двойные проводки
0 (0)
Двойные проводки ( jam 07.08.2008 13:17 )
5(1)Всем здравствуйте!
Очень непонятная ситуация. Помогите кто может, срочно!
Из "Кассы банка" делается отправка документов в МВОДБ, в МВОДБ появляется отложенный документ. В течение дня пользователи делают проводку отложенных (в МВОДБ). Некоторые документы появляются в проведенных 2 раза. Совпадают все поля кроме поля Oper.
Как это лечить??? Отчего это???
Есть также двойные документы под одним опером.
Журнал операций ничего не показал - один документ и все.
Может, это из-за некорректной работы sint.mac? Но там на всех update() стоит msgbox() при ошибке. И пользователи утверждают, что никаких сообщений при отправке проведенных Кассы в отложенные МВОДБ не было. Может, все-таки в sint.mac поставить везде транзакцию?
В sint.mac везде, где есть вставка/обновление/удаление закоментировал Not - так MsgBox() все равно не работает. Такое ощущение, что не sint.mac пишет документ в отложеннные, а ехе-шник.
При этом даже поставил ProcessTrn() - AbortTrn - не сработало, т.е. документ вставился в отложенные.
Один сопровожденец сообщил, что некоторые документы появились в МВОДБ с Oper равным 0, и проведшие их пользователи их не видят (у них диапазон только свой).
Добавил pdoc.Oper = tdoc.Oper и pdoc_с.Oper = tdoc.Oper
Но почему транзакция не сработала??? Привоже текст макроса
>> Ответитьтекст макроса ( jam 07.08.2008 13:18 )
5(1)File ddoc (deskdoc) Write Key 0; File tdoc (todskdoc) Write Key 0; File pdoc (postdoc) Write Key 4; File pdoc_c ("postdoc$.dbt") Write Key 4; File Flogtxt() Txt Write Append; Var Account, Auto, count; Const c_NSProv = "░░555", cvLogTxtF = "..\\TXTFILE\\LOGCASH\\mstkslog.txt"; Macro CommentError(SComm) /* Var ErrCode, ErrDescr; ErrCode = Status(ErrDescr); MsgBox(SComm +"|Код ошибки: "+ErrCode+"|Описание:|"+ErrDescr); SetOutPut(cvLogTxtF, True); Println("Oper ", {Oper}, ", ", Date(), ", ", Time(), ", ", SComm +" Код ошибки: "+ErrCode+" Описание: "+ErrDescr); SetOutPut(Null, True); */ End; Macro Run_sint() if (Not Create(tdoc)) MsgBox("Ошибка очистки временного файла"); Exit(1); end; if (Not Open(Flogtxt, cvLogTxtF)) MsgBox("Ошибка открытия файла журнала "/* + {Oper} +" "+ {curdate} +" "+ Date() +" "+ Time()*/); Exit(1); end; /* Следующий цикл "чистит" поле Consent в т.ч. и для уже отправленных документов. Если этого не делать, получим синтетику только для вновь введенных документов. */ Rewind(ddoc); While (Next(ddoc)) if ((ddoc.Group_Doc) and (ddoc.Result_Carry != 14) and /* рублевое покрытие */ (ddoc.Consent > "1")) ddoc.Consent = "0"; if (/*Not*/ Update(ddoc)) CommentError("Ошибка подготовки док-тов обмена к интеграции"); MsgBox("Ошибка подготовки док-тов обмена к интеграции"); AbortTrn(); end; end; end; count = 0; InitProgress(NRecords(ddoc), "Ждите...", "Интеграция обменных документов"); Rewind(ddoc); While (Next(ddoc)) count = count + 1; UseProgress(count); if (ddoc.Group_Doc and (ddoc.Result_Carry != 14) and (ddoc.Consent < "2")) tdoc.Result_Carry = ddoc.Result_Carry; tdoc.Account_Payer = ddoc.Account_Payer; tdoc.Account_Receiver = ddoc.Account_Receiver; tdoc.Sum = ddoc.Sum; tdoc.Code_Currency = ddoc.Code_Currency; tdoc.Kind_Oper = ddoc.Kind_Oper; tdoc.Ground = ddoc.Ground; tdoc.Date_Document = ddoc.Date_Document; tdoc.Date_Value = ddoc.Date_Value; ddoc.Consent = "2"; if (/*Not*/ Update(ddoc)) CommentError("Ошибка интеграции док-тов обмена"); MsgBox("Ошибка интеграции док-тов обмена"); AbortTrn(); end; Auto = ddoc.AutoKey; While (Next(ddoc)) if (ddoc.Group_Doc and (ddoc.Result_Carry != 14) and (ddoc.Consent < "2")) /* Здесь можно не синтезировать документы, а вставлять их по одному. !!! Но, это может сильно увеличить документооборот в Банке. */ if ((tdoc.Account_Payer == ddoc.Account_Payer) and (tdoc.Account_Receiver == ddoc.Account_Receiver)) tdoc.Sum = tdoc.Sum + ddoc.Sum; ddoc.Consent = "2"; if (/*Not*/ Update(ddoc)) CommentError("Ошибка интеграции док-тов обмена 1"); MsgBox("Ошибка интеграции док-тов обмена 1"); AbortTrn(); end; end; if ((tdoc.Account_Payer == ddoc.Account_Receiver) and (tdoc.Account_Receiver == ddoc.Account_Payer)) tdoc.Sum = tdoc.Sum - ddoc.Sum; ddoc.Consent = "2"; if (/*Not*/ Update(ddoc)) CommentError("Ошибка интеграции док-тов обмена 2"); MsgBox("Ошибка интеграции док-тов обмена 2"); AbortTrn(); end; end; end; end; if (tdoc.Sum < 0) Account = tdoc.Account_Receiver; tdoc.Account_Receiver = tdoc.Account_Payer; tdoc.Account_Payer = Account; tdoc.Sum = -tdoc.Sum; end; tdoc.AutoKey = 0; tdoc.Group_Doc = -1; tdoc.Consent = "0"; /* Начальный кассы */ tdoc.Post_Sun = 3; /* Получен */ tdoc.Symbol_Cach = " 0"; tdoc.SymbNotBal = " 0"; tdoc.iApplicationKind = 6; /* Документ Кассы */ tdoc.ApplicationKey = "Интегр_обмен"; tdoc.Real_Payer = tdoc.Account_Payer; tdoc.Real_Receiver = tdoc.Account_Receiver; if (/*Not*/ Insert(tdoc)) CommentError("Ошибка записи синтетического"); MsgBox("Ошибка записи синтетического"); AbortTrn(); end; ddoc.AutoKey = Auto; if (/*Not*/ GetEQ(ddoc)) CommentError("Ошибка поиска"); MsgBox("Ошибка интеграции док-тов обмена"); AbortTrn(); end; else msgbox("1"); end; end; RemProgress(); count = 0; InitProgress(NRecords(pdoc), "Ждите...","Удаление старых интегральных документов"); Rewind(pdoc); pdoc.iApplicationKind = 6; pdoc.ApplicationKey = "Интегр_обмен"; While (GetEQ(pdoc)) count = count + 1; UseProgress(count); if (/*Not*/ Delete(pdoc)) CommentError("Ошибка удаления старого банковского интегрального док-та рубли"); MsgBox("Ошибка удаления старого банковского интегрального док-та"); AbortTrn(); end; end; RemProgress(); count = 0; InitProgress(NRecords(pdoc_c),"Ждите...", "Удаление старых валютных интегральных документов"); Rewind(pdoc_c); pdoc_c.iApplicationKind = 6; pdoc_c.ApplicationKey = "Интегр_обмен"; While (GetEQ(pdoc_c)) count = count + 1; UseProgress(count); if (/*Not*/ Delete(pdoc_c)) CommentError("Ошибка удаления старого банковского интегрального док-та валюта"); MsgBox("Ошибка удаления старого банковского интегрального док-та"); AbortTrn(); end; end; RemProgress(); count = 0; InitProgress(NRecords(tdoc),"Ждите...", "Запись интегральных документов"); Rewind(tdoc); While (Next(tdoc)) count = count + 1; UseProgress(count); if (tdoc.Code_Currency) msgbox("cur"); pdoc_c.AutoKey = 0; pdoc_c.Group_Doc = tdoc.Group_Doc; pdoc_c.Consent = tdoc.Consent; pdoc_c.iApplicationKind = tdoc.iApplicationKind; pdoc_c.ApplicationKey = tdoc.ApplicationKey; pdoc_c.Real_Payer = tdoc.Real_Payer; pdoc_c.Real_Receiver = tdoc.Real_Receiver; pdoc_c.Account_Payer = tdoc.Account_Payer; pdoc_c.Account_Receiver = tdoc.Account_Receiver; pdoc_c.Sum = tdoc.Sum; pdoc_c.Code_Currency = tdoc.Code_Currency; pdoc_c.Kind_Oper = tdoc.Kind_Oper; pdoc_c.Ground = tdoc.Ground; pdoc_c.Date_Document = tdoc.Date_Document; pdoc_c.Date_Value = tdoc.Date_Value; pdoc_c.Post_Sun = tdoc.Post_Sun; pdoc_c.Symbol_Cach = tdoc.Symbol_Cach; pdoc_c.SymbNotBal = tdoc.SymbNotBal; pdoc_c.Result_Carry = tdoc.Result_Carry; /**/ pdoc_c.Oper = tdoc.Oper; if (SubStr(tdoc.UserField3, 1,5) == c_NSProv) pdoc_c.Kind_Carry = Int(SubStr(tdoc.UserField3, 3,3)); end; if (/*Not*/ Insert(pdoc_c)) CommentError("Ошибка записи интегрального банковского док-та валюта"); MsgBox("Ошибка записи интегрального банковского док-та"); AbortTrn(); end; else msgbox("rub"); pdoc.AutoKey = 0; pdoc.Group_Doc = tdoc.Group_Doc; pdoc.Consent = tdoc.Consent; pdoc.iApplicationKind = tdoc.iApplicationKind; pdoc.ApplicationKey = tdoc.ApplicationKey; pdoc.Real_Payer = tdoc.Real_Payer; pdoc.Real_Receiver = tdoc.Real_Receiver; pdoc.Account_Payer = tdoc.Account_Payer; pdoc.Account_Receiver = tdoc.Account_Receiver; pdoc.Sum = tdoc.Sum; pdoc.Code_Currency = tdoc.Code_Currency; pdoc.Kind_Oper = tdoc.Kind_Oper; pdoc.Ground = tdoc.Ground; pdoc.Date_Document = tdoc.Date_Document; pdoc.Date_Value = tdoc.Date_Value; pdoc.Post_Sun = tdoc.Post_Sun; pdoc.Symbol_Cach = tdoc.Symbol_Cach; pdoc.SymbNotBal = tdoc.SymbNotBal; pdoc.Result_Carry = tdoc.Result_Carry; /**/ pdoc.Oper = tdoc.Oper; if (SubStr(tdoc.UserField3, 1,5) == c_NSProv) pdoc.Kind_Carry = Int(SubStr(tdoc.UserField3, 3,3)); end; if (/*Not*/ Insert(pdoc)) CommentError("Ошибка записи интегрального банковского док-та рубли"); MsgBox("Ошибка записи интегрального банковского док-та"); AbortTrn(); end; end; end; RemProgress(); /* Rewind(pdoc); /* Jam */ count = 0; InitProgress(NRecords(pdoc), "Ждите...", "Обновление отложенных документов"); While (Next(pdoc)) count = count + 1; UseProgress(count); if (SubStr(pdoc.UserField3, 1,5) == c_NSProv) pdoc.Kind_Carry = Int(SubStr(pdoc.UserField3, 3,3)); if (Not Update(pdoc)) CommentError("Ошибка обновления pdoc"); /* MsgBox("Ошибка обновления pdoc"); */ AbortTrn(); end; end; end; RemProgress(); Rewind(pdoc_c); count = 0; InitProgress(NRecords(pdoc_c), "Ждите...", "Обновление отложенных документов 1"); While (Next(pdoc_c)) count = count + 1; UseProgress(count); if (SubStr(pdoc_c.UserField3, 1,5) == c_NSProv) pdoc_c.Kind_Carry = Int(SubStr(pdoc_c.UserField3, 3,3)); if (Not Update(pdoc_c)) CommentError("Ошибка обновления pdoc_c"); /* MsgBox("Ошибка обновления pdoc_c"); */ AbortTrn(); end; end; end; RemProgress(); /**/ */ Close(Flogtxt); Exit(1); End; if (Not ProcessConTrn(5, "Run_sint", ddoc, pdoc, pdoc_c, tdoc)) MsgBox("Операция не совершена. Произведен откат изменений в базах"); end; /* Run_sint(); */
>> Ответить