SAP ABAP ALV完整版示例笔记(已更新)

此博客详细介绍了如何使用SAP ABAP编程实现ALV报告,包括数据获取、编辑、输出和上传功能。通过创建类型、内部表、工作区,实现了数据筛选、格式设置和颜色高亮。同时,提供了下载、上传和服务器上传的选项,并对用户输入进行验证,确保了数据交互的完整性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*&---------------------------------------------------------*
*& Report SingerJulie
*&
*&---------------------------------------------------------*
*&
*&     ALVについて完全なノート
*&
*&---------------------------------------------------------*

REPORT  Y_ALV_34114
NO STANDARD PAGE HEADING.

TABLES: VBRK.                                               "データベースを参考します
TYPE-POOLS:SLIS.                                            "データ型グループを参考します
TYPE-POOLS:TRUXS.

*&---------------------------------------------------------*
*&     タイプグループを創設します
*&---------------------------------------------------------*

TYPES:BEGIN OF TYP_DATA.                                    "ALV用タイプグループ
TYPES BOX TYPE C LENGTH 1.                                  "行の選中
        INCLUDE STRUCTURE YSTRU_ALV_1122_0707.                "出力用構造
TYPES COLOR TYPE C LENGTH 4.                                "行の色
TYPES CLR TYPE LVC_T_SCOL.                                  "セルの色
TYPES:END OF TYP_DATA.

TYPES:
  BEGIN OF TYP_VBRK,
    VKORG TYPE VBRK-VKORG,                                  "売組
    FKDAT TYPE VBRK-FKDAT,                                  "請求索引および印刷に対します請求日
    VBELN TYPE VBRK-VBELN,                                  "会計年度
  END OF TYP_VBRK.

TYPES:
  BEGIN OF TYP_VBRP,
    VBELN TYPE VBRP-VBELN,                                  "請求伝票
    POSNR TYPE VBRP-POSNR,                                  "請求明細
    FKIMG TYPE VBRP-FKIMG,                                  "在庫単位による請求数量
    MEINS TYPE VBRP-MEINS,                                  "基本数量単位
    NETWR TYPE VBRP-NETWR,                                  "伝票通貨での請求明細の正味額
  END OF TYP_VBRP.

*&---------------------------------------------------------*
*&     内部テーブルとワークエリアを創設します
*&---------------------------------------------------------*

DATA:
  GIT_VBRK TYPE STANDARD TABLE OF TYP_VBRK,                 "FOR ALL ENTRIES用内部テーブル
  GIT_VBRP TYPE STANDARD TABLE OF TYP_VBRP,                 "FOR ALL ENTRIES用内部テーブル
  GIT_DATA TYPE STANDARD TABLE OF TYP_DATA,
  GW_VBRK  TYPE TYP_VBRK,                                   "FOR ALL ENTRIES用ワークエリア
  GW_VBRP  TYPE TYP_VBRP,                                   "FOR ALL ENTRIES用ワークエリア
  GW_DATA  TYPE TYP_DATA.

DATA:
  GIT_FIELDCAT TYPE slis_t_fieldcat_alv,                    "FIELDCAT用内部テーブル
  GW_FIELDCAT  TYPE slis_fieldcat_alv,                      "FIELDCAT用ワークエリア
  GIT_SORT     TYPE slis_t_sortinfo_alv,                    "SORT用内部テーブル
  GW_SORT      TYPE slis_sortinfo_alv,                      "SORT用ワークエリア
  GW_LAYOUT    TYPE slis_layout_alv.                        "LAYOUT用ワークエリア

DATA:
  GIT_ULDATA TYPE TABLE OF YSTRU_ALV_1123_0712,             "アップデート出力用内部テーブル
  GW_ULDATA  TYPE YSTRU_ALV_1123_0712,                      "アップデート出力用ワークエリア
  GIT_UL_DBT TYPE STANDARD TABLE OF YALV_1123,              "DBTを更新するための内部テーブル
  GW_UL_DBT  TYPE YALV_1123.                                "DBTを更新するためのワークエリア

*&---------------------------------------------------------*
*&     選択画面を創設します
*&---------------------------------------------------------*

PARAMETERS:
  P_DL RADIOBUTTON GROUP G1 USER-COMMAND UCOM1 DEFAULT 'X', "ダウンロード
  P_UL RADIOBUTTON GROUP G1 .                               "アップロード

SELECTION-SCREEN SKIP.

PARAMETERS:
  P_TXT RADIOBUTTON GROUP G3 MODIF ID M4                    "TEXT でアップロードします
  USER-COMMAND UCOM3 DEFAULT 'X',
  P_XLS RADIOBUTTON GROUP G3 MODIF ID M4,                   "EXCELでアップロードします
  P_SERVER RADIOBUTTON GROUP G3 MODIF ID M4.                "サーバにアップロードします

SELECTION-SCREEN SKIP.

PARAMETERS:
  P_FILE  TYPE FILEPATH-PATHINTERN MODIF ID M3,             "論理パス名
  P_NAME  TYPE STRING              MODIF ID M3              "ファイル名
  DEFAULT 'SERVER_UPLOAD_34114.TXT',
  P_FIL_L TYPE STRING              MODIF ID M3,             "ローカルパス名
  P_VKORG TYPE VBRK-VKORG MODIF ID M2.                      "売組

SELECT-OPTIONS:
  S_FKDAT FOR VBRK-FKDAT NO-EXTENSION MODIF ID M2.          "請求索引および印刷に対します請求日

SELECTION-SCREEN SKIP.

PARAMETERS:
  P_FLDC1 RADIOBUTTON GROUP G2 MODIF ID M1 DEFAULT 'X'      "手動でFIELDCATを編集します
USER-COMMAND UCOM2,
  P_SE11  RADIOBUTTON GROUP G2 MODIF ID M1,                 "直接にSE11構造を使用します
  P_FLDC2 RADIOBUTTON GROUP G2 MODIF ID M1.                 "構造によってFIELDCAT内部テーブルを編集します

*&---------------------------------------------------------*
*&     主処理事件
*&---------------------------------------------------------*

INITIALIZATION.

  PERFORM F_INITIAL.                                        "初期化事件

AT SELECTION-SCREEN OUTPUT.

  PERFORM F_SCREEN_MOD.                                     "スクリーン属性制御事件

AT SELECTION-SCREEN.

  PERFORM F_SCREEN_CHECK.                                   "スクリーンチェック事件

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FIL_L.

  PERFORM F_F4HELP_FOR_PATH.

START-OF-SELECTION.

  PERFORM F_GET_DATA.                                       "データを取得します

  PERFORM F_EDIT_DATA.                                      "データを編集します

  PERFORM F_OUTPUT.                                         "データを出力します

  PERFORM F_TOP_OF_PAGE.

*&---------------------------------------------------------*
*&      Form  F_INITIAL
*&---------------------------------------------------------*
*       初期化事件
*----------------------------------------------------------*

