SAP ABAP 从应用服务器下载文件并拆分成多文件

上传数据到应用服务器。

FORM FRM_SEND_DATA_TO_APP_SERVER .
*2.准备传输数据。
  DATA:LV_SERVER TYPE STRING .
  DATA:LV_SERVER_FILE TYPE STRING .
  DATA:LV_FILE_NAME TYPE STRING .
  DATA:LV_MESS TYPE STRING .
  DATA: LV_STRING_STR TYPE STRING .
  FIELD-SYMBOLS:<FS_FIELDS> TYPE ABAP_COMPDESCR,
                <FS_COMP>   TYPE ANY.
  DATA:CL_DESCR TYPE REF TO CL_ABAP_STRUCTDESCR .
  CONSTANTS:
    CNS_SEP      TYPE CHAR01 VALUE '|',
    CNS_FILENAME TYPE CHAR255 VALUE 'ZPP030 BOM infos.CSV'.
  DATA:LV_CONT_STR TYPE STRING .
  LV_SERVER = '/usr/sap/trans/' .

*文件名
  LV_FILE_NAME = CNS_FILENAME .
*SAP应用服务器目录
  CONCATENATE LV_SERVER LV_FILE_NAME INTO  LV_SERVER_FILE.
*由于每次文件名字都一样,所以需要先删除应用服务器目录文件,然后写入。
  DELETE DATASET LV_SERVER_FILE.
  IF SY-SUBRC <> 0 .

  ELSE .
    CLOSE DATASET LV_SERVER_FILE .
  ENDIF .
*开始写入文件
*文件换行符为WINDOWS换行符。
  OPEN DATASET LV_SERVER_FILE  FOR OUTPUT IN TEXT MODE ENCODING DEFAULT MESSAGE  LV_MESS
                                                                   WITH SMART  LINEFEED  .

  LOOP AT GT_DATA INTO DATA(GS_RESULT_TAB) .
    CLEAR LV_STRING_STR .
*fill data .
    CL_DESCR ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( GS_RESULT_TAB ).
    LOOP AT CL_DESCR->COMPONENTS ASSIGNING <FS_FIELDS>.
      CLEAR LV_CONT_STR .
      ASSIGN COMPONENT <FS_FIELDS>-NAME OF STRUCTURE GS_RESULT_TAB TO <FS_COMP>.
      IF SY-SUBRC = 0 .
        IF <FS_FIELDS>-TYPE_KIND EQ 'C'.
          REPLACE ALL OCCURRENCES OF CNS_SEP IN <FS_COMP> WITH SPACE .
          CONDENSE <FS_COMP> .
        ENDIF.
        LV_CONT_STR  = <FS_COMP> .
        CONDENSE  LV_CONT_STR .
        CONCATENATE LV_STRING_STR  LV_CONT_STR INTO  LV_STRING_STR SEPARATED BY CNS_SEP.
      ENDIF.
    ENDLOOP .
    REPLACE FIRST OCCURRENCE OF CNS_SEP IN LV_STRING_STR WITH SPACE .
    CONDENSE LV_STRING_STR .
    TRANSFER  LV_STRING_STR TO LV_SERVER_FILE .
  ENDLOOP .
*关闭文件。
  CLOSE DATASET LV_SERVER_FILE .
  IF SY-SUBRC = 0 .

  ENDIF .
ENDFORM.

从应用服务器下载文件到本地目录

*&---------------------------------------------------------------------*
*& Report ZPPR030A
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZPPR030A.
TABLES:SSCRFIELDS.
DATA FUNCTXT TYPE SMP_DYNTXT.
PARAMETERS:P_LINE TYPE INT4 DEFAULT 100000  OBLIGATORY .
SELECTION-SCREEN: FUNCTION KEY 1.

