Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

Ошибка при IBTransaction.Commit - "List index out of bounds (8)"   Найти похожие ветки 

 
Slonco   (2004-09-16 10:55) [0]

Помогите, пожалуйста.
Вставляю запись в таблицу и пытаюсь сделать Commit.
Вроде элементарщина, а не получается ничего. Причем есть исходники аналогичного приложения, где то же самое, та же самая таблица формируется без проблем! Не пойму что не так.

      Может вы уже сталкивались с этой проблемой?

Подробнее:
---------------------------
Debugger Exception Notification
---------------------------
Project ANALYSIS.exe raised exception class EStringListError with message "List index out of bounds (8)". Process stopped. Use Step or Run to continue.
---------------------------
OK   Help  
---------------------------

Проверку на InTransaction делаю. StartTransaction сделал.
Спасибо.


 
Рамиль ©   (2004-09-16 11:04) [1]

Ошибка в семнадцатой строке.


 
Slonco   (2004-09-16 11:06) [2]

Почему в 17-ой? SQL запрос у меня в одну строку!
Или мастера так шутить изволят?


 
Slonco   (2004-09-16 11:15) [3]

Я использую пару десятков параметров. Проверял 8-ой параметр - все в норме :(


 
Рамиль ©   (2004-09-16 11:15) [4]

Ты хочешь сказать, что у тебя код такого типа
 IBTransaction.StartTransaction;
 IBSQL.SQL.Text := "insert into ...";
 IBSQL.ExecQuery;
 IBTransaction.Commit;

и он выдает ошибку?..


 
Slonco   (2004-09-16 11:20) [5]

Да, именно так. На Commit выдает указанную в самом начале ошибку.


 
Sergey13 ©   (2004-09-16 11:21) [6]

Что то сомниетльно мне что комит такие ошибки дает.


 
Sergey13 ©   (2004-09-16 11:23) [7]

А цикла там никакого нет?


 
Slonco   (2004-09-16 11:30) [8]

Нет, циклов нет.
Я ж говорю - почти один в один скопировал уже написанный мной ранее блок.
Может у IBDatabase или IBTransaction имеют критичные по настройке свойства? Я все оставил по дефолту (кроме параметров подключения: пароль, имя пользователя, чапсет)


 
Рамиль ©   (2004-09-16 11:31) [9]

Slonco   (16.09.04 11:20) [5]
Давай код. от StartTransaction до Commit
Почему вытягивать надо клещами?


 
Slonco   (2004-09-16 11:38) [10]

:) клещами не надо! Я сам все скажу!!! :D

   with IBQuery do begin
     ContinueTrans;
     SQL.Clear;
     SQL.Add("INSERT INTO ANALYTIC (ID, ROUTDATE, ROUTE, SHEDULE, SHIFT, MIF, GN, "
      + "ATP, SSPCORR, SSP, FACT, REGUL, PLAN_OUT, FACT_OUT, PLAN_IN, FACT_IN, "
      + "STOP1, STOP2, STATUS, WORK_BEGIN, WBP_TIME, WBP_ROUTES, WBF_TIME, "
      + "WBF_ROUTES, WB_SS, IS1X_MIN, IS1X_MAX, IS1M_MIN, IS1M_MAX, IS1A20_MIN, "
      + "IS1A20_MAX, IS2X_MIN, IS2X_MAX, IS2M_MIN, IS2M_MAX, IS2A20_MIN, IS2A20_MAX, "
      + "WORK_BREAK, WFBX_BTM, WFBX_TOP, WFBM_BTM, WFBM_TOP, WFBA20_BTM, WFBA20_TOP, "
      + "WFSX_BTM, WFSX_TOP, WFSM_BTM, WFSM_TOP, WFSA20_BTM, WFSA20_TOP, ROUTES_FACT, "
      + "DISROUTMENT, WORK_END, WEP_TIME, WEP_ROUTES, WEF_TIME, WEF_ROUTES, WE_SS) "
      + "VALUES (:ID, :ROUTDATE, :ROUTE, :SHEDULE, :SHIFT, :MIF, :GN, "
      + ":ATP, :SSPCORR, :SSP, :FACT, :REGUL, :PLAN_OUT, :FACT_OUT, :PLAN_IN, :FACT_IN, "
      + ":STOP1, :STOP2, :STATUS, :WORK_BEGIN, :WBP_TIME, :WBP_ROUTES, :WBF_TIME, "
      + ":WBF_ROUTES, :WB_SS, :IS1X_MIN, :IS1X_MAX, :IS1M_MIN, :IS1M_MAX, :IS1A20_MIN, "
      + ":IS1A20_MAX, :IS2X_MIN, :IS2X_MAX, :IS2M_MIN, :IS2M_MAX, :IS2A20_MIN, :IS2A20_MAX, "
      + ":WORK_BREAK, :WFBX_BTM, :WFBX_TOP, :WFBM_BTM, :WFBM_TOP, :WFBA20_BTM, :WFBA20_TOP, "
      + ":WFSX_BTM, :WFSX_TOP, :WFSM_BTM, :WFSM_TOP, :WFSA20_BTM, :WFSA20_TOP, :ROUTES_FACT, "
      + ":DISROUTMENT, :WORK_END, :WEP_TIME, :WEP_ROUTES, :WEF_TIME, :WEF_ROUTES, :WE_SS)");
     ParamByName("ID").AsInteger         := 10000;
     ParamByName("ROUTDATE").AsString    := Copy(M[3],6,255);
     ParamByName("ROUTE").AsInteger      := StrToInt(Copy(M[2],4,255));
     ParamByName("SHEDULE").AsInteger    := StrToInt(Copy(M[6],4,255));
     ParamByName("SHIFT").AsString       := Copy(M[8],4,255);
     ParamByName("MIF").AsInteger        := StrToInt(Copy(M[0],4,255));
     ParamByName("GN").AsString          := Copy(M[1],4,255);
     ParamByName("ATP").AsInteger        := IBQallrep.FieldByName("ATP").AsInteger;
     ParamByName("SSPCORR").AsInteger    := cor;
     ParamByName("SSP").AsInteger        := pln;
     ParamByName("FACT").AsInteger       := fct;
     ParamByName("REGUL").AsInteger      := IBQallrep.Fields[19].AsInteger;
     ParamByName("PLAN_OUT").AsString    := Copy(FullTimeAsStr(StrToInt(Copy(M[9],4,255))),1,5);
     ParamByName("FACT_OUT").AsString    := Copy(FullTimeAsStr(StrToInt(Copy(M[11],4,255))),1,5);
     ParamByName("PLAN_IN").AsString     := Copy(FullTimeAsStr(StrToInt(Copy(M[10],4,255))),1,5);
     ParamByName("FACT_IN").AsString     := Copy(FullTimeAsStr(StrToInt(Copy(M[12],4,255))),1,5);
     ParamByName("STOP1").AsInteger      := StrToInt(Copy(M[16],4,3)); s:=StrToInt(Copy(M[15],5,255));
     ParamByName("STOP2").AsInteger      := StrToInt(Copy(M[16+s],Pos("=",M[16+s])+1,3));
     ParamByName("STATUS").AsString      :="";
     ParamByName("WORK_BEGIN").AsString  :="";
     ParamByName("WBP_TIME").AsString    :="";
     ParamByName("WBP_ROUTES").AsInteger :=0;
     ParamByName("WBF_TIME").AsString    :="";
     ParamByName("WBF_ROUTES").AsInteger :=0;
     ParamByName("WB_SS").AsString       :="";
     ParamByName("IS1X_MIN").AsString    :="";
     ParamByName("IS1X_MAX").AsString    :="";
     ParamByName("IS1M_MIN").AsString    :="";
     ParamByName("IS1M_MAX").AsString    :="";
     ParamByName("IS1A20_MIN").AsString  :="";
     ParamByName("IS1A20_MAX").AsString  :="";
     ParamByName("IS2X_MIN").AsString    :="";
     ParamByName("IS2X_MAX").AsString    :="";
     ParamByName("IS2M_MIN").AsString    :="";
     ParamByName("IS2M_MAX").AsString    :="";
     ParamByName("IS2A20_MIN").AsString  :="";
     ParamByName("IS2A20_MAX").AsString  :="";
     ParamByName("WORK_BREAK").AsInteger :=0;
     ParamByName("WFBX_BTM").AsString    :="";
     ParamByName("WFBX_TOP").AsString    :="";
     ParamByName("WFBM_BTM").AsString    :="";
     ParamByName("WFBM_TOP").AsString    :="";
     ParamByName("WFBA20_BTM").AsString  :="";
     ParamByName("WFBA20_TOP").AsString  :="";
     ParamByName("WFSX_BTM").AsString    :="";
     ParamByName("WFSX_TOP").AsString    :="";
     ParamByName("WFSM_BTM").AsString    :="";
     ParamByName("WFSM_TOP").AsString    :="";
     ParamByName("WFSA20_BTM").AsString  :="";
     ParamByName("WFSA20_TOP").AsString  :="";
     ParamByName("ROUTES_FACT").AsString :="";
     ParamByName("DISROUTMENT").AsString :="";
     ParamByName("WORK_END").AsString    :="";
     ParamByName("WEP_TIME").AsString    :="";
     ParamByName("WEP_ROUTES").AsInteger :=0;
     ParamByName("WEF_TIME").AsString    :="";
     ParamByName("WEF_ROUTES").AsInteger :=0;
     ParamByName("WE_SS").AsString       :="";
     ExecSQL;
     CommitTrans;
   end;
   M.Free;
 end;
