Шрифт:
– * -
* Ну, что, сразу нельзя было сказать?
– Забыл, бывает…
– Как, заработало?
* Да, но гора родила мышь. Ввели много дополнительных слов, а результат тот же.
– Ничего, скоро мышка превратится в кошку, затем в собачку а там и до крокодила недалеко.
* Не п*ди, что будем делать дальше?
– Дальше?
Готовимся выполнять SQL запросы.
– Для начала, что попроще.
– На закладке History помести TMemo – во всю ее ширину и высоту, да, назови это дело His.
– А на закладке SQL надо расположить тоже TMemo (у меня оно названо Memo1) и для начала пару кнопок “Run SQL” и “Clear SQL”.
– Теперь делаем процедуры кнопок:
procedure TFMain.Button1Click(Sender: TObject);
begin // кнопка run SQL
RunSQL( MakeSQL);
end;
* Опять временно?
– Ну, не хочу тебя сразу пугать, все по очереди.
– Обрати внимание на комментарий к слову begin – рекомендую так подписывать процедуру, если название ее мало информативно.
* А вторая кнопка?
– Ну, даже неудобно…
procedure TFMain.Button2Click(Sender: TObject);
begin
Memo1.Clear;
end;
* Да, проще некуда. Так теперь по очереди RunSQL( MakeSQL);
– Недавно переделал, довольно много повкалывал с этими 30 строками…
010 function RunSQL( S:string):boolean;
020 var
030 b : boolean; // отслеживание ошибки
040 Mistake : string; // сообщение ошибки
050 begin
060 with DataModule2.IBSQL1 do
070 begin
080 Close;
090 SQL.Clear;
100 SQL.Add(S);
110 try
120 ExecQuery; // попытка выполнения запроса
130 b := true; // ошибки нет
140 except // Обработка ошибки
150 on E: Exception do
160 begin
170 b := false; // к сожалению, ошибка
180 Mistake := E.ClassName+' raised exception: '+E.Message;
190 end;
200 end; // try
210 end; // with DataModule2
220 result := not b;
230 if b
240 then
250 begin // запрос выполнен
260 Hi.Lines.Add('ok');
270 Memo1.Clear; // и переход на закладку History
280 if DataModule2.IBSQL1.SQLType = SQLSelect
290 then PrintSELECT(S) // распечатка результата запроса SELECT
300 else PageControl1.ActivePageIndex := 3;
310 end
320 else
330 begin // была ошибка
340 ShowMessage(Mistake); // сообщение об ошибке
350 Hi.Lines.Add('Error');
360 Hi.Lines.Add(Mistake); // запись в историю
370 end;
380 Hi.Lines.Add('------------');
390 end;
– Самое интересное происходит, когда запрос НЕ выполняется.
* Прочитал, все понятно, и над чем тут было биться?
– Все понятно? Отлично, объясни тогда строки 280, 290.
* Так, интересно. Определяется тип запроса и если это SELECT. Нечестно, ты еще ничего не сказал о PrintSELECT.
– Давай, это исправим:
010 procedure PrintSELECT(S:string);
020 var
030 i : integer;
040 a : string;
050 LHTML : TStringList;
060 begin
070 LHTML := TStringList.Create;
080 HTMLHead(LHTML);
090 LHTML.Add('<center> '+ s + '');
100 with DataModule2.IBSQL1 do
110 if RecordCount > 0 then
120 BEGIN
130 LHTML.Add('<h2>'+UniqueRelationName+'</h2>');
140 LHTML.Add('<center><table cellspacing=0 cellpadding=0 ><tr>');
150 S := ''; // формирование заголовка таблицы
160 for i := 0 to Current.Count-1 do
170 S := S + '<th>'+ Fields[i].Name +'</th>';
180 S := S + '</tr>'; // конец заголовка таблицы
190 LHTML.Add(S); // печать заголовка таблицы
200 while not EOF do
210 begin
220 S := '<tr>'; //
230 for i := 0 to Current.Count-1 do
240 begin // формирование строки данных