INITIALIZATION .
  FUNCTXT-ICON_ID   = ICON_EXPORT.
  FUNCTXT-QUICKINFO = '删除应用服务器文件'.
  FUNCTXT-ICON_TEXT = '删除应用服务器文件'.
  SSCRFIELDS-FUNCTXT_01 = FUNCTXT.

AT SELECTION-SCREEN.
  IF SSCRFIELDS-UCOMM = 'FC01'.
*    PERFORM FRM_DOWNLOAD_DATA.
    PERFORM FRM_DELETE_SERVER_FILE.
  ENDIF .

START-OF-SELECTION .

  PERFORM FRM_DOWNLOAD_DATA .

FORM FRM_DOWNLOAD_DATA .

  CONSTANTS: LC_MAX_TRANSFER_LINES       TYPE I    VALUE 10000.

  CONSTANTS: LC_FILEFORMAT_ASCII         LIKE RLGRAP-FILETYPE
  VALUE 'ASC'.

  CONSTANTS: LC_FILEFORMAT_BINARY LIKE RLGRAP-FILETYPE
                                         VALUE 'BIN',
             CNS_FILENAME         TYPE CHAR255 VALUE 'ZPP030 BOM infos.CSV'.
************************************************************************
* internal tables
************************************************************************


************************************************************************
* fields / variables
************************************************************************
  DATA  LG_MAX_LEN TYPE I  VALUE 2550.

  DATA:I_FILE_OVERWRITE TYPE  ESP1_BOOLEAN  .
  DATA:I_FILE_APPL TYPE   RCGFILETR-FTAPPL .
  DATA:E_FLG_OPEN_ERROR TYPE  ESP1_BOOLEAN.
  DATA:E_OS_MESSAGE TYPE C .
*下载文件到本地。
* Local data ----------------------------------------------------------

  DATA: L_FILELENGTH TYPE I.
  DATA: L_DATA_TAB(2000)   TYPE C OCCURS 1000000 WITH HEADER LINE.
  DATA: L_FILENAME        TYPE STRING.
  DATA: L_AUTH_FILENAME   LIKE AUTHB-FILENAME.
  DATA: L_RETURN          TYPE C.
  DATA: L_FILE_EMPTY      TYPE BOOLEAN.
  DATA: L_MODE            TYPE C.
  DATA: L_LINES           TYPE I.
  DATA:LT_FILE_TABLE TYPE FILETABLE,
       LS_FILE_TABLE TYPE FILE_TABLE.
  DATA:LV_SELECTED_FOLDER  TYPE STRING .
  DATA:LV_RC TYPE INT4 .
  DATA:
    LV_FILENAME TYPE STRING,
    LV_PATH     TYPE STRING,
    LV_FULLPATH TYPE STRING.
  DATA:LV_INDEX     TYPE INT4,
       LV_INDEX_STR TYPE STRING.
  DATA:LV_COUNT TYPE INT4 .
  LV_INDEX = 1 .
*选取文件目录。
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE
*    EXPORTING
*      WINDOW_TITLE         =
*      INITIAL_FOLDER       =
    CHANGING
      SELECTED_FOLDER      = LV_SELECTED_FOLDER
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.
  IF SY-SUBRC <> 0.
    MESSAGE '请选择目录' TYPE 'S' DISPLAY LIKE 'E' .
    LEAVE LIST-PROCESSING .
    RETURN .
  ENDIF.

**选择打开的文件。
*  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
*    EXPORTING
**     WINDOW_TITLE              =
**     DEFAULT_EXTENSION         =
**     DEFAULT_FILE_NAME         =
**     WITH_ENCODING             =
**     FILE_FILTER               =
**     INITIAL_DIRECTORY         =
*      PROMPT_ON_OVERWRITE       = 'X'
*    CHANGING
*      FILENAME                  = LV_FILENAME
*      PATH                      = LV_PATH
*      FULLPATH                  = LV_FULLPATH
**     USER_ACTION               =
**     FILE_ENCODING             =
*    EXCEPTIONS
*      CNTL_ERROR                = 1
*      ERROR_NO_GUI              = 2
*      NOT_SUPPORTED_BY_GUI      = 3
*      INVALID_DEFAULT_FILE_NAME = 4
*      OTHERS                    = 5.
*  IF SY-SUBRC <> 0.
*    RETURN .
*  ENDIF.

