W Cat - S. D. F.
Название: | S. D. F. | |
Автор: | W Cat | |
Жанр: | Базы данных, Современные российские издания, Литература ХXI века (эпоха Глобализации экономики), Программирование: прочее, Pascal, Delphi, Lazarus и т.п. | |
Изадано в серии: | неизвестно | |
Издательство: | неизвестно | |
Год издания: | - | |
ISBN: | неизвестно | |
Отзывы: | Комментировать | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "S. D. F."
Если вам интересен SQL, и знаком Delphi, давайте поразвлекаемся программированием.
Читаем онлайн "S. D. F.". [Страница - 8]
* Хе-хе, ну у тебя и шуточки. Давай все-таки вернемся к книге [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), которая будет показывать текущее положение курсора в строке, для этого вставь обработчик:
procedure TFMain.Memo1Click(Sender: TObject);
begin
Panel5.Caption := IntToStr( Memo1.SelStart );
end;
* Ну, ты загонял, то тут добавить, то там исправить.
- С моей точки зрения, это нормальная работа. Программа, как и живое существо, не рождается полностью функционирующей. Растем, развиваемся, главное, четко понимать, почему и для чего производятся эти манипуляции…
- Ну, что, теперь, твоя очередь тестировать программу.
- * -
- * -
- Ну, как успехи. Выходит?
* И входит, и выходит. Вообще-то мне нравится, но я обнаружил бревно в твоем глазу.
* Как-то раз вылезло такое сообщение:
“Cannot perform operation - DB is currently open”
- Так, так, в каких обстоятельствах появилась ошибка.
* Я отрывал базу.
- И чё сея строчка значит?
* Грит не может выполнять работу – база сейчас открыта.
- Объясни понятнее.
* Т.е. не может открыть базу, потому, что она уже открыта.
- Не обязательно она, но какая-то база открыта.
* Ну, и чего делать?
- Конечно, исправлять.
* Как?
- Думай.
* Ну, если какая-то база открыта, надо ее закрыть.
- Отлично, вот тебе две строчки, вставь их в двух местах… где сам найдешь.
if IBDatabase1.Connected then
IBDatabase1.Connected := false;
* Ты хочешь сказать, что все было запланировано?
- J
- Еще, есть целый ряд ситуаций в книге [1] которые формально не являются ошибкой, но…
* Ну-ка, ну-ка.
- Например такой запрос:
SELECT first.cname, second.cname, first.rating
FROM Customers first, Customers second
WHERE first.rating=second.rating;
* И в чем прикол?
- Попробуй.
* Останавливается на слове second.
- Я тоже не сразу понял, открой в книге [2] список зарезервированных слов.
* Да, не все йогурты одинаковы.
- Как и реализации SQL, но, все они полезны.
* Еще я заметил, что в некоторых случаях запросы выполняется, но порядок строк, не такой как в книге [1].
- Это, та же ситуация. Разные реализации SQL имеют разные установки (по умолчанию) для сортировки, т.е. если будет явно задан порядок, тогда таблица должны 100% совпасть.
* Так, что, задача выполнена?
- Нет, не совсем.
* И в чем дело, какие-то исправления?
- Поправки? Да, так, по мелочи, SetFocus для Memo1 при сбросах.
* И что дает?
- Попробуй, удобнее. Но как сказано это --">