Jump to content
Sign in to follow this  
Chromwell

Problem with newest Autoit 3.3.8.1 - COM / SAP

Recommended Posts

With older Autoit Versions my script was working fine and i don´t know how i should change my script to work again...

Basically my problem section does nothing more then selecting some menus in SAP then pressing 2 buttons in following popup-windows and the 3rd popup is a file save dialog...

My script always stops executing after the 2nd button press (it is pressed, but it won´t get any further....)

Connection to SAP is initiated with _SAPSessAttach("") from the SAP UDF but the commands are sent directly via the COM interface to SAP.

_SAPSessAttach("")
ConsoleWrite("Setze $AnalyseBlatt ..." & @CRLF)
$AnalyseBlatt = @ScriptDir & "\test.xls"
ConsoleWrite("Lösche $AnalyseBlatt ..." & @CRLF)
If FileExists($AnalyseBlatt) Then
  FileDelete($AnalyseBlatt)
EndIf
$SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell" ).expandNode("1000")
$SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell" ).selectItem("4000", "COL01")
$SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell" ).ensureVisibleHorizontalItem("4000", "COL01")
$SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell" ).topNode = ("0001")
$SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell" ).doubleClickItem("4000", "COL01")
ConsoleWrite("Btn0 Press..." & @CRLF)
$SAP_Session.findById("wnd[1]/tbar[0]/btn[0]").press
ConsoleWrite("Btn5 Press..." & @CRLF)
$SAP_Session.findById("wnd[1]/tbar[0]/btn[5]").press
;--------- SCRIPT STOPS HERE, without any error, it just hangs....
ConsoleWrite("Warte auf Speichern unter Dialog..." & @CRLF)
WinWait("Speichern unter")
ConsoleWrite("Setze Edit auf Analyseblatt..." & @CRLF)
ControlSetText("Speichern unter", "", "[CLASS:Edit; INSTANCE:1]", $AnalyseBlatt)
Sleep(2000)
ControlClick("Speichern unter", "", "[CLASS:Button; INSTANCE:2]")

Share this post


Link to post
Share on other sites

The script breaking changes section here describes that methods require paranthesis.

So maybe you have to change

$SAP_Session.findById("wnd[1]/tbar[0]/btn[0]").press
to
$SAP_Session.findById("wnd[1]/tbar[0]/btn[0]").press()

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2019-10-24 - Version 1.4.14.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2019-11-30 - Version 1.4.0.0) - Download - General Help & Support - Example Scripts - Wiki
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
Task Scheduler (NEW 2019-12-03 - Version 1.5.1.0) - Download - General Help & Support - Wiki

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

Even with this change the script halts after the btn5 press without any error ... when i cancel the file dialog that appears after the script pressed the button, the script goes on.

The same script runs smooth with autoit-v3.3.6.1. :)

Share this post


Link to post
Share on other sites

As you are working with objects to need to implement a COM error handler. Please check function ObjEvent. There you'll find an example.

After btn5 is pressed I would at least check the error code returned in @error and @extended.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2019-10-24 - Version 1.4.14.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2019-11-30 - Version 1.4.0.0) - Download - General Help & Support - Example Scripts - Wiki
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
Task Scheduler (NEW 2019-12-03 - Version 1.5.1.0) - Download - General Help & Support - Wiki

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

There´s no COM error, that´s the problem... the script just hangs after btn5 is pressed without an error... :)

I can´t even exit the script from the task-tray when it hangs after btn5 press ... it exits when i cancel the dialog in SAP that comes after it pressed the btn5...

#include <../include/SAP.au3>
#include <IE.au3>
_IEErrorHandlerRegister ("MyErrFunc")

_test()
func _test()
_SAPSessAttach("")
ConsoleWrite("Setze $AnalyseBlatt ..." & @CRLF)
$AnalyseBlatt = @ScriptDir & "test.xls"
ConsoleWrite("Lösche $AnalyseBlatt ..." & @CRLF)

If FileExists($AnalyseBlatt) Then
FileDelete($AnalyseBlatt)
EndIf

$SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell" ).expandNode("1000")
$SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell" ).selectItem("4000", "COL01")
$SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell" ).ensureVisibleHorizontalItem("4000", "COL01")
$SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell" ).topNode = ("0001")
$SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell" ).doubleClickItem("4000", "COL01")

ConsoleWrite("Btn0 Press..." & @CRLF)
$SAP_Session.findById("wnd[1]/tbar[0]/btn[0]").press()
ConsoleWrite("Btn5 Press..." & @CRLF)
$SAP_Session.findById("wnd[1]/tbar[0]/btn[5]").press()