* Function body -------------------------------------------------------

* init
  E_FLG_OPEN_ERROR = SPACE.
  CLEAR E_OS_MESSAGE.

  L_FILENAME = LV_FULLPATH.

  CONCATENATE '/usr/sap/trans/' CNS_FILENAME INTO I_FILE_APPL .
* check the authority to read the file from the application server
  L_AUTH_FILENAME = I_FILE_APPL.
  CALL FUNCTION 'AUTHORITY_CHECK_DATASET'
    EXPORTING
*     PROGRAM          =
      ACTIVITY         = SABC_ACT_READ
      FILENAME         = L_AUTH_FILENAME
    EXCEPTIONS
      NO_AUTHORITY     = 1
      ACTIVITY_UNKNOWN = 2
      OTHERS           = 3.
  IF NOT SY-SUBRC IS INITIAL.
    CASE SY-SUBRC.
      WHEN 1.
*       no auhtority
        RAISE AP_NO_AUTHORITY.
      WHEN OTHERS.
        RAISE AP_FILE_OPEN_ERROR.
    ENDCASE.
  ENDIF.
  I_FILE_OVERWRITE  = 'X'.
** check if the file on the front-end exists
*  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
*    EXPORTING
*      FILE                 = L_FILENAME
*    RECEIVING
*      RESULT               = L_RETURN
*    EXCEPTIONS
*      CNTL_ERROR           = 1
*      ERROR_NO_GUI         = 2
*      WRONG_PARAMETER      = 3
*      NOT_SUPPORTED_BY_GUI = 4
*      OTHERS               = 5.
*
*  IF NOT SY-SUBRC IS INITIAL.
**    RAISE FE_FILE_OPEN_ERROR.
*  ELSE.
**   if file exists continue only if parameter is specified
*    IF L_RETURN = 'X' AND
*       I_FILE_OVERWRITE = SPACE.
*      RAISE FE_FILE_EXISTS.
*    ENDIF.
*  ENDIF.                          " not sy-subrc is initial.

* open the file on the application server
  OPEN DATASET I_FILE_APPL FOR INPUT MESSAGE E_OS_MESSAGE
               IN TEXT MODE ENCODING DEFAULT WITH SMART LINEFEED  .
  IF NOT SY-SUBRC IS INITIAL.
    E_FLG_OPEN_ERROR = 'X'.
    EXIT.
  ENDIF.                            " not sy-subrc is initial

* write packages to the front-end
  L_FILE_EMPTY = SPACE.
  L_MODE       = SPACE.             " at first we write into the file
  WHILE L_FILE_EMPTY = SPACE.

*   read all lines from application server file
    CLEAR L_DATA_TAB. REFRESH L_DATA_TAB.
    L_LINES = 0.
    WHILE L_FILE_EMPTY = SPACE .
      READ DATASET I_FILE_APPL INTO L_DATA_TAB.
      IF NOT SY-SUBRC IS INITIAL.
        L_FILE_EMPTY = 'X'.
      ELSE.
        IF L_LINES NE P_LINE .
          L_LINES = L_LINES + 1.
          APPEND L_DATA_TAB.
        ELSE .
          CLEAR L_LINES .
          CLEAR L_FILENAME .
*导出文件 。
          LV_INDEX_STR = LV_INDEX .
          CONDENSE LV_INDEX_STR .
          CONCATENATE   LV_SELECTED_FOLDER '\' 'BOM' LV_INDEX_STR '.CSV' INTO   L_FILENAME .
