Google+ Followers

sobota 29. března 2014

Vývoj databázových aplikací IV

Práce s datovými sadami na straně klienta

Dosud jsme se zabývali především příkazy, které aplikaci nevracely žádná nebo jen agregovaná data. Častější však bývá situace, kdy je na základě dotazu na klienta přenesena požadovaná množina dat, a uživatelé s nimi provádí další operace. Pro definování datových sad je k dispozici trojice komponent "FDTable", "FDQuery" a "FDStoredProc".

  • FDTable - Vytváří datovou sadu naplněnou záznamy z určené tabulky nebo pohledu
  • FDQuery - Datová sada je definována na základě SQL dotazu
  • FDStoredProc - Datová sada je získána spuštěním uložené procedury

Použití komponenty "FDTable"

Jak již bylo řečeno, datová sada je tvořena množinou záznamů získaných z databáze. Pokud potřebujeme pracovat výhradně se záznamy konkrétní databázové tabulky, je nejsnazší cestou použití komponenty "FDTable". Minimální nastavení vyžaduje specifikovat v inspektorovi objektů nebo v kódu vlastnosti:

  • Connection - určuje DB připojení, které má být použito pro komunikaci s databázovým strojem
  • TableName - Jméno tabulky, která bude zdrojem dat pro naplnění datové sady

V závislosti na typu DB stroje může být nutné zvolit před volbou tabulky odpovídající "Catalog" nebo "Schema", v kterém se požadovaná tabulka nachází.

Nastavení vlastností komponenty FDTable

Parametr názvu připojení pro "FDTable" je doplněn automaticky prostředím. Na to je třeba dát pozor, pokud je na formuláři umístěna více než jedna komponenta "FDConnection".

Použití komponenty "FDQuery"

Pro definování složitějších datových sad slouží komponenta "ADQuery".
Pro pohodlnější zadávání příkazů SQL, případně jejich ověření, nabízí FireDAC jednoduchý QueryEditor. Okno Query Editoru otevřeme tak, že na formulář umístíme komponentu "FDQuery" a klikneme na ni pravým tlačítkem myši. V kontextovém menu pak vybereme volbu "Query Editor...".

Vyvolání Query Editoru

Příkazy se vkládají do dialogu v záložce "SQL Command". Zadat lze i více příkazů současně, je však třeba použít v závislosti na databázovém stroji správný oddělovač příkazů. Jedná-li se o příkazy, které nevracejí jako výsledek sadu záznamů, stačí následně kliknout na tlačítko "Execute" a příkazy budou spuštěny jako dávka. Pokud je mezi zadanými příkazy více než jeden příkaz vracející výsledkovou sadu, zobrazí se pouze první sada záznamů. Pro zobrazení dalších je třeba použít tlačítko "Next RecordSet".

Query Editor

Je-li příkazem vrácena sada záznamů, lze si v záložce "Structure" ve spodní polovině obrazovky zobrazit její vlastnosti (informace o datových typech a atributech jednotlivých sloupců). V záložce "Messages" pak můžeme najít chybová nebo informační hlášení databáze.

Zobrazení informací o datové sadě

Parametrické dotazy
Kromě dávek podporuje FireDAC Query Editor také parametrické dotazy. Do dialogu "SQL Command" vložíme příkaz s požadovanými parametry, například:

select * from osoba where osoba_id = :oid;

Parametrický dotaz

Následně přejdeme do záložky "Parameters", kam Query Editor automaticky doplní jméno použitých parametrů. V dialogu můžeme specifikovat typ parametru, jeho datový typ a případně defaultní hodnotu. Datovým typem může být i pole hodnot. Po zadání hodnoty (nebo indexu pole hodnot) a kliknutí na tlačítko "Execute" se zobrazí výsledek dotazu.

Specifikace a otestování parametrického dotazu

Parametr můžeme následně používat v kódu aplikace, typicky pro zobrazení dat z podřízené tabulky v pohledech "Master/Detail".


Delphi

procedure TForm1.Button1Click(Sender: TObject);
begin
  FDQuery1.Active := False;
  FDQuery1.ParamByName('oid').AsInteger := StrToInt(edit2.Text);
  FDQuery1.Active := True;
end;


C++ Builder

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  FDQuery1->Active = False;
  FDQuery1->ParamByName("oid")->AsInteger = StrToInt(edit2->Text);
  FDQuery1->Active = True;
}

Použití Maker
Query Editor kromě spouštění parametrických dotazů dovoluje testovat i použití maker, nebo makra přímo používat pro modifikaci příkazů. Pokud například chceme spustit příkaz "select" proti několika různým tabulkám, můžeme využít možnost substituce názvů objektů. Do Query Editoru zadáme příkaz v následujícím tvaru:

SELECT &column FROM &table;

V záložce "Macros" jsou automaticky vytvořeny použité proměnné (v tomto případě "column" a "table") a lze jim přiřazovat požadované hodnoty. Po zadání hodnot a kliknutí na tlačítko "Execute" jsou proměnné nahrazeny zadanými hodnotami, příkaz je spuštěn a zobrazena výsledková sada.

Nastavení a otestování makra


Delphi


procedure TForm1.MakroClick(Sender: TObject);
begin
  FDQuery1.Active := false;
  FDQuery1.MacroByName('TABLE').AsRaw := edit2.Text;
  FDQuery1.Active := true;
end;


C++ Builder

void __fastcall TForm1::MakroClick(TObject *Sender)
{
  FDQuery1->Active = False;
  FDQuery1->MacroByName("TABLE").AsRaw = edit2->Text;
  FDQuery1->Active = True;
}

Makra nám mohou pomoci například při vývoji v multiplatformním prostředí, kde se vyskytují databázové stroje různých dodavatelů. Makra obsahují aparát pro podmíněné volání příkazů. FireDAC disponuje vestavěným textovým preprocesorem, který umožňuje používat při sestavování SQL příkazu makra a překlenout tak rozdíly v syntaxi používané různými dodavateli. Příkladem může být rozšíření příkazu "select" pro omezení počtu vrácených záznamů.

Zatímco pro databázový stroj Microsoft SQL je syntaxe následující:

SELECT TOP 5 * FROM firma;

pro dosažení stejného výsledku musíme v DB Interbase použít:

SELECT FIRST 5 * FROM firma;

S použitím FireDAC maker lze tento příkaz zapsat:

SELECT {IF MSSQL} TOP {fi}{IF INTRBASE} FIRST {fi} 5 * FROM firma;

Podpora parametrů a maker musí být aktivní, to znamená příslušné parametry "Command Text Processing" musí být nastaveny na "True".

Nastavení Command Text Processing Options