IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 13 - Diář s databází ve VB.NET

V minulé lekci, List ve Visual Basic .NET, jsme si ukázali kolekci List.

Víme, že nám oproti poli umožňuje přidávat nové prvky za běhu programu a nemusíme se starat o jeho velikost. Dnes si ve VB.NET tutoriálu do Listu zkusíme uložit objekty.

Prvně jsem chtěl udělat databázi uživatelů, ale uživatele jsme tu již několikrát měli. Jelikož jsme se nedávno naučili datum a čas, naprogramujeme si diář. Do databáze budeme ukládat jednotlivé záznamy a vždy vypíšeme ten dnešní a zítřejší. Databáze to nebude samozřejmě ta v tom pravém slova smyslu (na to ještě nemáme zkušenosti), ale bude se jednat právě o List v operační paměti počítače. Bude umožňovat záznamy přidávat, hledat je podle data a mazat podle data a času.

Záznam

Prvně si udělejme třídu, jejíž instance budeme ukládat. Nazvěme ji Zaznam. Záznam v diáři se bude vázat k nějakému datu a času. Také bude obsahovat nějaký text. Např.: 12. ledna 2013 - Vyvenčit psa. To je asi vše, třída může vypadat takto:

Class Zaznam
    Public Property DatumCas As DateTime
    Public Property Text As String

    Public Sub New(datumCas As DateTime, text As String)
        Me.DatumCas = datumCas
        Me.Text = text
    End Sub

    Public Overrides Function ToString() As String
        Return DatumCas & " " & Text
    End Function
End Class

Třída v podstatě slouží jen k záznamu dat a nemá žádné metody (až na konstruktor a ToString()).

Databáze

Protože program bude o něco složitější, rozdělíme ho do více objektů (vrstev). Záznam máme, nyní si vytvoříme objekt Databaze, ve které budou záznamy uloženy. Opět bude mít privátní List, jako měl Losovac. Ten bude nyní typu Zaznam. Diář bude umožňovat záznamy přidávat, mazat a vyhledávat podle data. K projektu tedy přidáme třídu Databaze. Bude velmi podobná minulému Losovači:

Class Databaze
    Private zaznamy As List(Of Zaznam)

    Public Sub New()
        zaznamy = New List(Of Zaznam)()
    End Sub

End Class

Třída tedy slouží pouze pro manipulaci s daty. Obsahuje vnitřní kolekci zaznamy, ta se inicializuje v konstruktoru. Mohli bychom použít i inicializaci bez konstruktoru přímo u deklarace ve formě:

Private zaznamy As New List(Of Zaznam)

Dodejme třídě metody pro přidání, vymazání a vyhledání záznamu.

Přidání záznamu by mělo být jasné:

Public Sub PridejZaznam(datumCas As DateTime, text As String)
    zaznamy.Add(New Zaznam(datumCas, text))
End Sub

Jako druhou metodu přidejme nalezení záznamů v daný den. Metoda bude vracet List nalezených záznamů, protože jich pro ten den může být v databázi více. Záznamy budeme moci vyhledávat podle data i času nebo jen podle data. Můžeme tak najít záznamy v konkrétní den bez ohledu na to, v jakou jsou hodinu. Podle čeho budeme chtít vyhledávat bude udávat parametr dleCasu typu Boolean. Pokud bude False, hledáme jen podle data bez ohledu na čas. List si nejprve vytvoříme a poté do něj přidáváme záznamy, které odpovídají hledanému datu. Odpovídat musí buď celé datum a čas (pokud hledáme i podle času) nebo jen část .Date, pokud hledáme jen podle data. Naplněný List s nalezenými záznamy vrátíme.

Public Function NajdiZaznamy(datum As DateTime, dleCasu As Boolean) As List(Of Zaznam)
    Dim nalezene As New List(Of Zaznam)()
    For Each z As Zaznam In zaznamy
        ' dle času a data
        If ((dleCasu) AndAlso (z.DatumCas = datum)) OrElse ((Not dleCasu) AndAlso (z.DatumCas.[Date] = datum.[Date])) Then
            ' pouze dle data
            nalezene.Add(z)
        End If
    Next
    Return nalezene
