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

     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);