2

I want to open quotation of a supplier with number "175315" in ME49 transaction, by positioning the cursor on its number (in row 3) and by double-clicking or pressing the F2 key on keyboard.

ME49 Screen

When I check technical info of "175315" or "138992", it shows EKKO-LIFNR as screen field, LIFNR as field name and EKKO as table:

Technical Info of 175315

I tried recording SAP GUI script, but it'll record position of the field I click, like wnd[0] /usr/lbl[77,3]. The position will be different every time, but row will be same i.e. 3.

Below is the VBScript recorded by SAP

    If Not IsObject(SapGuiAuto) Then
        Set SapGuiAuto = GetObject("SAPGUI")
    End If
    If Not IsObject(application) Then
        Set application = SapGuiAuto.GetScriptingEngine
    End If
    If Not IsObject(connection) Then
        Set connection = application.Children(0)
    End If
    If Not IsObject(session) Then
        Set session = connection.Children(0)
    End If

    session.findById("wnd[0]").maximize
    session.findById("wnd[0]/tbar[0]/okcd").text = "me49"
    session.findById("wnd[0]/usr/ctxtP_EKORG").text = "e002"
    session.findById("wnd[0]/usr/ctxtP_EBELN-LOW").text = "21981156"
    session.findById("wnd[0]/usr/ctxtP_EBELN-LOW").setFocus
    session.findById("wnd[0]/usr/ctxtP_EBELN-LOW").caretPosition = 8
    session.findById("wnd[0]").sendVKey 8
    session.findById("wnd[0]/usr/lbl[73,3]").setFocus
    session.findById("wnd[0]/usr/lbl[73,3]").caretPosition = 4
    session.findById("wnd[0]").sendVKey 2

I tried the below code, but it gives Run-Time error 619

    If session.findById("wnd[0]/usr/txtEKKO-LIFNR").Text = "175315" Then
    session.findById("wnd[0]/usr/txtEKKO-LIFNR").SetFocus
    session.findById("wnd[0]").sendVKey 2
    End If

EDIT- Found solution, but when I try to step into manually using F8, do while loop never stops even if AnfrageNr = 175315. When I run it directly, it opens the quotation of 175315. Please suggest efficient solution or other method.

On Error Resume Next
Dim i As Integer

If Not IsObject(ApplicationGUI) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set ApplicationGUI = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
   Set Connection = ApplicationGUI.Children(0)
End If
If Not IsObject(session) Then
   Set session = Connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session, "on"
   WScript.ConnectObject ApplicationGUI, "on"
End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "/nme49"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtP_EKORG").Text = "E002"
session.findById("wnd[0]/usr/ctxtP_EBELN-LOW").Text = "21983729"
session.findById("wnd[0]/usr/ctxtP_EBELN-LOW").SetFocus
session.findById("wnd[0]/usr/ctxtP_EBELN-LOW").caretPosition = 8
session.findById("wnd[0]").sendVKey 8

For i = 1 To 199
Do While AnfrageNr <> 175315
AnfrageNr = session.findById("wnd[0]/usr/lbl[" & i & ",3]").Text
i = i + 1
session.findById("wnd[0]/usr/lbl[" & i & ",3]").SetFocus
Loop
Next i

session.findById("wnd[0]/usr/lbl[" & i & ",3]").SetFocus
session.findById("wnd[0]").sendVKey 2
MsgBox "result:" & AnfrageNr
Suncatcher
  • 10,355
  • 10
  • 52
  • 90
Bhushan
  • 23
  • 4
  • Sorry, I don't understand. What error message is it, and which line is concerned? Why are you talking about the supplier "123456" but the screenshot shows other numbers? Your screenshot is an ABAP List so it doesn't contain screen fields (consequently, there's no field `EKKO-LIFNR`), it only contains positions referred by row and column numbers. Your script is not related to the screen at all, in fact I guess you don't know where to start. I guess your question is that you are looking for a given supplier number in the first row so that to get the column number. Please clarify. – Sandra Rossi Jan 28 '23 at 20:43
  • @SandraRossi I have updated the post with actual screenshots. When I check technical info of 175315 or 138992, it shows EKKO-LIFNR as screen field. – Bhushan Jan 29 '23 at 02:20

1 Answers1

2

EDIT: this current answer was partially copied to the more general question How to get texts from screen displaying an "ABAP List" where it was made a Community wiki in order to be enriched by anybody.

First of all, you need to know that an ABAP List is not like a general screen. An ABAP List has fields which are not identified by their field names but by their positions, the Technical Information is of no help.

Visually speaking, this is an ABAP List (monospaced font only):

And this is a general screen (labels using proportional font):

This script loops at all the fields in an ABAP List:

text = ""
For Each field In session.findById("wnd[0]/usr").Children
    text = text & field.CharTop & " " & field.CharLeft & " " & field.Text & " " _
                & field.Id & " " & field.Type & chr(10)
Next
msgbox text

For the ABAP List above (first screenshot), the script will show:

SAP GUI Scripting contents of ME49 Detail Screen

The loop goes from top to bottom and from left to right. You can't just look at the fields of one row, but you can stop looping after a given row:

If field.CharTop > 2 Then
  Exit For
End If

Each field can be of type GuiLabel, GuiTextField or GuiCheckBox, and has these common properties:

  • CharLeft: horizontal position in the ABAP List
  • CharTop: vertical position in the ABAP List
  • Text (or DisplayedText)
  • Id: the field name by its position
  • Type: the type of object

By adapting the script above, you will be able to find the horizontal positions (CharLeft) and numbers (Text) of all vendors in the row 2 (CharTop = 2), and finally you can position the cursor on the vendor you want.

In the below code, reusing yours, i would take the value of CharLeft (use lbl because it's a GuiLabel field, that would be respectively txt and chk for GuiTextField and GuiCheckBox fields):

session.findById("wnd[0]/usr/lbl[" & i & ",2]").SetFocus
session.findById("wnd[0]").sendVKey 2

But instead of field.CharLeft, you could also use directly field or field.Id that you obtain during the loop.

Sandra Rossi
  • 11,934
  • 5
  • 22
  • 48