End Function

Nakonec přidáme vymazání záznamů v určitou dobu. To provedeme pomocí metody NajdiZaznamy() a nalezené záznamy jednoduše proiterujeme a z Listu odstraníme. Budeme mazat podle přesného data i času, 2. parametr u metody NajdiZaznamy() bude tedy True:

Public Sub VymazZaznamy(datum As DateTime)
    Dim nalezeno As List(Of Zaznam) = NajdiZaznamy(datum, True)
    For Each z As Zaznam In nalezeno
        zaznamy.Remove(z)
    Next
End Sub

Diář

Nyní si přidáme k projektu poslední třídu, bude to samotný diář. Nazvěme ji Diar. Ten již bude obsahovat metody pro komunikaci s uživatelem. Všimněte si, jak aplikaci rozdělujeme a jednotlivé její části zapouzdřujeme. List je zapouzdřen v databázi, která nad ním postavila další metody pro bezpečnou manipulaci s jeho obsahem. Samotnou databázi nyní vložíme do diáře. Tím oddělíme logiku a práci s daty od komunikace s uživatelem a dalšími vstupy/výstupy programu. Třída Diar tedy bude komunikovat s uživatelem a data od něj předá databázi.

Přidejme si privátní instanci databáze, kterou si vytvoříme v konstruktoru:

Class Diar

    Private databaze As Databaze

    Public Sub New()
        databaze = New Databaze()
    End Sub

End Class

Jako další přidejme pomocnou metodu ZjistiDatumCas(), která vyzve uživatele k zadání data a času a vrátí instanci DateTime nastavenou na tuto hodnotu. Jediným bodem k přemýšlení je zde validace vstupu od uživatele:

Private Function ZjistiDatumCas() As DateTime
    Console.WriteLine("Zadejte datum a čas ve tvaru [1.1.2012 14:00]:")
    Dim datumCas As DateTime
    While Not DateTime.TryParse(Console.ReadLine(), datumCas)
        Console.WriteLine("Chybné zadání, zdajte znovu datum a čas: ")
    End While
    Return datumCas
End Function

Přidejme metodu VypisZaznamy(), která najde záznamy v daný den a vypíše je:

Public Sub VypisZaznamy(den As DateTime)
    Dim zaznamy As List(Of Zaznam) = databaze.NajdiZaznamy(den, False)
    For Each z As Zaznam In zaznamy
        Console.WriteLine(z)
    Next
End Sub

Metoda pro vyzvání uživatele k vložení parametrů nového záznamu a jeho přidání do databáze bude následující:

Public Sub PridejZaznam()
    Dim datumCas As DateTime = ZjistiDatumCas()
    Console.WriteLine("Zadejte text záznamu:")
    Dim text As String = Console.ReadLine()
    databaze.PridejZaznam(datumCas, text)
End Sub

Zbývá záznamy vyhledávat a mazat. Metoda k vyhledání vrátí List s nalezenými záznamy (jen podle data, přesný čas nebude hrát roli). Vyzveme uživatele k zadání data a to předáme databázi. Výsledek zobrazíme.

Public Sub VyhledejZaznamy()
    ' Zadání data uživatelem
    Dim datumCas As DateTime = ZjistiDatumCas()
    ' Vyhledání záznamů
    Dim zaznamy As List(Of Zaznam) = databaze.NajdiZaznamy(datumCas, False)
    ' Výpis záznamů
    If zaznamy.Count() > 0 Then
        Console.WriteLine("Nalezeny tyto záznamy: ")
        For Each z As Zaznam In zaznamy
            Console.WriteLine(z)
        Next
    Else
        ' Nenalezeno
        Console.WriteLine("Nebyly nalezeny žádné záznamy.")
    End If
End Sub

Mazání záznamů je triviální:

Public Sub VymazZaznamy()
    Console.WriteLine("Budou vymazány záznamy v daný den a hodinu")
    Dim datumCas As DateTime = ZjistiDatumCas()
    databaze.VymazZaznamy(datumCas)