end;

procedure TAMainForm.ContinueTrans;
begin
 with IBTransaction do begin
 if not InTransaction then
   StartTransAction;
 end;
end;

procedure TAMainForm.CommitTrans;
begin
 with IBTransaction do begin
 if not InTransaction then Exit;
 try
   Commit;
 except
   Rollback;
 end;
 end;
end;


 
Марк   (2004-09-16 11:59) [11]

Судя по классу ошибки (EStringListError) исключение происходит не при выполнении запроса, а при создании текста SQL в компоненте IBQuery. Может есть смысл создать запрос статически, а не в кодах. Например, через построитель (IBExpret позволяет строить любые типы запросов простым перетаскиванием таблицы на поле SQL редактора). Там же можно сформировать аналогичную хранимую процедуру и проверить ее работу в режиме пошаговой отладки с конкретными параметрами.


 
Sergey13 ©   (2004-09-16 12:05) [12]

С массивом разберись ИМХО. Или что там у тебя такое M[16+s]


 
Slonco   (2004-09-16 12:11) [13]

За него я и переживаю - за M (это TStringList).
Дело  том, что когда я не ставлю коммит, то запись заносится в таблицу!!! Странности...

Боюсь, что придется отказаться от параметров ради проверки...


 
Sergey13 ©   (2004-09-16 12:19) [14]

