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

SAP GUI:编写VBA复制BOM时如何获取物料总行数?

解决SAP BOM总行数统计的靠谱方法

嘿,这个问题我之前帮不少同行踩过坑——SAP GUI脚本录制出来的相对行号确实鸡肋,滚动后就重置,完全没法准确统计真实的BOM总行数。给你几个实用的解决方案,按靠谱程度排序:

1. 用SAP标准RFC函数(最推荐)

直接调用SAP的CSAP_MAT_BOM_READ函数,这是SAP官方提供的BOM读取API,完全绕开界面限制,能直接获取指定物料BOM的所有行项目。在VBA里通过RFC调用它,返回的T_STPOX表的行数就是你要的总物料行数量。

具体步骤:

  • 在VBA里配置SAP RFC连接(需要确保系统允许RFC调用,且你有相关权限)
  • 设置函数参数:物料号(MATNR)、工厂(WERKS)、BOM用途(STLAN)等关键信息
  • 执行函数后,读取输出表T_STPOX的行数即可

这个方法的优势是:不受界面分页/滚动影响,支持大批量BOM,数据准确率100%。

2. 利用SAP表格控件的GetAllRows方法

如果不想折腾RFC,直接在界面上操作的话,SAP的表格控件提供了GetAllRows()方法,可以一次性获取所有行的数据(不管是否在当前屏幕显示),然后通过数组长度统计总行数。

示例VBA代码:

Sub GetBOMTotalRows()
    Dim sapSession As SAPGuiSession
    Dim bomTable As SAPGuiCtrl.SAPGuiTable
    Dim allBOMRows As Variant
    Dim totalRowCount As Integer
    
    ' 假设已连接SAP并打开目标BOM界面(如CS02/CS03)
    Set sapSession = Application.ActiveSession
    Set bomTable = sapSession.findById("wnd[0]/usr/tabsTS_ITOV/tabpTCMA/ssubSUBPAGE:SAPLCSDI:0152/tblSAPLCSDITCMAT")
    
    ' 获取所有BOM行数据
    allBOMRows = bomTable.GetAllRows()
    ' 数组从0开始,所以总行数是UBound+1
    totalRowCount = UBound(allBOMRows, 1) + 1
    
    MsgBox "当前BOM的物料行总数:" & totalRowCount
End Sub

注意事项:

  • 要先在VBA编辑器的「工具->引用」里勾选「SAP GUI Scripting API」
  • 这个方法获取的是当前层级的BOM行数,如果是多层BOM,需要递归处理各子项

3. 切换到BOM概览视图

在CS02/CS03事务码里,按F5或者点击菜单栏「编辑->显示概览」,切换到概览视图。这个视图会尽可能显示更多BOM行(如果数量极大还是会分页,但多数场景下能显示全部),然后直接读取表格的RowCount属性:

totalRowCount = bomTable.RowCount

如果概览视图还是分页,结合上面的GetAllRows方法依然能拿到准确数量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:48:06