【问题标题】:Reading text in VA02 Table Control在 VA02 表格控件中读取文本
【发布时间】:2021-11-27 19:53:44
【问题描述】:

我遇到了 SAP VA02 的问题,我想在其中识别特定标签所在的行。在这种情况下,标签/文本是“Cust.expected price”。

我正在尝试更改此行旁边的数据,问题是它并不总是同一行,有时是 16、18 等。

我正在尝试找到一种方法来遍历结构中第 2 列中的每一行,阅读文本,并找到标签所在的行,然后使用该行作为变量将价格粘贴到正确的单元格中.我在下面粘贴了一些功能代码。

我正在做的是在这里输入正确的价格: session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\05/ssubSUBSCREEN_BODY:SAPLV69A:6201/tblSAPLV69ATCTRL_KONDITIONEN/txtKOMV-KBETR[3,16]").Text = Price

我的主要问题是如何阅读每个单元格中的文本,例如session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\05/ssubSUBSCREEN_BODY:SAPLV69A:6201/tblSAPLV69ATCTRL_KONDITIONEN/txtKOMV-KBETR[2,16]")

我大概可以从那里找出其余的。我无法找到关于这个特定结构的太多信息,感谢任何输入。我还将发布页面截图以供参考。谢谢!

Sub OrderRelease()

Dim Order As String
Dim RowCount As Integer
Dim Item As Integer
Dim sh As Worksheet
Dim rw As Range
Dim Sroll As Integer
Dim Price As Double

On Error Resume Next


RowCount = 0
Set sh = ActiveSheet
For Each rw In sh.Rows

  If sh.Cells(rw.Row, 6).Value = "" Then
    Exit For
  End If

  RowCount = RowCount + 1

Next rw

If Not IsObject(SAPGuiApp) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set SAPGuiApp = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
   Set Connection = SAPGuiApp.Children(0)
End If
If Not IsObject(SAP_session) Then
   Set session = Connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject SAP_session, "on"
   WScript.ConnectObject SAPGuiApp, "on"
End If

session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "/nva02"
session.findById("wnd[0]").sendVKey 0

For i = 2 To RowCount
    Order = Cells(i, "F")
    
    session.findById("wnd[0]/usr/ctxtVBAK-VBELN").Text = Order
    session.findById("wnd[0]/usr/ctxtVBAK-VBELN").caretPosition = 9
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    
Continue:

    Item = Cells(i, "G") / 10 - 1
    Scroll = Item - 1
    Price = Cells(i, "H")

    Set sub = session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02/ssubSU" _
              & "BSCREEN_BODY:SAPMV45A:4401/subSUBSCREEN_TC:SAPMV45A:4900")
    Set tbl = sub.findById("tblSAPMV45ATCTRL_U_ERF_AUFTRAG")

    tbl.verticalScrollbar.Position = Scroll
    tbl.getAbsoluteRow(Item).Selected = True
    tbl.findById("txtVBAP-POSNR[0,8]").SetFocus
    tbl.findById("txtVBAP-POSNR[0,8]").caretPosition = 4
 
    sub.findById("subSUBSCREEN_BUTTONS:SAPMV45A:4050/btnBT_PKON").press


    Set tbl2 = session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\05/ssubSU" _
               & "BSCREEN_BODY:SAPLV69A:6201/tblSAPLV69ATCTRL_KONDITIONEN")

    tbl2.verticalScrollbar.Position = 8

'The below line is what I need to find. In this case, Cust. expected price would be 2,16,
'but I have not found a way to actually read the text in that cell.
    tbl2.findById("txtKOMV-KBETR[3,16]").Text = Price
    tbl2.findById("txtKOMV-KBETR[3,16]").SetFocus
    tbl2.findById("txtKOMV-KBETR[3,16]").caretPosition = 16

    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\11").Select
    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\11/ssubSU" _
        & "BSCREEN_BODY:SAPMV45A:4456/cmbVBAP-ABGRU").Key = " "

    session.findById("wnd[0]/tbar[0]/btn[3]").press
    session.findById("wnd[0]/usr/btnBUT2").press
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    session.findById("wnd[0]").sendVKey 0

    If Cells(i, "F") = Cells(i + 1, "F") Then
        i = i + 1
        GoTo Continue
    End If

    session.findById("wnd[0]").sendVKey 11
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    session.findById("wnd[1]/usr/btnSPOP-VAROPTION1").press

Next i

End Sub