2[13] Slonco   (16.09.04 12:11)
>Боюсь, что придется отказаться от параметров ради проверки...

Можно и просто в отладчике посмотреть значения. Можно просто по очереди отключать параметры (и поле соответственное), пока ошибка не уйдет.


 
Slonco   (2004-09-16 12:24) [15]

А как смотреть в дебаггере значения параметров? Через очки? Или есть хитрый способ о котором я не знаю?


 
Sergey13 ©   (2004-09-16 12:27) [16]

Например через присваивание такого же значения "левой" переменной.


 
Danilka ©   (2004-09-16 12:28) [17]

поставь точку останова вот-сюда:
ParamByName("STOP2").AsInteger      := StrToInt(Copy(M[16+s],Pos("=",M[16+s])+1,3));
и посмотри чему у тебя равен s, а также количество строк в M, скорее всего, оно будет меньше чем 16+s.


 
Johnmen ©   (2004-09-16 12:32) [18]

Пара замечаний.
1. Зачем параметры в динамически изменяемом запросе ? Смысл ?
2. Стартовать тр-ию перед ExecSQL.

И, как сказали выше, ошибка в индексе стринглиста. Однозначно !


 
Sergey13 ©   (2004-09-16 12:35) [19]

2[18] Johnmen ©   (16.09.04 12:32)
>1. Зачем параметры в динамически изменяемом запросе ? Смысл ?
Что бы самому потом прочитать то что написал. Иначе башку сломаешь. 8-)


 
Johnmen ©   (2004-09-16 12:40) [20]

