文件操作(Server,Local)

*&---------------------------------------------------------------------*
*& Program  ID   : ZGCMI010002
*& Program  Text : Common Include for File IO
*& Overview      : Set the common function for file upload and download
*& Created by    : J4783/ITE T.Kawashima
*& Creation Date : 2012/03/15
*& Copied from   :
*&---------------------------------------------------------------------*
*& Changing Mng No :
*& Updated by      : xxxxx/xx xxxx
*& Update Date     : YYYY/MM/DD
*& Changed Item Description :
*&---------------------------------------------------------------------*
************************************************************************
*    CONSTANTS
************************************************************************
CONSTANTS:
  I_CON_CP_ON(1)         TYPE C          VALUE 'X',        "Over write flag
  I_CON_UP_LOC(8)        TYPE C          VALUE 'P_UP_LOC', "Upload field name
  I_CON_UP_SER(8)        TYPE C          VALUE 'P_UP_SER', "Upload field name
  I_CON_CODEPAGE_UTF16LE TYPE ABAP_ENCOD VALUE '4103'.     "Codepage UTF-16LE
*----------------------------------------------------------------------*
* File path definition for upload
* Set TEXT-I02 'File' in each program.
*----------------------------------------------------------------------*
DEFINE FI_UPLOAD_FILE_SELECTION.
* File
  SELECTION-SCREEN BEGIN OF BLOCK BK_FILE WITH FRAME. TITLE TEXT-I02.
* Select Server File
  PARAMETERS       R_UP_SER  TYPE ZEG_SVRFLG RADIOBUTTON GROUP GP1 DEFAULT 'X'.
  PARAMETERS       P_UP_SER  TYPE FILENAME-FILEINTERN.
* Select Local File
  PARAMETERS       R_UP_LOC  TYPE ZEG_LCLFLG RADIOBUTTON GROUP GP1.
  PARAMETERS       P_UP_LOC  TYPE RLGRAP-FILENAME.
  SELECTION-SCREEN END   OF BLOCK BK_FILE.
END-OF-DEFINITION.
*----------------------------------------------------------------------*
*       Set upload local path F4 help
*----------------------------------------------------------------------*
DEFINE FI_UPLOAD_LOCAL_PATH_HELP.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_UP_LOC.
* Set file path help
  DATA L_WRK_UP_LOC TYPE STRING.
  PERFORM. FI_F4_FILENAME_OPEN CHANGING L_WRK_UP_LOC.
  P_UP_LOC = L_WRK_UP_LOC.
END-OF-DEFINITION.
************************************************************************
*                           FORMS                                      *
************************************************************************
*&---------------------------------------------------------------------*
*&      Form  FI_FILE_PATH_CHECK
*&---------------------------------------------------------------------*
*       Upload file path input check
*----------------------------------------------------------------------*
*       --&gt UP_FLAG     : Local file path flag
*       --&gt UP_PATH     : Path to check
*       *       *----------------------------------------------------------------------*
FORM. FI_FILE_PATH_CHECK USING    VALUE(UP_WRK_FLAG) TYPE C
                                   VALUE(UP_WRK_PATH) TYPE ANY
                          CHANGING VALUE(CP_WRK_ERR)  TYPE C
                                   CP_REC_MSG         TYPE SYMSG.
  DATA:
    L_WRK_PATH          TYPE STRING,             "file path
    L_WRK_EX            TYPE C,                  "result for path check
    L_FLG_EMGC(1)       TYPE C,                  "EMERGENCY_FLAG
    L_WRK_PHYSICAL(255) TYPE C.                  "Physical File Name
  CLEAR:
    CP_WRK_ERR,
    CP_REC_MSG.
  IF UP_WRK_FLAG = 'X'.
    IF UP_WRK_PATH IS INITIAL.
      SET CURSOR FIELD I_CON_UP_LOC.
*     Set return error flag
      CP_WRK_ERR = 'X'.
*     Please enter File Path(Local).
      MESSAGE E013(ZGCM01) WITH SPACE INTO CP_REC_MSG-MSGV1.
      PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                         'ZGCM01'
                                         '013'
                                         ''
                                         ''
                                         ''
                                         ''
                                CHANGING CP_REC_MSG.
      EXIT.
    ELSE.
      L_WRK_PATH = UP_WRK_PATH.
*     Check File Exist
      CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
        EXPORTING
          FILE                 = L_WRK_PATH
        RECEIVING
          RESULT               = L_WRK_EX
        EXCEPTIONS
          CNTL_ERROR           = 1
          ERROR_NO_GUI         = 2
          WRONG_PARAMETER      = 3
          NOT_SUPPORTED_BY_GUI = 4
          OTHERS               = 5.
      IF L_WRK_EX <> 'X'.
        SET CURSOR FIELD I_CON_UP_LOC.
*       Set return error flag
        CP_WRK_ERR = 'X'.
*       File was not found(local).
        PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                           'ZGCM01'
                                           '014'
                                           ''
                                           ''
                                           ''
                                           ''
                                  CHANGING CP_REC_MSG.
        EXIT.
      ENDIF.
    ENDIF.
  ELSEIF UP_WRK_FLAG = SPACE.
    IF UP_WRK_PATH IS INITIAL.
      SET CURSOR FIELD I_CON_UP_SER.
*     Set return error flag
      CP_WRK_ERR = 'X'.
*     Please enter File Path(Sever).
      PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                         'ZGCM01'
                                         '015'
                                         ''
                                         ''
                                         ''
                                         ''
                                CHANGING CP_REC_MSG.
      EXIT.
    ELSE.
*     Assign the Physical File Name Using a Logical File Name
      CALL FUNCTION 'FILE_GET_NAME'
        EXPORTING
          CLIENT           = SY-MANDT
          LOGICAL_FILENAME = UP_WRK_PATH
        IMPORTING
          EMERGENCY_FLAG   = L_FLG_EMGC
          FILE_NAME        = L_WRK_PHYSICAL
        EXCEPTIONS
          FILE_NOT_FOUND   = 1
          OTHERS           = 2.
      IF  SY-SUBRC = 0
      AND L_FLG_EMGC IS INITIAL.
