IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

13. diel - Diár s databázou vo VB.NET

V minulej lekcii, List vo Visual Basic .NET , sme si ukázali kolekciu List. Vieme, že nám oproti poli umožňuje pridávať nové prvky za behu programu a nemusíme sa starať o jeho veľkosť. Dnes si vo VB.NET tutoriálu do Listu skúsime uložiť objekty.

Najprv som chcel urobiť databázu užívateľov, ale užívateľa sme tu už niekoľkokrát mali. Keďže sme sa nedávno naučili dátum a čas, naprogramujeme si diár. Do databázy budeme ukladať jednotlivé záznamy a vždy vypíšeme ten dnešný a zajtrajší. Databáza to nebude samozrejme tá v tom pravom slova zmysle (na to ešte nemáme skúsenosti), ale bude sa jednať práve o List v operačnej pamäti počítača. Bude umožňovať záznamy pridávať, hľadať je podľa dátumu a mazať podľa dátumu a času.

Záznam

Najprv si urobme triedu, ktorej inštancia budeme ukladať. Nazvime ju Zaznam. Záznam v diári sa bude viazať k nejakému dátumu a času. Tiež bude obsahovať nejaký text. Napr .: 12. januára 2013 - vyvenčiť psa. To je asi všetko, trieda môže vyzerať 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

Trieda v podstate slúži len k záznamu dát a nemá žiadne metódy (až na konštruktor a toString ()).

Databázy

Pretože program bude o niečo zložitejšie, rozdelíme ho do viacerých objektov (vrstiev). Záznam máme, teraz si vytvoríme objekt Databaze, v ktorej budú záznamy uložené. Opäť bude mať privátne List, ako mal žrebovacie. Ten bude teraz typu Zaznam. Diár bude umožňovať záznamy pridávať, mazať a vyhľadávať podľa dátumu. K projektu teda pridáme triedu Databaze. Bude veľmi podobná minulému Žrebovacie:

Class Databaze
    Private zaznamy As List(Of Zaznam)

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

End Class

Trieda teda slúži len pre manipuláciu s dátami. Obsahuje vnútorné kolekciu zaznamy, tá sa inicializuje v konstruktoru. Mohli by sme použiť aj inicializácii bez konstruktoru priamo pri deklarácia vo forme:

Private zaznamy As New List(Of Zaznam)

Dodajme triede metódy pre pridanie, vymazanie a vyhľadanie záznamu.

Pridanie záznamu by malo byť jasné:

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

Ako druhú metódu pridajme nájdenie záznamov v daný deň. Metóda bude vracať List nájdených záznamov, pretože ich pre ten deň môže byť v databáze viac. Záznamy budeme môcť vyhľadávať podľa dátumu i času alebo len podľa dátumu. Môžeme tak nájsť záznamy v konkrétny deň bez ohľadu na to, v akú sú hodinu. Podľa čoho budeme chcieť vyhľadávať bude udávať parameter dleCasu typu Boolean. Pokiaľ bude False, hľadáme len podľa dáta bez ohľadu na čas. List si najprv vytvoríme a potom do neho pridávame záznamy, ktoré zodpovedajú hľadanému dátume. Zodpovedať musí buď celé dátum a čas (ak hľadáme aj podľa času) alebo len časť .dat, ak hľadáme len podľa dátumu. Naplnený List s nájdenými záznamami vrátime.

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

Nakoniec pridáme vymazanie záznamov v určitú dobu. To vykonáme pomocou metódy NajdiZaznamy () a nájdené záznamy jednoducho proiterujeme az Listu odstránime. Budeme mazať podľa presného dátumu i času, 2. parameter u metódy NajdiZaznamy () bude teda 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ár

Teraz si pridáme k projektu poslednej triedu, bude to samotný diár. Nazvime ju Diar. Ten už bude obsahovať metódy pre komunikáciu s užívateľom. Všimnite si, ako aplikáciu rozdeľujeme a jednotlivé jej časti zapuzdruje. List je zapuzdrený v databáze, ktorá nad ním postavila ďalšie metódy pre bezpečnú manipuláciu s jeho obsahom. Samotnú databázu teraz vložíme do diára. Tým oddelíme logiku a prácu s dátami od komunikácie s užívateľom a ďalšími vstupy / výstupy programu. Trieda Diar teda bude komunikovať s užívateľom a dáta od neho odovzdá databázu.

Pridajme si privátne inštanciu databázy, ktorú si vytvoríme v konstruktoru:

Class Diar

    Private databaze As Databaze

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

End Class

Ako ďalšie pridajme pomocnú metódu ZjistiDatumCas (), ktorá vyzve používateľa na zadanie dátumu a času a vráti inštanciu DateTime nastavenú na túto hodnotu. Jediným bodom na premýšľanie je tu validácia vstupu od užívateľa:

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

Pridajme metódu VypisZaznamy (), ktorá nájde záznamy v daný deň 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

Metóda pre vyzvanie užívateľov k vloženie parametrov nového záznamu a jeho pridanie do databázy bude nasledujúci:

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

Zostáva záznamy vyhľadávať a mazať. Metóda na vyhľadanie vráti List s nájdenými záznamami (len podľa dátumu, presný čas nebude hrať úlohu). Vyzveme užívateľa na zadanie dátumu a to odovzdáme databázu. Výsledok 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

Mazanie záznamov je triviálne:

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

Ako posledný pridajme metódu pre vypísanie úvodnej obrazovky programu s aktuálnym dátumom a časom a udalosťami na dnešok a zajtrajšok.

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íťazoslávne prejsť do Module1.vb a vytvoriť inštanciu diáre. Tu umiestnime tiež hlavný cyklus programu s menu programu a reakcií na voľbu používateľa. Je to tá najvyššia 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ýška nie je zložitý a už sme tu podobný mali veľakrát. Výslednú aplikáciu som na vyskúšanie požičal priateľku, tu vidíte výsledok :) :

Konzolová aplikácia
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 sme si List osvojili a bude nám pomerne dlho stačiť. Na záver by som dodal, že takto si môžete urobiť databázu čohokoľvek. Môžete použiť napr. Triedu Uzivatel z lekcie Vlastnosti alebo ktorúkoľvek inú triedu. Môžete ukladať články, úlohy, slony, čokoľvek, čo chcete v databáze spravovať. A čo ďalej? Budúci lekcie, Riešené úlohy k 12.-13. lekciu OOP vo Visual Basic .NET , bude o rozhranie. V OOP nás toho čaká ešte dosť :)

V nasledujúcom cvičení, Riešené úlohy k 12.-13. lekciu OOP vo Visual Basic .NET, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 277x (69.31 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB

 

Predchádzajúci článok
List vo Visual Basic .NET
Všetky články v sekcii
Objektovo orientované programovanie vo Visual Basic .NET
Preskočiť článok
(neodporúčame)
Riešené úlohy k 12.-13. lekciu OOP vo Visual Basic .NET
Článok pre vás napísal Michal Žůrek - misaz
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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