导出 SAP 单个表或者多表 JOIN 的数据

作者:ABAP老白 约 7 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, MM, 开发, 数据工程, 物料管理
导出 SAP 单个表或者多表 JOIN 的数据 - 封面图
导出 SAP 单个表或者多表 JOIN 的数据 - 封面图

如果你是一个ABAPer,肯定经历过模块顾问找你帮忙导出表的数据。相同,如果你是一个模块顾问,肯定也让开发帮忙导出过单表或者需要多表JOIN的数据。原因无他,如果导出单表数据,且数据量不大的情况下,随随便便用SE16就能导出来了,但是如果数据一旦上了百万数量级,或者需要好几个表JOIN组合才能获取需要的数据,或者导出几十万条指定条件的数据,这个时候导出就变成一个挺麻烦的事儿了,往往就需要开发的同事帮忙写一个程序来干这个事儿。

这种事儿干的多了,干脆就写了一个专门导出数据的程序,让模块顾问自己导出。单表数据的导出就不用说了,就像呼吸和喝水那么简单,需要JOIN的比较复杂的导出,在稍加学习后也能自行完成,效果很好。

程序界面:

导出 SAP 单个表或者多表 JOIN 的数据 - 封面图
导出 SAP 单个表或者多表 JOIN 的数据 - 封面图

功能说明:

1、可以导出单个表的指定字段,在导出的时候可以指定WHERE条件,或者是指定某一个字段的批量值。

2、可以导出复杂SQL的数据,同样可以指定某个字段的批量数据值

3、输出方式可以直接ALV输出,或者下载到本机,或者存到应用服务器上

4、可以选择标题使用字段描述还是字段名

5、可以选择是否把数据转为外部格式,比如去掉前导零什么的

6、如果是下载到本机或者存储到应用服务器,可以选择是否压缩保存

7、如果保存到服务器,可以选择是否后台执行

使用示例:

比如要导出指定物料的,6开头的工厂的数据,需要导出的字段是物料、基本单位、物料组、物料描述、MRP控制者、工厂、库存地、非限制数量。 这些数据 需要

在MARA、MAKT、MARC、MARD 这四个表 取数 ,如果使用 SE 16 挨个导出再组合起来 会非常麻烦。

使用程序来导出就很简单了。

首先写出来SQL,注意不需要写INTO语句:

SELECT mara~matnr mara~meins mara~matkl makt~maktx marc~dispo mard~werks mard~lgort mard~labst FROM mara INNER JOIN marc ON marc~matnr = mara~matnr INNER JOIN mard ON mard~matnr = marc~matnr AND mard~werks = marc~werks LEFT JOIN makt ON makt~matnr = mara~matnr AND makt~spras = sy-langu WHERE marc~werks LIKE '6%'.

导出程序的选择界面先选择“使用SQL语句取数”,然后把SQL贴进去:

导出 SAP 单个表或者多表 JOIN 的数据 - 封面图
导出 SAP 单个表或者多表 JOIN 的数据 - 封面图

因为指定的物料号码,所以需要把指定的物料号粘贴进去

导出 SAP 单个表或者多表 JOIN 的数据 - 封面图
导出 SAP 单个表或者多表 JOIN 的数据 - 封面图
导出 SAP 单个表或者多表 JOIN 的数据 - 封面图
导出 SAP 单个表或者多表 JOIN 的数据 - 封面图
导出 SAP 单个表或者多表 JOIN 的数据 - 封面图
导出 SAP 单个表或者多表 JOIN 的数据 - 封面图
导出 SAP 单个表或者多表 JOIN 的数据 - 封面图
导出 SAP 单个表或者多表 JOIN 的数据 - 封面图

代码如下:

*&---------------------------------------------------------------------**& Report ZEXPORTDBDATA*&*&---------------------------------------------------------------------**& Baitianzhen*& 导出表内容*&---------------------------------------------------------------------*REPORT zexportdbdata NO STANDARD PAGE HEADING.

TABLES: dd03l,dfies,ddseselopt.DATA: gt_fldct TYPE lvc_t_fcat, gt_fldcd TYPE lvc_t_fcat, gv_title TYPE lvc_title, gs_slayt TYPE lvc_s_layo, gv_whstr TYPE string, gv_xstr TYPE xstring, char255 TYPE char255, gv_prog TYPE char8.DATA: gt_dd03 TYPE TABLE OF dd03p WITH HEADER LINE.DATA: gt_dynp TYPE TABLE OF dynpread WITH HEADER LINE.DATA: gt_flds TYPE TABLE OF rffld WITH HEADER LINE.DATA: gx_root TYPE REF TO cx_root, gv_emsg TYPE char200.DATA: gr_out TYPE REF TO data.FIELD-SYMBOLS: <fs_out> TYPE STANDARD TABLE. SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE bt1. PARAMETERS: pr_tab RADIOBUTTON GROUP g1 USER-COMMAND uc1 DEFAULT 'X'. PARAMETERS: pr_sql RADIOBUTTON GROUP g1. PARAMETERS: p_tabnam TYPE dd03l-tabname MODIF ID a. SELECT-OPTIONS s_flds FOR dd03l-fieldname NO INTERVALS MODIF ID b. SELECT-OPTIONS s_wstr FOR char255 NO INTERVALS LOWER CASE MODIF ID c. SELECT-OPTIONS s_sqls FOR char255 NO INTERVALS MODIF ID d. PARAMETERS p_lfld TYPE fieldname VISIBLE LENGTH 18. SELECT-OPTIONS s_limt FOR ddseselopt-low NO INTERVALS.SELECTION-SCREEN END OF BLOCK b1. SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE bt2. PARAMETERS pr_oalv RADIOBUTTON GROUP typ USER-COMMAND uc1 DEFAULT 'X'. PARAMETERS pr_oloc RADIOBUTTON GROUP typ. PARAMETERS pr_oser RADIOBUTTON GROUP typ.SELECTION-SCREEN END OF BLOCK b2. SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE bt3. PARAMETERS: p_fldnam AS CHECKBOX DEFAULT 'X'. PARAMETERS: p_conver AS CHECKBOX DEFAULT 'X'. PARAMETERS: p_usezip AS CHECKBOX DEFAULT 'X' MODIF ID z. PARAMETERS: p_usejob AS CHECKBOX MODIF ID j.SELECTION-SCREEN END OF BLOCK b3. SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE bt4. SELECTION-SCREEN COMMENT /1(79): txt001,txt002,txt003,txt004,txt005,txt006,txt007. SELECTION-SCREEN COMMENT /1(79): txt008,txt009,txt010,txt011,txt012,txt013,txt014.SELECTION-SCREEN END OF BLOCK b4. AT SELECTION-SCREEN OUTPUT. bt1 = '一般选择条件'. bt2 = '输出选项'. bt3 = '其他选项'. bt4 = '程序使用说明:'. %_pr_tab_%_app_%-text = '在单个表取数'. %_pr_sql_%_app_%-text = '使用SQL语句取数'. %_s_sqls_%_app_%-text = 'SQL语句(每行长度不要超过255字符)'. %_p_tabnam_%_app_%-text = '数据库表或者视图'. %_s_flds_%_app_%-text = '要导出的的字段(按F4选择)'. %_s_wstr_%_app_%-text = 'WHERE条件(每行长度不要超过255字符)'. %_pr_oalv_%_app_%-text = 'ALV显示'. %_pr_oloc_%_app_%-text = '保存到本地文本文件'. %_pr_oser_%_app_%-text = '保存到服务器文件'. %_p_usejob_%_app_%-text = '后台执行'. %_p_fldnam_%_app_%-text = '标题使用字段名'. %_p_conver_%_app_%-text = '转换数据为外部格式'. %_p_usezip_%_app_%-text = '压缩为ZIP文件下载'. txt001 = `1、首先填写要导出的表名,然后F4选择需要导出的列`. txt002 = `2、WHERE条件可以为空,如填写,形如:matnr = 'ABC' and werks like '100%' and erdat > '20171021'`. txt003 = `3、如果输出到服务器文件,可以使用事务码CG3Y下载生成的文件。如果有多个实例,请登录到对应的服务器后下载`. txt004 = `4、如果勾中后台执行,请使用SM37查看执行进度`. txt005 = `5、如果勾选"转换数据为外部格式",数据会转换为外部格式显示/导出`. txt006 = `6、会自动删除字段内的制表符、回车换行符、换行符`. txt007 = `7、下载下来的文本文件为UTF8编码,可以使用Excel的“数据”-“自文本”功能导入到Excel`. txt008 = `8、如果使用SQL语句取数,语法符合OPEN SQL语法,不需要写INTO语句,格式为:`. txt009 = ` SELECT `. txt010 = ` mara~matnr `. txt011 = ` makt~maktx `. txt012 = ` FROM mara INNER JOIN makt ON mara~matnr = makt~matnr AND`. txt013 = ` makt~spras = sy-langu`. txt014 = ` WHERE mara~matnr LIKE '%A'. "最后面有个点`. IF pr_tab = 'X'. %_p_lfld_%_app_%-text = '限制值字段(字段名)'. %_s_limt_%_app_%-text = '限制值(F4输入)'. ELSE. %_p_lfld_%_app_%-text = '限制值字段(表名~字段名)'. %_s_limt_%_app_%-text = '限制值(F4输入)'. ENDIF. LOOP AT SCREEN. CASE 'X'. WHEN pr_tab. IF screen-group1 CA 'D'. screen-active = '0'. ENDIF. WHEN pr_sql. IF screen-group1 CA 'ABC'. screen-active = '0'. ENDIF. ENDCASE. CASE 'X'. WHEN pr_oalv. IF screen-group1 CA 'JZ'. screen-active = '0'. ENDIF. WHEN pr_ol

...

ABAP老白

关于作者:ABAP老白

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「导出SAP单个表或者多表JOIN的数据.md」整理生成,仅用于内部技术分享与学习交流。