*       OPEN FILE TO READ
        OPEN DATASET L_WRK_PHYSICAL FOR INPUT IN TEXT MODE ENCODING DEFAULT.
        IF SY-SUBRC = 0.
*         CLOSE FILE
          CLOSE DATASET L_WRK_PHYSICAL.
        ELSE.
          SET CURSOR FIELD I_CON_UP_SER.
*         Set return error flag
          CP_WRK_ERR = 'X'.
*         File was not found(sever).
          PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                             'ZGCM01'
                                             '016'
                                             ''
                                             ''
                                             ''
                                             ''
                                    CHANGING CP_REC_MSG.
          EXIT.
        ENDIF.
      ELSE.
*       Set return error flag
        CP_WRK_ERR = 'X'.
*       &1 does not exist
        PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                           'ZGCM01'
                                           '026'
                                           UP_WRK_PATH
                                           ''
                                           ''
                                           ''
                                  CHANGING CP_REC_MSG.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.                    "FI_FILE_PATH_CHECK
*&---------------------------------------------------------------------*
*&      Form  FI_UPLOAD_LOCAL_FILE
*&---------------------------------------------------------------------*
*       Upload file from local
*----------------------------------------------------------------------*
*       --&gt UP_PATH     : Local file path
*       --&gt UP_TYPE     : File Type (ASC or BIN)
*       --&gt UP_CODEPAGE : Codepage
*       --&gt UP_SEPARATE : Columns Separated by Tabs in Case of ASCII Upload
*       *       *       *----------------------------------------------------------------------*
FORM. FI_UPLOAD_LOCAL_FILE TABLES TP_DATA
                           USING VALUE(UP_WRK_PATH)     TYPE ANY
                                 VALUE(UP_WRK_TYPE)     TYPE CHAR10
                                 VALUE(UP_WRK_CODEPAGE) TYPE CHAR20
                                 VALUE(UP_WRK_SEPARATE) TYPE C
                        CHANGING VALUE(CP_WRK_ERR)      TYPE C
                                 CP_REC_MSG             TYPE SYMSG.
  DATA:
    L_WRK_PATH TYPE STRING.                      "file path
  CLEAR:
    CP_WRK_ERR,
    CP_REC_MSG.
  REFRESH:
    TP_DATA.
  L_WRK_PATH = UP_WRK_PATH.
* Upload for Data Provider
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      FILENAME                = L_WRK_PATH
      FILETYPE                = UP_WRK_TYPE
      CODEPAGE                = UP_WRK_CODEPAGE
      HAS_FIELD_SEPARATOR     = UP_WRK_SEPARATE
    TABLES
      DATA_TAB                = TP_DATA
    EXCEPTIONS
      FILE_OPEN_ERROR         = 1
      FILE_READ_ERROR         = 2
      NO_BATCH                = 3
      GUI_REFUSE_FILETRANSFER = 4
      INVALID_TYPE            = 5
      NO_AUTHORITY            = 6
      UNKNOWN_ERROR           = 7
      BAD_DATA_FORMAT         = 8
      HEADER_NOT_ALLOWED      = 9
      SEPARATOR_NOT_ALLOWED   = 10
      HEADER_TOO_LONG         = 11
      UNKNOWN_DP_ERROR        = 12
      ACCESS_DENIED           = 13
      DP_OUT_OF_MEMORY        = 14
      DISK_FULL               = 15
      DP_TIMEOUT              = 16
      OTHERS                  = 17.
  IF SY-SUBRC <> 0.
*   Set return error flag
    CP_WRK_ERR = 'X'.
*   File upload failed (Return code = &1)
    PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                       'ZGCM01'
                                       '027'
                                       SY-SUBRC
                                       ''
                                       ''
                                       ''
                              CHANGING CP_REC_MSG.
  ENDIF.
ENDFORM.                    "FI_UPLOAD_LOCAL_FILE
*&---------------------------------------------------------------------*
*&      Form  FI_UPLOAD_SERVER_FILE
*&---------------------------------------------------------------------*
*       Upload file from server
*----------------------------------------------------------------------*
*       --&gt UP_PATH     : Server physical file path
*       --&gt UP_UNICODE  : Unicode flag
*       --&gt UP_CODEPAGE : Codepage
*       *       *       *----------------------------------------------------------------------*
FORM. FI_UPLOAD_SERVER_FILE TABLES TP_DATA
                            USING VALUE(UP_WRK_PATH)     TYPE ANY
                                  VALUE(UP_WRK_UNICODE)  TYPE C
                                  VALUE(UP_WRK_CODEPAGE) TYPE C
                         CHANGING VALUE(CP_WRK_ERR)      TYPE C
                                  CP_REC_MSG         TYPE SYMSG.
  DATA:
    L_REC_DATA  TYPE STRING.                     "file data
  CLEAR:
    CP_WRK_ERR,
    CP_REC_MSG.
  REFRESH:
    TP_DATA.
  CATCH SYSTEM-EXCEPTIONS CONVERSION_ERRORS = 1
                          THERS = 2.
*   Open sever file for read
    IF UP_WRK_UNICODE = 'X'.
      OPEN DATASET UP_WRK_PATH FOR INPUT IN TEXT MODE ENCODING UTF-8 SKIPPING BYTE-ORDER MARK.
    ELSE.
*     NON-UNICODE
      IF UP_WRK_CODEPAGE = SPACE.
        OPEN DATASET UP_WRK_PATH FOR INPUT IN TEXT MODE ENCODING NON-UNICODE .
      ELSE.
        OPEN DATASET UP_WRK_PATH FOR INPUT IN LEGACY TEXT MODE CODE PAGE UP_WRK_CODEPAGE.
      ENDIF.
    ENDIF.
    IF  SY-SUBRC <> 0.
