6.11. Programování bezserverových databází 2

Příprava - aplikace knihovna

1 Stáhněte si přes FTP z fileserveru pomocí účtu anonym soubory db09.zip a knihovna.zip a extrahujte je tak, aby databázový soubor db09.sqlite byl ve složce c:\temp\db09 a pascalovský projekt ve složce c:\temp\knihovna FileZilla
2 Ověřte v sqlite3 strukturu databáze c:\temp\db09\db09.sqlite - vypište si seznam tabulek, schéma tabulek - jedná se o knihy a čtenáře knihovny (všimněte si stejného sloupce id_ctenar u obou tabulek) cmd, sqlite3
3 Spusťte Lazarus, otevřte projekt c:\temp\knihovna\knihovna.lpi a zkuste aplikaci zkompilovat + spustit (F9) - aplikace obsahuje tabulku čtenářů Lazarus

Opakování

4 Ověřte ve formuláři a zdrojovém kódu napojení komponent, vlastnosti a události:
- Form1.OnCreate, OnClose
- SQLQuery1.AfterDelete,
AfterPost
5 Přidejte do SQL příkazu v komponentě SQLQuery řazení podle jména čtenáře
6 Upravte záhlaví sloupců, aby názvy sloupců byly správně česky - ověřte aplikaci jejím spuštěním

Doplnění o tabulku knihy

7 Vložte další TSQLQuery a nastavte
SQLQuery2.Database = SQLite3Connection1
SQLQuery2.
SQL = select * from knihy order by autor;
8 Doplňte události SQLQuery2.AfterPost a AfterDelete
9 Doplňte do událostí Form1.OnCreate a OnClose kód pro SQLQuery2
10 Vložte další komponentu TDataSource a nastavte:
Datasource2.Dataset = SQLQuery2
11 Vložte komponenty TDbGrid a TDbNavigator a napojte je na Datasource2
12 Pravým tlačítkem v DbGrid2 proveďte Editovat sloupce a přidejte sloupce: autor, nazev, id_ctenar
13 Spusťte a ověřte správnou funkci aplikace s druhou tabulkou pro knihy

Vložení defaultní hodnoty u nově vkládaného řádku

14 Do SQLQuery1.AfterInsert vložte kód:
SQLQuery1.FieldByName('datum').Value:=FormatDateTime('YYYY-MM-DD',Now);
15 U DbGrid1 editujte sloupec titul (pravým tlačítkem) a do vlastnosti
PickList nadefinujte na jednotlivé řádky tituly Ing., Mgr., MUDr. - vkládání titulu a aktuálního datumu ověřte ve spuštěné aplikaci

Hledání v tabulce

16 Vložte do formuláře komponentu DbLookupComboBox a nastavte její vlastnosti pro hledání jména čtenáře:
AutoComplete=true, AutoDropDown=true, ScrollListDataset=true; ListField=jmeno, KeyField=jmeno, ListSource=DataSource1 a ověřte funkci ve spuštěné aplikaci

Obrázky v databázi

17 Přidejte do tabulky ctenari nový sloupec pro obrázek (pomocí SQLite3 spuštěného z příkazového řádku)
alter table ctenari add column obrazek blob;
cmd + sqlite3
18 Přidejte do formuláře komponentu TDbImage (z Data Controls) a nastavte vlastnosti
DbImage1.DataField = obrazek
DbImage1.DataSource = Datasource1
Lazarus
19 Přidejte do formuláře tlačítko s nápisem "Vložit obrázek" a do jeho události Button1.OnClick vložte kód pro vkládání obrázku ze schránky:
if Clipboard.HasFormat(PredefinedClipboardFormat(pcfBitmap)) then
DbImage1.Picture.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfBitmap));
20 Do uses přidejte Clipbrd, LCLIntf, LCLType a po spuštění ověřte vkládání a ukládání obrázků - vložte obrázky u nejméně 3 čtenářů (před vložením obrázku řádek editujte tlačítkem s tužkou a ukládejte fajfkou)
21 Upravte podle potřeby vlastnosti DbImage1.Stretch a Proportional, které mají vliv na vzhled obrázku

Relace - viz http://wiki.freepascal.org/MasterDetail

22 Vložte do formuláře tlačítko s nápisem "Vypůjčit knihu" a do jeho OnClick zapište kód:
SQLQuery2.Edit;
SQLQuery2.FieldByName('id_ctenar').Value:=SQLQuery1.FieldByName('id_ctenar').Value;
SQLQuery2.Post;
Prověřte vypůjčku (ve sloupci knihy.id_ctenar se objeví id čtenáře)

Tabulka pro seznam vypůjčených knih

23 Vložte do formuláře další SQLQuery a nastavte
SQLQuery3.Database = SQLite3Connection1
SQLQuery3.DataSource = DataSource1
SQLQuery3.SQL = SELECT * FROM knihy WHERE knihy.id_ctenar=:id_ctenar;
24 Doplňte do událostí Form1.OnCreate a OnClose kód pro SQLQuery3
25 Přidejte komponenty:
- Datasource3
s napojením na SQLQuery3,
- DbGrid3
s napojením na Datasource3 a nastavte vlastnosti sloupců (autor, nazev)
Prověřte funkci tabulky vypůjčených knih.
26 Doplňte SQLQuery3.Refresh do SQLQuery2.AfterPost

Vracení knih

27 Vložte do formuláře tlačítko "Vrátit" a do jeho OnClick zapište kód:
SQLQuery3.Edit;
SQLQuery3.FieldByName('id_ctenar').Value:=null;
SQLQuery3.Post;
28 Doplňte událost SQLQuery3.ApplyUpdates do SQLQuery3.AfterPost a prověřte funkci vracení knih
29 Doplňte SQLQuery2.Refresh a SQLQuery3.Refresh do SQLQuery3.AfterPost

Logování SQL -  http://wiki.freepascal.org/SqlDBHowto#Troubleshooting:_TSQLConnection_logging

30 Vložte do Form1 komponentu TMemo pro logování SQL příkazů
31 Do FormCreate za poslední SQLQueryX.Open vložte příkaz pro určení co budeme logovat:
SQLite3Connection1.LogEvents:=[detExecute];
32 Do události SQLite3Connection1.OnLog vložte příkaz pro výpis logů do TMemo:
Memo1.Lines.Add(Msg);
33 Spusťte aplikaci a prověřte logování

Přímé vykonání SQL příkazu - příklad kódu:

34 Uložte a zavřete otevřené dokumenty a celé složky db09 a knihovna uložte na fileserver