FORM F_INITIAL .

  P_VKORG = '5000'.                                         "売組の初期値

  S_FKDAT-SIGN = 'I'.
  S_FKDAT-OPTION = 'EQ'.
  S_FKDAT-LOW = '20170601'.                                 "請求日の最大値
  S_FKDAT-HIGH = '20170730'.                                "請求日の最小値
  APPEND S_FKDAT TO S_FKDAT.

  CLEAR:
        GIT_VBRK,                                           "内部テーブルをクリアします
        GIT_VBRP,
        GIT_DATA,

        GW_VBRK,                                            "ワークエリアをクリアします
        GW_VBRP,
        GW_DATA.

ENDFORM.                    " F_INITIAL

*&---------------------------------------------------------*
*&      Form  F_SCREEN_CHECK
*&---------------------------------------------------------*
*       スクリーンチェック事件
*----------------------------------------------------------*

FORM F_SCREEN_CHECK .

  CHECK SY-UCOMM = ''                                       "F8
     OR SY-UCOMM = 'ONLI'.                                  "ENTER

  IF S_FKDAT = SPACE.                                       "請求日 = SPACE

    MESSAGE E001(Y_MESSAGE_34114) WITH TEXT-009.            "相応の値を入力してください。

  ELSEIF P_SERVER = 'X'                                     "アップロード
  AND    P_UL = 'X'                                         "サーバにアップロードします
    .
    IF P_FILE = SPACE.                                      "論理パス名 = SPACE
      MESSAGE E001(Y_MESSAGE_34114) WITH TEXT-033.          "論理パス名を入力してください。
*      DISPLAY LIKE 'E'.
*      LEAVE LIST-PROCESSING .

*    ELSEIF P_NAME = SPACE.                                  "ファイル名 = SPACE
*      MESSAGE S001(Y_MESSAGE_34114) WITH TEXT-034           "ファイル名を入力してください。
*      DISPLAY LIKE 'E'.
*      LEAVE LIST-PROCESSING .

    ENDIF.

  ENDIF.

ENDFORM.                    " F_SCREEN_CHECK

*&---------------------------------------------------------*
*&      Form  F_SCREEN_MOD
*&---------------------------------------------------------*
*       スクリーン属性制御事件
*----------------------------------------------------------*

FORM F_SCREEN_MOD .

  LOOP AT SCREEN.

    IF P_DL = 'X'.                                          "ダウンロード

      IF SCREEN-GROUP1 = 'M3'                               "アップロードファイル
      OR SCREEN-GROUP1 = 'M4'                               "TXT ELS SERVER
      .
        SCREEN-ACTIVE = 0.                                  "現れません
        MODIFY SCREEN.                                      "スクリーンを刷新します

      ENDIF.

    ELSEIF P_UL = 'X'
    AND    P_SERVER = SPACE.                                "アップロード

      IF SCREEN-GROUP1 = 'M1'                               "手動 直接SE11 直接+FIELDCAT
      OR SCREEN-GROUP1 = 'M2'                               "売組 請求日
      OR SCREEN-GROUP1 = 'M3'                               "アップロードファイル
      .
        SCREEN-ACTIVE = 0.                                  "現れません
        MODIFY SCREEN.                                      "スクリーンを刷新します

      ENDIF.

    ELSEIF P_UL = 'X'                                       "アップロード
    AND    P_SERVER = 'X'.                                  "サーバにアップロードします

      IF SCREEN-GROUP1 = 'M1'                               "手動 直接SE11 直接+FIELDCAT
      OR SCREEN-GROUP1 = 'M2'                               "売組 請求日
      .
        SCREEN-ACTIVE = 0.                                  "現れません
        MODIFY SCREEN.                                      "スクリーンを刷新します

      ENDIF.

      IF SCREEN-NAME = 'P_FILE'                             "論理パス名
      OR SCREEN-NAME = 'P_FIL_L'.                           "ローカルパス名
        SCREEN-REQUIRED = 2.                                "仮入力しなちゃ
        MODIFY SCREEN.                                      "スクリーンを刷新します
      ENDIF.

*    ELSE.
*
*      IF SCREEN-GROUP1 = 'M5'                               "ダウンロードパスと名
*      OR SCREEN-GROUP1 = 'M8'                               "TEXT でアップロードします
*      OR SCREEN-GROUP1 = 'M9'                               "EXCELでアップロードします
*      .
*
*        SCREEN-ACTIVE = 1.                                  "現れます
*        MODIFY SCREEN.                                      "スクリーンを刷新します
*
*      ENDIF.

    ENDIF.

  ENDLOOP.

ENDFORM.                    " F_SCREEN_MOD

*&---------------------------------------------------------*
*&      Form  F_GET_DATA
*&---------------------------------------------------------*
*       データを取得します
*----------------------------------------------------------*

FORM F_GET_DATA
    .                                                       "一番目のデータベースのデータ
  SELECT VKORG                                              "売組
         FKDAT                                              "請求日
         VBELN                                              "請求伝票
    FROM VBRK
    INTO TABLE GIT_VBRK
   WHERE VKORG = P_VKORG                                    "売組
     AND FKDAT IN S_FKDAT                                   "請求日
       .

  SORT GIT_VBRK BY VBELN ASCENDING.                         "ソートします
  DELETE ADJACENT DUPLICATES FROM GIT_VBRK                  "重複項目を削除します
  COMPARING VBELN.

  IF GIT_VBRK IS NOT INITIAL
  .                                                         "二番目のデータベースのデータ
    SELECT VBELN                                            "請求伝票
           POSNR                                            "請求明細
           FKIMG                                            "請求数量
           MEINS                                            "基本数量単位
           NETWR                                            "正味額
      FROM VBRP
      INTO TABLE GIT_VBRP
       FOR ALL ENTRIES IN GIT_VBRK
     WHERE VBELN = GIT_VBRK-VBELN                           "請求伝票
         .

  ENDIF.

ENDFORM.                    " F_GET_DATA

*&---------------------------------------------------------*
*&      Form  F_EDIT_DATA
*&---------------------------------------------------------*
*       データを編集します
*----------------------------------------------------------*

FORM F_EDIT_DATA .

  SORT GIT_VBRP BY VBELN ASCENDING.                         "ソートします

  LOOP AT GIT_VBRK INTO GW_VBRK
  .                                                         "データを総ワークエリアに値を賦与します
    GW_DATA-VKORG = GW_VBRK-VKORG.                          "売組
    GW_DATA-FKDAT = GW_VBRK-FKDAT.                          "請求日
    GW_DATA-VBELN = GW_VBRK-VBELN.                          "請求伝票

    IF SY-SUBRC = 0.

      READ TABLE GIT_VBRP INTO GW_VBRP                      "二分検索
      WITH KEY VBELN = GW_VBRK-VBELN
      BINARY SEARCH
      .                                                     "データを総ワークエリアに値を賦与します
      GW_DATA-VBELN = GW_VBRP-VBELN.                        "請求伝票
      GW_DATA-POSNR = GW_VBRP-POSNR.                        "請求明細
      GW_DATA-FKIMG = GW_VBRP-FKIMG.                        "請求数量
      GW_DATA-MEINS = GW_VBRP-MEINS.                        "基本数量単位
      GW_DATA-NETWR = GW_VBRP-NETWR.                        "正味額

    ENDIF.

    APPEND GW_DATA TO GIT_DATA.                             "データを総内部テーブルに値を賦与します

  ENDLOOP.