*     Set return error flag
      CP_WRK_ERR = 'X'.
*     File upload failed (Return code = &1)
      PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                         'ZGCM01'
                                         '027'
                                         SY-SUBRC
                                         ''
                                         ''
                                         ''
                                CHANGING CP_REC_MSG.
      EXIT.
    ENDIF.
    DO.
      CLEAR: L_REC_DATA.
*     Read sever file
      READ DATASET UP_WRK_PATH INTO L_REC_DATA.
      IF SY-SUBRC <> 0.
        EXIT.
      ELSE.
        APPEND L_REC_DATA TO TP_DATA.
      ENDIF.
    ENDDO.
  ENDCATCH.
  IF SY-SUBRC <> 0.
*   Set return error flag
    CP_WRK_ERR = 'X'.
*   File upload failed (Return code = &1)
    PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                       'ZGCM01'
                                       '027'
                                       SY-SUBRC
                                       ''
                                       ''
                                       ''
                              CHANGING CP_REC_MSG.
  ENDIF.
* Close sever file
  CLOSE DATASET UP_WRK_PATH.
ENDFORM.                    "FI_UPLOAD_SERVER_FILE
*&---------------------------------------------------------------------*
*&      Form  FI_GET_PHYS_PATH
*&---------------------------------------------------------------------*
*       GET PHYSICAL FILE PATH
*----------------------------------------------------------------------*
*       --&gt UP_LOGICAL  : Logical path
*       *       *       *----------------------------------------------------------------------*
FORM. FI_GET_PHYS_PATH USING    VALUE(UP_WRK_LOGICAL)  TYPE FILENAME-FILEINTERN
                      CHANGING VALUE(CP_WRK_PHYSICAL) TYPE C
                               VALUE(CP_WRK_ERR)      TYPE C
                               CP_REC_MSG             TYPE SYMSG.
  DATA:
    L_FLG_EMGC(1) TYPE C.
  CLEAR:
    CP_WRK_PHYSICAL,
    CP_WRK_ERR,
    CP_REC_MSG.
* Assign the Physical File Name Using a Logical File Name
  CALL FUNCTION 'FILE_GET_NAME'
    EXPORTING
      CLIENT           = SY-MANDT
      LOGICAL_FILENAME = UP_WRK_LOGICAL
    IMPORTING
      EMERGENCY_FLAG   = L_FLG_EMGC
      FILE_NAME        = CP_WRK_PHYSICAL
    EXCEPTIONS
      FILE_NOT_FOUND   = 1
      OTHERS           = 2.
  IF SY-SUBRC <> 0 OR L_FLG_EMGC IS NOT INITIAL.
*   Set error flag
    CP_WRK_ERR = 'X'.
*   &1 does not exist
    PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                       'ZGCM01'
                                       '026'
                                       UP_WRK_LOGICAL
                                       ''
                                       ''
                                       ''
                              CHANGING CP_REC_MSG.
  ENDIF.
ENDFORM.                    "FI_GET_PHYS_PATH
*&---------------------------------------------------------------------*
*&      Form  FI_DOWNLOAD_LOCAL_FILE
*&---------------------------------------------------------------------*
*       LOCAL FILE DOWNLOAD
*----------------------------------------------------------------------*
*       --&gt UP_PATH     : Local file path
*       --&gt UP_TYPE     : File Type
*       --&gt UP_APPEND   : APPEND
*       --&gt UP_SEPARATE : WRITE_FIELD_SEPARATOR
*       --&gt UP_CODEPAGE : CODEPAGE
*       *       *       *----------------------------------------------------------------------*
FORM. FI_DOWNLOAD_LOCAL_FILE TABLES TP_DWTAB
                             USING VALUE(UP_WRK_PATH)     TYPE ANY
                                   VALUE(UP_WRK_TYPE)     TYPE CHAR10
                                   VALUE(UP_WRK_APPEND)   TYPE C
                                   VALUE(UP_WRK_SEPARATE) TYPE C
                                   VALUE(UP_WRK_CODEPAGE) TYPE CPCODEPAGE
                          CHANGING VALUE(CP_WRK_ERR)      TYPE C
                                   CP_REC_MSG             TYPE SYMSG.
  DATA:
    L_WRK_FILENAME  TYPE STRING,                 "File name
    L_WRK_WRITE_BOM TYPE ABAP_BOOL,              "Byte Order Mark
    L_WRK_CODEPAGE  TYPE ABAP_ENCOD.             "Codepage
  CLEAR:
    CP_WRK_ERR,
    CP_REC_MSG.
  L_WRK_FILENAME = UP_WRK_PATH.                      "File name
  IF UP_WRK_CODEPAGE IS NOT INITIAL.
    SELECT SINGLE CPCODEPAGE
      INTO L_WRK_CODEPAGE
      FROM TCP00
     WHERE CPCODEPAGE = UP_WRK_CODEPAGE.
  ENDIF.
  IF L_WRK_CODEPAGE IS INITIAL.
    L_WRK_CODEPAGE = I_CON_CODEPAGE_UTF16LE.
    L_WRK_WRITE_BOM = 'X'.
  ENDIF.
* Download an Internal Table to the PC
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      FILENAME                = L_WRK_FILENAME
      FILETYPE                = UP_WRK_TYPE
      APPEND                  = UP_WRK_APPEND
      WRITE_FIELD_SEPARATOR   = UP_WRK_SEPARATE
      TRUNC_TRAILING_BLANKS   = 'X'
      CODEPAGE                = L_WRK_CODEPAGE
      WRITE_BOM               = L_WRK_WRITE_BOM
    TABLES
      DATA_TAB                = TP_DWTAB
    EXCEPTIONS
      FILE_WRITE_ERROR        = 1
      NO_BATCH                = 2
      GUI_REFUSE_FILETRANSFER = 3
      INVALID_TYPE            = 4
      NO_AUTHORITY            = 5
      OTHERS                  = 6.
  IF SY-SUBRC <> 0.
