Ja danke, aber hilft leider nicht wirklich. "sqlite_sequence" läßt sich per SQL-Statement nicht abfragen, die Inhalte von "sqlite_master" bieten nicht alle Infos, die ich möchte ![]()
Beiträge von BugFix
-
-
UltraVNC oder RealVNC sind eigentlich super für Fernwartung geeignet.
-
Datei zum Lesen oder Schreiben öffnen, mode-Flags addieren.
FileOpen($Datei, mode)
mode: 16 = Force binary(byte) reading and writing mode with FileRead and FileWrite -
Ja, gute Idee

-
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öschenDas 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>
[/autoit] [autoit][/autoit] [autoit]
#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
[/autoit] [autoit][/autoit] [autoit]
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)
[/autoit] [autoit][/autoit] [autoit]
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)
[/autoit] [autoit][/autoit] [autoit]
$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)
[/autoit] [autoit][/autoit] [autoit]
_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')
[/autoit] [autoit][/autoit] [autoit]
If $currCountFiles = 0 Then GUICtrlSetState($aMenuItem[22], $GUI_DISABLE)
GUISetState(@SW_SHOW, $GUI_Main)_GUICtrlStatusBar_SetIcon ($hStatus, 0, 47, "shell32.dll")
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlStatusBar_SetText ($hStatus, ">> Keine Datenbank geöffnet <<", 1)_SQLite_Startup()
[/autoit] [autoit][/autoit] [autoit]
If @error Then Exit MsgBox(262192, 'Fehler', 'SQLite.DLL konnte nicht initialisiert werden!')If $aItemID[0][0] <> -1 Then
[/autoit] [autoit][/autoit] [autoit]
_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
EndIfWhile 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(100)
WEndFunc GUIMainClose()
[/autoit] [autoit][/autoit] [autoit]
IniWrite($INI, 'settings', 'last_folder', $currFolder)
If $hSQL > 0 Then _SQLite_Close($hSQL)
_SQLite_Shutdown()
Exit
EndFuncFunc MenuItem_DB_New()
[/autoit] [autoit][/autoit] [autoit]
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')
EndFuncFunc MenuItem_DB_Open()
[/autoit] [autoit][/autoit] [autoit]
_OpenDB()
EndFuncFunc _OpenDB($path = -1)
[/autoit] [autoit][/autoit] [autoit]
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
EndFuncFunc _itemClick()
[/autoit] [autoit][/autoit] [autoit]
Local $index = _ArraySearch($aItemID, @GUI_CtrlId, 0, 0, 0, 0, 1, 0)
_OpenDB($aRecentFiles[$index][1])
EndFuncFunc _ResetRecentFiles()
[/autoit] [autoit][/autoit] [autoit]
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
EndFuncFunc MenuItem_DB_Clean()
[/autoit] [autoit][/autoit] [autoit]
;~ 'VACUUM'
EndFuncFunc MenuItem_DB_Close()
[/autoit] [autoit][/autoit] [autoit]
_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')
EndFuncFunc _clear()
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetData($EditSQL, '')
ReDim $aTable[1]
$aTable[0] = ''
ReDim $aStruct[1][2]
$aStruct[0][0] = ''
_GUICtrlTreeView_DeleteAll($TreeView1)
_GUICtrlComboBox_ResetContent($cbTable)
_GUICtrlComboBox_ResetContent($cbField)
EndFuncFunc MenuItem_Table_New()
[/autoit] [autoit][/autoit] [autoit]
; Einblenden GUI_Table
MsgBox(262192, 'Table_New', 'noch nicht besetzt')
EndFuncFunc MenuItem_Table_Chg()
[/autoit] [autoit][/autoit] [autoit]
; Einblenden GUI_Table mit Tabellenauswahl
MsgBox(262192, 'Table_Chg', 'noch nicht besetzt')
EndFuncFunc MenuItem_Table_Del()
[/autoit] [autoit][/autoit] [autoit]
; Einblenden GUI_Table mit Tabellenauswahl
MsgBox(262192, 'Table_Del', 'noch nicht besetzt')
EndFuncFunc MenuItem_Index_New()
[/autoit] [autoit][/autoit] [autoit]
; Einblenden GUI_Index mit Tabellenauswahl, Feldliste, Indextypauswahl
MsgBox(262192, 'Index_New', 'noch nicht besetzt')
EndFuncFunc MenuItem_Index_Chg()
[/autoit] [autoit][/autoit] [autoit]
; Einblenden GUI_Index mit Indexauswahl, Indextypauswahl
MsgBox(262192, 'Index_Chg', 'noch nicht besetzt')
EndFuncFunc MenuItem_Index_Del()
[/autoit] [autoit][/autoit] [autoit]
; Einblenden GUI_Index mit Indexauswahl
MsgBox(262192, 'Index_Del', 'noch nicht besetzt')
EndFuncFunc MenuItem_Trigger_New()
[/autoit] [autoit][/autoit] [autoit]
; Einblenden GUI_Trigger m. allen Optionen
MsgBox(262192, 'Trigger_New', 'noch nicht besetzt')
EndFuncFunc MenuItem_Trigger_Chg()
[/autoit] [autoit][/autoit] [autoit]
; Einblenden GUI_Trigger mit Triggerauswahl, Editierfeld
MsgBox(262192, 'Trigger_Chg', 'noch nicht besetzt')
EndFuncFunc MenuItem_Trigger_Del()
[/autoit] [autoit][/autoit] [autoit]
; 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
BEGINUPDATE tblNewTest SET 'Jahre' = 100;
[/autoit] [autoit][/autoit] [autoit]END;
[/autoit] [autoit][/autoit] [autoit]* CREATE TRIGGER
[/autoit] [autoit][/autoit] [autoit]
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.
#ceFunc MenuItem_Expand()
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlTreeView_Expand($TreeView1)
EndFuncFunc MenuItem_Collapse()
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlTreeView_Expand($TreeView1, 0, False)
EndFuncFunc CM_ExpandSubs()
[/autoit] [autoit][/autoit] [autoit]
Local $hCurrentItem = _GUICtrlTreeView_GetSelection($TreeView1)
If $hCurrentItem = 0 Then Return
_GUICtrlTreeView_Expand($TreeView1, $hCurrentItem)
EndFuncFunc CM_CollapseSubs()
[/autoit] [autoit][/autoit] [autoit]
Local $hCurrentItem = _GUICtrlTreeView_GetSelection($TreeView1)
If $hCurrentItem = 0 Then Return
_GUICtrlTreeView_Expand($TreeView1, $hCurrentItem, False)
EndFuncFunc _GUICtrlTreeView_ExpandOneLevel($hTreeView, $hParentItem=0)
[/autoit] [autoit][/autoit] [autoit]
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_ExpandOneLevelFunc 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)
[/autoit] [autoit][/autoit] [autoit]
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")
EndFuncFunc _SelAllFromTable()
[/autoit] [autoit][/autoit] [autoit]
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
EndFuncFunc _DisableItems($sITEM)
[/autoit] [autoit][/autoit] [autoit]
Local $var = StringSplit($sITEM, ',')
For $i = 1 To UBound($var) -1
GUICtrlSetState($aMenuItem[$var[$i]], $GUI_DISABLE)
Next
EndFuncFunc _EnableItems($sITEM)
[/autoit] [autoit][/autoit] [autoit]
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"
[/autoit] [autoit][/autoit] [autoit]
; 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
[/autoit] [autoit][/autoit] [autoit]
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
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$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)
[/autoit] [autoit][/autoit] [autoit]
; #############################################################################################
_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 ;==>_LoadTreeViewFunc _SetFields()
[/autoit] [autoit][/autoit] [autoit]
_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)
EndFuncFunc _TableChg()
[/autoit] [autoit][/autoit] [autoit]
_SetFields()
_GUICtrlTreeView_Expand($TreeView1, $LastTbl, False)
$LastTbl = _Get_Curr_TblID()
_GUICtrlTreeView_SelectItem($TreeView1, $LastTbl)
_GUICtrlTreeView_Expand($TreeView1, $LastTbl)
EndFuncFunc _FieldChg()
[/autoit] [autoit][/autoit] [autoit]
EndFuncFunc _Get_Curr_TblID()
[/autoit] [autoit][/autoit] [autoit]
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
EndFuncFunc _cb($aRow)
[/autoit] [autoit][/autoit] [autoit]
For $s In $aRow
ConsoleWrite($s & @TAB)
Next
ConsoleWrite(@LF)
; Return $SQLITE_ABORT ; Would Abort the process and trigger an @error in _SQLite_Exec()
EndFuncFunc _SQLite_INSERT($sTable, $saValues, $Delim=',')
[/autoit] [autoit][/autoit] [autoit]
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_INSERTFunc _SQLite_UPDATE($sTable, $saField_Value, $sWhere=-1, $Delim=',')
[/autoit] [autoit][/autoit] [autoit]
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_UPDATEFunc _StringSplitOnce($STRING, $DELIM, $OCCURENCE=1)
[/autoit] [autoit][/autoit] [autoit]
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 ;==>_StringSplitOnceFunc _Array2DDelete(ByRef $ARRAY, $iDEL)
[/autoit] [autoit][/autoit] [autoit]
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 ;==>_Array2DDeleteFunc _RecentFiles(ByRef $INI, ByRef $ARRAY, $FILE, ByRef $CURRCOUNT, ByRef $MAXCOUNT, $ASC=1)
[/autoit]
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 -
Wenn du statt +20 (das ist die Höhe des im Popup-Fenster nicht sichtbaren Titels) +200 setzt, wird während des Klicks 180 Pixel unter deinem Picture-Control eine transparente GUI erzeugt. Du hast es also nicht *iwie weggekriegt*, sondern nur verschoben. 
-
Wenn du den Effekt nicht willst, kannst du die Zeilen 5,6,7,9 kpl. löschen.
Das ist das, was ich meine - du verwendest die Dinge ohne zu wissen was du tust. -
Spar dir diese Kommentare, die Funktion läuft auch unter Vista. Du mußt nur einen anderen Picture-Pfad angeben.
(Wie wenig man selbst in Redmond von Vista hält, zeigt sich auch hier dran, dass auf das bisherige (in allen Windows-Varianten bestehende) System der Pfadintegrität verzichtet wurde
) -
Wieso -1?
Als Vorbelegung wird ein Wert gewählt, der durch die funktionsgerechte Nutzung der Variablen (also hier Öffnen einer Datei) nicht vorkommen kann. Somit ist eindeutig: Steht noch -1 in $open, wurde keine Datei bisher geöffnet (sonst würde $open den Dateinamen enthalten). -
Hi,
ich habe das Bsp. gerade im Hilfeboard gebracht, möchte es aber hier nochmals anbringen.
Standardmäßig kann ich Button mit Icon oder Bitmap versehen - aber nicht mit GIF oder JPG.
Wer also also ein Picture-Control als Button verwendet aber nicht auf den "Klick-Effekt" verzichten möchte, kann dafür diese Funktion nutzen.
Um den Effekt zu erreichen verschiebe ich das Picture-Control und ändere seine Größe. Außerdem lege ich für die "Klickzeit" ein transparentes Fenster auf das Control._AnimButton()
[autoit]#include<WindowsConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include<GUIConstantsEx.au3>
#include<StaticConstants.au3>
Global $pic = @SystemDir & '\oobe\images\nextover.jpg'$gui = GUICreate("Test",Default,Default,-1,-1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$btnPic = GUICtrlCreatePic($pic, 30, 40, 24, 24)
GUISetState()While 1
[/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
Select
Case $msg = $btnPic
_AnimButton($gui, $btnPic)
MsgBox(0, '', 'click')
Case $msg = $GUI_EVENT_CLOSE
Exit
EndSelect
WEnd;==================================================================================================
[/autoit]
; Function Name: _AnimButton($IDgui, $IDbtn [, $delay=150])
; Description: animiert ein Pic, wie einen geklickten Button
; Parameter(s): $IDgui ID der GUI
; $IDbtn ID des Picture als Button
; optional $delay Verzögerung Zustand geklickt/nicht geklickt, Standard 150 ms
;==================================================================================================
Func _AnimButton($IDgui, $IDbtn, $delay=150)
Local $pos = ControlGetPos($IDgui, '', $IDbtn)
Local $pWin = WinGetPos($IDgui)
ControlMove($IDgui, '', $IDbtn, $pos[0], $pos[1]+1, $pos[2]-1, $pos[3]-1)
Local $tmpGui = GUICreate('', $pos[2], $pos[3], $pWin[0]+$pos[0], $pWin[1]+$pos[1]+20, $WS_POPUP)
WinSetTrans($tmpGui, '', 120)
GUISetState(@SW_SHOW, $tmpGui)
Sleep($delay)
GUIDelete($tmpGui)
ControlMove($IDgui, '', $IDbtn, $pos[0], $pos[1], $pos[2], $pos[3])
EndFunc ;==> _AnimButton -
Na gut, einmal noch.
Habe die Funktion mal so verändert, dass nur noch ein Picture benötigt wird. Den optischen Klick-Effekt erzeuge ich durch Verschieben und Übergrauen des Picture-Controls.
Spoiler anzeigen
[autoit]#include<WindowsConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include<GUIConstantsEx.au3>
#include<StaticConstants.au3>
Global $pic = @SystemDir & '\oobe\images\nextover.jpg'$gui = GUICreate("Test",Default,Default,-1,-1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$btnPic = GUICtrlCreatePic($pic, 30, 40, 24, 24)
GUISetState()While 1
[/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
Select
Case $msg = $btnPic
_AnimButton($gui, $btnPic)
MsgBox(0, '', 'click')
Case $msg = $GUI_EVENT_CLOSE
Exit
EndSelect
WEnd;==================================================================================================
[/autoit]
; Function Name: _AnimButton($IDgui, $IDbtn [, $delay=150])
; Description: animiert ein Pic, wie einen geklickten Button
; Parameter(s): $IDgui ID der GUI
; $IDbtn ID des Picture als Button
; optional $delay Verzögerung Zustand geklickt/nicht geklickt, Standard 150 ms
;==================================================================================================
Func _AnimButton($IDgui, $IDbtn, $delay=150)
Local $pos = ControlGetPos($IDgui, '', $IDbtn)
Local $pWin = WinGetPos($IDgui)
ControlMove($IDgui, '', $IDbtn, $pos[0], $pos[1]+1, $pos[2]-1, $pos[3]-1)
Local $tmpGui = GUICreate('', $pos[2], $pos[3], $pWin[0]+$pos[0], $pWin[1]+$pos[1]+20, $WS_POPUP)
WinSetTrans($tmpGui, '', 120)
GUISetState(@SW_SHOW, $tmpGui)
Sleep($delay)
GUIDelete($tmpGui)
ControlMove($IDgui, '', $IDbtn, $pos[0], $pos[1], $pos[2], $pos[3])
EndFunc ;==> _AnimButton -
@m3hm3t:
Bitte immer gleich das kpl. Skript posten, wenn man weiß, was es werden soll, kann man das ganz anders lösen.
Das Problem war nicht die Fehlerabfrage an sich, sondern die Tatsache, dass ohne vorher eine Datei zu öffnen auch die Variable $open nicht existierte. Man muß sie also deklarieren und mit einem Vergleichswert vorbelegen um zu sehen ob eine Datei geöffnet wurde oder nicht.
Das Deklarieren der Variablen hat nichts mit der Verwendung in der Schleife zu tun. In deinem jetzigen Skript existierte $open ja gar nicht, wenn nur Speichern gedrückt wurde.
Ich hab dir dein Skript mal angepaßt:Spoiler anzeigen
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#NoTrayIcon
Global $open = -1GUICreate("Error Test", 600, 400)
[/autoit] [autoit][/autoit] [autoit]
$edit = GUICtrlCreateEdit("", 0, 0, 500, 300)
$button = GUICtrlCreateButton("Öffnen...", 200, 320, 100, 25)
$button2 = GUICtrlCreateButton("Speichern", 350, 320, 100, 25)GUISetState()
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit]
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $button
$open = FileOpenDialog("Öffnen", @DesktopDir, "Textdokument (*.txt)")
$read = FileRead($open)
GUICtrlSetData($edit, $read)
Case $button2
If $open <> -1 Then
$fileopen = FileOpen($open, 2)
FileWrite($fileopen, GUICtrlRead($edit))
FileClose($fileopen)
Else
If GUICtrlRead($edit) <> '' Then ; nur wenn was im Editfeld steht
$save = FileSaveDialog("Speichern unter...", @DesktopDir, "Textdokument (*.txt)|Alle Dateien (*.*)")
If $save And StringRight($save, 4) <> '.txt' Then $save &= ".txt"
FileWrite($save, (GUICtrlRead($edit)))
EndIf
EndIf
EndSwitch
WEnd -
nochdazu funktioniert dein script nichtmal
da kommt nur eine gui ohne inhalt ohne buttons ohne irgendwas
[autoit]
Wahrscheinlich nutzt du kein Windows sondern Vista
- Pfad anpassen:; statt
[/autoit]
Global $picBasic = 'C:\WINDOWS\system32\oobe\images\'
; ändern zu ==>
Global $picBasic = @SystemDir & '\oobe\images\' -
Die @error-Abfrage muß direkt in der Folgezeile des (möglichen) Errors gesetzt werden. Da jede weitere erfolgreiche Funktion automatisch @error = 0 zurückgibt.
[autoit]$fileopen = FileOpen($open, 2)
[/autoit]
FileWrite($fileopen, GUICtrlRead($edit))
; jetzt Fehlerabfrage
If @error Then
$save = FileSaveDialog("Speichern unter...", @DesktopDir, "Textdokument (*.txt)|Alle Dateien (*.*)")
If $save Then $save &=".txt"
FileWrite($save, (GUICtrlRead($edit)))
EndIf
FileClose($fileopen) -
und vor allem sehr unübersichtlich
Ich glaube, du weißt nicht, was du mit diesem Satz angerichtet hast!
Diesen wirklich einfachen Code von mir als *sehr unübersichtlich* zu bezeichnen, betrachte ich schon als persönliche Beleidigung!!Vielleicht solltest du mal in Betracht ziehen, dass das *Unübersichtlichkeitsproblem* zwischen deinen Ohren sitzt.
Würdest du dir die Mühe machen, die verwendeten Funktionen in der Hilfe nachzulesen und nachzustellen, hättest du auch keine Probleme, den Code zu verstehen.[NB]
User Eistee in meine Non-Support-List verschieb
[/NB] -
und die anderen raffe ich nicht
Ich glaube, du willst es dir zu leicht machen. Du mußt natürlich den von uns gezeigten Code durcharbeiten, Funktionen, die du nicht verstehst in der Hilfe nachschlagen, solange bis dir klar ist, was dort passiert.
Ich habs mal kommentiert. Aber meine Kommentare enthalten eigentlich nur das, was du selbst nachlesen kannst!Spoiler anzeigen
[autoit]#include<GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include<StaticConstants.au3>
Global $picBasic = 'C:\WINDOWS\system32\oobe\images\'
Global $pic1 = 'nextover.jpg' ; Bild f. nicht gedrückten Button
Global $pic2 = 'nextup.jpg' ; Bild für gedrückten Button$gui = GUICreate("Test",Default,Default,-1,-1)
[/autoit] [autoit][/autoit] [autoit]
$btn = GUICtrlCreatePic($picBasic & $pic1, 30, 40, 24, 24, $SS_BLACKRECT)
GUISetState()Do
[/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
$aCursorInfo = GUIGetCursorInfo()
Select
Case $aCursorInfo[2] = 1 And $aCursorInfo[4] = $btn ; li. (primäre) Maustaste UND Button gedrückt
; AnimierFunc aufrufen (ID-GUI, ID-Btn, BildPfad-nicht-gedrückt, BildPfad-gedrückt [, optional Verzögrung])
_AnimButton($gui, $btn, $picBasic & $pic1, $picBasic & $pic2)
; Code
Case Else
;;
EndSelect
Until $msg = $GUI_EVENT_CLOSEFunc _AnimButton($IDgui, ByRef $IDbtn, $picUP, $picDOWN, $delay=150)
[/autoit]
Local $pos = ControlGetPos($IDgui, '', $IDbtn)
GUICtrlDelete($IDbtn)
Local $tmpBtn = GUICtrlCreatePic($picDOWN, $pos[0], $pos[1]+1, $pos[2]-1, $pos[3]-1)
Sleep($delay)
GUICtrlDelete($tmpBtn)
$IDbtn = GUICtrlCreatePic($picUP, $pos[0], $pos[1], $pos[2], $pos[3])
EndFunc -
oder so:
Spoiler anzeigen
[autoit]#include<GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include<StaticConstants.au3>
Global $picBasic = 'C:\WINDOWS\system32\oobe\images\'
Global $pic1 = 'nextover.jpg', $pic2 = 'nextup.jpg'$gui = GUICreate("Test",Default,Default,-1,-1)
[/autoit] [autoit][/autoit] [autoit]
$btn = GUICtrlCreatePic($picBasic & $pic1, 30, 40, 24, 24, $SS_BLACKRECT)
GUISetState()Do
[/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
$aCursorInfo = GUIGetCursorInfo()
Select
Case $aCursorInfo[2] = 1 And $aCursorInfo[4] = $btn
_AnimButton($gui, $btn, $picBasic & $pic1, $picBasic & $pic2)
; Code
Case Else
;;
EndSelect
Until $msg = $GUI_EVENT_CLOSEFunc _AnimButton($IDgui, ByRef $IDbtn, $picUP, $picDOWN, $delay=150)
[/autoit]
Local $pos = ControlGetPos($IDgui, '', $IDbtn)
GUICtrlDelete($IDbtn)
Local $tmpBtn = GUICtrlCreatePic($picDOWN, $pos[0], $pos[1]+1, $pos[2]-1, $pos[3]-1)
Sleep($delay)
GUICtrlDelete($tmpBtn)
$IDbtn = GUICtrlCreatePic($picUP, $pos[0], $pos[1], $pos[2], $pos[3])
EndFunc -
Hi,
Bot-Coding ist hier nicht gern gesehen. Aber ich hoffe, dass die vielfältigen Möglichkeiten von AutoIt dich stärker interessieren.
Also sei Willkommen in der AutoIt-Gemeinde. -
Ich würde es hier unterbringen:
Spoiler anzeigen
[autoit]Func STARTButton()
[/autoit]
If $openFileDialog > 0 Then
MsgBox(0, "GUI Event", "Keine Datei Ausgewählt," & @CRLF & "Bitte wählen sie eine Datei!")
Else
verlauf()
FileWriteLine($openFileDialogDestinationDatei, "DFT spectrum")
FileWriteLine($openFileDialogDestinationDatei, "NumPoints = " & $zeilenZaehlen &", ")
FileWriteLine($openFileDialogDestinationDatei, "Frequency(Hz) Magnitude(dB)")
$i = 4
MsgBox(0,"Eingelesene Zeilen:", $zeilenZaehlen)
Local $step = Floor(100/$zeilenZaehlen), $progress = 0
ProgressOn('Schreibe in Datei', 'Spektrumanalyse')
Do
$progress += $step
ProgressSet($progress, $progress & ' %')
FileWriteLine($openFileDialogDestinationDatei, StringRegExpReplace($csvDateiInhaltArray[$i], "[\.]", "\,"))
$i = $i + 1
Until $i = $zeilenZaehlen
ProgressSet(100, 'Fertig!')
Sleep(1500)
ProgressOff()
FileClose($openFileDialogDestinationDatei)
MsgBox(0,"", "Datei Geschrieben!")
EndIf
EndFunc -
Leider ist das mit der neuen AutoIt-Version so nicht mehr machbar. Ich bin so zu meinem Ziel gekommen:
[autoit]
An der Syntax hat sich auch unter 3.2.12.0 nichts geändert.
- Start Gruppe mit Koordinaten
- Radio-Ctrl erstellen
- Gruppe schließenGUICtrlCreateGroup("Group 1", 190, 60, 90, 140)
[/autoit]
$radio_1 = GUICtrlCreateRadio("Radio 1", 210, 90, 50, 20)
$radio_2 = GUICtrlCreateRadio("Radio 2", 210, 110, 60, 50)
GUICtrlCreateGroup("", -99, -99, 1, 1) ;close group