ENDFORM.                    " F_EDIT_DATA

*&---------------------------------------------------------*
*&      Form  F_OUTPUT
*&---------------------------------------------------------*
*       データを出力します
*----------------------------------------------------------*

FORM F_OUTPUT .

  IF P_UL = 'X'.

    CASE 'X'.

      WHEN P_TXT.

        PERFORM F_UPLOAD_TXT.                               "TEXTでアップロードします

      WHEN P_XLS.

        PERFORM F_UPLOAD_XLS.                               "XLSでアップロードします

      WHEN P_SERVER.

        PERFORM F_UPLOAD_SERVER.                            "サーバにアップロードします

    ENDCASE.

  ELSE.

    CASE 'X'.

      WHEN P_FLDC1.                                         "手動でFIELDCATを編集します

        PERFORM F_ALV_FIELDCAT.

      WHEN P_SE11.                                          "直接にSE11構造を使用します

        PERFORM F_ALV_SE11.

      WHEN P_FLDC2.                                         "構造によってFIELDCAT内部テーブルを編集します

        PERFORM F_ALV_FIELDCAT2.

    ENDCASE.

  ENDIF.

ENDFORM.                    " F_OUTPUT

*&---------------------------------------------------------*
*&      Form  F_ALV_FIELDCAT
*&---------------------------------------------------------*
*       手動でFIELDCATを編集します
*----------------------------------------------------------*

FORM F_ALV_FIELDCAT .

  PERFORM F_EDIT_DISPLAY.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_PF_STATUS_SET = 'F_STATUS'
      I_CALLBACK_USER_COMMAND  = 'F_COMMAND'
      I_CALLBACK_TOP_OF_PAGE   = 'F_TOP_OF_PAGE'
      IS_LAYOUT                = GW_LAYOUT
      IT_FIELDCAT              = GIT_FIELDCAT
      IT_SORT                  = GIT_SORT
      I_GRID_TITLE             = TEXT-010
      I_SAVE                   = 'A'
    TABLES
      T_OUTTAB                 = GIT_DATA
    EXCEPTIONS
      PROGRAM_ERROR            = 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_ALV_FIELDCAT

*&---------------------------------------------------------*
*&      Form  F_ALV_SE11
*&---------------------------------------------------------*
*       直接にSE11構造を使用します
*----------------------------------------------------------*

FORM F_ALV_SE11 .

  PERFORM F_EDIT_DISPLAY.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_PF_STATUS_SET = 'F_STATUS'
      I_CALLBACK_USER_COMMAND  = 'F_COMMAND'
      I_CALLBACK_TOP_OF_PAGE   = 'F_TOP_OF_PAGE'
      I_STRUCTURE_NAME         = 'YSTRU_ALV_1122_0707'
      IS_LAYOUT                = GW_LAYOUT
      IT_FIELDCAT              = GIT_FIELDCAT
      IT_SORT                  = GIT_SORT
      I_GRID_TITLE             = TEXT-010
    TABLES
      T_OUTTAB                 = GIT_DATA
    EXCEPTIONS
      PROGRAM_ERROR            = 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_ALV_SE11

*&---------------------------------------------------------*
*&      Form  F_ALV_FIELDCAT2
*&---------------------------------------------------------*
*       構造によってFIELDCAT内部テーブルを編集します
*----------------------------------------------------------*

FORM F_ALV_FIELDCAT2 .

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'

  EXPORTING
    I_PROGRAM_NAME               = SY-REPID
*     I_INTERNAL_TABNAME           =
    I_STRUCTURE_NAME             = 'YSTRU_ALV_1122_0707'

  CHANGING
    CT_FIELDCAT                  = GIT_FIELDCAT

  EXCEPTIONS
    INCONSISTENT_INTERFACE       = 1
    PROGRAM_ERROR                = 2
    OTHERS                       = 3
    .

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

  PERFORM F_EDIT_DISPLAY.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_PF_STATUS_SET = 'F_STATUS'
      I_CALLBACK_USER_COMMAND  = 'F_COMMAND'
      I_CALLBACK_TOP_OF_PAGE   = 'F_TOP_OF_PAGE'
      I_STRUCTURE_NAME         = 'YSTRU_ALV_1122_0707'
      IS_LAYOUT                = GW_LAYOUT
      IT_FIELDCAT              = GIT_FIELDCAT
      IT_SORT                  = GIT_SORT
      I_GRID_TITLE             = TEXT-010
    TABLES
      T_OUTTAB                 = GIT_DATA
    EXCEPTIONS
      PROGRAM_ERROR            = 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_ALV_FIELDCAT2

*&---------------------------------------------------------*
*&      Form  F_EDIT_DISPLAY
*&---------------------------------------------------------*
*       FIELDCATALOG LAYOUT SORT を編集します
*----------------------------------------------------------*

FORM F_EDIT_DISPLAY .

  DATA:
    LW_CLR TYPE LVC_S_SCOL.                                 "セルの色

  GW_LAYOUT-ZEBRA = 'X'.                                    "ゼブラのような線
  GW_LAYOUT-colwidth_optimize = 'X'.                        "列の最適化
  GW_LAYOUT-box_fieldname = 'BOX'.                          "行の戦中のボタン
  GW_LAYOUT-info_fieldname = 'COLOR'.                       "行の色
  GW_LAYOUT-coltab_fieldname = 'CLR'.                       "セルの色

  GW_SORT-FIELDNAME = 'FKDAT'.                              "請求日
  GW_SORT-UP = 1.                                           "昇順
  GW_SORT-subtot = 'X'.
  APPEND GW_SORT TO GIT_SORT.
  CLEAR  GW_SORT.

  GW_SORT-FIELDNAME = 'FKIMG'.                              "請求数量
  GW_SORT-UP = 1.                                           "昇順
  APPEND GW_SORT TO GIT_SORT.
  CLEAR  GW_SORT.

  IF P_FLDC1 = 'X'.                                         "手動でFIELDCATを編集します

    PERFORM F_FIELDCAT_1.

  ELSEIF P_FLDC2 = 'X' OR P_SE11 = 'X'.                     "構造によってFIELDCAT内部テーブルを編集します

    PERFORM F_FIELDCAT_2.

  ENDIF.

  LOOP AT GIT_DATA INTO GW_DATA.

    IF GW_DATA-NETWR = 0.                                   "正味額はゼロの場合

      LW_CLR-FNAME = 'NETWR'.                               "正味額
      LW_CLR-COLOR-COL = 5.                                 "色の番号 (1-7)
      LW_CLR-COLOR-INT = 1.                                 "色が濃くなります (0,1)
      LW_CLR-COLOR-INV = 0.                                 "バックグラウンド (0,1)
      APPEND LW_CLR TO GW_DATA-CLR.
      CLEAR LW_CLR.

    ENDIF.

    MODIFY GIT_DATA FROM GW_DATA.

  ENDLOOP.

