*&---------------------------------------------------------------------*
*& 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