*   Set return error flag
    CP_WRK_ERR = 'X'.
*   File download failed (Return code = &1)
    PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                       'ZGCM01'
                                       '028'
                                       SY-SUBRC
                                       ''
                                       ''
                                       ''
                              CHANGING CP_REC_MSG.
  ENDIF.
ENDFORM.                    " FI_DOWNLOAD_LOCAL_FILE
*&---------------------------------------------------------------------*
*&      Form  FI_DOWNLOAD_SERVER_FILE
*&---------------------------------------------------------------------*
*       SERVER FILE DOWNLOAD
*----------------------------------------------------------------------*
*       --&gt UP_PATH     : Server logical file path
*       --&gt UP_UNICODE  : Unicode flag
*       --&gt UP_CODEPAGE : Codepage
*       *       *       *----------------------------------------------------------------------*
FORM. FI_DOWNLOAD_SERVER_FILE TABLES TP_DWTAB
                             USING VALUE(UP_WRK_PATH)     TYPE ANY
                                   VALUE(UP_WRK_UNICODE)  TYPE C
                                   VALUE(UP_WRK_CODEPAGE) TYPE CPCODEPAGE
                          CHANGING VALUE(CP_WRK_ERR)      TYPE C
                                   CP_REC_MSG             TYPE SYMSG.
  DATA:
    L_REC_LINE TYPE STRING.
  CLEAR:
    CP_WRK_ERR,
    CP_REC_MSG.
  CATCH SYSTEM-EXCEPTIONS CONVERSION_ERRORS = 1
                          THERS = 2.
* Open sever file for read
    IF UP_WRK_UNICODE = 'X'.
*   UNICODE
      OPEN DATASET UP_WRK_PATH FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
    ELSE.
*   NON-UNICODE
      IF UP_WRK_CODEPAGE = SPACE.
        OPEN DATASET UP_WRK_PATH FOR OUTPUT IN TEXT MODE ENCODING NON-UNICODE .
      ELSE.
        OPEN DATASET UP_WRK_PATH FOR OUTPUT IN LEGACY TEXT MODE CODE PAGE UP_WRK_CODEPAGE.
      ENDIF.
    ENDIF.
    IF SY-SUBRC <> 0.
*   Set return error flag
      CP_WRK_ERR = 'X'.
*     File download failed (Return code = &1)
      PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                         'ZGCM01'
                                         '028'
                                         SY-SUBRC
                                         ''
                                         ''
                                         ''
                                CHANGING CP_REC_MSG.
      EXIT.
    ENDIF.
    LOOP AT TP_DWTAB INTO L_REC_LINE.
*   Transfer sever file
      TRANSFER L_REC_LINE TO UP_WRK_PATH.
      IF SY-SUBRC <> 0.
        CP_WRK_ERR = 'X'.
*       File download failed (Return code = &1)
        PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                           'ZGCM01'
                                           '028'
                                           SY-SUBRC
                                           ''
                                           ''
                                           ''
                                  CHANGING CP_REC_MSG.
        EXIT.
      ENDIF.
    ENDLOOP.
  ENDCATCH.
  IF SY-SUBRC <> 0.
*   Set return error flag
    CP_WRK_ERR = 'X'.
*   File download failed (Return code = &1)
    PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                       'ZGCM01'
                                       '028'
                                       SY-SUBRC
                                       ''
                                       ''
                                       ''
                              CHANGING CP_REC_MSG.
  ENDIF.
* Close sever file
  CLOSE DATASET UP_WRK_PATH.
ENDFORM.                    " FI_DOWNLOAD_SERVER_FILE
*&---------------------------------------------------------------------*
*&      Form  FI_DOWNLOAD_SERVER_FILE_FIX
*&---------------------------------------------------------------------*
*       SERVER FILE DOWNLOAD (FIX LENGTH)
*----------------------------------------------------------------------*
*       --&gt TP_DATA     : Server file content
*       --&gt UP_PATH     : Server logical file path
*       --&gt UP_UNICODE  : Unicode flag
*       --&gt UP_CODEPAGE : Codepage
*       *       *----------------------------------------------------------------------*
FORM. FI_DOWNLOAD_SERVER_FILE_FIX TABLES TP_DWTAB
                                 USING VALUE(UP_WRK_PATH)     TYPE ANY
                                       VALUE(UP_WRK_UNICODE)  TYPE C
                                       VALUE(UP_WRK_CODEPAGE) TYPE CPCODEPAGE
                              CHANGING VALUE(CP_WRK_ERR)      TYPE C
                                       CP_REC_MSG             TYPE SYMSG.
  DATA:
    L_WRK_LEN TYPE I.
  CLEAR:
    CP_WRK_ERR,
    CP_REC_MSG.
  CATCH SYSTEM-EXCEPTIONS CONVERSION_ERRORS = 1
                          THERS = 2.
*   Open sever file for read
    IF UP_WRK_UNICODE = 'X'.
*     UNICODE
      OPEN DATASET UP_WRK_PATH FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
    ELSE.
*     NON-UNICODE
      IF UP_WRK_CODEPAGE = SPACE.
        OPEN DATASET UP_WRK_PATH FOR OUTPUT IN TEXT MODE ENCODING NON-UNICODE .
      ELSE.
        OPEN DATASET UP_WRK_PATH FOR OUTPUT IN LEGACY TEXT MODE CODE PAGE UP_WRK_CODEPAGE.
      ENDIF.
    ENDIF.
    IF SY-SUBRC <> 0.
*     Set return error flag
      CP_WRK_ERR = 'X'.
*     File download failed (Return code = &1)
      PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                         'ZGCM01'
                                         '028'
                                         SY-SUBRC
                                         ''
                                         ''
                                         ''
                                CHANGING CP_REC_MSG.
      EXIT.
    ENDIF.
    LOOP AT TP_DWTAB.
      IF L_WRK_LEN IS INITIAL.
        DESCRIBE FIELD TP_DWTAB LENGTH L_WRK_LEN IN CHARACTER MODE.
      ENDIF.
