- 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
#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)
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
$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")
$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
$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)
_DisableItems('1,2,3,6,7')
If $currCountFiles = 0 Then GUICtrlSetState($aMenuItem[22], $GUI_DISABLE)
GUISetState(@SW_SHOW, $GUI_Main)
_GUICtrlStatusBar_SetIcon ($hStatus, 0, 47, "shell32.dll")
_GUICtrlStatusBar_SetText ($hStatus, ">> Keine Datenbank geöffnet <<", 1)
_SQLite_Startup()
If @error Then Exit MsgBox(262192, 'Fehler', 'SQLite.DLL konnte nicht initialisiert werden!')
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
While 1
Sleep(100)
WEnd
Func GUIMainClose()
IniWrite($INI, 'settings', 'last_folder', $currFolder)
If $hSQL > 0 Then _SQLite_Close($hSQL)
_SQLite_Shutdown()
Exit
EndFunc
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
Func MenuItem_DB_Open()
_OpenDB()
EndFunc
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
Func _itemClick()
Local $index = _ArraySearch($aItemID, @GUI_CtrlId, 0, 0, 0, 0, 1, 0)
_OpenDB($aRecentFiles[$index][1])
EndFunc
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
Func MenuItem_DB_Clean()
;~ 'VACUUM'
EndFunc
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
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
Func MenuItem_Table_New()
; Einblenden GUI_Table
MsgBox(262192, 'Table_New', 'noch nicht besetzt')
EndFunc
Func MenuItem_Table_Chg()
; Einblenden GUI_Table mit Tabellenauswahl
MsgBox(262192, 'Table_Chg', 'noch nicht besetzt')
EndFunc
Func MenuItem_Table_Del()
; Einblenden GUI_Table mit Tabellenauswahl
MsgBox(262192, 'Table_Del', 'noch nicht besetzt')
EndFunc
Func MenuItem_Index_New()
; Einblenden GUI_Index mit Tabellenauswahl, Feldliste, Indextypauswahl
MsgBox(262192, 'Index_New', 'noch nicht besetzt')
EndFunc
Func MenuItem_Index_Chg()
; Einblenden GUI_Index mit Indexauswahl, Indextypauswahl
MsgBox(262192, 'Index_Chg', 'noch nicht besetzt')
EndFunc
Func MenuItem_Index_Del()
; Einblenden GUI_Index mit Indexauswahl
MsgBox(262192, 'Index_Del', 'noch nicht besetzt')
EndFunc
Func MenuItem_Trigger_New()
; Einblenden GUI_Trigger m. allen Optionen
MsgBox(262192, 'Trigger_New', 'noch nicht besetzt')
EndFunc
Func MenuItem_Trigger_Chg()
; Einblenden GUI_Trigger mit Triggerauswahl, Editierfeld
MsgBox(262192, 'Trigger_Chg', 'noch nicht besetzt')
EndFunc
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
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
Func MenuItem_Expand()
_GUICtrlTreeView_Expand($TreeView1)
EndFunc
Func MenuItem_Collapse()
_GUICtrlTreeView_Expand($TreeView1, 0, False)
EndFunc
Func CM_ExpandSubs()
Local $hCurrentItem = _GUICtrlTreeView_GetSelection($TreeView1)
If $hCurrentItem = 0 Then Return
_GUICtrlTreeView_Expand($TreeView1, $hCurrentItem)
EndFunc
Func CM_CollapseSubs()
Local $hCurrentItem = _GUICtrlTreeView_GetSelection($TreeView1)
If $hCurrentItem = 0 Then Return
_GUICtrlTreeView_Expand($TreeView1, $hCurrentItem, False)
EndFunc
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
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
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
Func _DisableItems($sITEM)
Local $var = StringSplit($sITEM, ',')
For $i = 1 To UBound($var) -1
GUICtrlSetState($aMenuItem[$var[$i]], $GUI_DISABLE)
Next
EndFunc
Func _EnableItems($sITEM)
Local $var = StringSplit($sITEM, ',')
For $i = 1 To UBound($var) -1
GUICtrlSetState($aMenuItem[$var[$i]], $GUI_ENABLE)
Next
EndFunc
; 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,
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)
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)
; 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', ',')
;~ 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
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
Func _TableChg()
_SetFields()
_GUICtrlTreeView_Expand($TreeView1, $LastTbl, False)
$LastTbl = _Get_Curr_TblID()
_GUICtrlTreeView_SelectItem($TreeView1, $LastTbl)
_GUICtrlTreeView_Expand($TreeView1, $LastTbl)
EndFunc
Func _FieldChg()
EndFunc
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
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
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
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
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
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
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