Alinas_SQLite_BuchVw

  • Alinas_SQLite_BuchVw ist ein AutoIt-Listview, neben Editfeld und Gui eine weitere Möglichkeit seine Datenbankinhalte zu präsentieren. Also eine Sichtweise, die uns aus Officeprogrammen geläufig ist, die nun mit der Funktionalität von relationalen Datenbanken einhergeht.

    In diesem Anwendungsbeispiel handelt es sich um eine Datenbank mit einer einzelnen Tabelle, in der eine Büchersammlung verwaltet werden soll. Beim Start der Sammlung soll die Tabelle der Datenbank einige Eckdaten aufnehmen, z.B. ID, Titel, Autor, Erscheinungsdatum und die ISBN.

    Das Datum –
    Mit dem SQL-Befehl “SELECT date(‘now’);” wird nicht nur das aktuelle Datum angezeigt, sondern auch das SQLite interne Datumsformat (YYYY-MM-DD), das in diesem Fall verwendet wird.

    Die Bedienung
    ist denkbar einfach und schnell erklärt. Nach dem Start des Programms wird die DB mit “DB laden” geladen.
    Die Suche funktioniert so, den Suchbegriff eingeben und im Combofeld hier “Titel” voreingestellt eine Auswahl treffen. Nach dem Klick auf “Suche starten” erscheint die Ausgabe im ListView. Zur DB zurück mit “DB laden”.

    Um einen einzelnen Datensatz zu bearbeiten, wechselt man in den Bearbeitungsmodus. Bei einem Rechtsklick auf den jeweiligen Datensatz wird dieser in die Eingabefelder eingefügt und man kann prüfen, ob man eventuell in der Zeile verrutscht ist. Hier können die Datensätze auch eingegeben, geändert oder gelöscht werden. Bevor es losgeht aber erst einmal ein Backup mit “DB BackUp”, nun erhält man eine Txt-Datei, die auch von einem Officeprogramm eingelesen (Daten-Import) werden kann.

    Edit siehe Post #3: Download "sqlite3xx_dll.au3" :
    http://ritzelrocker04.bplaced.net/wordpress/sqli…lite-starterlv/

    PS: Schöne Feiertage!

  • Schaut gut aus ;)

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Vielen Dank an RR04, für das schöne Code-Beispiel! :thumbup:

    Gestern habe mich endlich dazu durchgerungen, ein laaange vor mir her geschobenes Projekt zu realisieren. Die Wahl fiel dabei auf AutoIt & SQLite. Mit beidem bin ich zwar noch Anfänger, habe aber doch einige Erfahrung mit anderen Basic-Dialekten.

    Obiges Listing erschlägt schon einen ziemlich dicken Teil meines angestrebten Programms (für dass ich demnächst einen neuen Thread starte).
    Nur: Leider läuft die Buchverwaltung bei mir nicht ganz korrekt.

    Änderungen an den Einträgen werden zwar in der Listview angezeigt und beim Betätigen des "Speichern"-Buttons auch tatsächlich in die Datei "buchverwaltung.rr04" geschrieben (die sich ordnungsgemäß neben der Scriptdatei befindet), doch beim nächsten Programmstart (der stets mit leer dargestellter Listview erfolgt) und erneutem Laden der Datenbank, sind die letzten Änderungen wieder futsch und es werden die direkt im Quellcode hinterlegten Rohdaten in der ListView dargestellt.
    Leider gelang es mir noch nicht, das Problem selbst zu beheben. :Face:

    Etwas sonderbar erscheint mir die Zeile 127 ... öh, was soll da passieren (und warum)?

    Für mein geplantes Projekt würde ich natürlich allerhand Anpassungen & Erweiterungen vornehmen - doch dazu bräuchte ich zunächst ein lauffähiges Grundgerüst, als Einstieg.

    Die Feldbezeichner (heißen die so?) kommen mehrfach (redundant) im Quelltext vor.
    Weil ich die sowieso alle ändern müsste und weil Mehrsprachigkeit nett wäre, würde es sich IMHO anbieten, diese aus einer ini-Datei zu laden.
    RR04 hat auch diesbezüglich ja bereits ein Bespiel auf seiner Homepage, das förmlich danach schreit, in die (derzeitige) Buchverwaltung integriert zu werden.

    Mein eigenes Projekt wird übrigens eine Verwaltung für Reparaturaufträge, mit integrierter Bauteildatenbank/Lagerverwaltung. Doch mehr dazu demnächst in einem eigenen Thread.

    Es wäre schick, wenn zunächst mal die Buchverwaltung bei mir laufen würde.
    Kann es übrigens sein, dass eine Funktion zum Hinzufügen neuer Datensätze noch fehlt?

    Ich code, also bin ich!

  • Danke, autoBert!
    Komisch: Gestern hatte ich genau das schon ausprobiert, aber da trat der sonderbare Effekt auf, dass die Standard-Einträge plötzlich mehrfach in der Datenbank vorhanden waren, nebst einigen neuen.
    Als mir das auffiel, war die Datenbank bereits auf 67 Datensätze angewachsen.
    All meine Versuche, die Ursache dafür zu finden, scheiterten.
    Keine Ahnung, was gestern schief lief, aber heute noch mal frisch probiert, geht's. Danke!

    Eine Frage an RR04:
    Hast Du für die Gestaltung des GUI einen Designer verwendet?
    Oder hast Du einfach so lange im Script herumparametriert, bis es so schön schnuckelig aussah?

    Ich hatte vor 10 Jahren mal eine umfangreiche Applikation in VB.Net programmiert. Die nahm mit der Zeit so einen derben Umfang an, dass ich am Ende auf den grafischen Designer von VB.Net hustete.
    Statt dessen las das Programm die Positionsdaten und sonstigen Parameter der Bedienelemente bei Programmstart aus einer ini-Datei ein.
    So konnte jeder User (mit viiieeel Geduld) eigene Anpassungen am Design vornehmen.
    Ganz glücklich war ich mit diesem Verfahren aber auch nicht, weil es einfach gar zu schwierig war, eine komplexe und reichlich mit Elementen vollgekleisterte Oberfläche per Editor, oder Excel umzugestalten.

    Da suche ich also noch nach einem brauchbaren Weg, der es dem unbedarften User ermöglicht, einigermaßen komfortabel eigene Anpassungen am Design vorzunehmen.

    Ich code, also bin ich!

  • Nein. Er hat keinen Designer verwendet. Sieht man daran, dass die Controls in nem Array erstellt werden. Sowas ist immer sehr sinnvoll, wenn man sich wiederholende Strukturen hat.
    Allgemein sind Designer in AutoIt nicht allzusehr zu empfehlen, wenn man nicht mal eben schnell was zusammenbasteln will, oder die Controls noch nicht kennt.
    Das liegt aber daran, dass es keine Layouts gibt, die zum Beispiel beim resizen,... viel Vereinfachen.
    Das Prinzip könnte man aber mal nachbauen... Wäre mal ne Idee für ne UDF. So immer weiter Elemente verschachteln,... werd ich mir mal überlegen :)

  • Ja, das war auch der Grund, warum ich damals auf den Designer verzichtete.
    Es kommt bei einzelnen Anwendern vor, dass sie oft Daten von Listen abtippen müssen. Dazu machen die dann beispielsweise ein schmales Editorfenster auf und ziehen das Fenster meines Programmes ebenfalls schmaler, um es neben dem Editor zu platzieren.

    Mit fixen Positionen für die Bedienelemente, die sich an einem starren Fenster mit unveränderbaren Abmessungen orientieren, würde das nicht gehen.
    Doch wenn man frei schwimmende Elemente verwendet, die sich den Abmessungen eines in der Größe veränderbaren Fensters dynamisch anpassen, dann kann es vorkommen, dass es nun so richtig müllig aussieht, weil die Bedienelemente sich sonstwie anordnen.
    Arbeitet ein User praktisch immer mit einer bestimmten, individuell eingestellten Fenstergröße, so kommt folglich rasch der Wunsch auf, das Layout entsprechend aufzuräumen.

    Sehr fortgeschrittene Programme haben dafür dann einen eingebauten Modus, der die Umgestaltung per Maus ermöglicht, wie bei einem eigenständigen GUI-Designer.
    Sooo weit wollte ich nicht unbedingt ausholen. Aber ein gangbarer Mittelweg, zwischen Programmieraufwand und Flexibilität, wäre schon schick.

    Ich code, also bin ich!

  • Wie schon ja "angedroht", baue ich derzeit ein eigenes Programm, das auf der prima Code-Vorlage von RR04 aufbaut (vielen Dank an RR04!).

    Bevor ich dazu einen eigenen Thread starte, wollte ich zunächst noch einmal meinen derzeitigen Stand der Umbauarbeiten hier im Thread zu Alinas Bücherverwaltung mit Euch teilen.
    Denn NOCH hat das Programm Ähnlichkeit mit RR04s Fundament und ich dachte mir, dass mein Code-Stil (den ich für übersichtlich halte) vielleicht Anregungen liefert.

    Großartig neue Features sind noch nicht hinzu gekommen - mal abgesehen von der Menüleiste.
    Meine Arbeit bestand hauptsächlich darin, den Code (nach meinem Ermessen) ein gutes Stück übersichtlicher und leichter pflegbar zu gestalten (wodurch er schon reichlich angewachsen ist).
    - Ein Prozess, der zwar noch nicht ganz abgeschlossen ist, aber meine nächsten Umbauten werden den Code so stark verändern, dass er mit Alinas Bücherverwaltung nicht mehr viel zu tun hat. Und ich wollte Alina noch die Chance geben, was zu verwerten, falls ihr etwas brauchbar erscheint.
    Denn in der jetzigen Form scheint es mir eine schon ziemlich gute Basis für ähnlich gelagerte Aufgaben zu sein.

    Soweit ich neue Variablen eingefügt habe, hielt ich mich an die hier im Forum empfohlenen Konventionen.

    Die Erzeugung der Musterdatensätze erfolgt nun wirklich nur dann, wenn die Datenbankdatei noch nicht existiert. Damit gab es Anfangs ja ein Problem ...
    Allerdings werden bereits jetzt Datensätze für eine Reparaturverwaltung erzeugt, statt für eine Bücherverwaltung. Die Textboxen sind aber daran noch nicht angepasst und noch an Ort und Stelle. Auch die Anzahl der Felder habe ich derzeit noch nicht verändert (jedoch deren Breite und Textausrichtung in der ListView); Alina wird also den jetzigen Stand ganz leicht wieder an ihre Bedürfnisse anpassen können.

    Hoffentlich ist meine Danksagung, die per Menü aufrufbar ist, ausreichend, um die Vorarbeit von RR04 und BugFix angemessen zu würdigen?
    - Sonst meckert, dann intensiviere ich meine Lobpreisungen!

    Vorschau auf die nahe Zukunft (dann in einem eigenen Thread):
    Mein nächster Umbau wird sein, dass die Oberflächengestaltung aus einer Datei geladen wird, damit man nicht so viel im Quelltext herumwühlen muss, um das GUI umzugestalten.
    Außerdem implementiere ich weitere Ansichten, z. B. eine Vollbilddarstellung für die ListView-Tabelle.
    Später kommt noch eine relationale Verknüpfung mit einer Adressdatenbank und einer Geräte-Datenbank hinzu.
    Weiterhin wird für jeden Reparaturauftrag ein Ordner erzeugt werden, der Bilder, Datenblätter und sonstige Dateien beinhalten kann, die dann per Verknüpfung aus dem Programm flott aufrufbar sind.
    Langfristig kommen noch diverse Druckfunktionen für Formulare (Reparaturannahme-Beleg) und gaaanz später die Möglichkeit, Rechnungen zu drucken (hier wird es aber langsam komplex, ich weiß!).

    Ich habe also Groooßes vor; wir werden noch miteinander zu tun haben! :)

    Quellcode
    [autoit]

    #Region Header #################################################################################################################\
    ; Erstellt mit AutoIt-Version v3.3.14.2

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

    Global Const $sProgrammname = "Reparaturverwaltung"
    Global Const $sVersion = "0.06"
    Global Const $sRevisionsdatum = "29.05.2016"
    Global Const $sAutor = "EDV-Dompteur, Stefan Denk"
    Global Const $sWebsite = "http://www.EDV-Dompteur.de"

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

    ; --- P r o g r a m m b e s c h r e i b u n g -----------------------------------------------------------------------------\
    Global Const $sAbout = "Programmname: " & $sProgrammname & @CRLF & "Version: " & $sVersion & @CRLF & "Autor: " & $sAutor & @CRLF & "Website: " & $sWebsite & @CRLF _
    & @CRLF & "P r o g r a m m b e s c h r e i b u n g" _
    & @CRLF & "---------------------------------------" _
    & @CRLF & "Die hier vorliegende Software ist Freeware, also zur kostenlosen Nutzung freigegeben!" _
    & @CRLF & "Das Programm dient kleinen Reparaturbetrieben dazu, den Überblick über ihre ausgeführten Arbeiten zu behalten." _
    & @CRLF & "Die Details einer jeden Reparatur werden in einem eigenen Datensatz einer SQLite-Datenbank gespeichert." _
    & @CRLF & "Eine Übersicht, in Form einer frei sortierbaren Liste, ermöglicht es rasch nach Datum, Kunde, Gerät etc. zu sortieren."
    ; --- P r o g r a m m b e s c h r e i b u n g -----------------------------------------------------------------------------/

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

    ; --- History -------------------------------------------------------------------------------------------------------------\
    Global Const $sHistory = "" _
    & @CRLF & "D a n k s a g u n g:" _
    & @CRLF & "----------------------" _
    & @CRLF & "Die Code-Vorlage, auf der dieses Programm aufbaut, stammt vom User ""RR04"", aus dem großartigen Forum http://www.AutoIt.de" _
    & @CRLF & "Hier der Foren-Thread mit der Ursprungsversion:" _
    & @CRLF & "https://autoit.de/index.php/Thread/83862-Alinas-SQLite-BuchVw/" _
    & @CRLF & "Vielen Dank an ""RR04"", für die tolle Vorarbeit, die mir sicherlich mehrere Tage Arbeit erspart hat!" _
    & @CRLF _
    & @CRLF & "Weiterhin enthielt bereits die Vorlage von ""RR04"" eine Routine von ""BugFix"" ([email='bugfix@autoit.de'][/email]), namens ""_SQLite_CountRows""" _
    & @CRLF & "Besagte Routine dient dazu, die Anzahl der Datensätze in der SQL-Datenbank zu ermitteln." _
    & @CRLF & "Vielen Dank daher auch an ""BugFix""!" _
    & @CRLF & "" _
    & @CRLF & "Ab hier beginnen nun die Änderngen und Erweiterungen durch Fa. EDV-Dompteur, Stefan Denk:" _
    & @CRLF _
    & @CRLF & "H i s t or y:" _
    & @CRLF & "-------------" _
    & @CRLF & "V0.01 vom 28.05.2016:" _
    & @CRLF & "- Programm umbenannt und erste Umgestaltungen der Quelltext-Vorlage von RR04." _
    & @CRLF & "- Programmbeschreibung und History im Quelltext-Header implementiert; derart, dass auch eine Ausgabe dieser Texte möglich wird." _
    & @CRLF & "- Die Tabelle wird nun bei Programmstart automatisch mit Datensätzen gefüllt (wenn DB noch nicht vorhanden, wird sie zuvor erzeugt)." _
    & @CRLF _
    & @CRLF & "V0.06 vom 29.05.2016:" _
    & @CRLF & "- Der ListView-Header ist nun eine Variable, zwecks späterer Möglichkeit zum Einlesen aus einer ini-Datei." _
    & @CRLF & "- Die Beispiel-Datensätze der usprünglichen Reparaturverwaltung umgestrickt auf die Belange einer Reparaturverwaltung." _
    & @CRLF & "- Die Feldbezeichner der SQL-Datenbank verallgemeinert, zwecks leichterer Modifizierbarkeit." _
    & @CRLF & "- Neue Datenfelder definiert: Projektordner, Gesprächsnotiz, Reparaturbericht." _
    & @CRLF & "- Bugfix: Nach dem letzten Quelltext-Umbau wurden Datensätze nicht mehr aktualisiert, nach entsprechender Button-Betätigung." _
    & @CRLF & "- Programmbeschreibung und History werden jetzt mit Zeilenumbrüchen formatiert ausgegeben." _
    & @CRLF & "- Bugfix: Datenfeld 20 wurde nicht mit aktualisiert, nach dem Editieren eines Datensatzes." _
    & @CRLF & "- Menüleiste hinzugefügt. Funktionen: Exit, Programminfo, History (der Menüzweig ""Einstellungen"" ist noch ohne Funktion)." _
    & @CRLF & "- Listview: Spaltenbreiten und Textausrichtung eingestellt. Erste Vorbereitung für späteres Laden der Werte aus ini-Datei."
    ; --- History -------------------------------------------------------------------------------------------------------------/

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

    ; --- Aktuelle Aufgaben ---------------------------------------------------------------------------------------------------\
    Global Const $sProgrammieraufgaben = "" _
    & @CRLF & "Folgende drei Darstellungsmodi implementieren: Kombi (Tabelle und Datensatz, wie gehabt), Tabelle (volle Größe), Datensatz (ohne Tabelle)" _
    & @CRLF & ""
    ; --- Aktuelle Aufgaben ---------------------------------------------------------------------------------------------------/

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

    #include <Date.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiStatusBar.au3>
    #include <GUIConstantsEx.au3>
    #include <ComboConstants.au3>
    #include <GuiListView.au3>
    #include <String.au3>
    #include <SQLite.au3>
    #include <sqlite3101_dll.au3>

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

    #include <EditConstants.au3> ;Test
    #include <Array.au3> ;Test
    #EndRegion Header ##############################################################################################################/

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

    #Region Constanten & Variablen deklarieren und belegen #########################################################################\
    ; --- Globale Constanten deklarieren --------------------------------------------------------------------------------------\
    Global Const $asWDAYger[7] = ["Sonntag, ", "Montag, ", "Dienstag, ", "Mittwoch, ", "Donnerstag, ", "Freitag, ", "Samstag, "]
    ; --- Globale Constanten deklarieren --------------------------------------------------------------------------------------/

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

    ; --- Globale Variablen deklarieren ---------------------------------------------------------------------------------------\
    Opt("MustDeclareVars", 1) ;Zwingt den Programmierer, Variablen ordentlich zu deklarieren, vor der ersten Benutzung.
    Global $cboSerch, $iptSerch, $FormKombiansicht, $Label, $ListView, $ContextMenu, $MenuItem, $btnUpdate, $btnDelete, $iptSearch
    Global $cboSearch, $btnSearch, $btnDBladen, $btnClear, $lblBottomLine, $btnSave, $btnBackUp, $Result, $sDatenbankVollpfad
    Global $sTmp, $sText
    Global $sListViewHeader
    ; --- Globale Variablen deklarieren ---------------------------------------------------------------------------------------/

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

    ; ---Globale Variablen mit Werten belegen ---------------------------------------------------------------------------------\
    $sDatenbankVollpfad = @ScriptDir & "\Reparaturverwaltung.rr04"
    ; ---Globale Variablen mit Werten belegen ---------------------------------------------------------------------------------/
    #EndRegion Constanten & Variablen deklarieren und belegen ######################################################################/

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

    #Region Bedienoberfläche zeichnen ##############################################################################################\
    ; --- Fenster & Menü erzeugen-----------------------------------------------------------\
    Global $FormKombiansicht = GUICreate($sProgrammname, 1200, 768, 10, 10) ;Das Hauptfenster erzeugen.
    ; --- Menüzweig 1 ------------------------------------------------------------\
    Global $MenuA = GUICtrlCreateMenu("Datei")
    Global $MenuItemAExit = GUICtrlCreateMenuItem("Schließen", $MenuA)
    ; --- Menüzweig 1 ------------------------------------------------------------/

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

    ; --- Menüzweig 2 ------------------------------------------------------------\
    Global $MenuB = GUICtrlCreateMenu("Einstellungen")
    Global $MenuItemB04 = GUICtrlCreateMenuItem("Optionen", $MenuB)
    ; --- Menüzweig 2 ------------------------------------------------------------/

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

    ; --- Menüzweig 3 ------------------------------------------------------------\
    Global $MenuC = GUICtrlCreateMenu("?")
    Global $MenuItemCProgramminfo = GUICtrlCreateMenuItem("Programminfo", $MenuC)
    Global $MenuItemCHistory = GUICtrlCreateMenuItem("History && Danksagung", $MenuC)
    ; --- Menüzweig 3 ------------------------------------------------------------/
    ;GUISetState(@SW_SHOW) ;??? Was macht dieser Befehl?
    ; --- Fenster & Menü erzeugen-----------------------------------------------------------/

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

    ; --- Programmname darstellen ----------------------------------------------------------\
    $Label = GUICtrlCreateLabel("~ ~ ~ " & $sProgrammname & " Version: " & $sVersion & " ~ ~ ~", 0, 8, 1125, 28, 0x01) ; $SS_CENTER=0x01
    GUICtrlSetFont(-1, 16, 800, 0, "Arial")
    GUICtrlSetColor(-1, 0x0000FF)
    ; --- Programmname darstellen ----------------------------------------------------------/

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

    ; --- Liestview aufbauen --------------------------------------------------------------------------------------------------\
    ; ---- Headerzeile der ListView --------------------------------------------------------\
    $sListViewHeader= "" _
    & "ID" _
    & "|Annahme" _
    & "|Abholung" _
    & "|Gerät" _
    & "|Schadenskürzel" _
    & "|Firma" _
    & "|Vorname" _
    & "|Nachname" _
    & "|Endpreis" _
    & "|Re-Nr." _
    & "|Anzahl." _
    & "|Leihteile" _
    & "|Voranschlag" _
    & "|ReklaDat" _
    & "|Projektordner" _
    & "|Gesprächsnotiz" _
    & "|Reparaturbericht" _
    & "|17" _
    & "|18" _
    & "|19" _
    & "|20"
    ; ---- Headerzeile der ListView --------------------------------------------------------/

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

    ; --- Listwiew erzeugen ----------------------------------------------------------------\
    Global $aHeader = StringSplit($sListViewHeader, '|')
    $ListView = GUICtrlCreateListView($sListViewHeader, 0, 40, 1125, 220)
    GUICtrlSetBkColor(-1, 0xFFFFFF) ; Color weiß
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    ; --- Listwiew erzeugen ----------------------------------------------------------------/

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

    ; --- Spaltenbreiten und Textausrichtung der Listview-Spalten festlegen ----------------\
    Global $GetHandleLV = GUICtrlGetHandle($ListView)
    _GUICtrlListView_SetColumn($GetHandleLV, 0, $aHeader[1], 40, 1) ;ID
    _GUICtrlListView_SetColumn($GetHandleLV, 1, $aHeader[2], 80, 0) ;Annahmedatum
    _GUICtrlListView_SetColumn($GetHandleLV, 2, $aHeader[3], 70, 0) ;Abholdatum
    _GUICtrlListView_SetColumn($GetHandleLV, 3, $aHeader[4], 120, 0) ;Gerät
    _GUICtrlListView_SetColumn($GetHandleLV, 4, $aHeader[5], 100, 0) ;Schadenskürzel
    _GUICtrlListView_SetColumn($GetHandleLV, 5, $aHeader[6], 110, 0) ;Firma
    _GUICtrlListView_SetColumn($GetHandleLV, 6, $aHeader[7], 110, 1) ;Vorname
    _GUICtrlListView_SetColumn($GetHandleLV, 7, $aHeader[8], 110, 0) ;Nachname
    _GUICtrlListView_SetColumn($GetHandleLV, 8, $aHeader[9], 60, 1) ;Endpreis
    _GUICtrlListView_SetColumn($GetHandleLV, 9, $aHeader[10], 60, 1) ;Rechnungsnummer
    _GUICtrlListView_SetColumn($GetHandleLV, 10, $aHeader[11], 60, 1) ;Anzahlung
    _GUICtrlListView_SetColumn($GetHandleLV, 11, $aHeader[12], 150, 0) ;Leihteile
    _GUICtrlListView_SetColumn($GetHandleLV, 12, $aHeader[13], 60, 1) ;Voranschlag
    _GUICtrlListView_SetColumn($GetHandleLV, 13, $aHeader[14], 70, 0) ;Reklamationsdatum
    _GUICtrlListView_SetColumn($GetHandleLV, 14, $aHeader[15], 100, 0) ;Projektordner
    _GUICtrlListView_SetColumn($GetHandleLV, 15, $aHeader[16], 100, 0) ;Gesprächsnotiz
    _GUICtrlListView_SetColumn($GetHandleLV, 16, $aHeader[17], 100, 0) ;Reparaturbericht
    _GUICtrlListView_SetColumn($GetHandleLV, 17, $aHeader[18], 40, 0)
    _GUICtrlListView_SetColumn($GetHandleLV, 18, $aHeader[19], 40, 0)
    _GUICtrlListView_SetColumn($GetHandleLV, 19, $aHeader[20], 40, 0)
    ; --- Spaltenbreiten und Textausrichtung der Listview-Spalten festlegen ----------------/

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

    $ContextMenu = GUICtrlCreateContextMenu($ListView)
    $MenuItem = GUICtrlCreateMenuItem("Datensatz bearbeiten", $ContextMenu)
    ; --- Liestview aufbauen --------------------------------------------------------------------------------------------------/

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

    ; --- Main Area -----------------------------------------------------------------------------------------------------------\
    ; --- Buttons, Labels und Inputfelder erzeugen -------------------------------\
    Global $aCtrlLabel[21], $aCtrlInput[21]
    $aCtrlLabel[0] = GUICtrlCreateLabel($aHeader[1], 10, 272, 150, 22)
    $aCtrlInput[0] = GUICtrlCreateInput("0", 170, 272, 180, 26)
    ;
    For $i = 1 To 6
    $aCtrlLabel[$i] = GUICtrlCreateLabel($aHeader[$i + 1], 10, 272 + $i * 35, 150, 22)
    $aCtrlInput[$i] = GUICtrlCreateInput($i, 170, 272 + $i * 35, 360, 26)
    Next
    ;
    For $j = 7 To 12
    $aCtrlLabel[$j] = GUICtrlCreateLabel($aHeader[$j + 1], 10 + Mod($j, 2) * 290, 515 + Int(($j - 7) / 2) * 35, 150, 22)
    $aCtrlInput[$j] = GUICtrlCreateInput($j, 170 + Mod($j, 2) * 240, 515 + Int(($j - 7) / 2) * 35, 120, 26)
    Next
    ;
    For $k = 13 To 19
    $aCtrlLabel[$k] = GUICtrlCreateLabel($aHeader[$k + 1], 620, 272 + ($k - 13) * 33, 120, 22)
    $aCtrlInput[$k] = GUICtrlCreateInput($k, 750, 272 + ($k - 13) * 33, 120, 26)
    Next
    ;
    For $m = 0 To 19
    GUICtrlSetFont($aCtrlLabel[$m], 12, 400, 0, "Arial")
    GUICtrlSetFont($aCtrlInput[$m], 12, 400, 0, "Arial")
    Next
    ;Information
    $aCtrlLabel[20] = GUICtrlCreateLabel($aHeader[20 + 1], 895, 272, 100, 22)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    $aCtrlInput[20] = GUICtrlCreateEdit("Gesprächsnotiz", 895, 300, 217, 160)
    ;
    $btnUpdate = GUICtrlCreateButton("DS Update", 895, 470, 105, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    $btnDelete = GUICtrlCreateButton("DS Löschen", 1010, 470, 105, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    ;Suche
    $iptSearch = GUICtrlCreateInput("Suchen nach >>>", 620, 510, 492, 26)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    $cboSearch = GUICtrlCreateCombo("Annahme", 620, 545, 241, 25, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
    GUICtrlSetData(-1, "Autor|Verlag")
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    $btnSearch = GUICtrlCreateButton("Suche starten", 871, 545, 241, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    ;
    $btnDBladen = GUICtrlCreateButton("Datenbank laden", 871, 583, 241, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    $btnClear = GUICtrlCreateButton("Eingabefelder leeren", 620, 583, 241, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    ; --- Buttons, Labels und Inputfelder erzeugen -------------------------------/
    ; --- Main Area -----------------------------------------------------------------------------------------------------------/

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

    ; --- Horizontale, gestrichelte Linie erzeugen -------------------------------\
    Const $trR = _StringRepeat("-", 368)
    $lblBottomLine = GUICtrlCreateLabel($trR, 10, 615, 1110, 8)
    ; --- Horizontale, gestrichelte Linie erzeugen -------------------------------/

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

    ; --- Bottom Area ---------------------------------------------------------------------------------------------------------\
    ; --- Untere Inputfelder erzeugen --------------------------------------------\
    Global $aCtrllbl[3], $aCtrlipt[3], $aLblTxt[3] = ["Auftragsanzahl:", "Ges. Seitenzahl:", "Ges. Buch NP:"]
    For $l = 0 To 2
    $aCtrllbl[$l] = GUICtrlCreateLabel($aLblTxt[$l], 10 + ($l) * 260, 640, 120, 22)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    $aCtrlipt[$l] = GUICtrlCreateInput($l, 140 + ($l) * 260, 638, 120, 26, 0x0002) ; $ES_RIGHT=0x0002
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    Next
    ; --- Untere Inputfelder erzeugen --------------------------------------------/

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

    ; --- Button "Datensatz kopieren" erzeugen -----------------------------------\
    $btnSave = GUICtrlCreateButton("DS kopieren", 1010, 635, 105, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    ; --- Button "Datensatz kopieren" erzeugen -----------------------------------/

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

    ; --- Button "Datenbank-Backup" erzeugen -------------------------------------\
    $btnBackUp = GUICtrlCreateButton("DB BackUp", 895, 635, 105, 28)
    GUICtrlSetFont(-1, 12, 400, 0, "Arial")
    ; --- Button "Datenbank-Backup" erzeugen -------------------------------------/
    ; --- Bottom Area ---------------------------------------------------------------------------------------------------------/

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

    ; --- Statusbar am untersten Fensterrand ----------------------------------------------------------------------------------\
    Global $idStatusbar = _GUICtrlStatusBar_Create($FormKombiansicht)

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

    GUISetState(@SW_SHOW)

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

    _timeStatus() ; Funktion aufrufen sofortige einmalige Ausführung nach Programmstart
    AdlibRegister('_timeStatus', 1000) ; Start alle 1000 milisec.

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

    ;ConsoleWrite("_SQLite_LibVersion=" & _SQLite_LibVersion())
    ;ConsoleWrite("Heute ist ein schöner Tag!"& @CRLF)

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

    Global $idStatusbar_PartsWidth[3] = [450, 900, -1]
    _GUICtrlStatusBar_SetParts($idStatusbar, $idStatusbar_PartsWidth)
    _GUICtrlStatusBar_SetText($idStatusbar, " _SQLite_LibVersion = " & _SQLite_LibVersion(), 0)
    _GUICtrlStatusBar_SetText($idStatusbar, " " & $asWDAYger[@WDAY - 1] & _DateTimeFormat(_NowCalc(), 2), 1)
    _GUICtrlStatusBar_SetMinHeight($idStatusbar, 20)
    ; --- Statusbar am untersten Fensterrand ----------------------------------------------------------------------------------/
    #EndRegion Bedienoberfläche zeichnen ###########################################################################################/

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

    #Region SQL starten & Datenbank in Listview laden (DB gegebenenfalls zuerst erzeugen) ##########################################\
    _SQLite_Startup(@ScriptDir & "\sqlite3.dll", False, 1) ; BugFix Idee, da DLL ja nicht mehr mitgeliefert wird
    If @error Then
    $sTmp = "SQLite.dll konnte nicht geladen werden!"
    MsgBox($MB_SYSTEMMODAL, "SQLite Error", $sTmp)
    Exit -1
    EndIf

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

    Local $bTabelleErzeugen = 0
    If Not FileExists($sDatenbankVollpfad) Then
    $bTabelleErzeugen = True
    EndIf

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

    Global $g_db_Database = _SQLite_Open($sDatenbankVollpfad) ;Datenbank öffnen. Falls noch nicht vorhanden, dann erzeugen & öffnen.
    If @error Then
    $sTmp = "Die Datenbank:" & @CRLF & $sDatenbankVollpfad & @CRLF & "konnte nicht geöffnet werden!"
    MsgBox($MB_SYSTEMMODAL, "SQLite Error", $sTmp)
    Exit -1
    EndIf

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

    If $bTabelleErzeugen = True Then
    ; --- Datenbank-Tabelle erzeugen-----------------------------------------------------------------------------------------\
    Global $sDBHeader = "CREATE TABLE IF NOT EXISTS Reparaturverwaltung(ID INTEGER PRIMARY KEY AUTOINCREMENT," _
    & "F01," _ ;Annahme
    & "F02," _ ;Abholung
    & "F03," _ ;Gerät
    & "F04," _ ;Schadenskürzel
    & "F05," _ ;Firma
    & "F06," _ ;Vorname
    & "F07," _ ;Nachname
    & "F08," _ ;Endpreis
    & "F09," _ ;Rechnungsnummer
    & "F10," _ ;Anzahlung
    & "F11," _ ;Leihteile
    & "F12," _ ;Voranschlag
    & "F13," _ ;Reklamationsdatum
    & "F14," _ ;Projektordner
    & "F15," _ ;Gesprächsnotiz
    & "F16," _ ;Reparaturbericht
    & "F17," _
    & "F18," _
    & "F19," _
    & "F20);"
    ; --- Datenbank-Tabelle erzeugen ----------------------------------------------------------------------------------------/

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

    ; --- Mehrere Beispiel-Datensätze erzeugen ------------------------------------------------------------------------------\
    _SQLite_Exec($g_db_Database, $sDBHeader)
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-22 11','16-03-22 18','Medion Akoya 731','Buchse defekt','','Herbert','Mustermann','100.00','576','20.00','USB-HDD-Gehäuse','100.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-21 12','16-03-22 11','HP dv7','Buchse defekt','RA Rechtsverdreh','Ede','Knastmann','100.00','1039','','','100.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-27 16','16-03-28 11','Lenovo 730','Scharnier lose','','Cornelia','Turteltaub','120.00','1038','100.00','','100.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-04-22 09','16-04-27 11','Lenovo 1100','Einschaltproblem','','Waltrude','von der Weide','80.00','1040','10.00','','100.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-06-22 15','16-06-29 11','Toshiba Satellite 50','Stabilitätsproblem','Schokofabrik ABC','Ali','Bahbah','47.50','413','10.00','Leihgerät 4','-','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-07-22 13','16-07-22 17','Sony Vaio MG3000','Grafikfehler','','','Megenstadter','22.50','-','22.50','','-','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-22 11','16-03-28 15','Lenovo AS200','Sturzschaden','Druckerei Müller','Willybald','Mustermann','100.00','-','','','100.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-01-22 12','16-03-23 15','Toshiba Satellite X20','Flüssigkeitsschaden','','Fridolin','Kaiserschmarrn','90.00','1041','','','100.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'15-03-22 11','15-04-01 12','MSI XC70S','Buchse defekt','???','','Maienbaum','0.00','-','','','0.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-03-22 16','16-03-23 10','HP HDX18','Flüssigkeitsschaden','Werbeagentur DeLuxe','Veronika','Glitterstrass','1050.79','1042','500.00','','1000.00','','','','','','','','');")
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL,'16-05-27 16','','Asus X738','Einschaltproblem','Druckerei Müller','Willybald','Mustermann','','','','','100.00','','','','','','','','');")
    ; --- Mehrere Beispiel-Datensätze erzeugen ------------------------------------------------------------------------------\
    EndIf

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

    _SQLite_CountRows('Reparaturverwaltung')
    _ListViewFill() ;Listview mit den Datensätzen der (nun garantiert vorhandenen und geöffneten) Datenbank-Datei füllen.
    #EndRegion SQL starten & Datenbank in Listview laden (DB gegebenenfalls zuerst erzeugen) #######################################/

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

    #Region Hauptschleife ##########################################################################################################\
    While True
    Switch GUIGetMsg()

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

    Case -3
    _Exit()

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

    Case $ListView
    _GUICtrlListView_SortItems($ListView, GUICtrlGetState($ListView))

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

    Case $btnSave
    _DsInsert()
    _ListViewFill()
    _iptClear()
    _SQLite_CountRows('Reparaturverwaltung')

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

    Case $btnDelete
    _DsDelete()
    _ListViewFill()
    _SQLite_CountRows('Reparaturverwaltung')

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

    Case $btnUpdate
    _DsUpdate()
    _ListViewFill()

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

    Case $btnSearch
    _ListViewFill("SELECT ROWID,* From Reparaturverwaltung WHERE " & GUICtrlRead($cboSearch) & " LIKE '" & GUICtrlRead($iptSearch) & "';")

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

    Case $btnDBladen
    _ListViewFill()

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

    Case $btnClear
    _iptClear()

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

    Case $btnBackUp
    _DB_BackUp()

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

    Case $MenuItem
    _iptClear()
    _ListView2ipt()

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

    Case $MenuItemAExit
    _Exit()

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

    Case $MenuItemCProgramminfo
    msgbox(0, "", $sAbout)

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

    Case $MenuItemCHistory
    msgbox(0, "", $sHistory)
    EndSwitch
    WEnd
    #EndRegion Hauptschleife #######################################################################################################/

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

    ; ### Functions ################################################################################################################\
    Func _timeStatus()
    Local $zeit = _DateTimeFormat(_NowCalc(), 5)
    _GUICtrlStatusBar_SetText($idStatusbar, " Uhrzeit: " & $zeit, 2)
    EndFunc ;==>_timeStatus
    ; #############################################################################
    Func _ListViewFill($QLite = "SELECT ROWID,* FROM Reparaturverwaltung;")
    Local $hQuery, $aRow
    _GUICtrlListView_DeleteAllItems($ListView)
    ;~ _SQLite_Query(-1, "SELECT ROWID,* FROM Reparaturverwaltung;", $hQuery)
    _SQLite_Query(-1, $QLite, $hQuery)
    While _SQLite_FetchData($hQuery, $aRow, False, False) = $SQLITE_OK ; Read Out the next Row
    GUICtrlCreateListViewItem(_ArrayToString($aRow, '|', 1, 21), $ListView)
    GUICtrlSetBkColor(-1, 0xF0E68C) ; (0xF9F9F9) helles Grau (0xB9D1EA) helles blau (0xF0E68C)
    WEnd
    _SQLite_QueryFinalize($hQuery)
    _GUICtrlListView_RegisterSortCallBack($ListView) ; CallBack registrieren zum sortieren
    EndFunc ;==>_ListViewFill
    ; #############################################################################
    Func _DsDelete() ;Datensatz löschen.
    _SQLite_Exec(-1, "DELETE From Reparaturverwaltung WHERE ID = " & GUICtrlRead($aCtrlInput[0]) & ";")
    EndFunc ;==>_DsDelete
    ; #############################################################################
    Func _DsUpdate() ;Datensatz updaten
    _SQLite_Exec(-1, "UPDATE Reparaturverwaltung SET " _
    & "F01 = '" & GUICtrlRead($aCtrlInput[1]) & "'," _
    & "F02 = '" & GUICtrlRead($aCtrlInput[2]) & "'," _
    & "F03 = '" & GUICtrlRead($aCtrlInput[3]) & "'," _
    & "F04 = '" & GUICtrlRead($aCtrlInput[4]) & "'," _
    & "F05 = '" & GUICtrlRead($aCtrlInput[5]) & "'," _
    & "F06 = '" & GUICtrlRead($aCtrlInput[6]) & "'," _
    & "F07 = '" & GUICtrlRead($aCtrlInput[7]) & "'," _
    & "F08 = '" & GUICtrlRead($aCtrlInput[8]) & "'," _
    & "F09 = '" & GUICtrlRead($aCtrlInput[9]) & "'," _
    & "F10 = '" & GUICtrlRead($aCtrlInput[10]) & "'," _
    & "F11 = '" & GUICtrlRead($aCtrlInput[11]) & "'," _
    & "F12 = '" & GUICtrlRead($aCtrlInput[12]) & "'," _
    & "F13 = '" & GUICtrlRead($aCtrlInput[13]) & "'," _
    & "F15 = '" & GUICtrlRead($aCtrlInput[14]) & "'," _
    & "F15 = '" & GUICtrlRead($aCtrlInput[15]) & "'," _
    & "F16 = '" & GUICtrlRead($aCtrlInput[16]) & "'," _
    & "F17 = '" & GUICtrlRead($aCtrlInput[17]) & "'," _
    & "F18 = '" & GUICtrlRead($aCtrlInput[18]) & "'," _
    & "F19 = '" & GUICtrlRead($aCtrlInput[19]) & "'," _
    & "F20 = '" & GUICtrlRead($aCtrlInput[20]) & "'" _
    & "WHERE ID = " & GUICtrlRead($aCtrlInput[0]) & ";")
    EndFunc ;==>_DsUpdate
    ; #############################################################################
    Func _DsInsert() ;Neuen Datensatz hinzufügen.
    _SQLite_Exec(-1, "INSERT INTO Reparaturverwaltung VALUES(NULL, '" _
    & GUICtrlRead($aCtrlInput[1]) & "','" _
    & GUICtrlRead($aCtrlInput[2]) & "','" _
    & GUICtrlRead($aCtrlInput[3]) & "','" _
    & GUICtrlRead($aCtrlInput[4]) & "','" _
    & GUICtrlRead($aCtrlInput[5]) & "','" _
    & GUICtrlRead($aCtrlInput[6]) & "','" _
    & GUICtrlRead($aCtrlInput[7]) & "','" _
    & GUICtrlRead($aCtrlInput[8]) & "','" _
    & GUICtrlRead($aCtrlInput[9]) & "','" _
    & GUICtrlRead($aCtrlInput[10]) & "','" _
    & GUICtrlRead($aCtrlInput[11]) & "','" _
    & GUICtrlRead($aCtrlInput[12]) & "','" _
    & GUICtrlRead($aCtrlInput[13]) & "','" _
    & GUICtrlRead($aCtrlInput[14]) & "','" _
    & GUICtrlRead($aCtrlInput[15]) & "','" _
    & GUICtrlRead($aCtrlInput[16]) & "','" _
    & GUICtrlRead($aCtrlInput[17]) & "','" _
    & GUICtrlRead($aCtrlInput[18]) & "','" _
    & GUICtrlRead($aCtrlInput[19]) & "','" _
    & GUICtrlRead($aCtrlInput[20]) & "');")
    EndFunc ;==>_DsInsert
    ; #############################################################################
    Func _ListView2ipt()
    ;~ MsgBox(0, "Information", "Selected Mark: " & _GUICtrlListView_GetSelectionMark($ListView))
    Local $electionMark = _GUICtrlListView_GetSelectionMark($ListView)
    If $electionMark > -1 Then
    Local $aLVitem = _GUICtrlListView_GetItemTextArray($ListView, $electionMark)
    For $i = 1 To $aLVitem[0]
    ;~ MsgBox(0, "Information", "ItemTextArray: " & $aIpt[$i-1] & " " & $aLVitem[$i])
    GUICtrlSetData($aCtrlInput[$i - 1], $aLVitem[$i])
    Next
    EndIf
    EndFunc ;==>_ListView2ipt
    ; #############################################################################
    Func _iptClear()
    For $i = 0 To 20
    GUICtrlSetData($aCtrlInput[$i], "")
    Next
    EndFunc ;==>_iptClear
    ; #############################################################################
    ;==========================================================================
    ; Function Name....: _SQLite_CountRows
    ; Description......: Ermittelt die Anzahl von Datensätzen für eine Tabelle
    ; Parameter(s).....: $_sTable Tabellenname
    ; Requirement(s)...: Eine mit _SQLite_Open() geöffnete DB
    ; .................: #include <SQLite.au3>
    ; Return Value(s)..: Erfolg: Anzahl der Datensätze
    ; .................: Fehler: -1 @error = 1, @extended = SQLite-@error
    ; Author(s)........: BugFix ([email='bugfix@autoit.de'][/email])
    ;==========================================================================
    Func _SQLite_CountRows($_sTable)
    Local $hQuery, $aQuery, $iRet = 0, $iErr
    If $SQLITE_OK <> _SQLite_Query(-1, "SELECT count(*) FROM " & $_sTable & ";", $hQuery) Then
    $iErr = _SQLite_ErrCode()
    _SQLite_QueryFinalize($hQuery)
    Return SetError(1, $iErr, -1)
    EndIf
    While _SQLite_FetchData($hQuery, $aQuery) = $SQLITE_OK
    $iRet = $aQuery[0]
    WEnd
    _SQLite_QueryFinalize($hQuery)
    ;MsgBox(0, "", $iRet)
    ;~ Return $iRet
    GUICtrlSetData($aCtrlipt[0], $iRet)
    EndFunc ;==>_SQLite_CountRows
    ; #############################################################################
    Func _DB_BackUp()
    Local $BackUpFolder = @ScriptDir & "\_BackUps"
    If Not FileExists($BackUpFolder) Then DirCreate($BackUpFolder)
    Local $hFileOpen = FileOpen($BackUpFolder & "\" & @YEAR & "-" & @MON & "-" & @MDAY & "_BuchVw.db.txt", 2)
    If $hFileOpen = -1 Then Exit MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")

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

    Local $aResult, $iRows, $iColumns
    Local $iRval = _SQLite_GetTable2d(-1, "SELECT * FROM Reparaturverwaltung;", $aResult, $iRows, $iColumns)

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

    FileWriteLine($hFileOpen, $sListViewHeader)

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

    For $iR = 1 To $iRows
    $sText = ""
    For $iC = 0 To $iColumns - 1
    $sText &= $aResult[$iR][$iC]
    If $iC < $iColumns - 1 Then $sText &= "|"
    Next
    FileWriteLine($hFileOpen, $sText)
    Next
    FileClose($hFileOpen)
    MsgBox(64, "Info", "DB BackUp ist fertig !", 3)
    EndFunc ;==>_DB_BackUp
    ; #############################################################################
    Func _Exit() ;Datenbank schließen und Programmende.
    _GUICtrlListView_UnRegisterSortCallBack($ListView)
    _SQLite_Close($g_db_Database)
    _SQLite_Shutdown()
    Exit
    EndFunc ;==>_Exit
    ; ### Functions ################################################################################################################/

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

    Ich code, also bin ich!

  • Hi genau das was ich gesucht habe, besteht die Möglichkeit das man zum ersten Feld hinter der ID noch eine Inputbox plaziert und da Zahlen und Buchstaben eingeben kann also zum Beispiel Kundennummer bekomme es nicht hin kann mir da jemand helfen ???

  • Ich hab das eben umgesetzt :)

    Code-Jack hat es schon recht gut umgesetzt, dass es Flexibel ist. Kann man nur an wenigen Stellen noch optimieren. So musste doch noch an mehreren Stellen was geändert werden ;)

    MfG Kanashius

  • Boah, ist der Kanashius schnell!
    Man kann hier wirklich nur den Hut ziehen, vor den hoch kompetenten und überaus hilfsbereiten Usern, echt!
    Großartige Leute hier, beide Daumen hoch!

    stefanwue:
    Obige Version ist noch eine recht frühe Baustelle.
    Ich habe das Programm seither ein gutes Stück weiter entwickelt. wichtig war es mir, dass man die Maske jederzeit vom Programm aus, per Maus, umgestalten kann.
    Dass die Daten für die Maskengestaltung also nicht fest im Quelltext codiert sind, sondern aus einer Ini-Datei eingelesen werden.

    Ist nie ganz fertig geworden und die aktuelle Version ist noch immer nicht wirklich einsetzbar (hat auch noch Fehler), aber ich hänge dennoch mal meinen letzten Stand an, weil sich da doch sehr viel getan hat.



    Wie gesagt: Noch immer volle Baustelle, aber schon sehr viel weiter entwickelt, als die im weiter oben stehenden Posting enthaltene Version.

    Ich code, also bin ich!

  • #RequireAdmin

    #AutoIt3Wrapper_UseX64=n

    我寄望于去做修女,夜夜祷告.静坐.请求所有人的宽恕.并远离尘世的痛苦.与晨露为伴.永不思红尘之事.我梦想有一天,暖暖的太阳透过窗户照在我安详的脸上,使我觉得自己仍然纯洁.我将会快乐

  • Nach zwei Jahren Abstinenz kramte ich den Quellcode endlich mal wieder hervor.

    Damals wuchs mir die Sache über den Kopf, dabei bräuchte ich das Programm eigentlich täglich ...

    - Jetzt brauche ich es aber wirklich definitiv und nicht mehr aufschiebbar!


    Aktuell scheitert es an einer simplen Sache:

    Ich möchte, wenn ein Datensatz editiert werden soll, die ganzen Inputboxen nicht mehr aus der ListView befüllen (wie einst im Ursprungs-Quelltext), sondern direkt aus der eigentlichen Quelle, also der SQLite-Datenbank.

    Grund: Die ListView soll später nur noch die relevanten Datenfelder darstellen. Der zu editierende Datensatz ist also umfangreicher, als das, was man in der ListView sieht.

    Es würde mir schon riesig helfen, wenn man mir auf die Sprünge helfen könnte, wie ich aus der Datenbanktabelle ein einzelnes Feld auslesen kann, anhand des Wertes in der Spalte "ID". Dann würde ich den Rest selbst schaffen.

    Seit gestern grase ich deswegen das Forum durch, probiere Beispiele aus, folge diversen Links auf SQL-Erklärbär-Seiten ... doch alle Beispiele bringen nicht das, was ich will, sind viel zu komplex und vergrößern meine Verwirrung nur.

    Anbei der gesamte Quelltext.

    Die Routine, die es bringen soll, ist in Zeile 659: "Func _Datensatz2Inputboxes"

    Wie man sieht, ist die Routine inzwischen vollständig zu Klump gemüllt, von den vielen dutzend erfolglosen Tests.

    Frage also: Wie kriege ich einen einzelnen Feldinhalt der Datenbank (definiert anhand der ID des in der ListView selektierten Datensatzes) ausgelesen, um ihn einer InputBox zuzuweisen?

  • Hallo Code-Jack

    Ich habe mir das Skript noch nicht angesehen. Allerdings scheint mir das auch keine Frage zu diesem Skript, sondern zu SQL bzw. SQLite zu sein.

    Frage also: Wie kriege ich einen einzelnen Feldinhalt der Datenbank (definiert anhand der ID des in der ListView selektierten Datensatzes) ausgelesen, um ihn einer InputBox zuzuweisen?

    Lass uns behaupten, dass Feld würde ID heißen. Dann könnte der Befehl lauten: SELECT * FROM TABELLENNAME WHERE ID = Whatever

    Ich bin sicher, dein Problem ist gar nicht so groß- Schau dir einfach mal SQLite-Tutorials an.

    Grüße autoiter

  • Ich bin sicher, dein Problem ist gar nicht so groß- Schau dir einfach mal SQLite-Tutorials an.

    Waah, dessen bin ich mir auch sicher! Und ich habe ausgiebig Tutorials gewälzt, trotzdem klappte es partout nicht.

    Nach ungefähr 15 Stunden kauen an diesem kleinen Problem war ich dann doch so weit, mal im Forum zu fragen.

    Aaaber - Tadaaa! - ich habe es inzwischen selbst geschaft! :party:

    Der User TheLaBu hat im folgenden Thread ein Beispiel gebracht, das ich erfolgreich abwandeln konnte:

    SQL-Ergebnis als Variable speichern

    Der aktualisierte Quelltext hängt noch einmal an, falls einem Anderen mal nützlich sein könnte.

    In dieser Form ist das Programm nämlich schon recht nahe an der ersten Brauchbarkeit (obwohl noch dick Baustelle).

    Trotzdem Danke für Deine Meldung. Ich habe schon viel aus Deinen anderen Postings gelernt!

  • Etwas verlegen bin ich geneigt zu behaupten, die Codevorlage des geschätzten RR04 enthält einen Bug, der sich bloß nicht bemerkbar macht.

    Ich habe ja eine Menge von dieser Vorlage abgekupfert und immer mehr erweitert. Und niemals ist mir dieser Bug aufgefallen, weil er halt nie in Erscheinung trat.

    Doch nachdem ich nun in meinem Programm die SQLite-Tabelle nicht mehr mit INTEGER AUTOINCREMENT für die ID kreiere, sondern dort eine GUID als TEXT (statt Integer) verwende ...

    siehe hier: Datenbank dezentral erweitern [gelöst]

    ... trat der Bug plötzlich in Erscheinung. Sogar gleich in zwei Routinen.

    Nun ja, bei mir selbst beseitigte ich den.

    Interessiert kramte ich den alten Code von RR04 wieder hervorund tatsächlich ist er dort schon vorhanden.

    Hier die Stelle um die es geht:

    Meines bescheidenen Erachtens fehlen hier zwei Hochkommas.

    Die letzte Zeile müsste IMHO so aussehen:

    AutoIt
    & GUICtrlRead($aCtrlInput[20]) & "' WHERE ID = '" & GUICtrlRead($aCtrlInput[0]) & "';")

    Wie gesagt: Der (von mir so betrachtete) Bug machte sich bisher nie bemerkbar. Vermutlich weil die als Integer erzeugte ID von SQLite als Zahl verdaut wurde und daher keine Einfassung in Hochkommas benötigte.

    Ich hingegen, verwende nun neuerdings keinen Integer mehr als ID, sondern einen String. Und dann klemmt es, ohne die Einfassung.

    Weil hier ja doch viele Codebeispiele mit SQLite im Forum zu finden sind (was vermuten lässt, dass die Macke verbreiteter ist) und weil mir die Vorlage von RR04 so gut gefiel, wollte ich mal dezent darauf hingewiesen haben.

    Da kann man sich in unübersichtlicher gestalteten Vorlagen, als dieser hier, ja sonst 'nen Wolf deduggen, als SQL-Anfänger.

    Konzeptionelles:

    Ich stricke mein Programm übrigens so, dass am Ende nur genau eine einzige Routine Daten aus der SQLite-Datenbank holt.

    Und nur genau eine einzige Routine schreibt Daten hinein.

    Alle sonstigen Routinen, die irgendwie Daten aus/in SQLite holen/schreiben wollen, tun das nicht mehr direkt, sondern über eine zwischengeschaltete Func, die den jeweiligen Befehl auf die Schreib- bzw. Leseroutine leitet.

    Darin sehe ich zwei Vorteile:

    Erstens erpart man sich massig Fehlerquellen. Dieser SQL-Kram ist ja echt so ein Ding für sich.

    Zweitens kann man blitzschnell völlig andere Datenquellen implementieren.

    Wenn also eines Tages statt SQLite eine ganz andere Datenstruktur gefordert wird, dann braucht man nur eine neue Schreib- und eine neue Leseroutine zu stricken und die Umleitung halt ... umleiten.

    Man muss dann also nicht umständlich an gefühlt 1000 Stellen im Programm Hand anlegen, wo irgendwas mit SQL passiert.


    Noch eine konzeptionelle Sache, nur als Anregung:

    Wenn ein Datensatz in der Maske editiert wird, dann schreibe ich die Daten im Anschluss zuerst in die SQLite-Datenbank. Anschließend lese ich sie von dort wieder aus und aktualisiere mit den daraus ausgelesenen Daten (die zunächstin ein Array wandern) die ListView, oder was auch immer.

    Darin sehe ich folgende Vorteile:

    Erstens fällt es sofort ins Auge, wenn bei den SQL-Aktionen etwas (ohne Fehlermeldung) schief gegangen sein sollte.

    Zweitens verringert sich die Anzahl an Routinen, die irgendwie eigenmächtig Daten lesen, schreiben und kreuz und quer untereinander hin & her konvertieren.

    Also statt aus den Editfeldern auszulesen und damit die ListView zu füllen und dann irgendwie in die Datenbank ... ist der Datenfluss bei mir irgendwie klarer strukturiert.

    Die Quelle für alles ist immer die Datenbank!

    Und die wird stets zuerst schreibend aktualisiert. Erst von da aus werden dann erst Edits, Listviews etc. befüllt/aktualisiert - stets direkt aus der Datenbank kommend.

    (Mit einem dazwischen geschalteten Array, sei der Vollständigkeit halber noch erwähnt).

    Nur eine einzige Routine schreibt in die Datenbank.

    Und nur eine einzige Routine holt Daten dort heraus.

    Alles sonstige läuft über ein dazwischen geschaltetes Array.

    Ich code, also bin ich!

  • Hallo Code-Jack

    Wie gesagt: Der (von mir so betrachtete) Bug machte sich bisher nie bemerkbar. Vermutlich weil die als Integer erzeugte ID von SQLite als Zahl verdaut wurde und daher keine Einfassung in Hochkommas benötigte.

    Ich hingegen, verwende nun neuerdings keinen Integer mehr als ID, sondern einen String. Und dann klemmt es, ohne die Einfassung.

    Daher ist es kein Bug, sondern war so wie es angelegt war völlig korrekt. Wenn man daran Änderungen vornimmt, muss man eben wissen, was man warum ändern muss. Du machst es nun natürlich besser. Bulletproof finde ich es aber auch noch nicht. Du solltest am besten allgemein die Funktion _SQLite_Escape benutzen (dann sparst du es dir auch eventuelle Steuerzeichen im Text escapen zu müssen).

    Grüße autoiter