![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всем доброго дня
Столкнулась с проблемой при добавлении записей посредством IBTable. Запускаю проект, и первый раз эти строки выполняются отлично: Код:
//запись в таблицу ITER
i := 1;
itcount := RandomRange(1, 100);
for i := 1 to itcount-1 do
BEGIN
DM.IBTable3.Append; //БЫЛА ОШИБКА "cannot focus a disabled or invisible window"
DM.IBTable3.FieldByName('IT_ID').AsInteger := 0; //ВОТ ЗДЕСЬ !!!!!!ACCESS VIOLATION и PRIVILEGED INSTRUCTION ... формируется в базе триггером, есть ID итерации
DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM; //для какого расчета..
DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0; //ФОРМИРУЕТСЯ СЕЙЧАС В БАЗЕ триггером. но возможно придется ставить здесь
DM.IBTable3.FieldByName('X1K').AsFloat := i; //координата X
DM.IBTable3.FieldByName('X2K').AsFloat := RandomRange(1, 50) ; //координата Y
DM.IBTable3.FieldByName('FK').AsFloat := RandomRange(0, 50);
DM.IBTable3.POST;
END;
//DM.IBTable3.Refresh;
НО при повторном срабатывании выдавало ошибку 'Access violation at address XXXXXXX (всегда разный). Read of address YYYYYYYY' Теперь в этом же месте ошибка 'Privileged instruction' и также при повторной работе кода. Получается, что уже команда Append не проходит.. Интересно заметить, что этот код работал уже много раз и вполне успешно, но после изменений не знаю каких таких, все стало вот так. Последний раз редактировалось Rimma Zlotnikov, 18.02.2017 в 17:28. |
|
#2
|
|||
|
|||
|
Проблема не решена. Перенесла этот код на более раннюю версию проекта и все стало работать. Что же могло повлиять, интересно
![]() |
|
#3
|
|||
|
|||
|
По внешним признакам скорее всего где-то падает обработчик события на визуальных компонентах, привязанных к этой IBTable3. Т.е. проблема не в компоненте доступа к данным, а где-то в визуальной части.
Для решения, например, можно временно "отключать" DataSource, делать вставку, потом обратно "подключать" (там есть методы DisableControls и EnableControls). Кстати, при подключенных визуальных компонентах это еще и работы убыстрит, т.к. не будет обновлять отображение. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Rimma Zlotnikov (19.02.2017)
| ||
|
#4
|
|||
|
|||
|
Цитата:
Код:
Form1.DBGrid1.DataSource.DataSet.DisableControls; //попытка исправить Access Violation
//запись в таблицу ITER
i := 1;
itcount := RandomRange(1, 100);
for i := 1 to itcount-1 do
BEGIN
DM.IBTable3.Append; //БЫЛА ОШИБКА "cannot focus a disabled or invisible window"
DM.IBTable3.FieldByName('IT_ID').AsInteger := 0; //ACCESS VIOLATION ... формируется в базе триггером
DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM; //для какого расчета..
DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0; //ФОРМИРУЕТСЯ СЕЙЧАС В БАЗЕ триггером. но возможно придется ставить здесь
DM.IBTable3.FieldByName('X1K').AsFloat := i; //координата X
DM.IBTable3.FieldByName('X2K').AsFloat := RandomRange(1, 50) ; //координата Y
DM.IBTable3.FieldByName('FK').AsFloat := RandomRange(0, 50);
DM.IBTable3.POST;
END;
DM.IBTable3.Refresh;
Form1.DBGrid1.DataSource.DataSet.EnableControls; //попытка исправить Access ViolationНО все осталось прежним |
|
#5
|
||||
|
||||
|
Цитата:
|
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Rimma Zlotnikov (19.02.2017)
| ||
|
#6
|
|||
|
|||
|
Цитата:
Больше ничегошеньки не делается c Append. В целом есть класс, через объект которого вызывается процедура: Код:
Temp.Method(k1,k2, k3, k4, alpha, betha, X1, X2, dX, E, calcnum, CType); Код:
procedure TOptimization.Method(k1: integer; k2: integer; k3: integer; k4: integer; alpha: real; betha: real; X1: real; X2: real; dX: real; E: real;
calcnum: Integer; CType: integer);
var itcount, i : integer;
BEGIN
Form1.DBGrid1.DataSource.DataSet.DisableControls; //попытка исправить Access Violation
//запись в таблицу ITER
i := 1;
itcount := RandomRange(1, 100);
for i := 1 to itcount-1 do
BEGIN
DM.IBTable3.Append; //БЫЛА ОШИБКА "cannot focus a disabled or invisible window"
DM.IBTable3.FieldByName('IT_ID').AsInteger := 0; //ACCESS VIOLATION ... формируется в базе триггером
DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM; //для какого расчета..
DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0; //ФОРМИРУЕТСЯ СЕЙЧАС В БАЗЕ триггером. но возможно придется ставить здесь
DM.IBTable3.FieldByName('X1K').AsFloat := i; //координата X
DM.IBTable3.FieldByName('X2K').AsFloat := RandomRange(1, 50) ; //координата Y
DM.IBTable3.FieldByName('FK').AsFloat := RandomRange(0, 50);
DM.IBTable3.POST;
END;
DM.IBTable3.Refresh;
Form1.DBGrid1.DataSource.DataSet.EnableControls; //попытка исправить Access Violation
END; |
|
#7
|
|||
|
|||
|
В общем, более раннюю версию также запорола. Причем я делала вещи, совершенно не связанные с проблемным IBTable3. Пару раз в этом месте вместо "Access violation" появлялось "External exception"
|
|
#8
|
|||
|
|||
|
Приношу свои извинения за не совсем полный код. Вот вся процедура:
Код:
procedure TOptimization.Method(k1: integer; k2: integer; k3: integer; k4: integer; alpha: real; betha: real; X1: real; X2: real; dX: real; E: real;
calcnum: Integer; CType: integer);
var itcount, i : integer;
BEGIN
Form1.DBGrid1.DataSource.DataSet.DisableControls; //попытка исправить Access Violation
//запись в таблицу ITER
i := 1;
itcount := RandomRange(1, 100);
for i := 1 to itcount-1 do
BEGIN
DM.IBTable3.Append; //БЫЛА ОШИБКА "cannot focus a disabled or invisible window"
DM.IBTable3.FieldByName('IT_ID').AsInteger := 0; //ACCESS VIOLATION ... формируется в базе триггером
DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM; //для какого расчета..
DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0; //ФОРМИРУЕТСЯ СЕЙЧАС В БАЗЕ триггером. но возможно придется ставить здесь
DM.IBTable3.FieldByName('X1K').AsFloat := i; //координата X
DM.IBTable3.FieldByName('X2K').AsFloat := RandomRange(1, 50) ; //координата Y
DM.IBTable3.FieldByName('FK').AsFloat := RandomRange(0, 50);
DM.IBTable3.POST;
END;
DM.IBTable3.Refresh;
Form1.DBGrid1.DataSource.DataSet.EnableControls; //попытка исправить Access Violation
//дозаполнение полей в таблице CALC - step, criterion, x1optim, x2optim, foptim
with DM.IBQuery2 do
BEGIN
Close;
SQL.Clear;
SQL.Add('update calc set step = :step, criterion = :criterion,');
SQL.Add(' x1optim = :x1optim, x2optim = :x2optim, foptim = :foptim ');
SQL.Add('where calcnum = :calcnum');
Params.ParamByName('calcnum').Value := CALCNUM;
Params.ParamByName('step').Value := (itcount/2.0) -1;
Params.ParamByName('criterion').Value := 1.8;
Params.ParamByName('x1optim').Value := 21; //брать последнюю итерацию из базы..
Params.ParamByName('x2optim').Value := 21; //брать последнюю итерацию из базы..
Params.ParamByName('foptim').Value := 0.11 ; //брать последнюю итерацию из базы..
ExecSQL;
END;
DM.IBTable1.Refresh;
END;HEPL!!!!! Неужели придется разбивать на две разные процедуры. Но это, чуется мне, бред полный |
|
#9
|
||||
|
||||
|
Можно было бы посоветовать для блока with DM.IBQuery2 do подготовить запрос предварительным разбором и оптимизацией типа
Код:
... Close; if not Prepared then Prepare; ... Код:
try ExecSQL; except on e: EDataBaseError do MessageDlg(e.Message, mtError, [mbOK], 0); end; |
|
#10
|
|||
|
|||
|
Цитата:
я сделала по совету: Код:
with DM.IBQuery2 do
BEGIN
Close;
SQL.Clear;
SQL.Add('update calc set step = :step, criterion = :criterion,');
SQL.Add(' x1optim = :x1optim, x2optim = :x2optim, foptim = :foptim ');
SQL.Add('where calcnum = :calcnum');
Params.ParamByName('calcnum').Value := CALCNUM;
Params.ParamByName('step').Value := (itcount/2.0) -1;
Params.ParamByName('criterion').Value := 1.8;
Params.ParamByName('x1optim').Value := 21; //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû..
Params.ParamByName('x2optim').Value := 21; //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû..
Params.ParamByName('foptim').Value := 0.11 ; //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû..
//ExecSQL;
try
** ExecSQL; //!!!!!!!!!!!!!!!!!!! illegal character in input file: ' ' ($A0)
* except
* **on e: EDataBaseError do* MessageDlg(e.Message, mtError, [mbOK], 0);
*end; |
|
#11
|
|||
|
|||
|
ввела блок TRY ручками и ошибки не стало. Но сам блок ничего не дал:
Код:
procedure TOptimization.Method(k1: integer; k2: integer; k3: integer; k4: integer; alpha: real; betha: real; X1: real; X2: real; dX: real; E: real;
calcnum: Integer; CType: integer);
var itcount, i : integer;
BEGIN
Form1.DBGrid1.DataSource.DataSet.DisableControls; //ïîïûòêà èñïðàâèòü Access Violation
//çàïèñü â òàáëèöó ITER
i := 1;
itcount := RandomRange(1, 100);
for i := 1 to itcount-1 do
BEGIN
DM.IBTable3.Append; //ÁÛËÀ ÎØÈÁÊÀ "cannot focus a disabled or invisible window"
DM.IBTable3.FieldByName('IT_ID').AsInteger := 0; //ACCESS VIOLATION ... ôîðìèðóåòñÿ â áàçå òðèããåðîì
DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM; //äëÿ êàêîãî ðàñ÷åòà..
DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0; //ÔÎÐÌÈÐÓÅÒÑß ÑÅÉ×ÀÑ Â ÁÀÇÅ òðèããåðîì. íî âîçìîæíî ïðèäåòñÿ ñòàâèòü çäåñü
DM.IBTable3.FieldByName('X1K').AsFloat := 1; //êîîðäèíàòà X
DM.IBTable3.FieldByName('X2K').AsFloat := 1; //RandomRange(1, 50) ; //êîîðäèíàòà Y
DM.IBTable3.FieldByName('FK').AsFloat := 1; //RandomRange(0, 50);
//DM.IBTable3.POST;
try
DM.IBTable3.POST;
except
on e: EdataBaseError do MessageDlg(e.Message, mtError, [mbOK], 0);
end;
END;
DM.IBTable3.Refresh;
Form1.DBGrid1.DataSource.DataSet.EnableControls; //ïîïûòêà èñïðàâèòü Access Violation
//äîçàïîëíåíèå ïîëåé â òàáëèöå CALC - step, criterion, x1optim, x2optim, foptim
with DM.IBQuery2 do
BEGIN
Close;
SQL.Clear;
SQL.Add('update calc set step = :step, criterion = :criterion,');
SQL.Add(' x1optim = :x1optim, x2optim = :x2optim, foptim = :foptim ');
SQL.Add('where calcnum = :calcnum');
Params.ParamByName('calcnum').Value := CALCNUM;
Params.ParamByName('step').Value := (itcount/2.0) -1;
Params.ParamByName('criterion').Value := 1.8;
Params.ParamByName('x1optim').Value := 21; //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû..
Params.ParamByName('x2optim').Value := 21; //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû..
Params.ParamByName('foptim').Value := 0.11 ; //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû..
//ExecSQL;
try
ExecSQL;
except
on e: EdataBaseError do MessageDlg(e.Message, mtError, [mbOK], 0);
end;
END;
DM.IBTable1.Refresh;
END; |
|
#12
|
||||
|
||||
|
Цитата:
Можете показать какие и где вылазят ошибки при выполнении запроса, и я бы на время отключил блок относящийся к выполнению IBTable3.Append, будет проще |
|
#13
|
|||
|
|||
|
Цитата:
|
|
#14
|
|||
|
|||
|
Цитата:
|
|
#15
|
||||
|
||||
|
Изначально
Цитата:
|