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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.