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

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

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

程序界面:

401d7adacc5bd64810a0f4304d4d6373.png

功能说明:

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贴进去:

af5a3e4f8aa6ef2cb8f023339f41d383.png

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

f27b90384076aaa47c5f16676bc31518.png

48a39eb98b59f4ccc19d488700f40749.png

23421932a8627de1d51ee349cdddf1b9.png

9e965f1109b7ba96f5e000a5a7aad525.png

代码如下:

*&---------------------------------------------------------------------*
*& 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

0ffda506e465099b1ca8dead304670c9.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值