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

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

Как отловить ошибку при добавлени в БД методом Post [D6, dBase, FoxPro]


Lixodei ©   (2006-11-27 09:06:00) 

Привет Всем! Выбираю данные из одной БД и пытаюсь их добавить в другую медом Post. Иногда прога почему то вылетает сообщая о следующей ошибке "Access to table disabled because of previous error. Read failure". А мне никак нельзя, чтобы программа вылетала, можно ли отловить ошибку на этапе добавления и просто не добавлять эту запись? Спасибо, за помощь!


Lixodei   (2006-11-29 14:44:00) [1]


> NSERT INTO
> вместо работы с TTable. Ибо отлуп по TQuery.Execute не должен
> привести к таким последствиям, как ' "Access to table disabled
> because of previous error. Read failure"'

Приводит к той же ошибке, что и была при работе с TTable

while not AdsQuery1.Eof do
begin
 Table1.Active:=false;
 Query1.Active:=False;
 Query1.FetchAll;
 Query1.DatabaseName:=''+Unit1.Work_dir+'\DATA';
 Query1.SQL.Clear;
 Query1.SQL.Add('INSERT INTO otchet (KOD,PNAME,TYPE_DOC,NUMDOC,DATDOC,DSUM,T_DOC) VALUES (');
 Query1.SQL.Add(':D,:P,:E,:N,:D1,:S,:T)');
 Query1.ParamByName('D').AsFloat:=AdsQuery1.FieldByName('DANAL1').AsFloat;
 Query1.ParamByName('P').AsString:=Trim(AdsQuery1.FieldByName('PNAME').AsString);
 Query1.ParamByName('E').AsString:=AdsQuery1.FieldByName('EXPR').AsString;
 Query1.ParamByName('N').AsString:=Trim(AdsQuery1.FieldByName('NUMDOC').AsString) ;
 Query1.ParamByName('D1').AsDateTime:=AdsQuery1.FieldByName('DATDOC').AsDateTime;
 Query1.ParamByName('S').AsFloat:=AdsQuery1.FieldByName('SUM').AsFloat;
 Query1.ParamByName('T').AsFloat:=2;
 Query1.ExecSQL;
 AdsQuery1.Next;
end;


Lixodei   (2006-11-29 13:45:00) [2]


> Афигеть - дурдом....

Точно дурдом, это я просто криво поправил, уже путаюсь блин в строках, извините.
 Query1.SQL.Add('INSERT INTO simple (KOD) VALUES (:D)');
 Query1.ParamByName('D').AsInteger:=AdsQuery1.FieldByName('DANAL1').AsInteger;


Плохиш   (2006-11-29 13:40:00) [3]


> Lixodei ©   (29.11.06 11:59) [10]


> Query1.ParamByName('D'). AsInteger:=AdsQuery1.FieldByName('KOD'). AsString;

Афигеть - дурдом....


Lixodei   (2006-11-29 13:18:00) [4]

Постараюсь понятнее. Есть таблица из нее происходит выборка данных по нескольким полям на SQL и записываться в ADSQuery1. Среди них есть несколько  полей с типом numeric. Теперь эти данные надо записать в другую таблицу otchet. Это я пытаюсь сделать кодом[пример приведен в [10]] на этапе выполнения которого вылетает ошибка не совместимость типов.


Anatoly Podgoretsky   (2006-11-29 13:10:00) [5]

Еще большими загадками стал говорить.
Кто на чем стоял?


Lixodei   (2006-11-29 12:53:00) [6]

Query1.ParamByName('D').As... нужен другой тип, при присвоении все проходит нормально, ошибка когда выполняется. Если поменять тип поля KOD в самой БД, то все отлично


Anatoly Podgoretsky   (2006-11-29 12:15:00) [7]

> Lixodei  (29.11.2006 11:59:10)  [10]

На левую или правую часть?
Что сообзает компонент о типах в рантайм


Lixodei   (2006-11-29 11:59:00) [8]


> MsGuns ©   (27.11.06 16:47) [9]
, да действительно можно сделать запросом, но вот при запросе SQL возникает проблема при передаче параметра. Поле KOD имеет тип numeric(5,0), а в Delphi такого типа нет. Аналогичный ему должен быть Integer, но  SQL ругаеться на несовместимость. Может другой надо использовать тип?
 
Query1.SQL.Add('INSERT INTO otchet (KOD) VALUES (:D)');
Query1.ParamByName('D').AsInteger:=AdsQuery1.FieldByName('KOD').AsString;


