如何用 SAP GUI Scripting 读取 FB03 中不可点击的文字?
可以读取,前提是这行文字通过 SAP GUI Scripting 暴露为可访问的控件或控件内容。区域无法点击,并不代表文字无法读取。对于普通标签,可以直接读取其 Text 属性,无须先点击或设置焦点。SAP 接口文档说明,标签文字可以读取,但不能修改。GuiVComponent 文档
如果目的是识别当前屏幕,建议先使用 session.Info.Transaction、session.Info.Program 和 session.Info.ScreenNumber,再结合目标控件及业务字段判断。仅凭现有描述,无法确定 Line Item 1 / Credit memo / 11 对应的具体控件 ID。
为什么读取窗口标题得不到另一行文字?
现有代码读取的是主窗口的 Text:
wndTitle = Trim(session.findById("wnd[0]").Text)
屏幕其他位置的文字不一定属于窗口标题,也不会自动包含在这个属性中。目标文字可能属于标签、只读文本字段,或者某个复杂控件的内部内容,需要先检查实际对象结构。
先检查当前屏幕的控件树
下面的 VBA 示例假定 session 已连接到目标 SAP 会话,且屏幕已加载完成。将代码放入标准模块,再从现有自动化流程调用 InspectFb03 session,即可在 VBA 的“立即窗口”中查看控件 ID、类型和文字。
Sub InspectFb03(ByVal session As Object)
Debug.Print "Transaction: " & session.Info.Transaction
Debug.Print "Program: " & session.Info.Program
Debug.Print "ScreenNumber: " & CStr(session.Info.ScreenNumber)
DumpGuiTree session.findById("wnd[0]")
End Sub
Sub DumpGuiTree(ByVal node As Object)
Dim child As Object
Dim textValue As String
textValue = ""
' Some objects do not expose a readable Text property.
On Error Resume Next
textValue = node.Text
On Error GoTo 0
Debug.Print node.Id & " | " & node.Type & " | " & textValue
If node.ContainerType Then
For Each child In node.Children
DumpGuiTree child
Next child
End If
End Sub
代码通过 ContainerType 判断对象是否具有 Children,然后递归检查子对象。这些属性属于 SAP GUI Scripting 对象模型。SAP GUI Scripting API
在输出中搜索 Credit memo、Line Item 或 11。这行显示内容可能由多个控件组成,因此不要只搜索完整字符串,也要检查局部匹配结果。遇到复杂控件时,应根据实际类型继续检查其专用接口。
找到实际 ID 后,直接读取文字
对于提供可读 Text 属性的控件,可以使用以下 VBA 函数:
Function ReadGuiText(ByVal session As Object, _
ByVal controlId As String) As String
Dim control As Object
Set control = session.findById(controlId, False)
If control Is Nothing Then
Err.Raise vbObjectError + 1000, "ReadGuiText", _
"Control not found: " & controlId
End If
ReadGuiText = Trim(control.Text)
End Function
将检查得到的实际 ID 传给 controlId。如果显示内容分散在多个标签中,可以分别读取,再按需要组合。不要直接套用未经确认的标签坐标、字段名或标题栏路径。
怎样可靠识别 FB03 当前屏幕?
先在每个需要区分的状态下记录以下信息:
Dim screenKey As String
screenKey = session.Info.Transaction & "|" & _
session.Info.Program & "|" & _
CStr(session.Info.ScreenNumber)
Debug.Print screenKey
ScreenNumber 表示当前显示的屏幕编号,结合程序名可以作为后续分支判断的基础。SAP GUI Scripting API
这个组合能否区分你关心的状态,需要在实际系统中确认。同一屏幕可能显示不同的行项目,因此还应检查:
- 该状态下特有的控件是否存在。
- 实际行项目编号、类型或其他业务字段的值。
- 是否有弹窗遮挡主窗口,导致当前操作目标发生变化。
窗口标题和 Credit memo 这样的显示文字可以辅助诊断,但用于长期运行的分支逻辑时,需要考虑登录语言和显示格式的变化。
找不到文字时如何处理?
如果普通子控件中找不到目标文字,先确认它是否属于表格、树或其他复杂控件的内部内容。不要假定所有控件都通过 .Text 返回屏幕上看到的文字。例如,SAP 文档说明 GuiShell.Text 返回的可能是类标识。GuiVComponent 文档
如果检查后确认目标内容没有通过脚本接口暴露,就无法仅靠 findById(...).Text 获取它。此时可以改用已暴露的业务字段识别当前状态。
以上代码是 VBA 示例。使用 VBScript 时,需要移除 As Object、As String 等类型声明,并将 Debug.Print 替换为适合运行宿主的输出方式。实际流程还应在页面切换后等待会话就绪,并设置超时;不要把读取失败直接当成“当前不是目标屏幕”。
备注:内容仅供参考。
