ABAP表抛FTP通用程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABAP表抛FTP通用程序相关的知识,希望对你有一定的参考价值。

主要功能:

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
*   请输入内容

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

(c)2006-2024 SYSTEM All Rights Reserved IT常识