>Sergey13 ©   (16.09.04 12:35) [19]

Ну разве что...:)
Тогда не помешает после формирования текста сделать Prepare.


 
Slonco   (2004-09-16 15:07) [21]

В списке строк М около 500 строк и s=12, так что 12+16 никак не превысят 500.
Значения все проверил - за пределы НИ ОДНО из них не вышло!

Что делать - ума не приложу :"(


 
Slonco   (2004-09-16 15:13) [22]

И еще. Во время формирования ошибки не может быть - т.к. ExecSQL прогоняется без ошибки - ошибка только после Commit!


 
Sergey13 ©   (2004-09-16 15:14) [23]

2[21] Slonco   (16.09.04 15:07)
По очереди давай значение параметру напрямую в коде корректным значением. типа
ParamByName("STOP2").AsInteger      := 12;
Поймешь где ошибка. А она где то здесь. ИМХО


 
Slonco   (2004-09-16 15:16) [24]

Ладно, попробую...


 
Slonco   (2004-09-16 15:21) [25]

Попробовал все - без толку.


 
Sergey13 ©   (2004-09-16 15:29) [26]

Все строки пробовал?


 
Slonco   (2004-09-16 15:38) [27]

Все до единой!!!


 
Sergey13 ©   (2004-09-16 15:42) [28]

>IBQallrep.Fields[19].AsInteger;
А с этим все нормально? Есть стока?


 
Slonco   (2004-09-16 15:50) [29]

>>IBQallrep.Fields[19].AsInteger;
>А с этим все нормально? Есть стока?

Этот я подправил - ничего не дало...
Я понял в чем дело - у меня там рекурсия вышла :)
Прошу простить за потраченное впустую время :(

Всем СПАСИБО!


 
Рамиль ©   (2004-09-16 16:17) [30]

А ведь спрашивали насчет циклов!:)


 
Slonco   (2004-09-16 16:26) [31]

Да то не цикл был!
Я просто вызов этой процедуры повесил на OnChange компонента DBMemo. Вышло так, что эта процедура 2 раза вызывалась... или как-то там еще, по хитрому...  %)


 
Рамиль ©   (2004-09-16 16:35) [32]

Slonco   (16.09.04 16:26) [31]
повесил на OnChange компонента DBMemo

:o)


 
Slonco   (2004-09-16 16:39) [33]

%) ...надо меньше пить... :*)



Страницы: 1 вся ветка

Текущий архив: 2004.10.17;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.035 c
14-1096277529
panov
2004-09-27 13:32
2004.10.17
Безопасность ICQ.


8-1090726952
Canvas
2004-07-25 07:42
2004.10.17
Создать вот так канвас


1-1096464111
Iconka
2004-09-29 17:21
2004.10.17
Зачем такое объявление класса?


14-1096355591
Igorek
2004-09-28 11:13
2004.10.17
Всем опросам опрос


14-1095958723
Безымянный
2004-09-23 20:58
2004.10.17
Нужна помощь с ноутбуком.