Objekt Field
Doc. Dr. Vladimír Homola, Ph.D.
Hodnoty jsou v tabulkách relačních databází umístěny v datových polích. Objekt Field (datové pole) representuje jednak hodnotu řádků nějakého sloupce, ale především charakteristiky dat v tomto sloupci umístěných. Popis struktury tabulky relační databáze, data jednoho jejího řádku, ale i index nebo výsledek příkazu Select SQL tvoří ne jedno datové pole, ale v naprosté většině polí (sloupců) více. Proto různé "nadřazené" objekty (Index, TableDef aj.) mají kolekce Fields datových polí - objektů Field.
Použití objektu Field je podmíněno dostupností knihovny DLL, ve které je definován. V prostředí Visual Basic se tak učiní pomocí menu položky References... - ta je umístěna v hlavním menu Project v případě samostatného překladače Basicu, nebo v hlavním menu Tools v případě volání Visual Basicu z aplikace (Excelu, Accessu, Wordu atd.). Z nabídek knihoven se volí ta, která začíná DAO. Připojená čísla označují verzi, volí se podle potřeby (většinou ta nejvyšší). Verze znamenají "stupeň vývoje" struktury databáze Microsoftu (MDB): např. program Access dodávaný s Office 97 používá DAO350.DLL, Access dodávaný s Office 2000 používá DAO360.DLL.
Tyto knihovny obsahují DAO příslušné verze objektových modelů. DAO (Data Access Objects - objekty pro přístup k datům) je množina objektů, které umožňují klientům automatizace OLE programově přistupovat k datům a modifikovat zdroje dat. Jsou použity v programech Access, Visual Basic - obecně ve všech aplikacích, které zpracovávají data uložená jako Microsoft Jet databáze. Dále je možno zpracovávat všechny formáty, které Microsoft Jet podporují (jako např. zdroje dat v ODBC včetně SQL serveru, FoxPro, Paradoxu aj.).
Kolekce Properties (Vlastnosti) obsahuje objekty třídy Property (Vlastnost). Ani kolekce vlastností, ani jednotlivé vlastnosti nejsou při běžném zpracování zapotřebí. Využívá je např. program Access (viz) a v tomto článku nejsou podrobněji popsány.
Shora zmíněná kolekce Properties (Vlastnosti) obsahuje objekty třídy Property (Vlastnost). Metoda CreateProperty vytváří nový objekt třídy Property; po naplnění vlastností tohoto nového objektu je pak možno jej přidat do kolekce Properties. Ani kolekce vlastností, ani jednotlivé vlastnosti nejsou při běžném zpracování zapotřebí. Využívá je např. program Access (viz) a v tomto článku nejsou podrobněji popsány.
Metoda připojí další data daná výrazem typu String na konec datového pole typu Memo nebo LongBinary v otevřené tabulce dat representované objektem Recordset, a to do pole v aktuálním řádku této tabulky.
Syntaxe je následující:
rset ! fld.AppendChunk src
Značí přitom:
rset - proměnná třídy Recordset, která representuje data otevřené tabulky relační databáze; obsahuje kolekci Fields jako množinu datových polí aktuálního řádku.
fld - objektová proměnná reprezentující jméno objekty Field, jehož typ je dbMemo (pole typu memo) nebo dbLongBinary (pole typu Long Binary).
src - výraz typu String ve významu dat, která se připojí na konec pole fld.
Opačná k metodě AppendChunk je metoda GetChunk pro získání části nebo celého obsahu pole Memo nebo LongBinary.
Metoda AppendChunk - volána poprvé po vytvoření řádku (nebo inicializaci editace) metodou AddNew (nebo Edit) objektu Recordset - prostě zařadí data daná parametrem src do pole a přepíše přitom event. existující data. Další volání metody AddChunk v rámci téhož Edit nebo AddNew (před Update) už data přidávají.
Příklad:
Dim db As Database, rs As Recordset
Set db = DBEngine.OpenDatabase("C:\KURS\DOMACNOST.MDB")
Set rs = db.OpenRecordset("VYDAJE")
...
rs.AddNew
rs!DATUM = #4/4/2002#
rs!CENA = 99
rs!NAKOUPENO = "Fernet"
rs!POZNAMKA.AppendChunk "Nedobrej, hořkej"
rs.Update
Metoda je funkcí vracející data z datového pole typu Memo nebo LongBinary v otevřené tabulce dat representované objektem Recordset, a to z pole v aktuálním řádku této tabulky.
Syntaxe je následující:
var = rset ! fld.GetChunk (off, num)
Značí přitom:
var - proměnná typu String, do níž se obsah pole umístí.
rset - proměnná třídy Recordset, která representuje data otevřené tabulky relační databáze; obsahuje kolekci Fields jako množinu datových polí aktuálního řádku.
fld - objektová proměnná reprezentující jméno objekty Field, jehož typ je dbMemo (pole typu memo) nebo dbLongBinary (pole typu Long Binary).
off - výraz typu Long určující, kolik bytů se na začátku pole fld přeskočí, než se začnou byty vybírat do výsledku. Je-li hodnotou 0, nepřeskočí se na začátku žádný byte a výběr tedy začne prvním bytem pole.
num - výraz typu Long určující, kolik bytů bude tvořit výsledek. Je-li hodnota větší, než kolik v poli zbývá bytů, vrací se jen tolik bytů, kolik v poli zbývá.
Příklad:
Dim db As Database, rs As Recordset
Set db = DBEngine.OpenDatabase("C:\KURS\DOMACNOST.MDB")
Set rs = db.OpenRecordset("VYDAJE")
...
MsgBox "Poznámka: " + rs!POZNAMKA.GetChunk(0,9999)
Metoda je funkcí, která vytvoří a předá nový objekt třídy Property (Vlastnost), který je poté možno přidat do kolekce uživatelských vlastností. Rozumné využití je v jednoduchých aplikacích snad jen tehdy, připravuje-li aplikace databázi pro použití Accessem a má-li Access mít přímo nastavené vlastnosti polí programem - aby se to nemuselo dělat "ručně" v návrhovém prostředí Accessu.
Syntaxe je následující:
fl.CreateProperty(jm, typ, hodn)
kde značí
fl - objekt třídy Field, tj. datové pole, jehož metoda se volá
jm - výraz typu String ve smyslu jména vlastnosti, která má vzniknout
typ - celočíselný výraz ve smyslu typu vlastnosti, která má vzniknout. Nejčastěji pojmenovaná konstanta definovaná v knihovně DAO (dbByte, dbInteger, dbLong, dbSingle, dbDouble, dbDate, dbText, dbBoolean)
hodn - výraz typu Variant, podtypu "typ" ve smyslu hodnoty nově vytvářené vlastnosti.
Nově vytvořenou vlastnost je možno přidat do kolekce (uživatelských) vlastností, kde ji pak najdou a pracují s ní jiné aplikace (např. zmíněný Access). V tom případě je však nutno dbát na to, aby jméno i typ přesně souhlasily s tím jménem a typem, jak je očekává tato aplikace (např. Access). Uživatelské vlastnosti se tedy musí vytvářet se znalostí těchto jmen a typů - pro Access jsou uvedeny v nápovědě Accessu.
S uživatelskými vlastnostmi je však jeden problém: zpracovávaná databáze zpracovávaná i jinou aplikací je může a nemusí mít vytvořené touto jinou aplikací. Náš program pak může havarovat ze dvou důvodů: chce vlastnost nastavit, ale ona ještě neexistuje, nebo chce vlastnost vytvořit a ona naopak už existuje. Proto se doporučuje využívat následující postup realizovaný níže uvedenou funkcí SetAccProp:
Program se nejprve pokusí danou vlastnost přímo nastavit; předpokládá ovšem přitom, že může dojít k chybě.
Jestliže k chybě nedojde, vlastnost už existuje, nastaví se na požadovanou hodnotu a funkce končí.
Jestliže ale neexistuje, pak dojde k chybě. Chybová část funkce proto vlastnost vytvoří a nastaví na požadovanou hodnotu.
Function SetAccProp(qO As Object, qS As String, qT
As Integer, qV As Variant) As Boolean
' qO je objekt (např. pole), jehož vlastnost se
nastavuje
' qS je jméno nastavované (vytvářené)
vlastnosti
' qT je typ vlastnosti
' qV je nastavovaná hodnota
Const lNeex As Integer = 3270 ' Číslo chyby pro
"Property neexistuje"
Dim lP As Property
On Error GoTo lE
' Pokus o explicitní nastavení property kolekce
' (když se nepovede, tak to způsobí chybu a
pokračuje na lE):
qO.Properties(qS) = qV
' Když se to povedlo (už existuje), pokračuje to
tady:
qO.Properties.Refresh
SetAccProp = True
lX:
Exit Function
lE:
' Když se nastavení nahoře nepovedlo, pokračuje
to tady:
If Err = lNeex Then
' Když číslo chyby znamená
neexistující člen kolekce, tak se
' vytvoří property, nastaví
typ a počáteční hodnota:
Set lP = qO.CreateProperty(qS,
qT, qV)
' Připojení property ke
kolekci:
qO.Properties.Append lP
qO.Properties.Refresh
SetAccProp = True
Else
SetAccProp = False
End If
Resume lX
End Function
Povinná vlastnost - jméno datového pole. Vlastnost je typu String, jeho hodnota je užita jako klíč kolekce Fields polí, proto musí být v rámci tabulky relační databáze jedinečný.
V databázích Microsoft Jet může být jméno pole = jméno sloupce tabulky (pozor! není to nadpis sloupce při zobrazení dat; nadpisem je vlastnost Caption) až 64 znaků. Různé jiné databázové systémy mohou mít jiná omezení na délku i na tvar jména. Vřele se doporučuje jako jméno volit identifikátor o max. 10 znacích, tj. posloupnost pouze písmen (bez diakritiky) a cifer začínající písmenem.
Použije-li se objekt Field v definici struktury tabulky relační databáze (kolekce Fields objektu TableDef), lze vlastnost Name měnit (tj. přiřazovat do ní), v ostatních případech lze jen číst (tj. zjišťovat její hodnotu).
Povinná vlastnost - typ datové hodnoty v daném poli. Vlastnost je typu Long, při jejím zadávání se užívá pojmenovaných konstant definovaných v DLL knihovně. Některé konstanty jsou uvedeny v následující tabulce:
Konstanta | Popis |
dbBoolean | Logická hodnota |
dbByte | Celočíselná hodnota od 0 do 255 |
dbChar | Znaková hodnota |
dbDate | Datum resp. čas |
dbDouble | Desetinné číslo s dvojnásobnou přesností |
dbInteger | Celé číslo od -32000 do +32000 |
dbLong | Celé číslo od -2mld do +2mld |
dbLongBinary | Long Binary (OLE Object) |
dbMemo | Text v poli Memo |
dbSingle | Desetinné číslo s jednoduchou přesností |
dbText | Hodnota typu String na max. 255 znaků |
Použije-li se objekt Field v definici struktury tabulky relační databáze (kolekce Fields objektu TableDef), lze vlastnost Type měnit (tj. přiřazovat do ní), v ostatních případech lze jen číst (tj. zjišťovat její hodnotu).
Vlastnost typu Integer, jejíž hodnotou může být libovolné nezáporné číslo typu Integer, udržuje informaci o pozici objektu Field v kolekci Fields. Přibližně lze říci, že hodnota udává číslo sloupce v tabulce relační databáze, jsou-li sloupce číslovány od nuly.
Obecně platí, že ordinální pozice objektu v kolekci je dána pořadím zařazování do kolekce. První zařazený objekt má pozici 0, druhý 1 atd. Poslední zařazený má tedy pozici (Kolekce.Count-1).
Hodnotu OrdinalPosition lze změnit a tím určit jiné pořadí (např. sloupců) při zpracování tabulky. Např. SQL příkaz SELECT * FROM VYDAJE vrátí množinu záznamů, v němž je pořadí sloupců dáno aktuálními hodnotami OrdinalPosition jednotlivých datových polí.
Jestliže dvě nebo více datových polí mají stejnou hodnotu ordinální pozice, jsou řazeny abecedně. Má-li např. pole DATUM i pole CENA ordinální pozici 3, pak je dodána nejprve CENA a teprve pak DATUM bez ohledu na pořadí zařazování do kolekce.
Na hodnotu OrdinalPosition lze částečně pohlížet i jako na další klíč v kolekci (vedle jména - Name - pole). Je-li totiž polí 5, nemusí být jejich ordinální čísla 0, 1, 2, 3 a 4 - mohou být např. 3, 56, 78, 79 a 98. Datová pole jsou vždy vracena v neklesající posloupnosti ordinálních čísel s tím, že při stejných hodnotách rozhoduje jméno pole.
Důležitá a pochopitelná informace: změna ordinální pozice tabulky relační databáze se projeví až po volání metody Refresh kolekce TableDefs dané tabulky (buď přímo nebo zprostředkovaně např. při uzavření a novém otevření množiny záznamů nebo celé databáze).
Obě vlastnosti jsou typu Boolean (logická hodnota: ano / ne, True / False).
Povolit nulovou délku (Allow Zero Length) se uplatní v datových polích typu Text nebo Memo. Je-li Ano (True), pak pole může obsahovat prázdný řetězec znaků ("") - řetězec, neobsahující žádný znak, jeho délka je nula.
Požadovaná (Required) hodnota datového pole určuje, zda datové pole může obsahovat hodnotu Null. Tato hodnota indikuje chybějící, neznámá, nezadaná data. V Basicu se pro označení této indikace používá klíčové slovo Null. Je-li hodnota vlastnosti Required rovna Ano (True), pak pole může obsahovat hodnotu Null. Pozor však: některá pole nemohou logicky obsahovat hodnotu Null, např. ta, která jsou obsažena v primárním klíči.
Vlastnosti jsou využity mechanismem kontroly dat. Ověřovací pravidlo (Validation Rule) je hodnota typu String obsahující text, který při vyhodnocení nad aktuálním záznamem (řádkem) tabulky relační databáze musí být platným logickým výrazem (např. "CENA<100 and CENA>70") - tedy výrazem, který po vyhodnocení odevzdá hodnotu Ano (True) nebo Ne (False). Ověřovací text (Validation Text) je hodnota typu String ve smyslu nějakého hlášení výstižně popisující chybu.
ValidationRule jako vlastnost nějakého datového pole (Field) může ve výraze obsahovat odkaz právě jen na toto datové pole. Nesmí obsahovat uživatelské funkce ani agregační funkce SQL. Navíc: desetinné číselné konstanty musí být vždy zapsány s desetinnou tečkou a datumové konstanty v americkém formátu, bez ohledu na národní prostředí nastavené systémem.
Výraz se vyhodnocuje v okamžiku změny hodnoty pole (Edit) nebo při přidávání nových hodnot (AddNew). Jestliže po vyhodnocení výrazu, který je obsahem ValidationRule, je hodnota Ano, aplikace pokračuje "normálně" dál.
Jestliže však je to hodnota Ne, dojde k zachytitelné chybě. V tom případě je do kolekce DBEngine.Errors zařazen nový objekt třídy Error. V jeho poli Description (popis chyby) je buď hodnota přiřazená do ValidationText, nebo - nebyl-li ValidationText zadán - text výrazu přiřazeného do ValidationRule.
Orig. 4 / 1999
Rev. 07 / 2002