用文件更新表

DD

*&---------------------------------------------------------------------*
*& Report  XXXXXXX
*&
*&---------------------------------------------------------------------*
*& ファイルアップロードして各伝票アドオンテーブルデータを登録更新
*&
*&---------------------------------------------------------------------*

REPORT  XXXXXXXX.

*----------------------------------------------------------------------*
* TYPE-POOLS:
*----------------------------------------------------------------------*
TYPE-POOLS : OLE2.    " OLE Automation Controller: OLE Typen

*----------------------------------------------------------------------*
* TABLE
*----------------------------------------------------------------------*
* CLPB_EXPORT用内部テーブル構造
TYPES: BEGIN OF T_TAB,
         FL01(20000) TYPE C,
       END OF T_TAB.
* エクセルシート構造
TYPES: BEGIN OF T_SNAME,
         NO(4)            TYPE N,                   "連番
         NAME             TYPE NAME1,               "シート名称
       END OF T_SNAME.
* エクセルシートテーブル
DATA : ITAB_SNAME         TYPE TABLE OF T_SNAME,
       STR_SNAME          TYPE          T_SNAME.

* アップロードデータ
TYPES: BEGIN OF T_UPDATA,
         VALUE(5000) TYPE C,
       END   OF T_UPDATA.
DATA I_UPDATA TYPE TABLE OF T_UPDATA.
DATA H_UPDATA TYPE          T_UPDATA.


*----------------------------------------------------------------------*
* DATA
*----------------------------------------------------------------------*
* 作業項目
DATA EXCEL             TYPE OLE2_OBJECT.  "EXCEL       object
DATA WORKBOOK          TYPE OLE2_OBJECT.  "WORKBOOK    object
DATA CELLS             TYPE OLE2_OBJECT.  "CELLS       object
DATA SELSHEET          TYPE OLE2_OBJECT.  "SELSHEET    object
DATA OPEN              TYPE OLE2_OBJECT.
DATA SELSHEETS         TYPE OLE2_OBJECT.  "SELSHEET    object

* シート名称取得用
DATA SHEETNAME(30)     TYPE C.
DATA V_TBLCNT TYPE I.

FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <STRUC> TYPE ANY.
FIELD-SYMBOLS <FLD>   TYPE ANY.

constants:
  c_tab type c value cl_abap_char_utilities=>horizontal_tab.

*----------------------------------------------------------------------*
* PARAMETERS
*----------------------------------------------------------------------*
PARAMETERS P_FNAME LIKE RLGRAP-FILENAME OBLIGATORY.
PARAMETERS P_SNAME LIKE RLGRAP-FILENAME.
PARAMETERS P_TABLE TYPE DD02L-TABNAME.
PARAMETERS P_LINE  TYPE I DEFAULT 0.


*----------------------------------------------------------------------*
* AT SELECTION-SCREEN
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FNAME.
  PERFORM F_FNAME_F4.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_SNAME.
  PERFORM F_HEETNAME_GET.


*----------------------------------------------------------------------*
* START-OF-SELECTION
*----------------------------------------------------------------------*
START-OF-SELECTION.
*  PERFORM (p_table) IN PROGRAM (sy-repid).
*  PERFORM f_upload     TABLES <table>.

  PERFORM F_EXCEL_UPLOAD.
  PERFORM F_LINE_CHECK.
  PERFORM F_DATA_EDIT.
  PERFORM f_modify.

*&---------------------------------------------------------------------*
*&      Form  f_fname_f4
*&---------------------------------------------------------------------*
*       検索ヘルプ
*----------------------------------------------------------------------*
FORM F_FNAME_F4 .

  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
    EXPORTING
      PROGRAM_NAME  = SY-REPID
      DYNPRO_NUMBER = SY-DYNNR
    CHANGING
      FILE_NAME     = P_FNAME
    EXCEPTIONS
      MASK_TOO_LONG = 1
      OTHERS        = 2.

  IF SY-SUBRC <> 0.