ENDFORM.                    " F_EDIT_DISPLAY

*&---------------------------------------------------------*
*&      Form  F_FIELDCAT_1
*&---------------------------------------------------------*
*       手動でFIELDCATを編集します
*----------------------------------------------------------*

FORM F_FIELDCAT_1 .

  GW_FIELDCAT-FIELDNAME = 'VKORG'.                          "売組
  GW_FIELDCAT-seltext_l = TEXT-001.
  GW_FIELDCAT-KEY = 'X'.                                    "KEYの様子で表示します
  APPEND GW_FIELDCAT TO GIT_FIELDCAT.
  CLEAR  GW_FIELDCAT.

  GW_FIELDCAT-FIELDNAME = 'FKDAT'.                          "請求日
  GW_FIELDCAT-seltext_l = TEXT-002.
  GW_FIELDCAT-KEY = 'X'.                                    "KEYの様子で表示します
  GW_FIELDCAT-JUST = 'L'.                                   "左揃えで表示します
  APPEND GW_FIELDCAT TO GIT_FIELDCAT.
  CLEAR  GW_FIELDCAT.

  GW_FIELDCAT-FIELDNAME = 'GJAHR'.                          "会計年度
  GW_FIELDCAT-seltext_l = TEXT-003.
  IF GW_DATA-GJAHR IS INITIAL.                              "会計年度はスペースの場合
    GW_FIELDCAT-EMPHASIZE = 'C300'.                         "黄色で列を表示します
  ENDIF.
  APPEND GW_FIELDCAT TO GIT_FIELDCAT.
  CLEAR  GW_FIELDCAT.

  GW_FIELDCAT-FIELDNAME = 'VBELN'.                          "請求伝票
  GW_FIELDCAT-seltext_l = TEXT-004.
  APPEND GW_FIELDCAT TO GIT_FIELDCAT.
  CLEAR  GW_FIELDCAT.

  GW_FIELDCAT-FIELDNAME = 'POSNR'.                          "請求明細
  GW_FIELDCAT-seltext_l = TEXT-005.
  APPEND GW_FIELDCAT TO GIT_FIELDCAT.
  CLEAR  GW_FIELDCAT.

  GW_FIELDCAT-FIELDNAME = 'FKIMG'.                          "請求数量
  GW_FIELDCAT-seltext_l = TEXT-006.
  GW_FIELDCAT-DO_SUM = 1.                                   "合計
  APPEND GW_FIELDCAT TO GIT_FIELDCAT.
  CLEAR  GW_FIELDCAT.

  GW_FIELDCAT-FIELDNAME = 'MEINS'.                          "基本数量単位
  GW_FIELDCAT-seltext_l = TEXT-007.
  APPEND GW_FIELDCAT TO GIT_FIELDCAT.
  CLEAR  GW_FIELDCAT.

  GW_FIELDCAT-FIELDNAME = 'NETWR'.                          "正味額
  GW_FIELDCAT-seltext_l = TEXT-008.
  GW_FIELDCAT-DO_SUM = 1.                                   "合計
  APPEND GW_FIELDCAT TO GIT_FIELDCAT.
  CLEAR  GW_FIELDCAT.

  GW_FIELDCAT-FIELDNAME = 'COMMENT1'.                       "付注
  GW_FIELDCAT-seltext_l = TEXT-015.
  GW_FIELDCAT-outputlen = 20.
  GW_FIELDCAT-EDIT = 'X'.                                   "編集できます
  APPEND GW_FIELDCAT TO GIT_FIELDCAT.
  CLEAR  GW_FIELDCAT.

  LOOP AT GIT_DATA INTO GW_DATA.

    IF GW_DATA-FKIMG >= 1000.                               "請求数量>=1000の場合

      GW_DATA-COLOR = 'C610'.                               "赤色で行を表示します
      MODIFY GIT_DATA FROM GW_DATA.

    ELSEIF GW_DATA-FKIMG >= 100.                            "請求数量>=100の場合

      GW_DATA-COLOR = 'C600'.                               "赤色で字を表示します
      MODIFY GIT_DATA FROM GW_DATA.

    ENDIF.

  ENDLOOP.

ENDFORM.                    " F_FIELDCAT_1

*&---------------------------------------------------------*
*&      Form  F_FIELDCAT_2
*&---------------------------------------------------------*
*       構造によってFIELDCAT内部テーブルを編集します
*----------------------------------------------------------*

FORM F_FIELDCAT_2 .

  LOOP AT GIT_DATA INTO GW_DATA.

    IF GW_DATA-FKIMG >= 1000.                               "請求数量>=1000の場合

      GW_DATA-COLOR = 'C610'.                               "赤色で行を表示します
      MODIFY GIT_DATA FROM GW_DATA.

    ELSEIF GW_DATA-FKIMG >= 100.                            "請求数量>=100の場合

      GW_DATA-COLOR = 'C600'.                               "赤色で字を表示します
      MODIFY GIT_DATA FROM GW_DATA.

    ENDIF.

  ENDLOOP.

  LOOP AT GIT_FIELDCAT INTO GW_FIELDCAT.

    IF GW_FIELDCAT-FIELDNAME = 'FKDAT'.                     "売組
      GW_FIELDCAT-KEY = 'X'.                                "KEYの様子で表示します

    ELSEIF GW_FIELDCAT-FIELDNAME = 'VKORG'.                 "請求日
      GW_FIELDCAT-KEY = 'X'.                                "KEYの様子で表示します

      READ TABLE GIT_DATA INTO GW_DATA
      WITH KEY GW_DATA-GJAHR.

    ELSEIF GW_FIELDCAT-FIELDNAME = 'GJAHR'                  "会計年度
       AND GW_DATA-GJAHR = SPACE.                           "会計年度はスペースの場合
      GW_FIELDCAT-EMPHASIZE = 'C300'.                       "黄色で列を表示します

    ELSEIF GW_FIELDCAT-FIELDNAME = 'FKIMG'.                 "請求数量
      GW_FIELDCAT-DO_SUM = '1'.                             "合計します

    ELSEIF GW_FIELDCAT-FIELDNAME = 'NETWR'.                 "正味額
      GW_FIELDCAT-DO_SUM = '1'.                             "合計します

    ELSEIF GW_FIELDCAT-FIELDNAME = 'COMMENT1'.              "付注
      GW_FIELDCAT-EDIT = 'X'.                               "編集できます

    ENDIF.

    MODIFY GIT_FIELDCAT FROM GW_FIELDCAT.                   "FIRLDCAT内部テーブルを変更します

  ENDLOOP.

ENDFORM.                    " F_FIELDCAT_2

*&---------------------------------------------------------*
*&      Form  F_STATUS
*&---------------------------------------------------------*
*       ALV STATUS を編集します
*----------------------------------------------------------*

FORM F_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.

  SET PF-STATUS 'STANDARD_34114' EXCLUDING RT_EXTAB.        "機能ボタン

ENDFORM.                    "F_STATUS