【问题讨论】:

  • 我想您会问如何找到给定文本所在的表格控件(您使用的元素名称)的行号,对吗?注意:您可以通过使用变量来简化脚本的阅读(两行可以简化为:Set tbl = session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02/ssubSUBSCREEN_BODY:SAPMV45A:4401/subSUBSCREEN_TC:SAPMV45A:4900/tblSAPMV45ATCTRL_U_ERF_AUFTRAG") : tbl..verticalScrollbar.Position = Scroll : tbl.getAbsoluteRow(Item).Selected = True;注意:由于 Stack Overflow 多行注释限制,此处使用冒号)
  • 我编辑了您的问题以使脚本更清晰(变量+分割线)
  • 是的,我正在寻找文本所在的行号。

标签: excel vba sap-erp sap-gui


【解决方案1】:

下面是如何在给定行和给定列中引用单元格的值,它们都在变量中提供:

row = 0
column = 1
cellText = session.findById(".../tblXXXXX/columnFieldName[" & column & "," & row & "]").Text

另一种解决方案是在 Table Control 对象上使用 GetCell 方法:

cellText = session.findById(".../tblXXXXX").GetCell(row,column).Text

注意:请注意行和列参数已切换。

要知道 ".../tblXXXXX/columnFieldName[...] 使用什么值,最简单的方法是记录脚本,只需将光标移动到所需的列即可。生成的脚本将返回类似的内容(使用演示程序DEMO_DYNPRO_TABCONT_LOOPFLIGHTS 进行测试):

session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS/ctxtDEMO_CONN-CITYFROM[2,1]").setFocus
session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS/ctxtDEMO_CONN-CITYFROM[2,1]").caretPosition = 1

行号对应可见行之间的顺序,从 0 开始(0 = 第一个可见行)。最后一个可见行的数字等于表格控件属性VisibleRowCount 减1。不可见的行(上方和下方)可以通过使脚本垂直滚动来访问,有关以编程方式滚动的更多信息,请参见下面的章节。

列号基于表格控件中显示的列的顺序,无论这些列是立即可见的还是水平滚动后可见的。该脚本不需要执行水平滚动来读取不可见列的值。 0 是最左列,最右列的数字等于表格控件Columns.Count 的两个属性减1。

  • 列的列表及其顺序可能会根据活动的表格控制配置而有所不同。您可能希望在运行时根据列名确定列号,具体请参见下文。
  • 可能还有其他通过Table Control administrator function 建议的列,并选中了“隐藏”复选框。 SAP GUI 脚本完全忽略这些列。如果您需要使用它们,您必须调用表控制方法ConfigureLayout 以显示管理员屏幕,然后您可以像使用任何其他屏幕一样使用设置。

滚动行

对于表格控件,SAP GUI 脚本仅知道当前在屏幕上可见的行中的数据,因为出于性能原因,后端 ABAP 程序仅将这些行发送到前端。 SAP GUI 脚本无法知道不可见行的值。要求脚本垂直滚动以获取其他行。 注意,滚动意味着重新加载整个屏幕,因此需要重新实例化屏幕元素。以下示例滚动整个列表以显示第一列中的所有值(使用演示程序DEMO_DYNPRO_TABCONT_LOOPFLIGHTS):

Set tbl = session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS")
' Make the first row visible (show the top of the list) -> that calls the back-end system and screen is reloaded.
' ATTENTION: when the back-end is called, to continue working with screen elements, they must be re-instantiated.
tbl.VerticalScrollbar.Position = 0

TextsOfAllCellsInColumnZero = ""
Do While True
  ' Re-instantiate the Table Control element (mandatory each time the back-end is called)
  Set tbl = session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS")
  visibleRow = 0
  currentScrollbarPosition = tbl.VerticalScrollbar.Position
  While visibleRow < tbl.VisibleRowCount And currentScrollbarPosition <= tbl.VerticalScrollbar.Maximum
    TextsOfAllCellsInColumnZero = TextsOfAllCellsInColumnZero & tbl.GetCell(visibleRow,0).Text & Chr(10)
    visibleRow = visibleRow + 1
    currentScrollbarPosition = currentScrollbarPosition + 1
  Wend
  If currentScrollbarPosition > tbl.VerticalScrollbar.Maximum Then
    Exit Do
  End If
  tbl.VerticalScrollbar.Position = currentScrollbarPosition
Loop
MsgBox TextsOfAllCellsInColumnZero

请注意,此示例适用于少量页面。在许多其他情况下,页面更多,对于搜索包含给定值的行之类的操作,单击现有按钮以执行该值的后端搜索会执行得更多。正确的页面会立即显示出来。

在运行时根据列名确定列号

如上所述,列号可能会根据列的顺序和隐藏列而有所不同。如果它们在运行时以未确定的方式变化,则以下代码允许根据列名确定列号(请注意,要删除字段名的小写前缀,如“ctxtDEMO_CONN-CITYFROM”中的“ctxt” "),但仅在至少有 1 行时才有效(如果 Table Control 为空时需要,则找不到解决方案):

Set tbl = session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS")
column = GetColumnNumberByName(tbl,"DEMO_CONN-CITYFROM")
msgbox tbl.GetCell(row,column).text

Function GetColumnNumberByName( TableControl, ColumnName )
  If TableControl.Rows.Count > 0 Then
    For i = 0 To TableControl.Columns.Count - 1
      If TableControl.Columns(i)(0).Name = ColumnName Then
        GetColumnNumberByName = i
        Exit Function
      End If
    Next
  End If
  GetColumnNumberByName = -1
End Function

附录

更多信息请参考documentation of the "GuiTableControl Object" in the SAP Library

注意:如果您查看其他问题,请注意表格控件 (GuiTableControl) 与网格视图 (GuiGridView) 完全无关,因此不要混淆。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2021-03-25
    • 1970-01-01
    相关资源
    最近更新 更多