主要功能:

1、支持R3所有表(标准、自建)下传,下传方式为FTP

2、支持输出字段选择及顺序调整

3、支持动态条件,不同的表会有不同的选择条件,根据不同的条件选择需要下传的数据

4、支持单表、多表、以及输出数据再次加工(需自己写输出逻辑扩展程序,可参考YTEMPLET)

5、支持多表查询,及多表查询的动态选择条件

6、支持大数据量表分批取数、以及分批下传(已通过BSEG大数据量表测试)

7、支持单文件下传(只生产一个文件,默认是分批下传,会产生多个文件)

8、其它支持参看选择屏幕

程序创建好后,请将屏幕代码下载下来,再通过ABAP编辑器程序中的上传功能,即可创建屏幕,而不需要手动画:屏幕代码下载

Code listing for: YR3TABLE2FTP

Description: ABAP表抛FTP通用程序

REPORT YR3TABLE2FTP.
*&---------------------------------------------------------------------*
*& INCLUDE
*&---------------------------------------------------------------------*
include YR3TABLE2FTP_TOP.
include YR3TABLE2FTP_SELSCR.
include YR3TABLE2FTP_FORM.
*&---------------------------------------------------------------------*
*& 初始化处理
*&---------------------------------------------------------------------*
INITIALIZATION.
  but1 = '输出字段配置'.
  but2 = 'HIVE-TABLE-SQL'.
  but3 = '输出逻辑扩展程序模板'.
  IF sy-sysid = 'DEV' OR sy-sysid = 'QAS' OR sy-sysid = 'PRE'.
    p_user = 'adssa'.
    p_pwd = 'fdsssdf'.
    p_host = '32.21.32.123'.
  ELSEIF sy-sysid = 'PRD'.
    p_user = 'fsfwewrew'.
    p_pwd  = 'fsfsfs'.
    p_host = '34.11.53.132'.
  ENDIF.
*&---------------------------------------------------------------------*
*& 选择屏幕控制
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
  IF p_prog IS NOT INITIAL.
    PERFORM frm_find_table USING 'X'.
    PERFORM frm_find_sel.
  ENDIF.

CLEAR:p_snam1,p_snam2,p_snam3,p_snam4,p_snam5,
        s_asist1,s_asist2,s_asist3,s_asist4,s_asist5,
        s_asist1[],s_asist2[],s_asist3[],s_asist4[],s_asist5[].

LOOP AT SCREEN.
    IF screen-name = 'P_PWD'.
      screen-invisible = '1'.
    ELSEIF screen-name = 'P_SNAM1' OR
           screen-name = 'P_SNAM2' OR
           screen-name = 'P_SNAM3' OR
           screen-name = 'P_SNAM4' OR
           screen-name = 'P_SNAM5' OR
           screen-name = 'S_ASIST1-LOW' OR screen-name = 'S_ASIST1-HIGH' OR
           screen-name = 'S_ASIST2-LOW' OR screen-name = 'S_ASIST2-HIGH' OR
           screen-name = 'S_ASIST3-LOW' OR screen-name = 'S_ASIST3-HIGH' OR
           screen-name = 'S_ASIST4-LOW' OR screen-name = 'S_ASIST4-HIGH' OR
           screen-name = 'S_ASIST5-LOW' OR screen-name = 'S_ASIST5-HIGH'.
      screen-input = 0.
      LOOP AT sel_flds.
        READ TABLE gt_vrm_values WITH KEY key = sel_flds-fld.
        CASE  sel_flds-p_snam.
          WHEN 's_asist1'.
            IF screen-name = 'S_ASIST1-LOW' OR screen-name = 'S_ASIST1-HIGH'.
              screen-input = 1.
              p_snam1 =  gt_vrm_values-text.
            ENDIF.
          WHEN 's_asist2'.
            IF screen-name = 'S_ASIST2-LOW' OR screen-name = 'S_ASIST2-HIGH'.
              screen-input = 1.
              p_snam2 =  gt_vrm_values-text.
            ENDIF.
          WHEN 's_asist3'.
            IF screen-name = 'S_ASIST3-LOW' OR screen-name = 'S_ASIST3-HIGH'.
              screen-input = 1.
              p_snam3 =  gt_vrm_values-text.
            ENDIF.
          WHEN 's_asist4'.
            IF screen-name = 'S_ASIST4-LOW' OR screen-name = 'S_ASIST4-HIGH'.
              screen-input = 1.
              p_snam4 =  gt_vrm_values-text.
            ENDIF.
          WHEN 's_asist5'.
            IF screen-name = 'S_ASIST5-LOW' OR screen-name = 'S_ASIST5-HIGH'.
              screen-input = 1.
              p_snam5 =  gt_vrm_values-text.
            ENDIF.
        ENDCASE.
      ENDLOOP.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.
  CLEAR:gt_vrm_values,gt_vrm_values[].
  gt_vrm_values-key = 'GBK'.
  gt_vrm_values-text = gt_vrm_values-key.
  APPEND gt_vrm_values.
  gt_vrm_values-key = 'UTF-8'.
  gt_vrm_values-text = gt_vrm_values-key.
  APPEND gt_vrm_values.
  gt_vrm_values-key = 'GB2312'.
  gt_vrm_values-text = gt_vrm_values-key.
  APPEND gt_vrm_values.
  gt_vrm_values-key = 'UTF-16BE'.
  gt_vrm_values-text = gt_vrm_values-key.
  APPEND gt_vrm_values.
  gt_vrm_values-key = 'UTF-16LE'.
  gt_vrm_values-text = gt_vrm_values-key.
  APPEND gt_vrm_values.
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'p_encodi'
      values = gt_vrm_values[].

CLEAR:gt_vrm_values,gt_vrm_values[].
  gt_vrm_values-key = '_NNNNNN'.
  gt_vrm_values-text = '_NNNNNN'.
  APPEND gt_vrm_values.
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'p_fileno'
      values = gt_vrm_values[].

CLEAR:gt_vrm_values,gt_vrm_values[].
  gt_vrm_values-key = 'YYYYMMDD'.
  gt_vrm_values-text = 'YYYYMMDD'.
  APPEND gt_vrm_values.
  gt_vrm_values-key = 'YYYYMM'.
  gt_vrm_values-text = 'YYYYMM'.
  APPEND gt_vrm_values.
  gt_vrm_values-key = 'YYYYMMDDHHMMSS'.
  gt_vrm_values-text = 'YYYYMMDDHHMMSS'.
  APPEND gt_vrm_values.
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'p_ymd'
      values = gt_vrm_values[].

CHECK p_table <> g_last_tbname.
  g_last_tbname = p_table.
  CLEAR:gt_vrm_values,gt_vrm_values[],gt_vrm_values_dt,gt_vrm_values_dt[],gt_dd03l,gt_dd03l[],rtables,rtables[].
  PERFORM frm_val TABLES gt_vrm_values rtables gt_vrm_values_dt gt_dd03l USING ''.

CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'p_name1'
      values = gt_vrm_values_dt.
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'p_name2'
      values = gt_vrm_values[].
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'p_name3'
      values = gt_vrm_values[].
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'p_name4'
      values = gt_vrm_values[].
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'p_name5'
      values = gt_vrm_values[].
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'p_name6'
      values = gt_vrm_values[].
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'p_name7'
      values = gt_vrm_values[].
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'p_name8'
      values = gt_vrm_values[].

IF flg2 = 'X'.
    CONCATENATE p_table `_` INTO p_fil_px.
    CLEAR: p_name1,p_name2,p_name3,p_name4,p_name5,p_name6,p_name7,p_name8,
           s_val1,s_val2,s_val3,s_val4,s_val5,s_val6,s_val7,s_val8,
           s_val1[],s_val2[],s_val3[],s_val4[],s_val5[],s_val6[],s_val7[],s_val8[].
    LOOP AT gt_dd03l WHERE keyflag = 'X' .
      CASE sy-tabix.
        WHEN 1.
          p_name2 = gt_dd03l-fieldname.
        WHEN 2.
          p_name3 = gt_dd03l-fieldname.
        WHEN 3.
          p_name4 = gt_dd03l-fieldname.
        WHEN 4.
          p_name5 = gt_dd03l-fieldname.
        WHEN 5.
          p_name6 = gt_dd03l-fieldname.
        WHEN 6.
          p_name7 = gt_dd03l-fieldname.
        WHEN 7.
          p_name8 = gt_dd03l-fieldname.
      ENDCASE.
    ENDLOOP.
  ENDIF.
  CLEAR:flg2.

AT SELECTION-SCREEN ON p_table.
  flg2 = 'X'.
  SELECT SINGLE * FROM dd02l WHERE tabname = p_table AND ( tabclass = 'TRANSP' OR tabclass = 'CLUSTER' ) .
  IF sy-subrc <> 0.
    MESSAGE '表不存在' TYPE 'E'.
  ENDIF.

AT SELECTION-SCREEN ON p_fil_px.

AT SELECTION-SCREEN ON p_split.
  IF p_split = ''.
    MESSAGE '列分隔符不能为空' TYPE 'E'.
  ENDIF.

AT SELECTION-SCREEN ON p_counts.
  IF p_counts <= 0.
    MESSAGE '每文件最大条目数需大于0' TYPE 'E'.
  ENDIF.

AT SELECTION-SCREEN ON p_prog.
  IF  p_prog <> ''.
    SELECT SINGLE * FROM progdir WHERE name = p_prog.
    IF sy-subrc <> 0.
      MESSAGE '输出逻辑扩展程序不存在' TYPE 'E'.
    ENDIF.
  ENDIF.

*&---------------------------------------------------------------------*
*& 参数输入检查
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN ON BLOCK b11.
  CLEAR: gt_name[].

IF p_name1 IS NOT INITIAL AND s_val1[] IS NOT INITIAL.
    gt_name-name = p_name1.
    APPEND gt_name.
  ENDIF.

IF p_name2 IS NOT INITIAL AND s_val2[] IS NOT INITIAL.
    READ TABLE gt_name WITH KEY name = p_name2.
    IF sy-subrc = 0.
      MESSAGE '条件字段重复,请检查输入条件' TYPE 'E'.
    ENDIF.
    gt_name-name = p_name2.
    APPEND gt_name.
  ENDIF.

IF p_name3 IS NOT INITIAL AND s_val3[] IS NOT INITIAL.
    READ TABLE gt_name WITH KEY name = p_name3.
    IF sy-subrc = 0.
      MESSAGE '条件字段重复,请检查输入条件' TYPE 'E'.
    ENDIF.
    gt_name-name = p_name3.
    APPEND gt_name.
  ENDIF.

IF p_name4 IS NOT INITIAL AND s_val4[] IS NOT INITIAL.
    READ TABLE gt_name WITH KEY name = p_name4.
    IF sy-subrc = 0.
      MESSAGE '条件字段重复,请检查输入条件' TYPE 'E'.
    ENDIF.
    gt_name-name = p_name4.
    APPEND gt_name.
  ENDIF.

IF p_name5 IS NOT INITIAL AND s_val5[] IS NOT INITIAL.
    READ TABLE gt_name WITH KEY name = p_name5.
    IF sy-subrc = 0.
      MESSAGE '条件字段重复,请检查输入条件' TYPE 'E'.
    ENDIF.
    gt_name-name = p_name5.
    APPEND gt_name.
  ENDIF.

IF p_name6 IS NOT INITIAL AND s_val6[] IS NOT INITIAL.
    READ TABLE gt_name WITH KEY name = p_name6.
    IF sy-subrc = 0.
      MESSAGE '条件字段重复,请检查输入条件' TYPE 'E'.
    ENDIF.
    gt_name-name = p_name6.
    APPEND gt_name.
  ENDIF.

IF p_name7 IS NOT INITIAL AND s_val7[] IS NOT INITIAL.
    READ TABLE gt_name WITH KEY name = p_name7.
    IF sy-subrc = 0.
      MESSAGE '条件字段重复,请检查输入条件' TYPE 'E'.
    ENDIF.
    gt_name-name = p_name7.
    APPEND gt_name.
  ENDIF.

IF p_name8 IS NOT INITIAL AND s_val8[] IS NOT INITIAL.
    READ TABLE gt_name WITH KEY name = p_name8.
    IF sy-subrc = 0.
      MESSAGE '条件字段重复,请检查输入条件' TYPE 'E'.
    ENDIF.
    gt_name-name = p_name8.
    APPEND gt_name.
  ENDIF.

AT SELECTION-SCREEN.
  CASE sy-ucomm.
    WHEN 'CLI1'.
      CALL SCREEN 1001 STARTING AT 37 1
                      ENDING   AT 99 20.
    WHEN 'CLI2'.
      CALL SCREEN 1002 STARTING AT 37 1
                      ENDING   AT 97 20.
    WHEN 'CLI3'.
      CALL SCREEN 1003 STARTING AT 30 1
                      ENDING   AT 150 20.
  ENDCASE.

*&---------------------------------------------------------------------*
*& 程序开始处理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  CONDENSE p_fil_px.
  IF p_fil_px = ''.
    MESSAGE '文件名不能为空' TYPE 'S' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

