excel 打开ME49中供应商的报价单?

wvt8vs2t  于 2023-02-20  发布在  其他
关注(0)|答案(1)|浏览(106)

我想打开ME 49交易中编号为“175315“的供应商的报价,方法是将光标定位在其编号(3行)上,然后双击或按键盘上的F2键。

当我检查“175315“或“138992“的技术信息时,它显示EKKO-LIFNR为屏幕字段,LIFNR为字段名称,EKKO为表格:

我尝试记录SAP GUI脚本,但它会记录我单击字段的位置,如wnd[0] /usr/lbl[77,3]。位置每次都不同,但行相同,即3
以下是SAP记录的VBScript

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

我尝试了下面的代码,但它给出了运行时错误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-找到了解决方案,但当我尝试使用F8手动进入时,do while循环从未停止,即使AnfrageNr = 175315。当我直接运行它时,它打开了175315的报价。请建议有效的解决方案或其他方法。

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
rlcwz9us

rlcwz9us1#

首先,你需要知道ABAP列表不像一般的屏幕,ABAP列表中的字段不是由字段名来标识,而是由它们的位置来标识,技术信息是没有帮助的。
从视觉上看,这是一个ABAP列表(仅限等宽字体):

这是一个通用屏幕(标签使用比例字体):

此脚本在ABAP列表中的所有字段处循环:

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

对于上面的ABAP列表(第一个屏幕截图),脚本将显示:

循环从上到下,从左到右,你不能只看一行的字段,但是你可以在给定行之后停止循环:

If field.CharTop > 2 Then
  Exit For
End If

每个字段可以是GuiLabelGuiTextFieldGuiCheckBox类型,并具有以下公共属性:

  • CharLeft:ABAP列表中的水平位置
  • CharTop:ABAP列表中的垂直位置
  • Text(或DisplayedText
  • Id:按位置显示的字段名称
  • Type:对象的类型

通过修改上面的脚本,您将能够找到行2CharTop = 2)中所有供应商的水平位置(CharLeft)和编号(Text),最后您可以将光标定位到所需的供应商上。
在下面的代码中,重用您的代码,i将取值CharLeft(使用lbl,因为它是GuiLabel字段,对于GuiTextFieldGuiCheckBox字段,将分别为txtchk):

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

但是,除了field.CharLeft之外,您还可以直接使用在循环期间获得的fieldfield.Id

相关问题