Hallo,
ich bin gerade dabei eine kleine Adressenverwaltung zu erstellen. Wenn man darin auf den Button klickt um den vorhergehenden bzw. nachfolgenden Datensatz anzuzeigen steigt mein Script aus. Der Fehler ist reproduzierbar und in folgendem kleinen Skript tritt er auch auf
Spoiler anzeigen
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Add_Constants=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <SQLite.au3>
#include <SQLite.dll.au3>
Opt('GUIOnEventMode', 1)
Opt('MUSTDECLAREVARS' ,1)
Global $sqldb = @ScriptDir & '\AutoAdress.s3db'
[/autoit] [autoit][/autoit] [autoit]_Main()
[/autoit] [autoit][/autoit] [autoit]func _Main()
_DatenbankAnlegen()
_dsFind('Select * from Adressen where Such<"SCHMITT" order by Such DESC') ;diese Zeile funktioniert
_dsFind('Select * from Adressen where Such<"HUBER" order by Such DESC') ;diese nicht
While 1
Sleep(1000)
WEnd
EndFunc
Func _DatenbankAnlegen()
Local $sql, $res
_FileCreate($sqldb)
_SQLite_Startup ()
If @error > 0 Then
MsgBox(16, "SQLite Fehler", "SQLite.dll kann nicht geladen werden!")
Exit
EndIf
_SQLite_Open($sqldb)
If @error > 0 Then
MsgBox(16, "SQLite Fehler", "Kann Datenbank nicht öffnen")
Exit
EndIf
$sql = "CREATE TABLE [Adressen] ([AdrNr] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,[Such] VARCHAR(20) UNIQUE NOT NULL)"
$res = _SQLite_Exec (-1, $sql)
$sql = "CREATE UNIQUE INDEX [idAdr] ON [Adressen]([Such] ASC,[AdrNr] ASC)"
$res = _SQLite_Exec (-1, $sql)
$sql = "INSERT INTO Adressen (Such) VALUES ('MAIER');"
$res = _SQLite_Exec (-1, $sql)
$sql = "INSERT INTO Adressen (Such) VALUES ('SCHULZE');"
$res = _SQLite_Exec (-1, $sql)
$sql = "INSERT INTO Adressen (Such) VALUES ('SCHMITT');"
$res = _SQLite_Exec (-1, $sql)
$sql = "INSERT INTO Adressen (Such) VALUES ('HUBER');"
$res = _SQLite_Exec (-1, $sql)
$sql = "INSERT INTO Adressen (Such) VALUES ('MÜLLER');"
$res = _SQLite_Exec (-1, $sql)
$sql = "CREATE TABLE [Gruppen] ([GrpNr] INTEGER NOT NULL PRIMARY KEY,[Bezeichnung] VARCHAR(30) NOT NULL,[Vorfahre] INTEGER NOT NULL)"
$sql = $sql & ";CREATE UNIQUE INDEX [idKinder] ON [Gruppen]([Vorfahre] ASC,[GrpNr] ASC)"
$res = _SQLite_Exec (-1, $sql)
$sql = "INSERT INTO Gruppen(GrpNr,Bezeichnung,Vorfahre) VALUES ('1','Test1','0');"
$res = _SQLite_Exec (-1, $sql)
$sql = "Insert into Gruppen(GrpNr,Bezeichnung,Vorfahre) Values ('2','Test2','0');"
$res = _SQLite_Exec (-1, $sql)
$sql = "Insert into Gruppen(GrpNr,Bezeichnung,Vorfahre) Values ('3','Test1.1','1');"
$res = _SQLite_Exec (-1, $sql)
$sql = "Insert into Gruppen(GrpNr,Bezeichnung,Vorfahre) Values ('4','Test1.2','1');"
$res = _SQLite_Exec (-1, $sql)
$sql = "Insert into Gruppen(GrpNr,Bezeichnung,Vorfahre) Values ('5','Test2.1','2');"
$res = _SQLite_Exec (-1, $sql)
$sql = "Insert into Gruppen(GrpNr,Bezeichnung,Vorfahre) Values ('6','Test2.2','2');"
$res = _SQLite_Exec (-1, $sql)
$sql = "INSERT INTO Gruppen(GrpNr,Bezeichnung,Vorfahre) VALUES ('7','Test7','0');"
$res = _SQLite_Exec (-1, $sql)
$sql = "INSERT INTO Gruppen(GrpNr,Bezeichnung,Vorfahre) VALUES ('8','Test8','0');"
$res = _SQLite_Exec (-1, $sql)
_SQLite_Close()
_SQLite_Shutdown()
EndFunc
func _dsFind($sql='');
Local $aRow[2]
;if $dsButtonsUpdate=True Then Exit
$sql = $sql & ' LIMIT 1'
_SQLite_Startup ()
If @error > 0 Then
MsgBox(16, "SQLite Fehler", "SQLite.dll kann nicht geladen werden!")
Exit
EndIf
_SQLite_Open($sqldb)
If @error > 0 Then
MsgBox(16, "SQLite Fehler", "Kann Datenbank nicht öffnen")
Exit
EndIf
;*******************************************************************************************************
;*************** wenn dieser Ausschnitt nicht aktiv funktioniert der Zugriff auf ********************
;*************** die Zugriffstasten auch bei Dauer-Feuer ********************
;*************** $hPrevious und $hNext-Taste (Auslöser für _dsPrevious/_dsNext) ********************
;*************** Fehler wird ausgelöst, wenn SQLite keine Daten zurückliefern kann ********************
;*************** weil es keinen Datensatz gibt der kleiner/größer ist ********************
;*******************************************************************************************************
;#cs
If _SQLite_QuerySingleRow(-1,$sql,$aRow) =$SQLITE_OK Then
if $aRow<>"" Then
MsgBox(0,"Ergebnis: " & $sql,$aRow[1])
;Else nichts gefunden
EndIf
EndIf
;#ce
;*******************************************************************************************************
;_dsCheckBrowseButtons() ;soll verhindern das man vor bzw. hinter den letzten Datensatz blättern kann
_SQLite_Close ()
_SQLite_Shutdown ()
EndFunc
was mach ich da verkehrt?
Im Anhang ist außerdem noch mein bisheriger Programmstand, das ReSizen einzelner Controlls funktioniert überraschend einfach
Oscar der TreeView mit 3 Zuständen ist noch nicht drin.
MFG (Auto)Bert
Edit BugFix: AutoIt-Tags gesetzt.
BugFix Danke
EDIT1: Im kleinen Beispiel war das SQLite Statement leider 2 mal mit Limit 1 angegeben korrigiert
EDIT2: benutze jetzt _SQLite_Query zusammen mit_ SQLite_FetchDATA (durch LIMIT 1 kommt eh nur ein Datensatz)Programmanhang wurde upgedated
EDIT3: Anhang herausgenommen (waren zu viele Fehler drin)
Werde wenn das Programm (1. mit AutoIT) fertig ist in Scripte vorstellen
mfg (Auto)Bert