Administration AutoIt-SQLite

    • Offizieller Beitrag

    Hi,
    wer mit SQLite schon gearbeitet hat, kennt sicher das Konfigurationstool "SqliteAdmin".
    Damit lassen sich SQLite-Datenbanken erstellen und verwalten, inkl. Index, Trigger, Views, und auch cleanen oder löschen.
    Jedoch besteht das Problem, dass mit diesem Admin-Programm erstellte DB sich nicht mit dem AutoIt-SQLite Plugin öffnen lassen.
    Deshalb möchte ich versuchen, ein adäquates Tool zu erstellen, welches auf das AutoIt-SQLite Plugin zurückgreift.

    In der Endfassung stelle ich mir folgendes vor:
    - für Datenbank-Laien einen Wizard, der durch Abfragen der notwendigen Parameter einer User-bezogene Datenbank mit den erforderlichen Indizes, Views und evtl. auch Triggern erstellt.
    - der versiertere Nutzer nimmt diese Einstellungen von Hand vor
    Funktionsumfang:
    - DB: Öffnen/Cleanen/Schließen
    - Tabelle: Erstellen/Bearbeiten/Löschen
    - Index: Erstellen/Bearbeiten/Löschen
    - Trigger: Erstellen/Bearbeiten/Löschen
    - View: Erstellen/Bearbeiten/Löschen

    Das Erstellen der jeweiligen Punkte stellt kein Problem dar.
    Aber:
    Ich benötige die Detail-Informationen zu Tabellen/Indizes/Trigger/Views.
    Abfragen lassen sich:
    - Tabellennamen, Feldnamen, Indexnamen +indexiertes Feld, Triggernamen
    Wie komme ich nun zu den Details?
    Also Feldtyp, Feldlänge, Index ASC oder DESC, Triggersequenzen, Views.

    Ich konnte in keiner Literatur Hinweise darauf finden. Falls also jemand weiß, wo ich diese Infos bekommen kann, wäre ich sehr dankbar. Damit steht und fällt das Projekt. (bzw. es wird nur ein DB-Creator ;) )

    Hier könnt ihr mal einen Blick in den aktuellen Status werfen. Mit AutoIt-SQLIte erstellte DB könnt ihr hier öffnen und bekommt eine Auflistung der Tabellen (Felder, Indizes) und Trigger (so vorhanden).

    Edit 13.01.2009:
    Hier mal die aktuelle Version, inzwischen schon etwas leistungsfähiger. Alle Daten werden im Listview dargestellt, der SQL-Code wird dargestellt (kann teilweise noch fehlerhaft sein, das Parsen ist etwas schwierig)
    Hab es jetzt mal als Datei angehängt.

    Spoiler anzeigen
    [autoit]

    #include <ListViewConstants.au3>
    #include<GuiEdit.au3>
    #Include <GuiComboBox.au3>
    ;~ #include<SQLite_1.au3>
    #include<Array.au3>
    #include<GuiImageList.au3>
    #include<GuiStatusBar.au3>
    #include<WinAPI.au3>
    #include<GUIConstantsEx.au3>
    #Include <GuiTreeView.au3>
    #include<TreeViewConstants.au3>
    #include<WindowsConstants.au3>
    #include <SQLite.au3> ;
    #include <SQLite.dll.au3>
    Opt("GUIOnEventMode", 1)
    Opt('MustDeclareVars',1)

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

    Global $INI = @ScriptDir & '\SQLite_Author.INI', $currFolder = @MyDocumentsDir, $splitPath, $split
    Global $maxFiles = 9, $currCountFiles = 0, $aRecentFiles[1], $aItemID[1][2] = [[-1,0]]
    Global $aTable[1], $aStruct[1][2] ; [i][0]=Tabelle, [i][1]=Feld
    If Not FileExists($INI) Then
    IniWrite($INI, 'settings', 'last_folder', @MyDocumentsDir)
    IniWrite($INI, 'recent_num', 'maximum', 9)
    IniWrite($INI, 'recent_num', 'aktuell', 0)
    Else
    $currFolder = IniRead($INI, 'settings', 'last_folder', @MyDocumentsDir)
    $maxFiles = IniRead($INI, 'recent_num', 'maximum', 9)
    $currCountFiles = IniRead($INI, 'recent_num', 'aktuell', 0)
    If $currCountFiles > 0 Then
    $aRecentFiles = IniReadSection($INI, 'recent_file')
    ReDim $aItemID[$aRecentFiles[0][0]][2]
    $aItemID[0][0] = 1
    EndIf
    EndIf
    Global $GUI_Main, $TreeView1, $aMenuItem[23], $Tab1, $TabSheet1, $TabSheet2, $cbTable, $Label1, $Group1, $Label2, $Label3
    Global $ContextMenu, $EditSQL
    Global $cbField, $inFilter, $bFilter, $b1st, $bPrev, $bNext, $bLast, $bNew, $bDel, $bEdit, $bSave, $bEscChg, $bUpdate, $ListView1
    Global $CM_ExpandSubs, $CM_CollapseSubs, $tvi_DB, $hStatus, $aParts[2] = [20, -1], $aSelParent[1] = [0], $aEmpty[1] = [0]
    Global $hSQL, $path, $MyDocsFolder = "::{450D8FBA-AD25-11D0-98A8-0800361B1103}"
    Global $aResult, $iRows, $iColumns, $hQuery, $hImage, $a_ID_Table[1], $LastTbl

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

    $GUI_Main = GUICreate("SQLite Author", 973, 514, -1, -1, Default, $WS_EX_TOPMOST)
    GUISetOnEvent($GUI_EVENT_CLOSE, "GUIMainClose")
    $TreeView1 = GUICtrlCreateTreeView(8, 8, 241, 455, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
    GUICtrlSetOnEvent(-1, "TreeView1Click")
    $ContextMenu = GUICtrlCreateContextMenu($TreeView1)
    $CM_ExpandSubs = GUICtrlCreateMenuItem('Zweig Ausklappen', $ContextMenu)
    GUICtrlSetOnEvent(-1, 'CM_ExpandSubs')
    $CM_CollapseSubs = GUICtrlCreateMenuItem('Zweig Einklappen', $ContextMenu)
    GUICtrlSetOnEvent(-1, 'CM_CollapseSubs')
    $aMenuItem[0] = GUICtrlCreateMenu("Datenbank")
    $aMenuItem[4] = GUICtrlCreateMenuItem("Neu", $aMenuItem[0])
    GUICtrlSetOnEvent(-1, "MenuItem_DB_New")
    $aMenuItem[5] = GUICtrlCreateMenuItem("Öffnen", $aMenuItem[0])
    GUICtrlSetOnEvent(-1, "MenuItem_DB_Open")
    $aMenuItem[6] = GUICtrlCreateMenuItem("Säubern", $aMenuItem[0])
    GUICtrlSetOnEvent(-1, "MenuItem_DB_Clean")
    $aMenuItem[7] = GUICtrlCreateMenuItem("Schließen", $aMenuItem[0])
    GUICtrlSetOnEvent(-1, "MenuItem_DB_Close")
    GUICtrlCreateMenuItem("", $aMenuItem[0])
    $aMenuItem[22] = GUICtrlCreateMenu("Zuletzt", $aMenuItem[0])
    GUICtrlCreateMenuItem("", $aMenuItem[0])
    $aMenuItem[8] = GUICtrlCreateMenuItem("Beenden", $aMenuItem[0])
    GUICtrlSetOnEvent(-1, "GUIMainClose")
    $aMenuItem[1] = GUICtrlCreateMenu("Tabelle")
    $aMenuItem[9] = GUICtrlCreateMenuItem("Neu", $aMenuItem[1])
    GUICtrlSetOnEvent(-1, "MenuItem_Table_New")
    $aMenuItem[10] = GUICtrlCreateMenuItem("Ändern", $aMenuItem[1])
    GUICtrlSetOnEvent(-1, "MenuItem_Table_Chg")
    $aMenuItem[11] = GUICtrlCreateMenuItem("Löschen", $aMenuItem[1])
    GUICtrlSetOnEvent(-1, "MenuItem_Table_Del")
    $aMenuItem[2] = GUICtrlCreateMenu("Extras")
    $aMenuItem[12] = GUICtrlCreateMenu("Index", $aMenuItem[2])
    $aMenuItem[13] = GUICtrlCreateMenuItem("Neu", $aMenuItem[12])
    GUICtrlSetOnEvent(-1, "MenuItem_Index_New")
    $aMenuItem[14] = GUICtrlCreateMenuItem("Ändern", $aMenuItem[12])
    GUICtrlSetOnEvent(-1, "MenuItem_Index_Chg")
    $aMenuItem[15] = GUICtrlCreateMenuItem("Löschen", $aMenuItem[12])
    GUICtrlSetOnEvent(-1, "MenuItem_Index_Del")
    $aMenuItem[16] = GUICtrlCreateMenu("Trigger", $aMenuItem[2])
    $aMenuItem[17] = GUICtrlCreateMenuItem("Neu", $aMenuItem[16])
    GUICtrlSetOnEvent(-1, "MenuItem_Trigger_New")
    $aMenuItem[18] = GUICtrlCreateMenuItem("Ändern", $aMenuItem[16])
    GUICtrlSetOnEvent(-1, "MenuItem_Trigger_Chg")
    $aMenuItem[19] = GUICtrlCreateMenuItem("Löschen", $aMenuItem[16])
    GUICtrlSetOnEvent(-1, "MenuItem_Trigger_Del")
    $aMenuItem[3] = GUICtrlCreateMenu("Ansicht")
    $aMenuItem[20] = GUICtrlCreateMenuItem("alles Ausklappen", $aMenuItem[3])
    GUICtrlSetOnEvent(-1, "MenuItem_Expand")
    $aMenuItem[21] = GUICtrlCreateMenuItem("alles Einklappen", $aMenuItem[3])
    GUICtrlSetOnEvent(-1, "MenuItem_Collapse")

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

    $Tab1 = GUICtrlCreateTab(264, 8, 698, 457)
    $TabSheet1 = GUICtrlCreateTabItem("Daten bearbeiten")
    $cbTable = GUICtrlCreateCombo("", 320, 47, 231, 25)
    GUICtrlSetOnEvent(-1, '_TableChg')
    $Label1 = GUICtrlCreateLabel("Tabelle", 274, 50, 39, 17)
    $Group1 = GUICtrlCreateGroup(" Filtern ", 617, 34, 335, 73)
    $Label2 = GUICtrlCreateLabel("Feld", 625, 51, 24, 17)
    $Label3 = GUICtrlCreateLabel("Ausdruck", 625, 79, 45, 17)
    $cbField = GUICtrlCreateCombo("", 675, 48, 220, 25)
    GUICtrlSetOnEvent(-1, '_FieldChg')
    $inFilter = GUICtrlCreateInput("", 675, 75, 220, 21)
    $bFilter = GUICtrlCreateButton("Filtern", 903, 63, 41, 20, 0)
    GUICtrlSetOnEvent(-1, "bFilterClick")
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $b1st = GUICtrlCreateButton("<<", 274, 82, 25, 25, 0)
    GUICtrlSetOnEvent(-1, "b1stClick")
    GUICtrlSetTip(-1, 'Erster DS')
    $bPrev = GUICtrlCreateButton("<", 300, 82, 25, 25, 0)
    GUICtrlSetOnEvent(-1, "bPrevClick")
    GUICtrlSetTip(-1, 'Voriger DS')
    $bNext = GUICtrlCreateButton(">", 326, 82, 25, 25, 0)
    GUICtrlSetOnEvent(-1, "bNextClick")
    GUICtrlSetTip(-1, 'Nächster DS')
    $bLast = GUICtrlCreateButton(">>", 352, 82, 25, 25, 0)
    GUICtrlSetOnEvent(-1, "bLastClick")
    GUICtrlSetTip(-1, 'Letzter DS')
    $bNew = GUICtrlCreateButton("+", 387, 82, 25, 25, 0)
    GUICtrlSetOnEvent(-1, "bNewClick")
    GUICtrlSetTip(-1, 'Neuer DS')
    $bDel = GUICtrlCreateButton("-", 413, 82, 25, 25, 0)
    GUICtrlSetOnEvent(-1, "bDelClick")
    GUICtrlSetTip(-1, 'DS Löschen')
    $bEdit = GUICtrlCreateButton("B", 448, 82, 25, 25, 0)
    GUICtrlSetOnEvent(-1, "bEditClick")
    GUICtrlSetTip(-1, 'DS Bearbeiten')
    $bSave = GUICtrlCreateButton("S", 474, 82, 25, 25, 0)
    GUICtrlSetOnEvent(-1, "bSaveClick")
    GUICtrlSetTip(-1, 'DS Speichern')
    $bEscChg = GUICtrlCreateButton("V", 500, 82, 25, 25, 0)
    GUICtrlSetOnEvent(-1, "bEscChgClick")
    GUICtrlSetTip(-1, 'Änderungen Verwerfen')
    $bUpdate = GUICtrlCreateButton("A", 526, 82, 25, 25, 0)
    GUICtrlSetOnEvent(-1, "bUpdateClick")
    GUICtrlSetTip(-1, 'Aktualisieren')
    $ListView1 = GUICtrlCreateListView("", 272, 112, 680, 345, $LVS_REPORT, $LVS_EX_GRIDLINES)
    GUICtrlSetOnEvent(-1, "ListView1Click")
    GUICtrlCreateTabItem("")
    $TabSheet2 = GUICtrlCreateTabItem("SQL")
    $EditSQL = GUICtrlCreateEdit('', 272, 112, 680, 345)
    GUICtrlCreateTabItem("")
    $hStatus = _GUICtrlStatusBar_Create($GUI_Main, $aParts)
    _GUICtrlStatusBar_SetBkColor($hStatus, 0xE6E0B0) ; Color als BGR

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

    $hImage = _GUIImageList_Create(16, 16, 5, 3)
    _GUIImageList_AddIcon($hImage, "shell32.dll", 186) ; Datenbank
    _GUIImageList_AddIcon($hImage, "shell32.dll", 98) ; Tabelle allg.
    _GUIImageList_AddIcon($hImage, "shell32.dll", 96) ; TabellenNamen
    _GUIImageList_AddIcon($hImage, "shell32.dll", 36) ; FelderOrdner
    _GUIImageList_AddIcon($hImage, "shell32.dll", 24) ; Felder
    _GUIImageList_AddIcon($hImage, "shell32.dll", 104) ; IndexOrdner
    _GUIImageList_AddIcon($hImage, "shell32.dll", 44) ; Indizes
    _GUIImageList_AddIcon($hImage, "shell32.dll", 125) ; TriggerOrdner
    _GUIImageList_AddIcon($hImage, "shell32.dll", 65) ; Trigger
    _GUICtrlTreeView_SetNormalImageList($TreeView1, $hImage)

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

    _DisableItems('1,2,3,6,7')
    If $currCountFiles = 0 Then GUICtrlSetState($aMenuItem[22], $GUI_DISABLE)
    GUISetState(@SW_SHOW, $GUI_Main)

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

    _GUICtrlStatusBar_SetIcon ($hStatus, 0, 47, "shell32.dll")
    _GUICtrlStatusBar_SetText ($hStatus, ">> Keine Datenbank geöffnet <<", 1)

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

    _SQLite_Startup()
    If @error Then Exit MsgBox(262192, 'Fehler', 'SQLite.DLL konnte nicht initialisiert werden!')

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

    If $aItemID[0][0] <> -1 Then
    _Array2DDelete($aRecentFiles, 0)
    For $i = 0 To UBound($aRecentFiles) -1
    $split = _StringSplitOnce($aRecentFiles[$i][1], '\', -1)
    $aItemID[$i][0] = GUICtrlCreateMenuItem($split[1], $aMenuItem[22])
    GUICtrlSetOnEvent(-1, '_itemClick')
    $aItemID[$i][1] = $i
    Next
    EndIf

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

    While 1
    Sleep(100)
    WEnd

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

    Func GUIMainClose()
    IniWrite($INI, 'settings', 'last_folder', $currFolder)
    If $hSQL > 0 Then _SQLite_Close($hSQL)
    _SQLite_Shutdown()
    Exit
    EndFunc

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

    Func MenuItem_DB_New()
    GUISetState(@SW_HIDE, $GUI_Main)
    $path = FileSaveDialog( "Bitte einen Dateinamen festlegen.", $MyDocsFolder, "SQLite-DB (*.db)", 2)
    If @error Then Return MsgBox(262192, 'Achtung', 'Kein Dateiname festgelegt!')
    If $hSQL > 0 Then _SQLite_Close($hSQL) ; evtl. offene DB schließen
    GUICtrlSetData($EditSQL, '')
    _GUICtrlTreeView_DeleteAll($TreeView1)
    _GUICtrlStatusBar_SetIcon ($hStatus, 0, 47, "shell32.dll")
    _GUICtrlStatusBar_SetText ($hStatus, ">> Keine Datenbank geöffnet <<", 1)
    GUISetState(@SW_SHOW, $GUI_Main)
    If Not StringRight($path, 3) = '.db' Then $path &= '.db'
    If $currCountFiles < $maxFiles Then ReDim $aMenuItem[UBound($aMenuItem)+1]
    _RecentFiles($INI, $aRecentFiles, $path, $currCountFiles, $maxFiles, 0)
    ReDim $aItemID[UBound($aRecentFiles)][2]
    _ResetRecentFiles()
    $hSQL = _SQLite_Open($path)
    _EnableItems('3,6,7')
    EndFunc

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

    Func MenuItem_DB_Open()
    _OpenDB()
    EndFunc

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

    Func _OpenDB($path = -1)
    If $path = -1 Then
    GUISetState(@SW_HIDE, $GUI_Main)
    $path = FileOpenDialog('Bitte Datenbank auswählen', $currFolder, "SQLite-DB (*.db)", 3)
    If @error Then Return MsgBox(262192, 'Achtung', 'Keine Datenbank gewählt!')
    GUISetState(@SW_SHOW, $GUI_Main)
    EndIf
    If $hSQL > 0 Then
    _SQLite_Close($hSQL) ; evtl. offene DB schließen
    _clear()
    EndIf
    GUICtrlSetData($EditSQL, '')
    _GUICtrlTreeView_DeleteAll($TreeView1)
    _GUICtrlStatusBar_SetIcon ($hStatus, 0, 47, "shell32.dll")
    _GUICtrlStatusBar_SetText ($hStatus, ">> Keine Datenbank geöffnet <<", 1)
    $splitPath = _StringSplitOnce($path, '\', -1)
    If Not @error Then
    $currFolder = $splitPath[0]
    _GUICtrlTreeView_BeginUpdate($TreeView1)
    $tvi_DB = _GUICtrlTreeView_Add($TreeView1, 0, StringUpper(StringTrimRight($splitPath[1], 3)), 0, 0)
    _GUICtrlTreeView_SetBold($TreeView1, $tvi_DB)
    _GUICtrlTreeView_EndUpdate($TreeView1)
    EndIf
    $hSQL = _SQLite_Open($path)
    If @error Then
    Return MsgBox(262192, 'Achtung', 'Datenbank konnte nicht geöffnet werden!')
    _GUICtrlTreeView_DeleteAll($TreeView1)
    Else
    If $currCountFiles < $maxFiles Then ReDim $aMenuItem[UBound($aMenuItem)+1]
    _RecentFiles($INI, $aRecentFiles, $path, $currCountFiles, $maxFiles, 0)
    ReDim $aItemID[UBound($aRecentFiles)][2]
    _ResetRecentFiles()
    _LoadTreeView()
    _TableChg()
    _EnableItems('3,6,7')
    _GUICtrlStatusBar_SetIcon ($hStatus, 0, 13, "shell32.dll")
    _GUICtrlStatusBar_SetText ($hStatus, "Geöffnete Datenbank: " & $path, 1)
    EndIf
    EndFunc

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

    Func _itemClick()
    Local $index = _ArraySearch($aItemID, @GUI_CtrlId, 0, 0, 0, 0, 1, 0)
    _OpenDB($aRecentFiles[$index][1])
    EndFunc

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

    Func _ResetRecentFiles()
    For $i = 0 To UBound($aItemID) -1
    GUICtrlDelete($aItemID[$i][0])
    Next
    For $i = 0 To UBound($aRecentFiles) -1
    $split = _StringSplitOnce($aRecentFiles[$i][1], '\', -1)
    $aItemID[$i][0] = GUICtrlCreateMenuItem($split[1], $aMenuItem[22])
    GUICtrlSetOnEvent(-1, '_itemClick')
    $aItemID[$i][1] = $i
    Next
    EndFunc

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

    Func MenuItem_DB_Clean()
    ;~ 'VACUUM'
    EndFunc

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

    Func MenuItem_DB_Close()
    _clear()
    If $hSQL > 0 Then _SQLite_Close($hSQL)
    _GUICtrlStatusBar_SetIcon ($hStatus, 0, 47, "shell32.dll")
    _GUICtrlStatusBar_SetText ($hStatus, ">> Keine Datenbank geöffnet <<", 1)
    _DisableItems('1,2,3,6,7')
    EndFunc

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

    Func _clear()
    GUICtrlSetData($EditSQL, '')
    ReDim $aTable[1]
    $aTable[0] = ''
    ReDim $aStruct[1][2]
    $aStruct[0][0] = ''
    _GUICtrlTreeView_DeleteAll($TreeView1)
    _GUICtrlComboBox_ResetContent($cbTable)
    _GUICtrlComboBox_ResetContent($cbField)
    EndFunc

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

    Func MenuItem_Table_New()
    ; Einblenden GUI_Table
    MsgBox(262192, 'Table_New', 'noch nicht besetzt')
    EndFunc

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

    Func MenuItem_Table_Chg()
    ; Einblenden GUI_Table mit Tabellenauswahl
    MsgBox(262192, 'Table_Chg', 'noch nicht besetzt')
    EndFunc

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

    Func MenuItem_Table_Del()
    ; Einblenden GUI_Table mit Tabellenauswahl
    MsgBox(262192, 'Table_Del', 'noch nicht besetzt')
    EndFunc

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

    Func MenuItem_Index_New()
    ; Einblenden GUI_Index mit Tabellenauswahl, Feldliste, Indextypauswahl
    MsgBox(262192, 'Index_New', 'noch nicht besetzt')
    EndFunc

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

    Func MenuItem_Index_Chg()
    ; Einblenden GUI_Index mit Indexauswahl, Indextypauswahl
    MsgBox(262192, 'Index_Chg', 'noch nicht besetzt')
    EndFunc

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

    Func MenuItem_Index_Del()
    ; Einblenden GUI_Index mit Indexauswahl
    MsgBox(262192, 'Index_Del', 'noch nicht besetzt')
    EndFunc

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

    Func MenuItem_Trigger_New()
    ; Einblenden GUI_Trigger m. allen Optionen
    MsgBox(262192, 'Trigger_New', 'noch nicht besetzt')
    EndFunc

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

    Func MenuItem_Trigger_Chg()
    ; Einblenden GUI_Trigger mit Triggerauswahl, Editierfeld
    MsgBox(262192, 'Trigger_Chg', 'noch nicht besetzt')
    EndFunc

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

    Func MenuItem_Trigger_Del()
    ; Einblenden GUI_Trigger mit Triggerauswahl
    MsgBox(262192, 'Trigger_Del', 'noch nicht besetzt')
    EndFunc
    #cs
    CREATE TRIGGER [TBLNEWTEST_JAHRE_UPDATE_JAHRE]
    AFTER UPDATE OF [Jahre]
    ON [tblNewTest]
    FOR EACH ROW WHEN 50
    BEGIN

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

    UPDATE tblNewTest SET 'Jahre' = 100;

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

    END;

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

    * CREATE TRIGGER
    sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS] trigger-name [ BEFORE | AFTER ]
    database-event ON [database-name .] table-name
    trigger-action
    sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS] trigger-name INSTEAD OF
    database-event ON [database-name .] view-name
    trigger-action
    database-event ::= DELETE |
    INSERT |
    UPDATE |
    UPDATE OF column-list
    trigger-action ::= [ FOR EACH ROW ] [ WHEN expression ]
    BEGIN
    trigger-step ; [ trigger-step ; ]*
    END
    trigger-step ::= update-statement | insert-statement |
    delete-statement | select-statement
    The CREATE TRIGGER statement is used to add triggers to the database schema. Triggers are database operations (the
    trigger-action) that are automatically performed when a specified database event (the database-event) occurs.
    A trigger may be specified to fire whenever a DELETE, INSERT or UPDATE of a particular database table occurs, or
    whenever an UPDATE of one or more specified columns of a table are updated.
    At this time SQLite supports only FOR EACH ROW triggers, not FOR EACH STATEMENT triggers. Hence explicitly specifying
    FOR EACH ROW is optional. FOR EACH ROW implies that the SQL statements specified as trigger-steps may be executed
    (depending on the WHEN clause) for each database row being inserted, updated or deleted by the statement causing the
    trigger to fire.
    Both the WHEN clause and the trigger-steps may access elements of the row being inserted, deleted or updated using
    references of the form "NEW.column-name" and "OLD.column-name", where column-name is the name of a column from the
    table that the trigger is associated with. OLD and NEW references may only be used in triggers on trigger-events for
    which they are relevant, as follows:
    INSERT NEW references are valid
    UPDATE NEW and OLD references are valid
    DELETE OLD references are valid
    If a WHEN clause is supplied, the SQL statements specified as trigger-steps are only executed for rows for which the
    WHEN clause is true. If no WHEN clause is supplied, the SQL statements are executed for all rows.
    The specified trigger-time determines when the trigger-steps will be executed relative to the insertion, modification
    or removal of the associated row.
    An ON CONFLICT clause may be specified as part of an UPDATE or INSERT trigger-step. However if an ON CONFLICT clause
    is specified as part of the statement causing the trigger to fire, then this conflict handling policy is used instead.
    Triggers are automatically dropped when the table that they are associated with is dropped.
    Triggers may be created on views, as well as ordinary tables, by specifying INSTEAD OF in the CREATE TRIGGER statement.
    If one or more ON INSERT, ON DELETE or ON UPDATE triggers are defined on a view, then it is not an error to execute an
    INSERT, DELETE or UPDATE statement on the view, respectively. Thereafter, executing an INSERT, DELETE or UPDATE on the view causes the associated triggers to fire. The real tables underlying the view are not modified (except possibly explicitly, by a trigger program).
    Example:
    Assuming that customer records are stored in the "customers" table, and that order records are stored in the "orders"
    table, the following trigger ensures that all associated orders are redirected when a customer changes his or her
    address:
    CREATE TRIGGER update_customer_address UPDATE OF address ON customers
    BEGIN
    UPDATE orders SET address = new.address WHERE customer_name = old.name;
    END;
    With this trigger installed, executing the statement:
    UPDATE customers SET address = '1 Main St.' WHERE name = 'Jack Jones';
    causes the following to be automatically executed:
    UPDATE orders SET address = '1 Main St.' WHERE customer_name = 'Jack Jones';
    Note that currently, triggers may behave oddly when created on tables with INTEGER PRIMARY KEY fields. If a BEFORE
    trigger program modifies the INTEGER PRIMARY KEY field of a row that will be subsequently updated by the statement
    that causes the trigger to fire, then the update may not occur. The workaround is to declare the table with a
    PRIMARY KEY column instead of an INTEGER PRIMARY KEY column.
    A special SQL function RAISE() may be used within a trigger-program, with the following syntax
    raise-function ::= RAISE ( ABORT, error-message ) |
    RAISE ( FAIL, error-message ) |
    RAISE ( ROLLBACK, error-message ) |
    RAISE ( IGNORE )
    When one of the first three forms is called during trigger-program execution, the specified ON CONFLICT processing is
    performed (either ABORT, FAIL or ROLLBACK) and the current query terminates. An error code of SQLITE_CONSTRAINT is
    returned to the user, along with the specified error message.
    When RAISE(IGNORE) is called, the remainder of the current trigger program, the statement that caused the trigger
    program to execute and any subsequent trigger programs that would of been executed are abandoned. No database
    changes are rolled back. If the statement that caused the trigger program to execute is itself part of a trigger
    program, then that trigger program resumes execution at the beginning of the next step.
    Triggers are removed using the DROP TRIGGER statement.
    #ce

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

    Func MenuItem_Expand()
    _GUICtrlTreeView_Expand($TreeView1)
    EndFunc

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

    Func MenuItem_Collapse()
    _GUICtrlTreeView_Expand($TreeView1, 0, False)
    EndFunc

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

    Func CM_ExpandSubs()
    Local $hCurrentItem = _GUICtrlTreeView_GetSelection($TreeView1)
    If $hCurrentItem = 0 Then Return
    _GUICtrlTreeView_Expand($TreeView1, $hCurrentItem)
    EndFunc

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

    Func CM_CollapseSubs()
    Local $hCurrentItem = _GUICtrlTreeView_GetSelection($TreeView1)
    If $hCurrentItem = 0 Then Return
    _GUICtrlTreeView_Expand($TreeView1, $hCurrentItem, False)
    EndFunc

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

    Func _GUICtrlTreeView_ExpandOneLevel($hTreeView, $hParentItem=0)
    If $hParentItem < 1 Then
    Local $hCurrentItem = _GUICtrlTreeView_GetFirstItem($hTreeView)
    Else
    Local $hCurrentItem = $hParentItem
    EndIf
    If $hCurrentItem = 0 Then Return SetError(1)
    Local $hChild
    Local $countChild = _GUICtrlTreeView_GetChildCount($hTreeView, $hCurrentItem)
    If $countChild = 0 Then Return SetError(2)
    _GUICtrlTreeView_Expand($hTreeView, $hCurrentItem)
    For $i = 1 To $countChild
    If $i = 1 Then
    $hChild = _GUICtrlTreeView_GetFirstChild($hTreeView, $hCurrentItem)
    Else
    $hChild = _GUICtrlTreeView_GetNextSibling($hTreeView, $hChild)
    EndIf
    If _GUICtrlTreeView_GetChildren($hTreeView, $hChild) Then _GUICtrlTreeView_Expand($hTreeView, $hChild, False)
    Next
    EndFunc ;==>_GUICtrlTreeView_ExpandOneLevel

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

    Func b1stClick()

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

    EndFunc

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

    Func bPrevClick()

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

    EndFunc

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

    Func bNextClick()

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

    EndFunc

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

    Func bLastClick()

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

    EndFunc

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

    Func bNewClick()

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

    EndFunc

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

    Func bDelClick()

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

    EndFunc

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

    Func bEditClick()

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

    EndFunc

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

    Func bSaveClick()

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

    EndFunc

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

    Func bEscChgClick()

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

    EndFunc

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

    Func bUpdateClick()

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

    EndFunc

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

    Func bFilterClick()

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

    EndFunc

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

    Func TreeView1Click()

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

    EndFunc

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

    Func ListView1Click()

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

    EndFunc

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

    Func _FillListView1($ARRAY)
    GUISetState(@SW_LOCK)
    GUICtrlDelete($ListView1)
    Local $Header = '', $ub2nd = UBound($ARRAY, 2), $colWidth = 60
    If $ub2nd > 1 Then
    If 680/$ub2nd > 60 Then $colWidth = Int(680/$ub2nd)
    For $j = 0 To $ub2nd -1 ; Header
    $Header &= $ARRAY[0][$j] & '|'
    Next
    Else
    If 680/UBound($ARRAY) > 60 Then $colWidth = Int(680/UBound($ARRAY))
    For $i = 0 To UBound($ARRAY) -1
    $Header &= $ARRAY[$i] & '|'
    Next
    EndIf
    $Header = StringTrimRight($Header, 1)
    $ListView1 = GUICtrlCreateListView($Header, 272, 112, 680, 345, $LVS_REPORT, $LVS_EX_GRIDLINES)
    For $i = 0 To UBound($ARRAY, 2) -2
    GUICtrlSendMsg($ListView1, 0x101E, $i, $colWidth)
    Next
    GUICtrlSendMsg(-1, 0x101E, UBound($ARRAY, 2)-1, $LVSCW_AUTOSIZE_USEHEADER)
    Local $item = ''
    For $i = 1 To UBound($ARRAY) -1
    For $k = 0 To UBound($ARRAY, 2) -1
    $item &= $ARRAY[$i][$k] & '|'
    Next
    GUICtrlCreateListViewItem($item, $ListView1)
    $item = ''
    Next
    GUISetState(@SW_UNLOCK)
    _GUICtrlStatusBar_SetIcon ($hStatus, 0, 13, "shell32.dll")
    EndFunc

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

    Func _SelAllFromTable()
    Local $aSelect
    If _SQLite_GetTable2d($hSQL, "SELECT * FROM " & GUICtrlRead($cbTable) & ";", $aSelect, $iRows, $iColumns) = $SQLITE_OK Then
    If Not IsArray($aSelect) Then ; leere Tabelle
    Local $aSelect[1]
    For $i = 0 To UBound($aStruct) -1
    If $aStruct[$i][0] = GUICtrlRead($cbTable) Then
    If $aSelect[UBound($aSelect)-1] <> '' Then ReDim $aSelect[UBound($aSelect)+1]
    $aSelect[UBound($aSelect)-1] = $aStruct[$i][1]
    EndIf
    Next
    EndIf
    _FillListView1($aSelect)
    EndIf
    EndFunc

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

    Func _DisableItems($sITEM)
    Local $var = StringSplit($sITEM, ',')
    For $i = 1 To UBound($var) -1
    GUICtrlSetState($aMenuItem[$var[$i]], $GUI_DISABLE)
    Next
    EndFunc

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

    Func _EnableItems($sITEM)
    Local $var = StringSplit($sITEM, ',')
    For $i = 1 To UBound($var) -1
    GUICtrlSetState($aMenuItem[$var[$i]], $GUI_ENABLE)
    Next
    EndFunc

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

    ; alle Indizes abfragen: "SELECT name FROM sqlite_master WHERE type='index' ORDER BY name"
    ; Indexliste f. bestimmte Tabelle: "PRAGMA index_list(table-name);"
    ; you can use the special typeof() SQL function to determine what the datatype is: "SELECT TYPEOF(Feldname)"
    Func _LoadTreeView() ; und Combo Tabelle
    _EnableItems('1,2')
    Local $aResultIndex, $aResultTrigger, $aNames, $ID_Table, $ID_Trigger, $ID_Field, $ID_Index, $tmp, $done = False
    _SQLite_GetTable($hSQL, "SELECT name FROM sqlite_master WHERE type='trigger' ORDER BY name", $aResultTrigger, $iRows, $iColumns)
    _SQLite_GetTable($hSQL, "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;", $aResult, $iRows, $iColumns)
    ReDim $a_ID_Table[$iRows]
    If $iRows > 1 Then
    _GUICtrlTreeView_BeginUpdate($TreeView1)
    $ID_Table = _GUICtrlTreeView_Add($TreeView1, 0, 'Tabellen', 1, 1)
    _GUICtrlTreeView_SetBold($TreeView1, $ID_Table)
    If IsArray($aResultTrigger) Then
    For $k = 2 To UBound($aResultTrigger) -1
    $ID_Trigger = _GUICtrlTreeView_Add($TreeView1, 0, 'Trigger', 7, 7)
    _GUICtrlTreeView_SetBold($TreeView1, $ID_Trigger)
    _GUICtrlTreeView_AddChild($TreeView1, $ID_Trigger, StringUpper($aResultTrigger[$k]), 8, 8)
    Next
    EndIf
    For $i = 0 To UBound($a_ID_Table) -1
    If $aTable[UBound($aTable)-1] <> '' Then ReDim $aTable[UBound($aTable)+1]
    $aTable[UBound($aTable)-1] = StringUpper($aResult[$i+2])
    $a_ID_Table[$i] = _GUICtrlTreeView_AddChild($TreeView1, $ID_Table, StringUpper($aResult[$i+2]), 2, 2)
    _GUICtrlTreeView_SetBold($TreeView1, $a_ID_Table[$i])
    If _SQlite_Query ($hSQL, "SELECT * FROM " & $aResult[$i+2] & ";", $hQuery) = $SQLITE_OK Then
    $ID_Field = _GUICtrlTreeView_AddChild($TreeView1, $a_ID_Table[$i], 'Felder', 3, 3)
    _GUICtrlTreeView_SetBold($TreeView1, $ID_Field)
    _SQLite_FetchNames ($hQuery, $aNames) ; Spalten/Feldnamen auslesen
    For $k = 0 To UBound($aNames) -1
    _GUICtrlTreeView_AddChild($TreeView1, $ID_Field, StringUpper($aNames[$k]), 4, 4)
    ; in StrukturArray eintragen:
    If $aStruct[UBound($aStruct)-1][0] <> '' Then ReDim $aStruct[UBound($aStruct)+1][2]
    $aStruct[UBound($aStruct)-1][0] = StringUpper($aResult[$i+2])
    $aStruct[UBound($aStruct)-1][1] = StringUpper($aNames[$k])
    Next
    EndIf
    _SQLite_QueryFinalize($hQuery)
    If _SQLite_GetTable2d ($hSQL, "PRAGMA index_list(" & $aResult[$i+2] & ");", $aResultIndex, $iRows, $iColumns) = $SQLITE_OK Then
    If IsArray($aResultIndex) Then
    _ArraySort($aResultIndex, 0, 1, 0, 1)
    For $k = 1 To UBound($aResultIndex) -1
    If Not $done Then
    $ID_Index = _GUICtrlTreeView_AddChild($TreeView1, $a_ID_Table[$i], 'Indizes', 5, 5)
    _GUICtrlTreeView_SetBold($TreeView1, $ID_Index)
    $done = True
    EndIf
    _GUICtrlTreeView_AddChild($TreeView1, $ID_Index, StringUpper($aResultIndex[$k][1]), 6, 6)
    ;~ Local $aResultIndexProperty
    ;~ _SQLite_GetTable2d ($hSQL,"PRAGMA index_info(" & $aResultIndex[$k][1] & ");", $aResultIndexProperty, $iRows, $iColumns) ; Test
    ;~ If IsArray($aResultIndexProperty) Then _ArrayDisplay($aResultIndexProperty, $aResultIndex[$k][1])
    Next
    EndIf
    EndIf
    $aResultIndex = 0
    $done = False
    Next
    ; #############################################################################################
    Local $aDB ; Abfrage Original-SQL-Code
    _SQLite_GetTable ($hSQL,"SELECT sql FROM " & _
    "(SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) " & _
    "WHERE type!='meta' ORDER BY tbl_name, type DESC, name", $aDB, $iRows, $iColumns)

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

    Local $aTableSQL[1][3], $aIndexSQL[1][2], $aTriggerSQL[1][2], $ret, $ret1, $sApp, $sTmp
    If IsArray($aDB) Then
    ;~ _ArrayDisplay($aDB)
    For $q = 2 To $iRows
    $sApp = ''
    ;~ ConsoleWrite('vor: ' & $aDB[$q] & @CRLF)
    $aDB[$q] = StringRegExpReplace($aDB[$q], '\r\n', ',')
    ;~ ConsoleWrite('nach: ' & $aDB[$q] & @CRLF)
    If StringInStr($aDB[$q], 'CREATE TABLE', 1) Then
    ; Prüfen ob Tabellennamen statt in Klammern in Quotierung und mit Klammern ersetzen
    If StringRegExp($aDB[$q], "CREATE TABLE \x22") Or StringRegExp($aDB[$q], "CREATE TABLE \x27") Then
    If StringRegExp($aDB[$q], "CREATE TABLE \x22") Then ; "=\x22=ASCII(34) | '=\x27=ASCII(39)
    Local $sAscii = 34
    ElseIf StringRegExp($aDB[$q], "CREATE TABLE \x27") Then
    Local $sAscii = 39
    EndIf
    $aDB[$q] = StringReplace(StringReplace($aDB[$q], Chr($sAscii), "[", 1), Chr($sAscii), "]", 1)
    ;~ ConsoleWrite($s & @CRLF)
    $ret = StringRegExp($aDB[$q], "(?<=\().+(?=\))", 3)
    If IsArray($ret) Then
    ;~ ConsoleWrite($ret[0] & @CRLF)
    Do
    $ret[0] = StringReplace(StringReplace($ret[0], Chr($sAscii), "[", 1), Chr($sAscii), "]", 1)
    Until @extended = 0
    $aDB[$q] = StringRegExpReplace($aDB[$q], "(?<=\().+(?=\))", $ret[0])
    ;~ ConsoleWrite($aDB[$q] & @CRLF)
    EndIf
    EndIf
    If $aTableSQL[UBound($aTableSQL)-1][0] <> '' Then ReDim $aTableSQL[UBound($aTableSQL)+1][2]
    $ret = StringRegExp($aDB[$q], "((?<=CREATE TABLE (\[|\x22|\x27))\w+)", 3)
    If IsArray($ret) Then $aTableSQL[UBound($aTableSQL)-1][0] = $ret[0] ; Tabellenname ######
    $ret = StringRegExp($aDB[$q], "((?<=\().*(?=\)))", 3)
    If IsArray($ret) Then $aTableSQL[UBound($aTableSQL)-1][1] = $ret[0] ; Feldnamen/Typ/Länge etc. ######
    ElseIf StringInStr($aDB[$q], 'CREATE INDEX', 1) Then
    If $aIndexSQL[UBound($aIndexSQL)-1][0] <> '' Then ReDim $aIndexSQL[UBound($aIndexSQL)+1][2]
    $ret = StringRegExp($aDB[$q], "((?<=CREATE INDEX \[)\w+)", 3)
    If IsArray($ret) Then $aIndexSQL[UBound($aIndexSQL)-1][0] = $ret[0] ; Indexname ######
    $ret = StringRegExpReplace($aDB[$q], "(CREATE INDEX \[\w+\] )", '')
    $aIndexSQL[UBound($aIndexSQL)-1][1] = $ret ; Indexbeschreibung ######
    EndIf
    ;~ ConsoleWrite($q-1 & ': ' & $aDB[$q] & @CRLF)

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

    ; Formatierung String für SQL-Edit
    $ret = StringRegExp($aDB[$q], '(CREATE \w+ \[\w+\] ON \[\w+\]|CREATE \w+ \[\w+\] [\w\s]+\[\w+\] +ON \[\w+\]|CREATE \w+ \[\w+\])', 3) ; "CREATE ***** "
    If IsArray($ret) Then $sApp &= $ret[0] & ' (' & @CRLF ; CREATE - Typ
    ; Trigger formatiert darstellen - ?? ##########################################
    If StringInStr($aDB[$q], 'TRIGGER') Then ; Darstellung noch falsch
    $ret = StringTrimRight(StringTrimLeft($aDB[$q], StringLen($ret[0])+1), 1) ; restlicher Bestandteil der Zeile
    $sApp &= @TAB & $ret & @CRLF
    Else
    If IsArray($ret) Then
    $ret = StringTrimRight(StringTrimLeft($aDB[$q], StringLen($ret[0])+2), 1) ; restlicher Bestandteil der Zeile
    If $ret <> '' Then
    $sTmp = StringSplit($ret, ',')
    For $s = 1 To UBound($sTmp) -1
    $sApp &= @TAB & $sTmp[$s] & @CRLF
    Next
    EndIf
    EndIf
    EndIf
    _GUICtrlEdit_AppendText($EditSQL, $sApp & ')' & @CRLF & @CRLF)
    Next
    EndIf
    ; Daten aus sqlite_master aufbereiten ==> WAS TUN - wenn keine Feldbeschreibung (Typ,Länge) ??
    ; CREATE TABLE [name] ==> mit Pattern "((?<=CREATE TABLE (\[|\x22|\x27))\w+)" Tabellenname
    ; (feld beschreibung) ==> mit Pattern "((?<=\().*(?=\)))"
    ; ==> separieren ==> StringSplit('string', ',')

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

    ;~ If IsArray($aDB) Then _ArrayDisplay($aDB)
    ; #############################################################################################
    _GUICtrlTreeView_ExpandOneLevel($TreeView1, $ID_Table)
    _GUICtrlTreeView_EndUpdate($TreeView1)
    EndIf
    ; Combo Tabelle füllen:
    _GUICtrlComboBox_BeginUpdate($cbTable)
    _GUICtrlComboBox_ResetContent($cbTable)
    For $i = 0 To UBound($aTable) -1
    _GUICtrlComboBox_AddString($cbTable, $aTable[$i])
    Next
    _GUICtrlComboBox_EndUpdate($cbTable)
    _GUICtrlComboBox_SetCurSel($cbTable, 0)
    _SetFields()
    EndFunc ;==>_LoadTreeView

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

    Func _SetFields()
    _SelAllFromTable()
    Local $table = GUICtrlRead($cbTable)
    _GUICtrlComboBox_BeginUpdate($cbField)
    _GUICtrlComboBox_ResetContent($cbField)
    For $i = 0 To UBound($aStruct) -1
    If $aStruct[$i][0] = $table Then _GUICtrlComboBox_AddString($cbField, $aStruct[$i][1])
    Next
    _GUICtrlComboBox_EndUpdate($cbField)
    _GUICtrlComboBox_SetCurSel($cbField, 0)
    EndFunc

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

    Func _TableChg()
    _SetFields()
    _GUICtrlTreeView_Expand($TreeView1, $LastTbl, False)
    $LastTbl = _Get_Curr_TblID()
    _GUICtrlTreeView_SelectItem($TreeView1, $LastTbl)
    _GUICtrlTreeView_Expand($TreeView1, $LastTbl)
    EndFunc

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

    Func _FieldChg()

    EndFunc

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

    Func _Get_Curr_TblID()
    For $i = 0 To UBound($a_ID_Table) -1
    If _GUICtrlTreeView_GetText($TreeView1, $a_ID_Table[$i]) = GUICtrlRead($cbTable) Then _
    Return $a_ID_Table[$i]
    Next
    EndFunc

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

    Func _cb($aRow)
    For $s In $aRow
    ConsoleWrite($s & @TAB)
    Next
    ConsoleWrite(@LF)
    ; Return $SQLITE_ABORT ; Would Abort the process and trigger an @error in _SQLite_Exec()
    EndFunc

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

    Func _SQLite_INSERT($sTable, $saValues, $Delim=',')
    Local $sInsert = ''
    If Not IsArray($saValues) Then
    Local $aValues[1] = [$saValues]
    Else
    Local $aValues = $saValues
    EndIf
    For $i = 0 To UBound($aValues) -1
    Local $splitVal = StringSplit($aValues[$i], $Delim)
    $sInsert &= "INSERT INTO " & $sTable & " VALUES ("
    For $k = 1 To UBound($splitVal) -1
    $sInsert &= "'" & StringStripWS($splitVal[$k], 3) & "'" & ','
    Next
    $sInsert = StringTrimRight($sInsert, 1) & ");"
    Next
    If $SQLITE_OK <> _SQLite_Exec ( -1, $sInsert ) Then
    Return SetError(1,0,1)
    Else
    Return $SQLITE_OK
    EndIf
    EndFunc ;==>_SQLite_INSERT

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

    Func _SQLite_UPDATE($sTable, $saField_Value, $sWhere=-1, $Delim=',')
    Local $sUpdate = "UPDATE " & $sTable & " SET "
    If Not IsArray($saField_Value) Then
    Local $aValues[1] = [$saField_Value]
    Else
    Local $aValues = $saField_Value
    EndIf
    For $i = 0 To UBound($aValues) -1
    Local $splitVal = StringSplit($aValues[$i], $Delim)
    $sUpdate &= StringStripWS($splitVal[1], 3) & " = '" & StringStripWS($splitVal[2], 3) & "',"
    Next
    $sUpdate = StringTrimRight($sUpdate, 1)
    If $sWhere <> -1 Then $sUpdate &= " WHERE " & $sWhere
    If $SQLITE_OK <> _SQLite_Exec ( -1, $sUpdate ) Then
    Return SetError(1,0,1)
    Else
    Return $SQLITE_OK
    EndIf
    EndFunc ;==>_SQLite_UPDATE

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

    Func _StringSplitOnce($STRING, $DELIM, $OCCURENCE=1)
    If $STRING = '' Then Return SetError(1)
    If $DELIM = '' Then Return SetError(2)
    Local $Out[2]
    Local $len = StringLen($STRING)
    Local $pos = StringInStr($STRING, $DELIM, 1, $OCCURENCE)
    If @error Then Return SetError(3)
    $Out[0] = StringLeft($STRING, $pos-1)
    $Out[1] = StringRight($STRING, $len-$pos)
    Return $Out
    EndFunc ;==>_StringSplitOnce

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

    Func _Array2DDelete(ByRef $ARRAY, $iDEL)
    Local $i, $k, $l
    If ( Not IsArray($ARRAY) ) Then
    SetError(1)
    Return 0
    EndIf
    If ( $iDEL < 0 ) Or ( $iDEL > UBound($ARRAY)-1 ) Then
    SetError(2)
    Return 0
    EndIf
    Local $UBound2nd = UBound($ARRAY,2)
    If @error = 2 Then
    Local $arTmp[UBound($ARRAY)-1]
    $k = 0
    For $i = 0 To UBound($ARRAY)-1
    If $i <> $iDEL Then
    $arTmp[$k] = $ARRAY[$i]
    $k += 1
    EndIf
    Next
    Else
    Local $arTmp[UBound($ARRAY)-1][$UBound2nd]
    $k = 0
    For $i = 0 To UBound($ARRAY)-1
    If $i <> $iDEL Then
    For $l = 0 To $UBound2nd-1
    $arTmp[$k][$l] = $ARRAY[$i][$l]
    Next
    $k += 1
    EndIf
    Next
    EndIf
    $ARRAY = $arTmp
    Return -1
    EndFunc ;==>_Array2DDelete

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

    Func _RecentFiles(ByRef $INI, ByRef $ARRAY, $FILE, ByRef $CURRCOUNT, ByRef $MAXCOUNT, $ASC=1)
    Local $index
    If UBound($ARRAY, 2) Then
    If IsNumber($ARRAY[0][0]) Then _Array2DDelete($ARRAY, 0)
    EndIf
    If $ASC = 1 Then
    If UBound($ARRAY, 2) Then
    $index = _ArraySearch($ARRAY, $FILE, 0, 0, 0, 0, 1, 1)
    If $index = -1 Then
    If $CURRCOUNT = $MAXCOUNT -1 Then
    _Array2DDelete($ARRAY, 0)
    Else
    $CURRCOUNT += 1
    IniWrite($INI, 'recent_num', 'aktuell', $CURRCOUNT)
    EndIf
    Else
    If $CURRCOUNT = 1 Then Return
    _Array2DDelete($ARRAY, $index)
    EndIf
    ReDim $ARRAY[UBound($ARRAY)+1][2]
    Else
    ReDim $ARRAY[1][2]
    EndIf
    $ARRAY[UBound($ARRAY)-1][0] = 'file'
    $ARRAY[UBound($ARRAY)-1][1] = $FILE
    Else
    If UBound($ARRAY, 2) Then
    $index = _ArraySearch($ARRAY, $FILE, 0, 0, 0, 0, 1, 1)
    If $index = -1 Then
    If $CURRCOUNT < $MAXCOUNT -1 Then
    $CURRCOUNT += 1
    IniWrite($INI, 'recent_num', 'aktuell', $CURRCOUNT)
    ReDim $ARRAY[UBound($ARRAY)+1][2]
    EndIf
    Else
    If $CURRCOUNT = 1 Then Return
    _Array2DDelete($ARRAY, $index)
    ReDim $ARRAY[UBound($ARRAY)+1][2]
    EndIf
    For $i = UBound($ARRAY)-1 To 1 Step -1
    $ARRAY[$i][0] = 'file'
    $ARRAY[$i][1] = $ARRAY[$i-1][1]
    Next
    $ARRAY[0][1] = $FILE
    Else
    ReDim $ARRAY[1][2]
    $ARRAY[UBound($ARRAY)-1][0] = 'file'
    $ARRAY[UBound($ARRAY)-1][1] = $FILE
    EndIf
    EndIf
    GUICtrlSetState($aMenuItem[22], $GUI_ENABLE)
    IniWriteSection($INI, 'recent_file', $ARRAY, 0)
    EndFunc ;==>_RecentFiles

    [/autoit]
  • Hamm, dann bleibt wohl nur der Weg über das Comandozeilen Object. Sprich Auswertung des "SCHEMA" Befehls. Etwas umständlich....

    • Offizieller Beitrag

    Etwas umständlich....


    Umständlich klingt gut :D
    Nee, macht mir echt nichts aus, wenns kompliziert wird.
    Also die SQLite-Dokumentation kann ich schon fast auswendig, sooft habe ich sie gelesen. ;)
    Zugriff auf SCHEMA ist unter SQLite mit den PRAGMA-Befehlen möglich. Aber leider erhalte ich dabei nicht alle erforderlichen Infos.
    Aber wenn du Ideen hast - laß hören, bin für jede Schweinerei zu haben :D

  • hmm, was brauchst du denn was dir damit nicht geliefert wird?


    The ".indices" command works in a similar way to list all of the indices for a particular table. The ".indices" command takes a single argument which is the name of the table for which the indices are desired. Last, but not least, is the ".schema" command. With no arguments, the ".schema" command shows the original CREATE TABLE and CREATE INDEX statements that were used to build the current database. If you give the name of a table to ".schema", it shows the original CREATE statement used to make that table and all if its indices. We have:


    The ".schema" command accomplishes the same thing as setting list mode, then entering the following query:

    Zitat

    SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE type!='meta' ORDER BY tbl_name, type DESC, name

  • Ach wenn du schon dabei bist:-)

    Ich hätte unheimlich gerne etwas was schon vor 100 (ca.) jahren informix 4gl konnte. Einen RECORD der die Tabelle beschreibt.

    Geht in etwa so:

    DIM MYRECORD as record like Select * from TABELLE

    Wenn die Tabelle dann die Columns (ID,NAME,TEXT) hat, könnte man über MYRECORD.NAME , etc darauf zugreifen. Was natürlich viel schöner ist als in ein Array [0] zu benutzen.


    Dann hät ich gerne noch MYRECORD.NAME.Value ;)


    mfg

    MF

  • Ich weiß, der Theard ist schon alt, aber bei dem Script kommt bei mir immer ein error wenn ich einen neu erstellte DB öffnen will. Oder wie kann ich sonst dran arbeiten? Wäre schön wenn das noch verbessert wird. Wäre schade um das schöne Projekt.

  • Ich habe Vista Home Premium 64 bit. Ich teste es mal in 32 bzw 64bit
    Wenn ich auf neu drück dann kann ich ja den dateinamen eingeben und wenn die datei erstellt ist steht unten ">>> Keine Datenband ausgewählt <<<
    Wenn ich dann auf öffnen geh und die Datei wähle dann kommt der error:

    [autoit]

    C:\Users\Matze\Desktop\SQLite_Author.au3 (838) : ==> Array variable subscript badly formatted.:
    Local $arTmp[UBound($ARRAY)-1][$UBound2nd]
    Local $arTmp[^ ERROR
    ->14:38:34 AutoIT3.exe ended.rc:1
    +>14:38:36 AutoIt3Wrapper Finished
    >Exit code: 1 Time: 21.230

    [/autoit]
    • Offizieller Beitrag

    Folgendes:
    Die Funktion DB-Neu ist zwar rein funktionell vorhanden (DB wird erstellt) - aber noch nicht weiter eingebunden. Im jetzigen Projektstatus kannst du also nur existierende DB's damit anschauen.
    Diesen Monat bin ich arg eingebunden auf Arbeit, ich hoffe , dass ich danach mal wieder dieses Projekt vorantreiben kann.

  • Habe ein Autoit-Script, das sehr lange funktionierte. Seit ein paar Tagen spinnt SQLite.
    Das Script baut eine Datenbank auf und schließt sie beim beenden wieder. Seit ein paar Tagen kommt:
    "SQLite Error: not an error"
    und danach nur
    "no such table: installs"
    d.h. Die Tabelle -installs- die das Programm erst aufbaut ist nicht da, am Programm und an AutoIt hab ich nichts geändert.
    Kann das ein Fehler von WinXP sein, oder kann ich SQLite irgendwie neu installieren???

  • Ich weiß jetzt nicht wie ich mein Autoit-Programm mit dem "sqliteadmin" zusammenbringen kann.

    Die Datenbank wird so erzeugt:

    [autoit]

    Func _SQLCreateDBStruct()
    _SQLRun("CREATE TABLE installs (name VARCHAR PRIMARY KEY, version VARCHAR, cat VARCHAR, autor VARCHAR, inhalt VARCHAR, homepage VARCHAR, uptodate VARCHAR, lizenz VARCHAR, system VARCHAR)")
    EndFunc ;==>_SQLCreateDBStruct

    [/autoit]


    Kann es da einen Fehler geben???

  • Kann hier noch einer mal helfen???
    Die SQL-Datenbank wird temporär erzeugt und zum Schluß wieder geschlossen, alse existiert keine .db-datei.