SAP GUI Scripting 是现成的自动化通道,本文讲 Agent 接管 SAP GUI 的完整起步路径:两端开关怎么开,从录制拿到脚本再换 Python 调 COM,会话与弹窗的探测方法,平台限制、性能预期与跳板机安全边界。

AI Agent 接管 SAP GUI 的脚本通道

不少 ABAP 和运维同事问过同一件事,能不能让 Agent 自己进 SAP,像人一样把事务码敲进去,把参数填上,把保存按下去。能走的通道现成就有一条,SAP GUI Scripting。这套自动化接口在 Windows 客户端里存在二十多年,老的 vbs 脚本用的就是它,Agent 接管的是同一批调用,不用发明新东西。

两端开关都得打开

客户端这头在 SAP GUI for Windows 里设置。点右上角的定制本地布局按钮,快捷键 Alt+F12,进 Options,选 Accessibility & Scripting,在 Scripting 页签里勾上 Enable Scripting。同一页还有两个 Notify 选项,脚本附加到正在跑的 GUI 或新建连接时会弹提示,调试阶段留着,脚本稳定后关掉免得吵。

服务器那头是实例参数的事。sapgui/user_scripting 默认 FALSE,在 RZ11 里改成 TRUE,动态生效不用重启,要固化写进 RZ10 的实例 profile。想收紧到按用户放行,再把 sapgui/user_scripting_per_user 置 TRUE,激活和安全的注意事项,SAP Note 480149 说得最全。这个开关影响整个系统,动之前先跟 Basis 同事对一下。

两端通没通不用猜,直接录一段事务码,录得动就是通了。

从录制拿到第一段脚本

起步最快的方式是录。还是 Alt+F12,选 Script Recording and Playback,在录制对话框里按红色录制键,然后到 SAP 里把要自动化的操作走一遍,停录后得到一个 vbs 文件。录制格式默认 VBScript,SAP GUI 8.10 起可以选 JavaScript。

拿查物料主数据当例子,命令字段敲 /nse16,表名字段填 MARA,按 F8 出清单。录制器把每一步记成一行 findById 调用,比如 session.findById("wnd[0]/usr/ctxtDATABROWSE-TABLENAME").text = "MARA"。录出来的 vbs 头几行是固定样板,GetObject(“SAPGUI”) 先拿到引擎,再一层层 Children(0) 取连接和会话。

Agent 侧不必跑 vbs,这套接口本质是 COM 自动化,能调 COM 的语言都能用,Python 配 pywin32 就几行。

import win32com.client
engine = win32com.client.GetObject("SAPGUI").GetScriptingEngine
session = engine.Children(0).Children(0)   # 第一条连接的第一个会话
session.findById("wnd[0]/tbar[0]/okcd").text = "/nse16"
session.findById("wnd[0]").sendVKey(0)     # 回车

剩下的活是把基础调用包成 Agent 的工具。输入框这类文本控件的值读写走 .text,按钮调 .press,复选框读 .selected,表格单元格另有专用方法,功能键用 sendVKey 发,0 是回车,8 是 F8,11 是保存,进事务可以直接调 session.startTransaction("SE16"),比模拟命令字段干净。每执行一步,把屏幕状态读回来给模型,循环到任务收尾。

会话与弹窗才是翻车点

Agent 最容易栽在交互上。wnd[0] 是主窗口,系统弹出的对话框从 wnd[1] 起,再往上是 wnd[2]。判断走到哪一步,读状态栏就够用,wnd[0]/sbar 的 text 给消息内容,messageType 里 S 是成功,E 是报错,W 是警告,再配 session.Info.TransactionName 就知道当前停在哪个事务,跟人操作时瞄一眼状态栏是一个道理。

弹窗要主动探测。findById 有第二个参数,传 false 时控件不存在就返回空而不是抛异常,Agent 拿它先探 wnd[1] 再决定动作。大多数确认弹窗的两个按钮 id 是 wnd[1]/usr/btnSPOP-OPTION1 和 btnSPOP-OPTION2,前者对应左边那个确定键。

一个会话同时只能有一个操作者,脚本跑着的时候人别碰那个窗口。要并行就多开会话,命令字段里 /o 加事务码会新开一个窗口,每个用户能开的会话数由参数 rdisp/max_alt_modes 封顶,满了再 /o 新开窗口会被系统弹窗拒绝,只能关掉一个现有会话腾位置,或者复用已有的。

边界与风险先摆到桌面上

先说平台。这套 API 只长在 Windows 版 SAP GUI 里,Java 版客户端和浏览器里的 WebGUI 都没有脚本接口,Agent 的执行端只能落在装了 GUI 的 Windows 机器上,要么本机直跑,要么远程桌面进一台跳板机。

性能上要有预期。每步操作都等一轮屏幕往返,ALV 表格里几千行数据逐行取值会很慢,拿它当批量抽数的通道会很难受。数据类需求优先走 RFC 或 OData,GUI Scripting 留给只有屏幕操作、没有现成 BAPI 的事务。

脚本本身也脆。findById 撞的是屏幕元素路径,如果后续打了支持包、屏幕改版,路径一变脚本就断,所以每步回读状态再往下走,比一口气重放整段录好的脚本稳得多。

安全上要当真,因为脚本动用的是登录账号的全部权限,Agent 点错保存就是真实的业务单据。给它配专用对话用户,权限刚好够跑目标事务,既方便事后审计,也缩小事故面。不过还有一层,scripting 开着的时候本机任何 COM 程序都能驱动这份 GUI,跳板机保持专用,别混跑来路不明的程序。

第一个落地的任务建议选只读,比如让 Agent 每天早上跑一遍 SE16 抽几张业务表的新增行数,结果回报到群里。这一步跑顺了再去碰带写操作的事务,当然到那时候审批和复核也该跟上。

本文首发于 sapzx.com,版权归 河.南.赛.锐.信.息.科.技.有.限.公.司 所有,未经授权请勿转载。

滚动至顶部