You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测FEBA事务码表格控件中的选中项(蓝色字体行)

SAP FEBA事务码表格选中状态检测代码优化

问题背景

处理电子银行对账单的SAP事务码FEBA时,需要识别表格中条目是否被选中:

  • 选中项:蓝色字体,可点击
  • 未选中项:常规字体,不可点击
    现有VB遍历代码可遍历表格行,但无法检测选中状态,需优化。

关联控件路径

session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106/txtDF05B-PSBET[11," & adjustedIndex & "]")
session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106/txtDF05B-PSDIF[12," & adjustedIndex & "]")

原有遍历代码

Function LoopDataOriginal(session As Object)
    
    Dim rowCount As Integer
    Dim visibleRows As Integer
    Dim scrollPos As Integer
    Dim i As Integer
    Dim adjustedIndex As Integer
    Dim batchSize As Integer
    Dim endRow As Integer
    
    rowCount = session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106").rowCount
    visibleRows = session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106").VisibleRowCount
    batchSize = visibleRows
    For scrollPos = 0 To rowCount - 1 Step batchSize
        session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106").verticalScrollbar.position = scrollPos
        endRow = scrollPos + batchSize - 1
        If endRow >= rowCount Then endRow = rowCount - 1
        For i = scrollPos To endRow
            adjustedIndex = i Mod visibleRows
            Debug.Print session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106/txtDF05B-PSDIF[12," & adjustedIndex & "]").Text
            Debug.Print session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106/txtDF05B-PSBET[11," & adjustedIndex & "]").Text

    'to add to check for selected
        Next i
    Next scrollPos

End Function

优化后代码(含选中状态检测)

优化点说明:

  • 缓存表格对象,减少重复查找操作,提升效率
  • 通过控件Enabled属性和表格行Selected属性两种方式检测选中状态(可根据实际SAP GUI响应情况选择)
  • 输出选中状态标识
Function LoopDataWithSelectionCheck(session As Object)
    
    Dim rowCount As Integer
    Dim visibleRows As Integer
    Dim scrollPos As Integer
    Dim i As Integer
    Dim adjustedIndex As Integer
    Dim batchSize As Integer
    Dim endRow As Integer
    ' 缓存表格对象,避免重复查找
    Dim tbl As Object
    Set tbl = session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106")
    
    rowCount = tbl.rowCount
    visibleRows = tbl.VisibleRowCount
    batchSize = visibleRows
    
    For scrollPos = 0 To rowCount - 1 Step batchSize
        tbl.verticalScrollbar.position = scrollPos
        endRow = scrollPos + batchSize - 1
        If endRow >= rowCount Then endRow = rowCount - 1
        
        For i = scrollPos To endRow
            adjustedIndex = i Mod visibleRows
            ' 获取当前行的两个单元格控件
            Dim psdifCtrl As Object
            Dim psbetCtrl As Object
            Set psdifCtrl = tbl.findById("txtDF05B-PSDIF[12," & adjustedIndex & "]")
            Set psbetCtrl = tbl.findById("txtDF05B-PSBET[11," & adjustedIndex & "]")
            
            ' 方式1:通过控件Enabled属性判断(未选中项不可点击,Enabled为False)
            Dim isEnabled As Boolean
            isEnabled = psbetCtrl.Enabled ' 取任意一个可点击的控件判断即可
            
            ' 方式2:通过表格行的Selected属性判断(部分SAP表格支持直接获取行选中状态)
            Dim isSelected As Boolean
            isSelected = tbl.Rows(i).Selected
            
            ' 输出单元格文本及选中状态
            Debug.Print "行号:" & i + 1 & " | PSDIF值:" & psdifCtrl.Text & " | PSBET值:" & psbetCtrl.Text
            Debug.Print "是否可点击(Enabled):" & isEnabled & " | 是否选中(Selected):" & isSelected
            Debug.Print "-------------------------"
        Next i
    Next scrollPos

End Function

注意事项

  1. 若tbl.Rows(i).Selected报错,说明该SAP表格不支持直接访问行的Selected属性,可仅保留Enabled属性检测方式
  2. 测试时需确认选中项的Enabled属性是否为True,未选中项为False,若实际情况相反,需调整判断逻辑
  3. 缓存表格对象可大幅提升遍历效率,避免频繁调用findById

内容的提问来源于stack exchange,提问作者sephiroth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:43:11