Schleifenkonstruktion haut nicht hin

  • Hallo
    ich habe folgenden Scriptcode, der mir eine Anmeldung an die AS400 sendet. Falls ich Falscheingaben mache bekomme ich auch dementsprechende Rückgabewerte.

    Ich möchte nun bei Falscheingabe des user oder Passwortes, das mir das Fenster zur Usereingabe und Passworteingabe nochmal gezeigt wird und ich die Eingaben erneut tätigen kann.

    Bei meinem Code kommt zwar das fenster aber er macht im Prinzip einfach ein 2 tes Formualr auf. Liegt an der Funktion Error() wahrscheinlich.

    Kann mir jemand helfen das zu lösen ?

    Wäre super.

    Spoiler anzeigen
    [autoit]


    #include <string.au3>
    #include <GUIConstants.au3>

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

    Dim $useridibm
    Dim $userid
    Dim $useridsignonmode
    Dim $useridsoftm
    Dim $password
    Dim $userpassver
    Dim $userpassent
    Dim $userpassreg
    Dim $NameAS400
    Dim $okbutton
    Dim $objConnection
    Dim $objError
    Dim $nMsg
    Dim $err
    Dim $temp

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

    Run("regedit /s D:\Start\Reg\Alkor_Suite_T0.reg")

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

    $NameAS400 = RegRead("HKEY_CURRENT_USER\Software\SoftM\Global\Parametersteuerung", "System")
    $useridibm = RegRead("HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication", "User ID")
    $useridsignonmode = RegRead("HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication", "Signon Mode")
    $useridsoftm = RegRead("HKEY_CURRENT_USER\Software\SoftM\Global\Environment", "StandardUser")
    $userpassreg = RegRead ( "HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"User PW")
    RegWrite ( "HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"Signon Mode", "REG_DWORD", 1)

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

    $objConnection = ObjCreate("ADODB.Connection")
    $objError = ObjEvent("AutoIt.Error","Error")

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

    uidpwd()

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

    Run("D:\Program Files\SoftM AG\SoftM AG Suite\smumenu.exe")

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

    Func uidpwd()
    If ($useridsoftm = "" and $useridibm = "") or ($useridsoftm = "" and $useridibm <> "") Then
    GUICreate("Anmeldung AS/400", 200, 200)
    GUICtrlCreateLabel("AS/400 UserName:", 42, 35, 131, 27)
    $userid = GUICtrlCreateInput("", 42, 50, 121, 21)
    GUICtrlCreateLabel("AS/400 Passwort:", 42, 85, 111, 17)
    $password = GUICtrlCreateInput("", 42, 100, 121, 21)
    $okbutton = GUICtrlCreateButton("OK", 70, 145, 60)


    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $okbutton
    $userid = GUICtrlRead($userid)
    $password = GUICtrlRead($password)
    Logon()
    ;msgbox(4096,"Rückgabe Logon","Rückgabe Logon: " & $temp)
    OKUserPasswort($NameAS400, $userid, $password)
    ExeCWBLogon()
    GUISetState(@SW_HIDE)
    ExitLoop
    EndSwitch
    WEnd
    Else
    if ($userpassreg <> "" And $useridibm<>"") or ($useridsoftm <> "") Then
    if $useridsoftm <> "" Then
    RegWrite ( "HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"User ID", "REG_SZ", $useridsoftm)
    EndIf
    $userpassent = _StringEncrypt ( 0, $userpassreg, "19passwort19encrypten74" , 2)
    $password = $userpassent
    ;msgbox(4096,"Titel","Password: " & $password)
    $userid = $useridsoftm
    ;msgbox(4096,"Titel","Userid: " & $userid)
    Logon()
    ExeCWBLogon()
    EndIf
    EndIf

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

    EndFunc

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

    Func Logon()

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

    $objConnection.Provider = "IBMDA400"
    $objConnection.Properties("Data Source") = $NameAS400
    $objConnection.Properties("User ID") = $userid
    $objConnection.Properties("Password") = $password
    $objConnection.open

    EndFunc

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

    Func Error()

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

    Msgbox(0,"Fehler bei Anmeldung iSeries","" & @CRLF & _
    "" & $objError.description & @CRLF )
    if $objError.description <> "" Then
    uidpwd()
    EndIf
    Local $err = $objError.number
    If $err = 0 Then $err = -1
    SetError($err) ; to check for after this function returns

    Endfunc

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

    Func OKUserPasswort($NameAS400, $userid, $password)
    ShellExecute("C:\Program Files\IBM\Client Access\cwblogon.exe", " " & $NameAS400 & " /u " & $userid & " /p " & $password,@SW_HIDE)
    RegWrite ( "HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"User ID", "REG_SZ", $userid)
    $userpassver = _StringEncrypt(1, $password, "19passwort19encrypten74", 2)
    RegWrite ( "HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"User PW", "REG_SZ", $userpassver)
    EndFunc

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

    Func ExeCWBLogon()
    ShellExecute("C:\Program Files\IBM\Client Access\cwblogon", " " & " /c")
    ShellExecute("C:\Program Files\IBM\Client Access\cwblogon", " " & $NameAS400 & " /u " & $userid & " /p " & $password)
    msgbox(4096,"Titel","Userid + PW + AS400: " & $userid & $password & $NameAS400)
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von jmewald (22. März 2007 um 23:26)

  • hi,

    benutze doch mal die funktion:

    Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info

    "Wenn die Option freigegeben wurde, wird die aktuelle Skriptzeile im Tip des Icons in der Statusleiste angezeigt um bei der Fehlersuche zu helfen.
    0 = Keine Programmfehler Information (Vorgabe).
    1 = Programmfehler Information wird angezeigt."

    vielleicht findest das damit schon raus ?

    Edit: bei verdacht dann einfach mal "haltepunkte" sprich msgboxen einbauen.

    gruss exberliner

    Einmal editiert, zuletzt von ExBerliner (23. März 2007 um 00:45)

  • Hallo
    danke für deinen Post.
    Im Prinzip weiß ich wo der Fehler liegt.

    Ich habe z.B. folgendes versucht:
    uippwd() Funtkion mit einer Do .. until objerror.description =""
    Schleife aufgerufen.
    Bei der Error() Funktion objerror.description abgefragt.

    Der Wert der objerror.description wird bei einem Fehler gefüllt, somit taucht auch das Formular zur erneuten user Passworteingabe wieder auf, allerdings wenn ich beim 2 ten Mal die richtigen Anmeldedaten übergebe läuft er ja nicht mehr in die Error() Funktion und mein Wert von objerror.description bleibt immer gefüllt.

    ich hänge somit in einer Endlosschleife.

    Momentan habe ich keinen Plan wie ich das machen soll ?

    Hat irgendjemand eine Idee ?

    Please, please

  • Hallo
    mein programm tut nun wie es soll (sogar mit Schleifen).
    Da ich aber kein Spezialist bin in Autoit wäre es klasse wenn ihr mal über den Code ein Blick werfen könntet.

    Verbesserungsvorschläge bitte gerne posten. Der Code ist mit Sicherheit nicht optimal.

    Danke

    P.S. Die Messageboxen dienten nur der Kontrolle.

    Spoiler anzeigen
    [autoit]


    #include <string.au3>
    #include <GUIConstants.au3>

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

    Dim $useridibm
    Dim $userid
    Dim $useridsignonmode
    Dim $useridsoftm
    Dim $password
    Dim $userpassver
    Dim $userpassent
    Dim $userpassreg
    Dim $NameAS400
    Dim $okbutton
    Dim $objConnection
    Dim $objError
    Dim $nMsg
    Dim $err
    Dim $pwencrypt

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

    ;Eingabe Verschlüsselungspasswort für Anmeldung an AS400 (Wert steht in Registry)
    $pwencrypt = "19password19encrypten74"

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

    Run("regedit /s D:\SoftM_Start\Reg\Alkor_Suite_T0.reg")

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

    $NameAS400 = RegRead("HKEY_CURRENT_USER\Software\SoftM\Global\Parametersteuerung", "System")
    $useridibm = RegRead("HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication", "User ID")
    $useridsignonmode = RegRead("HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication", "Signon Mode")
    $useridsoftm = RegRead("HKEY_CURRENT_USER\Software\SoftM\Global\Environment", "StandardUser")
    $userpassreg = RegRead ( "HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"User PW")
    RegWrite("HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"Signon Mode", "REG_DWORD", 1)

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

    $objConnection = ObjCreate("ADODB.Connection")
    $objError = ObjEvent("AutoIt.Error","Error")

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

    uidpwd()

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

    Run("D:\Program Files\SoftM AG\SoftM AG Suite\smumenu.exe")

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

    Func uidpwd()
    do
    If ($useridsoftm = "" and $useridibm = "") or ($useridsoftm = "" and $useridibm <> "") Then
    GUICreate("Anmeldung AS/400", 200, 200)
    GUICtrlCreateLabel("AS/400 UserName:", 42, 35, 131, 27)
    $userid = GUICtrlCreateInput("", 42, 50, 121, 21)
    GUICtrlCreateLabel("AS/400 Passwort:", 42, 85, 111, 17)
    ;$password = GUICtrlCreateInput("", 42, 100, 121, 21)
    $password = GUICtrlCreateInput("", 42, 100, 121, 21, BitOR($ES_PASSWORD,$ES_AUTOHSCROLL))
    $okbutton = GUICtrlCreateButton("OK", 70, 145, 60)


    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $okbutton
    $userid = GUICtrlRead($userid)
    $password = GUICtrlRead($password)
    Logon()
    if $err = 1 Then
    OKUserPasswort($NameAS400, $userid, $password)
    ExeCWBLogon()
    GUISetState(@SW_HIDE)
    ExitLoop
    Else
    GUISetState(@SW_HIDE)
    ExitLoop
    uidpwd()
    EndIf
    EndSwitch
    WEnd
    Else
    if ($userpassreg <> "" And $useridibm<>"") or ($useridsoftm <> "") Then
    if $useridsoftm <> "" Then
    RegWrite ( "HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"User ID", "REG_SZ", $useridsoftm)
    EndIf
    $userpassent = _StringEncrypt ( 0, $userpassreg, $pwencrypt , 2)
    $password = $userpassent
    $userid = $useridsoftm
    msgbox(4096,"Titel","Logon in uidpwd wenn User schon gefüllt: " & $err)
    Logon()
    if $err = 1 Then
    ExeCWBLogon()
    Else
    Do
    GUICreate("Anmeldung AS/400", 200, 200)
    GUICtrlCreateLabel("AS/400 UserName:", 42, 35, 131, 27)
    $userid = GUICtrlCreateInput("", 42, 50, 121, 21)
    GUICtrlCreateLabel("AS/400 Passwort:", 42, 85, 111, 17)
    $password = GUICtrlCreateInput("", 42, 100, 121, 21, BitOR($ES_PASSWORD,$ES_AUTOHSCROLL))
    $okbutton = GUICtrlCreateButton("OK", 70, 145, 60)

    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $okbutton
    $userid = GUICtrlRead($userid)
    $password = GUICtrlRead($password)
    Logon()
    if $err = 1 Then
    OKUserPasswort($NameAS400, $userid, $password)
    ExeCWBLogon()
    GUISetState(@SW_HIDE)
    ExitLoop
    Else
    GUISetState(@SW_HIDE)
    ExitLoop
    EndIf
    EndSwitch
    WEnd
    msgbox(4096,"Titel","Logon in uidpwd wenn User schon gefüllt 2: " & $err)
    until $err = 1
    EndIf
    EndIf
    EndIf
    until $err = 1
    EndFunc

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

    Func Logon()

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

    $err = 1
    msgbox(4096,"logon","logon Funktion 1 Teil: " & $err)
    $objConnection.Provider = "IBMDA400"
    $objConnection.Properties("Data Source") = $NameAS400
    $objConnection.Properties("User ID") = $userid
    $objConnection.Properties("Password") = $password
    $objConnection.open

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

    msgbox(4096,"logon","logon Funktion 2 Teil: " & $err)

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

    EndFunc

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

    Func Error()

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

    Msgbox(0,"Fehler bei Anmeldung iSeries","" & @CRLF & _
    "" & $objError.description & @CRLF )
    $err = 1
    $err = $err + 1
    msgbox(4096,"error","error Funktion: " & $err)

    Endfunc

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

    Func OKUserPasswort($NameAS400, $userid, $password)
    ShellExecute("C:\Program Files\IBM\Client Access\cwblogon.exe", " " & $NameAS400 & " /u " & $userid & " /p " & $password,@SW_HIDE)
    RegWrite ( "HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"User ID", "REG_SZ", $userid)
    $userpassver = _StringEncrypt(1, $password, $pwencrypt, 2)
    RegWrite ( "HKEY_CURRENT_USER\Software\IBM\Client Access Express\CurrentVersion\Environments\My Connections\"& $NameAS400 &"\Communication" ,"User PW", "REG_SZ", $userpassver)
    EndFunc

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

    Func ExeCWBLogon()
    ShellExecute("C:\Program Files\IBM\Client Access\cwblogon", " " & " /c")
    ShellExecute("C:\Program Files\IBM\Client Access\cwblogon", " " & $NameAS400 & " /u " & $userid & " /p " & $password)
    msgbox(4096,"Titel","Userid + PW + AS400: " & $userid & $password & $NameAS400)
    EndFunc

    [/autoit]

    Danke

    3 Mal editiert, zuletzt von jmewald (23. März 2007 um 16:25)