;--------- SCRIPT STOPS HERE, without any error, it just hangs....

ConsoleWrite("Warte auf Speichern unter Dialog..." & @CRLF)
WinWait("Speichern unter")
ConsoleWrite("Setze Edit auf Analyseblatt..." & @CRLF)
ControlSetText("Speichern unter", "", "[CLASS:Edit; INSTANCE:1]", $AnalyseBlatt)
Sleep(2000)
ControlClick("Speichern unter", "", "[CLASS:Button; INSTANCE:2]")

EndFunc

Func MyErrFunc()
    ; Important: the error object variable MUST be named $oIEErrorHandler
    $ErrorScriptline = $oIEErrorHandler.scriptline
    $ErrorNumber = $oIEErrorHandler.number
    $ErrorNumberHex = Hex($oIEErrorHandler.number, 8)
    $ErrorDescription = StringStripWS($oIEErrorHandler.description, 2)
    $ErrorWinDescription = StringStripWS($oIEErrorHandler.WinDescription, 2)
    $ErrorSource = $oIEErrorHandler.Source
    $ErrorHelpFile = $oIEErrorHandler.HelpFile
    $ErrorHelpContext = $oIEErrorHandler.HelpContext
    $ErrorLastDllError = $oIEErrorHandler.LastDllError
    $ErrorOutput = ""
    $ErrorOutput &= "--> COM Error Encountered in " & @ScriptName & @CR
    $ErrorOutput &= "----> $ErrorScriptline = " & $ErrorScriptline & @CR
    $ErrorOutput &= "----> $ErrorNumberHex = " & $ErrorNumberHex & @CR
    $ErrorOutput &= "----> $ErrorNumber = " & $ErrorNumber & @CR
    $ErrorOutput &= "----> $ErrorWinDescription = " & $ErrorWinDescription & @CR
    $ErrorOutput &= "----> $ErrorDescription = " & $ErrorDescription & @CR
    $ErrorOutput &= "----> $ErrorSource = " & $ErrorSource & @CR
    $ErrorOutput &= "----> $ErrorHelpFile = " & $ErrorHelpFile & @CR
    $ErrorOutput &= "----> $ErrorHelpContext = " & $ErrorHelpContext & @CR
    $ErrorOutput &= "----> $ErrorLastDllError = " & $ErrorLastDllError
    MsgBox(0,"COM Error", $ErrorOutput)
    SetError(1)
    Return
EndFunc  ;==>MyErrFunc
Edited by Chromwell

Share this post


Link to post
Share on other sites

I inserted some more error checking an simplified the COM error handler. Could you please give it a try?

Global $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")

_test()

Func _test()
    _SAPSessAttach("")
    ConsoleWrite("Setze $AnalyseBlatt ..." & @CRLF)
    $AnalyseBlatt = @ScriptDir & "test.xls"
    ConsoleWrite("Lösche $AnalyseBlatt ..." & @CRLF)

    If FileExists($AnalyseBlatt) Then
        FileDelete($AnalyseBlatt)
    EndIf

    $SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell").expandNode("1000")
    ConsoleWrite("Result of 1st findByID...: " & @error & "-" & @extended & @CRLF)
    $SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell").selectItem("4000", "COL01")
    ConsoleWrite("Result of 2nd findByID...: " & @error & "-" & @extended & @CRLF)
    $SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell").ensureVisibleHorizontalItem("4000", "COL01")
    ConsoleWrite("Result of 3rd findByID...: " & @error & "-" & @extended & @CRLF)
    $SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell").topNode = ("0001")
    ConsoleWrite("Result of 4th findByID...: " & @error & "-" & @extended & @CRLF)
    $SAP_Session.findById("wnd[0]/shellcont[0]/shell/shellcont[2]/shell").doubleClickItem("4000", "COL01")
    ConsoleWrite("Result of 5th findByID...: " & @error & "-" & @extended & @CRLF)

    ConsoleWrite("Btn0 Press..." & @CRLF)
    $SAP_Session.findById("wnd[1]/tbar[0]/btn[0]").press()
    ConsoleWrite("Result of Btn0 Press...: " & @error & "-" & @extended & @CRLF)
    ConsoleWrite("Btn5 Press..." & @CRLF)
    $SAP_Session.findById("wnd[1]/tbar[0]/btn[5]").press()
    ConsoleWrite("Result of Btn5 Press...: " & @error & "-" & @extended & @CRLF)

    ;--------- SCRIPT STOPS HERE, without any error, it just hangs....

    ConsoleWrite("Warte auf Speichern unter Dialog..." & @CRLF)
    WinWait("Speichern unter")
    ConsoleWrite("Setze Edit auf Analyseblatt..." & @CRLF)
    ControlSetText("Speichern unter", "", "[CLASS:Edit; INSTANCE:1]", $AnalyseBlatt)
    Sleep(2000)
    ControlClick("Speichern unter", "", "[CLASS:Button; INSTANCE:2]")