*   check if data table is empty
          CLEAR LV_COUNT .
          DESCRIBE TABLE L_DATA_TAB LINES LV_COUNT ..
          IF LV_COUNT IS NOT  INITIAL.
            CALL FUNCTION 'C13Z_DOWNLOAD'
              EXPORTING
*               BIN_FILESIZE        = ' '
                CODEPAGE            = 'UTF-8'
                FILENAME            = L_FILENAME
                FILETYPE            = LC_FILEFORMAT_ASCII
                MODE                = L_MODE
*               WK1_N_FORMAT        = ' '
*               WK1_N_SIZE          = ' '
*               WK1_T_FORMAT        = ' '
*               WK1_T_SIZE          = ' '
*               COL_SELECT          = ' '
*               COL_SELECTMASK      = ' '
              IMPORTING
                FILELENGTH          = L_FILELENGTH
              TABLES
                DATA_TAB            = L_DATA_TAB
*               FIELDNAMES          =
              EXCEPTIONS
                FILE_OPEN_ERROR     = 1
                FILE_WRITE_ERROR    = 2
                INVALID_FILESIZE    = 3
                INVALID_TABLE_WIDTH = 4
                INVALID_TYPE        = 5
                NO_BATCH            = 6
                UNKNOWN_ERROR       = 7
                OTHERS              = 8.
            IF NOT SY-SUBRC IS INITIAL.
              CASE SY-SUBRC.
                WHEN 2 .
                  CLOSE DATASET I_FILE_APPL.
                  RAISE FE_FILE_OPEN_ERROR.
                WHEN OTHERS.
                  CLOSE DATASET I_FILE_APPL.
                  RAISE FE_FILE_WRITE_ERROR.
              ENDCASE.
            ENDIF.                          " not sy-subrc is initial

            L_MODE = 'A'.                " next lines we append
            CLEAR L_DATA_TAB[] .
            L_LINES = L_LINES + 1.
            APPEND L_DATA_TAB.
            LV_INDEX = LV_INDEX + 1 .
          ELSE.

            IF L_MODE IS INITIAL.           " the first loop
*       file on application server has no contents
              CLOSE DATASET I_FILE_APPL.
              RAISE AP_FILE_EMPTY.
            ENDIF.

          ENDIF.                            " sy-subrc is initial
        ENDIF .
      ENDIF .
    ENDWHILE.                           " l_file_empty = SPACE.
  ENDWHILE.                   " l_file_empty = SPACE and
*   check if data table is empty
  LV_INDEX_STR = LV_INDEX .
  CONDENSE LV_INDEX_STR .
  CONCATENATE   LV_SELECTED_FOLDER '\' 'BOM' LV_INDEX_STR '.CSV' INTO   L_FILENAME .
  CLEAR LV_COUNT .
  DESCRIBE TABLE L_DATA_TAB LINES LV_COUNT ..
  IF LV_COUNT IS NOT  INITIAL.
    CALL FUNCTION 'C13Z_DOWNLOAD'
      EXPORTING
*       BIN_FILESIZE        = ' '
        CODEPAGE            = 'UTF-8'
        FILENAME            = L_FILENAME
        FILETYPE            = LC_FILEFORMAT_ASCII
        MODE                = L_MODE
*       WK1_N_FORMAT        = ' '
*       WK1_N_SIZE          = ' '
*       WK1_T_FORMAT        = ' '
*       WK1_T_SIZE          = ' '
*       COL_SELECT          = ' '
*       COL_SELECTMASK      = ' '
      IMPORTING
        FILELENGTH          = L_FILELENGTH
      TABLES
        DATA_TAB            = L_DATA_TAB
