Конференция "Начинающим" » Вставка записей в БД циклом [D7, MSSQL]
 
  • Soi (20.01.10 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 © (20.01.10 07:16) [1]
    Так не вставляй, ежели "пустые"
  • Вариант (20.01.10 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 © (20.01.10 10:13) [3]
    а не проще ли получить доступ к Экселю через JET, а потом работать с получившимся датасетом?
  • Soi (20.01.10 10:50) [4]
    Все вопрос решился, спасибо "Вариант" за помощь, дело действительно было в операторе OR.  Блин, сам бы еще долго наверное парился. :)
  • Anatoly Podgoretsky © (20.01.10 11:56) [5]
    > Soi  (20.01.2010 05:41:00)  [0]

    Ты уверен, что эта конструкция if (length(inttostr(tabnomer))=0)then Continue; Отработает?
 
Конференция "Начинающим" » Вставка записей в БД циклом [D7, MSSQL]
Есть новые Нет новых   [134435   +34][b:0][p:0.002]