PERFORM f_get_data. "取数逻辑

*&---------------------------------------------------------------------*
*& 程序结束处理
*&---------------------------------------------------------------------*
END-OF-SELECTION.
*  PERFORM xxxxxxx.

*GUI Texts
*----------------------------------------------------------
* 1001 --> 输出字段配置
* 1002 --> HIVE-TABLE-SQL查看
* 1003 --> 输出逻辑扩展程序样例

*Text elements
*----------------------------------------------------------
* 001 源表配置
* 002 目标FTP
* 003 条件1
* 004 条件2
* 005 条件3
* 006 条件4
* 007 条件5
* 008 主表名
* 009 输完表名请回车
* 010 条件6
* 011 条件7
* 012 条件8
* 013 字段分隔符
* 014 若为Tab请输入\t;换行符固定为\r\n不可指定(首次转到FTP为\r\n,但HIVE接过去时为\n)
* 016 1、条件1为日期类型,可用于按日期增量,支持变式里的动态日期
* 017 文件名
* 018 最终文件存放路径:路径+文件夹日期,文件夹日期可以不输入
* 021 主表选择条件
* 022 输出字段
* 023 输出字段选择
* 028  NNNNNN为文件编号,留空时将只产生一个文件
* 030 关联表选择条件
* 031 2、除条件1外如果是日期类型,请按YYYMMDD格式输入,不带日期格式
* 032 dddd
* 033 .
* 071 文件夹日期
* 112 输出逻辑扩展程序
* 114 
* 118 当上面文件名中有YYYYMMDD(或YYYYMM),且文件日期留空时,取当前日期
* 121 是否生成标记文件
* 122 是否生成时间戳字段(ZTIMESTAMPL)
* 123 是否带表头
* 124 文件名是否带编号
* 125 如去掉,则主表会一次查出所有数据后下传,文件名不会带 _NNNNNN 编号
* 126 默认不带。表头每列信息由字段名+字段描述+长度(字段名:字段描述(长度))组成
* 127 SQL性能日志
* 128 生成的表头里是否带 表字段名+字段长度 信息
* 129 抽取时间戳(YYYYMMDDhhmmss.mmmuuun)
* 132 文件字符编码
* 133 标记文件扩展名
* 140 
* 213 表头是否带技术信息
* 231 _YYYYMMDD
* 771 文件日期
* 900 输完程序名请回车

*Selection texts
*----------------------------------------------------------
* FTP_PATH         路径
* PFLGFILE         标记文件
* P_COUNTS         主表分批查询记录数
* P_DIR_DT         文件夹日期
* P_ENCODI         文件字符编码
* P_EXTENS         数据文件扩展名
* P_FIL_PX         数据文件名
* P_FLG_FL         标记文件名
* P_HEADER         是否带表头
* P_HOST         主机IP
* P_NAME1         条件1字段名
* P_NAME2         条件2字段名
* P_NAME3         条件3字段名
* P_NAME4         条件4字段名
* P_NAME5         条件5字段名
* P_NAME6         条件6字段名
* P_NAME7         条件7字段名
* P_NAME8         条件8字段名
* P_PROG         输出扩展逻辑程序名
* P_PWD         密码
* P_SNAM1         关联表选择条件名1
* P_SNAM2         关联表选择条件名2
* P_SNAM3         关联表选择条件名3
* P_SNAM4         关联表选择条件名4
* P_SNAM5         关联表选择条件名5
* P_SPLIT         列分隔符
* P_TABLE         主表名
* P_USER         用户名
* P_VARUSR         变式创建者
* S_ASIST1         关联表选择条件值1
* S_ASIST2         关联表选择条件值2
* S_ASIST3         关联表选择条件值3
* S_ASIST4         关联表选择条件值4
* S_ASIST5         关联表选择条件值5
* S_VAL1         条件1值
* S_VAL2         条件2值
* S_VAL3         条件3值
* S_VAL4         条件4值
* S_VAL5         条件5值
* S_VAL6         条件6值
* S_VAL7         条件7值
* S_VAL8         条件8值

*Messages
*----------------------------------------------------------
*
* Message class: Hard coded
*   请输入内容

Extracted by Mass Download version 1.5.5 - E.G.Mellodew. 1998-2017. Sap Release 640

Code listing for: YR3TABLE2FTP_FORM

Description: Include YR3TABLE2FTP_FORM

*&---------------------------------------------------------------------*
*&  包括              YR3TABLE2FTP_FORM
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  f_get_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*

FORM f_get_data .
  FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
                 <dyn_table_new> TYPE STANDARD TABLE,
                 <dyn_wa>.
  DATA: dy_table TYPE REF TO data,
        dy_line TYPE REF TO data.
  DATA: str TYPE string.
  DATA: lv_selflds TYPE string.

IF p_ymd = 'YYYYMMDD'.
    IF p_ymd2 IS NOT INITIAL.
      CONCATENATE p_fil_px p_ymd2 INTO p_fil_px2.
    ELSE.
      CONCATENATE p_fil_px sy-datum INTO p_fil_px2.
    ENDIF.
  ELSEIF p_ymd = 'YYYYMM'.
    IF p_ymd2 IS NOT INITIAL.
      CONCATENATE p_fil_px p_ymd2+0(6) INTO p_fil_px2.
    ELSE.
      CONCATENATE p_fil_px sy-datum+0(6) INTO p_fil_px2.
    ENDIF.
  ELSEIF p_ymd = 'YYYYMMDDHHMMSS'.
    IF p_ymd2 IS NOT INITIAL.
      CONCATENATE p_fil_px p_ymd2 sy-uzeit INTO p_fil_px2.
    ELSE.
      CONCATENATE p_fil_px sy-datum sy-uzeit INTO p_fil_px2.
    ENDIF.
  ELSE.
    p_fil_px2 = p_fil_px.
  ENDIF.

CLEAR: gt_YTEST300,gt_YTEST300[].
  SELECT * FROM YTEST300 INTO TABLE gt_YTEST300 WHERE username = p_varusr AND tabname = p_table ORDER BY sequence ASCENDING.
  struct_type ?= cl_abap_typedescr=>describe_by_name( p_table ).
  comp_tab[] = struct_type->get_components( ).
  PERFORM frm_comp_tab TABLES comp_tab.

IF gt_YTEST300[] IS NOT INITIAL.
    CLEAR:comp_tab2[].
    LOOP AT gt_YTEST300.
      READ TABLE comp_tab WITH KEY name = gt_YTEST300-fldname.
      MOVE-CORRESPONDING comp_tab TO comp_tab2.
      APPEND comp_tab2.
      CONCATENATE lv_selflds ` ` gt_YTEST300-fldname INTO lv_selflds.
    ENDLOOP.
    comp_tab[] = comp_tab2[].

IF timestmp = 'X'.
      comp_tab-name = 'ZTIMESTAMPL'.
      comp_tab-type = cl_abap_elemdescr=>get_c( 22 ).
      APPEND comp_tab.
    ENDIF.

struct_type = cl_abap_structdescr=>create( comp_tab[] ).
  ELSE.
    LOOP AT comp_tab.
      CONCATENATE lv_selflds ` ` comp_tab-name INTO lv_selflds.
    ENDLOOP.

IF timestmp = 'X'.
      comp_tab-name = 'ZTIMESTAMPL'.
      comp_tab-type = cl_abap_elemdescr=>get_c( 22 ).
      APPEND comp_tab.
      struct_type = cl_abap_structdescr=>create( comp_tab[] ).
    ENDIF.

ENDIF.

table_type = cl_abap_tabledescr=>create( struct_type ).

CREATE DATA dy_table TYPE HANDLE table_type.
  ASSIGN dy_table->* TO <dyn_table>.
  CREATE DATA dy_line LIKE LINE OF <dyn_table>.
  ASSIGN dy_line->* TO <dyn_wa>.

DATA: cond TYPE string,orderby TYPE string.

CLEAR:cond .
  IF p_name1 IS NOT INITIAL AND s_val1[] IS NOT INITIAL.
    IF cond = ''.
      CONCATENATE  p_name1 ` in s_val1 ` INTO cond.
    ELSE.
      CONCATENATE cond ` and ` p_name1 ` in s_val1` INTO cond.
    ENDIF.
  ENDIF.

IF p_name2 IS NOT INITIAL AND s_val2[] IS NOT INITIAL.
    IF cond = ''.
      CONCATENATE  p_name2 ` in s_val2 ` INTO cond.
    ELSE.
      CONCATENATE cond ` and ` p_name2 ` in s_val2` INTO cond.
    ENDIF.
  ENDIF.

IF p_name3 IS NOT INITIAL AND s_val3[] IS NOT INITIAL.
    IF cond = ''.
      CONCATENATE  p_name3 ` in s_val3 ` INTO cond.
    ELSE.
      CONCATENATE cond ` and ` p_name3 ` in s_val3` INTO cond.
    ENDIF.
  ENDIF.

IF p_name4 IS NOT INITIAL AND s_val4[] IS NOT INITIAL.
    IF cond = ''.
      CONCATENATE  p_name4 ` in s_val4 ` INTO cond.
    ELSE.
      CONCATENATE cond ` and ` p_name4 ` in s_val4` INTO cond.
    ENDIF.
  ENDIF.

IF p_name5 IS NOT INITIAL AND s_val5[] IS NOT INITIAL.
    IF cond = ''.
      CONCATENATE  p_name5 ` in s_val5 ` INTO cond.
    ELSE.
      CONCATENATE cond ` and ` p_name5 ` in s_val5` INTO cond.
    ENDIF.
  ENDIF.

IF p_name6 IS NOT INITIAL AND s_val6[] IS NOT INITIAL.
    IF cond = ''.
      CONCATENATE  p_name6 ` in s_val6 ` INTO cond.
    ELSE.
      CONCATENATE cond ` and ` p_name6 ` in s_val6` INTO cond.
    ENDIF.
  ENDIF.

IF p_name7 IS NOT INITIAL AND s_val7[] IS NOT INITIAL.
    IF cond = ''.
      CONCATENATE  p_name7 ` in s_val7 ` INTO cond.
    ELSE.
      CONCATENATE cond ` and ` p_name7 ` in s_val7` INTO cond.
    ENDIF.
  ENDIF.

IF p_name8 IS NOT INITIAL AND s_val8[] IS NOT INITIAL.
    IF cond = ''.
      CONCATENATE  p_name8 ` in s_val8 ` INTO cond.
    ELSE.
      CONCATENATE cond ` and ` p_name8 ` in s_val8` INTO cond.
    ENDIF.
  ENDIF.

