Выбрать главу

- Бывают запросы SELECT и все остальные. Результат выполнения SELECT – будем выдавать в закладку result,  а остальные просто выполнять.

- Переделываем Button1Click:

010 procedure TFMain.Button1Click(Sender: TObject);

020 begin  // кнопка run SQL

030    RunSQL(MakeSQL);  // выполение команды SQL

040 end;

- Пойдем дальше.

- Теперь можно заняться кнопочкой «Show Data»

010 procedure TFMain.Button5Click(Sender: TObject);

020 var

030  i : integer;

040  S : string;

050 begin  // Show Data

060  with CheckListBox1 do

070   begin // составляем список полей

080    if Items.Count = 0 then exit;  // если список пуст - уходим

090     S := 'SELECT ';

100    for i := 0 to Items.Count - 1 do // список полей вставляем в запрос

110      if  Checked[i] then

120       S := S + LowerCase(Items[i]) + ', ';

130    end; // with CheckListBox1

140  delete(S, length(S)-1, 2);

150  Memo1.Clear;

160  Memo1.Lines.Add(S);

170  S := 'FROM '+ LowerCase( ListBox1.Items[ ListBox1.ItemIndex] );

180  Memo1.Lines.Add(S);

190  RunSQL( MakeSQL);

200  end;

- Тут все должно быть ясно: кнопка вырабатывает команду SELECT для полей отмеченных галочкой и распечатывает результат.

* Ну, как теперь-то все готово.

- Вот же шило в одном месте. Ладно, следующий пункт:

Тестирование

- Как ты помнишь, тренироваться мы будем по книге Мартина Грубера «Понимание SQL»[1], при потребности будем поглядывать в «Firebird. Руководство разработчика баз данных» Хелен Борри[2].

* Ну и в интернете найдется масса материала.

- Для нашей игры понадобится база с определенными таблицами, полюбуйся на них приложении к [1].

* Не сказать, что 3 таблицы это очень много, но…

- Я так понимаю, что тебе лень, а лень двигатель прогресса.

- В данном случае, я тебе помогу…

- На закладке SQL ставим еще одну кнопку «Run SQL by List».

- Будут выполнятся запросы записанные в текстовом файле.

- Каждый запрос должен заканчиваться «;», допускается перенос запроса на несколько строк, не допускается несколько запросов в одной строке.

- Не отображается результат запросов SELECT

- При ошибочном запросе, выполнение списка прекращается.

010 procedure TFMain.Button6Click(Sender: TObject);

020 var

030  i : integer;

040  L : TStringList;

050  S : string;

060 begin  //  Run SQL by List

070    with OpenDialog1 do

080    begin // подготавливаем диалог

090     Filter  :=  'File with SQL|*.txt';

100     DefaultExt := 'txt';

110     if Execute then

120      with DataModule2 do

130       begin

140         L := TStringList.Create;

150         L.LoadFromFile(FileName); // открываем файл

160         His.Lines.Add('Run SQL by List '+FileName);// запись в историю

170         S := '';

180         for i := 0 to L.Count - 1 do

190          begin

200           S := S + ' ' + L[i]; // складываем строки

210           if pos(';', S) > 0 then // пока в строке не появится ';'

220            begin

230             S := trim(S); // ??

240             His.Lines.Add(S); // записываем запрос в историю

250             if RunSQL(S) then break; // если запрос не выполнился выходим.

260             S := '';

270            end; // if

280          end; // for

290          L.Free;

300        end; //  if Execute

310     end;  // OpenDialog1

320 end;

* В общем все понятно…

* Что за безобразие, хочу чтобы SELECT тоже выполнялись списком.

- Надо подумать. Минуточку. «Раз, два... Меркурий во втором доме... луна ушла... шесть – несчастье... вечер – семь...»

- Готово – сделать можно, даже несколько вариантов, т.е. я имею в виду из уже готовых элементов кода с минимальными добавлениями, а значит, я ничего подсказывать не буду, уж изволь сделать сам.

* Да?!

- Да.

- Возвращаюсь к нашей теме.

- Сейчас я тебе дам пару файлов. Желательно, чтобы ты поступил так:

- 1. Создай новую базу.

