Jak na to? DatabßzovΘ formulß°e
V tomto Φlßnku si vytvo°φme formulß° nad jednoduchou databßzφ, slou₧φcφ k zadßvßnφ informacφ o zam∞stnancφch fiktivnφ firmy. Jde o databßzi Access s s nßsledujφcφ strukturou:
Pro p°φstup k databßzi pou₧ijeme technologii ADO. Aby byl p°φklad p°φstupn² pro co nejv∞tÜφ poΦet z vßs, nebudeme pou₧φvat nejnov∞jÜφ verzi, ale verzi 2.0. Tzn. otev°ete si nov² projekt a z menu Project -> References vyberte odkaz na knihovnu Microsoft ActiveX Data Object 2.0 Library. Nejd°φve se musφme rozhodnout, jak budeme data zobrazovat. NejjednoduÜÜφ je samoz°ejm∞ pou₧φt prvek Data. Proto₧e vÜak tento prvek p°inßÜφ urΦitß omezenφ a v budoucnu bude projekt pravd∞podobn∞ rozÜφ°en, obejdeme se bez prvku Data a obslou₧φme si vÜe sami. Bude to sice vφce pracn∞jÜφ, ale nakonec nßm to p°inese vφce v²hod.
Jako prvnφ si vytvo°φme k≤d pro zobrazovßnφ dat. Vlo₧te na formulß° pole Üesti TextBox∙ s nßzvem
TextBoxy mßme nastaveny, te∩ jeÜt∞ jak zobrazit data. NejjednoduÜÜφ bude, kdy₧ u₧ nepou₧φvßme
prvek Data, p°ipojit TextBoxy na otev°en² Recordset. Proto ka₧dΘmu nastavφme
jeÜt∞ vlastnost
A m∙₧eme zaΦφt psßt k≤d pro zobrazenφ. Nejd°φve musφme otev°φt spojenφ na databßzi
pomocφ objektu
Private lconMain As New ADODB.Connection Private WithEvents lrsMain As ADODB.Recordset Private Sub Form_Load() Dim tmpText As TextBox 'Otevri spojeni lconMain.CursorLocation = adUseClient lconMain.Open "PROVIDER=Microsoft.Jet.OLEDB.3.51;Data Source=" & _ App.Path & "\data.mdb;" 'Otevri tabulku Set lrsMain = New ADODB.Recordset lrsMain.Open "SELECT * FROM Zamestnanci ORDER BY prijmeni", _ lconMain, adOpenStatic, adLockOptimistic 'Nastaveni textboxu For Each tmpText In txtZam Set tmpText.DataSource = lrsMain Next End Sub
Nejd°φve jsme tedy otev°eli spojenφ, potom tabulku Zamestnanci, set°φd∞nou podle sloupce primeni
a nakonec jsme nastavili otev°en² Recordset jako zdroj pro jednotlivΘ TextBoxy. Spustφte-li te∩
program, hned se zobrazφ pokud jsou v databßzi n∞jakΘ zßznamy, hned se zobrazφ prvnφ, proto₧e vlastnost
Co se vÜak stane v p°φpad∞, ₧e n∞kdo bude chtφt zam∞stnance °adit podle jmΘna? Budete muset upravit k≤d, znovu zkompilovat program, vytvo°it novΘ instalaΦnφ diskety atd. Proto si vytvo°φme dotaz pro v²b∞r zam∞stnanc∙ p°φmo v databßzi. Pokud bude chtφt n∞kdo zm∞nu, nebude to a₧ takov² problΘm (samoz°ejm∞, pokud bude mφt Access). Dotaz se bude jmenovat qryZamestnanci a bude vypadat takto:
JedinΘ co se potom zm∞nφ je °ßdek, kde otevφrßme Recordset.
lrsMain.Open "qryZamestnanci", lconMain, adOpenStatic, adLockOptimistic
Te∩ mßme vytvo°en² k≤d, kter² vÜak zatφm zobrazφ pouze prvnφ zßznam. Proto si vytvo°φme Φty°i tlaΦφtka,
kterß budou slou₧it k pohybu mezi zßznamy. Vytvo°φme je op∞t jako pole, kterΘ nazveme
Private Sub cmdPohyb_Click(Index As Integer) If lrsMain.RecordCount > 0 Then Select Case Index Case 0 'Prvni lrsMain.MoveFirst Case 1 'Predchozi lrsMain.MovePrevious If lrsMain.BOF Then lrsMain.MoveFirst Case 2 'Dalsi lrsMain.MoveNext If lrsMain.EOF Then lrsMain.MoveLast Case 3 'Na konec lrsMain.MoveLast End Select End If End Sub K≤d pro pohyb mßme vytvo°en², ale jeÜt∞ nßm chybφ jedno pole a to je usek. Pole usek je v tabulce Zamestnanci pouze ΦφselnΘ, co₧ nikomu moc ne°ekne, mnohem lepÜφ je u₧ivateli nabφdnout seznam ·sek∙ podle nßzvu. Do tabulky vÜak chceme ulo₧it Φφslo. Nejvhodn∞jÜφm prvkem pro takovΘ zobrazenφ je ComboBox. Abychom nemuseli hodnoty seznamu plnit sami, pou₧ijeme rad∞ji DataCombo, kterΘ navß₧eme na otev°enou tabulku Useky.
P°idejte do projektu prvek DataCombo (menu Project -> Components, polo₧ka
Microsoft DataList Controls 6.0) a vlo₧te jej na formulß°. Nazveme si jej t°eba
V²sledkem dotazu bude tabulka se dv∞ma sloupci, prvnφ bude Φφslo ·seku a druh² kombinace Φφsla s nßzvem.
Te∩ musφme sprßvn∞ navßzat prvek
dcUsek.DataField = "usek" Set dcUsek.DataSource = lrsMain 'Seznam useku Set lrsUseky = New ADODB.Recordset lrsUseky.Open "qryUseky", lconMain, adOpenStatic, adLockOptimistic dcUsek.BoundColumn = "id_useku" dcUsek.ListField = "titulek" Set dcUsek.RowSource = lrsUseky
Nejd°φve jsme tedy prvku °ekli, v kterΘ tabulce (Recordsetu) a do kterΘho sloupce bude uklßdat hodnoty. Dßle
jsme otev°eli nov² Recordset
Tφmto jsme vytvo°ili kompletnφ k≤d pro zobrazovßnφ dat z tabulky Zamestnanci. Ale naÜemu k≤du jeÜt∞ n∞co
chybφ. Vytvo°ili jsem jednu instanci objektu
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) lrsUseky.Close Set lrsUseky = Nothing lrsMain.Close Set lrsMain = Nothing lconMain.Close Set lconMain = Nothing End Sub
Prohlφ₧eΦ dat jsme u₧ vytvo°ili, te∩ p°ijde to nejd∙le₧it∞jÜφ, a to je vklßdßnφ, editace a mazßnφ dat.
SamotnΘ akce nejsou p°φliÜ slo₧itΘ. P°idejte na formulß° t°i tlaΦφtka. Prvnφ,
Private Sub cmdNovy_Click() lrsMain.AddNew End Sub Private Sub cmdUlozit_Click() lrsMain.UpdateBatch adAffectAll lrsMain.MoveLast End Sub Private Sub cmdZrusit_Click() lrsMain.CancelUpdate End Sub
Metoda
DalÜφ z vlastnostφ, kterΘ chceme p°idat, je editace dat. Proto₧e objekt Recordset umo₧≥uje vyvolat editaci bez
toho, abychom museli volat metodu
Private Sub cmdUlozit_Click() If lrsMain.EditMode = adEditAdd Then lrsMain.UpdateBatch adAffectAll lrsMain.MoveLast Else lrsMain.UpdateBatch adAffectAll End If End Sub
Poslednφm ·kolem je p°idßnφ tlaΦφtka pro mazßnφ zßznam∙. TlaΦφtko pojmenujeme t°eba
Private Sub cmdSmazat_Click() With lrsMain If .RecordCount > 0 Then .Delete adAffectCurrent If .RecordCount > 0 Then .MoveNext If .EOF Then .MoveLast Else .Requery End If End If End With End Sub DalÜφ v∞c, kterß u₧ivateli pom∙₧e k lepÜφ orientaci v programu, je zapφnßnφ a vypφnßnφ tlaΦφtek, kterß jsou v danou chvφli pou₧itelnß. Logicky to bude fungovat nßsledovn∞.
Proto₧e zapφnßnφ a vypφnßnφ tlaΦφtek bude skoro v ka₧dΘ udßlosti formulß°e, vytvo°φme si pro n∞j proceduru.
Private Sub NastavTlacitka(ByVal bolVal As Boolean) Dim cmdp As CommandButton cmdNovy.Enabled = bolVal cmdUlozit.Enabled = IIf(lrsMain.RecordCount > 0, True, False) cmdSmazat.Enabled = IIf((lrsMain.RecordCount > 0), bolVal, False) cmdZrusit.Enabled = Not bolVal For Each cmdp In cmdPohyb cmdp.Enabled = IIf((lrsMain.RecordCount > 0), bolVal, False) Next cmdp End Sub Volßnφ procedury p°idßme do t∞chto udßlostφ:
Cel² hotov² p°φklad i s databßzφ si m∙₧ete zkopφrovat. Oproti tomu, co jsme vytvo°ili zde,
mß jednoduÜe oÜet°eny chyby, na kterΘ jsme v textu nedbali a takΘ jednu malou zm∞nu p°i p°idßvßnφ zßznamu.
Co by se vÜak hodilo do databßzovΘho formulß°e je vyhledßvßnφ zßznam∙ a zobrazovßnφ Φφsla aktußlnφho
a celkovΘho poΦtu zßznam∙. Zkuste si to vytvo°it ka₧d² sßm a zaÜlete nßm vaÜe °eÜenφ. NejlepÜφ zve°ejnφme v dalÜφm Φφsle
(nßpov∞da - na zobrazenφ aktußlnφho zßznamu vyu₧ijte udßlost |