Чтение онлайн

на главную - закладки

Жанры

Cat W

Шрифт:

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. Тестирование программы.

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

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

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

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

– В книге оказалось, очень много ошибок. Ну, очень много ошибок, и все они полезные.

* Догадываюсь, задумано издевательство.

– Точно! Мне так понравилась идея с ошибками, что я задумался, не наделать их и в этом тексте.

* Вот этого, не надо!

– Хорошо, но ошибки неизбежны, где-то что-то я упущу, в этом случае я сделаю вид, что все так и задумано…

* Ну, ты и жук!

– Учись, студент. Учись, как сдавать программу заказчику, главное держать невозмутимое выражение морды лица: “Как, при запуске программы включилось форматирование диска? Ну, это у вас устаревший Windows, давайте я его переставлю, это будет стоить… что, при этом утеряны данные за 3 года работы. Но, это же хорошо (хорошо-то хорошо, да ничего хорошего – что бы еще соврать) – Слава, Богу, это был только сон…”

* Хе-хе, ну у тебя и шуточки. Давай все-таки вернемся к книге [1].

Да! Как я уже раньше думал сказать, если бы все примеры в книге были бы без ошибок, пользы от нее было бы намного меньше. Копируй запросы, выполняй, проверяй результат… скучно. А тут, наполненная описками жизнь бурлит и хлещет.

* И какие там ошибки?

– Например:

SELECT sname, sity

FROM Salespeople;

WHERE city=LONDON;

или еще:

SELECT * FROM Order WHERE NOT

((odate=10/03/1990 AND cnum < > 1002)OR amt > 2000.00);

– Тут пару ошибок достаточно очевидны (лишний символ “;” и нет апострофов вокруг даты ну и прочее, и прочее.

– В процессе поиска ошибок, возникла потребность изменить программу. А именно, при ошибке выводится сообщение, и часто там указывается на какой строке, и в какой позиции найдена ошибка. Проблема в том, что на исполнение мы даем запрос одной строкой, и соотнести место ошибки, с тем, что на экране…

– Посему, изменяем RunSQL

В разделе переменных добавляем:

LPos : integer; // позиция ошибки

– Между строками 330 и 340 добавляем текст:

330 begin // была ошибка

331 Memo1.Clear;

332 Memo1.Lines.Add(S); // перезапись запроса одной строкой

333 LPos := GetSelStart(Mistake); // поиск места ошибки

334 if LPos > -1 then begin

335 Memo1.SelStart := LPos-1; // вкл индикатора

336 Memo1.SelLength := 1;

337 Memo1.SetFocus;

338 Panel5.Caption := IntToStr(LPos); // дополнительная информ.

339 end;

340 ShowMessage(Mistake); // сообщение об ошибке

Как видишь, GetSelStart получает строку с описанием ошибки и пытается найти там информация о ее позиции:

function GetSelStart(S: string):integer;

var

 i, n : integer;

 ss : string;

begin

 result := -1;

 n := pos('column ',S);

 if n > 0

then begin

delete(S,1,n+6);

ss := '';

for i := 1 to length(s) do

if S[i] in ['0'..'9']

then ss := ss + s[i]

else break;

if ss <> '' then

result := StrToInt(ss);

// ShowMessage(S);

end;

end;

– Согласись, тут все довольно просто. Но результат, впечатляет.

– Да, как всегда, что-то да упустишь, во-первых, в компоненте Memo1 измени свойство HideSelection на false – очень помогает, и второе под этим Memo поставь панельку (у меня это Panel5), которая будет показывать текущее положение курсора в строке, для этого вставь обработчик:

Поделиться:
Популярные книги

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Прорвемся, опера!

Киров Никита
1. Опер
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прорвемся, опера!

Темный Лекарь 3

Токсик Саша
3. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 3

Адвокат

Константинов Андрей Дмитриевич
1. Бандитский Петербург
Детективы:
боевики
8.00
рейтинг книги
Адвокат

Кодекс Крови. Книга VI

Борзых М.
6. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VI

Честное пионерское! Часть 3

Федин Андрей Анатольевич
3. Честное пионерское!
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Честное пионерское! Часть 3

Графиня Де Шарни

Дюма-отец Александр
Приключения:
исторические приключения
7.00
рейтинг книги
Графиня Де Шарни

Возвышение Меркурия. Книга 15

Кронос Александр
15. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 15

Хёвдинг Нормандии. Эмма, королева двух королей

Улофсон Руне Пер
Проза:
историческая проза
5.00
рейтинг книги
Хёвдинг Нормандии. Эмма, королева двух королей

Черный Маг Императора 11

Герда Александр
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Черный Маг Императора 11

Тайны затерянных звезд. Том 2

Лекс Эл
2. Тайны затерянных звезд
Фантастика:
боевая фантастика
космическая фантастика
космоопера
фэнтези
5.00
рейтинг книги
Тайны затерянных звезд. Том 2

Кодекс Крови. Книга VIII

Борзых М.
8. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VIII

"Фантастика 2025-1". Книги 1-30

Москаленко Юрий
Фантастика 2025. Компиляция
Фантастика:
фэнтези
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Фантастика 2025-1. Книги 1-30

Темный Лекарь 2

Токсик Саша
2. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 2