Разработка технологии создания дистанционных курсов на примере курса "Администрирование DB2", страница 51

  pos:=i;

 end;

 fieldsExpected:=0;

 colscntr:=0;

 if ClientDataSet1.FieldByName('ISWHERE').AsInteger = 1 then begin

  for i:=1 to 4 do begin

   if ClientDataSet1.FieldByName('WHERE'+IntTostr(i)).IsNull then break

   else begin

    whr[fieldsExpected+1]:=ClientDataSet1.FieldByName('WHERE'+IntTostr(i)).AsString;

    for j:=1 to length(whr[fieldsExpected+1]) do if whr[fieldsExpected+1][j]='^' then

     whr[fieldsExpected+1][j]:=#39;

   end;

   Inc(fieldsExpected);

  end;

  buf:='';

  i:=sqltextpos;

//поля в WHERE

 if i>pos-2 then begin

     Memo1.Text:='Ошибка'#13#10'В операторе where ожидалось условие.';

     result:=-1;

     exit;

  end;

  while i<=pos-2 do begin

   inc(i);

   j:=0;

   if istokpresent(' AND ',i) then j:=1;

   if istokpresent(' OR ',i) then j:=2;

   if (j=1) or (j=2) then begin

    if j<>ClientDataSet1.FieldByName('w'+IntToStr(colscntr+1)).AsInteger then begin

     Memo1.Text:='Ошибка'#13#10'В запросе указано неправильное логическое условие.';

     result:=-1;

     exit;

    end;

    if colscntr>3 then begin

     Memo1.Text:='Ошибка'#13#10'В запросе указаны лишние условия.';

     result:=-1;

     exit;

    end;

    if j=1 then inc(i,4);

    if j=2 then inc(i,3);

    if sqltext[i]=' ' then inc(i);

    inc(colscntr);

    if buf[length(buf)]=' ' then SetLength(buf, length(buf)-1);

    cols[colscntr]:=buf;

    buf:='';

   end;

   buf:=buf+sqltext[i];

  end;

 if colscntr>3 then begin

   Memo1.Text:='Ошибка'#13#10'В запросе указаны лишние условия.';

   result:=-1;

   exit;

 end;

 inc(colscntr);

 if buf[length(buf)]=' ' then SetLength(buf, length(buf)-1);

 cols[colscntr]:=buf;

 buf:='';

 if colscntr<>fieldsExpected then

 begin

   Memo1.Text:='Ошибка'#13#10'Количество условий, введенное вами, не соответствует ожидаемому.';

   result:=-1;

   exit;

 end;

 for i:=1 to colscntr do begin

  FieldFound:=false;

  for j:=1 to colscntr do begin

   if whr[i]=cols[j] then begin FieldFound:=true; break; end;

  end;

  if not FieldFound then begin

   Memo1.Text:='Ошибка'#13#10'Неправильное условие в операторе WHERE';

   result:=-1;

   exit;

  end;

 end;

 end;

 result:=0;

end;

function TSQLFormX.UpdateAnalyse:smallint;

begin

 result:=-1;

end;

function TSQLFormX.InsertAnalyse:smallint;

begin

 result:=-1;

end;

function TSQLFormX.DeleteAnalyse:smallint;

begin

 result:=-1;

end;

function TSQLFormX.SQLTypeTest:smallint;

begin

 result:=-1;

 case ClientDataSet1.FieldByName('TIP').AsInteger of

  1: begin

      if istokpresent('SELECT',1) then begin

       try

         result:=SelectAnalyse;

        except on e:exception do begin

          Memo1.Text:='Ошибка'#13#10'Ошибочно написан оператор SELECT';

          result:=-1;

          exit;

        end;

       end;

       exit;

      end

      else begin

        Memo1.Text:='Вы ошиблись.'#13#10'Ожидался SELECT запрос';

        DBGrid1.Visible:=false;

        Memo1.Visible:=true;

        exit;

      end;

     end;

  2: if istokpresent('UPDATE',1) then begin result:=UpdateAnalyse; exit; end

     else begin

       Memo1.Text:='Вы ошиблись.'#13#10'Ожидался UPDATE запрос';

       DBGrid1.Visible:=false;

       Memo1.Visible:=true;

       exit;

     end;

  3: if istokpresent('INSERT',1) then begin result:=InsertAnalyse; exit; end

     else begin

       Memo1.Text:='Вы ошиблись.'#13#10'Ожидался INSERT запрос';

       DBGrid1.Visible:=false;

       Memo1.Visible:=true;

       exit;

     end;

  4: if istokpresent('DELETE',1) then begin result:=DeleteAnalyse; exit; end;

     else begin

       Memo1.Text:='Вы ошиблись.'#13#10'Ожидался DELETE запрос';

       DBGrid1.Visible:=false;

       Memo1.Visible:=true;

       exit;

     end;

  end;

  Memo1.Text:='Вы ошиблись.'#13#10'Ожидался другой запрос';

  DBGrid1.Visible:=false;

  Memo1.Visible:=true;

end;

procedure TSQLFormX.SpeedButton1Click(Sender: TObject);

var i, cnt:longword;

begin

 if inproc then exit;

 inproc:=true;

 if (tries=0) then begin