End Sub

Jako poslední přidejme metodu pro vypsání úvodní obrazovky programu s aktuálním datem a časem a událostmi na dnešek a zítřek.

Public Sub VypisUvodniObrazovku()
    Console.Clear()
    Console.WriteLine("Vítejte v diáři!")
    Console.WriteLine("Dnes je: {0}", DateTime.Now)
    Console.WriteLine()
    ' výpis hlavní obrazovky
    Console.WriteLine("Dnes:{0}-----", vbCrLf)
    VypisZaznamy(DateTime.Today)
    Console.WriteLine()
    Console.WriteLine("Zítra:{0}------", vbCrLf)
    VypisZaznamy(DateTime.Now.AddDays(1))
    Console.WriteLine()
End Sub

Můžeme vítězoslavně přejít do Module1.vb a vytvořit instanci diáře. Zde umístíme také hlavní cyklus programu s menu programu a reakcí na volbu uživatele. Je to ta nejvyšší vrstva programu:

Sub Main()
    ' instance diáře
    Dim diar As New Diar()
    Dim volba As Char = "0"
    ' hlavní cyklus
    While volba <> "4"
        diar.VypisUvodniObrazovku()
        Console.WriteLine()
        Console.WriteLine("Vyberte si akci:")
        Console.WriteLine("1 - Přidat záznam")
        Console.WriteLine("2 - Vyhledat záznamy")
        Console.WriteLine("3 - Vymazat záznam")
        Console.WriteLine("4 - Konec")
        volba = Console.ReadKey().KeyChar
        Console.WriteLine()
        ' reakce na volbu
        Select Case volba
            Case "1"
                diar.PridejZaznam()
            Case "2"
                diar.VyhledejZaznamy()
            Case "3"
                diar.VymazZaznamy()
            Case "4"
                Console.WriteLine("Libovolnou klávesou ukončíte program...")
            Case Else
                Console.WriteLine("Neplatná volba, stiskněte libovolnou klávesu a opakujte volbu.")
        End Select
        Console.ReadKey()
    End While
End Sub

Kód výše není složitý a již jsme tu podobný měli mockrát. Výslednou aplikaci jsem na vyzkoušení půjčil přítelkyni, zde vidíte výsledek :) :

Konzolová aplikace
Vítejte v diáři!
Dnes je: 13.6.2016 20:22:45

Dnes:
-----
13.6.2016 10:00:00 Shopping - Arkády Pankrác
13.6.2016 19:30:00 Vyvenčit mého yorkšírka Dennyho

Zítra:
------
14.6.2016 14:00:00 Power plate

Vyberte si akci:
1 - Přidat záznam
2 - Vyhledat záznamy
3 - Vymazat záznam
4 - Konec
2
Zadejte datum a čas ve tvaru [1.1.2012 14:00]:
15.6.2016
Nalezeny tyto záznamy:
15.6.2016 9:30:00 Zkouška - Ekonomika cestovního ruchu

Tímto jsme si List osvojili a bude nám poměrně dlouho stačit. Na závěr bych dodal, že takto si můžete udělat databázi čehokoli. Můžete použít např. třídu Uzivatel z lekce Vlastnosti nebo kteroukoli jinou třídu. Můžete ukládat články, úlohy, slony, cokoli, co chcete v databázi spravovat. A co dál?

V následujícím cvičení, Řešené úlohy k 12.-13. lekci OOP ve Visual Basic .NET, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 276x (69.31 kB)
Aplikace je včetně zdrojových kódů v jazyce VB

 

Předchozí článek
List ve Visual Basic .NET
Všechny články v sekci
Objektově orientované programování ve Visual Basic .NET
Přeskočit článek
(nedoporučujeme)
Řešené úlohy k 12.-13. lekci OOP ve Visual Basic .NET
Článek pro vás napsal Michal Žůrek - misaz
Avatar
Uživatelské hodnocení:
7 hlasů
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.
Aktivity