Двойные проводки

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();
      */
      


      >> Ответить