W Cat - S. D. F.

Все авторские права соблюдены. Напишите нам, если Вы не согласны.
Описание книги "S. D. F."
Описание и краткое содержание "S. D. F." читать бесплатно онлайн.
Если вам интересен SQL, и знаком Delphi, давайте поразвлекаемся программированием.
- Рано кричать, закрой программу, включи опять и открой твою базу.
* Есть, таблица сразу отобразилась.
* Есть вопросик, для чего у нас на форме CheckListBox1 и закладка Result.
- Ну, с итоговой закладкой погоди, а вот по первому пункту поболтаем.
- А пока потренируйся, введи еще пару таблиц, пока это без разницы, ну что-то типа «Коты Герои»(кличка, возраст, степень героизма, аппетит и т.д.) и т.д.
* А как?
- Начинай читать книги по SQL. Я предлагал только играться, (и сделать инструмент для игры) а правила игры вспоминай сам.
- А мне, пора возвращаться к своим, ко… нет к баранам.
Продолжаем клепать ББД
- Итак закладка Structure DB показывает имеющиеся в сей базе таблицы.
- Но, интересно узнать из каких полей состоит таблица.
- Именно эту информацию будет показывать CheckListBox1
* Но, кроме имен полей, хочется знать их типы, размеры и прочее.
- В числе прочей, эта информация появится на накладке Result, но как сказал классик «в очередь, с*ны дети, в очередь».
- Так, мне этот бардак надоел, делаем так, как я привык. Во-первых вставляем новый модуль:
unit gv; // Глобальные переменные
interface
var
Path : string; // Путь к исполняемой программе
implementation
end.
* Да, знатный модуль.
- Смейся, смейся. При помощи этого модуля, я привык такой фокус делать, закачаешься, но сейчас это не к месту.
- Второе: делаем обработчик создания формы:
10 procedure TFMain.FormCreate(Sender: TObject);
20 begin
30 Path := ExtractFileDir(ParamStr(0)) + '\';
40 OpenDialog1.InitialDir := Path;
50 PageControl1.ActivePage := TabSheet1;
60 end;
- Строка 30 – инициализация пути к запускаемой программе.
* А для чего?
- Ну для начала изменим procedure TFMain.NewDB1Click:
150 IBDatabase1.DatabaseName:= Path + fn;
* А зачем? И так все хорошо работало.
- Хорошо, да не очень. Если при сохранении указывается только имя файла, операционная система записывает его в текущую папку, если это папка, откуда программа запускалась, то все нормально, но если со времени запуска программы пользователь заходил в другие папки (текущая папка сменилась), то потом, найти созданный файл, большая проблема. И совсем другое дело, когда мы даем команду записать файл в конкретную папку.
* И для этого заводить специальный модуль.
- Не ворчи, сказано, это моя привычка.
- Строка 40 Инициализация текущей папки для диалога открытия файла.
- По умолчанию диалог откроется с Моих Документов, что часто очень не удобно…
- Строка 50 Делаем активной первую закладку нашей программы, независимо от того, на которой мы остались при запуске компиляции.
* Ух, что-то я за… работался.
- Ладно, давай прервемся.
«Продолжение следует»
А вот и продолжение
- Ну, с новыми силами…
- Для ListBox1 делаем обработчик двойного клика. Т.е. по этому событию должно отобразится содержимое соответствующей таблицы.
procedure TFMain.ListBox1DblClick(Sender: TObject);
var
kod : integer;
begin
ShowFields;
end;
010 procedure ShowFields;
020 var
030 n : integer;
040 begin
050 CLBox1.Clear;
060 with DataModule2.IBSQL1 do
070 begin
080 Close;
090 SQL.Clear;
100 SQL.Add('select R.RDB$FIELD_NAME from RDB$FIELDS F, RDB$RELATION_FIELDS R '+
110 'where F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE and R.RDB$SYSTEM_FLAG = 0 '+
120 'and RDB$RELATION_NAME = ''' + LBox1.Items[ LBox1.ItemIndex]+''' '+
130 'order by R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION');
140 ExecQuery;
150 while not EOF do
160 begin
170 n := CLBox1.Items.Add( trim(Fields[0].AsString));
180 CLBox1.Checked[n] := true;
190 Next;
200 end;
210 Close;
220 end; // with DataModule2
230 end;
* Душераздирающее зрелище — вот как это называется!
- Ничего, потренируешься с SQL и будешь его щелкать…
- Как видишь служебная (внутренняя) база содержит несколько таблиц:
RDB$RELATIONS
RDB$FIELDS
RDB$RELATION_FIELDS
и т.д.
- Надо всего лишь взять буквы латинского языка и доллар(как без него) расставить их в нужном порядке, отсечь все лишнее и все готово.
- В строках 100-130 формируется запрос, в стр. 140 он выполняется, а затем цикл в строках 150-200 сохраняет имена полей таблицы в пунктах CheckListBox1, по команде стр. 190 переход на следующую запись… вот вкратце.
* Да, объяснения ты печешь как горячие пирожки.
- Подумаешь, пироги! Я еще вышивать умею и на машинке шить. А ты думал, что мы только мясо умеем воровать из кастрюль и на крышах кричать.
* Вызывает интерес, и еще такой разрез. Где ты взял эту информацию?
- Пилите, Шура хелпы, пилите, они золотые.
* А почему мы используем CheckListBox зачем нам эти галочки.
- Вот тут мы подходим к следующей задаче. У нас на файсе есть еще кнопка “Show Data”.
- Подробности о содержимое таблицы будем показывать в зависимости от установленных галочек в этом самом CheckListBox.
- Но, давай по очереди.
Show Structure
- Когда я планировал ББД, и дошел до этого пункта, перебрал несколько вариантов: можно выдавать результат в отдельный файл, можно в Memo, можно StringGrid или подобное, но это все не то. Т.е. хочется, чтобы была видна табличная форма таблицы ( возгласы с мест «* Невнятная тавтология»). А потом сообразил – Браузер, конечно же Браузер. Именно HTML дает широкие и гибкие возможности отображения информации.
- Итак на закладке Result ставим компонент Web типа TwebBrowser.
- А для кнопки “Show Structure” обработчик нажатия.
010 procedure TFMain.Button3Click(Sender: TObject);
020 var
030 i : integer;
040 LHTML : TStringList;
050 begin // кнопка Show Structure
060 if ListBox1.Items.Count = 0 then exit;
070 LHTML := TStringList.Create;
080 HTMLHead(LHTML);
090 with ListBox1 do
100 for i := 0 to Items.Count - 1 do
110 PrintFields(Items[i], LHTML);
120 LHTML.SaveToFile(Path+’~.htm’);
130 Web.Navigate(Path+’~.htm’);
140 PageControl1.ActivePage := TabSheet2;
150 LHTML.Free;
160 end;
- Стр. 70 создаем листочек HTML
- Стр. 80 записываем заголовочную часть HTML
- 100-110 циклически заносим в HTML нужную информацию
- Стр. 120 Вот тут можно было пойти разными путями, я пошел простейшим сохраняю HTML файл в рабочей папке.
- Стр. 130 Отображаю готовый файл в навигаторе.
* Хорошо, копаем глубже…
- Пожалуйста:
010 procedure PrintFields(table:string; LHTML : TStringList);
020 var
030 S : string;
040 begin
050 LHTML.Add('<h2>'+table+'</h2>');
060 with DataM.IBSQL1 do
070 begin
080 Close;
090 SQL.Clear;
100 SQL.Add('select R.RDB$FIELD_POSITION, R.RDB$FIELD_NAME, '+
110 'F.RDB$FIELD_LENGTH, F.RDB$FIELD_TYPE '+
120 'from RDB$FIELDS F, RDB$RELATION_FIELDS R '+
130 'where F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE and R.RDB$SYSTEM_FLAG = 0 '+
140 'and RDB$RELATION_NAME = ''' + table +''' '+
150 'order by R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION');
160 ExecQuery;
170 LHTML.Add('<center><table><tr>');
180 LHTML.Add('<th>Position</th>');
190 LHTML.Add('<th>Name</th>');
200 LHTML.Add('<th>Length</th>');
210 LHTML.Add('<th>Type</th>');
220 LHTML.Add('</tr>');
230 while not EOF do
240 begin
250 S := '<tr><td>' +Fields[0].AsString + '</td>'+
260 '<td>'+ trim(Fields[1].AsString)+'</td>'+
270 '<td>'+ trim(Fields[2].AsString) +'</td>'+
280 '<td>'+ FieadType(Fields[3].AsInteger)+'</td></tr>';
290 LHTML.Add(s);
300 Next;
310 end;
320 LHTML.Add('</table></center>');
330 end;
340 end;
* А я стал привыкать к этим крокозябрам.
- Тем более, что текст во многом повторяется.
- Как видишь, на экран выдается название таблицы, а затем таблица с описанием полей.
* Погоди! А что это в 280 строке?
- О, кота то я, и не заметил.
function FieadType(n:integer):string;
begin
case n of
7 : result := 'smallint';
8 : result := 'integer';
9 : result := 'quad';
10 : result := 'float';
11 : result := 'd_float';
12 : result := 'date';
13 : result := 'time';
14 : result := 'char';
27 : result := 'double';
35 : result := 'date';
37 : result := 'varchar';
261 : result := 'blob';
else result := IntToStr(n)+' ?';
end; // case
end;
В результате отобразится, нечто такое:
- * -
- Ну, и чего так долго, конечно, пива много не бывает, но…
* В общем-то, получилось, но никак не могу скопировать получившееся.
- Да, есть такая задача. Вставь в самом конце (перед end.) в файле Unit1:
initialization
OleInitialize(nil);
finalization
OleUninitialize;
А в самом начале этого файла вставь ActiveX в разделе uses.
* Так, просто! Да что же это такое. Просто хочется рвать и метать!!
- Это Windows.
* Ну, что теперь отображаем данные?
- Нет, не к спеху, да и отображать еще нечего, давай отдохни, а я подготовлюсь к последнему рывку.
«Продолжение следует»
Последний? Рывок к ББД
- Предлагаю вернуться к выполнению SQL запроса.
- Бывают запросы 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; // если список пуст - уходим
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!
Похожие книги на "S. D. F."
Книги похожие на "S. D. F." читать онлайн или скачать бесплатно полные версии.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Отзывы о "W Cat - S. D. F."
Отзывы читателей о книге "S. D. F.", комментарии и мнения людей о произведении.