Tip: How to use ABAP with SAP GUI Scripting

A few days ago I presented here in the SAP Community the possibility to use ABAP with SAP Intelligent RPA (Robotic Process Automation). The approach is a COM library called ABAPRunner. Just as ABAP can be used there, ABAP can also be used in combination with SAP GUI Scripting. Here a tiny example.

  1. We call the TAC BC_GLOABL_SFLGH_CREA to create a record with the key fields.
  2. After pressing the create button we fill the non key fields and press save.

The Flight Date and the Airfare are random values. We check with the message in the status bar whether everything is okay. So far so well, that is an easy venture. But now follows the really interesting part.

We want to check whether the data has actually been saved in the table and if so, we want to delete it immediately. These steps can be done by a tiny ABAP report.

DATA: gt_sflight TYPE STANDARD TABLE OF sflight. BREAK-POINT. SELECT * INTO TABLE gt_sflight FROM SFLIGHT WHERE CARRID = 'LH' AND CONNID = '0400' AND PLANETYPE = '737-800' AND FLDATE = '20200923' AND PRICE = '685.14'. IF sy-subrc <> 0. WRITE: 'Error: Record do not exists.'. ELSE. DELETE SFLIGHT FROM TABLE gt_sflight. ENDIF.

The flight date and the price must be variable.

That is all, now we can combine our SAP GUI Scripting code with the ABAP code.

'-Begin----------------------------------------------------------------- session.findById("wnd[0]/tbar[0]/okcd").text = "/nBC_GLOBAL_SFLGH_CREA" session.findById("wnd[0]/tbar[0]/btn[0]").press Randomize FlightDate = FormatDateTime(DateAdd("d", Rnd * 365, Now), vbShortDate) ABAPFlightDate = Right(FlightDate, 4) & Mid(FlightDate, 4, 2) & Left(FlightDate, 2) session.findById("wnd[0]/usr/ctxtSFLIGHT-CARRID").text = "LH" session.findById("wnd[0]/usr/ctxtSFLIGHT-CONNID").text = "400" session.findById("wnd[0]/usr/ctxtSFLIGHT-FLDATE").text = FlightDate session.findById("wnd[0]/usr/btn%#AUTOTEXT001").press StatusBarText = session.findById("wnd[0]/sbar/pane[0]").Text If InStr(StatusBarText, "already exists") Then MsgBox "An error occured" Exit Sub End If Randomize FlightPrice = CStr(FormatNumber(Round(Rnd * 1000, 2), 2)) ABAPFlightPrice = Replace(FlightPrice, ",", ".") session.findById("wnd[0]/usr/txtSFLIGHT-PRICE").text = FlightPrice session.findById("wnd[0]/usr/ctxtSFLIGHT-PLANETYPE").text = "737-800" session.findById("wnd[0]/tbar[0]/btn[11]").press StatusBarText = session.findById("wnd[0]/sbar/pane[0]").Text If InStr(StatusBarText, "created") = 0 Then MsgBox "An error occured" Exit Sub End If On Error Resume Next Set ABAPRunner = CreateObject("ABAP.Runner") On Error Goto 0 If Not IsObject(ABAPRunner) Then MsgBox "Can't create ABAP.Runner", vbOkOnly, "Important hint" Exit Sub End If '-ABAP------------------------------------------------------------------ ABAPCode = _ "REPORT Z_CHECK_SFLIGHT." & vbCrLf & _ "DATA:" & vbCrLf & _ " gt_sflight TYPE STANDARD TABLE OF sflight." & vbCrLf & _ "SELECT *" & vbCrLf & _ " INTO TABLE gt_sflight" & vbCrLf & _ " FROM SFLIGHT" & vbCrLf & _ " WHERE CARRID = 'LH' AND" & vbCrLf & _ " CONNID = '0400' AND" & vbCrLf & _ " PLANETYPE = '737-800' AND" & vbCrLf & _ " FLDATE = '" & ABAPFlightDate & "' AND" & vbCrLf & _ " PRICE = '" & ABAPFlightPrice & "'." & vbCrLf & _ "IF sy-subrc <> 0." & vbCrLf & _ " WRITE: 'Error: Record do not exists'." & vbCrLf & _ "ELSE." & vbCrLf & _ " DELETE SFLIGHT FROM TABLE gt_sflight." & vbCrLf & _ "ENDIF." '-ABAPEND--------------------------------------------------------------- ABAPRunner.ABAPCode = ABAPCode ABAPRunner.AddParameter = "ASHOST=ABAP" ABAPRunner.AddParameter = "SYSNR=00" ABAPRunner.AddParameter = "CLIENT=001" ABAPRunner.AddParameter = "USER=BCUSER" ABAPRunner.AddParameter = "PASSWD=minisap" ABAPRunner.AddParameter = "LANG=EN" Result = ABAPRunner.InstallAndRun() If Result <> "" Then MsgBox Result End If '-End-------------------------------------------------------------------

We call the TAC, generate a random flight date, fill the fields, check the status bar, generate a random flight price, fill more fields and check the status bar again. Then the initialization of ABAPRunner follows. And now the ABAP code, but the flight date and price are variables. Before the execution the connection parameters. And it works.

If the record do not exists in the table SFLIGHT the report delivers an error message, otherwise nothing happens and it can be assumed that the execution was a success.

As we can see it is easy possible to combine SAP GUI Scripting with ABAP coding. This example shows us how to check data with SAP Open SQL statements of a test process. This data can also be removed at the end, as we saw. It is not necessary to embed the ABAP code in the VBScript, you can store it as file also and load it via File System Object, e.g. like this:

Set FSO = CreateObject("Scripting.FileSystemObject") Set ABAPFile = FSO.OpenTextFile("ABAPRunner.Test.abap", ForReading) ABAPRunner.ABAPCode = ABAPFile.ReadAll ABAPFile.Close

However, variables must then be passed as parameters.

There are many possible uses for this approach. But never use this method in productive environments. It is for development and test systems only. And the COM library is not language-bound. You can also use AutoIt, PowerShell or Python respectively any other COM enabled language.

You can find ABAPRunner here. Enjoy it.