*&---------------------------------------------------------*
*&      Form  F_COMMAND
*&---------------------------------------------------------*
*       ALV USER-COMMAND を編集します
*----------------------------------------------------------*

FORM F_COMMAND USING R_UCOMM LIKE SY-UCOMM
      RS_SELFIELD TYPE SLIS_SELFIELD
      .                                                     "更新した後のデータを内部テーブルに更新します

  DATA: LV_GRID  TYPE REF TO CL_GUI_ALV_GRID,
        LV_VALID TYPE C.

*  READ TABLE LIT_DOWNLOAD INDEX rs_selfield-tabindex.      "変更した内容を内部テーブルに更新します

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LV_GRID.

  CALL METHOD LV_GRID->CHECK_CHANGED_DATA
    IMPORTING
      E_VALID = LV_VALID.

  CASE R_UCOMM.                                             "ボタンの USER COMMAND

    WHEN 'SHDB'.
      MESSAGE S003(Y_MESSAGE_34114) WITH 'SHDB'.            "SHDBを呼び出します

    WHEN 'BAPI'.
      MESSAGE S003(Y_MESSAGE_34114) WITH 'BAPI'.            "BAPIを呼び出します

    WHEN 'BDC'.
      MESSAGE S003(Y_MESSAGE_34114) WITH 'BDC'.             "BDCを呼び出します

    WHEN '&IC1'.                                            "ダブルクリック事件

      R_UCOMM = '&ETA'.                                     "行の詳しい情報

*      MESSAGE S004(Y_MESSAGE_34114)                        "第n行をクリックしました。
*      WITH RS_SELFIELD-TABINDEX.                           "行数

      READ TABLE GIT_DATA INTO GW_DATA                      "行のあるFIELD情報が必要の場合
      INDEX RS_SELFIELD-TABINDEX.                           "行数

      IF SY-SUBRC = 0.
        MESSAGE S004(Y_MESSAGE_34114)                       "第n行をクリックしました。
           WITH RS_SELFIELD-TABINDEX                        "行数
                GW_DATA-FKDAT                               "請求日
                TEXT-011                                    "「数量:」
                GW_DATA-FKIMG                               "請求数量
                .
      ENDIF.

    WHEN 'DOWNLOAD'.

      PERFORM F_DOWNLOAD.                                   "ダウンロード

  ENDCASE.

ENDFORM.                    "F_COMMAND

*&---------------------------------------------------------*
*&      Form  F_TOP_OF_PAGE
*&---------------------------------------------------------*
*       TOP_OF_PAGE を編集します
*----------------------------------------------------------*
FORM F_TOP_OF_PAGE .

  DATA:
    LIT_HEADER   TYPE slis_t_listheader,                    "HEADER用内部テーブル
    LW_HEADER    TYPE slis_listheader.                      "HEADER用ワークエリア

  CLEAR LIT_HEADER.

  LW_HEADER-TYP = 'H'.                                      "ヘッダー
  LW_HEADER-INFO = TEXT-012.                                "ヘッダー
  APPEND LW_HEADER TO LIT_HEADER.
  CLEAR  LW_HEADER.

  LW_HEADER-TYP = 'S'.                                      "セレクション
  LW_HEADER-INFO = TEXT-013.                                "セレクション
  APPEND LW_HEADER TO LIT_HEADER.
  CLEAR  LW_HEADER.

  LW_HEADER-TYP = 'A'.                                      "アクション
  LW_HEADER-INFO = TEXT-014.                                "アクション
  APPEND LW_HEADER TO LIT_HEADER.
  CLEAR  LW_HEADER.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'

  EXPORTING
    IT_LIST_COMMENTARY       = LIT_HEADER
*   I_LOGO                   =
*   I_END_OF_LIST_GRID       =
*   I_ALV_FORM               =
    .

ENDFORM.                    " F_TOP_OF_PAGE
*&---------------------------------------------------------*
*&      Form  F_DOWNLOAD
*&---------------------------------------------------------*
*       ダウンロード
*----------------------------------------------------------*
FORM F_DOWNLOAD .

  DATA:
    LIT_DOWNLOAD TYPE TABLE OF YSTRU_ALV_1123_0712,           "ダウンロード用内部テーブル
    LW_DOWNLOAD  TYPE YSTRU_ALV_1123_0712.                    "ダウンロード用ワークエリア

* DATA:
*      LV_FILE TYPE STRING.                                 "ファイルパスと名
*
* LV_FILE = P_FILE_U.                                       "C:\Users\handhand\Desktop\DL\DL.TXT

  DATA:
    LV_FILENAME TYPE STRING,                                "ファイル名
    LV_PATH     TYPE STRING,                                "ファイルパス
    LV_FULLPATH TYPE STRING.                                "ファイルパスと名(POPUP)

  LOOP AT GIT_DATA INTO GW_DATA WHERE BOX = 'X'.            "行を選択られた場合

    MOVE-CORRESPONDING GW_DATA TO LW_DOWNLOAD.              "データを移します
    WRITE GW_DATA-FKDAT TO LW_DOWNLOAD-FKDAT.               "出力様式を変更します
    APPEND LW_DOWNLOAD TO LIT_DOWNLOAD.
    CLEAR LW_DOWNLOAD.

  ENDLOOP.

  LW_DOWNLOAD-VKORG    = TEXT-016.                          "販売組織
  LW_DOWNLOAD-FKDAT    = TEXT-017.                          "請求日
  LW_DOWNLOAD-GJAHR    = TEXT-018.                          "会計年度
  LW_DOWNLOAD-VBELN    = TEXT-019.                          "販売伝票番号
  LW_DOWNLOAD-POSNR    = TEXT-020.                          "明細番号
  LW_DOWNLOAD-FKIMG    = TEXT-021.                          "請求済数量
  LW_DOWNLOAD-MEINS    = TEXT-022.                          "基本数量単位
  LW_DOWNLOAD-NETWR    = TEXT-023.                          "正味額
  LW_DOWNLOAD-COMMENT1 = TEXT-024.                          "付注テキスト

  INSERT LW_DOWNLOAD INTO LIT_DOWNLOAD INDEX 1.             "ヘッダーを作ります

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG    "ポップアップ
    EXPORTING
      WINDOW_TITLE         = 'ポップアップタイトル'          "標題
      DEFAULT_EXTENSION    = 'TXT'                          "黙認格式
      DEFAULT_FILE_NAME    = 'DOWNLOAD'                     "黙認名
*     WITH_ENCODING        =                                "
*     FILE_FILTER          =                                "
      INITIAL_DIRECTORY    = 'C:\Users\handhand\Desktop\DL' "黙認パス
*     PROMPT_ON_OVERWRITE  = 'X'                            "
    CHANGING
      FILENAME             = LV_FILENAME                    "ファイル名
      PATH                 = LV_PATH                        "ファイルパス
      FULLPATH             = LV_FULLPATH                    "ファイルパスと名(POPUP)
*      USER_ACTION          =
*      FILE_ENCODING        =
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4
      .
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  CALL FUNCTION 'GUI_DOWNLOAD'                              "ダウンロード
    EXPORTING
