SQLite-BeginnerDB

  • Der Einstieg in das Thema SQLite und die Anwendung in AutoIt.

    Will man eine Datenbank installieren. Dann hat man schnell das Gefühl, es wird ein ganzes Betriebssystem installiert,
    das auch noch die Performance des Systems beeinflusst.

    Bei SQLite ist das nicht der Fall, denn SQLite arbeitet auf Dateibasis. Aber auch hier spricht man SQL. Die Standards von 1992 werden unterstützt und man hat das Handling einer relationalen Datenbank. Heute befinden sich SQLite-Datenbanken bereits in Internetbrowsern und Handys, so gehört SQLite auch zum "Lieferumfang" von AutoIt.

    Dieses Tutorial soll in zweifacher Hinsicht als Einstieg in SQLite dienen.
    Das Skript zeigt einen möglichen Aufbau sowie die datenbankrelevanten Funktionen. Diese sind mit dem Vorzeichen "Ds"
    für Datensatz gekennzeichnet.
    Mit dem Programm hingegen ist man in der Lage eine kleine Beispieldatenbank, wie in einer Sandbox, zu führen. Es wird
    sichtbar welche Befehle hinter den einzelnen Button stecken und was sie bewirken. Nicht alle Befehle lösen eine
    Aktion aus, die sichtbar wird. Auch fehlende oder falsche Eingaben sind möglich.

    Seht selbst, wie SQLite reagiert.

    SQL
    SQLite-BeginnerDB
    [autoit]


    ;~ Autor: Ritzelrocker04
    #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
    #AutoIt3Wrapper_UseX64=n ; ### Win32-DLL ###
    ;
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    #include <WindowsConstants.au3>
    ;
    Opt("GUIOnEventMode", 1)
    Opt("MustDeclareVars", 1)
    ;
    Global Const $sHeader = "Name|Vorname|Telefon"
    Global Const $sTitle = "SQLite-Datenbank-Tut ", $sVersion = "2014.08.04 "
    Global $hDB, $Query, $aNames, $aRow
    ;
    #Region Hauptfenster
    Global $hGUI = GUICreate($sTitle, 800, 500)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_CLOSEButton")
    Global $hEdit = GUICtrlCreateEdit(" ", 0, 0, 800, 360, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL))
    GUICtrlSetFont(-1, 12, 15, -1, "Courier New") ; Schriftgröße 12, Art Courier New
    GUICtrlCreateLabel("Autor: Ritzelrocker04 " & $sVersion, 10, 365)
    Global $btnNew = GUICtrlCreateButton("Neuer Datensatz", 10, 450, 100, 35, $BS_DEFPUSHBUTTON)
    GUICtrlSetOnEvent(-1, "_NewButton")
    Global $btnDsAlleAnzeigen = GUICtrlCreateButton("Alle Datensätze anzeigen", 120, 450, 100, 35, $BS_MULTILINE)
    GUICtrlSetOnEvent(-1, "_DsAlleAnzeigen")
    Global $btnDsAuswahl = GUICtrlCreateButton("Auswahl", 230, 450, 100, 35)
    GUICtrlSetOnEvent(-1, "_DsAuswaehlen")
    GUICtrlCreateLabel("Mögliche Eingaben: Meier | m% | %m%", 340, 390, 100, 30, $BS_MULTILINE)
    Global $iptDsAuswahlEingabe = GUICtrlCreateInput("", 340, 425, 100, 20)
    Global $btnDsAuswahlEingabe = GUICtrlCreateButton("Auswahl nach Eingabe", 340, 450, 100, 35, $BS_MULTILINE)
    GUICtrlSetOnEvent(-1, "_DsAuswaehlenEingabe")
    Global $cboDsSortierenEingabe = GUICtrlCreateCombo("Name", 450, 425, 100, 20, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
    GUICtrlSetData(-1, "ID DESC|Vorname|Name, Vorname|Telefon|Telefon DESC", "Name")
    Global $btnDsSortierenEingabe = GUICtrlCreateButton("Sortieren nach Eingabe", 450, 450, 100, 35, $BS_MULTILINE)
    GUICtrlSetOnEvent(-1, "_DsSortierenEingabe")
    GUICtrlCreateLabel("Telefonnr. eingeben", 580, 365, 100, 20)
    Global $iptDsAendernTel = GUICtrlCreateInput("", 580, 385, 100, 20, $ES_NUMBER)
    GUICtrlCreateLabel("Hier die ID eingeben", 580, 407, 100, 20)
    Global $iptDsAendernID = GUICtrlCreateInput("", 580, 425, 100, 20, $ES_NUMBER)
    GUICtrlSetLimit(-1, 2)
    Global $btnDsAendern = GUICtrlCreateButton("Ändern eines Datensatzes", 580, 450, 100, 35, $BS_MULTILINE)
    GUICtrlSetOnEvent(-1, "_DsAendern")
    GUICtrlCreateLabel("Hier die Eingabe der ID vornehmen", 690, 390, 100, 30, $BS_MULTILINE)
    Global $iptDsLoeschen = GUICtrlCreateInput("", 690, 425, 100, 20, $ES_NUMBER)
    GUICtrlSetLimit(-1, 2)
    Global $btnDsLoeschen = GUICtrlCreateButton("Löschen eines Datensatzes", 690, 450, 100, 35, $BS_MULTILINE)
    GUICtrlSetOnEvent(-1, "_DsLoeschen")
    #EndRegion Hauptfenster
    ;
    GUISetState(@SW_SHOW, $hGUI)
    ;
    _SQLite_Startup()
    If @error Then Exit MsgBox(16, "SQLite Fehler", "SQLite.dll konnte nicht geladen werden!")
    If FileExists("BeginnerDB.sqlite") Then
    $hDB = _SQLite_Open("BeginnerDB.sqlite")
    If @error Then Exit MsgBox(16, "SQLite Fehler", "Kann die Datenbank nicht öffnen!")
    Else
    $hDB = _SQLite_Open("BeginnerDB.sqlite") ; eine neue DB anlegen
    If @error Then Exit MsgBox(16, "SQLite Fehler", "Kann die Datenbank nicht öffnen!")
    ; eine neue Tabelle anlegen "BeginnerDB"
    _SQLite_Exec(-1, "CREATE TABLE BeginnerDB (ID INTEGER PRIMARY KEY,Name Text,Vorname Text,Telefon Text);")

    [/autoit] [autoit][/autoit] [autoit]

    ; Einträge als Muster erzeugen, die später angepasst werden können
    _SQLite_Exec(-1, "INSERT INTO BeginnerDB(Name,Vorname,Telefon) VALUES ('Meyar', 'Klaus', '5714');")
    _SQLite_Exec(-1, "INSERT INTO BeginnerDB(Name,Vorname,Telefon) VALUES ('Muster','Max','172');")
    _SQLite_Exec(-1, "INSERT INTO BeginnerDB(Name,Vorname,Telefon) VALUES ('Duck','Donald','030');")
    _SQLite_Exec(-1, "INSERT INTO BeginnerDB(Name,Vorname,Telefon) VALUES ('Duck','Daisy','040');")
    _SQLite_Exec(-1, "INSERT INTO BeginnerDB(Name,Vorname,Telefon) VALUES ('Bond','James','007');")
    _SQLite_Exec(-1, "INSERT INTO BeginnerDB(Name,Vorname,Telefon) VALUES ('Zander', 'Hans', '3714');")
    _SQLite_Exec(-1, "INSERT INTO BeginnerDB(Name,Vorname,Telefon) VALUES ('Maier', 'Hans', '6714');")
    _SQLite_Exec(-1, "INSERT INTO BeginnerDB(Name,Vorname,Telefon) VALUES ('Schmitz', 'Petra', '81343');")
    _SQLite_Exec(-1, "INSERT INTO BeginnerDB(Name,Vorname,Telefon) VALUES ('Mertens', 'Julius', '2297');")
    _SQLite_Exec(-1, "INSERT INTO BeginnerDB(Name,Vorname,Telefon) VALUES ('Meier', 'Simone', '5794');")
    EndIf
    ;
    #Region Fenster für "Neuer Datensatz"
    Global $hGuiNew = GUICreate("", 500, 140, -1, -1, $WS_SYSMENU) ; das Fenster "Neuer Datensatz" erstellen
    GUISetOnEvent($GUI_EVENT_CLOSE, "_CLOSEButton")
    Global $aHeader = StringSplit($sHeader, '|') ; Überschriften-Array
    Global $aNew[$aHeader[0]] ; Array für die Input-IDs
    For $i = 1 To $aHeader[0]
    GUICtrlCreateLabel($aHeader[$i], 20 + ($i - 1) * 170, 15, 115, 15) ; Überschriften-Label erstellen
    GUICtrlSetFont(-1, 8, 400, 0, 'Verdana') ; Schriftgröße und -art der Überschriften festlegen
    $aNew[$i - 1] = GUICtrlCreateInput("", 15 + ($i - 1) * 170, 30, 125, 20, Default, $WS_EX_STATICEDGE) ; Eingabefelder erstellen
    GUICtrlSetFont(-1, 10, 600, 0, 'Verdana') ; Schriftgröße und -art der Eingabefelder festlegen
    Next
    Global $hCreate = GUICtrlCreateButton("Datensatz einfügen", 190, 65, 120, 25, $BS_DEFPUSHBUTTON) ; Button zum Datensätze einfügen
    GUICtrlSetOnEvent(-1, "_DsEinfuegen")
    #EndRegion Fenster für "Neuer Datensatz"
    ;
    While Sleep(1000)
    WEnd
    ;
    Func _DsAlleAnzeigen()
    GUICtrlSetData($hEdit, "") ; vorher Editfeld leeren
    ; DB Abfrage der gesamten Tabelle "BeginnerDB"
    _SQLite_Query($hDB, "SELECT * FROM BeginnerDB", $Query)
    ; Auslesen der Spaltenüberschriften
    _SQLite_FetchNames($Query, $aNames)
    GUICtrlSetData($hEdit, "_SQLite_LibVersion = " & _SQLite_LibVersion() & @CRLF & @CRLF & "SELECT * FROM BeginnerDB" & @CRLF & @CRLF, 1)
    GUICtrlSetData($hEdit, StringFormat(" %10s %-10s %-10s %10s ", $aNames[0], $aNames[1], $aNames[2], $aNames[3]) & @CRLF & @CRLF, 1)
    ; Auslesen der nächsten Zeile
    While _SQLite_FetchData($Query, $aRow, False, False) = $SQLITE_OK
    GUICtrlSetData($hEdit, StringFormat(" %10s %-10s %-10s %10s ", $aRow[0], $aRow[1], $aRow[2], $aRow[3]) & @CRLF, 1)
    WEnd
    _SQLite_QueryFinalize($Query)
    EndFunc ;==>_DsAlleAnzeigen
    ;
    Func _DsLoeschen()
    Local $sMsg = ""
    GUICtrlSetData($hEdit, "") ; vorher Editfeld leeren
    Local $iID = GUICtrlRead($iptDsLoeschen)
    If _SQLite_Exec(-1, "DELETE FROM BeginnerDB WHERE ID = " & $iID & "") = $SQLITE_OK And $iID > 0 And $iID <= _SQLite_LastInsertRowID() Then
    $sMsg = "" ; Erfolgreich
    Else
    $sMsg = @CRLF & @CRLF & "SQLite Error => " & _SQLite_ErrMsg() _
    & @CRLF & @CRLF & "Der angegebene Datensatz konnte nicht gefunden werden !" ; Misserfolg
    EndIf
    GUICtrlSetData($iptDsLoeschen, "") ; Das IDfeld leeren
    GUICtrlSetData($hEdit, "_SQLite_LibVersion = " & _SQLite_LibVersion() _
    & @CRLF & @CRLF & "DELETE FROM BeginnerDB WHERE ID = " & $iID & "" _
    & $sMsg & @CRLF & @CRLF & "Weiter mit => Alle Datensätze anzeigen.", 1)
    EndFunc ;==>_DsLoeschen
    ;
    Func _DsAendern()
    Local $sMsg = ""
    GUICtrlSetData($hEdit, "") ; vorher Editfeld leeren
    Local $iID = GUICtrlRead($iptDsAendernID) ; ID auslesen
    Local $iTel = GUICtrlRead($iptDsAendernTel) ; Telefon auslesen
    ;~ Prüfen, ob ID vorhanden ist.
    If _SQLite_Exec(-1, "UPDATE BeginnerDB SET Telefon = '" & $iTel & "' WHERE ID = " _
    & $iID & "") = $SQLITE_OK And $iID > 0 And $iID <= _SQLite_LastInsertRowID() Then
    $sMsg = "" ; Erfolgreich
    Else
    $sMsg = @CRLF & @CRLF & "SQLite Error => " & _SQLite_ErrMsg() _
    & @CRLF & @CRLF & "Der angegebene Datensatz konnte nicht gefunden werden !" ; Misserfolg
    EndIf
    GUICtrlSetData($iptDsAendernID, "") ; Das IdFeld leeren
    GUICtrlSetData($iptDsAendernTel, "") ; Das TelefonFeld leeren
    GUICtrlSetData($hEdit, "_SQLite_LibVersion = " & _SQLite_LibVersion() _
    & @CRLF & @CRLF & "UPDATE BeginnerDB SET Telefon = " & $iTel & " WHERE ID = " & $iID & "" _
    & $sMsg & @CRLF & @CRLF & "Weiter mit => Alle Datensätze anzeigen.", 1)
    EndFunc ;==>_DsAendern
    ;
    Func _DsSortierenEingabe()
    GUICtrlSetData($hEdit, "") ; vorher Editfeld leeren
    Local $s = GUICtrlRead($cboDsSortierenEingabe) ; Eingabe auslesen
    ; DB Abfrage der gesamten Tabelle "BeginnerDB"
    _SQLite_Query($hDB, "SELECT * FROM BeginnerDB ORDER BY " & $s & "", $Query)
    ; Auslesen der Spaltenüberschriften
    _SQLite_FetchNames($Query, $aNames)
    GUICtrlSetData($hEdit, "_SQLite_LibVersion = " & _SQLite_LibVersion() & @CRLF & @CRLF & "SELECT * FROM BeginnerDB ORDER BY " & $s & "" & @CRLF & @CRLF, 1)
    GUICtrlSetData($hEdit, StringFormat(" %10s %-10s %-10s %10s ", $aNames[0], $aNames[1], $aNames[2], $aNames[3]) & @CRLF & @CRLF, 1)
    ; Auslesen der nächsten Zeile
    While _SQLite_FetchData($Query, $aRow, False, False) = $SQLITE_OK
    GUICtrlSetData($hEdit, StringFormat(" %10s %-10s %-10s %10s ", $aRow[0], $aRow[1], $aRow[2], $aRow[3]) & @CRLF, 1)
    WEnd
    _SQLite_QueryFinalize($Query)
    EndFunc ;==>_DsSortierenEingabe
    ;
    Func _DsAuswaehlenEingabe()
    GUICtrlSetData($hEdit, "") ; vorher Editfeld leeren
    Local $s = GUICtrlRead($iptDsAuswahlEingabe) ; Eingabe auslesen
    ; DB Auswahlabfrage der Tabelle "BeginnerDB"
    _SQLite_Query($hDB, "SELECT * FROM BeginnerDB WHERE Name LIKE '" & $s & "'", $Query)
    ; Auslesen der Spaltenüberschriften
    _SQLite_FetchNames($Query, $aNames)
    GUICtrlSetData($hEdit, "_SQLite_LibVersion = " & _SQLite_LibVersion() _
    & @CRLF & @CRLF & "SELECT * FROM BeginnerDB WHERE Name LIKE '" & $s & "'" _
    & @CRLF & @CRLF & "Weitere Auswahlabfragen befinden sich im Script !" & @CRLF & @CRLF, 1)
    GUICtrlSetData($hEdit, StringFormat(" %10s %-10s %-10s %10s ", $aNames[0], $aNames[1], $aNames[2], $aNames[3]) & @CRLF & @CRLF, 1)
    ; Auslesen der nächsten Zeile
    While _SQLite_FetchData($Query, $aRow, False, False) = $SQLITE_OK
    GUICtrlSetData($hEdit, StringFormat(" %10s %-10s %-10s %10s ", $aRow[0], $aRow[1], $aRow[2], $aRow[3]) & @CRLF, 1)
    WEnd
    _SQLite_QueryFinalize($Query)
    GUICtrlSetData($iptDsAuswahlEingabe, "") ; Das IDfeld leeren

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    Weitere Auswahlabfragen :

    [/autoit] [autoit][/autoit] [autoit]

    "SELECT * FROM BeginnerDB WHERE Telefon > 100"
    "SELECT * FROM BeginnerDB WHERE name <> 'Meier'"
    "SELECT * FROM BeginnerDB WHERE Telefon >= 100 AND Telefon <= 6000"
    "SELECT * FROM BeginnerDB WHERE name LIKE 'm%'"
    "SELECT * FROM BeginnerDB WHERE name LIKE '%i%'"
    "SELECT * FROM BeginnerDB WHERE name LIKE 'M__er'"
    "SELECT * FROM BeginnerDB WHERE name LIKE 'M___r'"

    [/autoit] [autoit][/autoit] [autoit]

    ;i Hierbei ist die Anpassung der Anzahl von $aNames und $aRow erforderlich !
    "SELECT name, vorname FROM BeginnerDB"
    ""SELECT Vorname, Name, Telefon FROM BeginnerDB"
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_DsAuswaehlenEingabe
    ;
    Func _DsAuswaehlen()
    GUICtrlSetData($hEdit, "") ; vorher Editfeld leeren
    ; DB Auswahlabfrage der Tabelle "BeginnerDB"
    _SQLite_Query($hDB, "SELECT Vorname, Name, Telefon FROM BeginnerDB WHERE Name LIKE 'M___r'", $Query)
    ; Auslesen der Spaltenüberschriften
    _SQLite_FetchNames($Query, $aNames)
    GUICtrlSetData($hEdit, "_SQLite_LibVersion = " & _SQLite_LibVersion() _
    & @CRLF & @CRLF & "SELECT Vorname, Name, Telefon FROM BeginnerDB WHERE Name LIKE 'M___r'" _
    & @CRLF & @CRLF & "Weitere Auswahlabfragen befinden sich im Script !" & @CRLF & @CRLF, 1)
    GUICtrlSetData($hEdit, StringFormat(" %-10s %-10s %10s ", $aNames[0], $aNames[1], $aNames[2]) & @CRLF & @CRLF, 1)
    ; Auslesen der nächsten Zeile
    While _SQLite_FetchData($Query, $aRow, False, False) = $SQLITE_OK
    GUICtrlSetData($hEdit, StringFormat(" %-10s %-10s %10s ", $aRow[0], $aRow[1], $aRow[2]) & @CRLF, 1)
    WEnd
    _SQLite_QueryFinalize($Query)

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    Weitere Auswahlabfragen :

    [/autoit] [autoit][/autoit] [autoit]

    "SELECT Vorname, Name, Telefon FROM BeginnerDB WHERE Telefon > 100"
    "SELECT Vorname, Name, Telefon FROM BeginnerDB WHERE name <> 'Meier'"
    "SELECT Vorname, Name, Telefon FROM BeginnerDB WHERE Telefon >= 100 AND Telefon <= 6000"
    "SELECT Vorname, Name, Telefon FROM BeginnerDB WHERE name LIKE 'm%'"
    "SELECT Vorname, Name, Telefon FROM BeginnerDB WHERE name LIKE '%i%'"
    "SELECT Vorname, Name, Telefon FROM BeginnerDB WHERE name LIKE 'M__er'"
    "SELECT Vorname, Name, Telefon FROM BeginnerDB WHERE name LIKE 'M___r'"

    [/autoit] [autoit][/autoit] [autoit]

    ;i Hierbei ist die Anpassung der Anzahl von $aNames und $aRow erforderlich !
    "SELECT name, vorname FROM BeginnerDB"
    "SELECT * FROM BeginnerDB WHERE Telefon > 100"
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_DsAuswaehlen
    ;
    Func _DsEinfuegen()
    _SQLite_Exec(-1, "INSERT INTO BeginnerDB (Name,Vorname,Telefon) VALUES ('" _
    & GUICtrlRead($aNew[0]) & "','" & GUICtrlRead($aNew[1]) & "','" & GUICtrlRead($aNew[2]) & "');")
    Sleep(50)
    GUICtrlSetData($hEdit, "") ; vorher Editfeld leeren
    GUICtrlSetData($hEdit, "_SQLite_LibVersion = " & _SQLite_LibVersion() _
    & @CRLF & @CRLF & "INSERT INTO BeginnerDB (Name,Vorname,Telefon) VALUES ('" _
    & GUICtrlRead($aNew[0]) & "','" & GUICtrlRead($aNew[1]) & "','" & GUICtrlRead($aNew[2]) & "');" _
    & @CRLF & @CRLF & "Weiter mit => Alle Datensätze anzeigen !", 1)
    ; Alle Eingabefelder leeren, für weitere Eingaben.
    For $i = 0 To UBound($aNew) - 1
    GUICtrlSetData($aNew[$i], "")
    Next
    EndFunc ;==>_DsEinfuegen
    ;
    Func _NewButton()
    WinSetTitle($hGuiNew, "", "Neuer Datensatz") ; den Titel des Fenster anpassen
    GUISetState(@SW_SHOW, $hGuiNew) ; das Fenster "Neuer Datensatz" anzeigen
    GUISetState(@SW_DISABLE, $hGUI) ; das Hauptfenster deaktivieren
    EndFunc ;==>_NewButton
    ;
    Func _CLOSEButton()
    If @GUI_WinHandle = $hGUI Then
    ;
    ;~ _SQLite_Exec(-1, "DROP TABLE BeginnerDB;") ; Die Tabelle löschen !
    _SQLite_Close()
    _SQLite_Shutdown()
    ;
    FileDelete("BeginnerDB.sqlite") ; Die DatenBank löschen !
    Exit
    Else
    GUISetState(@SW_HIDE, $hGuiNew) ; "Neuer Datensatz"-Fenster verstecken
    GUISetState(@SW_ENABLE, $hGUI) ; Hauptfenster wieder aktivieren
    WinActivate($hGUI) ; und in den Vordergrund holen
    EndIf
    EndFunc ;==>_CLOSEButton
    ; Ende

    [/autoit]
    SQLite-Listview
    [autoit]


    #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
    #AutoIt3Wrapper_UseX64=n ; ### Win32-DLL ###

    [/autoit] [autoit][/autoit] [autoit]

    #include <SQLite.au3>
    #include <SQLite.dll.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $listview, $aResult, $iRows, $iColumns, $listviewID, $listviewText

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Startup()
    If @error Then Exit MsgBox(16, "SQLite Fehler", "SQLite.dll konnte nicht geladen werden!")
    _SQLite_Open()
    If @error Then Exit MsgBox(16, "SQLite Fehler", "Kann die Datenbank nicht öffnen!")

    [/autoit] [autoit][/autoit] [autoit]

    ;~ ### Die Tabelle "BeispielDB" erstellen. ###
    _SQLite_Exec(-1, "CREATE TABLE BeispielDB (ID INTEGER PRIMARY KEY, Name Text, Vorname Text, Summe Real);")

    [/autoit] [autoit][/autoit] [autoit]

    ;~ ### Mustereingaben vornehmen ###
    _SQLite_Exec(-1, "INSERT INTO BeispielDB(Name,Vorname,Summe) VALUES ('Muster','Max',1000);")
    _SQLite_Exec(-1, "INSERT INTO BeispielDB(Name,Vorname,Summe) VALUES ('Duck','Donald',10030);")
    _SQLite_Exec(-1, "INSERT INTO BeispielDB(Name,Vorname,Summe) VALUES ('Duck','Daisy',400.55);")
    _SQLite_Exec(-1, "INSERT INTO BeispielDB(Name,Vorname,Summe) VALUES ('Bond','James',100.95);")
    _SQLite_Exec(-1, "INSERT INTO BeispielDB(Name,Vorname,Summe) VALUES ('Muster','Max',500);")
    _SQLite_Exec(-1, "INSERT INTO BeispielDB(Name,Vorname,Summe) VALUES ('Muster','Max',500);")

    [/autoit] [autoit][/autoit] [autoit]

    ;~ ### Beispiel-Abfragen formulieren. ###
    ;i Rowid und ID sind nicht das Gleiche!

    [/autoit] [autoit][/autoit] [autoit]

    ;~ _SQLite_GetTable2d(-1, "Select rowid,* From BeispielDB", $aResult, $iRows, $iColumns)
    ;~ _SQLite_GetTable2d(-1, "Select Vorname,Name,Summe From BeispielDB", $aResult, $iRows, $iColumns)
    ;~ _SQLite_GetTable2d(-1, "Select * From BeispielDB", $aResult, $iRows, $iColumns)
    ;~ _SQLite_GetTable2d(-1, "Select * From BeispielDB WHERE name LIKE 'm%'", $aResult, $iRows, $iColumns)
    ;~ _SQLite_GetTable2d(-1, "SELECT vorname,name,SUM(Summe) AS Gesamt FROM BeispielDB WHERE name LIKE 'm%'", $aResult, $iRows, $iColumns)
    ;~ _SQLite_GetTable2d(-1, "SELECT name,SUM(Summe) AS Gesamt FROM BeispielDB WHERE name LIKE 'd%'", $aResult, $iRows, $iColumns)
    ;~ _SQLite_GetTable2d(-1, "SELECT COUNT(name) AS Anzahl_Eintraege FROM BeispielDB", $aResult, $iRows, $iColumns)
    ;~ _SQLite_GetTable2d(-1, "SELECT Name, SUM(Summe) AS Gesamt FROM BeispielDB GROUP BY Name", $aResult, $iRows, $iColumns)
    _SQLite_GetTable2d(-1, "Select * From BeispielDB WHERE Summe >= 100 AND Summe <= 600", $aResult, $iRows, $iColumns)

    [/autoit] [autoit][/autoit] [autoit]

    $listviewText = ""
    For $iC = 0 To $iColumns - 1
    $listviewText &= $aResult[0][$iC] & "|"
    ;~ MsgBox(0, "", $listviewText)
    Next
    ;~ MsgBox(0, "", $listviewText)

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("SQLite-listview", 400, 400)
    $listview = GUICtrlCreateListView($listviewText, 0, 0, 400, 300)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    For $iR = 1 To $iRows
    $listviewID = ""
    For $iC = 0 To $iColumns - 1
    $listviewID &= $aResult[$iR][$iC] & "|"
    ;~ MsgBox(0,"",$listviewID)
    Next
    GUICtrlCreateListViewItem($listviewID, $listview)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Exec(-1, "DROP TABLE BeispielDB;")
    _SQLite_Close()
    _SQLite_Shutdown()

    [/autoit] [autoit][/autoit] [autoit]

    While GUIGetMsg() <> -3
    WEnd
    ; Ende

    [/autoit]
  • Super Einstieg, soetwas suche ich schon seit längerem. :rock: Danke :rock:

    Was mir jedoch aufgefallen ist, bei dem Feld Eingabe ist das % wohl der Func StringFormat geschuldet. Ist es nicht auch möglich, das Script dahingehend umzubauen, dass man statt dessen den Standard Platzhalter * nahmen kann. Oder wolltest du dass bewust nicht, da im SQL-String ja auch * vorkommen?

    Interessant währe auch noch eine ListviewAnsicht, aber das werde ich mal bei Gelegehei versuche selbst umzusetzen.

    bis dann

    Jescho

    MfG Jescho

    Jeder hat mal klein angefangen - aber nicht jeder kommt groß raus!

  • Jescho

    Danke für Dein Lob und Interesse.

    Die von Dir ausgemachten %-Zeichen sind, in diesem Fall, Platzhalter/Wildcards. Sie gehören direkt zur SELECT-Abfrage von SQLite. Im Spoiler SQL habe ich diese Abfragen hinzugefügt und kommentiert.

    Ein Listview
    ist nur die Präsentation derselben Daten auf eine andere Art. Einem Beginner würde, dass den Blick auf das Wesentliche verstellen. So habe ich SQLite-Listview mit der Abfrage nach den Summen zwischen 100 und 600 separat eingefügt. ;)

  • Moin RR04.

    Erst einmal, DU bist mein SQL-Retter.
    Jetzt habe ich einen SQL-Retter und einen Array-Retter. ;)
    .
    Du hast das echt super beschrieben, das muss ich DIr echt lassen.
    Ich frage mich gerade, wie man die DB speichern ein einlesen kann. Du arbeitest ja in dem Bsp-Script mit festen Daten als Grundlage.
    .
    Zum aktuellen Beispiel folgendes:
    1.) "Alle Datensätze anzeigen"
    a) nach dem Programmstart einmal automatisch drücken, damit gleich die Daten sichtbar sind?

    2.) "Auswahl nach Eingabe"
    a) wenn man z. B. %m% eingegeben hat und man ENTER auf der Tastatur drückt, das er automatisch dann "auswahl der Eingabe" drückt"?
    b) wenn man ausversehen doppelt den Button drückt, das dann nicht eine leeres Suchfeld da ist, sondern z. B. erst wenn man nach 3 Sek. nochmals den Button (bzw. Enter) drückt?

    3.) "Telefonnr. eingeben
    Wozu dient dieses Input? Gebe ich z. B. 030 ein, was dann? Verständnisproblem?

    4.) Datensätze
    Du hast die Datensätze "Name,Vorname,Telefon". Was ist wenn man z. B. folgende hat "Name, Vorname, Straße, Hausnummer, Land, PLZ, Ort, TELEFONNUMMER, GEBURTSDATUM, STARTDATUM, ENDEDATUM, Besonderes". Wie ist das da mit dem sortieren bezüglich "Zahlen" oder "Datumsangaben".
    Kann man die GUI neue Datensätze nicht im Bsp. vertikal darstellen? Horizontal ist gut bei dem ListView Beispiel dargestellt. Ich meine, mal zu zeigen, das es nicht immer horizontal sein muss. ;)

    Wie empfehlst Du die Mitgabe der "sqlite3.dll"? Evtl. Beipiel gleich mit einarbeiten?


    So, habe glaube ich genug gefragt.

    Eure Lina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    Einmal editiert, zuletzt von Alina (17. August 2014 um 13:49)

  • @Lina

    Zu den aktuellen Beispielen:
    1.)
    Der Button "Alle Datensätze anzeigen"
    setzt einen bestimmten Befehl ab (SELECT * FROM BeginnerDB). Die ganzen Spalten der Tabelle werden ausgewählt und angezeigt. Ihn werden wir im Verlauf öfter brauchen, um Änderungen anzeigen zulassen.
    2.)
    Beim Button "Auswahl nach Eingabe"
    gibt es die Möglichkeit eine Art Filter anzugeben. Den Namen, den Anfangsbuchstaben des Namens, mit einem m im Namen oder mit Unterstrichen fals die Schreibweise von "Meier" abweicht (z.B.: "Meier, m%, %m%, M___r").
    3.)
    Die "Telefonnr. eingeben"
    und die ID des Datensatzes ändern nur die Telefonnummer, andere Einträge sind nicht betroffen. Der SQL-Befehl "Update" steckt hier dahinter und wird, dann auch angezeigt.
    4.)
    Datensätze
    Datenbanken dienen zum Speichern großer Datenmengen. Das schließt Buch-, Musik-, Videosammlungen, Artikelverw. oder die klassische Adressenkartei nicht aus. Doch wir sollten größer denken. Börse, Banken und Internet machen es vor. So ist es auch möglich, ein ganzes Kaufhaus abzubilden. Die Warenannahme mit Lieferanten, eine Etage mit Schuhen, ja noch eine Etage mit Handtaschen, aber auch Personalabteilung und Buchhaltung dürfen nicht fehlen. Die Daten werden in den dafür angelegten Tabellen der relationalen Datenbank unsortiert gespeichert.

    Im Beispiel SQLite-Listview wird ein Beispiel mit Zahlen gezeigt. Es beruht auf einer anderen Tabelle ("ID,Name, Vorname,Summe").
    Die Darstellung kann vielseitig sein. Hier bereits gezeigt ein einfaches Editfeld und ein Listview, doch auch eine Eigabemaske mit Inpufeldern ist möglich.

    Ich empfehle das Beilegen der aktuellen sqlite3.dll zu den Skripten (z.B. ins @ScriptDir).

    Seht selbst, wie SQLite reagiert!

  • DANKE DANKE DANKE !!!

    ZU Deinen AWs:

    2a)
    Das meine ich so. Ich möchte nicht die Maus benutzen müssen, sondern nachdem ich z. B. %m% eingegeben habe und ich dann die Return-Taste gedrückt habe, das passiert, was auch passiert, wenn ich auf "Auswahl nach Eingabe" mit der Maus gedrückt hätte. Ich mag die Maus nicht so gerne.

    2b)
    Ich glaube das habe ich unten auch unverständlich erklärt. Erübricht sich jedoch, wenn 2a wie o. g. machtbar wäre.

    3)
    Das habe ich durch das lesen des Scriptes, ca. 30 Minuten nach meinem Posting, dann doch mal SQL-mäßig verstanden. LOL

    4)
    Mir kam es bei 4) im ersten Posting auf die Sortierung von Datumsangaben und Zahlen an. Oftmals sortiert man doch nach Zahlen und nach dem Datum.
    Also bei "ID,Name, Vorname,Summe" denke ich gleich an Access. Ich habe da mal eine Musikdatenbank mit gemacht. So mit GUI und u. a. auch Such- Playbuttons. Lange her. War meine ich nach meinem ersten Zertifikat (MCP) weil ich das erlernte privat festigen wollte. Musik (mp3) habe ich ca. 75K - 80K. Alle TOP Qualität, aber halt alles damals in einem Ordner und zu jeder Datei gibt es eine TXT-Datei mit Songtitel, Interpret, Spieldauer, Jahrgang, Songtext (bei ca. 80%) , ... Wie das alles verarbeiten, wenn nicht mit Batch-Dateien und danach weiter nutzen mit Access. UND GENAU aus diesem Grund, das man so viel damit machen kann, wenn man es gut erklärt bekommt, bin ich hier und lerne im "SQL-Abendstudium". ;) Danke, DU machst das gut so und mach weiter.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • [autoit][/autoit][autoit][/autoit][autoit]

    ;~ [user='994']Alina[/user]
    ;~ Die Punkte zu 2 sind eigentlich Gestaltungssachen im Bereich von Autoit,
    ;~ also ob ein Hotkey oder ein "&" eingebaut wird.

    [/autoit][autoit][/autoit][autoit]

    ;~ Zahlen:
    ;~ Zahlen finden sich im Beispiel SQLite-Listview.
    ;~ Hier kann ein bestimmter Zahlenbereich angezeigt werden.

    [/autoit][autoit][/autoit][autoit]

    _SQLite_GetTable2d(-1, "Select * From BeispielDB WHERE Summe >= 100 AND Summe <= 600", $aResult, $iRows, $iColumns) ;i Zahlenbereich anzeigen

    [/autoit][autoit][/autoit][autoit]

    ;~ Direkte Sortierabfragen haben immer mit "ORDER BY" zutun.
    ;~ Sortiert wird aufsteigend, absteigend und
    ;~ auch über mehrere Spalten. Diese Funktionalität bringt SQLite schon mit.

    [/autoit][autoit][/autoit][autoit]

    _SQLite_GetTable2d(-1,"SELECT * FROM BeispielDB ORDER BY Name DESC", $aResult, $iRows, $iColumns) ;i sortieren über eine Spalte, Abfsteigend => DESC
    _SQLite_GetTable2d(-1,"SELECT * FROM BeispielDB ORDER BY Name, Vorname", $aResult, $iRows, $iColumns) ;i sortieren über zwei Spalten

    [/autoit][autoit][/autoit][autoit]

    _SQLite_GetTable2d(-1, "SELECT * FROM BeispielDB ORDER BY Summe", $aResult, $iRows, $iColumns) ;i A-ufsteigend => ASC
    _SQLite_GetTable2d(-1, "SELECT * FROM BeispielDB ORDER BY Summe ASC", $aResult, $iRows, $iColumns) ;i A-ufsteigend => ASC
    _SQLite_GetTable2d(-1, "SELECT * FROM BeispielDB ORDER BY Summe DESC", $aResult, $iRows, $iColumns) ;i Abfsteigend => DESC

    [/autoit][autoit][/autoit][autoit]

    ;~ Datum:
    ;~ Intern verwendet SQLite das Format "2010-12-30".
    ;~ Datum und Zeit Funktionen sind hier gut beschrieben: http://www.sqlite.org/lang_datefunc.html
    ;~ Ende

    [/autoit]
  • Okay ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo,
    habe das Problem, dass nach dem Start von SQ-Lite BeginnerDB die Fehlermeldung "SQLite.dll konnte nicht geladen werden!" erscheint.

    SQLite.dll.au3 und SQLite.au3 sind aber definitiv im Includeordner drin.
    Was könnte das Problem sein ?

    MfG

    • Offizieller Beitrag

    Da ich es schon damals echt bescheuert fand, die SQLite.dll nicht mehr in der UDF mit zu liefern, hatte ich mir ein eigenes Include mit den Binärdaten der SQLite.dll erstellt [version 3.7.14.1 für 32-bit x86]. Das Include prüft auf Existenz der "sqlite3.dll" im Skript- und Systemverzeichnis. Ist die Datei nicht enthalten, wird sie im Skriptverzeichnis erstellt.
    Natürlich kannst du auch die sqlite3.dll herunterladen und per Fileinstall an dein Skript binden. Mir gefällt die Include-Variante besser.

  • Mhm ich kann nicht ganz folgen.
    Ich habe einfach mal die SQlite.ddl.au3 aus dem Includeverzeichniss und und aus dem Skript gelöscht und jetzt läuft alles. Kp was ich da gemacht hab.

    Vielen Dank für die zügigen Antworten. Gruß.

  • Hallo,

    die Daten sind nicht runterladbar:

    Code
    Fatal error: An error occured. Sorry.
    Information:
    
    
    ID: a871d2535dc5c3051f7feb350438b1d75d75c9aa
    Bitte teilen Sie dem Betreiber die oben stehende ID mit.
    Die Fehlermeldung kann mit dieser ID über „ACP » Protokoll » Fehler“ eingesehen werden.
  • Hallo,

    die Daten sind nicht runterladbar:

    Code
    Fatal error: An error occured. Sorry.
    Information:
    
    
    ID: a871d2535dc5c3051f7feb350438b1d75d75c9aa
    Bitte teilen Sie dem Betreiber die oben stehende ID mit.
    Die Fehlermeldung kann mit dieser ID über „ACP » Protokoll » Fehler“ eingesehen werden.

    Der Quellcode wurde doch gepostet? Kopier ihn doch einfach?

  • Es kommt der Fehler "SQLite konnte nicht geladen werden."

    Ich habe die SQLite.dll von der offiziellen Seite herunter geladen und in
    windows/system32 und in das include-verzeichnis kopiert. Dennoch läuft es nicht. Warum?

    Auch das löschen des SQLite.dll.au3 aus dem Include und script brachte nichts

  • Hallo @hevilp,

    schau dir mal den dritten Parameter ($iForceLocal) von _SQLite_Startup an. Liegt es daran? ;)

    Alternativ zum Verschieben in eines der dort genannten Verzeichnisse kannst du auch mit FileChangeDir das Verzeichnis, in dem die dll liegt zum WorkingDir machen.

    Grüße autoiter