*     Transfer sever file
      TRANSFER TP_DWTAB TO UP_WRK_PATH LENGTH L_WRK_LEN.
      IF SY-SUBRC <> 0.
        CP_WRK_ERR = 'X'.
*       File download failed (Return code = &1)
        PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                           'ZGCM01'
                                           '028'
                                           SY-SUBRC
                                           ''
                                           ''
                                           ''
                                  CHANGING CP_REC_MSG.
        EXIT.
      ENDIF.
    ENDLOOP.
  ENDCATCH.
  IF SY-SUBRC <> 0.
*   Set return error flag
    CP_WRK_ERR = 'X'.
*   File download failed (Return code = &1)
    PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                       'ZGCM01'
                                       '028'
                                       SY-SUBRC
                                       ''
                                       ''
                                       ''
                              CHANGING CP_REC_MSG.
  ENDIF.
* Close sever file
  CLOSE DATASET UP_WRK_PATH.
ENDFORM.                    " FI_DOWNLOAD_SERVER_FILE_FIX
*&---------------------------------------------------------------------*
*&      Form  FI_EDIT_DOUBLE_QUOTE_DATA
*&---------------------------------------------------------------------*
*       To edit double quotation which was created by Microsoft Excel
*----------------------------------------------------------------------*
*      *----------------------------------------------------------------------*
FORM. FI_EDIT_DOUBLE_QUOTE_DATA TABLES TP_TAB.
  CONSTANTS:
    L_CON_SIGN(1)   TYPE C VALUE '"',
    L_CON_DOUBLE(2) TYPE C VALUE '""'.
  DATA:
    L_REC_DATA   TYPE                   STRING,
    L_FLG_EXIT   TYPE                   C,
    L_FLG_TAB    TYPE                   C,
    L_WRK_FIELD  TYPE                   STRING,
    L_REC_RESULT TYPE                   STRING,
    L_TAB_RESULT TYPE STANDARD TABLE OF STRING.
  LOOP AT TP_TAB INTO L_REC_DATA.
    CLEAR L_FLG_TAB.
    L_REC_RESULT = L_REC_DATA.
    IF L_REC_RESULT IS NOT INITIAL.
      SHIFT L_REC_RESULT BY 1 PLACES RIGHT CIRCULAR.
      IF L_REC_RESULT(1) = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.
        L_FLG_TAB = 'X'.
      ENDIF.
    ENDIF.
    CLEAR: L_REC_RESULT, L_FLG_EXIT.
    DO.
*     Check the exit flag
      IF L_FLG_EXIT = 'X'.
        EXIT.
      ENDIF.
*     Get one item
      SPLIT  L_REC_DATA
        AT   CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB
        INTO L_WRK_FIELD L_REC_DATA.
*     If the remained data is initial then exit at next loop
      IF L_REC_DATA IS INITIAL.
        L_FLG_EXIT = 'X'.
      ENDIF.
*     If the first character is double quotation
      IF L_WRK_FIELD IS NOT INITIAL AND L_WRK_FIELD(1) = L_CON_SIGN.
*       Delete the first and the last double quotation
        SHIFT L_WRK_FIELD BY 1 PLACES LEFT.
        SHIFT L_WRK_FIELD BY 1 PLACES RIGHT CIRCULAR.
        SHIFT L_WRK_FIELD BY 1 PLACES LEFT.
*       Replace continuous two double qoutations by one double quotation
        REPLACE ALL OCCURRENCES OF L_CON_DOUBLE IN L_WRK_FIELD WITH L_CON_SIGN.
        CONDENSE L_WRK_FIELD.
      ENDIF.
*     Set the edited data to record
      IF SY-INDEX = 1.
        L_REC_RESULT = L_WRK_FIELD.
      ELSE.
        CONCATENATE L_REC_RESULT L_WRK_FIELD
          INTO L_REC_RESULT
          SEPARATED BY CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.
      ENDIF.
    ENDDO.
    IF L_FLG_TAB = 'X'.
      CLEAR L_WRK_FIELD.
      CONCATENATE L_REC_RESULT L_WRK_FIELD
        INTO L_REC_RESULT
        SEPARATED BY CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.
    ENDIF.
*   Set the edited data to internal table
    APPEND L_REC_RESULT TO L_TAB_RESULT.
  ENDLOOP.
* Return the result
  REFRESH: TP_TAB.
  TP_TAB[] = L_TAB_RESULT[].
ENDFORM.                    "FI_EDIT_DOUBLE_QUOTE_DATA
*----------------------------------------------------------------------*
* Directory path definition for download
*----------------------------------------------------------------------*
* Set TEXT-I02 'File' in each program.
*----------------------------------------------------------------------*
DEFINE FI_DOWNLOAD_DIR_SELECTION.
* File
  SELECTION-SCREEN BEGIN OF BLOCK BK_DLPATH WITH FRAME. TITLE TEXT-I02.
* Select Server File
  PARAMETERS       R_DP_SER  TYPE ZEG_SVRFLG RADIOBUTTON GROUP GP2 DEFAULT 'X'.
  PARAMETERS       P_DP_SER  TYPE FILENAME-PATHINTERN.
* Select Local File
  PARAMETERS       R_DP_LOC  TYPE ZEG_LCLFLG RADIOBUTTON GROUP GP2.
  PARAMETERS       P_DP_LOC  TYPE RLGRAP-FILENAME.
  SELECTION-SCREEN END   OF BLOCK BK_DLPATH.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*&      Form  FI_LOCAL_DIR_HELP
*&---------------------------------------------------------------------*
*       Set local path help
*----------------------------------------------------------------------*
*      *----------------------------------------------------------------------*
FORM. FI_LOCAL_DIR_HELP CHANGING VALUE(CP_PT_LOC) TYPE ANY.
  DATA:
    L_WRK_PATH TYPE STRING.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE
    CHANGING
      SELECTED_FOLDER = L_WRK_PATH.
  CP_PT_LOC =   L_WRK_PATH.
ENDFORM.                    " FI_LOCAL_DIR_HELP
*&---------------------------------------------------------------------*
*&      Form  FI_DIRECTORY_PATH_CHECK
*&---------------------------------------------------------------------*
*       Directory path input check
*----------------------------------------------------------------------*
*      --&gtUP_FLAG    Local path flag
*      --&gtUP_PATH    Path to check
*      *      *----------------------------------------------------------------------*
FORM. FI_DIRECTORY_PATH_CHECK USING    VALUE(UP_WRK_FLAG) TYPE C
                                      VALUE(UP_WRK_PATH) TYPE ANY
                             CHANGING VALUE(CP_WRK_ERR)  TYPE C
                                      CP_REC_MSG         TYPE SYMSG.
  DATA:
    L_WRK_RESULT(1) TYPE C,
    L_WRK_PATH      TYPE STRING.
  CLEAR:
    CP_WRK_ERR,
    CP_REC_MSG.
* If the path is blank, set error message and return as error.
  IF UP_WRK_PATH IS INITIAL.
    CP_WRK_ERR = 'X'.
*   Server path
    IF UP_WRK_FLAG IS INITIAL.
*     Please enter Output Path (Server)
      PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                         'ZGCM01'
                                         '029'
                                         ''
                                         ''
                                         ''
                                         ''
                                CHANGING CP_REC_MSG.
*   Local path
    ELSE.
*     Please enter Output Path (Local)
      PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                         'ZGCM01'
                                         '030'
                                         ''
                                         ''
                                         ''
                                         ''
                                CHANGING CP_REC_MSG.
    ENDIF.
    RETURN.
  ENDIF.
* Check server path
  IF UP_WRK_FLAG IS INITIAL.
    SELECT COUNT(*)
      FROM FILEPATH
     WHERE PATHINTERN = UP_WRK_PATH.
    IF SY-SUBRC <> 0.
      CP_WRK_ERR = 'X'.
*     Output Path (Server) does not exist
      PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                         'ZGCM01'
                                         '031'
                                         ''
                                         ''
                                         ''
                                         ''
                                CHANGING CP_REC_MSG.
      RETURN.
    ENDIF.
* Check local path
  ELSE.
    L_WRK_PATH   = UP_WRK_PATH.
    L_WRK_RESULT = CL_GUI_FRONTEND_SERVICES=>DIRECTORY_EXIST( L_WRK_PATH ).
    IF L_WRK_RESULT <> 'X'.
      CP_WRK_ERR = 'X'.
*     Output Path (Local) does not exist
      PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                         'ZGCM01'
                                         '032'
                                         ''
                                         ''
                                         ''
                                         ''
                                CHANGING CP_REC_MSG.
      RETURN.
    ENDIF.
  ENDIF.
ENDFORM.                    "FI_DIRECTORY_PATH_CHECK
*&---------------------------------------------------------------------*
*&      Form  FI_GET_PHYS_DIR_FILEPATH
*&---------------------------------------------------------------------*
*       Get physical file path from logical file path & faile name
*----------------------------------------------------------------------*
*       --&gt UP_LOGICAL  : Logical path
*       --&gt UP_FILE     : File name
*       *       *       *----------------------------------------------------------------------*
FORM. FI_GET_PHYS_DIR_FILEPATH USING    VALUE(UP_WRK_LOGICAL)  TYPE FILENAME-PATHINTERN
                                       VALUE(UP_WRK_FILE)     TYPE ANY
                              CHANGING VALUE(CP_WRK_PHYSICAL) TYPE ANY
                                       VALUE(CP_WRK_ERR)      TYPE C
                                       CP_REC_MSG             TYPE SYMSG.
* get physical file path from logical file path and file name
  CALL FUNCTION 'FILE_GET_NAME_USING_PATH'
    EXPORTING
      CLIENT                     = SY-MANDT
      LOGICAL_PATH               = UP_WRK_LOGICAL
      FILE_NAME                  = UP_WRK_FILE
    IMPORTING
      FILE_NAME_WITH_PATH        = CP_WRK_PHYSICAL
    EXCEPTIONS
      PATH_NOT_FOUND             = 1
      MISSING_PARAMETER          = 2
      OPERATING_SYSTEM_NOT_FOUND = 3
      FILE_SYSTEM_NOT_FOUND      = 4
      OTHERS                     = 5.
  IF SY-SUBRC <> 0.
*   Set error flag
    CP_WRK_ERR       = 'X'.
    CP_REC_MSG-MSGTY = SY-MSGTY.
    CP_REC_MSG-MSGID = SY-MSGID.
    CP_REC_MSG-MSGNO = SY-MSGNO.
    CP_REC_MSG-MSGV1 = SY-MSGV1.
    CP_REC_MSG-MSGV2 = SY-MSGV2.
    CP_REC_MSG-MSGV3 = SY-MSGV3.
    CP_REC_MSG-MSGV4 = SY-MSGV4.
  ENDIF.
ENDFORM.                    " FI_GET_PHYS_DIR_FILEPATH
*&---------------------------------------------------------------------*
*&      Form  FI_F4_FILENAME_OPEN
*&---------------------------------------------------------------------*
*&      Set local path F4 help ( Open File )
*&---------------------------------------------------------------------*
*       *"----------------------------------------------------------------------
FORM. FI_F4_FILENAME_OPEN CHANGING VALUE(CP_WRK_FILE)  TYPE STRING.
  DATA: L_TAB_FILE  TYPE FILETABLE,
        L_REC_FILE  TYPE FILE_TABLE,
        L_WRK_RC    TYPE I,
        L_REC_DD04V TYPE DD04V,
        L_WRK_TITLE TYPE STRING.
  CALL FUNCTION 'Z_GCM_DDIF_DTEL_GET'
    EXPORTING
      I_NAME        = 'ZEG_FILEOPEN'
      I_LANGU       = SY-LANGU
    IMPORTING
      E_DD04V_WA    = L_REC_DD04V
    EXCEPTIONS
      ILLEGAL_INPUT = 0
      OTHERS        = 0.
  L_WRK_TITLE = L_REC_DD04V-SCRTEXT_L.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
      WINDOW_TITLE     = L_WRK_TITLE
      DEFAULT_FILENAME = CP_WRK_FILE
    CHANGING
      FILE_TABLE       = L_TAB_FILE
      RC               = L_WRK_RC.
  IF SY-SUBRC <> 0.
  ENDIF.
  READ TABLE L_TAB_FILE INTO L_REC_FILE INDEX 1.
  CP_WRK_FILE = L_REC_FILE-FILENAME.
ENDFORM.                    "FI_F4_FILENAME_OPEN
*&---------------------------------------------------------------------*
*&      Form  FI_F4_FILENAME_SAVE
*&---------------------------------------------------------------------*
*&      Set local path F4 help ( Save File )
*&---------------------------------------------------------------------*
*       --&gt  UP_FLG_OVERWRITE Over Write Flag
*       *"----------------------------------------------------------------------
FORM. FI_F4_FILENAME_SAVE  USING   VALUE(UP_FLG_OVERWRITE) TYPE ABAP_BOOL
                          CHANGING VALUE(CP_WRK_FILE)  TYPE STRING.
  DATA:
    L_WRK_FILENAME TYPE STRING,
    L_WRK_PATH     TYPE STRING,
    L_WRK_FULLPATH TYPE STRING.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    EXPORTING
      WINDOW_TITLE        = 'Save File'                     "#EC NOTEXT
      DEFAULT_FILE_NAME   = CP_WRK_FILE
      PROMPT_ON_OVERWRITE = UP_FLG_OVERWRITE
    CHANGING
      FILENAME            = L_WRK_FILENAME
      PATH                = L_WRK_PATH
      FULLPATH            = L_WRK_FULLPATH.
  IF SY-SUBRC <> 0.
  ENDIF.
  CP_WRK_FILE = L_WRK_FULLPATH.
ENDFORM.                    "FI_F4_FILENAME_SAVE
*&---------------------------------------------------------------------*
*&      Form  FI_APPLICATION_EXECUTE
*&---------------------------------------------------------------------*
*&      Execute application file
*&---------------------------------------------------------------------*
*       --&gtUP_APPLI       : Application ('NOTEPAD' / 'EXCEL' etc.)
*       --&gtUP_FILE        : File (include file path)
*       *       *----------------------------------------------------------------------*
FORM. FI_APPLICATION_EXECUTE USING VALUE(UP_WRK_APPLI) TYPE STRING
                                  VALUE(UP_WRK_FILE)  TYPE STRING
                         CHANGING VALUE(CP_WRK_ERR)   TYPE C
                                  CP_REC_MSG          TYPE SYMSG.
  CLEAR:
    CP_WRK_ERR,
    CP_REC_MSG.
  IF UP_WRK_APPLI IS INITIAL.
    CALL METHOD CL_GUI_FRONTEND_SERVICES=>EXECUTE
      EXPORTING
        DOCUMENT               = UP_WRK_FILE
        SYNCHRONOUS            = 'X'
        OPERATION              = 'OPEN'
      EXCEPTIONS
        CNTL_ERROR             = 1
        ERROR_NO_GUI           = 2
        BAD_PARAMETER          = 3
        FILE_NOT_FOUND         = 4
        PATH_NOT_FOUND         = 5
        FILE_EXTENSION_UNKNOWN = 6
        ERROR_EXECUTE_FAILED   = 7
        SYNCHRONOUS_FAILED     = 8
        NOT_SUPPORTED_BY_GUI   = 9
        OTHERS                 = 10.
  ELSE.
*   Add '"' befor and after of UP_FILE
    CONCATENATE '"' UP_WRK_FILE '"' INTO UP_WRK_FILE.
    CALL METHOD CL_GUI_FRONTEND_SERVICES=>EXECUTE
      EXPORTING
        APPLICATION            = UP_WRK_APPLI
        PARAMETER              = UP_WRK_FILE
        SYNCHRONOUS            = 'X'
        OPERATION              = 'OPEN'
      EXCEPTIONS
        CNTL_ERROR             = 1
        ERROR_NO_GUI           = 2
        BAD_PARAMETER          = 3
        FILE_NOT_FOUND         = 4
        PATH_NOT_FOUND         = 5
        FILE_EXTENSION_UNKNOWN = 6
        ERROR_EXECUTE_FAILED   = 7
        SYNCHRONOUS_FAILED     = 8
        NOT_SUPPORTED_BY_GUI   = 9
        OTHERS                 = 10.
  ENDIF.
  CP_WRK_ERR = SY-SUBRC.
  IF SY-SUBRC <> 0.
*   Application execute failed
    PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                       'ZGCM01'
                                       '017'
                                       ''
                                       ''
                                       ''
                                       ''
                              CHANGING CP_REC_MSG.
  ENDIF.
ENDFORM.                    "FI_APPLICATION_EXECUTE
*&---------------------------------------------------------------------*
*&      Form  FI_MESSAGE_CREATE_FI
*&---------------------------------------------------------------------*
*       Common message processing
*----------------------------------------------------------------------*
*       --&gt UP_MSGTY   : Message Type
*       --&gt UP_MSGID   : Message Class
*       --&gt UP_MSGNO   : Message Number
*       --&gt UP_MSGV1   : Message Variable
*       --&gt UP_MSGV2   : Message Variable
*       --&gt UP_MSGV3   : Message Variable
*       --&gt UP_MSGV4   : Message Variable
*       *----------------------------------------------------------------------*
FORM. FI_MESSAGE_CREATE_FI  USING VALUE(UP_WRK_MSGTY) TYPE SYMSG-MSGTY
                                 VALUE(UP_WRK_MSGID) TYPE SYMSG-MSGID
                                 VALUE(UP_WRK_MSGNO) TYPE SYMSG-MSGNO
                                 VALUE(UP_WRK_MSGV1) TYPE ANY
                                 VALUE(UP_WRK_MSGV2) TYPE ANY
                                 VALUE(UP_WRK_MSGV3) TYPE ANY
                                 VALUE(UP_WRK_MSGV4) TYPE ANY
                        CHANGING CP_REC_MSG          TYPE SYMSG.
  DATA:
    L_WRK_MSG TYPE STRING.
  MESSAGE ID     UP_WRK_MSGID
          TYPE   UP_WRK_MSGTY
          NUMBER UP_WRK_MSGNO
          WITH   UP_WRK_MSGV1
                 UP_WRK_MSGV2
                 UP_WRK_MSGV3
                 UP_WRK_MSGV4
          INTO   L_WRK_MSG.
  CP_REC_MSG-MSGTY = SY-MSGTY.
  CP_REC_MSG-MSGID = SY-MSGID.
  CP_REC_MSG-MSGNO = SY-MSGNO.
  CP_REC_MSG-MSGV1 = SY-MSGV1.
  CP_REC_MSG-MSGV2 = SY-MSGV2.
  CP_REC_MSG-MSGV3 = SY-MSGV3.
  CP_REC_MSG-MSGV4 = SY-MSGV4.
ENDFORM.                    " FI_MESSAGE_CREATE_FI
************************************************************************
*                           FORMS                                      *
************************************************************************
*&---------------------------------------------------------------------*
*&      Form  FI_DL_FILE_PATH_CHECK
*&---------------------------------------------------------------------*
*       Local file path  check for download
*----------------------------------------------------------------------*
*       --&gt UP_WRK_PATH : Path to check
*       --&gt UP_WRK_MSG  : Popup message
*       --&gt UP_WRK_TBTT1: Button1 text
*       --&gt UP_WRK_TBTT2: Button2 text
*       --&gt UP_FLG_CANCEL: Cancel Button Flag
*       *       *----------------------------------------------------------------------*
FORM. FI_DL_FILE_PATH_CHECK USING  VALUE(UP_WRK_PATH)   TYPE ANY
                                   VALUE(UP_WRK_MSG)    TYPE STRING
                                   VALUE(UP_WRK_TBTT1)  TYPE STRING
                                   VALUE(UP_WRK_TBTT2)  TYPE STRING
                                   VALUE(UP_FLG_CANCEL) TYPE C
                          CHANGING CP_WRK_ERR           TYPE C
                                   CP_REC_MSG           TYPE SYMSG.
  DATA:
    L_WRK_PATH          TYPE STRING,             "file path
    L_WRK_NAME          TYPE STRING,             "file name
    L_WRK_ANSWER        TYPE C,                  "Return value
    L_WRK_EX            TYPE C,                  "result for path check
    L_FLG_EMGC(1)       TYPE C,                  "EMERGENCY_FLAG
    L_WRK_PHYSICAL(255) TYPE C.                  "Physical File Name
  CLEAR:
    CP_WRK_ERR,
    CP_REC_MSG.
* Split file and path
  CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
    EXPORTING
      FULL_NAME     = UP_WRK_PATH
    IMPORTING
      STRIPPED_NAME = L_WRK_NAME
      FILE_PATH     = L_WRK_PATH
    EXCEPTIONS
      X_ERROR       = 1
      OTHERS        = 2.
  IF SY-SUBRC <> 0.
    CP_WRK_ERR = I_CON_CP_ON.
*   Application execute failed
    PERFORM. FI_MESSAGE_CREATE_FI USING SY-MSGTY
                                       SY-MSGID
                                       SY-MSGNO
                                       SY-MSGV1
                                       SY-MSGV2
                                       SY-MSGV3
                                       SY-MSGV4
                              CHANGING CP_REC_MSG.
    EXIT.
  ENDIF.
* Existence Check on the directory
  PERFORM. FI_DIRECTORY_PATH_CHECK USING  'X'
                                         L_WRK_PATH
                                CHANGING CP_WRK_ERR
                                         CP_REC_MSG.
  IF CP_WRK_ERR <> SPACE.
    EXIT.
  ENDIF.
* Overwrite Check on the filename
  PERFORM. FI_FILE_PATH_CHECK     USING 'X'
                                       UP_WRK_PATH
                              CHANGING CP_WRK_ERR
                                       CP_REC_MSG.
  IF CP_WRK_ERR = 'X'.
    CP_WRK_ERR = SPACE.
    CLEAR CP_REC_MSG.
  ELSE.
    CALL FUNCTION 'POPUP_TO_CONFIRM'
      EXPORTING
        TEXT_QUESTION         = UP_WRK_MSG
        TEXT_BUTTON_1         = UP_WRK_TBTT1
        TEXT_BUTTON_2         = UP_WRK_TBTT2
        DISPLAY_CANCEL_BUTTON = UP_FLG_CANCEL
      IMPORTING
        ANSWER                = L_WRK_ANSWER
      EXCEPTIONS
        TEXT_NOT_FOUND        = 1
        OTHERS                = 2.
    IF SY-SUBRC = 0 AND
      ( L_WRK_ANSWER = '2' OR            "Next pushbutton
       L_WRK_ANSWER = 'A' ).             "Cancel
      CP_WRK_ERR = I_CON_CP_ON.
      PERFORM. FI_MESSAGE_CREATE_FI USING 'E'
                                         'ZGCM01'
                                         '025'
                                         ''
                                         ''
                                         ''
                                         ''
                                CHANGING CP_REC_MSG.
    ENDIF.
  ENDIF.
ENDFORM.                    "FI_DL_FILE_PATH_CHECK

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25688124/viewspace-760722/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25688124/viewspace-760722/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值