MsGuns   (2006-11-27 16:47:00) [9]

Судя по [2] данные из одной таблицы (запроса) добавляются в другую. Почему нельзя это сделать запросом ?


Lixodei   (2006-11-27 13:09:00) [10]


> Это Вы сейчас на каком языке говорили?

На русском, а что не видно? БД из которой выбираю данные формирует другая прога, ей и перезаполняю, ошибка в уже в другой записи.

> Классная такая чушь...

А разве квейри - это не набор данных оформленный в виде виртуальной таблицы
Поэтому я думаю, что не чушь я писал


Anatoly Podgoretsky   (2006-11-27 12:23:00) [11]

> Lixodei  (27.11.2006 09:06:00)  [0]

because of previouserror.


Плохиш   (2006-11-27 12:14:00) [12]


> так как когда я переформировываю БД по данному полю ошибка
> переходит уже на другой записи

Это Вы сейчас на каком языке говорили?

>   except
      Cancel;
>    Form1.Edit1.Text:='Ошибка '+AdsQuery1.FieldByName('DANAL1').
> AsString+' '+AdsQuery1.FieldByName('PNAME').AsString+'

и запись будет пропущена.

> Просто его все равно надо будет переписывать рано или поздно
> в тэйбл, так как инфа потом нужна в физическом сохранении.

Классная такая чушь...


ЮЮ   (2006-11-27 10:42:00) [13]


> не в table, а   кверик? Просто его все равно надо будет
> переписывать рано или поздно в тэйбл,


Имелось в виду исполнять запросы
INSERT INTO
вместо работы с TTable. Ибо отлуп по TQuery.Execute не должен привести к таким последствиям, как ' "Access to table disabled because of previous error. Read failure"'


Lixodei   (2006-11-27 10:35:00) [14]

C уникальностью и заполненностью все в порядке, тут быть не может собаки ;] Разрядность полей тоже совпадает. А вы предлагаете писать данные не в table, а   кверик? Просто его все равно надо будет переписывать рано или поздно в тэйбл, так как инфа потом нужна в физическом сохранении. Начальный вопрос был в том, что разве нет больше инструмента кроме try чтобы ошибку отловить, например, как при проверке значения переменной при открытии файла или загрузке dll-ки?


Sergey13   (2006-11-27 10:17:00) [15]

Я с dbf-ками со времен клиппера не работал. Как там насчет требований уникальности и/или заполненности? Может тут собака порылась? И почему бы не попробовать писать новые записи так-же через кверик запросом?


Lixodei   (2006-11-27 10:03:00) [16]

try не помогает, вылетает с той же ошибкой или может я не правильно делаю что. Через дебагер проверил данные на запись они соответствуют, тем которые нужны. Может есть с ними еще какой-то мусор, который я не вижу?, так как когда я переформировываю БД по данному полю ошибка переходит уже на другой записи

while not AdsQuery1.Eof do
begin
 with Table1 do
 begin
  Append;
  FieldByName('KOD').AsInteger:=AdsQuery1.FieldByName('DANAL1').AsInteger;
  FieldByName('PNAME').AsString:=AdsQuery1.FieldByName('PNAME').AsString;
  FieldByName('TYPE_DOC').AsString:=AdsQuery1.FieldByName('EXPR').AsString;
  FieldByName('NUMDOC').AsString:=AdsQuery1.FieldByName('NUMDOC').AsString;
  FieldByName('DATDOC').AsString:=AdsQuery1.FieldByName('DATDOC').AsString;
  FieldByName('DSUM').AsFloat:=AdsQuery1.FieldByName('SUM').AsFloat;
  FieldByName('T_DOC').AsInteger:=2;
  try
   Post;
  except
   Form1.Edit1.Text:='Ошибка '+AdsQuery1.FieldByName('DANAL1').AsString+' '+AdsQuery1.FieldByName('PNAME').AsString+' '+AdsQuery1.FieldByName('EXPR').AsString+' '+AdsQuery1.FieldByName('NUMDOC').AsString+' '+AdsQuery1.FieldByName('DATDOC').AsString+' '+AdsQuery1.FieldByName('SUM').AsString;
   sleep(1000);
  end;
 end;
 AdsQuery1.Next;
end;


Sergey13   (2006-11-27 09:22:00) [17]

Вообще ошибки ловятся через try. Проверить то что будет записано можно в BeforePost принимающего датасета.


Наверх

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