Memo1.Text:='Ошибка'#13#10'В запросе не указаны колонки.';
result:=-1;
exit;
end;
while i<=sqltextpos+pos-3 do begin
inc(i);
if sqltext[i]=',' then begin
if colscntr>4 then begin
Memo1.Text:='Ошибка'#13#10'В запросе указаны лишние колонки.';
result:=-1;
exit;
end;
inc(i);
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>4 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;
// Анализ полей в операторе SELECT
for i:=1 to colscntr do begin
FieldFound:=false;
for j:=1 to colscntr do begin
if AnsiStrComp(PChar(ClientDataSet1.FieldByName('FIELD'+IntToStr(i)).AsString),PChar(cols[j]))=0 then begin FieldFound:=true; break; end;
end;
if not FieldFound then begin
Memo1.Text:='Ошибка'#13#10'Неправильное поле в операторе SELECT';
result:=-1;
exit;
end;
end;
sqltextpos:=sqltextpos+pos+4;
//Переходим к анализу FROM
if ClientDataSet1.FieldByName('ISWHERE').AsInteger = 1 then begin
pss:=6;
pch:=@sqltext[sqltextpos];
pos:=ansipos('WHERE',ansistring(pch));
if pos=0 then begin
Memo1.Text:='Ошибка'#13#10'Ожидался оператор WHERE';
result:=-1;
exit;
end;
if sqltext[sqltextpos+pos-2]<>' ' then begin
Memo1.Text:='Ошибка'#13#10'Не найден пробел или перевод строки (ENTER) перед оператором WHERE';
result:=-1;
exit;
end;
if sqltext[sqltextpos+pos-3]=',' then begin
Memo1.Text:='Ошибка'#13#10'Найдена лишняя запятая перед оператором WHERE';
result:=-1;
exit;
end;
end
else begin
i:=groupby;
if i=1 then begin
i:=strlen(pchar(sqltext));
while (sqltext[i]=';') or (sqltext[i]=' ') or (sqltext[i]=#0) do dec(i);
pos:=i-sqltextpos+2;
end
end;
fieldsExpected:=0;
colscntr:=0;
for i:=1 to 4 do begin
if ClientDataSet1.FieldByName('FROM'+IntTostr(i)).IsNull then break;
Inc(fieldsExpected);
end;
buf:='';
i:=sqltextpos-1;
if i>sqltextpos+pos-3 then begin
Memo1.Text:='Ошибка'#13#10'В запросе не указаны таблицы.';
result:=-1;
exit;
end;
while i<=sqltextpos+pos-3 do begin
inc(i);
if sqltext[i]=',' then begin
if colscntr>3 then begin
Memo1.Text:='Ошибка'#13#10'В запросе указаны лишние таблицы.';
result:=-1;
exit;
end;
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);
if buf[length(buf)]=#0 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 ClientDataSet1.FieldByName('FROM'+IntToStr(i)).AsString=cols[j] then begin FieldFound:=true; break; end;
end;
if not FieldFound then begin
Memo1.Text:='Ошибка'#13#10'Неправильное имя таблицы в операторе SELECT';
result:=-1;
exit;
end;
end;
sqltextpos:=sqltextpos+pos+pss-2;
i:=groupby;
if i=-1 then begin result:=-1; exit; end;
if i=1 then begin
i:=length(sqltext);
while (sqltext[i]=';') or (sqltext[i]=' ') do dec(i);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.