![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вставка записей в БД циклом [D7, MSSQL]
Soi © (2010-01-20 05:41:00)Всем доброго времени суток. Вопрос такой: в цикле я читаю Excel -файл и с помощью запроса вставляю прочитанные строки в БД, как можно при возникновении определенного условия (например если встретилась пустая строка ) пропустить данную итерацию цикла и перейти к следующей?
Проблема в том, что запрос выдает ошибку как только в Excel-файле встречается пустая строка. Сразу скажу, что убрать эти пустые строки в excel-файле нельзя - такая специфика задачи.
Пробовал в цикле использовать команду "Continue" - не помогает.
Ниже привожу кусок кода:
procedure TForm1.Button1Click(Sender: TObject);
var
tabnomer,count:integer;
sum: string;
excel:variant;
begin
count_column_row; //Подсчет кол-ва строк и столбцов в Excel- файле
data(); //Преобразование даты в Галактиканский формат
excel:=createoleobject('excel.application');
excel.workbooks.open('c:\card.xls');
adoquery1.Active:=false;
adoquery1.SQL.Clear;
for count:=4 to rows do begin
tabnomer:=excel.workbooks[1].worksheets[1].cells[count,2];//Столбец Табельный номер
sum:=excel.workbooks[1].worksheets[1].cells[count,7];//Столбец Сумма покупки
if (length(inttostr(tabnomer))=0) and (length(sum)=0) then Continue; //Проверка на отсутствие номера карточки
adoquery1.SQL.add('insert into T$SHTRAF (F$CSCHETK, F$CSUBSCHK,F$DATAN, F$DATANSK, F$DATOK, F$FLAG3, F$NAMEPL1, F$POMETKA, F$SUMUD, F$TABN, F$VIDUD, F$PRPER)');
adoquery1.SQL.add('values ('+'51'+', '+''''+'01'+''''+', '+''''+label3.Caption+''''+', '+''''+label3.Caption+''''+', '+''''+label3.Caption+''''+', '+''''+'+'+''''+', '+''''+label4.Caption+''''+', '+''''+'+'+''''+', '+''''+sum+''''+', '+''''+inttostr(tabnomer)+''''+', '+'68'+', '+'1'+')');
adoquery1.SQL.Add('update T$SHTRAF set F$CLSCH=(select F$NREC from T$LSCHET where F$TABN='+''''+inttostr(tabnomer)+''''+'), F$TPERSON=(select F$NREC from T$PERSONS where F$TABNMB='+''''+inttostr(tabnomer)+''''+') where F$TABN='+''''+inttostr(tabnomer)+''''+' and F$SUMUD='+''''+sum+''''+' ');
adoquery1.ExecSQL;
adoquery1.SQL.Clear;
end;
excel.DisplayAlerts := False;
excel.Quit;
adoquery1.Active:=true;
end;
Anatoly Podgoretsky (2010-01-20 11:56:00) [1]> Soi (20.01.2010 05:41:00) [0]
Ты уверен, что эта конструкция if (length(inttostr(tabnomer))=0)then Continue; Отработает?
Soi (2010-01-20 10:50:00) [2]Все вопрос решился, спасибо "Вариант" за помощь, дело действительно было в операторе OR. Блин, сам бы еще долго наверное парился. :)
EvChul (2010-01-20 10:13:00) [3]а не проще ли получить доступ к Экселю через JET, а потом работать с получившимся датасетом?
Вариант (2010-01-20 07:41:00) [4]
> Soi (20.01.10 05:41)
> Пробовал в цикле использовать команду "Continue" - не помогает.
Тем не менее
if <условие работы с базой> then begin <а все внутри что надо> end;
или
if <условие пропуска итерации> then continue;
А раз тебе не помогло, то проблема в правильном условии:
1) AND или OR должен быть?
2)
> tabnomer:=excel.workbooks[1].worksheets[1].cells[count,2];
> //
А вот unassigned variant в integer преобразуется как 0 и поэтому tabnomer при пустой ячейке будет = 0 и твое условие пропуска итерации никогда не выполнится
engine (2010-01-20 07:16:00) [5]Так не вставляй, ежели "пустые"