In SciTE kann ich das Script nicht aufrufen, da die DB-Treiber nur als 32bit Version vorliegen.
Jetzt habe ich das Script nochmal geöffnet und was soll ich sagen: Die Fehler kommen nicht mehr. Weiss der Geier was da los war...
Beiträge von hipfzwirgel
-
-
guten Morgen Water,
zunächst danke für deine Idee.
Ich habe mir die Hilfe angesehen und den Errorhandler wie im Spoiler eingesetzt.Spoiler anzeigen
#include <Array.au3>
#include <ADO.au3>
#include <Access.au3>
#include <MsgBoxConstants.au3>
Global $sTableName = "Empfänger"
Global $sDatabaseName = @ScriptDir & "\TestHW.accdb"
Global $sVar = "SPF2Q31YZ"
Global $sEmployee = 559
Global $sPlatz = "Platz, Depp"
Global $sVorname = "Idiot"
Global $sNachname = "Voll"
Global $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")
If Not FileExists($sDatabaseName) Then
MsgBox(0, "Alert Missing Db", '! Error : DatabaseName = ' & $sDatabaseName & ' nicht gefunden' & @CRLF)
Exit
EndIf
Global $oConnection = ObjCreate("ADODB.Connection")
$oConnection.Open("Driver=Microsoft Access Driver (*.mdb, *.accdb); DBQ=" & $sDatabaseName)
Global $oRecordSet = ObjCreate("ADODB.RecordSet")
;Global $sQuery = "Select Seriennummer, Standort, Leihgerät From " & $sTableName & " WHERE Seriennummer = " & "'" & $sVar & "'"
;Global $sQuery = "Update " & $sTableName & " SET Leihgerät = True, Ausleihdatum = '" & _Now() & "', [Kunden-Nr] = '" & $sEmployee & "', Standort = '" & $sPlatz & "' " & "WHERE Seriennummer = " & "'" & $sVar & "'"
Global $sQuery = "INSERT INTO " & $sTableName & " (`Nachname`,`Vorname`) " & "VALUES ('" & $sNachname & "'," & "'" & $sVorname & "')"
$oConnection.Execute($sQuery)
Sleep(10000)
$oRecordSet.Close()
$oConnection.Close()
Func _ErrFunc($oError)
; Macht irgendwas hier.
ConsoleWrite(@ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _
@TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
@TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
@TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _
@TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _
@TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
@TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
@TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
@TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
@TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)
EndFunc ;==>_ErrFunc
Aber anstatt mir den o. g. Fehler zu interpretieren, kommt ein Parsing-Fehler die Error-Func betreffend...Ich bin mir sicher das ich da was falsch gemacht habe, nur was?
mir ist auch nicht klar wieso die Anweisung $oConnection.Open funktioniert nur die .Close nicht... -
Hallo Gemeinde,
Ich setze einen Insert Into-Befehl an eine MS-Access-Db ab. Dieser Funktioniert auch und macht die Eintragung.
Hat jemand eine Idee warum die Befehleden im Anhang dargestellten Fehler auswerfen?
Spoiler anzeigen
#include <Array.au3>
#include <ADO.au3>
#include <Access.au3>
Global $sTableName = "Empfänger"
Global $sDatabaseName = @ScriptDir & "\TestHW.accdb"
Global $sVorname = "Idiot"
Global $sNachname = "Voll"
If Not FileExists($sDatabaseName) Then
MsgBox(0, "Alert Missing Db", '! Error : DatabaseName = ' & $sDatabaseName & ' nicht gefunden' & @CRLF)
Exit
EndIf
Global $oConnection = ObjCreate("ADODB.Connection")
$oConnection.Open("Driver=Microsoft Access Driver (*.mdb, *.accdb); DBQ=" & $sDatabaseName)
Global $oRecordSet = ObjCreate("ADODB.RecordSet")
;Global $sQuery = "Select Seriennummer, Standort, Leihgerät From " & $sTableName & " WHERE Seriennummer = " & "'" & $sVar & "'"
;Global $sQuery = "Update " & $sTableName & " SET Leihgerät = True, Ausleihdatum = '" & _Now() & "', [Kunden-Nr] = '" & $sEmployee & "', Standort = '" & $sPlatz & "' " & "WHERE Seriennummer = " & "'" & $sVar & "'"
Global $sQuery = "INSERT INTO " & $sTableName & " (`Nachname`,`Vorname`) " & "VALUES ('" & $sNachname & "'," & "'" & $sVorname & "')"
$oConnection.Execute($sQuery)
$oRecordSet.Close()
$oConnection.Close()
-
Nachtrag für alle Interessierten: Die Callbackfunktion im Programm zum Einlesen via RFID-Scanner verhindert warum auch immer das Markieren!
-
Hallo Ahnungslos,
ich hatte gestern noch den Code bereits umgestellt und wie du vorgeschlagen hattest benutze ich für den Hinweistext nun ein Label. Ist nicht schön aber funzt.
Vielen lieben dank für deine Ideen. Ich betrachte somit den Thread erst mal als erledigt.
p.s. die beiden Variablen sind richtig. -
also mit cuebanner funzt das ebenso wenig. Außerdem handelt es sich bei meinem Control um ein Edit und nicht um ein Inputfeld. bin mir also nicht sicher
ob der vorschlag da dazu passt.
Ich frage mal anders: Was kann das markieren des Textes verhindern? -
Hallo Gemeinde,
ich möchte am Ende einer Funktion einen Hinweistext an ein EditCtrl übergeben und diesen danach markeiren, da das Edit als Inputfeld dienen soll um einen QR zu scannen.CodeGUICtrlSetState($idCode, $GUI_Enable) GUICtrlSetData($idCode, "Now scan your HW and klick the Button 'Booking'") GUICtrlSetFont($idCode, 16, 800, 0, "Bosch Office Sans") GUICtrlSetState($idCode, $GUI_FOCUS) $sMSG = GUICtrlSendMsg($idCode, $EM_SETSEL, $start_char, $end_char) ToolTip($sMSG) ;_GUICtrlEdit_SetSel($idCode, 0, -1) EndFunc ;==>ADLogin
Das Edit muss im Vorfeld der Funktion disabled sein, da sonst ein vorher auszulesender String dort hineingeschrieben werden würde. Deshalb der Enable-Befehl.
Weder der GuiCtrlSendMsg-Befehl markiert den Text noch _GuiCtrlEdit_SetSel. Lasse ich den Codeschnipsel an einer anderen Stelle im Programm laufen, würde der Text markiert werden.
Hat jemand eine Idee warum der Text zwar in das Edit geschrieben wird, es dann aber nicht markiert wird oderweiss jemand eine andere Möglichkeit wie ich den Hinweistext überschrieben bekomme?Func ADLogin()
Func ADLogin()
#Region----------------------------------------------------------------------------------------
Die Func Macht einen AD-Login, überprüft verschiedene "AD-Werte"
#EndRegion---------------------------------------------------------------------------------Sleep(2000)
Send("{Backspace}")
$sUserId = InputBox("Login", "AD-Loginname" & @CRLF & @CRLF & "e.g. de\xy123z", " ", " M")
If @error = 1 Then ; Wenn user den Abbrechen Button drückt...
ShellExecute(@ScriptName)
Exit
EndIf
$aTEMP = StringSplit($sUserId, "\")
$sName = $aTEMP[2]
While 1
If $aTEMP[0] <> 2 Then
$sMSG1 = MsgBox(17, "Active Directory Functions", "Wrong format for NETBIOS name." & @CRLF & "Has to be ""Domain\Userid""!" & @CRLF & @CRLF & "e.g. ""de\xy0815vw""")
If $sMSG1 = 7 Then
ShellExecute(@ScriptName) ; Programm wird neu gestartet damit die Leseroutine wieder aktiv ist.
Exit
EndIf
$sUserId = InputBox("Login", "AD-Loginname" & @CRLF & @CRLF & "e.g. de\xy123z", "", " M")
If @error = 1 Then ; Wenn user den Abbrechen Button drückt...
ShellExecute(@ScriptName)
Exit
EndIf
$aTEMP = StringSplit($sUserId, "\")
$sName = $aTEMP[2]
ExitLoop
Else
ExitLoop
EndIf
WEnd
While 1 ; Schleife zur Wiederholung der PWD-Abfrage
$sPwd1 = InputBox("Login", "AD-Password", "", "*", "", " M")
If @error = 1 Then
ShellExecute(@ScriptName)
Exit
EndIf
If $sPwd1 = "" Then
$sVar = MsgBox(17, "Active Directory Functions", "Password is missing!")
If $sVar = 7 Then
ShellExecute(@ScriptName)
Exit
EndIf
Else
$sPwd2 = InputBox("Verifying Password", " please verify AD-Password", "", "*", "", " M")
If @error = 1 Then
ShellExecute(@ScriptName)
Exit
EndIf
If $sPwd2 = "" Then
$sVar = MsgBox(17, "Active Directory Functions", "Password is missing!")
If $sVar = 7 Then
ShellExecute(@ScriptName)
Exit
EndIf
Else
If $sPwd1 <> $sPwd2 Then
$sVar = MsgBox(17, "Login-Alert!!!", "Passwords doesn't match")
$sPwd1 = ""
$sPwd2 = ""
If $sVar = 7 Then
ShellExecute(@ScriptName)
Exit
EndIf
Else
ExitLoop
EndIf
EndIf
EndIf
WEnd
_AD_Open()
Global $sFQDN = _AD_SamAccountNameToFQDN($sName) ; Umsetzen des AnmeldeNamens in den FQDN
_AD_Close()
If _AD_Open($sUserId, $sPwd1) Then
$sDispName = _AD_FQDNToDisplayname($sFQDN)
$aTEMP2 = StringSplit($sDispName, "(")
;_ArrayDisplay($aTEMP2)
$sDispName = StringStripWS($aTEMP2[1], 2)
$sDispName = StringReplace($sDispName, " ", ", ", 2) ; das Leerzeichen im String wird durch ein komma ersetzt: z.b. Mustermann Hans wird Mustermann, Hans
GUICtrlSetData($sDisplayname, $sDispName)
GUICtrlSetFont($sDisplayname, 18, 600, 0, "Bosch Office Sans")
$aTEMP3 = StringSplit($sDispName, " ") ;_Arraydisplay($aTEMP3) Aufspaltung des Displaynamens in index 1 = Nachname und Index 2 = Vorname
$sPwd1 = ""
$sPwd2 = ""
ElseIf @error <= 8 Then
MsgBox(16, "Active Directory Functions", "The logon was not succcessful!" & @CRLF & @CRLF & "@error: " & @error & ", @extended: " & @extended)
Else
MsgBox(16, "Active Directory Functions", "The logon was not succcessful!" & @CRLF & @CRLF & "@error: " & @error & ", @extended: " & @extended & _
@CRLF & @CRLF & "Extended error information will be displayed")
Global $aError = _AD_GetLastADSIError()
;_ArrayDisplay($aError)
EndIf
If _AD_IsObjectDisabled($sName) Then
GUICtrlSetData($sDisplayname, "User account '" & $sName & "' is disabled!!!" & @CRLF & "scanning HW not possible")
Return
EndIf
GUICtrlSetState($idCode, $GUI_Enable)
GUICtrlSetData($idCode, "Now scan your HW and klick the Button 'Booking'")
GUICtrlSetFont($idCode, 16, 800, 0, "Bosch Office Sans")
GUICtrlSetState($idCode, $GUI_FOCUS)
$sMSG = GUICtrlSendMsg($idCode, $EM_SETSEL, $start_char, $end_char) ;die Variablen start und end sind global
ToolTip($sMSG) gibt meistens o zurück. manchmal auch 1
;_GUICtrlEdit_SetSel($idCode, 0, -1)
EndFunc ;==>ADLogin
-
Hallo Moombas,
zunächst eine schöne Woche. Die Null kommt tatsächlich aus der Callback-Funktion.
Es wird immer das letzte Zeichen des eingelesenen Strings in das Inputfeld geschrieben. Das ist es was ich nicht verstehe.
Ich vermute es gibt irgend einen "Puffer" in dem das jeweils letzte Zeichen noch gespeichert ist. Da es sich dabei um einen Schreibvorgang handelt,
wird es wohl nicht einfach eine Variable sein, sondern so etwas wie eine weitere (letzte) ausgabe an den STDOUT-Stream oder so... -
Hallo funkey, hallo Moombas
sorry das ich mich nicht früher gemeldet hatte.hier zunächst der Code von OnAutoitexit:
CodeFunc OnAutoItExit() _WinAPI_UnhookWindowsHookEx($g_hHook) DllCallbackFree($g_hStub_KeyProc) EndFunc ;==>OnAutoItExit
@ funkey: die Variable $g_hStub_KeyProc muss ich auf Null setzen, damit die 2. Zeile (Dll...) entsprechend ausgeführt wird (die Callbackfunktion hält die Variable nämlich immer auf 1). Auf 0 wird die Lesefunktion gestoppt.
@ Moombas: Das auf das Einlesen folgende Inputfeld nimmt die AD-UserKennung auf, dieses kann ich also nicht begrenzen. Durch die func Stringlength werden nur 6 Zeichen angenommen. Soweit passt das alles.
Die 6-stellige Ausweisnummer steht auch in der $sAusweisNr zur Verfügung. das passt auch. Das einzige was nicht passt, ist, dass wenn das Inputfeld geöffnet wird, dort immer eine 0 rein geschrieben wird. Das ist aber für einen AD-Login äußerst unpassend. Im Moment helfe ich mir mit einem vor dem Aufruf des Inputfeldes gesendeten {Backspace}. Es wäre aber schön zu wissen woher die Null kommt und wie ich das ohne {Backspace} verhindert bekomme... -
Hallo Gemeinde,
ich drehe gerade total durch und raste aus = Ich brauche Hilfe:
Ich muss ein Programm entwickeln, zur Erfassung von HW-Entnahmen aus dem Labor. Damit der Entleiher identifiziert werden kann, lese ich mittels RFID-Leser dessen Betriebsausweis aus.das mache ich mit folgendem Konstrukt(Stark gekürzt damit das keiner missbrauchen kann )
Code
Alles anzeigenGlobal $g_sBuffer = "" Global $g_hStub_KeyProc = DllCallbackRegister('_KeyProc', 'long', 'int;wparam;lparam') Global $hmod = _WinAPI_GetModuleHandle(0) Global $g_hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($g_hStub_KeyProc), $hmod) ... Func _KeyProc($nCode, $wParam, $lParam) Local $tKEYHOOKS $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam) Tooltip($nCode) If $nCode < 0 Then Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam) EndIf If $wParam = $WM_KEYDOWN Then EvaluateKey(DllStructGetData($tKEYHOOKS, "vkCode")) EndIf Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam) EndFunc ;==>_KeyProc Func EvaluateKey($iKeycode) If (($iKeycode > 64) And ($iKeycode < 91)) _ ; a - z Or (($iKeycode > 96) And ($iKeycode < 123)) _ ; A - Z Or (($iKeycode > 47) And ($iKeycode < 58)) Then ; 0 - 9 $g_sBuffer &= Chr($iKeycode) Switch $g_sBuffer Case $g_sBuffer <> "" $sAusweisNr &= $g_sBuffer $g_sBuffer = '' Global $iLength = StringLen($sAusweisNr) If $iLength = 6 Then GuiCtrlSetData($idCode, $sAusweisNr) $g_hStub_KeyProc = 0 OnAutoitExit() ADLogin() Endif EndSwitch Else $g_sBuffer = "" EndIf EndFunc ;==>EvaluateKey
Der von mir auszulesende String ist 6 Zeichen lang(nur Zahlen). Wenn das 6. Zeichen erfasst ist, breche ich den Lesevorgang ab(aufruf Func OnAutoitExit) und rufe dann die nächste func(AdLogin) auf.
Das Problem: Die "Leseroutine" schreibt mir die letzte Ziffer immer in das in der Func ADLogin sich öffnende Input-Feld.
WIE KANN ICH DAS VERHINDERN -
-
Hallo Oscar, vielen lieben Dank für deine Antworten. Sowie ich dazu komme teste ich das und gebe Bescheid...
-
Hallo Gemeinde,
wenn ich in Programme Grafikdateien implementiere, z.B. ein Firmenlogo, dann erscheint das Bild immer "verpixelt", bzw. verzerrt. Gibt es eine Möglichkeit Bilder verzerrfrei und unverpixelt in das GUI zu implementieren, bzw. das Bild entsprechend der Displayauflösung/Fenstergröße zu skalieren, damit es immer scharfkantig und richtig dargestellt wird? Selbst das Windowslogo aus derHilfe von GUICtrlCreatePic wird nicht richtig dargestellt, wenn sich die Auflösung ändert...
Code aus der Hilfe:
CodeGUISetBkColor(0xE0FFFF) Local $idPic = GUICtrlCreatePic("..\GUI\mslogo.jpg", 50, 50, 200, 50) ; Originalgröße: 255, 40
Wenn ich die Originalgröße der GuiCtrlCreatePic-func mitgebe ist das Bild scharf. Die verwendete Größe indes lässt das Bild unscharf erscheinen.
Da man ja nie weiß, was der Anwender für eine Auflösung fährt, ist das Implementieren von mehreren Bildern entsprechender Größe ja nicht wirklich elegant... -
Also erstmal: vielen lieben Dank für die Antworten.
@ Bugfix:
die Message-Box hat ohnehin schon einen Timeout. Es ging mir nur generell darum, das der User wenn er das Proggi startet
ja sowieso die Maus in der Hand hat. Da ist es ja nur folgerichtig, das er einfach klicken kann und das Proggi macht weiter.
@ Musashi:
ja die UDF benutze ich bereits. Zukünftig werde ich eben vermehrt damit die Msgbox-en erstellen. Damit funzt der Fokus und der Mauszeiger springt auf den Button...
Fall somit erledigt... -
Hallo Gemeinde,
bei einer MSGBOX mit nur einem Ok-Button(z.B. Flag 4096) ist dieser der Standard-Button. Soweit so gut. Es nervt mich aber kollossal, dass der Mauszeiger das zu ignorieren scheint, denn er
springt nicht auf den Button. Hat die MSGBOX mehrere Buttons und ich definiere einen davon als Standard springt der Mauszeiger darauf. Kann ich dieses Verhalten für den ersten Fall i-wie
"erzwingen"? Es geht nur um eine INFO-MSGBOX die am Programmanfang direkt aufgeht. Zu diesem Zeitpunkt hat der User die Maus wegen des Proggi-Starts sowieso noch in der Hand und bräuchte nur klicken, damit das Proggi weiter macht... -
Problem gelöst:
Anstatt eines Switches in der While habe ich einen Select genommen und prüfe ob die Tastatureingabe vorgenommen wurde indem ich die buffer-Variable prüfe.
Vorher setze ich dessen Wert auf die $sAusweis-Variable. Mann kann auch die Buffer-Variable direkt prüfen, aber ich benötige den String noch an anderer Stelle deshalb das Umsetzen.Code
Alles anzeigenWhile 1 $nMsg = GUIGetMsg() Select Case $nMsg = $GUI_EVENT_CLOSE _WinAPI_UnhookWindowsHookEx($hKeyHook) DllCallbackFree($hKeyProc) GUIDelete($hGui) Exitloop Case $sAusweisNr <> "" _WinAPI_UnhookWindowsHookEx($hKeyHook) DllCallbackFree($hKeyProc) GUIDelete($hGui) ExitLoop EndSelect WEnd
-
Hallo Oscar,
Vor dem Aufruf von _Keyproc wird ja die Gui geladen. Wie kann ich es steuern, dass wenn das Einlesen in _Keyproc erfolgt ist, die Gui geschlossen wird und das Proggi weitermacht.Code
Alles anzeigenGlobal $hKeyProc = DllCallbackRegister('_KeyProc', 'long', 'int;wparam;lparam') Global $hmod = _WinAPI_GetModuleHandle(0) Global $hKeyHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hKeyProc), $hmod) Global $sAusweisNr Global $sUserId Global $sPwd1 Global $sPwd2 Global $sName ; LoGonName, z.B. XXXXXXX Global $sDispName ; Username, z.B. Mustermann, Horschd Global $hGui = GUICreate('Barcodescanner', 400, 100) Global $idCode = GUICtrlCreateLabel('', 10, 30, 380, 30, $SS_CENTER) GUICtrlSetData($idCode, "Please lay your Company-ID-Card on the Reader....") GUICtrlSetFont(-1, 10, 400, 0, 'Courier New') GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE GuiDelete($hGui) ExitLoop Case _WinAPI_UnhookWindowsHookEx($hKeyHook) DllCallbackFree($hKeyProc) GuiDelete($hGui) ExitLoop EndSwitch WEnd
ich habe es zunächst mit der While versucht, aber ich finde keinen Wert für den 2. Case
-
-
Hallo Oscar,
wie schaffe ich es, dass ich mit deiner Funktion die Ausweisnummer einlese und dann der Hook beendet wird, sodass ich weitere Eingaben(per inputbox z.B.)
verarbeiten kann?
Bei mir bleibt der Hook aktiv und alle nachfolgenden Eingaben werden ebenfalls erfasst.
ich habe die Zeilen_WinAPI_UnhookWindowsHookEx($hKeyHook)
DllCallbackFree($hKeyProc
ans Ende der Funktion _KeyProc gesetzt = Ohne Erfolg... Ebenso das Aufrufen der Funktion OnAutoItExit in _KeyProc -
Hallo Gemeinde,
zunächst vielen Lieben Dank an alle Antworter
Der Zugriff funktioniert einwandfrei mit @waters UDF und den Funktionen
Thema erledigt...