EndFunc   ;==>_test

; User's COM error function. Will be called if COM error occurs
Func _ErrFunc($oError)
    ; Do anything here.
    ConsoleWrite("err.number is: " & @TAB & $oError.number & @CRLF & _
            "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
            "err.description is: " & @TAB & $oError.description & @CRLF & _
            "err.source is: " & @TAB & $oError.source & @CRLF & _
            "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
            "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
            "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
            "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
            "err.retcode is: " & @TAB & $oError.retcode & @CRLF & @CRLF)
EndFunc   ;==>_ErrFunc

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2019-10-24 - Version 1.4.14.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2019-11-30 - Version 1.4.0.0) - Download - General Help & Support - Example Scripts - Wiki
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
Task Scheduler (NEW 2019-12-03 - Version 1.5.1.0) - Download - General Help & Support - Wiki

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

Here are the outputs from scite... script hangs on new autoit... :)

Old Autoit:

>Running:(3.3.6.1):C:\Program Files\AutoIt3\autoit3.exe "H:\AutoIT\Projects\CQTS EACDX\crap.au3"  
Setze $AnalyseBlatt ...
Lösche $AnalyseBlatt ...
Result of 1st findByID...: 0-0
Result of 2nd findByID...: 0-0
Result of 3rd findByID...: 0-0
Result of 4th findByID...: 0-0
Result of 5th findByID...: 0-0
Btn0 Press...
Result of Btn0 Press...: 0-0
Btn5 Press...
Result of Btn5 Press...: 0-0
Warte auf Speichern unter Dialog...
Setze Edit auf Analyseblatt...
+>11:57:41 AutoIT3.exe ended.rc:0
>Exit code: 0   Time: 7.160

New Autoit:

>Running:(3.3.8.1):C:\Program Files (x86)\AutoIt3\autoit3.exe "H:\AutoIT\Projects\CQTS EACDX\crap.au3"
Setze $AnalyseBlatt ...
Lösche $AnalyseBlatt ...
Result of 1st findByID...: 0-0
Result of 2nd findByID...: 0-0
Result of 3rd findByID...: 0-0
Result of 4th findByID...: 0-0
Result of 5th findByID...: 0-0
Btn0 Press...
Result of Btn0 Press...: 0-0
Btn5 Press...

Share this post


Link to post
Share on other sites

Looks like a bug. Problem is that the Devs need a skript to reproduce the problem. Unfortunately not every of them has SAP available.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2019-10-24 - Version 1.4.14.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2019-11-30 - Version 1.4.0.0) - Download - General Help & Support - Example Scripts - Wiki
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
Task Scheduler (NEW 2019-12-03 - Version 1.5.1.0) - Download - General Help & Support - Wiki

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

I checked Trac #2056 and maybe there was a similar problem with Excel.

I don't know when the first Beata will be released but a the moment I would stick with 3.3.6.1 in your case.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2019-10-24 - Version 1.4.14.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2019-11-30 - Version 1.4.0.0) - Download - General Help & Support - Example Scripts - Wiki
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
Task Scheduler (NEW 2019-12-03 - Version 1.5.1.0) - Download - General Help & Support - Wiki

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

Hello water,

Chromwell is right, it seems to be a problem with the new AutoIt version. Check with the following program

;-Begin-----------------------------------------------------------------
  $oDia = ObjCreate("COMDialog")
  If IsObj($oDia) Then
 
    $Result = 0
   
    While $Result <> 1
 
      $Result = $oDia.WindowEvent()
   
      Select
        Case $Result = 1
          MsgBox(0, "Dialog", "Ende")
        Case $Result = 2
          MsgBox(0, "Dialog", "Test1 Button betätigt")
        Case $Result = 3
          MsgBox(0, "Dialog", "Test2 Button betätigt")
      EndSelect
     
    Wend
  EndIf
;-End-------------------------------------------------------------------

with this ActiveX DLL http://www.stschnell.de/temp/COMDialog.zip, it is one of my test libraries. It shows only a dialog with two buttons and the event loop of the AutoIt program catches the message. It works perfect with 3.3.6.1 but it crashes with the actual version.

Cheers

Stefan

Share this post


Link to post
Share on other sites

Hello community,

the error is still present at the actual version of AutoIt 3.3.10.2. I check it in a 64-bit Windows 7 environment and it chrashes. The version 3.3.6.1 works without any failures.

Cheers

Stefan

