Objekt Field

Doc. Dr. Vladimír Homola, Ph.D.

Úvod

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 objektu Field

Properties

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.

Metody objektu Field

CreateProperty

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.

AppendChunk

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:

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

GetChunk

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:

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)

CreateProperty

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čí

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:

 

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

Vlastnosti objektu Field

Name

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).

Type

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).

OrdinalPosition

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).

AllowZeroLength, Required

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.

ValidationRule, ValidationText, ValidateOnSet

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