DATA: str_len TYPE i.
  str_len = STRLEN( ftp_path ).
  str_len = str_len - 1.
  REPLACE ALL OCCURRENCES OF `\` IN ftp_path  WITH `/`.
  CONDENSE ftp_path.
  IF ftp_path+str_len = '/' AND p_dir_dt IS NOT INITIAL.
    CONCATENATE ftp_path p_dir_dt INTO ftp_path.
  ELSEIF p_dir_dt IS NOT INITIAL.
    CONCATENATE ftp_path '/' p_dir_dt INTO ftp_path.
  ENDIF.

IF ftp_path+str_len = '/' AND str_len <> 0.
    ftp_path = ftp_path+0(str_len).
  ENDIF.
  FIELD-SYMBOLS: <fldvalue>,<key_constr>.
  DATA: key_constr TYPE TABLE OF string WITH HEADER LINE,l_total TYPE string,lins TYPE i,lins2 TYPE i,strtmp TYPE string.
  DATA:lt_dd03l TYPE TABLE OF dd03l WITH HEADER LINE,wa_dd03l LIKE lt_dd03l.
  SELECT tabname fieldname keyflag rollname position inttype leng decimals FROM dd03l INTO CORRESPONDING FIELDS OF TABLE lt_dd03l
          WHERE tabname = p_table AND keyflag = 'X' .
  SORT lt_dd03l BY position.

LOOP AT lt_dd03l.
    CONCATENATE ` ` orderby ` ` lt_dd03l-fieldname INTO orderby.
  ENDLOOP.
  CONDENSE orderby.

DELETE lt_dd03l WHERE fieldname = 'MANDT'.
  READ TABLE lt_dd03l INTO wa_dd03l INDEX 1."第一主键字段

DATA: counts TYPE i,diff_counts TYPE i.
  DO.
    g_count = sy-index.
    CONCATENATE `_` g_count INTO g_count_c.

CLEAR:key_constr,key_constr[].
    IF sy-index = 1."首次查
      IF cond IS INITIAL.
        IF wa_dd03l-inttype = 'C'.
          CONCATENATE wa_dd03l-fieldname ` >= ''` INTO key_constr.
        ELSE.
          CONCATENATE `( ` wa_dd03l-fieldname ` >= -128 )`INTO key_constr.
        ENDIF.
      ELSE.
        IF wa_dd03l-inttype = 'C'.
          CONCATENATE `( ` wa_dd03l-fieldname ` >= '' ) AND ( ` cond ` )` INTO key_constr.
        ELSE.
          CONCATENATE `( ` wa_dd03l-fieldname ` >= -128 ) AND ( ` cond ` )` INTO key_constr.
        ENDIF.
      ENDIF.

APPEND key_constr.
      CLEAR key_constr.
    ELSE.
      IF <dyn_table> IS NOT INITIAL ."最近一次查到数据后
        DESCRIBE TABLE lt_dd03l LINES lins.
        IF lins > 1."如果主键字段个数大于1
          PERFORM frm_key_constr TABLES <dyn_table> lt_dd03l key_constr.
          LOOP AT key_constr ASSIGNING <key_constr>.
            IF cond IS NOT INITIAL.
              CONCATENATE `( ` <key_constr> ` ) AND ( ` cond ` )` INTO <key_constr>.
            ENDIF.
          ENDLOOP.
        ENDIF.

CLEAR <dyn_wa>.
        DESCRIBE TABLE <dyn_table> LINES lins.
        READ TABLE <dyn_table> INTO <dyn_wa> INDEX lins.
        ASSIGN COMPONENT wa_dd03l-fieldname OF STRUCTURE <dyn_wa> TO <fldvalue>.

"非首次查询时,无论怎样第一主键字段大于条件需要
        IF cond IS INITIAL.
          CONCATENATE wa_dd03l-fieldname ` > '` <fldvalue> `'` INTO key_constr.
        ELSE.
          CONCATENATE wa_dd03l-fieldname ` > '` <fldvalue> `' AND ( ` cond ` )` INTO key_constr.
        ENDIF.
        APPEND key_constr.
      ENDIF.
    ENDIF.

CONCATENATE  `正在读取第 ` g_count ` 批数据...` INTO str.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
        percentage = 20
        text       = str.

FREE <dyn_table>.
    LOOP AT key_constr.
      DESCRIBE TABLE <dyn_table> LINES lins.
      diff_counts = p_counts - lins.
      IF diff_counts <= 0 .
        EXIT.
      ENDIF.
      strtmp = key_constr.
      GET RUN TIME FIELD tm1.
      SELECT (lv_selflds) APPENDING CORRESPONDING FIELDS OF TABLE <dyn_table> FROM (p_table) UP TO diff_counts ROWS WHERE (strtmp) ORDER BY (orderby).
      DESCRIBE TABLE <dyn_table> LINES lins2.
      diff_counts = lins2 - lins.
      IF psqllog = 'X'.
        PERFORM frm_write_file2 USING strtmp diff_counts sy-tabix.
      ENDIF.
    ENDLOOP.
    IF psqllog = 'X'.
      PERFORM frm_write_file3 .
    ENDIF.

"首次查询为空时,需要下传空文件
    IF sy-index > 1 AND <dyn_table> IS INITIAL.
      EXIT.
    ENDIF.

DATA:dy_table_new TYPE REF TO data.
    IF p_prog IS NOT INITIAL.

************************************
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
        EXPORTING
          percentage = 20
          text       = `输出字段逻辑扩展处理...`.

PERFORM frm_dyn IN PROGRAM (p_prog) TABLES <dyn_table> comp_tab[]
                                s_asist1 s_asist2 s_asist3 s_asist4 s_asist5
                                USING dy_table_new .
      ASSIGN dy_table_new->* TO <dyn_table_new>.
      IF p_fileno IS NOT INITIAL."分文件抛FTP
        PERFORM to_ftptab TABLES <dyn_table_new>.
      ELSE."不分文件
        IF g_count = 1.
          PERFORM to_ftptab TABLES <dyn_table_new>.
        ELSE.
          PERFORM frm_write_file TABLES <dyn_table_new>.
        ENDIF.
      ENDIF.
      DESCRIBE TABLE <dyn_table_new> LINES lins.

************************************
ELSE.
      IF p_fileno IS NOT INITIAL.
        PERFORM to_ftptab TABLES <dyn_table>.
      ELSE.
        IF g_count = 1.
          PERFORM to_ftptab TABLES <dyn_table>.
        ELSE.
          PERFORM frm_write_file TABLES <dyn_table>.
        ENDIF.
      ENDIF.
      DESCRIBE TABLE <dyn_table> LINES lins.
    ENDIF.
    l_total = l_total + lins.
    IF flg_ftp IS NOT INITIAL.
      EXIT.
    ENDIF.
  ENDDO.

IF p_fileno IS INITIAL.
    CONCATENATE  `正在将SAP服务上文件Append到FTP:` gv_filename INTO str.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
        percentage = 20
        text       = str.
    PERFORM frm_ftp_append.
    CONCATENATE  `/usr/sap/tmp/` p_fil_px2 `.` p_extens INTO gv_filename SEPARATED BY ``.
    DELETE DATASET gv_filename.
  ENDIF.

CHECK flg_ftp IS INITIAL AND pflgfile = 'X'.

DATA: codepage TYPE cpcodepage,
     encoding TYPE abap_encoding,
    convout TYPE REF TO cl_abap_conv_out_ce,
    buffer TYPE xstring.
  DATA: BEGIN OF dest_xtab OCCURS 0,
        x(6144) TYPE x,
      END OF dest_xtab.

CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
    EXPORTING
      external_name = p_encodi
    IMPORTING
      sap_codepage  = codepage.
  encoding = codepage.

CALL METHOD cl_abap_conv_out_ce=>create
    EXPORTING
      encoding = encoding
    RECEIVING
      conv     = convout.

*  CONCATENATE `数据总条数:` l_total INTO l_total.
CONDENSE l_total.
  CALL METHOD convout->write
    EXPORTING
      data = l_total.

CALL METHOD convout->get_buffer
    RECEIVING
      buffer = buffer.

DATA: lv_binary_len TYPE i.
  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer        = buffer
    IMPORTING
      output_length = lv_binary_len
    TABLES
      binary_tab    = dest_xtab.

PERFORM f_ftp_connect.
  PERFORM frm_cd_dir.

CONCATENATE p_fil_px2 `.` p_flgex INTO gv_filename.

CONDENSE gv_filename.
  CALL FUNCTION 'FTP_R3_TO_SERVER'
    EXPORTING
      handle        = thandle
      fname         = gv_filename
      blob_length   = lv_binary_len
    TABLES
      blob          = dest_xtab
    EXCEPTIONS
      tcpip_error   = 1
      command_error = 2
      data_error    = 3
      OTHERS        = 4.
  IF sy-subrc EQ 0.
    WRITE:/ gv_filename,'传输成功!'.
  ELSE.
    WRITE:/ gv_filename,'数据文件传输失败!'.
  ENDIF.
  PERFORM f_ftp_disconnect.
ENDFORM. " f_get_data

*&---------------------------------------------------------------------*
*&      Form  to_ftptab
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_SRC_TAB    text
*      -->P_DEST_XTAB  text
*      -->OF           text
*      -->X            text
*----------------------------------------------------------------------*
FORM to_ftptab TABLES p_src_tab.
  DATA: BEGIN OF dest_xtab OCCURS 0,
        x(6144) TYPE x,
      END OF dest_xtab.
  DATA: lv_binary_len TYPE i.

DATA:str TYPE string.
  IF p_fileno IS NOT INITIAL.
    CONCATENATE  p_fil_px2 g_count_c `.` p_extens INTO gv_filename SEPARATED BY ``.
  ELSE.
    CONCATENATE  p_fil_px2 `.` p_extens INTO gv_filename SEPARATED BY ``.
  ENDIF.
  CONCATENATE  `正在准备文件:` gv_filename INTO str.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 20
      text       = str.

PERFORM frm_data_to_binary TABLES p_src_tab dest_xtab USING lv_binary_len 'X'.

CONCATENATE  `正在上传文件:` gv_filename INTO str.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 20
      text       = str.
  PERFORM f_ftp_connect.
  PERFORM frm_mkdir.
  PERFORM frm_cd_dir.

PERFORM f_ftp TABLES dest_xtab USING lv_binary_len.
  PERFORM f_ftp_disconnect.
  CLEAR:dest_xtab.
  REFRESH:dest_xtab[].
ENDFORM. "to_ftptab

*&---------------------------------------------------------------------*
*&      Form  to_ftptab2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_SRC_TAB  text
*----------------------------------------------------------------------*
FORM frm_data_to_binary TABLES p_src_tab dest_xtab USING lv_binary_len TYPE i first.
  DATA:strct_type_ref TYPE REF TO cl_abap_structdescr,
       tab_type_ref TYPE REF TO cl_abap_tabledescr,
       t_component TYPE cl_abap_structdescr=>component_table,
       wa_component LIKE LINE OF t_component.
  FIELD-SYMBOLS: <fldvalue>.
  DATA:time_stamp TYPE timestampl,timestamp_c(22).

DATA: l_str TYPE string,fldstr TYPE string,fldtype,firsttime VALUE 'X'.
  DATA: str TYPE string.
  DATA: len TYPE string.
  DATA: codepage TYPE cpcodepage,
     encoding TYPE abap_encoding,
    convout TYPE REF TO cl_abap_conv_out_ce,
    buffer TYPE xstring.

CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
    EXPORTING
      external_name = p_encodi
    IMPORTING
      sap_codepage  = codepage.
  encoding = codepage.

CALL METHOD cl_abap_conv_out_ce=>create
    EXPORTING
      encoding = encoding
    RECEIVING
      conv     = convout.

tab_type_ref ?= cl_abap_tabledescr=>describe_by_data( p_src_tab[] ).
  strct_type_ref ?= tab_type_ref->get_table_line_type( ).
  t_component = strct_type_ref->get_components( ).

str = p_split.
  REPLACE ALL OCCURRENCES OF `\t` IN str  WITH c_tab.
  REPLACE ALL OCCURRENCES OF `\T` IN str  WITH c_tab.
  REPLACE ALL OCCURRENCES OF ` ` IN str  WITH ``.

IF p_header = 'X' AND first IS NOT INITIAL.
    PERFORM frm_find_table USING 'X'.

CLEAR:fldstr,l_str.
    LOOP AT t_component INTO wa_component.
      READ TABLE gt_dd03l WITH KEY fieldname = wa_component-name.
      IF sy-subrc = 0.
        len = gt_dd03l-leng + gt_dd03l-decimals.
        CONDENSE len.
        READ TABLE gt_vrm_values WITH KEY key = wa_component-name.
        IF sy-subrc = 0.
          REPLACE ALL OCCURRENCES OF str IN gt_vrm_values-text  WITH ` `.
          IF fldstr = ''.
            IF p_hdtlg IS NOT INITIAL.
              CONCATENATE gt_vrm_values-text `(` len `)` INTO fldstr.
            ELSE.
              CLEAR: itab,itab[].
              SPLIT gt_vrm_values-text AT `:` INTO TABLE itab.
              READ TABLE itab INDEX 2.
              fldstr = itab .
            ENDIF.
          ELSE.
            IF p_hdtlg IS NOT INITIAL.
              CONCATENATE fldstr str gt_vrm_values-text `(` len `)` INTO fldstr.
            ELSE.
              CLEAR: itab,itab[].
              SPLIT gt_vrm_values-text AT `:` INTO TABLE itab.
              READ TABLE itab INDEX 2.
              CONCATENATE fldstr str itab INTO fldstr.
            ENDIF.
          ENDIF.
        ELSE.
          IF fldstr = ''.
            IF p_hdtlg IS NOT INITIAL.
              CONCATENATE gt_dd03l-fieldname `(` len `)` INTO fldstr.
            ELSE.
              fldstr = gt_dd03l-fieldname.
            ENDIF.
          ELSE.
            IF p_hdtlg IS NOT INITIAL.
              CONCATENATE fldstr str gt_dd03l-fieldname `(` len `)` INTO fldstr.
            ELSE.
              CONCATENATE fldstr str gt_dd03l-fieldname INTO fldstr.
            ENDIF.
          ENDIF.
        ENDIF.
      ELSE.
        elem_type ?= wa_component-type.
        len = elem_type->length + elem_type->decimals.
        CONDENSE len.
        IF fldstr = ''.
          IF p_hdtlg IS NOT INITIAL.
            CONCATENATE wa_component-name `(` len `)` INTO fldstr.
          ELSE.
            fldstr = wa_component-name.
          ENDIF.
        ELSE.
          IF p_hdtlg IS NOT INITIAL.
            CONCATENATE fldstr str wa_component-name `(` len `)` INTO fldstr.
          ELSE.
            CONCATENATE fldstr str wa_component-name INTO fldstr.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDLOOP.
    CALL METHOD convout->write
      EXPORTING
        data = fldstr.
    CALL METHOD convout->write
      EXPORTING
        data = cl_abap_char_utilities=>cr_lf.
  ENDIF.

GET TIME STAMP FIELD time_stamp.
  timestamp_c = time_stamp.

LOOP AT p_src_tab.
    firsttime = 'X'.
    CLEAR:fldstr,l_str.
    LOOP AT t_component INTO wa_component.

IF wa_component-name = 'ZTIMESTAMPL'.
        IF firsttime = 'X'.
          fldstr = time_stamp.
          CLEAR firsttime.
        ELSE.
          CONCATENATE fldstr timestamp_c INTO fldstr SEPARATED BY str.
        ENDIF.
        CONTINUE.
      ENDIF.

fldtype = wa_component-type->type_kind.
      ASSIGN COMPONENT wa_component-name OF STRUCTURE p_src_tab TO <fldvalue>.
      l_str = <fldvalue>.
      IF fldtype = 'P' OR fldtype = 'F'
        OR fldtype = 'I' OR fldtype = 'b'
        OR fldtype = 's'.
        CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
          CHANGING
            value = l_str.
      ENDIF.
      REPLACE ALL OCCURRENCES OF str IN l_str  WITH ` `.
      IF firsttime = 'X'.
        fldstr = l_str .
        CLEAR firsttime.
      ELSE.
        CONCATENATE fldstr l_str INTO fldstr SEPARATED BY str.
      ENDIF.
    ENDLOOP.

CONDENSE fldstr.
    CALL METHOD convout->write
      EXPORTING
        data = fldstr.
    CALL METHOD convout->write
      EXPORTING
        data = cl_abap_char_utilities=>cr_lf.
  ENDLOOP.

CALL METHOD convout->get_buffer
    RECEIVING
      buffer = buffer.

CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer        = buffer
    IMPORTING
      output_length = lv_binary_len
    TABLES
      binary_tab    = dest_xtab.
ENDFORM. "frm_data_to_binary

*&---------------------------------------------------------------------*
*&      Form  f_ftp_connect
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM f_ftp_connect .
  DATA: thosts(45),tusers(45),tpword(45).
  thosts = p_host.
  tusers = p_user.
  tpword = p_pwd.
  slen = STRLEN( tpword ).
***对密码值进行加密解析处理
CALL FUNCTION 'HTTP_SCRAMBLE'
    EXPORTING
      SOURCE      = tpword
      sourcelen   = slen
      key         = key
    IMPORTING
      destination = tpword.
***定义RFC连接目标,前后台执行时不同
*  IF sy-batch = 'X'.
trfcdest = 'SAPFTPA'.
*  ELSE.
*    trfcdest = 'SAPFTP'.
*  ENDIF.
***该函数可以定义有网关是账户密码,一般公司内部访问无此设置
CALL FUNCTION 'FTP_CONNECT'
    EXPORTING
      user            = tusers
      password        = tpword
      host            = thosts
      rfc_destination = trfcdest
    IMPORTING
      handle          = thandle
    EXCEPTIONS
      not_connected   = 1
      OTHERS          = 2.

IF sy-subrc NE 0.
    WRITE:/ 'FTP连接失败!'.
    STOP.
  ENDIF.

ENDFORM. " f_ftp_connect

*&---------------------------------------------------------------------*
*&      Form  frm_mkdir
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_mkdir .
  DATA: dirstr TYPE string.
  CLEAR:com,com[],res,res[].
  CLEAR: itab, itab[].
  SPLIT ftp_path AT `/` INTO TABLE itab .
  DELETE itab WHERE table_line = ''.
  LOOP AT itab .
    IF sy-tabix = 1.
      CONCATENATE `/` itab INTO dirstr SEPARATED BY ``.
    ELSE.
      CONCATENATE dirstr `/` itab INTO dirstr SEPARATED BY ``.
    ENDIF.
    CONCATENATE `mkdir ` dirstr INTO com-cmd SEPARATED BY ``.
    APPEND com.
  ENDLOOP.

LOOP AT com.
    CALL FUNCTION 'FTP_COMMAND'
      EXPORTING
        handle        = thandle
        command       = com-cmd
      TABLES
        data          = res
      EXCEPTIONS
        tcpip_error   = 1
        command_error = 2
        data_error    = 3
        OTHERS        = 4.
  ENDLOOP.
ENDFORM. " frm_mkdir

*&---------------------------------------------------------------------*
*&      Form  frm_cd_dir
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_cd_dir .
  CLEAR:com,com[],res,res[].
  CONCATENATE 'cd' ftp_path INTO com-cmd SEPARATED BY ''.

CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
      handle        = thandle
      command       = com-cmd
    TABLES
      data          = res
    EXCEPTIONS
      tcpip_error   = 1
      command_error = 2
      data_error    = 3
      OTHERS        = 4.

ENDFORM. " frm_cd_dir

*&---------------------------------------------------------------------*
*&      Form  f_ftp_disconnect
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_ftp_disconnect .
  CALL FUNCTION 'FTP_DISCONNECT'
    EXPORTING
      handle = thandle.
ENDFORM. " f_ftp_disconnect
*&---------------------------------------------------------------------*
*&      Form  f_ftp
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_ftp TABLES p_ftptab USING lv_binary_len.
  CONDENSE gv_filename.
*  DATA:str TYPE string.
*  CONCATENATE  `正在上传文件:` gv_filename INTO str.
*  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
*    EXPORTING
*      percentage = 20
*      text       = str.
CALL FUNCTION 'FTP_R3_TO_SERVER'
    EXPORTING
      handle        = thandle
      fname         = gv_filename
      blob_length   = lv_binary_len
    TABLES
      blob          = p_ftptab
    EXCEPTIONS
      tcpip_error   = 1
      command_error = 2
      data_error    = 3
      OTHERS        = 4.
  IF sy-subrc EQ 0.
    WRITE:/ gv_filename,'传输成功!'.
  ELSE.
    WRITE:/ gv_filename,'数据文件传输失败!'.
    flg_ftp = 'X'.
  ENDIF.
ENDFORM. " f_ftp
*&---------------------------------------------------------------------*
*&      Module  STATUS_1001  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_1001 OUTPUT.
  SET PF-STATUS 'ST_1001'.
  SET TITLEBAR '1001'.
  CLEAR: texttable[],line,gt_YTEST300,gt_YTEST300[].
  CLEAR:gt_vrm_values,gt_vrm_values[],gt_vrm_values_dt,gt_vrm_values_dt[],gt_dd03l,gt_dd03l[],rtables,rtables[].
  PERFORM frm_val TABLES gt_vrm_values rtables gt_vrm_values_dt gt_dd03l USING 'X'.

SELECT * FROM YTEST300 INTO TABLE gt_YTEST300 WHERE username = p_varusr AND tabname = p_table ORDER BY sequence ASCENDING.
  IF sy-subrc = 0.
    LOOP AT gt_YTEST300.
      READ TABLE gt_vrm_values WITH KEY key = gt_YTEST300-fldname.
      CLEAR:itab[].
      SPLIT gt_vrm_values-text AT `:` INTO itab c1 .
      CONCATENATE line c_crlf gt_YTEST300-fldname `:` c1 INTO line SEPARATED BY ``.
    ENDLOOP.
  ELSE.
    LOOP AT gt_vrm_values.
      CLEAR:itab[].
      SPLIT gt_vrm_values-text AT `:` INTO itab c1 .
      CONCATENATE line c_crlf gt_vrm_values-key `:` c1 INTO line SEPARATED BY ``.
    ENDLOOP.
  ENDIF.
  line = line+2.
  APPEND line TO texttable.

IF editor_container IS NOT BOUND.
    CREATE OBJECT editor_container
          EXPORTING
            container_name =  'EDITOR'.

CREATE OBJECT editor
        EXPORTING
          parent = editor_container
          wordwrap_mode = 1
          max_number_chars = 10000.
  ENDIF.
  editor->set_textstream( line ).
ENDMODULE. " STATUS_1001 OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_1001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_1001 INPUT.
  CASE sy-ucomm.
    WHEN 'RW'.
      LEAVE TO SCREEN 0.
    WHEN 'SAVE'.
      CALL METHOD editor->get_text_as_stream
        IMPORTING
          text = texttable[].
      CLEAR: line.
      LOOP AT texttable.
        CONCATENATE line texttable-line INTO line SEPARATED BY ``.
      ENDLOOP.
      IF sy-subrc <> 0.
        MESSAGE `请输入内容` TYPE 'E'.
      ELSE.
        CLEAR:itab[].
        SPLIT line AT c_crlf INTO TABLE itab .
        IF itab[] IS INITIAL.
          MESSAGE `请输入内容` TYPE 'E'.
        ELSE.
          CLEAR:itab2[].
          LOOP AT itab .
            SPLIT itab AT `:` INTO itab c1.
            CONDENSE itab.
            TRANSLATE itab TO UPPER CASE.
            APPEND itab TO itab2.
          ENDLOOP.

LOOP AT itab .
            g_tabix = sy-tabix.
            SPLIT itab AT `:` INTO itab c1.
            CONDENSE itab.
            TRANSLATE itab TO UPPER CASE.
            IF itab <> ''.
              CLEAR repeat.
              LOOP AT itab2 WHERE table_line =  itab.
                repeat = repeat + 1.
              ENDLOOP.
              IF repeat > 1.
                CONCATENATE itab ` 重复输入` INTO c1.
                MESSAGE c1 TYPE 'E'.
                EXIT.
              ENDIF.
              MODIFY itab INDEX g_tabix.
            ELSE.
              DELETE itab INDEX g_tabix.
            ENDIF.
          ENDLOOP.
          IF itab[] IS INITIAL.
            MESSAGE `请输入内容` TYPE 'E'.
          ELSE.
            CLEAR:gt_YTEST300[],gt_YTEST300.

LOOP AT itab.
              gt_YTEST300-sequence = sy-tabix.
              READ TABLE gt_vrm_values WITH KEY key = itab.
              IF sy-subrc <> 0.
                CONCATENATE itab ` 字段不存在` INTO c1.
                CLEAR:gt_YTEST300[],gt_YTEST300.
                MESSAGE c1 TYPE 'E'.
              ENDIF.
              gt_YTEST300-username = p_varusr.
              gt_YTEST300-tabname = p_table.
              gt_YTEST300-fldname = itab.
              APPEND gt_YTEST300.
            ENDLOOP.

DATA:lt_dd03l TYPE TABLE OF dd03l WITH HEADER LINE,msg TYPE string.
            CLEAR:msg,lt_dd03l,lt_dd03l[].
            SELECT tabname fieldname keyflag rollname position inttype leng decimals FROM dd03l INTO CORRESPONDING FIELDS OF TABLE lt_dd03l
                    WHERE tabname = p_table AND keyflag = 'X'.

LOOP AT lt_dd03l.
              READ TABLE gt_YTEST300 WITH KEY fldname = lt_dd03l-fieldname.
              IF sy-subrc <> 0.
                CONCATENATE lt_dd03l-fieldname `为主键,不能删除` INTO msg.
                MESSAGE msg TYPE 'E'.
              ENDIF.
            ENDLOOP.

DELETE FROM YTEST300 WHERE username = p_varusr AND tabname = p_table.
            MODIFY YTEST300 FROM TABLE gt_YTEST300.
            COMMIT WORK.
            MESSAGE '保存成功' TYPE 'I'.
          ENDIF.
        ENDIF.
      ENDIF.
    WHEN 'RE_LOAD'.
      DATA: l_answer.
      CALL FUNCTION 'POPUP_TO_CONFIRM'
        EXPORTING
          text_question         = '重置会将当前配置从YTEST300中删除,是否继续?'
          icon_button_1         = '是'
          icon_button_2         = '否'
          default_button        = '2'
          display_cancel_button = ''
        IMPORTING
          answer                = l_answer
        EXCEPTIONS
          text_not_found        = 1
          OTHERS                = 2.
      IF l_answer = '1'.
        DELETE FROM YTEST300 WHERE username = p_varusr AND tabname = p_table.
      ENDIF.

ENDCASE.
ENDMODULE. " USER_COMMAND_1001 INPUT

*&---------------------------------------------------------------------*
*&      Form  frm_val
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_val TABLES lt_vrm_values TYPE vrm_values rtables STRUCTURE range_c35 lt_vrm_values_dt TYPE vrm_values lt_dd03l STRUCTURE dd03l USING mandt.
  DATA:lt_dd03t TYPE TABLE OF dd03t WITH HEADER LINE,
       lt_dd04t TYPE TABLE OF dd04t WITH HEADER LINE.
  DATA:ls_vrm_values  LIKE LINE OF lt_vrm_values.
  DATA:BEGIN OF  fieldname OCCURS 0,
    fieldname TYPE dd03t-fieldname ,
    END OF fieldname.
  DATA:BEGIN OF rollname OCCURS 0,
    rollname TYPE dd04t-rollname ,
    END OF rollname.

IF rtables[] IS INITIAL.
    rtables-sign = 'I'.
    rtables-option = 'EQ'.
    rtables-low = p_table.
    APPEND rtables.
  ENDIF.

IF mandt IS NOT INITIAL.
    SELECT tabname fieldname keyflag rollname position inttype leng decimals FROM dd03l INTO CORRESPONDING FIELDS OF TABLE lt_dd03l
            WHERE tabname IN rtables AND fieldname <> '.INCLU--AP' AND fieldname <> '.INCLUDE'.
  ELSE.
    SELECT tabname fieldname keyflag rollname position inttype leng decimals FROM dd03l INTO CORRESPONDING FIELDS OF TABLE lt_dd03l
            WHERE tabname IN rtables AND fieldname <> 'MANDT' AND fieldname <> '.INCLU--AP' AND fieldname <> '.INCLUDE'.
  ENDIF.

SORT lt_dd03l BY position.
  LOOP AT lt_dd03l .
    IF lt_dd03l-rollname = ''.
      APPEND lt_dd03l-fieldname TO fieldname.
    ELSE.
      APPEND lt_dd03l-rollname TO rollname.
    ENDIF.
  ENDLOOP.

IF fieldname[] IS NOT INITIAL.
    SELECT fieldname ddtext INTO CORRESPONDING FIELDS OF TABLE lt_dd03t
               FROM dd03t
               FOR ALL ENTRIES IN fieldname
               WHERE tabname = p_table
                 AND ddlanguage = '1'
                 AND fieldname = fieldname-fieldname.
  ENDIF.

IF rollname[] IS NOT INITIAL.
    SELECT rollname ddtext INTO CORRESPONDING FIELDS OF TABLE lt_dd04t
               FROM dd04t
               FOR ALL ENTRIES IN rollname
               WHERE ddlanguage = '1'
                 AND rollname = rollname-rollname.
  ENDIF.

REFRESH lt_vrm_values.
  LOOP AT lt_dd03l.
    ls_vrm_values-key = lt_dd03l-fieldname.
    IF lt_dd03l-rollname = ''.
      READ TABLE lt_dd03t WITH KEY fieldname = lt_dd03l-fieldname.
      IF sy-subrc = 0.
        CONCATENATE lt_dd03l-fieldname `:` lt_dd03t-ddtext INTO ls_vrm_values-text SEPARATED BY  ``.
      ENDIF.
    ELSE.
      READ TABLE lt_dd04t WITH KEY rollname = lt_dd03l-rollname.
      IF sy-subrc = 0.
        CONCATENATE lt_dd03l-fieldname `:` lt_dd04t-ddtext INTO ls_vrm_values-text SEPARATED BY  ``.
      ENDIF.
    ENDIF.
    IF lt_dd03l-inttype = 'D'.
      APPEND ls_vrm_values TO lt_vrm_values_dt.
    ENDIF.
    APPEND ls_vrm_values TO lt_vrm_values.
  ENDLOOP.

ENDFORM. "frm_val

*&---------------------------------------------------------------------*
*&      Module  STATUS_1002  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_1002 OUTPUT.
  SET PF-STATUS 'ST_1002'.
  SET TITLEBAR '1002'.
  CLEAR: texttable[],line,gt_YTEST300,gt_YTEST300[].

CLEAR:gt_vrm_values,gt_vrm_values[],gt_vrm_values_dt,gt_vrm_values_dt[],gt_dd03l,gt_dd03l[],rtables,rtables[].
  PERFORM frm_val TABLES gt_vrm_values rtables gt_vrm_values_dt gt_dd03l USING 'X'.

CONCATENATE `CREATE TABLE IF NOT EXISTS SAP_R3_` p_table `(` INTO line.
  SELECT * FROM YTEST300 INTO TABLE gt_YTEST300 WHERE username = p_varusr AND tabname = p_table ORDER BY sequence ASCENDING.
  IF sy-subrc = 0.
    LOOP AT gt_YTEST300.
      READ TABLE gt_vrm_values WITH KEY key = gt_YTEST300-fldname.
      CLEAR:itab[].
      SPLIT gt_vrm_values-text AT `:` INTO itab c1 .
      REPLACE ALL OCCURRENCES OF `'` IN c1  WITH ``.
      REPLACE ALL OCCURRENCES OF `,` IN c1  WITH ``.
      CONCATENATE line c_crlf gt_YTEST300-fldname ` STRING COMMENT '` c1 `',` INTO line SEPARATED BY ``.
    ENDLOOP.
  ELSE.
    LOOP AT gt_vrm_values.
      CLEAR:itab[].
      SPLIT gt_vrm_values-text AT `:` INTO itab c1 .
      REPLACE ALL OCCURRENCES OF `'` IN c1  WITH ``.
      REPLACE ALL OCCURRENCES OF `,` IN c1  WITH ``.
      CONCATENATE line c_crlf gt_vrm_values-key ` STRING COMMENT '` c1 `',` INTO line SEPARATED BY ``.
    ENDLOOP.
  ENDIF.
  DATA: str_len TYPE i.
  str_len = STRLEN( line ).
  str_len = str_len - 1.
  line = line+0(str_len).
  CONCATENATE line c_crlf `);` INTO line.
  APPEND line TO texttable.

IF editor_container2 IS NOT BOUND.
    CREATE OBJECT editor_container2
          EXPORTING
            container_name =  'EDITOR2'.

CREATE OBJECT editor2
        EXPORTING
          parent = editor_container2
          wordwrap_mode = 1
          max_number_chars = 12000.
  ENDIF.
  editor2->set_textstream( line ).
ENDMODULE. " STATUS_1002 OUTPUT

*&---------------------------------------------------------------------*
*&      Module  user_command_1002  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_1002 INPUT.
  CASE sy-ucomm.
    WHEN 'RW'.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE. " user_command_1002 INPUT
*&---------------------------------------------------------------------*
*&      Module  STATUS_1003  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_1003 OUTPUT.
  SET PF-STATUS 'ST_1003'.
  SET TITLEBAR '1003'.

DATA: code TYPE TABLE OF string WITH HEADER LINE.

CLEAR: line,gt_YTEST300,gt_YTEST300[].

IF editor_container3 IS NOT BOUND.
    CREATE OBJECT editor_container3
          EXPORTING
            container_name =  'EDITOR3'.

CREATE OBJECT editor3
        EXPORTING
          parent = editor_container3
          wordwrap_mode = 1
          max_number_chars = 600000.
  ENDIF.
  READ REPORT 'YTEMPLET' INTO code.
  LOOP AT code.
    IF line = ''.
      line = code.
    ELSE.
      CONCATENATE  line cl_abap_char_utilities=>cr_lf code INTO line.
    ENDIF.
  ENDLOOP.
  editor3->set_textstream( line ).
ENDMODULE. " STATUS_1003 OUTPUT

*&---------------------------------------------------------------------*
*&      Form  frm_key_constr
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_SRC_TAB     text
*      -->LT_DD03L      text
*      -->P_KEY_CONSTR  text
*      -->P_ORDERBY     text
*----------------------------------------------------------------------*
FORM frm_key_constr TABLES p_src_tab pt_dd03l STRUCTURE dd03l key_constr.
  DATA:lin TYPE i.
  DATA: counts TYPE i.
  FIELD-SYMBOLS: <fldvalue>.
  DATA: wa_dd03l LIKE lt_dd03l.
  DATA: p_key_constr TYPE string.
  DATA: lt_dd03l TYPE TABLE OF dd03l WITH HEADER LINE.
  lt_dd03l[] = pt_dd03l[].
  READ TABLE lt_dd03l INTO wa_dd03l INDEX 1.
  DELETE lt_dd03l INDEX 1.
  DESCRIBE TABLE lt_dd03l LINES counts.
  DESCRIBE TABLE p_src_tab LINES lin.
  CHECK lin > 0.
  READ TABLE p_src_tab INDEX lin.

DO.
    DO counts TIMES.
      READ TABLE lt_dd03l INDEX sy-index.
      ASSIGN COMPONENT lt_dd03l-fieldname OF STRUCTURE p_src_tab TO <fldvalue>.
      IF sy-index < counts.
        IF p_key_constr <>  ''.
          CONCATENATE p_key_constr lt_dd03l-fieldname ` = '` <fldvalue> `'` INTO p_key_constr.
        ELSE.
          CONCATENATE lt_dd03l-fieldname ` = '` <fldvalue> `'` INTO p_key_constr.
        ENDIF.
        CONCATENATE p_key_constr ` AND ` INTO p_key_constr.
      ELSEIF sy-index = counts.
        IF p_key_constr <>  ''.
          CONCATENATE p_key_constr lt_dd03l-fieldname ` > '` <fldvalue> `'` INTO p_key_constr.
        ELSE.
          CONCATENATE lt_dd03l-fieldname ` > '` <fldvalue> `'` INTO p_key_constr.
        ENDIF.
      ENDIF.
    ENDDO.
    counts = counts - 1.
    IF counts <= 0.
      EXIT.
    ELSE.
      CONCATENATE p_key_constr ` OR ` INTO p_key_constr.
    ENDIF.
  ENDDO.
  CLEAR: itab,itab[].
  SPLIT p_key_constr AT ` OR ` INTO TABLE itab .
  DESCRIBE TABLE itab LINES counts.
  ASSIGN COMPONENT wa_dd03l-fieldname OF STRUCTURE p_src_tab TO <fldvalue>.
  DO counts TIMES.
    READ TABLE itab INDEX sy-index.
    CONCATENATE wa_dd03l-fieldname ` = '` <fldvalue> `' AND ` itab INTO key_constr.
    APPEND key_constr.
  ENDDO.
ENDFORM. " frm_key_constr

*&---------------------------------------------------------------------*
*&      Form  frm_comp_tab
*&---------------------------------------------------------------------*
*       递归将某结构组件展开(如:由于BKPF表中.APPEND附加结构,通过
*       struct_type ?= cl_abap_typedescr=>describe_by_name( 'BKPF' )获得
*       的组件中就会有STRU类型的组件,而非基本类型组件,所以需递归展开)
*----------------------------------------------------------------------*
*      -->COMP_TAB   某结构的组件
*----------------------------------------------------------------------*
FORM frm_comp_tab TABLES comp_tab TYPE cl_abap_structdescr=>component_table.
  DATA: lt_comp_tab LIKE comp_tab[] WITH HEADER LINE.
  DATA:struct_type3 TYPE REF TO cl_abap_structdescr,
     comp_tab3 TYPE cl_abap_structdescr=>component_table WITH HEADER LINE.

LOOP AT comp_tab .
    IF comp_tab-name <> ''.
      APPEND comp_tab TO lt_comp_tab.
    ELSE.
      struct_type3 ?= comp_tab-type.
      comp_tab3[] = struct_type3->get_components( ).
      PERFORM frm_comp_tab TABLES comp_tab3.
      APPEND LINES OF comp_tab3 TO lt_comp_tab.
    ENDIF.
  ENDLOOP.
  comp_tab[] = lt_comp_tab[].
ENDFORM. " frm_comp_tab

*&---------------------------------------------------------------------*
*&      Form  frm_find_table
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_find_table USING p_tablex.
  DATA: code TYPE TABLE OF string WITH HEADER LINE.
  DATA: off  TYPE i,
        moff TYPE i,
        mlen TYPE i,
        diffoff TYPE i.
  DATA: tmpstr TYPE string.
  CLEAR:rtables,rtables[].

IF p_prog IS NOT INITIAL.
    READ REPORT p_prog INTO code.
    line = ''.
    LOOP AT code.
      REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>horizontal_tab IN code WITH ` `.
      CONDENSE code.
      CLEAR itab.
      SPLIT code AT ` ` INTO TABLE itab .
      LOOP AT itab WHERE table_line IS NOT INITIAL.
        IF line = ''.
          line = itab.
        ELSE.
          CONCATENATE  line ` ` itab INTO line SEPARATED BY ``.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
    off = 0.
    DO.
      FIND ` FROM ` IN SECTION OFFSET off OF
           line
           IGNORING CASE
           MATCH OFFSET moff
           MATCH LENGTH mlen.
      IF sy-subrc = 0.
        off = moff + mlen.
        FIND ` ` IN SECTION OFFSET off OF
           line
           IGNORING CASE
           MATCH OFFSET moff
           MATCH LENGTH mlen.
        tmpstr = line.
        diffoff = moff - off.
        tmpstr = tmpstr+off(diffoff).
        CONDENSE tmpstr.
        rtables-sign = 'I'.
        rtables-option = 'EQ'.
        rtables-low = tmpstr.
        SET LOCALE LANGUAGE '1' .
        TRANSLATE rtables-low TO UPPER CASE.
        APPEND rtables.
      ELSE.
        EXIT.
      ENDIF.
    ENDDO.

off = 0.
    DO.
      FIND ` JOIN ` IN SECTION OFFSET off OF
           line
           IGNORING CASE
           MATCH OFFSET moff
           MATCH LENGTH mlen.
      IF sy-subrc = 0.
        off = moff + mlen.
        FIND ` ` IN SECTION OFFSET off OF
           line
           IGNORING CASE
           MATCH OFFSET moff
           MATCH LENGTH mlen.
        tmpstr = line.
        diffoff = moff - off.
        tmpstr = tmpstr+off(diffoff).
        CONDENSE tmpstr.
        rtables-sign = 'I'.
        rtables-option = 'EQ'.
        rtables-low = tmpstr.
        SET LOCALE LANGUAGE '1' .
        TRANSLATE rtables-low TO UPPER CASE.
        APPEND rtables.
      ELSE.
        EXIT.
      ENDIF.
    ENDDO.
  ENDIF.

IF rtables[] IS NOT INITIAL AND p_tablex IS NOT INITIAL.
    rtables-sign = 'I'.
    rtables-option = 'EQ'.
    rtables-low = p_table.
    SET LOCALE LANGUAGE '1' .
    TRANSLATE rtables-low TO UPPER CASE.
    APPEND rtables.
  ENDIF.

CLEAR:gt_vrm_values,gt_vrm_values[],gt_vrm_values_dt,gt_vrm_values_dt[],gt_dd03l,gt_dd03l[].
  PERFORM frm_val TABLES gt_vrm_values rtables gt_vrm_values_dt gt_dd03l USING 'X'.

ENDFORM. "frm_find_table

*&---------------------------------------------------------------------*
*&      Form  frm_find_sel
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_find_sel .
  DATA: code TYPE TABLE OF string WITH HEADER LINE.
  DATA: off  TYPE i,
        moff TYPE i,
        moff2 TYPE i,
        mlen TYPE i,
        diffoff TYPE i.

DATA: BEGIN OF lt_sel OCCURS 0,
    sel TYPE string,
  END OF lt_sel.
  lt_sel-sel = ` IN S_ASIST1`.
  APPEND lt_sel.
  lt_sel-sel = ` IN S_ASIST2`.
  APPEND lt_sel.
  lt_sel-sel = ` IN S_ASIST3`.
  APPEND lt_sel.
  lt_sel-sel = ` IN S_ASIST4`.
  APPEND lt_sel.
  lt_sel-sel = ` IN S_ASIST5`.
  APPEND lt_sel.

CLEAR:sel_flds,sel_flds[].
  IF p_prog IS NOT INITIAL.
    READ REPORT p_prog INTO code.
    line = ''.
    LOOP AT code.
      REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>horizontal_tab IN code WITH ` `.
      CONDENSE code.
      CLEAR itab.
      SPLIT code AT ` ` INTO TABLE itab .
      LOOP AT itab WHERE table_line IS NOT INITIAL.
        IF line = ''.
          line = itab.
        ELSE.
          CONCATENATE  line ` ` itab INTO line SEPARATED BY ``.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
    off = 0.
    LOOP AT lt_sel.
      DO.
        FIND lt_sel-sel IN SECTION OFFSET off OF
             line
             IGNORING CASE
             MATCH OFFSET moff
             MATCH LENGTH mlen.
        IF sy-subrc = 0.
          moff2 = moff - 1.
          WHILE line+moff2(1) <> ` `.
            moff2 = moff2 - 1.
            IF moff2 < 0.
              EXIT.
            ENDIF.
          ENDWHILE.
          diffoff = moff - moff2.
          sel_flds-fld = line+moff2(diffoff).
          SHIFT sel_flds-fld UP TO `~` LEFT.
          REPLACE ALL OCCURRENCES OF `~` IN sel_flds-fld WITH ``.
          CONDENSE sel_flds-fld.
          TRANSLATE sel_flds-fld TO UPPER CASE.
          CASE lt_sel-sel.
            WHEN ` IN S_ASIST1`.
              sel_flds-p_snam = 's_asist1'.
            WHEN ` IN S_ASIST2`.
              sel_flds-p_snam = 's_asist2'.
            WHEN ` IN S_ASIST3`.
              sel_flds-p_snam = 's_asist3'.
            WHEN ` IN S_ASIST4`.
              sel_flds-p_snam = 's_asist4'.
            WHEN ` IN S_ASIST5`.
              sel_flds-p_snam = 's_asist5'.
          ENDCASE.
          APPEND sel_flds.
          off = moff + mlen.
        ELSE.
          EXIT.
        ENDIF.
      ENDDO.
    ENDLOOP.
  ENDIF.

ENDFORM. "frm_find_table

*&---------------------------------------------------------------------*
*&      Module  user_command_1003  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_1003 INPUT.
  CASE sy-ucomm.
    WHEN 'RW'.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE. " user_command_1003 INPUT
*&---------------------------------------------------------------------*
*&      Form  frm_write_file
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_SRC_TAB  text
*----------------------------------------------------------------------*
FORM frm_write_file TABLES p_src_tab.

DATA:str TYPE string.
  CONCATENATE  `/usr/sap/tmp/` p_fil_px2 `.` p_extens INTO gv_filename SEPARATED BY ``.
  CONCATENATE  `正在向SAP服务上Append文件:` gv_filename INTO str.

IF g_count = 2.
    DELETE DATASET gv_filename.
  ENDIF.

CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 20
      text       = str.

DATA buffer TYPE xstring.
  PERFORM frm_buffer TABLES p_src_tab USING buffer.
  OPEN DATASET gv_filename FOR APPENDING IN BINARY MODE.

TRANSFER buffer TO gv_filename.

CLOSE DATASET gv_filename.
ENDFORM. " frm_write_file

*&---------------------------------------------------------------------*
*&      Form  frm_ftp_append
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_ftp_append .
  DATA: localfile TYPE string.
  PERFORM f_ftp_connect.
  PERFORM frm_cd_dir.
  CONCATENATE  p_fil_px2 `.` p_extens INTO gv_filename SEPARATED BY ``.
  CONCATENATE  `/usr/sap/tmp/` p_fil_px2 `.` p_extens INTO localfile SEPARATED BY ``.
  CLEAR:com,com[],res,res[].
  CONCATENATE 'append ' localfile  gv_filename INTO com-cmd SEPARATED BY ' '.

CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
      handle        = thandle
      command       = com-cmd
    TABLES
      data          = res
    EXCEPTIONS
      tcpip_error   = 1
      command_error = 2
      data_error    = 3
      OTHERS        = 4.

PERFORM f_ftp_disconnect.

ENDFORM. " frm_ftp_append

*&---------------------------------------------------------------------*
*&      Form  frm_buffer
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_BUFFER  text
*----------------------------------------------------------------------*
FORM frm_buffer TABLES p_src_tab USING p_buffer.
  DATA:strct_type_ref TYPE REF TO cl_abap_structdescr,
          tab_type_ref TYPE REF TO cl_abap_tabledescr,
          t_component TYPE cl_abap_structdescr=>component_table,
          wa_component LIKE LINE OF t_component.
  FIELD-SYMBOLS: <fldvalue>.

DATA: l_str TYPE string,fldstr TYPE string,fldtype,firsttime VALUE 'X'.

DATA: str TYPE string.
  DATA: codepage TYPE cpcodepage,
     encoding TYPE abap_encoding,
    convout TYPE REF TO cl_abap_conv_out_ce.
  DATA:time_stamp TYPE timestampl,timestamp_c(22).

CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
    EXPORTING
      external_name = p_encodi
    IMPORTING
      sap_codepage  = codepage.
  encoding = codepage.

CALL METHOD cl_abap_conv_out_ce=>create
    EXPORTING
      encoding = encoding
    RECEIVING
      conv     = convout.

tab_type_ref ?= cl_abap_tabledescr=>describe_by_data( p_src_tab[] ).
  strct_type_ref ?= tab_type_ref->get_table_line_type( ).
  t_component = strct_type_ref->get_components( ).

str = p_split.
  REPLACE ALL OCCURRENCES OF `\t` IN str  WITH c_tab.
  REPLACE ALL OCCURRENCES OF `\T` IN str  WITH c_tab.
  REPLACE ALL OCCURRENCES OF ` ` IN str  WITH ``.

GET TIME STAMP FIELD time_stamp.
  timestamp_c = time_stamp.

LOOP AT p_src_tab.
    firsttime = 'X'.
    CLEAR:fldstr,l_str.
    LOOP AT t_component INTO wa_component.

IF wa_component-name = 'ZTIMESTAMPL'.
        IF firsttime = 'X'.
          fldstr = time_stamp.
          CLEAR firsttime.
        ELSE.
          CONCATENATE fldstr timestamp_c INTO fldstr SEPARATED BY str.
        ENDIF.
        CONTINUE.
      ENDIF.

fldtype = wa_component-type->type_kind.
      ASSIGN COMPONENT wa_component-name OF STRUCTURE p_src_tab TO <fldvalue>.
      l_str = <fldvalue>.
      IF fldtype = 'P' OR fldtype = 'F'
        OR fldtype = 'I' OR fldtype = 'b'
        OR fldtype = 's'.
        CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
          CHANGING
            value = l_str.
      ENDIF.
      REPLACE ALL OCCURRENCES OF str IN l_str  WITH ` `.
      IF firsttime = 'X'.
        fldstr = l_str .
        CLEAR firsttime.
      ELSE.
        CONCATENATE fldstr l_str INTO fldstr SEPARATED BY str.
      ENDIF.
    ENDLOOP.

CONDENSE fldstr.
    CALL METHOD convout->write
      EXPORTING
        data = fldstr.
    CALL METHOD convout->write
      EXPORTING
        data = cl_abap_char_utilities=>cr_lf.
  ENDLOOP.
  CALL METHOD convout->get_buffer
    RECEIVING
      buffer = p_buffer.
ENDFORM. " frm_buffer

*&---------------------------------------------------------------------*
*&      Form  frm_write_file2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->STR1       text
*      -->STR2       text
*----------------------------------------------------------------------*
FORM frm_write_file2 USING str1 lins tabix .
  DATA:str TYPE string.
  GET RUN TIME FIELD tm2.
  tm = ( tm2 - tm1 ) / 1000 / 1000.
  tm1 = tm2.
  str = lins.
  CONCATENATE  `/usr/sap/tmp/` p_fil_px2 `.log` INTO gv_filename SEPARATED BY ``.
  IF tabix = 1 AND g_count = 1.
    DELETE DATASET gv_filename.
  ENDIF.
  OPEN DATASET gv_filename FOR APPENDING IN TEXT MODE ENCODING  DEFAULT.
  CONCATENATE `【` str `条】` str1 ` : 【` tm `秒】`INTO str.
  TRANSFER str TO gv_filename.
  CLOSE DATASET gv_filename.
ENDFORM. "frm_write_file2
*&---------------------------------------------------------------------*
*&      Form  frm_write_file3
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_write_file3.
  DATA:str TYPE string.
  CONCATENATE  `/usr/sap/tmp/` p_fil_px2 `.log` INTO gv_filename SEPARATED BY ``.

OPEN DATASET gv_filename FOR APPENDING IN TEXT MODE ENCODING  DEFAULT.
  TRANSFER g_count TO gv_filename.
  TRANSFER ` ` TO gv_filename.
  CLOSE DATASET gv_filename.
ENDFORM. "frm_write_file3

Extracted by Mass Download version 1.5.5 - E.G.Mellodew. 1998-2017. Sap Release 640

Code listing for: YR3TABLE2FTP_SELSCR

Description: Include YR3TABLE2FTP_SELSCR

*&---------------------------------------------------------------------*
*&  包括              YR3TABLE2FTP_SELSCR
*&---------------------------------------------------------------------*
DATA: d TYPE sy-datum,c(35),c35(35).

SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-008 FOR FIELD p_table,
 POSITION POS_LOW.
PARAMETERS:p_table(16) OBLIGATORY.
SELECTION-SCREEN COMMENT 50(20) text-009.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN: BEGIN OF BLOCK b11 WITH FRAME TITLE text-021.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(10) text-003 FOR FIELD p_name1,
 POSITION POS_LOW.
PARAMETERS: p_name1(20) AS LISTBOX VISIBLE LENGTH 30.
SELECTION-SCREEN POSITION 61.
SELECT-OPTIONS:s_val1 FOR d .

SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-004 FOR FIELD p_name2,
 POSITION POS_LOW.
PARAMETERS: p_name2(20) AS LISTBOX VISIBLE LENGTH 30.
SELECTION-SCREEN POSITION 61.
SELECT-OPTIONS:s_val2 FOR c VISIBLE LENGTH 30.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-005 FOR FIELD p_name3,
 POSITION POS_LOW.
PARAMETERS: p_name3(20) AS LISTBOX VISIBLE LENGTH 30.
SELECTION-SCREEN POSITION 61.
SELECT-OPTIONS:s_val3 FOR c VISIBLE LENGTH 30.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-006 FOR FIELD p_name4,
 POSITION POS_LOW.
PARAMETERS: p_name4(20) AS LISTBOX VISIBLE LENGTH 30.
SELECTION-SCREEN POSITION 61.
SELECT-OPTIONS:s_val4 FOR c VISIBLE LENGTH 30.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-007 FOR FIELD p_name5,
 POSITION POS_LOW.
PARAMETERS: p_name5(20) AS LISTBOX VISIBLE LENGTH 30.
SELECTION-SCREEN POSITION 61.
SELECT-OPTIONS:s_val5 FOR c VISIBLE LENGTH 30.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-010 FOR FIELD p_name6,
 POSITION POS_LOW.
PARAMETERS: p_name6(20) AS LISTBOX VISIBLE LENGTH 30.
SELECTION-SCREEN POSITION 61.
SELECT-OPTIONS:s_val6 FOR c VISIBLE LENGTH 30.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-011 FOR FIELD p_name7,
 POSITION POS_LOW.
PARAMETERS: p_name7(20) AS LISTBOX VISIBLE LENGTH 30.
SELECTION-SCREEN POSITION 61.
SELECT-OPTIONS:s_val7 FOR c VISIBLE LENGTH 30.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-012 FOR FIELD p_name8,
 POSITION POS_LOW.
PARAMETERS: p_name8(20) AS LISTBOX VISIBLE LENGTH 30.
SELECTION-SCREEN POSITION 61.
SELECT-OPTIONS:s_val8 FOR c VISIBLE LENGTH 30.
SELECTION-SCREEN END OF LINE.

PARAMETERS:p_counts(10) TYPE n DEFAULT '100000' OBLIGATORY.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 63(75) text-016.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 63(75) text-031.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON 1(40) but1 USER-COMMAND cli1
                           VISIBLE LENGTH 15.
SELECTION-SCREEN PUSHBUTTON 20(40) but2 USER-COMMAND cli2
                           VISIBLE LENGTH 15.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK b11.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN: COMMENT 1(18) text-112 FOR FIELD p_name8,
POSITION POS_LOW.
PARAMETERS: p_prog(20) .
SELECTION-SCREEN COMMENT 54(16) text-900.
SELECTION-SCREEN PUSHBUTTON 70(20) but3 USER-COMMAND cli3
                           VISIBLE LENGTH 20.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN: BEGIN OF BLOCK b3 WITH FRAME TITLE text-030.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-003 FOR FIELD p_snam1,
 POSITION POS_LOW.
PARAMETERS: p_snam1(30) .
SELECTION-SCREEN POSITION 61.
SELECT-OPTIONS:s_asist1 FOR c35 .
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-004 FOR FIELD p_snam2,
 POSITION POS_LOW.
PARAMETERS: p_snam2(30) .
SELECTION-SCREEN POSITION 61.
SELECT-OPTIONS:s_asist2 FOR c35 .
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-005 FOR FIELD p_snam3,
 POSITION POS_LOW.
PARAMETERS: p_snam3(30) .
SELECTION-SCREEN POSITION 61.
SELECT-OPTIONS:s_asist3 FOR c35 .
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-006 FOR FIELD p_snam4,
 POSITION POS_LOW.
PARAMETERS: p_snam4(30) .
SELECTION-SCREEN POSITION 61.
SELECT-OPTIONS:s_asist4 FOR c35 .
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-007 FOR FIELD p_snam5,
 POSITION POS_LOW.
PARAMETERS: p_snam5(30) .
SELECTION-SCREEN POSITION 61.
SELECT-OPTIONS:s_asist5 FOR c35 .
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK b3.

SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN: BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
PARAMETERS:
            p_host(60)  LOWER CASE OBLIGATORY VISIBLE LENGTH 15
                        DEFAULT '10.27.15.33' ,
            p_user(15) TYPE c  LOWER CASE OBLIGATORY
                          DEFAULT 'ftp_r3_w',
            p_pwd(15) TYPE c LOWER CASE OBLIGATORY
                          DEFAULT 'ftp_r3_w@123',
            ftp_path(100)  LOWER CASE DEFAULT '/' VISIBLE LENGTH 30 OBLIGATORY.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-071 FOR FIELD p_dir_dt,
 POSITION POS_LOW.
PARAMETERS: p_dir_dt TYPE sy-datum DEFAULT sy-datum.
SELECTION-SCREEN: COMMENT 45(64) text-018.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-017 FOR FIELD  p_fil_px,
 POSITION POS_LOW.
PARAMETERS: p_fil_px(20) LOWER CASE.

*SELECTION-SCREEN: COMMENT 54(9) text-231.
PARAMETERS p_ymd(14) AS LISTBOX VISIBLE LENGTH 9 DEFAULT 'YYYYMMDD'.
PARAMETERS p_fileno(7) AS LISTBOX VISIBLE LENGTH 9 DEFAULT '_NNNNNNN'.
SELECTION-SCREEN: COMMENT 74(1) text-033.
SELECTION-SCREEN:POSITION 75.
PARAMETERS: p_extens(6) LOWER CASE DEFAULT 'DAT' VISIBLE LENGTH 3.
SELECTION-SCREEN: COMMENT 79(75) text-028.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-771 FOR FIELD p_ymd2,
 POSITION POS_LOW.
PARAMETERS: p_ymd2 TYPE sy-datum DEFAULT sy-datum.
SELECTION-SCREEN: COMMENT 45(64) text-118.
SELECTION-SCREEN END OF LINE.

PARAMETERS:p_encodi(10) AS LISTBOX VISIBLE LENGTH 10 DEFAULT 'UTF-8' OBLIGATORY.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-013 FOR FIELD p_split,
 POSITION POS_LOW.
PARAMETERS p_split(3) OBLIGATORY DEFAULT '|'.
SELECTION-SCREEN COMMENT 37(79) text-014 .
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(14) text-133 FOR FIELD p_flgex,
 POSITION POS_LOW.
PARAMETERS p_flgex(6) LOWER CASE OBLIGATORY VISIBLE LENGTH 3 DEFAULT 'FLG'.
SELECTION-SCREEN COMMENT 37(79) text-140 .
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(12) text-123 ,
 POSITION POS_LOW.
PARAMETERS: p_header AS CHECKBOX DEFAULT ''.
SELECTION-SCREEN:COMMENT 37(73) text-126 .
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(18) text-213 ,
 POSITION POS_LOW.
PARAMETERS: p_hdtlg AS CHECKBOX DEFAULT ''.
SELECTION-SCREEN:COMMENT 37(73) text-128 .
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(32) text-121 ,
 POSITION POS_LOW.
PARAMETERS: pflgfile AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(32) text-122 ,
 POSITION POS_LOW.
PARAMETERS: timestmp AS CHECKBOX DEFAULT ''.
SELECTION-SCREEN:COMMENT 37(73) text-129 .
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK b2.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
 COMMENT 1(18) text-127 ,
 POSITION POS_LOW.
PARAMETERS: psqllog AS CHECKBOX DEFAULT ''.
SELECTION-SCREEN END OF LINE.

PARAMETERS: p_varusr TYPE usr02-bname DEFAULT sy-uname NO-DISPLAY.

Extracted by Mass Download version 1.5.5 - E.G.Mellodew. 1998-2017. Sap Release 640

Code listing for: YR3TABLE2FTP_TOP

Description: Include YR3TABLE2FTP_TOP

*&---------------------------------------------------------------------*
*&  包括              YR3TABLE2FTP_TOP
*&---------------------------------------------------------------------*
TYPE-POOLS:vrm.
TABLES: dd02l,progdir.

DATA:g_count(6) TYPE n,
     g_count_c(7).

DATA: key TYPE i VALUE 26101957,
      trfcdest LIKE rfcdes-rfcdest,
      thandle TYPE i,
      slen TYPE i.

DATA: gv_filename(50).

DATA: BEGIN OF com OCCURS 0,
        cmd(100) TYPE c,
      END OF com.
DATA: BEGIN OF res OCCURS 0,
        line(100) TYPE c,
      END OF res.

DATA: flg_ftp.
DATA: g_last_tbname(16).

DATA: BEGIN OF gt_name OCCURS 0,
      name TYPE string,
      END OF gt_name.
DATA:gt_YTEST300 TYPE TABLE OF YTEST300 WITH HEADER LINE.

*DATA:gt_zfit699 TYPE TABLE OF zfit699 WITH HEADER LINE.
DATA: editor_container TYPE REF TO cl_gui_custom_container,
 editor TYPE REF TO cl_gui_textedit.
DATA: editor_container2 TYPE REF TO cl_gui_custom_container,
editor2 TYPE REF TO cl_gui_textedit.
DATA: editor_container3 TYPE REF TO cl_gui_custom_container,
editor3 TYPE REF TO cl_gui_textedit.
CONSTANTS: c_line_length TYPE i VALUE 255.
TYPES: BEGIN OF st_text,
  line TYPE c LENGTH c_line_length,
END OF st_text.
TYPES: tt_text TYPE STANDARD TABLE OF st_text.
DATA texttable TYPE tt_text WITH HEADER LINE.
DATA line TYPE string.
DATA: itab TYPE TABLE OF string WITH HEADER LINE,
      itab2 TYPE TABLE OF string WITH HEADER LINE,
      c1(50),repeat TYPE i,
      g_tabix TYPE sy-tabix.
CONSTANTS: c_crlf(2) TYPE c VALUE cl_abap_char_utilities=>cr_lf.
CONSTANTS: c_tab(1) TYPE c VALUE cl_abap_char_utilities=>horizontal_tab.
DATA:gt_vrm_values TYPE vrm_values WITH HEADER LINE,gt_vrm_values_dt TYPE vrm_values.
DATA:gt_dd03l TYPE TABLE OF dd03l WITH HEADER LINE.

DATA:struct_type TYPE REF TO cl_abap_structdescr,
    elem_type TYPE REF TO cl_abap_elemdescr,
    table_type TYPE REF TO cl_abap_tabledescr,
    comp_tab TYPE cl_abap_structdescr=>component_table WITH HEADER LINE,
    comp_tab2 TYPE cl_abap_structdescr=>component_table WITH HEADER LINE.
DATA: flg2.
DATA: rtables TYPE TABLE OF range_c35 WITH HEADER LINE.

DATA: BEGIN OF sel_flds OCCURS 0,
  fld TYPE string,
  p_snam TYPE string,
END OF sel_flds.
DATA: p_fil_px2 TYPE string.

DATA: tm1 TYPE i,tm2 TYPE i,tm TYPE string.

Extracted by Mass Download version 1.5.5 - E.G.Mellodew. 1998-2017. Sap Release 640

Table: YTEST300

Description: 输出字段配置

Row Field name Position Key Data element Domain Datatype Length Lowercase Domain text
1 MANDT 1 X MANDT MANDT CLNT 3   客户端
2 USERNAME 2 X XUBNAME XUBNAME CHAR 12   用户主记录中的用户名称
3 TABNAME 3 X     CHAR 20   表名
4 FLDNAME 4 X     CHAR 20   字段名
5 SEQUENCE 5 X     INT2 5   位置
Extracted by Mass Download version 1.5.5 - E.G.Mellodew. 1998-2017. Sap Release 640

Code listing for: YTEMPLET

Description: 输出扩展模板程序

REPORT YTEMPLET.
*&---------------------------------------------------------------------*
*&      Form  frm_dyn
*&---------------------------------------------------------------------*
*       YR3TABLE2FTP(R3表抛FTP通用程序)输出逻辑扩展程序
*----------------------------------------------------------------------*
*      -->OUTPUT_TAB   原主表输出内表
*      -->COMP_TAB     原主表输出内表结构
*      -->S_ASIST1     关联表条件1
*      -->S_ASIST2     关联表条件2
*      -->S_ASIST3     关联表条件3
*      -->S_ASIST4     关联表条件4
*      -->S_ASIST5     关联表条件5
*      -->DY_TAB_NEW_REF  新输出内表内存地址
*----------------------------------------------------------------------*
FORM frm_dyn TABLES output_tab
comp_tab TYPE cl_abap_structdescr=>component_table
s_asist1 STRUCTURE range_c35
s_asist2 STRUCTURE range_c35
s_asist3 STRUCTURE range_c35
s_asist4 STRUCTURE range_c35
s_asist5 STRUCTURE range_c35
USING dy_tab_new_ref TYPE REF TO data.
  "-------------------------------------------勿动--BEGIN----------------------------------------->>
  FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,<dyn_wa>.
  FIELD-SYMBOLS: <dyn_table2> TYPE STANDARD TABLE,<dyn_wa2>.
  FIELD-SYMBOLS: <fldvalue>.
  DATA: dy_table TYPE REF TO data, dy_line TYPE REF TO data.
  DATA: dy_table2 TYPE REF TO data, dy_line2 TYPE REF TO data.
  DATA: elem_type TYPE REF TO cl_abap_elemdescr,
        struct_type_new TYPE REF TO cl_abap_structdescr,
        struct_type_new2 TYPE REF TO cl_abap_structdescr,
        table_type_new TYPE REF TO cl_abap_tabledescr,
        table_type_new2 TYPE REF TO cl_abap_tabledescr,
        comp_tab_new TYPE cl_abap_structdescr=>component_table WITH HEADER LINE."最终输出结构
  "-------------------------------------------勿动--E-N-D-----------------------------------------<<

"在这里自定义变量
  DATA:struct_type_YTEST200 TYPE REF TO cl_abap_structdescr,
       comp_tab_YTEST200 TYPE cl_abap_structdescr=>component_table WITH HEADER LINE.

DATA: BEGIN OF it_gwnr OCCURS 0,
        gwnr TYPE YTEST100-gwnr,
  END OF it_gwnr.
  DATA: it_YTEST200 TYPE TABLE OF YTEST200 WITH HEADER LINE.
  FIELD-SYMBOLS:<it_YTEST200> TYPE YTEST200.

"在这里修改输出结构
  LOOP AT comp_tab WHERE name = 'GWNR'.
    APPEND comp_tab TO comp_tab_new.
  ENDLOOP.
  struct_type_YTEST200 ?= cl_abap_typedescr=>describe_by_name( 'YTEST200' ).
  comp_tab_YTEST200[] = struct_type_YTEST200->get_components( ).
  "递归将深层组件结构展平
  PERFORM frm_comp_tab IN PROGRAM YR3TABLE2FTP TABLES comp_tab_YTEST200.

*  "删除不需要的输出字段
*  DELETE comp_tab_YTEST200 WHERE name <> 'OMS_ORDER_ITEM_I' AND
*                                name <> 'OMS_OLD_NO' AND
*                                name <> 'CMMDTY_CODE' AND
*                                name <> 'POSORDERID' AND
*                                name <> 'SUPPLIER_CODE' AND
*                                name <> 'ORDER_DATE' AND
*                                name <> 'COST_PRICE' AND
*                                name <> 'ORDER_SALE_TOTAL' AND
*                                name <> 'QUANTITY' AND
*                                name <> 'BILL_TYPE' AND
*                                name <> 'SALE_COMPANY'.
*  APPEND LINES OF comp_tab_YTEST200 TO comp_tab_new.
READ TABLE comp_tab_YTEST200 WITH KEY name = 'OMS_ORDER_ITEM_I'.
  APPEND comp_tab_YTEST200 TO comp_tab_new.
  READ TABLE comp_tab_YTEST200 WITH KEY name = 'OMS_OLD_NO'.
  APPEND comp_tab_YTEST200 TO comp_tab_new.
  READ TABLE comp_tab_YTEST200 WITH KEY name = 'CMMDTY_CODE'.
  APPEND comp_tab_YTEST200 TO comp_tab_new.
*  READ TABLE comp_tab_YTEST200 WITH KEY name = 'POSORDERID'.
*  APPEND comp_tab_YTEST200 TO comp_tab_new.
CLEAR: comp_tab_new.
  comp_tab_new-name = 'POSORDERID'.
  elem_type = cl_abap_elemdescr=>get_c( 14 ).
  comp_tab_new-type = elem_type.
  APPEND comp_tab_new.
  READ TABLE comp_tab_YTEST200 WITH KEY name = 'SALE_OFFICE'.
  APPEND comp_tab_YTEST200 TO comp_tab_new.
  READ TABLE comp_tab_YTEST200 WITH KEY name = 'SUPPLIER_CODE'.
  APPEND comp_tab_YTEST200 TO comp_tab_new.
*  READ TABLE comp_tab_YTEST200 WITH KEY name = 'ORDER_DATE'.
*  APPEND comp_tab_YTEST200 TO comp_tab_new.
CLEAR: comp_tab_new.
  comp_tab_new-name = 'ORDER_DATE'.
  elem_type = cl_abap_elemdescr=>get_c( 10 ).
  comp_tab_new-type = elem_type.
  APPEND comp_tab_new.

READ TABLE comp_tab_YTEST200 WITH KEY name = 'COST_PRICE'.
  APPEND comp_tab_YTEST200 TO comp_tab_new.
  READ TABLE comp_tab_YTEST200 WITH KEY name = 'ORDER_SALE_TOTAL'.
  APPEND comp_tab_YTEST200 TO comp_tab_new.
  READ TABLE comp_tab_YTEST200 WITH KEY name = 'QUANTITY'.
  APPEND comp_tab_YTEST200 TO comp_tab_new.
  READ TABLE comp_tab_YTEST200 WITH KEY name = 'BILL_TYPE'.
  APPEND comp_tab_YTEST200 TO comp_tab_new.
  READ TABLE comp_tab_YTEST200 WITH KEY name = 'SALE_COMPANY'.
  APPEND comp_tab_YTEST200 TO comp_tab_new.

"除了上面通过 cl_abap_typedescr=>describe_by_name(table)从表直接获取外,如表中没有的可手动增加列,比如这里在输出结构最后加上一列fldname

*  comp_tab_new-name = 'fldname'."设置列名为fldname
*  elem_type = cl_abap_elemdescr=>get_c( 2 ). "类型为c(2),不同的类型需调用不同的方法获取,具体参照下面描述
*  comp_tab_new-type = elem_type.
*  APPEND comp_tab_new.
"**************************************************
  "不同的ABAP类型需要调用不同的方法来获得:
  "ABAP类型 N:elem_type = cl_abap_elemdescr=>get_n( 内部长度 ).
  "ABAP类型 D:elem_type = cl_abap_elemdescr=>get_d( ).
  "ABAP类型 P:CALL METHOD cl_abap_elemdescr=>get_p
  " EXPORTING
  " p_length   = 内部长度
  " p_decimals = 小数位
  " RECEIVING
  " p_result   = elem_type.
  "ABAP类型 T:elem_type = cl_abap_elemdescr=>get_t( ).
  "ABAP类型 C:elem_type = cl_abap_elemdescr=>get_c( 内部长度 )."
  "ABAP类型 X:elem_type = cl_abap_elemdescr=>get_x( 内部长度 ).
  "ABAP类型 F:elem_type = cl_abap_elemdescr=>get_f( ).
  "ABAP类型 I、b、s:elem_type = cl_abap_elemdescr=>get_i( ).
  "ABAP类型 g:elem_type = cl_abap_elemdescr=>get_string( ).
  "ABAP类型 y:elem_type = cl_abap_elemdescr=>get_xstring( ).
  "**************************************************

"-------------------------------------------勿动--BEGIN----------------------------------------->>
  struct_type_new = cl_abap_structdescr=>create( comp_tab_new[] ).
  table_type_new = cl_abap_tabledescr=>create( struct_type_new ).
  CREATE DATA dy_table TYPE HANDLE table_type_new.
  ASSIGN dy_table->* TO <dyn_table>.
  CREATE DATA dy_line LIKE LINE OF <dyn_table>.
  ASSIGN dy_line->* TO <dyn_wa>.
  "-------------------------------------------勿动--E-N-D-----------------------------------------<<

"在这里进行数据处理与输出数据重组
  LOOP AT output_tab.
    ASSIGN COMPONENT 'GWNR' OF STRUCTURE output_tab TO <fldvalue>.
    it_gwnr-gwnr = <fldvalue>.
    COLLECT it_gwnr.
  ENDLOOP.
  IF it_gwnr[] IS NOT INITIAL.
    SELECT * INTO CORRESPONDING FIELDS OF TABLE it_YTEST200
               FROM
                     YTEST200 AS a
               FOR ALL ENTRIES IN
               it_gwnr
               WHERE gwnr = it_gwnr-gwnr
               AND a~rec_date IN s_asist3.
  ENDIF.

DELETE TABLE comp_tab_new WITH TABLE KEY name = 'SALE_OFFICE'.
  struct_type_new2 = cl_abap_structdescr=>create( comp_tab_new[] ).
  table_type_new2 = cl_abap_tabledescr=>create( struct_type_new2 ).
  CREATE DATA dy_table2 TYPE HANDLE table_type_new2.
  ASSIGN dy_table2->* TO <dyn_table2>.
  CREATE DATA dy_line2 LIKE LINE OF <dyn_table2>.
  ASSIGN dy_line2->* TO <dyn_wa2>.
  DATA: posorderid TYPE string,sale_office TYPE string.

LOOP AT it_YTEST200 ASSIGNING <it_YTEST200>.
    <it_YTEST200>-cost_price = <it_YTEST200>-cost_price * <it_YTEST200>-quantity.
    IF <it_YTEST200>-bill_type = '-1'.
      <it_YTEST200>-bill_type = 2.
    ENDIF.
    <it_YTEST200>-cost_price = ABS( <it_YTEST200>-cost_price ).
    <it_YTEST200>-quantity = ABS( <it_YTEST200>-quantity ).
    posorderid = <it_YTEST200>-posorderid.
    sale_office =  <it_YTEST200>-sale_office.
    CONDENSE: posorderid,sale_office.

CONCATENATE posorderid sale_office INTO posorderid SEPARATED BY ``.
    CONCATENATE <it_YTEST200>-order_date+0(4) `-` <it_YTEST200>-order_date+4(2) `-` <it_YTEST200>-order_date+6(2) INTO sale_office SEPARATED BY ``.
    MOVE-CORRESPONDING <it_YTEST200> TO <dyn_wa2>.
    ASSIGN COMPONENT 'POSORDERID' OF STRUCTURE <dyn_wa2> TO <fldvalue>.
    <fldvalue> = posorderid.
    ASSIGN COMPONENT 'ORDER_DATE' OF STRUCTURE <dyn_wa2> TO <fldvalue>.
    <fldvalue> = sale_office.
    APPEND <dyn_wa2> TO <dyn_table2>.
  ENDLOOP.

"-------------------------------------------勿动--BEGIN----------------------------------------->>

*  GET REFERENCE OF <dyn_table> INTO dy_tab_new_ref.
GET REFERENCE OF <dyn_table2> INTO dy_tab_new_ref.
  "-------------------------------------------勿动--E-N-D-----------------------------------------<<
ENDFORM. "frm_dyn
Extracted by Mass Download version 1.5.5 - E.G.Mellodew. 1998-2017. Sap Release 640

ABAP表抛FTP通用程序相关推荐

  1. 【ABAP】通过ST05分析程序执行路径

    在系统维护中,经常需要对用户自定义开发的程序以及系统的标准程序进行分析,需要知道程序执行中有哪些表被调用,执行了哪些操作.SAP提供了性能分析工具ST05,能够对程序执行中的操作进行跟踪.下面介绍如何 ...

  2. 简单的FTP应用程序

    下面的几个步骤包括了使用FtpWebRequest类实现ftp功能的一般过程 1.创建一个FtpWebRequest对象,指向ftp服务器的uri 2.设置ftp的执行方法(上传,下载等) 3.给Ft ...

  3. 通用程序算法和数据结构_了解通用数据结构

    通用程序算法和数据结构 In this article, I am going to walk you through the concepts of the common Data Structur ...

  4. 电子测量技术-设计测量数据误差处理的通用程序

    要求: 用c++或MATLAB设计测量数据误差处理的通用程序 (1)提供测试数据输入.粗大误差判别准则选择等的人机界面 (2)编写程序使用说明 (3)通过实验来验证程序的正确性 需要注意的是每一轮只能 ...

  5. 优雅编程之这样设计通用程序,你就“正常”了(二十七)

    开心一笑 [1.别人复习都是无懈可击,学渣复习是无中生有: 2.好了老师,我们各退一步,你们别讲了,我们也不听了: 3.少一点作业,多一颗数木:少一次考试,多一片森林:保护环境人人有责--] 视频教程 ...

  6. c语言simpson积分计算方法,数值分析复化Simpson积分公式和复化梯形积分公式计算积分的通用程序...

    数值分析复化Simpson积分公式和复化梯形积分公式计算积分的通用程序 数值分析第五次程序作业 PB09001057 孙琪 [问题] 分别编写用复化Simpson积分公式和复化梯形积分公式计算积分的通 ...

  7. 使用 spring boot 开发通用程序

    2019独角兽企业重金招聘Python工程师标准>>> tag: spring 学习笔记 date: 2018-03 spring 是什么?spring 核心是应用组件容器,管理组件 ...

  8. FTP服务器端程序分类

    FTP服务器端程序有很多种,其中最常见的是vsftpd,顾名思义就是very secure ftp daemon(非常安全的ftp进程). 除此之外还有比vsftpd功能更强大的几种ftp程序: ①  ...

  9. 18. 编写FTP客户端程序

    在实际应用中可能经常访问FTP服务器来上传或下载文件,Python也可以替我们做这些. [示例 1]下面请看一个例子(ftpclient). 运行的结果如下: FTP客户端程序的编写还可以参照官方文档 ...

最新文章

  1. Linux内核初期内存管理---memblock(转)
  2. java——import语句
  3. JavaScript总结(一)
  4. css实现图片自适应容器的几种方式
  5. 为什么产品经理总在焦虑
  6. robotframework如何设计web页面的自动化---启动robotframework ride
  7. django Admin
  8. andorid程序UI线程下开启子线程闪退错误解决
  9. 直击“上云”痛点的 MSP 新生意
  10. 案例演示Python二维列表与Java二维数组
  11. Linux内核态之间进程通信,Linux 系统内核空间与用户空间通信的实现与分析[转载]...
  12. 职位越高的人,越容易犯5个错
  13. 软件公司多注重开发不注重管理
  14. 太阳光轨迹软件_飞时达日照分析软件-FastSUN(日照分析软件)下载 v12.0中文版--pc6下载站...
  15. linux下可以输入中文曲,Ubuntu 14.04终端模式下中文输入听歌
  16. 华为荣耀手机录制视频 华为手机如何录制视频
  17. win10升级助手链接
  18. 聚名师之力,扬信息之帆,逐教育现代化浪潮——韶关市教育信息化蓝凌名教师工作室挂牌仪式
  19. 按键扫描——74HC164驱动(一)
  20. 南加大计算机本科学费,留学南加州大学学费多少一年

热门文章

  1. 你这种直来直去的英语,买家受不了
  2. 产品「工具人」如何破局?
  3. 当我们做MVP产品时,我们到底在做什么?
  4. 18条交互设计和心理学之间的奇妙联系
  5. 【运营】运营必看!如何吸引用户主动的参与活动?
  6. Android学习笔记之SoftReference软引用,弱引用WeakReference
  7. 与众不同 windows phone (22) - Device(设备)之摄像头(硬件快门, 自动对焦, 实时修改捕获视频)...
  8. DllRegisterServer的调用失败
  9. Crontab 使用(转)
  10. transform 遇上 position: fixed