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

  end;

  wasSpace:=false;

  if Memo2.Text[i]='(' then begin

    if (j>1) and (sqltext[j-1]=' ') then dec(j);

    sqltext[j]:=' '; inc(j);

    sqltext[j]:=Memo2.Text[i]; inc(j);

    wasspace:=true;

    sqltext[j]:=' ';

   end

   else if Memo2.Text[i]=')' then begin

    if (j>1) and (sqltext[j-1]=' ') then dec(j);

    sqltext[j]:=' '; inc(j);

    sqltext[j]:=Memo2.Text[i]; inc(j);

    wasspace:=true;

    sqltext[j]:=' ';

   end

  else if Memo2.Text[i]='=' then begin

    if (j>1) and (sqltext[j-1]=' ') then dec(j);

    if (j>1) then begin

     if (sqltext[j-1]='!') then begin

      sqltext[j-1]:=' ';

      sqltext[j]:='<';inc(j);

      sqltext[j]:='>';inc(j);

     end else begin

      if (sqltext[j-1]<>'>') and (sqltext[j-1]<>'<') then begin sqltext[j]:=' '; inc(j); end;

      sqltext[j]:=Memo2.Text[i]; inc(j);

     end

    end else begin sqltext[j]:=Memo2.Text[i]; inc(j); end;

    wasspace:=true;

    sqltext[j]:=' ';

   end

  else if Memo2.Text[i]='>' then begin

    if (j>1) and (sqltext[j-1]=' ') then dec(j);

    if (j>1) and (sqltext[j-1]<>'<') then begin sqltext[j]:=' '; inc(j); end;

    sqltext[j]:=Memo2.Text[i]; inc(j);

    wasspace:=true;

    sqltext[j]:=' ';

   end

  else if Memo2.Text[i]='<' then begin

    if (j>1) and (sqltext[j-1]=' ') then dec(j);

    sqltext[j]:=' '; inc(j);

    sqltext[j]:=Memo2.Text[i]; inc(j);

    wasspace:=true;

    sqltext[j]:=' ';

   end

  else if Memo2.Text[i]=')' then begin

    if (j>1) and (sqltext[j-1]=' ') then dec(j);

    sqltext[j]:=' '; inc(j);

    sqltext[j]:=Memo2.Text[i]; inc(j);

    wasspace:=true;

    sqltext[j]:=' ';

   end

  else sqltext[j]:=UpCase(Memo2.Text[i]);

  inc(j);

 end;

 SetLength(sqltext,j-1);

end;

function TSQLFormX.istokpresent(str:ansistring; pos:integer):boolean;

var i:integer;

begin

 if length(str)>length(sqltext)-pos+1 then begin result:=false; exit; end;

 for i:=0 to length(str)-1 do begin

  if sqltext[pos+i]<>str[i+1] then begin result:=false; exit; end;

 end;

 result:=true;

end;

function TSQLFormX.SelectAnalyse:smallint;

var cols, whr:array [1..5] of ansistring;

    buf:ansistring;

    pos, j, fieldsExpected, colscntr, pss:integer;

    i:integer;

    pch:PChar;

    FieldFound:boolean;

function groupby:smallint;

begin

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

  pss:=9;

  pch:=@sqltext[sqltextpos];

  pos:=ansipos(ansistring(pch), 'GROUP BY');

  if pos=0 then begin

   Memo1.Text:='Ошибка'#13#10'Ожидался оператор GROUP BY';

   result:=-1;

   exit;

  end;

  if sqltext[pos-1]<>' ' then begin

   Memo1.Text:='Ошибка'#13#10'Не найден пробел или перевод строки (ENTER) перед оператором GROUP BY';

   result:=-1;

   exit;

  end;

  if sqltext[pos-2]<>',' then begin

   Memo1.Text:='Ошибка'#13#10'Найдена лишняя запятая перед оператором GROUP BY';

   result:=-1;

   exit;

  end;

  result:=0; //group by ecnm

 end else result:=1; //group by нет

end;

begin

 sqltextpos:=7;

 if (sqltext[sqltextpos]<>#32) then begin

  Memo1.Text:='Ошибка'#13#10'Не найден пробел или перевод строки (ENTER) после оператора SELECT';

  result:=-1;

  exit;

 end;

 inc(sqltextpos);

 pch:=@sqltext[sqltextpos];

 pos:=ansipos('FROM',ansistring(pch));

 if pos=0 then begin

  Memo1.Text:='Ошибка'#13#10'Не найден оператор FROM';

  result:=-1;

  exit;

 end;

 if sqltext[sqltextpos+pos-2]<>' ' then begin

  Memo1.Text:='Ошибка'#13#10'Не найден пробел или перевод строки (ENTER) перед оператором FROM';

  result:=-1;

  exit;

 end;

 if sqltext[sqltextpos+pos-3]=',' then begin

  Memo1.Text:='Ошибка'#13#10'Найдена лишняя запятая перед оператором FROM';

  result:=-1;

  exit;

 end;

 fieldsExpected:=0;

 colscntr:=0;

 for i:=1 to 5 do begin

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

  Inc(fieldsExpected);

 end;

 buf:='';

 i:=sqltextpos-1;

 if i>sqltextpos+pos-3 then begin