*    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*          WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    " f_fname_f4
*&---------------------------------------------------------------------*
*&      Form  f_HEETNAME_GET
*&---------------------------------------------------------------------*
*       エクセルシート
*----------------------------------------------------------------------*
FORM F_HEETNAME_GET .

  DATA: L_C_MSG(50) TYPE C,           "メッセージ変数
        L_CNT       TYPE I.           "シート数のカウンタ
  DATA: ITAB_RETURN TYPE TABLE OF     "シート名照会の返値
                    DDSHRETVAL WITH HEADER LINE.

  CLEAR : L_CNT, STR_SNAME.
  REFRESH ITAB_SNAME.

* オブジェクトの生成
  CREATE OBJECT EXCEL 'Excel.Application'.
  CASE SY-SUBRC .
    WHEN 1 .
      MESSAGE E162(00) WITH TEXT-M03.
      " SAPGUIの通信エラー
    WHEN 2 .
      MESSAGE E162(00) WITH TEXT-M04.
      " SAPGUIファンクションコールのエラー
    WHEN 3 .
      MESSAGE E162(00) WITH TEXT-M05 TEXT-M06.
      " OLE APIコールでエラーが発生しました
      " これは記憶域の問題である可能性があります
    WHEN 4 .
      MESSAGE E162(00) WITH TEXT-M07.
      " オブジェクトがSAPに未登録です
  ENDCASE .
  CALL METHOD OF EXCEL 'Workbooks' = WORKBOOK.
  CASE SY-SUBRC .
    WHEN 1 .
      CONCATENATE TEXT-M09 SY-MSGLI INTO L_C_MSG.
      MESSAGE E162(00) WITH TEXT-M08 L_C_MSG.
      " プレゼンテーションサーバとの通信時にシステムエラー発生しました
      " エラー内容: sy-msgli
    WHEN 2 .
      MESSAGE E162(00) WITH TEXT-M10.
      " メソッドコールによってエラー発生しました
    WHEN 3 .
      MESSAGE E162(00) WITH TEXT-M11.
      " 特性の設定によってエラー発生しました
    WHEN 4 .
      MESSAGE E162(00) WITH TEXT-M12.
      " 特性の読込によってエラー発生しました
  ENDCASE .

* 入力ファイルを読み込み専用で開く
  CALL METHOD OF WORKBOOK 'Open' = OPEN NO FLUSH
    EXPORTING #1 = P_FNAME.
  CALL METHOD OF OPEN 'ReadOnly' NO FLUSH.
* (強制的な同期化)
  CALL FUNCTION 'FLUSH'
    EXCEPTIONS
      CNTL_SYSTEM_ERROR = 1
      CNTL_ERROR        = 2
      OTHERS            = 3.
  IF SY-SUBRC <> 0.
  ENDIF.

* EXCELシートの選択
  CALL METHOD OF EXCEL 'Sheets' = SELSHEET .
* 第一シートから順番にシート名称を取得
  DO.
    L_CNT = L_CNT + 1.
    STR_SNAME-NO = L_CNT.
*   【カウンタ】番目のシートを指定
    CALL METHOD OF SELSHEET 'item' = SELSHEETS EXPORTING #1 = L_CNT.
    IF SY-SUBRC = 0.
*      現在アクティブなシートの名称を取得
      GET PROPERTY OF SELSHEETS  'Name' = SHEETNAME.
      IF SY-SUBRC = 0.
        STR_SNAME-NAME = SHEETNAME.
        APPEND STR_SNAME TO ITAB_SNAME.
      ENDIF.
    ELSE.
*     カウンタに該当するシートが無ければ終了
      EXIT.
    ENDIF.
  ENDDO.

* エクセルを終了する
  CALL METHOD OF EXCEL 'QUIT'.

* 外部オブジェクトが占有するメモリの開放
  FREE   OBJECT EXCEL.

* シート名称の候補選択:ポップアップ表示
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD        = 'NAME'
      VALUE_ORG       = 'S'
    TABLES
      VALUE_TAB       = ITAB_SNAME
      RETURN_TAB      = ITAB_RETURN
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.

* 選択シート名称をセット
  IF SY-SUBRC = 0.
    P_SNAME = ITAB_RETURN-FIELDVAL.
  ENDIF.

ENDFORM.                    " f_HEETNAME_GET
*&---------------------------------------------------------------------*
*&      Form  F_EXCEL_UPLOAD
*&---------------------------------------------------------------------*
*       エクセル初期設定
*----------------------------------------------------------------------*
FORM F_EXCEL_UPLOAD.

* LOCAL DATA
  DATA:L_C_MSG(50) TYPE C.  " メッセージ変数

* オブジェクトの生成
  CREATE OBJECT EXCEL 'Excel.Application'.
*
  CASE SY-SUBRC .
    WHEN 1 .
      MESSAGE E162(00) WITH TEXT-M03.
      " SAPGUIの通信エラー
    WHEN 2 .
      MESSAGE E162(00) WITH TEXT-M04.
      " SAPGUIファンクションコールのエラー
    WHEN 3 .
      MESSAGE E162(00) WITH TEXT-M05 TEXT-M06.
      " OLE APIコールでエラーが発生しました
      " これは記憶域の問題である可能性があります
    WHEN 4 .
      MESSAGE E162(00) WITH TEXT-M07.
      " オブジェクトがSAPに未登録です
  ENDCASE .
*
  CALL METHOD OF EXCEL 'Workbooks' = WORKBOOK.
  CASE SY-SUBRC .
    WHEN 1 .
      CONCATENATE TEXT-M09 SY-MSGLI INTO L_C_MSG.
      MESSAGE E162(00) WITH TEXT-M08 L_C_MSG.
      " プレゼンテーションサーバとの通信時にシステムエラー発生しました
      " エラー内容: sy-msgli
    WHEN 2 .
      MESSAGE E162(00) WITH TEXT-M10.
      " メソッドコールによってエラー発生しました' .
    WHEN 3 .
      MESSAGE E162(00) WITH TEXT-M11.
      " 特性の設定によってエラー発生しました
    WHEN 4 .
      MESSAGE E162(00) WITH TEXT-M12.
      " 特性の読込によってエラー発生しました
  ENDCASE .

* EXCELを表示可にする ※出力後に表示に変更
*  SET PROPERTY OF EXCEL 'VISIBLE' = 1 .

* 入力ファイルを読み込み専用で開く
  CALL METHOD OF WORKBOOK 'Open' = OPEN NO FLUSH
    EXPORTING #1 = P_FNAME.
  CALL METHOD OF OPEN 'ReadOnly' NO FLUSH.
* (強制的な同期化)
  CALL FUNCTION 'FLUSH'
    EXCEPTIONS
      CNTL_SYSTEM_ERROR = 1
      CNTL_ERROR        = 2
      OTHERS            = 3.
  IF SY-SUBRC <> 0.
  ENDIF.

* EXCELシートの選択
  CALL METHOD OF EXCEL 'Sheets' = SELSHEET .
  IF P_SNAME IS INITIAL.
* シートの入力なし:第一シートを選択
    CALL METHOD OF SELSHEET 'item' = SELSHEETS EXPORTING #1 = 1.
  ELSE.
* シートの入力あり:指定シートを選択
    CALL METHOD OF SELSHEET 'item' = SELSHEETS EXPORTING #1 = P_SNAME.
  ENDIF.

* 指定シート内容の全セルをコピー(クリップボードに保存)
  CALL METHOD OF SELSHEETS 'Cells' = CELLS.
  CALL METHOD OF CELLS 'COPY' .

* クリップボードの内容を内部テーブルに取込む
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_IMPORT
    IMPORTING
      DATA = I_UPDATA.

* クリップボードをクリア
  SET PROPERTY OF EXCEL 'CutCopyMode' = 0.
* エクセルを終了する
  CALL METHOD OF EXCEL 'QUIT'.
* 外部オブジェクトが占有するメモリの開放
  FREE   OBJECT EXCEL.

ENDFORM.                    " F_EXCEL_UPLOAD
*&---------------------------------------------------------------------*
*&      Form  f_line_check
*&---------------------------------------------------------------------*
*       チェック削除
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F_LINE_CHECK.

* データ件数チェック
  DESCRIBE TABLE I_UPDATA LINES V_TBLCNT.
  IF V_TBLCNT = 0.
    MESSAGE S208(00) WITH '処理データが存在しません'.
    LEAVE LIST-PROCESSING.
  ELSE.
    IF P_LINE > 0.
      DELETE I_UPDATA FROM 1 TO P_LINE.
    ENDIF.
  ENDIF.

ENDFORM.                    " f_line_check
*&---------------------------------------------------------------------*
*&      Form  f_data_edit
*&---------------------------------------------------------------------*
*       データ編集
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F_DATA_EDIT .

  DATA L_I_REF    TYPE REF TO DATA.
  DATA L_H_REF    TYPE REF TO DATA.
  DATA L_H_RESULT TYPE MATCH_RESULT.
  DATA L_OFF      TYPE I.
  DATA L_LEN      TYPE I.

* 内部テーブルの動的割当
  CREATE DATA :
   L_I_REF TYPE TABLE OF (P_TABLE),
   L_H_REF TYPE          (P_TABLE).

  ASSIGN :
   L_I_REF->* TO <TABLE>[],
   L_H_REF->* TO <STRUC>.


  LOOP AT I_UPDATA INTO H_UPDATA.
    DO.
      FIND C_TAB
        IN H_UPDATA
        RESULTS L_H_result.

      IF SY-SUBRC = 0.
        L_LEN = L_H_RESULT-OFFSET - L_OFF.

        ASSIGN COMPONENT sy-index OF STRUCTURE <STRUC> TO <FLD>.

        IF L_LEN <> 0.
          <FLD> = H_UPDATA+L_OFF(L_LEN).
        ENDIF.

        SHIFT H_UPDATA UP TO C_TAB.
        SHIFT H_UPDATA BY 1 PLACES.

      ELSE.
        IF NOT H_UPDATA IS INITIAL.
          ASSIGN COMPONENT sy-index OF STRUCTURE <STRUC> TO <FLD>.
*          IF L_LEN <> 0.
            <FLD> = H_UPDATA.
*          ENDIF.
        ENDIF.
        EXIT.
      ENDIF.
    ENDDO.

    IF NOT <STRUC> IS INITIAL.
      APPEND <STRUC> TO <TABLE>.
    ENDIF.
    CLEAR: l_len, l_off, <STRUC>.
  ENDLOOP.

ENDFORM.                    " f_data_edit
*&---------------------------------------------------------------------*
*&      Form  f_modify
*&---------------------------------------------------------------------*
*       テーブル更新
*----------------------------------------------------------------------*
FORM F_MODIFY.

  data v_cnt_line type i.

  describe table <TABLE> lines v_cnt_line.

  MODIFY (P_TABLE) FROM TABLE <TABLE>.

  IF SY-SUBRC = 0.
    MESSAGE S398(00) WITH v_cnt_line '件' '更新成功'.
  ELSE.
    MESSAGE S398(00) WITH v_cnt_line '件' '更新エラー'.
  ENDIF.

ENDFORM.                    " f_modify
*&---------------------------------------------------------------------*
*&      Form  f_upload
*&---------------------------------------------------------------------*
*       ファイルアップロード
*----------------------------------------------------------------------*
FORM F_UPLOAD TABLES T_I_UPDATA.

  DATA L_FNAME TYPE STRING.
  L_FNAME = P_FNAME.

  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      FILENAME                      = L_FNAME
*      FILETYPE                      = 'BIN'
      HAS_FIELD_SEPARATOR           = 'X'
    TABLES
      DATA_TAB                      = T_I_UPDATA
    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.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    " f_upload

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值