厌倦了SE11/SE16N? 告诉你如何在Excel中查看SAP的表数据

SAP 提供 SE11 / SE16 / SE16N 查看表数据,SE11 首先进入的是表结构界面,然后再跳转到选择屏幕,在界面中输入选择条件运行,或直接运行,才能看到表数据。如果表设置了表维护生成器 (Table maintenance generator),可以使用事务码 SM30 查看和维护表数据。以上这些方法,有一个共同的问题:SAP的数据展示界面和维护,基于 SAP List Viewer 或者 ALV Control ,具备基本的数据操作功能,比如排序、筛选、数字型字段求和等,但复杂的加工处理不得不借助于 Excel 。而且,利用 SAP 标准功能导出到导出到 Excel,数据并不能直接使用,格式也还需要继续加工,重复执行这些操作是不是很浪费时间?

如果朋友们希望充分利用 Excel 的强大功能,并且在 Excel 中查看 SAP 的表数据,不妨参考本博客即将介绍的三种方法。三种方法实现的难度不同,有着各自不能的使用场景。掌握这些方法,可以做出很多意想不到的解决方案。

利用 RFC 在 Excel 中查看 SAP 表数据

第一种方法,在 Excel 中通过 VBA 并利用 SAP ActiveX 控件,从 SAP 系统获取数据。我们知道 SAP 有一个通用的读取数据表数据和结构的函数 RFC_READ_TABLE ,但该函数有较多限制,比如:

  • 获取列的字段所有字符不能超过 512 个字符
  • FLOAT 类型数据可能引发 ASSIGN_BASE_WRONG_ALIGNMENT 异常

(参考: Working around limitations of TableReader / RFC_READ_TABLE Symptoms)

所以,如果想从外部获取 SAP 数据,并不建议直接使用这个函数。如果要获取的表示固定的,可以自定义一个函数,比如要获取 SKA1 表的数据,自定义一个函数 Z_SKA1_READ:


为了能在外部访问,需要勾上Remote-Enabled Module 选项。另外函数提供 Importing 参数,允许对 COA (KTOPL) 字段进行筛选,如下图:

Tables 参数用于导出表的数据,将其名称定义为 content:

FM 的代码如下:


这样,我们就可以在 Excel 中通过 VBA 获取 SKA1 表的数据。VBA 使用 RFC的方法和细节,我之前写过系列博客,有需要请参考:

本篇只给出 VBA 调用 Z_SKA1_READ 函数的完整代码:


不知道是不是因为 GUI 升级到 750 原因,itab.data 属性返回值为空,所以在将数据写入到 Excel worksheet 的时候,只能用循环的方式读取。本文对代码不再重复说明。

刚才的函数读取指定表的数据,如果需要读取的每一个数据表都需要定义一个函数,灵活性也不够,对吧。在 SQL 使用动态条件不难,但 FM 返回值貌似不能动态,我查看和思考了 RFC_READ_TABLE 函数,其返回值是放在一个行为 CHAR512 的表中,分隔符由调用函数来指定,估计也是由于这个原因。所以这种方法不方便实现任意表的数据导出,我将在另外两种方法中说明如何导出任意表的数据。

ABAP Restful API

通过 Restful API 暴露数据,好处符合最新 IT 技术趋势,使用 Http 协议,各种语言都可以处理,无其它依赖条件。如果使用 Excel 2013 之后的版本,Power Queryt 提供对网站数据的解析,处理 json 数据轻而易举,不用编写代码。

SAP 提供 Restful API 的方法请参考我之前写的文章:

在 ABAP 中实现 ABAP Restful API 的过程简要说明如下:
1、通过事务码 SE24 创建一个类,将类命名为 ZCL_READ_TABLE,实现 IF_HTTP_EXTENSION 接口,实现接口的 HANDLE_REQUEST 方法,假设我们只需要读取 SKA1 表的数据,可编写如下代码:

2、通过事务码 SICF 定义服务,在默认的 sap 节点下新建 ztables 节点:


双击 ztables 节点,如果不需要客户端输入账号和密码,在 logon 页签中设置默认的用户名称和密码。关键是和刚才的 class 关联,切换到 Handler list 页签,设置处理器为 ZCL_READ_TABLE:


回到上一界面,选中 ztables,右键,激活 ztables 节点对应的服务。在 SICF 界面检查 SAP 服务器是否开启,端口多少(菜单:Go to -> ICM Monitor)。如果一切 OK,在客户端就可以访问 SAP Restful Service。比如网址可能为:http://sapecc6:8000/sap/ztables/ska1

我们当然不满足只能查看一个表的数据,接下来,我们改写代码,运行客户端按下面的 url 格式发送请求:

http://sapecc6:8000/sap/ztables?tablename=t030

根据 query string - tablename 来指定要查询的表名,从而实现任意表数据的查询。进入 zcl_read_table 类将代码改写如下:

接下来,演示如何在 Excel 中消费 SAP Restful Service,不展开操作细节。Power Query 我之前也写过系列博客,请自行参考。这种方法的好处是在 Excel 中不用编写代码,并且数据处理的灵活性比较高。

在 Excel 界面中,切换到【数据】页签,通过【获取数据】 选项,选择自其他源自网站,在弹出对话框中,输入 http://sapecc6:8000/sap/ztables?tablename=SKA1


点击确定按钮,进入 Power Query 编辑器界面,选中列表,右键,选择菜单项:到表


点击右上角展开按钮,对数据进行展开:

然后将数据加载到 Excel 工作表,就可以在 Excel 工作表中查看 ska1 表的数据,支持刷新

XXL_SIMPLE_API 函数

XXL_SIMPLE_API 实现将 internal table 的数据导出到 Excel,相对而言,比 OLE 和 DOI 技术更加简单。但每次导出时,弹出对话框,略显不便。

为了使用这个函数,需要先定义 3 个内表,最重要的是根据 gxxlt_v 结构创建内表,代表要在 Excel 显示的数据的表头 (heading)。这个结构和导出数据的 internal table 的字段数必须相同。

假设我们需要导出 SAP 的示例数据表 spfli 的内容,根据该表的字段定义一个内表:

定义一个填充 gt_gxxlt_v 内表的子例程:

然后调用 XXL_SIMPLE_API 函数,将内表的数据导出到 Excel:

image

完整代码如下:

讲解了导出一个 table 的方式后,接下来我们看看如何实现允许用户根据指定表名导出任意表的数据。为了实现复用,我们用函数来实现,函数名为 Z_TABLE_TO_EXCEL。

以下是参数的界面:

  • I_TABLENAME: 表名
  • I_OPTIONS: 用 Open SQL 方式对数据进行筛选
  • I_SORT: 用 Open SQL 方式对字段进行排序

定义如下 Exceptions:



以下是 FM 的完整代码:

函数的用法比较简单,利用 SE37 测试如下:

源代码

源码放在 github - SAP Table Export to Excel

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342