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

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

Вставка записей в БД циклом [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]

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


Наверх

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