Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Два запроса на одной транзакции [D7, IB6.x]


Garincho ©   (2004-11-26 15:04:00) 

Уважаемые Мастера подскажите. Такая проблема: на одной транзакции висят два запроса на добавление. По неизвестной причине не систематически один запрос (а именно второй) не добавляет записи в таблицу (а первый добавляет). Оба запроса на добавление. В чем может быть дело?

пример кода:

if (FID_Zakaz_Reserved>0)  then UpdOper_To_Zm // Если заказ был ранее зарезервирован
Else Begin

 try
  FixOper_To_ZM;
  except
   application.MessageBox('Внимание произошла ошибка при выполнении запроса -1!', 'ОШИБКА', MB_OK + MB_ICONSTOP);
  ErrFix(555,851,'Выполнение запроса-1',Sklad_dtMod.id_zkz);
 end;

  if LvZak.Items.Count < 1 then begin
    application.MessageBox('Внимание список наименований заказа пуст!!', 'ОШИБКА', MB_OK + MB_ICONSTOP);
   ErrFix(5559,8519,'список наименований заказа пуст',Sklad_dtMod.id_zkz);
  end;

  For ii:=0 to  LvZak.Items.Count-1 do
   with qryInsPrixRasx do begin

     Close;
      Params.ByName('ID_OPER').asInteger:=GetIdOper;
       Params.ByName('GOODS_ID').asInteger:=StrToInt(LvZak.Items[ii].SubItems[5]);
        Params.ByName('ID_ZAKAZ').asInteger:=Sklad_dtMod.id_zkz;
        // Params.ByName('TYPE_OPER_ID').asInteger:=2;

            Params.ByName('COUNT_GOODS').asFloat:=StrToFloat(LvZak.Items[ii].SubItems[2]);
           Params.ByName('EDIZM_ID').asInteger:=StrToInt(LvZak.Items[ii].SubItems[6]);
          Params.ByName('CENA_ZA_ED').asFloat:=StrToFloat(LvZak.Items[ii].SubItems[3]);
        Params.ByName('OBRAZEC_ONLY').asInteger:=StrToInt(LvZak.Items[ii].SubItems[8]);

       //  Params.ByName('TYPE_PAY_ID').asInteger:=1;//////////////

        Params.ByName('WORKER_ID').asInteger:=Sklad_dtMod.userProfile.id_usrstrax;

       try
         ExecQuery;
        except
         application.MessageBox('Внимание произошла ошибка при выполнении запроса -2!', 'ОШИБКА', MB_OK + MB_ICONSTOP);
        ErrFix(555,851,'Выполнение запроса',Sklad_dtMod.id_zkz);
       end;

     Close;

   end;
end; // if FID_Zakaz_Reserved>0

  try
    Sklad_dtMod.CommitTransact;  //подтверждаем выполнение запросов
   except
    application.MessageBox('Внимание произошла ошибка при  подтверждении ТРАНЗАКЦИИ!', 'ОШИБКА', MB_OK + MB_ICONSTOP);
   ErrFix(555,789,'Подтв транзакции',Sklad_dtMod.id_zkz);
  end;

     
                   

end;
//**************************************************************************************************************

procedure TfmPrnChek.FixOper_To_ZM;
begin

  with ibAdZapToZM do begin

     ParamByName('zk_id').asInteger:=Sklad_dtMod.id_zkz; //заказ
     ParamByName('tp_id').asInteger:=1;  //тип расчёта за наличные - 1
     ParamByName('w_id').asInteger:=Sklad_dtMod.userProfile.id_usrstrax;  //кто выполнил
     ParamByName('dtop').asDateTime:=now;
     ParamByName('to_id').asInteger:=2; //отпуск товара -2

      ParamByName('msnds').asFloat:=StrToFloat(fl_sum_all.Text); //деньги с ндс
//       ParamByName('mnds').asFloat:=(StrToFloat(fl_sum_all.Text)*0.18/1.18); //ндс
    ParamByName('mnds').asFloat:=
       Sklad_dtMod.Get_SummNDS(StrToFloat(fl_sum_all.Text),PercentNDS_ALL);
// константа PercentNDS_ALL -определена в Sklad_dtMod

      if trim(flDiscount.Text)='' then begin
      ParamByName('dscnt').asFloat:=0
      end
      else ParamByName('dscnt').asFloat:=StrToFloat(flDiscount.Text); //скидка

      if lvKlient.Selected=nil then begin
      ParamByName('prtnid').asInteger:=0 //партнер
      end
      else ParamByName('prtnid').asInteger:=StrToInt(lvKlient.Selected.SubItems[0]); //партнер

      ParamByName('pdrzdid').asInteger:=Sklad_dtMod.departmnt;
      ParamByName('IDVALUT').AsInteger:=idvalut; //id валюты
      ParamByName('KURS_CUR').asFloat:=Sklad_dtMod.StrToFloat_My(flKUE.Text); //курс

    ExecQuery;
    Close;

  end;

end;


Garincho   (2004-11-26 15:27:00) [1]

:) Да суть в том что из 5000 случаев 6 проблемных (т.е второй запрос не отрабатывает) самому мне не удаётся поймать момент неудачи, а юзеры ничего сказать не могут (в тч и записать на бумагу что там написалось в ошибке :( ). CommitTransact - лежит в отдельном модуле:

procedure TSklad_dtMod.CommitTransact;
begin
  IBTransaction1.Commit;
  CheckActivTransact;
end;

procedure TSklad_dtMod.CheckActivTransact;
begin
 if (not Sklad_dtMod.IBTransaction1.Active) then     Sklad_dtMod.IBTransaction1.Active:=true;
end;


Johnmen   (2004-11-26 15:13:00) [2]

А где запрос-то на добавление ?
И что есть CommitTransact, откуда это ?
Короче, меньше кода, больше сути :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо