如果你是一个ABAPer,肯定经历过模块顾问找你帮忙导出表的数据。相同,如果你是一个模块顾问,肯定也让开发帮忙导出过单表或者需要多表JOIN的数据。原因无他,如果导出单表数据,且数据量不大的情况下,随随便便用SE16就能导出来了,但是如果数据一旦上了百万数量级,或者需要好几个表JOIN组合才能获取需要的数据,或者导出几十万条指定条件的数据,这个时候导出就变成一个挺麻烦的事儿了,往往就需要开发的同事帮忙写一个程序来干这个事儿。
这种事儿干的多了,干脆就写了一个专门导出数据的程序,让模块顾问自己导出。单表数据的导出就不用说了,就像呼吸和喝水那么简单,需要JOIN的比较复杂的导出,在稍加学习后也能自行完成,效果很好。
程序界面:
功能说明:
1、可以导出单个表的指定字段,在导出的时候可以指定WHERE条件,或者是指定某一个字段的批量值。
2、可以导出复杂SQL的数据,同样可以指定某个字段的批量数据值
3、输出方式可以直接ALV输出,或者下载到本机,或者存到应用服务器上
4、可以选择标题使用字段描述还是字段名
5、可以选择是否把数据转为外部格式,比如去掉前导零什么的
6、如果是下载到本机或者存储到应用服务器,可以选择是否压缩保存
7、如果保存到服务器,可以选择是否后台执行
使用示例:
比如要导出指定物料的,6开头的工厂的数据,需要导出的字段是物料、基本单位、物料组、物料描述、MRP控制者、工厂、库存地、非限制数量。这些数据需要在MARA、MAKT、MARC、MARD这四个表取数,如果使用SE16挨个导出再组合起来会非常麻烦。
使用程序来导出就很简单了。
首先写出来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贴进去:
因为指定的物料号码,所以需要把指定的物料号粘贴进去
代码如下:
*&---------------------------------------------------------------------*
*& 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_oloc.
IF screen-group1 CA 'J'.
screen-active = '0'.
ENDIF.
WHEN pr_oser.
ENDCASE.
IF 'S_FLDS-LOW S_LIMT-LOW' CS screen-name.
screen-input = '0'.
ENDIF.
IF screen-name = 'TXT011' OR screen-name = 'TXT010'.
screen-intensified = '1'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_flds-low.
CLEAR gt_dynp[].
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = sy-repid
dynumb = sy-dynnr
request = 'A'
TABLES
dynpfields = gt_dynp.
READ TABLE gt_dynp WITH KEY fieldname = 'P_TABNAM'.
IF sy-subrc = 0 AND gt_dynp-fieldvalue NE ''.
p_tabnam = gt_dynp-fieldvalue.
TRANSLATE p_tabnam TO UPPER CASE.
PERFORM get_dd03p.
PERFORM tabfld_f4.
LEAVE SCREEN.
ELSE.
MESSAGE s000(oo) WITH '请输入表名'.
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_limt-low.
CLEAR gt_dynp[].
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = sy-repid
dynumb = sy-dynnr
request = 'A'
TABLES
dynpfields = gt_dynp.
READ TABLE gt_dynp WITH KEY fieldname = 'P_LFLD'.
IF sy-subrc = 0 AND gt_dynp-fieldvalue NE ''.
p_lfld = gt_dynp-fieldvalue.
TRANSLATE p_lfld TO UPPER CASE.
PERFORM get_range USING p_lfld.
LEAVE SCREEN.
ELSE.
MESSAGE s000(oo) WITH '请输入表名和限制字段名'.
ENDIF.
AT SELECTION-SCREEN.
IF sy-ucomm = 'ONLI'.
PERFORM checkinput.
ENDIF.
START-OF-SELECTION.
IF p_usejob = 'X' AND sy-batch = '' AND pr_oser = 'X'.
PERFORM submitjob USING 'X'.
ELSE.
PERFORM savelog(zreplog) USING sy-repid '' IF FOUND.
PERFORM get_flds.
PERFORM create_itab.
PERFORM getdata.
PERFORM updatelog(zreplog) IF FOUND.
PERFORM output.
ENDIF.
*&---------------------------------------------------------------------*
*& checkinput
*&---------------------------------------------------------------------*
FORM checkinput.
IF pr_tab = 'X' AND ( s_flds[] IS INITIAL OR p_tabnam IS INITIAL ).
MESSAGE e000(oo) WITH '请输入表名并选择输出字段'.
ENDIF.
IF pr_sql = 'X' AND s_sqls[] IS INITIAL.
MESSAGE e000(oo) WITH '请输入SQL语句'.
ENDIF.
IF p_lfld IS INITIAL.
CLEAR s_limt[].
ENDIF.
ENDFORM. "checkinput
*&---------------------------------------------------------------------*
*& get_range
*&---------------------------------------------------------------------*
FORM get_range USING pv_lfld.
DATA: lv_selid LIKE rsdynsel-selid,
lt_fields TYPE TABLE OF rsdsfields WITH HEADER LINE,
lt_range TYPE TABLE OF rsds_range WITH HEADER LINE,
lw_frange TYPE rsds_frange.
CHECK pv_lfld IS NOT INITIAL.
IF pr_tab = 'X'.
lt_fields-tablename = p_tabnam.
lt_fields-fieldname = pv_lfld.
ELSE.
SPLIT pv_lfld AT '~' INTO lt_fields-tablename lt_fields-fieldname.
ENDIF.
APPEND lt_fields.
CALL FUNCTION 'FREE_SELECTIONS_INIT'
EXPORTING
kind = 'F'
IMPORTING
selection_id = lv_selid
TABLES
fields_tab = lt_fields
EXCEPTIONS
area_no_field = 19.
IF sy-subrc = 0.
CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
EXPORTING
selection_id = lv_selid
as_window = 'X'
tree_visible = ''
IMPORTING
field_ranges = lt_range[]
TABLES
fields_tab = lt_fields
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
READ TABLE lt_range INDEX 1.
READ TABLE lt_range-frange_t INTO lw_frange INDEX 1.
s_limt[] = lw_frange-selopt_t[].
READ TABLE s_limt INDEX 1.
ENDIF.
ELSE.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "get_range
*&---------------------------------------------------------------------*
*& get_flds
*&---------------------------------------------------------------------*
FORM get_flds.
DATA: BEGIN OF lt_sql OCCURS 0,
line TYPE text255,
END OF lt_sql.
DATA: sqlstr TYPE string.
IF pr_tab = 'X'.
PERFORM get_dd03p.
LOOP AT s_flds WHERE low NE ''.
gt_flds-tname = p_tabnam.
gt_flds-fname = s_flds-low.
COLLECT gt_flds.
READ TABLE gt_dd03 WITH KEY fieldname = s_flds-low.
IF sy-subrc NE 0.
MESSAGE s000(oo) WITH '字段错误:' s_flds-low.
STOP.
ENDIF.
ENDLOOP.
ELSE.
LOOP AT s_sqls.
TRANSLATE s_sqls-low TO UPPER CASE.
CONCATENATE sqlstr s_sqls-low INTO sqlstr SEPARATED BY space.
ENDLOOP.
SPLIT sqlstr AT space INTO TABLE lt_sql.
LOOP AT lt_sql.
IF lt_sql-line CS `FROM `.
EXIT.
ENDIF.
CHECK lt_sql-line CS '~'.
SPLIT lt_sql-line AT '~' INTO gt_flds-tname gt_flds-fname.
APPEND gt_flds.
ENDLOOP.
IF gt_flds[] IS INITIAL.
MESSAGE s000(oo) WITH 'SQL语句错误,未找到表和字段。' '请使用 表名~字段名 的格式'.
STOP.
ENDIF.
ENDIF.
ENDFORM. "get_flds
*&---------------------------------------------------------------------*
*& create_itab
*&---------------------------------------------------------------------*
FORM create_itab.
LOOP AT gt_flds WHERE fname NE ''.
IF p_fldnam = ''.
CALL FUNCTION 'C_DD_READ_FIELD'
EXPORTING
i_tabname = gt_flds-tname
i_fieldname = gt_flds-fname
IMPORTING
e_dfies = dfies
EXCEPTIONS
OTHERS = 4.
ELSE.
dfies-fieldtext = gt_flds-fname.
ENDIF.
PERFORM catset1 TABLES gt_fldct
USING gt_flds-fname
gt_flds-tname
gt_flds-fname
dfies-fieldtext.
ENDLOOP.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = gt_fldct
IMPORTING
ep_table = gr_out.
ASSIGN gr_out->* TO <fs_out>.
ENDFORM. "create_itab
*&---------------------------------------------------------------------*
*& getdata
*&---------------------------------------------------------------------*
FORM getdata.
LOOP AT s_wstr.
CONCATENATE gv_whstr s_wstr-low INTO gv_whstr SEPARATED BY space.
ENDLOOP.
IF s_limt[] IS NOT INITIAL AND p_lfld IS NOT INITIAL.
IF gv_whstr IS INITIAL.
CONCATENATE p_lfld 'IN S_LIMT' INTO gv_whstr SEPARATED BY space.
ELSE.
CONCATENATE p_lfld 'IN S_LIMT AND' gv_whstr INTO gv_whstr SEPARATED BY space.
ENDIF.
ENDIF.
TRY.
IF pr_tab = 'X'.
SELECT * INTO CORRESPONDING FIELDS OF TABLE <fs_out>
FROM (p_tabnam)
WHERE (gv_whstr).
ELSE.
PERFORM generate.
PERFORM getsqldata IN PROGRAM (gv_prog) TABLES <fs_out> s_limt.
ENDIF.
CATCH cx_root INTO gx_root.
gv_emsg = gx_root->get_text( ).
MESSAGE s000(oo) WITH gv_emsg(50) gv_emsg+50(50) gv_emsg+100(50) DISPLAY LIKE 'E'.
STOP.
ENDTRY.
ENDFORM. "getdata
*&---------------------------------------------------------------------*
*& output
*&---------------------------------------------------------------------*
FORM output.
DATA: lv_file TYPE string,
lv_guid TYPE guid_22.
IF <fs_out> IS INITIAL.
MESSAGE s000(oo) WITH '无数据'.
RETURN.
ENDIF.
CALL FUNCTION 'GUID_CREATE'
IMPORTING
ev_guid_22 = lv_guid.
IF p_usezip = ''.
CONCATENATE lv_guid '.txt' INTO lv_file.
ELSE.
CONCATENATE lv_guid '.zip' INTO lv_file.
ENDIF.
CASE 'X'.
WHEN pr_oalv.
PERFORM alv_out.
WHEN pr_oloc.
PERFORM itab2xstr TABLES <fs_out> gt_fldct
USING p_usezip p_conver
CHANGING gv_xstr.
PERFORM download USING gv_xstr lv_file.
WHEN pr_oser.
PERFORM itab2xstr TABLES <fs_out> gt_fldct
USING p_usezip p_conver
CHANGING gv_xstr.
PERFORM xstr2dataset USING gv_xstr lv_file.
ENDCASE.
ENDFORM. "output
*&---------------------------------------------------------------------*
*& alv_out
*&---------------------------------------------------------------------*
FORM alv_out.
DATA: lv_dbcnt TYPE i.
gs_slayt-zebra = 'X'.
gs_slayt-cwidth_opt = 'X'.
lv_dbcnt = lines( <fs_out> ).
gv_title = lv_dbcnt && '条数据'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
it_fieldcat_lvc = gt_fldct
i_grid_title = gv_title
is_layout_lvc = gs_slayt
TABLES
t_outtab = <fs_out>
EXCEPTIONS
OTHERS = 1.
ENDFORM. "alv_out
*&---------------------------------------------------------------------*
*& catset1
*&---------------------------------------------------------------------*
FORM catset1 TABLES t_fldcat USING pv_field pv_reftab pv_reffld pv_text.
DATA: ls_fldcat TYPE lvc_s_fcat.
ls_fldcat-fieldname = pv_field.
ls_fldcat-reptext = pv_text.
ls_fldcat-coltext = pv_text.
ls_fldcat-colddictxt = 'R'.
ls_fldcat-ref_table = pv_reftab.
ls_fldcat-ref_field = pv_reffld.
ls_fldcat-col_opt = 'A'.
APPEND ls_fldcat TO t_fldcat.
CLEAR ls_fldcat.
ENDFORM.
*&---------------------------------------------------------------------*
*& itab2xstr
*&---------------------------------------------------------------------*
FORM itab2xstr TABLES intab fldcat STRUCTURE lvc_s_fcat
USING zip convert
CHANGING outxstr.
DATA: lv_str TYPE string,
allstr TYPE string,
tmpstr TYPE string,
char TYPE char1024,
xstr TYPE xstring,
izip TYPE REF TO cl_abap_zip.
FIELD-SYMBOLS: <fs_wa>,<fs_fld>.
LOOP AT fldcat WHERE no_out = ''.
CONCATENATE allstr %_horizontal_tab fldcat-coltext INTO allstr.
ENDLOOP.
SHIFT allstr.
CONCATENATE allstr %_cr_lf INTO allstr.
LOOP AT intab ASSIGNING <fs_wa>.
CLEAR lv_str.
LOOP AT fldcat WHERE no_out = ''.
ASSIGN COMPONENT fldcat-fieldname OF STRUCTURE <fs_wa> TO <fs_fld>.
IF <fs_fld> IS INITIAL.
CONCATENATE lv_str %_horizontal_tab INTO lv_str.
ELSE.
IF convert = ''.
tmpstr = <fs_fld>.
CONCATENATE lv_str %_horizontal_tab tmpstr INTO lv_str.
ELSE.
WRITE <fs_fld> TO char LEFT-JUSTIFIED.
CONCATENATE lv_str %_horizontal_tab char INTO lv_str.
ENDIF.
ENDIF.
ENDLOOP.
SHIFT lv_str.
CONCATENATE allstr lv_str %_cr_lf INTO allstr.
ENDLOOP.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = allstr
encoding = '4110'
IMPORTING
buffer = outxstr
EXCEPTIONS
failed = 1
OTHERS = 2.
CONCATENATE cl_abap_char_utilities=>byte_order_mark_utf8
outxstr INTO outxstr IN BYTE MODE.
IF zip = 'X'.
CREATE OBJECT izip.
CALL METHOD izip->add
EXPORTING
name = 'outfile.txt'
content = outxstr.
CALL METHOD izip->save
RECEIVING
zip = outxstr.
ENDIF.
ENDFORM. "itab2xstr
*&---------------------------------------------------------------------*
*& download
*&---------------------------------------------------------------------*
FORM download USING xstr filename TYPE string.
DATA: path TYPE string,
fullpath TYPE string,
filter TYPE string.
DATA: blen TYPE i,
bintab TYPE w3mimetabtype.
IF p_usezip = ''.
filter = '文本文件(*.TXT)|*.TXT|'.
ELSE.
filter = 'ZIP压缩文件(*.ZIP)|*.ZIP|'.
ENDIF.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
default_file_name = filename
window_title = '文件保存为'
file_filter = filter
CHANGING
filename = filename
path = path
fullpath = fullpath
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
MESSAGE e000(oo) WITH '弹出保存框错误'.
ENDIF.
CHECK fullpath IS NOT INITIAL.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = xstr
IMPORTING
output_length = blen
TABLES
binary_tab = bintab.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
bin_filesize = blen
filename = fullpath
filetype = 'BIN'
TABLES
data_tab = bintab
EXCEPTIONS
OTHERS = 22.
IF sy-subrc NE 0.
MESSAGE s000(oo) WITH '下载文件错误' DISPLAY LIKE 'E'.
ENDIF.
ENDFORM. " DOWNLOAD
*&---------------------------------------------------------------------*
*& xstr2dataset
*&---------------------------------------------------------------------*
FORM xstr2dataset USING xstr appfile.
DATA: iname TYPE char40.
iname = cl_abap_syst=>get_instance_name( ).
OPEN DATASET appfile FOR OUTPUT IN BINARY MODE.
IF sy-subrc NE 0.
MESSAGE e000(oo) WITH '打开文件失败'.
ENDIF.
TRANSFER xstr TO appfile.
CLOSE DATASET appfile.
MESSAGE s000(oo) WITH '服务器:' iname '文件:' appfile.
ENDFORM. "xstr2dataset
*&---------------------------------------------------------------------*
*& Form tabfld_f4
*&---------------------------------------------------------------------*
FORM tabfld_f4.
DATA: BEGIN OF lt_pop OCCURS 0,
fieldname TYPE fieldname,
keyflag TYPE keyflag,
ddtext TYPE ddtext,
checkflg,
END OF lt_pop.
DATA: f4_fldct TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: retcode TYPE c.
LOOP AT gt_dd03.
lt_pop-fieldname = gt_dd03-fieldname.
lt_pop-keyflag = gt_dd03-keyflag.
lt_pop-ddtext = gt_dd03-ddtext.
READ TABLE s_flds WITH KEY low = lt_pop-fieldname.
IF sy-subrc = 0.
lt_pop-checkflg = 'X'.
ENDIF.
APPEND lt_pop.
CLEAR lt_pop.
ENDLOOP.
PERFORM slis_catset TABLES f4_fldct
USING: 'FIELDNAME' 'DD03L' 'FIELDNAME' '字段' 'X',
'KEYFLAG ' 'DD03L' 'KEYFLAG' 'KEY' '',
'DDTEXT ' 'DD03T' 'DDTEXT' '文本' ''.
CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
EXPORTING
i_title = '选择要导出的字段'
i_zebra = 'X'
i_checkbox_fieldname = 'CHECKFLG'
i_screen_start_column = 15
i_screen_start_line = 1
i_screen_end_column = 112
i_screen_end_line = 20
i_tabname = ''
i_selection = 'X'
i_allow_no_selection = ''
it_fieldcat = f4_fldct[]
IMPORTING
e_exit = retcode
TABLES
t_outtab = lt_pop
EXCEPTIONS
program_error = 1
OTHERS = 2.
CHECK retcode = ''.
CLEAR: s_flds,s_flds[].
LOOP AT lt_pop WHERE checkflg = 'X'.
s_flds-sign = 'I'.
s_flds-option = 'EQ'.
s_flds-low = lt_pop-fieldname.
APPEND s_flds.
ENDLOOP.
READ TABLE s_flds INDEX 1.
ENDFORM. "tabfld_f4
*---------------------------------------------------------------------*
* FORM frm_catlg_set *
*---------------------------------------------------------------------*
FORM slis_catset TABLES fldcattab
USING p_field p_reftab p_reffld p_text p_key.
DATA: ls_fldct TYPE slis_fieldcat_alv.
ls_fldct-fieldname = p_field.
ls_fldct-seltext_l = p_text.
ls_fldct-ref_fieldname = p_reffld.
ls_fldct-ref_tabname = p_reftab.
APPEND ls_fldct TO fldcattab.
CLEAR ls_fldct.
ENDFORM. "catlg_set
*&---------------------------------------------------------------------*
*& Form GENERATE
*&---------------------------------------------------------------------*
FORM generate.
DATA: msg(120),lin(3),wrd(10),off(3).
DATA: lt_code TYPE TABLE OF char255 WITH HEADER LINE.
DATA: tmpstr TYPE string.
DATA: nowhereflag VALUE 'X'.
APPEND 'PROGRAM SUBPOOL.' TO lt_code.
APPEND 'FORM getsqldata TABLES itab limt.' TO lt_code.
LOOP AT s_sqls.
TRANSLATE s_sqls-low USING ' '. "替换全角空格
lt_code = s_sqls-low.
IF lt_code CS `FROM `.
REPLACE `FROM ` IN lt_code WITH ` INTO TABLE itab FROM `.
ENDIF.
IF s_limt[] IS NOT INITIAL.
IF lt_code CS `WHERE `.
CONCATENATE `WHERE ` p_lfld ` IN limt AND ` INTO tmpstr.
REPLACE `WHERE ` IN lt_code WITH tmpstr.
nowhereflag = ''.
ENDIF.
ENDIF.
APPEND lt_code.
ENDLOOP.
APPEND `ENDFORM.` TO lt_code.
IF nowhereflag = 'X' AND s_limt[] IS NOT INITIAL.
MESSAGE i000(oo) WITH 'SQL语句如果没有WHERE语句,限制字段不起作用'.
ENDIF.
GENERATE SUBROUTINE POOL lt_code NAME gv_prog
MESSAGE msg LINE lin WORD wrd OFFSET off.
IF sy-subrc NE 0.
MESSAGE e000(oo) WITH '输入的SQL语句,第' lin '行语法错误:' msg.
ENDIF.
ENDFORM. " GENERATE
*&---------------------------------------------------------------------*
*& Form get_dd03p
*&---------------------------------------------------------------------*
FORM get_dd03p.
CLEAR gt_dd03[].
CALL FUNCTION 'DDIF_TABL_GET'
EXPORTING
name = p_tabnam
langu = sy-langu
TABLES
dd03p_tab = gt_dd03
EXCEPTIONS
illegal_input = 1
OTHERS = 2.
IF gt_dd03[] IS INITIAL.
MESSAGE e000(oo) WITH '获取表结构失败'.
ELSE.
DELETE gt_dd03 WHERE datatype = ''.
ENDIF.
ENDFORM. "get_dd03p
*&---------------------------------------------------------------------*
*& 程序设置为JOB执行
*&---------------------------------------------------------------------*
FORM submitjob USING showjob.
DATA: jobname LIKE tbtcjob-jobname,
jobnumber LIKE tbtcjob-jobcount,
stable TYPE TABLE OF rsparams,
stable_255 TYPE TABLE OF rsparamsl_255.
DATA: wa_trdir TYPE trdir.
jobname = sy-cprog.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = jobname
IMPORTING
jobcount = jobnumber
EXCEPTIONS
cant_create_job = 01
invalid_job_data = 02
jobname_missing = 03
OTHERS = 99.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS'
EXPORTING
curr_report = sy-cprog
TABLES
selection_table = stable
selection_table_255 = stable_255
EXCEPTIONS
not_found = 1
no_report = 2
OTHERS = 3.
SUBMIT (sy-cprog)
WITH SELECTION-TABLE stable_255
VIA JOB jobname
NUMBER jobnumber
AND RETURN.
IF sy-subrc = 0.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = jobnumber
jobname = jobname
strtimmed = 'X'
EXCEPTIONS
OTHERS = 8.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
MESSAGE s112(bt) WITH jobname 'Released'.
ENDIF.
ENDIF.
ENDFORM. "submitjob