AutoItCOMError.jpg

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By adjist
      Hello all! 
       
      Getting this error :
      (22) : ==> Variable used without being declared.: if $vNumber = 0 Then if ^ ERROR  
      But I'm sure I have defined the variable, as in the top of my script has 
      Global $vNumber = 0  
      How would I go about fixing this?
       
    • By Ho3ein
      Hello again, i have a code that changes username to favorite, my problem is how to use ObjEvent() function to catch errors, i've red Help File and Forum's Topics but i can't understand too much😐

      Here is a code (I've copied this codes from a user of AutoIt Forum):
       
      $sOldUser = "Administrator" $sNewUser = "Admin" $oUser = ObjGet("WinNT://" & @ComputerName & "/" & $sOldUser & ",user") $oComputer = ObjGet("WinNT://" & @ComputerName) $oNewUser = $oComputer.MoveHere($oUser.ADsPath, $sNewUser) Thanks for your care, I'm new to AutoIt and days should be passed with my coding and practicing to don't bother you :)❤
    • By MarkIT
      Hi AutoIT masters,
      Good day! Sorry to have bothered this forum but we really need help. We are working on an automation project that is running on VDI server. The BOTS are in .exe are running fine until AV detected them and deleted the files. The files were re-compiled and AV kept on deleting them. The copy of the .exe BOT deleted were sent to Symantec for whitelisting. After whitelisting, it is no longer deleted but no longer working as designed (showing Line script error). We checked the scripts and there were no issues since we run it using SciTE editor and it performed the desired task. Good thing we found on this thread the solution using .a3x and the BOTS worked fine and no longer deleted. Now, the problem is they are asking why the BOTS won't run in .EXE and what is the reason behind Symantec AV deleting them. We raised a case with Symantec but they cannot provide further information as they are always seeing the file as "False Positive". We even tested with Symantec turned off and those .EXE files are working fine, however, after re-enabling, it got deleted.
      Just seeking help on how to better convince them that it is really Symantec causing the issue and the .a3x file.
    • By AutoitMike
      Scite 3.4.4
      Win 10
      I click "Help" or press F1, there is no response
      If I use the file explorer and double click Autoit.chm or Autoit3.chm help opens.
      There is no dialog to check or uncheck "Always ask before opening this file" when clicking on these files.
       
      If you are curious as to why I dont have the latest version, I am creating a back up laptop that has a VERY extensive automation application that I have written over the past 15 years.
       
      An extremely potent, powerful, needed function has been deleted in the upgrade of Autoit in recent years that I can not do without. If my main laptop dies, which it almost did, I am in a very bad position. So I bought the exact same laptop and I am "cofiguring" it to work exactly the same as my main laptop. However, this one has been "Upgraded" to Win 10 which I hope is not the problem. 
      Thanks for any help
    • By AnRios
      Greetings friends!
      I have been searching the help file and Google, with no success, to find a way to validate images from a folder and mark them somehow in a spreadsheet.
      My context is: I made a code with the help of the community that captures images from SAP and saves them in a folder.  Now I'd like to identify which ones are black, if it's even possible. I read about PixelSearch, but did not get it to work. If someone could point me in the right direction, I'd appreciate it.
      The code I'm using:
      #include <File.au3> #include <ScreenCapture.au3> $x = InputBox("Title", "Amount of Images To Capture", "", "", 320, 150) If @error Then Exit $x = Number($x) $y = InputBox("Title", "Batch Name", "", "", 320, 150) If @error Then Exit $y = String($y) HotKeySet("{HOME}", "printscreen") Func printscreen() $FilePath =("C:\Fiscalizacao\Fotos"&"/") $FileName = $y & " - " $FileList = _FileListToArray($FilePath, $FileName & '*.jpg', 1) If Not IsArray($FileList) Then $FileName&= '1.jpg' Else $FileName &= $FileList[0] + 1 & '.jpg' EndIf _ScreenCapture_Capture($FilePath & "\" & $FileName, 354, 196, 673, 436) EndFunc HotKeySet("{BS}", "Terminate") Func Terminate() Exit 0 EndFunc For $i = 1 to $x Opt("WinTitleMatchMode",2) If NOT WinExists("Relatorio") Then MsgBox(0, "Atenção!", "Relatório do MOM deve estar aberto!") Call("Terminate") EndIf Opt("WinTitleMatchMode",2) WinActivate("Relatorio") Sleep (250) Opt("WinTitleMatchMode",2) SendKeepActive("Relatorio") Send("{ENTER}") Sleep (1000) Send("{HOME}") Sleep (200) Opt("WinTitleMatchMode",2) WinActivate("Relatorio") Send("{DOWN}") Next  
×
×
  • Create New...