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

Вниз

Вставка записей в БД циклом   Найти похожие ветки 

 
Soi   (2010-01-20 05:41) [0]

Всем доброго времени суток. Вопрос такой: в цикле я читаю 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;


 
engine ©   (2010-01-20 07:16) [1]

Так не вставляй, ежели "пустые"


 
Вариант   (2010-01-20 07:41) [2]


> 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 и твое условие пропуска итерации никогда не выполнится


 
EvChul ©   (2010-01-20 10:13) [3]

а не проще ли получить доступ к Экселю через JET, а потом работать с получившимся датасетом?


 
Soi   (2010-01-20 10:50) [4]

Все вопрос решился, спасибо "Вариант" за помощь, дело действительно было в операторе OR.  Блин, сам бы еще долго наверное парился. :)


 
Anatoly Podgoretsky ©   (2010-01-20 11:56) [5]

> Soi  (20.01.2010 05:41:00)  [0]

Ты уверен, что эта конструкция if (length(inttostr(tabnomer))=0)then Continue; Отработает?



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

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

Наверх




Память: 0.48 MB
Время: 0.009 c
2-1263977765
Неважно
2010-01-20 11:56
2010.03.21
CriticalSection


4-1230237557
demon
2008-12-25 23:39
2010.03.21
Всплывающая подсказка


2-1263994251
webpauk
2010-01-20 16:30
2010.03.21
Обращение к свойствам TForm по его Handle


1-1240936541
Igor2010
2009-04-28 20:35
2010.03.21
JavaScript+IHTMLWindows2


2-1263838589
mpdasa
2010-01-18 21:16
2010.03.21
как написать: если A>2 и А<5 тогда