*     FILENAME                        = LV_FILE             "ファイルパスと名(選択画面)
      FILENAME                        = LV_FULLPATH         "ファイルパスと名(POPUP)
      FILETYPE                        = 'ASC'               "ファイルタイプ (ASCテキスト/BINバイト)
*     APPEND                          = 'X'                 "追加します (X/SPACE)
      WRITE_FIELD_SEPARATOR           = 'X'                 "TABでフィールド間で分割します
      TRUNC_TRAILING_BLANKS           = 'X'                 "フィールドの後ろのスペースを消します
*     CODEPAGE                        = ' '                 "言語の種類によって番号は違います
*     IMPORTING
*     FILELENGTH                      =                     "フィールドの長さ
    TABLES
      DATA_TAB                        = LIT_DOWNLOAD        "出力するための内部テーブル
*     FIELDNAMES                      =                     "フィールド名
    EXCEPTIONS
      FILE_WRITE_ERROR                = 1
      NO_BATCH                        = 2
      GUI_REFUSE_FILETRANSFER         = 3
      INVALID_TYPE                    = 4
      NO_AUTHORITY                    = 5
      UNKNOWN_ERROR                   = 6
      HEADER_NOT_ALLOWED              = 7
      SEPARATOR_NOT_ALLOWED           = 8
      FILESIZE_NOT_ALLOWED            = 9
      HEADER_TOO_LONG                 = 10
      DP_ERROR_CREATE                 = 11
      DP_ERROR_SEND                   = 12
      DP_ERROR_WRITE                  = 13
      UNKNOWN_DP_ERROR                = 14
      ACCESS_DENIED                   = 15
      DP_OUT_OF_MEMORY                = 16
      DISK_FULL                       = 17
      DP_TIMEOUT                      = 18
      FILE_NOT_FOUND                  = 19
      DATAPROVIDER_EXCEPTION          = 20
      CONTROL_FLUSH_ERROR             = 21
      OTHERS                          = 22
      .

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

  REFRESH LIT_DOWNLOAD.

ENDFORM.                    " F_DOWNLOAD

*&---------------------------------------------------------*
*&      Form  F_UPLOAD_TXT
*&---------------------------------------------------------*
*       TEXTでアップロードします
*----------------------------------------------------------*
FORM F_UPLOAD_TXT .

  DATA:
    LIT_FILE   TYPE FILETABLE,                              "パス用内部テーブル
    LW_FILE    TYPE FILE_TABLE,                             "パス用ワークエリア
    LV_PATH    TYPE STRING,                                 "ファイルパス
    LV_RC      TYPE I.                                      "RC

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG    "アップロードパスを取得します
    CHANGING
      FILE_TABLE              = LIT_FILE                    "ファイルパスと名
      RC                      = LV_RC                       "RC
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      NOT_SUPPORTED_BY_GUI    = 4
      OTHERS                  = 5
      .
  IF SY-SUBRC <> 0.
*        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*                   WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ELSE.

    READ TABLE LIT_FILE INTO LW_FILE INDEX 1.               "パスを取得します

    IF SY-SUBRC = 0.
      LV_PATH = LW_FILE-FILENAME.                           "ファイルパス
    ENDIF.

  ENDIF.

  CALL FUNCTION 'GUI_UPLOAD'                                "アップロードします
    EXPORTING
      FILENAME                      = LV_PATH               "ファイルパス
      FILETYPE                      = 'ASC'
*     HAS_FIELD_SEPARATOR           = ' '
*     HEADER_LENGTH                 = 0
*     READ_BY_LINE                  = 'X'
*     DAT_MODE                      = ' '
*     CODEPAGE                      = ' '
*     IGNORE_CERR                   = ABAP_TRUE
*     REPLACEMENT                   = '#'
*     CHECK_BOM                     = ' '
*     VIRUS_SCAN_PROFILE            =
*     NO_AUTH_CHECK                 = ' '
*   IMPORTING
*     FILELENGTH                    =
*     HEADER                        =
    TABLES
      DATA_TAB                      = GIT_ULDATA            "出力用内部テーブル
    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 S009(Y_MESSAGE_34114) WITH TEXT-027             "内部テーブルの中にデータがありません
    DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.

  ELSE.

    PERFORM F_UPLOAD_DATA_EDIT.

    IF GIT_UL_DBT IS NOT INITIAL.

      PERFORM F_LOCK.                                       "ロックします

      INSERT YALV_1123 FROM TABLE GIT_UL_DBT                "DATA BASE TABLEを更新します
      ACCEPTING DUPLICATE KEYS.

      IF SY-SUBRC = 0.
        COMMIT WORK.                                        "保存します
        MESSAGE S005(Y_MESSAGE_34114).                      "成功しました
      ELSE.
        ROLLBACK WORK.                                      "ロールバックします
        MESSAGE S006(Y_MESSAGE_34114) WITH TEXT-029         "アップロード失敗しました
        DISPLAY LIKE 'E'.
        LEAVE LIST-PROCESSING.
      ENDIF.

      PERFORM F_UNLOCK.                                     "ロックをリリースします

    ELSE.

      MESSAGE S009(Y_MESSAGE_34114) WITH TEXT-028           "内部テーブルの中にデータがありません
      DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.

    ENDIF.

  ENDIF.

  CLEAR: GW_ULDATA,
         GW_UL_DBT.

  PERFORM F_UPLOAD_DATA_OUTPUT.

ENDFORM.                    "F_UPLOAD_TXT

*&---------------------------------------------------------*
*&      Form  F_UPLOAD_XLS
*&---------------------------------------------------------*
*       XLSでアップロードします
*----------------------------------------------------------*
FORM F_UPLOAD_XLS .

  DATA:
    LIT_FILE   TYPE FILETABLE,                              "パス用内部テーブル
    LW_FILE    TYPE FILE_TABLE,                             "パス用ワークエリア
    LV_PATH    LIKE RLGRAP-FILENAME,
    LV_RC      TYPE I,                                      "RC
    LIT_RAW    TYPE TRUXS_T_TEXT_DATA.                      "RAW

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG    "アップロードパスを取得します
    CHANGING
      FILE_TABLE              = LIT_FILE                    "ファイルパスと名
      RC                      = LV_RC                       "RC
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      NOT_SUPPORTED_BY_GUI    = 4
      OTHERS                  = 5
      .
  IF SY-SUBRC <> 0.
