Třída Data

 

Třída data poskytuje metody a funkce pro čtení a zápis dat do databází Varia. Kromě toho, že usnadňuje práci programátorům, sjednocuje způsob přístupu k datům. Proto doporučujeme používat pro přístup k datům přednostně objekt Data a Databaze z VarioLib.

Novou instanci třídy Data získáte voláním funkcí AdHocDotaz, AdHocDotazDB nebo UlozenyDotaz (viz objekt Vario.Databaze). Tyto funkce používají rozšířenou syntaxi SQL dotazů.

Syntaxe parametru SQLDotazu

Dotaz se může skládat až ze 4 částí, oddělených středníky:

(1) Databáze; (2)Parametry; (3)Výchozí SQL výraz; (4) Alternativní SQL výraz pro prostředí ODBC.

Syntaxe SQL příkazů pro objekt data je následující:

 

[Firmy | Data#### | ????#### ;]

[PARAMETERS ... ;]

SELECT {INSERT | UPDATE | DELETE } Pole FROM Tabulka [WHERE... ][GROUP BY... ][HAVING... ][ORDER BY... ];

[ PASSTHROUGH=*; | PASSTHROUGH=SELECT...; | ODBC=SELECT...; ]

 

Kde:

1. sekce Databáze [Firmy | Data#### | ????#### ;]

Používá se pro uložené dotazy. Před středníkem je název databáze.

Například: Firmy; nebo Data####; nebo DMaj####;

Místo pokud název obsahuje #### dosadí se aktuální číslo dat. Například Data#### = Data0001.

Poznámka: Funkce AdHocDotaz obsahuje název databáze jako samostatný parametr, takže není tuto sekci potřeba používat. Nicméně můžete v parametru uvést prázdný název databáze a místo něj dát název do této sekce.

 

2. sekce Parametry [PARAMETERS ... ;]

Deklarace parametrů dle syntaxe jazyka SQL v prostředí MS JET. Pokud dotaz používá jeden parametr, není nezbytně nutné tuto sekci deklarovat (je to ovšem dobrá praxe).

Pokud dotaz obsahuje více než jeden parametr, je NUTNÉ deklarovat parametry kvůli pořadí. Pořadí parametrů v deklaraci dotazu se musí shodovat s pořadím parametrů předaným funkci AdHocDotaz (AdHocDotazDB, UlozenyDotaz).

 

3. sekce Výchozí SQL výraz SELECT {INSERT | UPDATE | DELETE }...

SQL výraz dle syntaxe MS Jet.

 

4. sekce Alternativní SQL výraz pro ODBC

Pokud není sekce uvedena, použije se výchozí varianta pro prostředí MS Jet (mdb databáze) i ODBC (MS SQL databáze).

Je-li sekce uvedena, použije se pro ODBC prostředí (MS SQL server) SQL výraz uvedený v této sekci.

Pokud je v sekci uvedeno PASSTHROUGH=*; použije se výchozí varianta dotazu volaná předávacím dotazem. Předávací dotazy jsou rychlejší, ale výsledek je pouze pro čtení, a syntaxe SQL výrazu musí být kompatibilní s Transact SQL.

Pokud je uvedeno PASSTHROUGH=SELECT...; zavolá se SQL výraz předávacím dotazem (výkonné, ale výsledek je jen pro čtení a musíte použít Transact SQL).

Pokud je uvedeno ODBC=SELECT...; nepoužije se předávací dotaz, ale máte možnost přizpůsobit SQL výraz pro prostředí ODBC (optimalizovat výraz nebo obejít chyby ODBC překladače).

 

Příklady:

Jednoduchý dotaz bez parametrů

SQL = "SELECT Count(*) AS Pocet_knih FROM Knihy WHERE ((Typ_knihy='U') AND (Agenda='Adresář'));"

 

s parametry

SQL = "PARAMETERS pTypKnihy Text, pAgenda Text;SELECT Count(*) AS Pocet_knih FROM Knihy WHERE ((Typ_knihy=[pTypKnihy]) AND (Agenda=[pAgenda]));"

 

s parametry a povoleným voláním výchozí varianty předávacím dotazem

SQL = "PARAMETERS pTypKnihy Text, pAgenda Text;SELECT Count(*) AS Pocet_knih FROM Knihy WHERE ((Typ_knihy=[pTypKnihy]) AND (Agenda=[pAgenda]));PASSTHROUGH=*;"

 

Uložené dotazy s parametrem si můžete vypsat z VarioLib

Debug.Print Vario.Databaze.Dotazy.Otevri_firmu  

Debug.Print Vario.Databaze.Dotazy.Otevri_Produkt

Debug.Print Vario.Databaze.Dotazy.Otevri_doklad

 

Dotaz se sekcí PASSTHROUGH=

Debug.Print Vario.Databaze.Dotazy.R_Predkontace_produktu

 

Dotaz se sekcí ODBC=

Debug.Print Vario.Databaze.Dotazy.R_Disponibilni_prijmy_pro_vratky_prijemky

 

Příklady použití třídy Data

 

' Užití DejHodnotu bez parametru, podmínka WHERE zadaná řetězcem (Problém s apostrovem v řetězci)
    SQL = "SELECT Firmy.Ulice FROM Firmy WHERE Firmy.Firma='Bago'"
    Debug.Print Vario.Databaze.AdHocDotaz(dbData, SQL).DejHodnotu & " >>> DejHodnotu bez parametru"
   
' Užití DejHodnotu s parametrickým dotazem (Odstraňuje problém s apostrovem v podmínce WHERE)
    SQL = "PARAMETERS parFirma text;SELECT Firmy.Ulice FROM Firmy WHERE Firmy.Firma=[parFirma]"
    Debug.Print Vario.Databaze.AdHocDotaz(dbData, SQL, "Bago").DejHodnotu & " >>> DejHodnotu s parametrem"
   
   
' Užití DejHodnoty
    SQL = "PARAMETERS parUlice text;SELECT Firmy.Firma, Firmy.Ulice FROM Firmy WHERE Firmy.Ulice=[parUlice]"
    If Vario.Databaze.AdHocDotaz(dbData, SQL, "Malinova 11").DejHodnoty(tFirma, tUlice) Then
        Debug.Print tFirma & " - " & tUlice & " >>> DejHodnoty"
    End If
   
' Užití DejRadek
    SQL = "PARAMETERS parMesto text;SELECT Firmy.Firma, Firmy.Ulice, Firmy.Mesto, Firmy.Typ_kontaktu FROM Firmy WHERE Firmy.Mesto=[parMesto]"
    Radek = Vario.Databaze.AdHocDotaz(dbData, SQL, "Praha 1").DejRadek
    If IsArrayInicialized(Radek) Then       ' Podmínka ošetřující prázdný výsledek dotazu
        Debug.Print "Firma: " & Radek(0), "Ulice: " & Radek(1) & " >>> DejRadek"
    End If

' Užití DejSloupec
SQL = "PARAMETERS parMesto text;SELECT Firmy.Firma FROM Firmy WHERE Firmy.Mesto=[parMesto]"
Sloupec = Vario.Databaze.AdHocDotaz(dbData, SQL, "Kladno").DejSloupec
If IsArrayInicialized(Sloupec) Then ' Podmínka ošetřující prázdný výsledek dotazu
For Each N In Sloupec
Debug.Print "Firma: " & N & " >>> DejSloupec"
Next
End If


' Užití DejTabulku
SQL = "PARAMETERS parOrganizace text;SELECT Firmy.Firma, Firmy.Ulice, Firmy.Mesto, Firmy.Typ_kontaktu FROM Firmy WHERE Typ_kontaktu=[parOrganizace]"
If Vario.Databaze.AdHocDotaz(dbData, SQL, "Organizace").DejTabulku(Tabulka) Then
Dim i As Long

For i = 0 To UBound(Tabulka, 2)
Debug.Print "Firma: " & Tabulka(0, i), "Ulice: " & Tabulka(1, i) & " >>> DejTabulku"
Next
End If

' Užití DejRecordset
SQL = "PARAMETERS parOrganizace text;SELECT Firmy.Firma, Firmy.Ulice, Firmy.Mesto, Firmy.Typ_kontaktu FROM Firmy WHERE Firmy.Typ_kontaktu=[parOrganizace]"
Set R = Vario.Databaze.AdHocDotaz(dbData, SQL, "Organizace").DejRecordset(KeCteni)
If Not R.EOF Then
R.MoveLast ' Přesun na poslední záznam v Recordseru
Debug.Print "Firma: " & R!Firma.Value, "Ulice: " & R!Ulice.Value & " >>> DejRecordset"
Debug.Print R.RecordCount & " >>> DejRecordset"
End If
R.Close
Set R = Nothing ' Uzavření Recordsetu




' Užití ZapsatData - Zápis dat do tabulky
SQL = "PARAMETERS parFirma text;SELECT Firmy.Udaj_1 FROM Firmy WHERE Firma=[parFirma]" 'TODO ověřit jestli musím vybrat PK na SQL , Firmy.Firma ???
If Vario.Databaze.AdHocDotaz(dbData, SQL, "Bago").ZapsatData("Hodnota do Udaj_1") Then
End If

' Užití DejRecordset - Otevření Recordsetu pro úpravy
SQL = "PARAMETERS parFirma text;SELECT Firmy.Firma, Firmy.Udaj_1 FROM Firmy WHERE Firma=[parFirma]"
Set R = Vario.Databaze.AdHocDotaz(dbData, SQL, "Bago").DejRecordset(UplneRizeni + UvolnitZamky)
If Not R.EOF Then
R.Edit
R!Udaj_1.Value = "Hodnota do Udaj_1"
R.Update
End If
R.Close
Set R = Nothing ' Uzavření Recordsetu

' Užití Execute - Mazání z tabulky
SQL = "PARAMETERS parFirma text;DELETE FROM Firmy WHERE Firma=[parFirma]"
PocetOdstranenychZaznamu = Vario.Databaze.AdHocDotaz(dbData, SQL, "Filtr pro firmu").Execute(dbFailOnError)
On Error GoTo Chyba

' Získání objektu Data pomocí Vario.Databaze.AdHocDotaz - viz Příklad 1
SQL = "PARAMETERS parFirma text;SELECT Firmy.Ulice FROM Firmy WHERE Firmy.Firma=[parFirma]"
Debug.Print Vario.Databaze.AdHocDotaz(dbData, SQL, "Bago").DejHodnotu & " >>> AdHocDotaz"

' Získání objektu Data pomocí Vario.Databaze.AdHocDotazDB
SQL = "PARAMETERS parFirma text;SELECT Test_Kontakty.Ulice FROM Test_Kontakty WHERE Test_Kontakty.Firma=[parFirma]"
Debug.Print Vario.Databaze.AdHocDotazDB(Priklady.Databaze, SQL, "Bago").DejHodnotu & " >>> AdHocDotazDB"

' Získání objektu Data pomocí Vario.Databaze.UlozenyDotaz

'Uložené dotazy jsou vlastnostmi objektu Dotazy. SQL výraz uloženého dotazu získáte vypsáním vlatnosti:
Debug.Print Vario.Databaze.Dotazy.Otevri_banku

'Objekt data zíkáte volámím UlozenyDotaz, kde uvedete název uloženého dotazu = název vlastnosti objektu Dotazy (+ parametry, pokud je dotaz vyžatuje)
Debug.Print Vario.Databaze.UlozenyDotaz("Otevri_banku", "Bago").DejHodnotu & " >>> UlozenyDotaz"




SQL = "SELECT Agenda, Modul, Tabulka, Primarni_klic FROM Agendy;PASSTHROUGH=*;" 'Používejte předávací (PASSTHROUGH=) variantu pro zvýšení rychlosti když jsou data na SQL
If Pomucky.TabulkaExistuje(Vario.Profil.TempDB, "xAgendy") Then
Vario.Profil.TempDB.Execute "DELETE * FROM xAgendy" ' Vymazání z tabulky
Vario.Databaze.AdHocDotaz(dbFirmy, SQL).PridatDoTempTabulky "xAgendy", True ' Přidání do tabulky
Else
Vario.Databaze.AdHocDotaz(dbFirmy, SQL).VytvoritTempTabulku "xAgendy", True ' Vytvoření tabulky
End If
Set R = Vario.Databaze.AdHocDotaz(dbTemp, "SELECT Modul, Agenda FROM xAgendy").DejRecordset(KeCteni)
If Not R.EOF Then ' Načtení dat z tabulky
R.MoveFirst ' Přesun na první záznam v Recordseru
Debug.Print "Modul: " & R!Modul.Value, "Agenda: " & R!Agenda.Value
R.MoveLast ' Přesun na poslední záznam v Recordseru
Debug.Print "Modul: " & R!Modul.Value, "Agenda: " & R!Agenda.Value
Debug.Print "Počet záznamů v tabulce: "; R.RecordCount
End If
R.Close
Set R = Nothing ' Uzavření Recordsetu