- 2. Сделай из нижеследующего файл и выполни его.

«начало кода»

CREATE TABLE Salespeople

( snum integer,

sname char (10),

city char (10),

comm decimal );

CREATE TABLE Customers

( cnum integer,

cname char (10),

city char (10),

rating integer,

snum integer );

CREATE TABLE Orders

( onum integer,

amt decimal,

odate date,

cnum integer,

snum integer );

«конец кода»

- 3. Тут есть нюанс, который я еще не понял, но после создания таблицы, она не активна!?! Потом попробуешь, и возможно найдешь красивое решение. А пока закрой программу, затем запусти ее вновь и открой свою базу. Этого достаточно.

- 4. Сделай следующий файл и выполни:

«начало кода»

INSERT INTO Salespeople (snum,sname,city ,comm)

VALUES (1001,'Peel','London',.12);

INSERT INTO Salespeople (snum,sname,city ,comm)

VALUES (1002,'Serres','San Jose',.13);

INSERT INTO Salespeople (snum,sname,city ,comm)

VALUES (1004,'Motika','London',.11);

INSERT INTO Salespeople (snum,sname,city ,comm)

VALUES (1007,'Rifkin','Barcelona',.15);

INSERT INTO Salespeople (snum,sname,city ,comm)

VALUES (1003,'Axelrod','New York',.10);

INSERT INTO Customers (cnum,cname,city,rating,snum)

VALUES (2001,'Hoffman','London',100,1001);

INSERT INTO Customers (cnum,cname,city,rating,snum)

VALUES (2002,'Giovanni','Rome',200,1003);

INSERT INTO Customers (cnum,cname,city,rating,snum)

VALUES (2003,'Liu','San Jose',200,1002);

INSERT INTO Customers (cnum,cname,city,rating,snum)

VALUES (2004,'Grass','Berlin',300,1002);

INSERT INTO Customers (cnum,cname,city,rating,snum)

VALUES (2006,'Clemens','London',100,1001);

INSERT INTO Customers (cnum,cname,city,rating,snum)

VALUES (2008,'Cisneros','San Jose',300,1007);

INSERT INTO Customers (cnum,cname,city,rating,snum)

VALUES (2007,'Pereira','Rome',100,1004);

INSERT INTO Orders (onum,amt,odate,cnum,snum)

VALUES (3001,18.69,'10/03/1990',2008,1007);

INSERT INTO Orders (onum,amt,odate,cnum,snum)

VALUES (3003,767.19,'10/03/1990',2001,1001);

INSERT INTO Orders (onum,amt,odate,cnum,snum)

VALUES (3002,1900.10,'10/03/1990',2007,1004);

INSERT INTO Orders (onum,amt,odate,cnum,snum)

VALUES (3005,5160.45,'10/03/1990',2003,1002);

INSERT INTO Orders (onum,amt,odate,cnum,snum)

VALUES (3006,1098.16,'10/03/1990',2008,1007);

INSERT INTO Orders (onum,amt,odate,cnum,snum)

VALUES (3009,1713.23,'10/04/1990',2002,1003);

INSERT INTO Orders (onum,amt,odate,cnum,snum)

VALUES (3007,75.75,'10/04/1990',2004,1002);

INSERT INTO Orders (onum,amt,odate,cnum,snum)

VALUES (3008,4723.00,'10/05/1990',2006,1001);

INSERT INTO Orders (onum,amt,odate,cnum,snum)

VALUES (3010,1309.95,'10/06/1990',2004,1002);

INSERT INTO Orders (onum,amt,odate,cnum,snum)

VALUES (3011,9891.88,'10/06/1990',2006,1001);

«конец кода»

- Все должно пройти хорошо.

* Брюки превращаются, превращаются брюки… в элегантную базу данных. Все ОК.

- Теперь заготовка базы у нас есть, и мы можем выполнять запросы из книги [1] выполнятся будут 3 задачи:

- 1. Самообучение SQL.

- 2. Вычитывание книги (с исправлением опечаток)

- 3. Тестирование программы.

* Значит теперь, со всеми переделками, программа сможет выполнить любой запрос?

- Это предстоит проверить.

Прошло три дня.

- Нет, ребята, пулемета я вам не дам.