*       FIELDNAMES          =
      EXCEPTIONS
        FILE_OPEN_ERROR     = 1
        FILE_WRITE_ERROR    = 2
        INVALID_FILESIZE    = 3
        INVALID_TABLE_WIDTH = 4
        INVALID_TYPE        = 5
        NO_BATCH            = 6
        UNKNOWN_ERROR       = 7
        OTHERS              = 8.
    IF NOT SY-SUBRC IS INITIAL.
      CASE SY-SUBRC.
        WHEN 2 .
          CLOSE DATASET I_FILE_APPL.
          RAISE FE_FILE_OPEN_ERROR.
        WHEN OTHERS.
          CLOSE DATASET I_FILE_APPL.
          RAISE FE_FILE_WRITE_ERROR.
      ENDCASE.
    ENDIF.                          " not sy-subrc is initial

    L_MODE = 'A'.                " next lines we append

  ELSE.

    IF L_MODE IS INITIAL.           " the first loop
*       file on application server has no contents
      CLOSE DATASET I_FILE_APPL.
      RAISE AP_FILE_EMPTY.
    ENDIF.

  ENDIF.                            " sy-subrc is initial
* close the dataset
  CLOSE DATASET I_FILE_APPL.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DELETE_SERVER_FILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DELETE_SERVER_FILE .
*2.准备传输数据。
  DATA:LV_SERVER TYPE STRING .
  DATA:LV_SERVER_FILE TYPE STRING .
  DATA:LV_FILE_NAME TYPE STRING .
  DATA:LV_MESS TYPE STRING .
  DATA: LV_STRING_STR TYPE STRING .
  FIELD-SYMBOLS:<FS_FIELDS> TYPE ABAP_COMPDESCR,
                <FS_COMP>   TYPE ANY.
  DATA:CL_DESCR TYPE REF TO CL_ABAP_STRUCTDESCR .
  CONSTANTS:
    CNS_SEP      TYPE CHAR01 VALUE '|',
    CNS_FILENAME TYPE CHAR255 VALUE 'ZPP030 BOM infos.CSV'.
  DATA:LV_CONT_STR TYPE STRING .
  LV_SERVER = '/usr/sap/trans/' .

*文件名
  LV_FILE_NAME = CNS_FILENAME .
*SAP应用服务器目录
  CONCATENATE LV_SERVER LV_FILE_NAME INTO  LV_SERVER_FILE.
*由于每次文件名字都一样,所以需要先删除应用服务器目录文件,然后写入。
  DELETE DATASET LV_SERVER_FILE.
  IF SY-SUBRC <> 0 .

  ELSE .
    CLOSE DATASET LV_SERVER_FILE .
    MESSAGE '删除文件成功' TYPE 'S' .
  ENDIF .
ENDFORM.

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SAP ABAP开发是一种在SAP系统上进行应用开发和定制的编程语言。想要从入门到精通SAP ABAP开发,你可以通过以下步骤来进行。 首先,你需要到官方网站或其他可靠的资源平台上下载SAP ABAP开发的相关软件。通常,你可以在SAP官方网站上找到SAP开发者帐户,通过注册并购买相应的开发许可证来获得下载权限。 下载完成后,你可以安装SAP ABAP开发环境。这个环境包括开发工具和ABAP运行时环境。安装过程相对简单,按照软件的指示操作即可完成。 安装完成后,你可以开始学习ABAP编程语言。你可以通过阅读相关的教程、培训材料和参考书籍来学习ABAP的基础知识。这些资源通常会介绍ABAP的语法、数据类型、控制结构和常用函数等内容。 学习的过程中,你可以通过阅读SAP ABAP开发者社区的文章和博客来了解一些实际开发中的经验和技巧。这些社区的成员通常会分享他们的开发经验和解决问题的方法。 在掌握了ABAP的基本知识后,你可以开始进行实际的开发项目练习。尝试使用ABAP来创建简单的报表、屏幕和流程,通过实践来巩固你所学到的知识。 随着不断地学习和实践,你将逐渐提高自己的ABAP开发技能。你可以尝试解决更复杂的问题和开发更强大的应用程序。 总之,想要从入门到精通SAP ABAP开发,你需要下载相关的开发环境并学习相关知识。通过不断的实践和积累经验,你将成为一名熟练的ABAP开发人员。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值