*        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*                   WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ELSE.

    READ TABLE LIT_FILE INTO LW_FILE INDEX 1.               "パスを取得します

    IF SY-SUBRC = 0.
      LV_PATH = LW_FILE-FILENAME.                           "ファイルパス
    ENDIF.

  ENDIF.

  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'                   "EXCELのみ使えるアップロード汎用モジュール
    EXPORTING
      I_TAB_RAW_DATA             = LIT_RAW                  "RAW
      I_FILENAME                 = LV_PATH                  "ファイルパスと名
    TABLES
      I_TAB_CONVERTED_DATA       = GIT_ULDATA               "出力用内部テーブル
    EXCEPTIONS
      CONVERSION_FAILED          = 1
      OTHERS                     = 2
            .

  IF SY-SUBRC <> 0.

    MESSAGE S009(Y_MESSAGE_34114) WITH TEXT-027             "内部テーブルの中にデータがありません
    DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.

  ELSE.

    PERFORM F_UPLOAD_DATA_EDIT.

    IF GIT_UL_DBT IS NOT INITIAL.

      PERFORM F_LOCK.                                       "ロックします

      INSERT YALV_1123 FROM TABLE GIT_UL_DBT                "DATA BASE TABLEを更新します
      ACCEPTING DUPLICATE KEYS.

      IF SY-SUBRC = 0.
        COMMIT WORK.                                        "保存します
        MESSAGE S005(Y_MESSAGE_34114).                      "成功しました
      ELSE.
        ROLLBACK WORK.                                      "ロールバックします
        MESSAGE S006(Y_MESSAGE_34114) WITH TEXT-029         "アップロード失敗しました
        DISPLAY LIKE 'E'.
        LEAVE LIST-PROCESSING.
      ENDIF.

      PERFORM F_UNLOCK.                                     "ロックをリリースします

    ELSE.

      MESSAGE S009(Y_MESSAGE_34114) WITH TEXT-028           "内部テーブルの中にデータがありません
      DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.

    ENDIF.

  ENDIF.

  CLEAR: GW_ULDATA,
         GW_UL_DBT.

  PERFORM F_UPLOAD_DATA_OUTPUT.

ENDFORM.                    " F_UPLOAD_XLS

*&---------------------------------------------------------*
*&      Form  F_UPLOAD_SERVER
*&---------------------------------------------------------*
*       サーバ  にアップロードします
*----------------------------------------------------------*
FORM F_UPLOAD_SERVER .

  CONSTANTS
    CNS_TAB TYPE ABAP_CR_LF
    VALUE CL_ABAP_CHAR_UTILITIES=>CR_LF.                    "タブ

  DATA:
    LV_FILE    TYPE STRING.                                 "ファイルパスと名

  CALL FUNCTION 'GUI_UPLOAD'                                "アップロードします
    EXPORTING
      FILENAME                      = P_FIL_L               "ファイルパス
      FILETYPE                      = 'ASC'
*     HAS_FIELD_SEPARATOR           = ' '
*     HEADER_LENGTH                 = 0
*     READ_BY_LINE                  = 'X'
*     DAT_MODE                      = ' '
*     CODEPAGE                      = ' '
*     IGNORE_CERR                   = ABAP_TRUE
*     REPLACEMENT                   = '#'
*     CHECK_BOM                     = ' '
*     VIRUS_SCAN_PROFILE            =
*     NO_AUTH_CHECK                 = ' '
*   IMPORTING
*     FILELENGTH                    =
*     HEADER                        =
    TABLES
      DATA_TAB                      = GIT_ULDATA            "出力用内部テーブル
    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.

*  CALL FUNCTION 'FILE_GET_NAME_USING_PATH'
*    EXPORTING
**     CLIENT                           = SY-MANDT
*      LOGICAL_PATH                     = P_FILE             "ファイルパス
**     OPERATING_SYSTEM                 = SY-OPSYS
**     PARAMETER_1                      = ' '
**     PARAMETER_2                      = ' '
**     PARAMETER_3                      = ' '
**     USE_BUFFER                       = ' '
*      FILE_NAME                        = P_NAME             "ファイル名
**     USE_PRESENTATION_SERVER          = ' '
**     ELEMINATE_BLANKS                 = 'X'
*    IMPORTING
*      FILE_NAME_WITH_PATH              = LV_FILE            "ファイルパスと名
*    EXCEPTIONS
*      PATH_NOT_FOUND                   = 1
*      MISSING_PARAMETER                = 2
*      OPERATING_SYSTEM_NOT_FOUND       = 3
*      FILE_SYSTEM_NOT_FOUND            = 4
*      OTHERS                           = 5
*            .
*  IF SY-SUBRC <> 0.
** MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
**         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*  ENDIF.

  OPEN DATASET LV_FILE                                      "ファイルパスと名
  FOR OUTPUT                                                "FOR OUTPUT / FOR APPENDING
  IN TEXT MODE ENCODING DEFAULT                             "IN TEXT MODE / IN BINARY MODE
  .                                                         "ユニコードプログラム用 ENCODING DEFAULT

  LOOP AT GIT_ULDATA INTO GW_ULDATA.

    CATCH SYSTEM-EXCEPTIONS FILE_ACCESS_ERRORS = 9.
      TRANSFER GW_ULDATA TO LV_FILE.
    ENDCATCH.

    CASE SY-SUBRC.
      WHEN 0.
        MESSAGE S005(Y_MESSAGE_34114).                      "成功しました
      WHEN 9.
        MESSAGE S006(Y_MESSAGE_34114)                       "書き込むことが失敗しました
        WITH TEXT-030 DISPLAY LIKE 'E'.
        LEAVE LIST-PROCESSING.
      WHEN OTHERS.
        MESSAGE S010(Y_MESSAGE_34114)                       "ほかのエラーが発生しました
        WITH TEXT-031 DISPLAY LIKE 'E'.
        LEAVE LIST-PROCESSING.
    ENDCASE.

  ENDLOOP.

  CATCH SYSTEM-EXCEPTIONS FILE_ACCESS_ERRORS = 9.
    CLOSE DATASET LV_FILE.
  ENDCATCH.

  CASE SY-SUBRC.
    WHEN 0.
      MESSAGE S005(Y_MESSAGE_34114).                        "成功しました
    WHEN 9.
      MESSAGE S006(Y_MESSAGE_34114)                         "クローズすることが失敗しました
      WITH TEXT-032 DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    WHEN OTHERS.
      MESSAGE S010(Y_MESSAGE_34114)                         "ほかのエラーが発生しました
      WITH TEXT-031 DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
  ENDCASE.

  PERFORM F_UPLOAD_DATA_EDIT.
  PERFORM F_UPLOAD_DATA_OUTPUT.

ENDFORM.                    " F_UPLOAD_SERVER

*&---------------------------------------------------------------------*
*&      Form  F_F4HELP_FOR_PATH
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM F_F4HELP_FOR_PATH .

  DATA:
    LIT_FILE   TYPE FILETABLE,                              "パス用内部テーブル
    LW_FILE    TYPE FILE_TABLE,                             "パス用ワークエリア
    LV_RC      TYPE I.                                      "RC

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG    "アップロードパスを取得します
    CHANGING
      FILE_TABLE              = LIT_FILE                    "ファイルパスと名
      RC                      = LV_RC                       "RC
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      NOT_SUPPORTED_BY_GUI    = 4
      OTHERS                  = 5
      .
  IF SY-SUBRC <> 0.
*        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*                   WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ELSE.

    READ TABLE LIT_FILE INTO LW_FILE INDEX 1.               "パスを取得します

    IF SY-SUBRC = 0.
      P_FIL_L = LW_FILE-FILENAME.                           "ファイルパス
    ENDIF.

  ENDIF.

