SAP GUI 是 SAP 的通用客户端,用于访问 SAP 应用程序中提供的开发和业务功能,例如 SAP ERP、SAP Business Suite(SAP CRM、SAP SCM 和 SAP PLM)、SAP Business Intelligence 等。 SAP GUI 既是 SAP 应用的开发环境,也是运行环境。它从 SAP 服务器获取信息,例如在其窗口中需要显示的信息,在何时,何处,以及以什么样的方式来显示。
本文给大家分享笔者使用 SAP GUI 进行开发这些年来,积累的一些实用技巧。
使用 SAP GUI 绘制图形
国内 80 后上的编程课应该都学过Logo这门编程语言:
Logo 语言是一门专门设计用来进行编程教学的语言,于 1967 年由 Wally Feurzeig, Seymour Papert和Cynthia Solomon发明。
下图是用 Logo 语言画出来的图案。
同样,在 SAP GUI 里内发现有一个非常古老的 ABAP 包,最后一次修改已经是 22 年前的 1995 年了。这比 SAP 成都研究院很多新同事的年龄都要大。
这个包提供了一个 HPGL 接口。Hewlett-Packard Graphics Language,简称为 HPGL,是一种打印机控制语言,由Hewlett-Packard设计。
下面是我用 ABAP 代码写的一个 HPGL 控制台,可以调用函数 GRAPH_HPGL,像小时候使用Logo 语言那样在屏幕上作图。
REPORT z.
DATA: go_text_edit TYPE REF TO cl_gui_textedit,
go_cust_container TYPE REF TO cl_gui_custom_container,
ok_code TYPE sy-ucomm.
DATA lt_text(256) TYPE c OCCURS 0.
DATA: BEGIN OF lt_hpgl OCCURS 1,
entry(128),
END OF lt_hpgl.
CALL SCREEN 0101.
MODULE status_0101 OUTPUT.
SET PF-STATUS 'JERRY_CONSOLE'.
SET TITLEBAR 'JERRY_TITLEBAR'.
IF go_cust_container IS INITIAL.
go_cust_container = NEW #( container_name = 'CUSTOM_CONTROL' ).
CREATE OBJECT go_text_edit
EXPORTING
parent = go_cust_container
wordwrap_mode = cl_gui_textedit=>wordwrap_at_fixed_position
wordwrap_to_linebreak_mode = cl_gui_textedit=>false.
ENDIF.
ENDMODULE.
MODULE user_command_0101 INPUT.
ok_code = sy-ucomm.
CASE ok_code.
WHEN 'BACK' OR 'QUIT' OR 'EXIT'.
LEAVE TO SCREEN 0.
WHEN 'EXECUTE'.
CLEAR: lt_text, lt_hpgl[].
go_text_edit->get_text_as_r3table( IMPORTING table = lt_text ).
LOOP AT lt_text ASSIGNING FIELD-SYMBOL().
APPEND INITIAL LINE TO lt_hpgl ASSIGNING FIELD-SYMBOL().
-entry = .
ENDLOOP.
CALL FUNCTION 'GRAPH_HPGL'
TABLES
data = lt_hpgl.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
Screen 101 的 PBO 和 PAI 模块:
Screen 101 的界面布局,需要手工创建一个名为 CUSTOM_CONTROL
的控件。
屏幕状态:
执行这个 report,点击 Load Local file,从本地加载 Doraemon.txt 文件,内容可以从我的github下载:
执行之后,位于本地安装目录下的 gnhpx.exe 文件会根据 txt 里的指令进行图形渲染:
C:\Program Files (x86)\SAP\FrontEnd\SAPgui\gnhpx.exe
如果一切正常工作,可以看到一只渲染好的机器猫(哆啦A梦)。
关于 HPGL 的语法手册,可以在这个网站上查阅:
http://www.isoplotec.co.jp/HPGL/eHPGL.htm
如何通过一个 SAP GUI 屏幕反查这个屏幕对应的事务码
假设我通过某种跳转方式打开了下图这个 SAP GUI的屏幕,但我想搞清楚用哪一个事务码可以直接到达这个屏幕,而不通过繁琐的点击,应该怎么做?
步骤1,点击 Order 字段,按 F1 打开帮助界面,
点上图的图标显示技术信息,得到了实现这个屏幕的程序名称:SAPLCOCU:
双击程序名,进入程序实现,再点击这个图标:
从而打开了这个程序所属的 function group COCU,其对应的 ABAP 包为 CO:
在这个 package CO 里,终于找到了我想要知道的事务码名称:CO01/02/03, 用于操作S/4HANA 里的 production order 即生产订单。
SAP GUI 系统登录页面配置的 SAProuter 功能讲解
大家在安装完 SAP GUI 后,准备添加系统列表进行登录时,注意过这个 SAP router 字段么?
从 SAP 的帮助文档上可以找到 SAProuter 的定义:
SAProuter is an SAP program that acts as an intermediate station (proxy) in a network connection between SAP systems, or between SAP systems and external networks. SAProuter controls the access to your network, and, as such, is a useful enhancement to an existing firewall system (port filter).
Figuratively, the firewall forms an impenetrable “wall”around your network. However, since particular types of connections need to penetrate this wall, a “gate”has to be made in the firewall. SAProuter assumes control of this gate.
In short, SAProuter provides you with the means of controlling access to your SAP system.
SAProuter 是一个 SAP 发布的应用,在 SAP 系统与系统之间,SAP 系统与外部网络之间扮演着代理的角色。SAProuter 能实现对 SAP 系统的访问控制,是企业防火墙的有效补充。
如下图所示,部署于企业局域网的客户端 SAP GUI 进行系统登录,登录请求通过局域网内的 SAP router 转发到 Internet 网络上的另一台 SAP Router,再转发给部署于企业内网的 ERP 服务器。
上述描述的场景里,形象的说好比在 ERP 服务器所在的企业内网和 SAP GUI 的客户端所在的内网打了两个洞,在洞里部署两台 SAP router,确保只有受限的网络请求能够进出这两个被防火墙保护的安全网络。
这种 打洞
的思路,在 SAP 另一款解决方案:SAP Cloud Connector 里有类似的用法:
我们可以把用 SAP GUI 登录系统的快捷方式保存到本地,下次双击即可直接用 SAP GUI 登入系统:
用记事本打开,发现这些 .sap
文件的内容如下:
我们主要观看红色高亮部分,其中 H 表示主机名,S 表示服务即 Service.
总结
SAP GUI 是 SAP 的通用客户端,用于访问 SAP 应用程序中提供的开发和业务功能,它既是 SAP 应用的开发环境,也是运行环境。本文分享了笔者使用 SAP GUI 工作多年积累的一些使用小技巧,例如使用 SAP GUI 绘制简单的矢量图,根据一个屏幕反查该屏幕对应事物码,以及 SAP Router 的概念解析。