gpt4 book ai didi

excel - 在 VA02 表格控件中读取文本

转载 作者:行者123 更新时间:2023-12-04 20:08:47 24 4
gpt4 key购买 nike

我对 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]")我可能可以从那里弄清楚其余的。我无法找到关于这个特定结构的太多信息,感谢任何输入。我还将发布页面截图以供引用。谢谢!
The page in question

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

最佳答案

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

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 )与 GridView ( GuiGridView )完全无关,所以不要混淆。

    关于excel - 在 VA02 表格控件中读取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68685911/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com