ENDFORM.                    " F_F4HELP_FOR_PATH

*&---------------------------------------------------------*
*&      Form  F_UPLOAD_DATA_EDIT
*&---------------------------------------------------------*
*       text
*----------------------------------------------------------*
FORM F_UPLOAD_DATA_EDIT .

  DATA:
    LV_VKORG   TYPE STRING,                                 "売組
    LV_FKDAT   TYPE STRING,                                 "請求索引および印刷に対します請求日
    LV_GJAHR   TYPE STRING,                                 "会計年度
    LV_VBELN   TYPE STRING,                                 "請求伝票
    LV_POSNR   TYPE STRING,                                 "請求明細
    LV_FKIMG   TYPE STRING,                                 "在庫単位による請求数量
    LV_FKIMG_2 TYPE YALV_1123-FKIMG,                        "データタイプを変更します
    LV_MEINS   TYPE STRING,                                 "基本数量単位
    LV_NETWR   TYPE STRING,                                 "伝票通貨での請求明細の正味額
    LV_NETWR_2 TYPE YALV_1123-NETWR,                        "データタイプを変更します
    LV_COMMENT TYPE STRING,                                 "付注
    LV_FKDAT_Y TYPE STRING,                                 "請求日 YEAR
    LV_FKDAT_M TYPE STRING,                                 "請求日 MONTH
    LV_FKDAT_D TYPE STRING,                                 "請求日 DAY
    LV_FKDAT_2 TYPE STRING.                                 "請求日 DATABASETABLE

  DELETE GIT_ULDATA INDEX 1.                                "ヘッダーを削除します

  LOOP AT GIT_ULDATA INTO GW_ULDATA.                        "目標内部テーブル

    IF P_TXT = 'X'.

      SPLIT GW_ULDATA
      AT cl_abap_char_utilities=>HORIZONTAL_TAB
      INTO LV_VKORG                                         "売組
           LV_FKDAT                                         "請求索引および印刷に対します請求日
           LV_GJAHR                                         "会計年度
           LV_VBELN                                         "請求伝票
           LV_POSNR                                         "請求明細
           LV_FKIMG                                         "在庫単位による請求数量
           LV_MEINS                                         "基本数量単位
           LV_NETWR                                         "伝票通貨での請求明細の正味額
           LV_COMMENT.                                      "付注

      CONDENSE LV_VKORG.                                    "売組
      CONDENSE LV_FKDAT.                                    "請求索引および印刷に対します請求日
      CONDENSE LV_GJAHR.                                    "会計年度
      CONDENSE LV_VBELN.                                    "請求伝票
      CONDENSE LV_POSNR.                                    "請求明細
      CONDENSE LV_FKIMG.                                    "在庫単位による請求数量
      CONDENSE LV_MEINS.                                    "基本数量単位
      CONDENSE LV_NETWR.                                    "伝票通貨での請求明細の正味額
      CONDENSE LV_COMMENT.                                  "付注

    ELSEIF P_XLS = 'X'.

      LV_VKORG   =  GW_ULDATA-VKORG.
      LV_FKDAT   =  GW_ULDATA-FKDAT.
      LV_GJAHR   =  GW_ULDATA-GJAHR.
      LV_VBELN   =  GW_ULDATA-VBELN.
      LV_POSNR   =  GW_ULDATA-POSNR.
      LV_FKIMG   =  GW_ULDATA-FKIMG.
      LV_MEINS   =  GW_ULDATA-MEINS.
      LV_NETWR   =  GW_ULDATA-NETWR.
      LV_COMMENT =  GW_ULDATA-COMMENT1.

    ENDIF.

    SPLIT LV_FKDAT AT '.'                                   "2017.05.01
     INTO LV_FKDAT_Y                                        "2017
          LV_FKDAT_M                                        "05
          LV_FKDAT_D.                                       "01

    CONCATENATE LV_FKDAT_Y                                  "2017
                LV_FKDAT_M                                  "05
                LV_FKDAT_D                                  "01
           INTO LV_FKDAT_2.                                 "20170501

    LV_FKIMG_2 = LV_FKIMG.
    LV_NETWR_2 = LV_NETWR.

    GW_UL_DBT-VKORG = LV_VKORG.                             "売組
    GW_UL_DBT-FKDAT = LV_FKDAT_2.                           "請求索引および印刷に対します請求日
    GW_UL_DBT-GJAHR = LV_GJAHR.                             "会計年度
    GW_UL_DBT-VBELN = LV_VBELN.                             "請求伝票
    GW_UL_DBT-POSNR = LV_POSNR.                             "請求明細
    GW_UL_DBT-FKIMG = LV_FKIMG_2.                           "在庫単位による請求数量
    GW_UL_DBT-MEINS = LV_MEINS.                             "基本数量単位
    GW_UL_DBT-NETWR = LV_NETWR_2.                           "伝票通貨での請求明細の正味額
    GW_UL_DBT-COMMENT1 = LV_COMMENT.                        "付注
    APPEND GW_UL_DBT TO GIT_UL_DBT.

  ENDLOOP.

ENDFORM.                    " F_UPLOAD_DATA_EDIT

*&---------------------------------------------------------*
*&      Form  F_UPLOAD_DATA_OUTPUT
*&---------------------------------------------------------*
*       text
*----------------------------------------------------------*
FORM F_UPLOAD_DATA_OUTPUT .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'                    "出力します
    EXPORTING
      I_STRUCTURE_NAME = 'YSTRU_ALV_1122_0707'
    TABLES
      T_OUTTAB         = GIT_UL_DBT                         "更新したばかりの目標内部テーブル
    EXCEPTIONS
      PROGRAM_ERROR    = 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_UPLOAD_DATA_OUTPUT

*&---------------------------------------------------------*
*&      Form  F_LOCK
*&---------------------------------------------------------*
*       データベーステーブルをロックします
*----------------------------------------------------------*
FORM F_LOCK .

  CALL FUNCTION 'ENQUEUE_EYALV_1123'
  EXPORTING
    MODE_YALV_1123       = 'E'
    MANDT                = SY-MANDT
*     VBELN                =
*     X_VBELN              = ' '
*     _SCOPE               = '2'
*     _WAIT                = ' '
*     _COLLECT             = ' '
  EXCEPTIONS
    FOREIGN_LOCK         = 1
    SYSTEM_FAILURE       = 2
    OTHERS               = 3
    .
  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_LOCK

*&---------------------------------------------------------*
*&      Form  F_UNLOCK
*&---------------------------------------------------------*
*       データベーステーブルのロックをリリースします
*----------------------------------------------------------*
FORM F_UNLOCK .

  CALL FUNCTION 'DEQUEUE_EYALV_1123'
  EXPORTING
    MODE_YALV_1123       = 'E'
    MANDT                = SY-MANDT
*     VBELN                =
*     X_VBELN              = ' '
*     _SCOPE               = '3'
*     _SYNCHRON            = ' '
*     _COLLECT             = ' '
    .

ENDFORM.                    " F_UNLOCK``
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值