ABAP EXCEL批导和查看自建表样板

发布时间 2023-08-15 09:07:35作者: 蛀牙首领

结果:

 

 内文:

 

 源代码:

ZHMRFI017:

*&---------------------------------------------------------------------*
*& Report  ZHMRFI017
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZHMRFI017.
*---------------------------------------------------------------------*
* Program ID  :  
* Program Name: ZHMRSD040A
* T-CODE      : ZHMRSD040A
* Program Type:   E
* Description :
*---------------------------------------------------------------------*
* Created By   : 
*---------------------------------------------------------------------*
* Edit Log  :
*  Version       Date          Author     Remark
*  <20230802> <YYYY/MM/DD>  <***>   <发票和金税发票的对应关系是多对一,但是升级后,只返回一对一的关系,剩下的需手动导入>
INCLUDE ZHMRFI017_HEAD.
INCLUDE ZHMRFI017_SCREEN.
INCLUDE ZHMRFI017_FORM.

INITIALIZATION.
  PERFORM FRM_INI_SCREEN.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE2.
* 选择文件搜索帮助
  PERFORM FRM_SET_FILE_F4 USING P_FILE2 CHANGING P_FILE2.

AT SELECTION-SCREEN.
  CASE SSCRFIELDS-UCOMM.
    WHEN 'FC01'.
      PERFORM FRM_DOWN_EXCEL.
    WHEN OTHERS.
  ENDCASE.
*  PERFORM FRM_SCREEN_OUTPUT.

AT SELECTION-SCREEN OUTPUT.
  PERFORM FRM_SCREEN_OUTPUT.
*AT SELECTION-SCREEN in.

START-OF-SELECTION.
  PERFORM FRM_CHECK_AUTHORITY.
  IF LV_CHECKF EQ 'X'.
    MESSAGE LV_MSG TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

  IF R0 EQ 'X'.
    IF P_FILE2 IS INITIAL.

      MESSAGE '请输入文件名' TYPE 'S' DISPLAY LIKE 'E'.
      RETURN.
    ENDIF.
    PERFORM FRM_GET_DATA. "动态创建内表 <dyn_table>,并生成lt_alv_cat
    PERFORM FRM_FILE_DATA2.
    PERFORM FRM_CHECK_DATA.
  ENDIF.
  IF R1 EQ 'X'.
    PERFORM FRM_GET_DATA. "动态创建内表 <dyn_table>,并生成lt_alv_cat
    PERFORM FRM_GET_DATA2. "从表  获取数据
  ENDIF.
*  IF r2 EQ 'X'.
**    PERFORM frm_get_data. "动态创建内表 <dyn_table> ,并生成lt_alv_cat
*    PERFORM frm_del_data. "清空规则表
*  ENDIF.

END-OF-SELECTION.
*  IF r2 NE 'X'.
  PERFORM F_DISPLAY_DATA.
*  ENDIF.
View Code

ZHMRFI017_HEAD:

*&---------------------------------------------------------------------*
*&  INCLUDE           ZHMRFI017_HEAD
*&---------------------------------------------------------------------*

TABLES:SSCRFIELDS,ZSDTTAX02,VBRK.
TYPE-POOLS: SLIS,OLE2.

DATA: d_ref      TYPE REF TO data,
      d_ref2     TYPE REF TO data,
      lt_alv_cat TYPE TABLE OF lvc_s_fcat,
      ls_alv_cat LIKE LINE OF lt_alv_cat.

DATA: lt_table LIKE TABLE OF dntab.
DATA: ls_table TYPE dntab.

DATA: dyn_table TYPE REF TO data.
DATA: dyn_wa TYPE REF TO data.
FIELD-SYMBOLS :<dyn_table> TYPE table,
               <dyn_wa>    TYPE any,
               <dyn_field> TYPE any,
               <fs_str>    TYPE any.


DATA: dyn_table2 TYPE REF TO data.
DATA: dyn_wa2 TYPE REF TO data.


FIELD-SYMBOLS :<dyn_table2> TYPE table,
               <dyn_wa2>    TYPE any,
               <dyn_field2> TYPE any,
               <fs_str2>    TYPE any.
DATA: go_excel    TYPE ole2_object,
      go_workbook TYPE ole2_object,
      go_sheet    TYPE ole2_object,
      map         TYPE ole2_object.
DATA: gs_layout   TYPE lvc_s_layo,
      gt_fieldcat TYPE lvc_t_fcat.

TYPES: BEGIN OF sy_output.
    INCLUDE STRUCTURE ZFIS017.
    include structure ZSDTTAX02.
TYPES: zcolor(4),
       zcolor2   TYPE char200, "存储导出EXCEL的行数,列数,颜色。 行.列.颜色;行.列.颜色;
       cellcolor TYPE lvc_t_scol,
       ZMSG      TYPE BAPI_MSG,
       ZSEL      TYPE CHAR1,
       slbox,
       END OF sy_output.

DATA: gt_output TYPE TABLE OF sy_output,
      gs_output TYPE sy_output.
FIELD-SYMBOLS: <FS_OUTPUT> TYPE SY_OUTPUT.
DATA: lv_checkf TYPE char1,
      lv_msg TYPE bapi_msg.
View Code

ZHMRFI017_SCREEN:

*&---------------------------------------------------------------------*
*&  INCLUDE           ZHMRFI017_SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN: BEGIN OF BLOCK B01 WITH FRAME TITLE TEXT-001.
*PARAMETERS: p_name TYPE dd03l-tabname OBLIGATORY.
PARAMETERS: P_FILE2 TYPE STRING MODIF ID M2,
            P_VKORG TYPE VBRK-VKORG MODIF ID M1 DEFAULT '5100'.
SELECT-OPTIONS: S_VBELN FOR ZSDTTAX02-VBELN MODIF ID M1,
                S_ZBILL FOR ZSDTTAX02-ZBILLING MODIF ID M1,
                S_FKDAT FOR VBRK-FKDAT MODIF ID M1,
                S_ZDATE FOR ZSDTTAX02-ZBILLDATE MODIF ID M1,
                S_KUNRG FOR VBRK-KUNRG MODIF ID M1.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_txt1 TYPE char10 DEFAULT '使用说明:' MODIF ID m4.
SELECTION-SCREEN COMMENT (30) TEXT-101 MODIF ID M4.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_txt2 TYPE char5 DEFAULT '' MODIF ID m4.
SELECTION-SCREEN COMMENT (60) TEXT-102 MODIF ID M4.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_txt3 TYPE char5 DEFAULT '' MODIF ID m4.
SELECTION-SCREEN COMMENT (60) TEXT-103 MODIF ID M4.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_txt4 TYPE char5 DEFAULT '' MODIF ID m4.
SELECTION-SCREEN COMMENT (60) TEXT-104 MODIF ID M4.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_txt5 TYPE char5 DEFAULT '' MODIF ID m4.
SELECTION-SCREEN COMMENT (60) TEXT-105 MODIF ID M4.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: FUNCTION KEY 1.
SELECTION-SCREEN: END OF BLOCK B01.

SELECTION-SCREEN: BEGIN OF BLOCK B02 WITH FRAME TITLE TEXT-002.

PARAMETERS: R0      RADIOBUTTON GROUP G1 USER-COMMAND U1,
            R1      RADIOBUTTON GROUP G1.

SELECTION-SCREEN: END OF BLOCK B02.
View Code

ZHMRFI017_FORM:

*&---------------------------------------------------------------------*
*&  INCLUDE           ZHMRFI017_FORM

*&---------------------------------------------------------------------*
*& FORM FRM_SET_FILE_F4
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*      -->P_P_FILE2  TEXT
*      <--P_P_FILE2  TEXT
*&---------------------------------------------------------------------*
FORM FRM_SET_FILE_F4  USING I_FILE CHANGING I_FILE2.
* 局部变量-文件名定义
  DATA L_FILENAME TYPE RLGRAP-FILENAME.
* 选择文件搜索帮助
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      DEF_PATH         = I_FILE
      MASK             = ',*.XLSX,*.XLSX,*.XLS,*.XLS.'
      MODE             = '0'
      TITLE            = TEXT-002
    IMPORTING
      FILENAME         = L_FILENAME
    EXCEPTIONS
      INV_WINSYS       = 1
      NO_BATCH         = 2
      SELECTION_CANCEL = 3
      SELECTION_ERROR  = 4
      OTHERS           = 5.
* 如果选择了文件
  IF SY-SUBRC = 0 AND L_FILENAME IS NOT INITIAL.
    I_FILE2 = L_FILENAME.
  ENDIF.

ENDFORM.                    "frm_set_file_f4
*&---------------------------------------------------------------------*
*&      Form  frm_down_excel
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM FRM_DOWN_EXCEL .
  DATA: LV_SELECTED_FOLDER TYPE STRING,
        LV_FULLPATH        TYPE RLGRAP-FILENAME.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE
    CHANGING
      SELECTED_FOLDER      = LV_SELECTED_FOLDER
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.
  IF SY-SUBRC <> 0.
  ENDIF.

  CONCATENATE LV_SELECTED_FOLDER '\' 'ZHMRFI017導入模板' '.XLSX' INTO LV_FULLPATH.
*  LV_FULLPATH = LV_SELECTED_FOLDER && P_NAME && '.XLS'.

  SELECT COUNT(*) FROM DD03L WHERE TABNAME EQ 'ZSDTTAX02'.
  IF SY-SUBRC NE 0.
    MESSAGE '该表不存在' TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

*取出表结构的字段目录
  CALL FUNCTION 'NAMETAB_GET'
    EXPORTING
      LANGU          = SY-LANGU
      TABNAME        = 'ZSDTTAX02'
    TABLES
      NAMETAB        = LT_TABLE
    EXCEPTIONS
      NO_TEXTS_FOUND = 1.
*根据取出的字段目录生成参考字段目录
  CLEAR LT_ALV_CAT.
  LOOP AT LT_TABLE INTO LS_TABLE.
    IF LS_TABLE-FIELDNAME NE 'MANDT'.
      LS_ALV_CAT-FIELDNAME = LS_TABLE-FIELDNAME.
      LS_ALV_CAT-REF_TABLE = 'ZSDTTAX02'.
      LS_ALV_CAT-REF_FIELD = LS_TABLE-FIELDNAME.
      LS_ALV_CAT-SELTEXT = LS_TABLE-FIELDTEXT.
      APPEND LS_ALV_CAT TO LT_ALV_CAT.
    ENDIF.
    CLEAR LS_ALV_CAT.
  ENDLOOP.

*内表创建

  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      IT_FIELDCATALOG = LT_ALV_CAT
    IMPORTING
      EP_TABLE        = D_REF2.
*  BREAK-POINT.
*指定生成的内表到字段符号
  ASSIGN D_REF2->* TO <DYN_TABLE2>.

*创建动态工作区结构
  CREATE DATA DYN_WA2 LIKE LINE OF <DYN_TABLE2>.
*  DATA: lt_zit0001 LIKE TABLE OF zit0001.
*创建动态工作区
  ASSIGN DYN_WA2->* TO <DYN_WA2>.

*  READ TABLE LT_ALV_CAT INTO LS_ALV_CAT INDEX 1.
*  IF SY-SUBRC EQ 0.
*    ASSIGN COMPONENT LS_ALV_CAT-FIELDNAME OF STRUCTURE <DYN_WA2> TO <FS_STR2>.
*    APPEND <DYN_WA2> TO <DYN_TABLE2>.
*  ENDIF.

*  BREAK-POINT.
*  <FS_STR> = '9998'.



  DATA: LV_DESTINATION  TYPE RLGRAP-FILENAME.
  DATA: LS_KEY          TYPE WWWDATATAB.

*  SELECT * INTO CORRESPONDING FIELDS OF TABLE <DYN_TABLE> UP TO 1
*  ROWS FROM (P_NAME).

* 首先下载模版
*    SELECT SINGLE RELID OBJID FROM WWWDATA INTO CORRESPONDING FIELDS OF LS_KEY WHERE RELID = 'MI' AND OBJID = 'ZFICO049'.
*    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
*      EXPORTING
*        KEY         = LS_KEY
*        DESTINATION = LV_DESTINATION.

* 打开模版
  CREATE OBJECT GO_EXCEL 'EXCEL.APPLICATION'.
  IF SY-SUBRC NE 0.
  ENDIF.
  SET PROPERTY OF GO_EXCEL 'DISPLAYALERTS' = 0.
  SET PROPERTY OF GO_EXCEL 'VISIBLE' = 1.
  CALL METHOD OF GO_EXCEL 'WORKBOOKS' = GO_WORKBOOK.
  SET PROPERTY OF GO_EXCEL 'SHEETSINNEWWORKBOOK' = 1.
  CALL METHOD OF GO_WORKBOOK 'ADD' = MAP.

*  CALL METHOD OF GO_WORKBOOK 'OPEN'
*    EXPORTING
*      #1 = LV_FULLPATH.
  CALL METHOD OF GO_EXCEL 'SHEETS' = GO_SHEET
    EXPORTING
    #1 = 1.
  CALL METHOD OF GO_SHEET 'ACTIVATE'.
*填值
  PERFORM EXCEL_ROW_INSERT USING GO_SHEET 3 1 1. "复制并插入一行
  LOOP AT LT_ALV_CAT INTO LS_ALV_CAT.
    PERFORM FILL_RANGE USING 1 SY-TABIX LS_ALV_CAT-SELTEXT.
  ENDLOOP.
*关闭
  GET PROPERTY OF GO_EXCEL 'ACTIVESHEET' = GO_SHEET. "获取活动SHEET
*  FREE OBJECT GO_SHEET.
*  FREE OBJECT GO_WORKBOOK.

  GET PROPERTY OF GO_EXCEL 'ACTIVEWORKBOOK' = GO_WORKBOOK.


*  SET PROPERTY OF GO_EXCEL 'VISIBLE' = 0.  "是否显示EXCEL 此处显示不退出
*  CALL METHOD OF GO_WORKBOOK 'SAVES'.
*  CALL METHOD OF GO_WORKBOOK 'SAVES'
*    EXPORTING
*    #1 = LV_FULLPATH
*    #2 = 1.

  CALL METHOD OF MAP 'SaveAs'
    EXPORTING
    #1 = LV_FULLPATH.
  CALL METHOD OF GO_WORKBOOK 'CLOSE'.
  CALL METHOD OF GO_EXCEL 'QUIT'.


  FREE OBJECT GO_SHEET.
  FREE OBJECT GO_WORKBOOK.
  FREE OBJECT GO_EXCEL.
ENDFORM.                    "frm_down_excel

*&---------------------------------------------------------------------*
*&      Form  excel_row_insert
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->LCOBJ_SHEET  text
*      -->LC_ROW       text
*      -->LC_COUNT     text
*      -->LV_ROWCOPY   text
*----------------------------------------------------------------------*
FORM EXCEL_ROW_INSERT  USING LCOBJ_SHEET
                            LC_ROW
                            LC_COUNT
                            LV_ROWCOPY.
  DATA LC_RANGE TYPE OLE2_OBJECT.
  DATA H_BORDERS  TYPE OLE2_OBJECT.
  DO LC_COUNT TIMES.
    CALL METHOD OF LCOBJ_SHEET 'ROWS' = LC_RANGE
      EXPORTING #1 = LV_ROWCOPY.
    CALL METHOD OF LC_RANGE 'COPY'. "COPY第10行插入一个新行
    CALL METHOD OF LCOBJ_SHEET 'ROWS' = LC_RANGE
      EXPORTING #1 = LC_ROW.
    CALL METHOD OF LC_RANGE 'INSERT'.
    CALL METHOD OF LC_RANGE 'CLEARCONTENTS'. "是否需要清空CELL
  ENDDO.
ENDFORM.                    "excel_row_insert

*&---------------------------------------------------------------------*
*&      Form  fill_range
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->VALUE(F_ROW)    text
*      -->VALUE(F_COL)    text
*      -->VALUE(F_VALUE)  text
*----------------------------------------------------------------------*
FORM FILL_RANGE  USING   VALUE(F_ROW)
                         VALUE(F_COL)
                         VALUE(F_VALUE).

  DATA: ROW     TYPE I,
        COL     TYPE I,
        LO_CELL TYPE OLE2_OBJECT.
  ROW = F_ROW.
  COL = F_COL.
  CALL METHOD OF GO_EXCEL 'CELLS' = LO_CELL
    EXPORTING
    #1 = ROW
    #2 = COL.
  SET PROPERTY OF LO_CELL 'VALUE' = F_VALUE.

ENDFORM.                    "fill_range
*&---------------------------------------------------------------------*
*& FORM FRM_GET_DATA
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM FRM_GET_DATA .
  CLEAR LT_ALV_CAT.

  IF R1 EQ 'X'."ZFIS017
    CALL FUNCTION 'NAMETAB_GET'
      EXPORTING
        LANGU          = SY-LANGU
        TABNAME        = 'ZFIS017'
      TABLES
        NAMETAB        = LT_TABLE
      EXCEPTIONS
        NO_TEXTS_FOUND = 1.
*根据取出的字段目录生成参考字段目录
    LOOP AT LT_TABLE INTO LS_TABLE.
*    IF LS_TABLE-FIELDNAME NE 'MANDT'.
      LS_ALV_CAT-FIELDNAME = LS_TABLE-FIELDNAME.
      LS_ALV_CAT-REF_TABLE = 'ZFIS017'.
      LS_ALV_CAT-REF_FIELD = LS_TABLE-FIELDNAME.
      LS_ALV_CAT-SELTEXT   = LS_TABLE-FIELDTEXT.
      LS_ALV_CAT-SCRTEXT_L = LS_TABLE-FIELDTEXT.
      LS_ALV_CAT-SCRTEXT_M = LS_TABLE-FIELDTEXT.
      LS_ALV_CAT-SCRTEXT_S = LS_TABLE-FIELDTEXT.
      APPEND LS_ALV_CAT TO LT_ALV_CAT.
*    ENDIF.
      CLEAR LS_ALV_CAT.
    ENDLOOP.
  ENDIF.
*取出表结构的字段目录
  CALL FUNCTION 'NAMETAB_GET'
    EXPORTING
      LANGU          = SY-LANGU
      TABNAME        = 'ZSDTTAX02'
    TABLES
      NAMETAB        = LT_TABLE
    EXCEPTIONS
      NO_TEXTS_FOUND = 1.
*根据取出的字段目录生成参考字段目录

  IF R0 EQ 'X'.

    LS_ALV_CAT-FIELDNAME = 'ZSEL'.
**    ls_alv_cat-ref_table = 'ZMMT090'.
    LS_ALV_CAT-CHECKBOX  = 'X'.
    LS_ALV_CAT-EDIT      = 'X'.
    LS_ALV_CAT-SELTEXT   = '选择'.
    LS_ALV_CAT-SCRTEXT_L = '选择'.
    LS_ALV_CAT-SCRTEXT_M = '选择'.
    LS_ALV_CAT-SCRTEXT_S = '选择'.
    APPEND LS_ALV_CAT TO LT_ALV_CAT.
    CLEAR LS_ALV_CAT.

    LS_ALV_CAT-FIELDNAME = 'ZCOLOR'.
**    ls_alv_cat-ref_table = 'ZMMT090'.
*  ls_alv_cat-ref_field = 'ZCOLOR'.
    LS_ALV_CAT-SELTEXT   = '状态'.
    LS_ALV_CAT-SCRTEXT_L = '状态'.
    LS_ALV_CAT-SCRTEXT_M = '状态'.
    LS_ALV_CAT-SCRTEXT_S = '状态'.
    APPEND LS_ALV_CAT TO LT_ALV_CAT.
    CLEAR LS_ALV_CAT.
  ENDIF.

  LOOP AT LT_TABLE INTO LS_TABLE.
*    IF LS_TABLE-FIELDNAME NE 'MANDT'.
    LS_ALV_CAT-FIELDNAME = LS_TABLE-FIELDNAME.
    LS_ALV_CAT-REF_TABLE = 'ZSDTTAX02'.
    LS_ALV_CAT-REF_FIELD = LS_TABLE-FIELDNAME.
    LS_ALV_CAT-SELTEXT   = LS_TABLE-FIELDTEXT.
    LS_ALV_CAT-SCRTEXT_L = LS_TABLE-FIELDTEXT.
    LS_ALV_CAT-SCRTEXT_M = LS_TABLE-FIELDTEXT.
    LS_ALV_CAT-SCRTEXT_S = LS_TABLE-FIELDTEXT.
    APPEND LS_ALV_CAT TO LT_ALV_CAT.
*    ENDIF.
    CLEAR LS_ALV_CAT.
  ENDLOOP.

  LS_ALV_CAT-FIELDNAME = 'ZMSG'.
**    ls_alv_cat-ref_table = 'ZMMT090'.
*  ls_alv_cat-ref_field = 'ZCOLOR'.
  LS_ALV_CAT-SELTEXT   = '消息'.
  LS_ALV_CAT-SCRTEXT_L = '消息'.
  LS_ALV_CAT-SCRTEXT_M = '消息'.
  LS_ALV_CAT-SCRTEXT_S = '消息'.
  APPEND LS_ALV_CAT TO LT_ALV_CAT.
  CLEAR LS_ALV_CAT.

*内表创建

  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      IT_FIELDCATALOG = LT_ALV_CAT
    IMPORTING
      EP_TABLE        = D_REF.


*指定生成的内表到字段符号
  ASSIGN D_REF->* TO <DYN_TABLE>.

*创建动态工作区结构
  CREATE DATA DYN_WA LIKE LINE OF <DYN_TABLE>.

*创建动态工作区
  ASSIGN DYN_WA->* TO <DYN_WA>.

*
  DELETE LT_ALV_CAT[] WHERE FIELDNAME EQ 'MANDT'.
ENDFORM.                    "frm_get_data
*&---------------------------------------------------------------------*
*& FORM FRM_FILE_DATA2
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM FRM_FILE_DATA2 .
  DATA: LV_END TYPE C.
  DATA: LT_DATA  TYPE ALSMEX_TABLINE OCCURS 0 WITH HEADER LINE.
  DATA  LV_FILENAME TYPE RLGRAP-FILENAME.
  DATA: LV_DATUM TYPE SY-DATUM,
        LV_UZEIT TYPE SY-UZEIT.
*  DATA LV_TABIX TYPE SY-TABIX.
*  LV_FILENAME = P_FILE2.
  DELETE LT_TABLE[] WHERE FIELDNAME EQ 'MANDT'.
  DATA LV_TABIX TYPE SY-TABIX.
  LV_FILENAME = P_FILE2.
  DATA LV_LINE TYPE I.
  LV_LINE = LINES( LT_TABLE[] ).

  DATA: LV_STR1 TYPE STRING,
        LV_LEN TYPE I.
  DATA: LT_STR  LIKE TABLE OF LV_STR1.

  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'    "读取EXCEL文件中的内容
    EXPORTING
      FILENAME                = LV_FILENAME
      I_BEGIN_COL             = '1'
      I_BEGIN_ROW             = '2'
      I_END_COL               = LV_LINE
      I_END_ROW               = '99999'
    TABLES
      INTERN                  = LT_DATA
    EXCEPTIONS
      INCONSISTENT_PARAMETERS = 1
      UPLOAD_OLE              = 2
      OTHERS                  = 3.

  LOOP AT LT_DATA.
*    CLEAR LV_END.
*    AT END OF ROW.
*      LV_END = 'X'.
*    ENDAT.
    LV_TABIX = LT_DATA-COL.
*    ADD 1 TO LV_TABIX.
    READ TABLE LT_TABLE INTO LS_TABLE INDEX LV_TABIX.
    IF SY-SUBRC EQ 0.
      ASSIGN COMPONENT LS_TABLE-FIELDNAME OF STRUCTURE <DYN_WA> TO <FS_STR>.
      CASE LS_TABLE-DATATYPE.
        WHEN 'DATS'.
          CLEAR: LV_UZEIT,LV_DATUM.
          CALL FUNCTION 'ZRFC_FI_002'
            EXPORTING
              P_DATUM  = LT_DATA-VALUE
            IMPORTING
              OP_DATUM = LV_DATUM.
          <FS_STR> = LV_DATUM.
        WHEN 'TIMS'.
          CLEAR: LV_UZEIT,LV_DATUM.
          CALL FUNCTION 'ZRFC_FI_002'
            EXPORTING
              P_UZEIT  = LT_DATA-VALUE
            IMPORTING
              OP_UZEIT = LV_UZEIT.
          <FS_STR> = LV_UZEIT.
        WHEN OTHERS.
          <FS_STR> = LT_DATA-VALUE.
      ENDCASE.

    ENDIF.

    AT END OF ROW.
*      APPEND <DYN_WA> TO <DYN_TABLE>.
      MOVE-CORRESPONDING <DYN_WA> TO GS_OUTPUT.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = GS_OUTPUT-VBELN
        IMPORTING
          OUTPUT = GS_OUTPUT-VBELN.

      APPEND GS_OUTPUT TO GT_OUTPUT.
      CLEAR: <DYN_WA>,GS_OUTPUT.
    ENDAT.

  ENDLOOP.
ENDFORM.                    "frm_file_data2
*&---------------------------------------------------------------------*
*& FORM FRM_CHECK_DATA
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM FRM_CHECK_DATA .
  DATA: LV_LENG   TYPE I,
        LV_TABIX  TYPE SY-TABIX,
        LV_TABIX2 TYPE SY-TABIX,
        LV_VALUE1 TYPE CHAR18,
        LV_VALUE2 TYPE CHAR18,
        LV_ZCHECK TYPE SY-TABIX.
  TYPES: BEGIN OF SY_VBRK,
          VBELN TYPE VBRK-VBELN,
        END OF SY_VBRK.
  DATA: LT_VBRK TYPE TABLE OF SY_VBRK,
        LS_VBRK TYPE SY_VBRK,
        LT_ZSDTTAX02 TYPE TABLE OF ZSDTTAX02,
        LS_ZSDTTAX02 TYPE ZSDTTAX02.
  IF GT_OUTPUT[] IS NOT INITIAL.
    SELECT VBELN
      INTO CORRESPONDING FIELDS OF TABLE LT_VBRK
      FROM VBRK
       FOR ALL ENTRIES IN GT_OUTPUT
     WHERE VBELN EQ GT_OUTPUT-VBELN.
    SORT LT_VBRK[] BY VBELN.

    SELECT *
      INTO TABLE LT_ZSDTTAX02
      FROM ZSDTTAX02
       FOR ALL ENTRIES IN GT_OUTPUT
     WHERE ZBILLING EQ GT_OUTPUT-ZBILLING.
    SORT LT_ZSDTTAX02[] BY ZBILLING ZBILLITEM DESCENDING POSNR DESCENDING.
  ENDIF.
  LOOP AT GT_OUTPUT ASSIGNING <FS_OUTPUT>.
    <FS_OUTPUT>-ZSEL = 'X'.

    CLEAR LS_ZSDTTAX02.
    READ TABLE LT_ZSDTTAX02 INTO LS_ZSDTTAX02 WITH KEY ZBILLING = <FS_OUTPUT>-ZBILLING BINARY SEARCH.
    IF <FS_OUTPUT>-ZBILLITEM IS INITIAL.
      IF LS_ZSDTTAX02-ZBILLITEM IS NOT INITIAL.
        <FS_OUTPUT>-ZBILLITEM = LS_ZSDTTAX02-ZBILLITEM.
      ELSE.
        <FS_OUTPUT>-ZBILLITEM = 1.
      ENDIF.
    ENDIF.

    IF <FS_OUTPUT>-POSNR IS INITIAL.
      IF LS_ZSDTTAX02-POSNR IS NOT INITIAL.
        <FS_OUTPUT>-POSNR = LS_ZSDTTAX02-POSNR.
      ELSE.
        <FS_OUTPUT>-POSNR = 1.
      ENDIF.
    ENDIF.

    CASE <FS_OUTPUT>-ZBILLTYPE.
      WHEN '正常' OR '作废' OR '红冲'.
      WHEN OTHERS.
        <FS_OUTPUT>-ZSEL   = ''.
        <FS_OUTPUT>-ZCOLOR = '@0A@'.
        <FS_OUTPUT>-ZMSG   = '类型只能是''正常''''作废''''红冲'''.
    ENDCASE.
    IF <FS_OUTPUT>-DATUM IS INITIAL.
      <FS_OUTPUT>-DATUM = SY-DATUM.
*    ELSEIF '.-\/' CA <FS_OUTPUT>-DATUM.
*      <FS_OUTPUT>-ZSEL   = ''.
*      <FS_OUTPUT>-ZCOLOR = '@0A@'.
*      <FS_OUTPUT>-ZMSG   = '日期請填寫純數字,例如99991231'.
    ENDIF.
    IF <FS_OUTPUT>-UZEIT IS INITIAL.
      <FS_OUTPUT>-UZEIT = SY-UZEIT.
*    ELSEIF '.-\/::' CA <FS_OUTPUT>-UZEIT.
*      <FS_OUTPUT>-ZSEL   = ''.
*      <FS_OUTPUT>-ZCOLOR = '@0A@'.
*      <FS_OUTPUT>-ZMSG   = '時間請填寫純數字,例如120501'.
    ENDIF.


    READ TABLE LT_VBRK WITH KEY VBELN = <FS_OUTPUT>-VBELN BINARY SEARCH TRANSPORTING NO FIELDS.
    IF SY-SUBRC NE 0.
      <FS_OUTPUT>-ZSEL   = ''.
      <FS_OUTPUT>-ZCOLOR = '@0A@'.
      <FS_OUTPUT>-ZMSG   = '发票号不存在,请检查'.
    ENDIF.

  ENDLOOP.
*  LOOP AT GT_OUTPUT INTO GS_OUTPUT.
*    MOVE-CORRESPONDING GS_OUTPUT  TO <DYN_WA>.
*    APPEND <DYN_WA> TO <DYN_TABLE>.
*    CLEAR: GS_OUTPUT.
*  ENDLOOP.
ENDFORM.                    "frm_check_data
*&---------------------------------------------------------------------*
*& FORM FRM_SAVE_DATA
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM FRM_SAVE_DATA .
  DATA: LT_ZSDTTAX02 TYPE TABLE OF ZSDTTAX02,
        LS_ZSDTTAX02 TYPE ZSDTTAX02.
  CLEAR <DYN_TABLE>[].


  LOOP AT GT_OUTPUT INTO GS_OUTPUT WHERE ZSEL = 'X'
                                     AND ZCOLOR EQ ''.
    MOVE-CORRESPONDING GS_OUTPUT  TO LS_ZSDTTAX02.
    APPEND LS_ZSDTTAX02 TO LT_ZSDTTAX02[].
    CLEAR: GS_OUTPUT,LS_ZSDTTAX02.
  ENDLOOP.
  IF LT_ZSDTTAX02[] IS NOT INITIAL.
    MODIFY ZSDTTAX02 FROM TABLE LT_ZSDTTAX02.
    IF SY-SUBRC EQ 0.
      COMMIT WORK AND WAIT.
      LOOP AT GT_OUTPUT ASSIGNING <FS_OUTPUT> WHERE ZSEL = 'X'
                                                AND ZCOLOR EQ ''.
        <FS_OUTPUT>-ZCOLOR = '@08@'.
        <FS_OUTPUT>-ZMSG   = '保存成功'.
      ENDLOOP.
    ELSE.
      ROLLBACK WORK.
    ENDIF.
  ENDIF.
ENDFORM.                    "frm_save_data
*&---------------------------------------------------------------------*
*& FORM FRM_GET_DATA2
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM FRM_GET_DATA2 .
  DATA: LT_ZSDTTAX02 TYPE TABLE OF ZSDTTAX02,
        LS_ZSDTTAX02 TYPE ZSDTTAX02.
  TYPES : BEGIN OF SY_KNA1,
          KUNNR TYPE KNA1-KUNNR ,
          NAME1 TYPE KNA1-NAME1 ,
        END   OF SY_KNA1.
  DATA: LT_KNA1 TYPE TABLE OF SY_KNA1,
        LS_KNA1 TYPE SY_KNA1.
  IF S_ZDATE[] IS INITIAL AND S_ZBILL[] IS INITIAL.
    SELECT VBRK~VBELN AS VBELN  VBRK~FKDAT AS FKDAT  VBRK~WAERK AS WAERK
           VBRK~VKORG AS VKORG  VBRK~VTWEG AS VTWEG  VBRK~SPART AS SPART
           VBRK~BUKRS AS BUKRS  VBRK~NETWR AS NETWR  VBRK~MWSBK AS MWSBK
           VBRK~KUNRG AS KUNRG
           ZSDTTAX02~ZBILLITEM AS ZBILLITEM
           ZSDTTAX02~POSNR AS POSNR  ZSDTTAX02~ZBILLING AS ZBILLING  ZSDTTAX02~ZBILLDATE AS ZBILLDATE
           ZSDTTAX02~ZBILLTYPE AS ZBILLTYPE  ZSDTTAX02~FLAG AS FLAG  ZSDTTAX02~DATUM AS DATUM
           ZSDTTAX02~UZEIT AS UZEIT
        INTO CORRESPONDING FIELDS OF TABLE GT_OUTPUT"
      FROM VBRK LEFT JOIN ZSDTTAX02 ON VBRK~VBELN EQ ZSDTTAX02~VBELN "左連接
     WHERE VBRK~VBELN IN S_VBELN "發票號
       AND VBRK~VKORG EQ P_VKORG "銷售組織
       AND VBRK~FKDAT IN S_FKDAT "請款日期
       AND VBRK~KUNRG IN S_KUNRG."付款人
  ELSE.
    SELECT VBRK~VBELN AS VBELN  VBRK~FKDAT AS FKDAT  VBRK~WAERK AS WAERK
           VBRK~VKORG AS VKORG  VBRK~VTWEG AS VTWEG  VBRK~SPART AS SPART
           VBRK~BUKRS AS BUKRS  VBRK~NETWR AS NETWR  VBRK~MWSBK AS MWSBK
           VBRK~KUNRG AS KUNRG
           ZSDTTAX02~ZBILLITEM AS ZBILLITEM
           ZSDTTAX02~POSNR AS POSNR  ZSDTTAX02~ZBILLING AS ZBILLING  ZSDTTAX02~ZBILLDATE AS ZBILLDATE
           ZSDTTAX02~ZBILLTYPE AS ZBILLTYPE  ZSDTTAX02~FLAG AS FLAG  ZSDTTAX02~DATUM AS DATUM
           ZSDTTAX02~UZEIT AS UZEIT
      INTO CORRESPONDING FIELDS OF TABLE GT_OUTPUT"
      FROM VBRK JOIN ZSDTTAX02 ON VBRK~VBELN EQ ZSDTTAX02~VBELN "全連接
     WHERE VBRK~VBELN IN S_VBELN "發票號
       AND VBRK~VKORG EQ P_VKORG "銷售組織
       AND VBRK~FKDAT IN S_FKDAT "請款日期
       AND VBRK~KUNRG IN S_KUNRG "付款人
       AND ZSDTTAX02~ZBILLING IN S_ZBILL "金稅發票號
       AND ZSDTTAX02~ZBILLDATE IN S_ZDATE. "金稅開票日期
  ENDIF.
  IF GT_OUTPUT[] IS NOT INITIAL.
    SELECT KUNNR NAME1
      INTO TABLE LT_KNA1
      FROM KNA1
       FOR ALL ENTRIES IN GT_OUTPUT
     WHERE KUNNR EQ GT_OUTPUT-KUNRG. "付款人
    SORT LT_KNA1[] BY KUNNR.
  ENDIF.
  LOOP AT GT_OUTPUT ASSIGNING <FS_OUTPUT>.
    "縂金額 = 净額 + 稅額
    <FS_OUTPUT>-ZTOATL = <FS_OUTPUT>-NETWR + <FS_OUTPUT>-MWSBK.

    READ TABLE LT_KNA1 INTO LS_KNA1 WITH KEY KUNNR = <FS_OUTPUT>-KUNRG BINARY SEARCH.
    IF SY-SUBRC EQ 0.
      <FS_OUTPUT>-NAME1 = LS_KNA1-NAME1."付款人名稱
    ENDIF.
  ENDLOOP.
ENDFORM.                    "frm_get_data2

*&---------------------------------------------------------------------*
*&      Form  f_display_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM F_DISPLAY_DATA .
  PERFORM F_SET_LAYOUT.
*  PERFORM F_SET_FIELDCAT.
  PERFORM F_ALV_DISPLAY TABLES GT_OUTPUT.
ENDFORM.                    "f_display_data
*&---------------------------------------------------------------------*
*&      Form  f_set_layout
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM F_SET_LAYOUT.
  CLEAR: GS_LAYOUT.
  GS_LAYOUT-BOX_FNAME = 'SLBOX'.
  GS_LAYOUT-ZEBRA = 'X'.
  GS_LAYOUT-CWIDTH_OPT = 'X'.
  GS_LAYOUT-CTAB_FNAME = 'CELLCOLOR'.
ENDFORM.                    "f_set_layout
*FORM F_SET_FIELDCAT.
*  CLEAR: GT_FIELDCAT[].
*  DATA: LS_FIELDCAT TYPE LVC_S_FCAT.
*  DEFINE SET_FIELDCAT.
*    CLEAR: LS_FIELDCAT.
*    LS_FIELDCAT-FIELDNAME = &1.
*    LS_FIELDCAT-REF_FIELD = &2.
*    LS_FIELDCAT-REF_TABLE = &3.
*    LS_FIELDCAT-CONVEXIT  = &4.
*    LS_FIELDCAT-DO_SUM    = &5.
*    LS_FIELDCAT-SELTEXT   = &6.
*    LS_FIELDCAT-SCRTEXT_L = &6.
*    LS_FIELDCAT-SCRTEXT_M = &6.
*    LS_FIELDCAT-SCRTEXT_S = &6.
*    LS_FIELDCAT-COLTEXT   = &6.
*    APPEND LS_FIELDCAT TO GT_FIELDCAT.
*  END-OF-DEFINITION.
**显示内容
*  SET_FIELDCAT 'RBUKRS' 'RBUKRS' 'ACDOCA' '' ''  '公司代码'.
*  SET_FIELDCAT 'GJAHR'  'GJAHR'  'ACDOCA' '' ''  '会计年度'.
*  SET_FIELDCAT 'BUDAT'  'BUDAT'  'ACDOCA' '' ''  '过账日期'.
*ENDFORM.
FORM F_ALV_DISPLAY TABLES IT_TABLE.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_PF_STATUS_SET = 'F_SET_PF_STATUS'
      I_CALLBACK_USER_COMMAND  = 'F_USER_COMMAND'
      IS_LAYOUT_LVC            = GS_LAYOUT
      IT_FIELDCAT_LVC          = LT_ALV_CAT
      I_SAVE                   = 'U'
    TABLES
      T_OUTTAB                 = IT_TABLE
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
  IF SY-SUBRC <> 0.
  ENDIF.
ENDFORM.                    "f_alv_display
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
FORM F_SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
  SET PF-STATUS 'STD'.
ENDFORM.                    "f_set_pf_status
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
FORM F_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
 RS_SELFIELD TYPE SLIS_SELFIELD.
  PERFORM F_CHECK_CHANGE_DATA.
  CASE R_UCOMM.
    WHEN 'ZALL'."全選
      PERFORM FRM_SELECT_ALL.
    WHEN 'ZUNALL'."取消全選
      PERFORM FRM_SELECT_INI.
    WHEN 'ZSAVE'.
      PERFORM FRM_SAVE_DATA.
    WHEN 'ZDEL'.
      PERFORM FRM_DEL_DATA.
    WHEN '&IC1'."双击事件
*      READ TABLE GT_OUTPUT INTO GS_OUTPUT INDEX RS_SELFIELD-TABINDEX.
*      IF SY-SUBRC EQ 0.
*        SET PARAMETER ID 'BLN' FIELD GS_OUTPUT-BELNR.
*        SET PARAMETER ID 'BUK' FIELD GS_OUTPUT-RBUKRS.
*        SET PARAMETER ID 'GJR' FIELD GS_OUTPUT-GJAHR.
*        CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
*      ENDIF.
  ENDCASE.
  PERFORM F_REFRESH_ALV.
ENDFORM.                    "f_user_command
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
FORM F_CHECK_CHANGE_DATA.
  DATA: LO_GRID TYPE REF TO CL_GUI_ALV_GRID.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LO_GRID.
  LO_GRID->CHECK_CHANGED_DATA( ).
ENDFORM.                    "f_check_change_data
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
FORM F_REFRESH_ALV.
  DATA: LO_GRID      TYPE REF TO CL_GUI_ALV_GRID,
        LS_IS_STABLE TYPE LVC_S_STBL.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LO_GRID.
  LS_IS_STABLE-COL = 'X'.
  LS_IS_STABLE-ROW = 'X'.
  LO_GRID->REFRESH_TABLE_DISPLAY(
  EXPORTING
  IS_STABLE = LS_IS_STABLE
  EXCEPTIONS
  FINISHED = 1
  OTHERS = 2 ).
  IF SY-SUBRC <> 0.
  ENDIF.
ENDFORM.                    "f_refresh_alv
*&---------------------------------------------------------------------*
*& Form FRM_DEL_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DEL_DATA .
  DATA: LT_ZSDTTAX02 TYPE TABLE OF ZSDTTAX02,
        LS_ZSDTTAX02 TYPE ZSDTTAX02.

  CLEAR LT_ZSDTTAX02[].
  LOOP AT GT_OUTPUT INTO GS_OUTPUT WHERE ZSEL = 'X'.
    MOVE-CORRESPONDING GS_OUTPUT  TO LS_ZSDTTAX02.
    APPEND LS_ZSDTTAX02 TO LT_ZSDTTAX02[].
    CLEAR: GS_OUTPUT,LS_ZSDTTAX02.
  ENDLOOP.
  IF LT_ZSDTTAX02[] IS NOT INITIAL.
    DELETE ZSDTTAX02 FROM TABLE LT_ZSDTTAX02.
    IF SY-SUBRC EQ 0.
      COMMIT WORK AND WAIT.
      DELETE GT_OUTPUT[] WHERE ZSEL EQ 'X'.
    ELSE.
      ROLLBACK WORK.
    ENDIF.
  ENDIF.


ENDFORM.                    "frm_del_data
*&---------------------------------------------------------------------*
*&      Form  FRM_SELECT_ALL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SELECT_ALL .
  LOOP AT GT_OUTPUT ASSIGNING <FS_OUTPUT>.
    <FS_OUTPUT>-ZSEL = 'X'.
  ENDLOOP.
ENDFORM.                    " FRM_SELECT_ALL
*&---------------------------------------------------------------------*
*&      Form  FRM_SELECT_INI
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SELECT_INI .
  LOOP AT GT_OUTPUT ASSIGNING <FS_OUTPUT>.
    <FS_OUTPUT>-ZSEL = ''.
  ENDLOOP.
ENDFORM.                    " FRM_SELECT_INI
*&---------------------------------------------------------------------*
*&      Form  FRM_INI_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_INI_SCREEN .
  SSCRFIELDS-FUNCTXT_01 = '下载文档'.
  LOOP AT SCREEN.
*    IF R1 EQ 'X'.
    CASE SCREEN-GROUP1.
      WHEN 'M2'.
        SCREEN-ACTIVE = 1.
      WHEN 'M1'.
        SCREEN-ACTIVE = 0.
      WHEN 'M4'.
        SCREEN-ACTIVE = 1.
*        SCREEN-LENGTH = 1.
        SCREEN-INPUT  = 0.
        SCREEN-DISPLAY_3D = 0.
*        WHEN OTHERS.
*          SCREEN-ACTIVE = 1.
    ENDCASE.
*    ENDIF.
    MODIFY SCREEN.
    CLEAR SCREEN.
  ENDLOOP.
ENDFORM.                    " FRM_INI_SCREEN
*&---------------------------------------------------------------------*
*&      Form  FRM_SCREEN_OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SCREEN_OUTPUT .
  LOOP AT SCREEN.
    IF R1 EQ 'X'.
      CASE SCREEN-GROUP1.
        WHEN 'M2'. "文件名
          SCREEN-ACTIVE = 0.
        WHEN 'M1'.
          SCREEN-ACTIVE    = 1.
          SCREEN-INVISIBLE = 0.
          SCREEN-INPUT     = 1.
          SCREEN-OUTPUT    = 1.
        WHEN 'M4'.
          SCREEN-ACTIVE = 0.
      ENDCASE.
    ELSEIF R0 EQ 'X'.
      CASE SCREEN-GROUP1.
        WHEN 'M2'.
          SCREEN-ACTIVE = 1.
          SCREEN-INVISIBLE = 0.
          SCREEN-INPUT     = 1.
          SCREEN-OUTPUT    = 1.
        WHEN 'M1'.
          SCREEN-ACTIVE = 0.
        WHEN 'M4'.
          SCREEN-ACTIVE = 1.
*        SCREEN-LENGTH = 1.
          SCREEN-INPUT  = 0.
          SCREEN-DISPLAY_3D = 0.
      ENDCASE.
    ENDIF.
    MODIFY SCREEN.
    CLEAR SCREEN.
  ENDLOOP.
ENDFORM.                    " FRM_SCREEN_OUTPUT
*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_AUTHORITY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text  V_KONH_VKO
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_CHECK_AUTHORITY .
  IF R1 EQ 'X'.
    IF P_VKORG IS INITIAL.
      LV_CHECKF = 'X'.
      CONCATENATE LV_MSG '請填寫銷售組織' INTO LV_MSG.
      EXIT.
    ENDIF.
    IF S_FKDAT IS INITIAL.
      LV_CHECKF = 'X'.
      CONCATENATE LV_MSG '請填寫請款日期' INTO LV_MSG.
      EXIT.
    ENDIF.
    AUTHORITY-CHECK OBJECT 'V_KONH_VKO'
       ID 'VKORG' FIELD P_VKORG
       ID 'ACTVT' FIELD '03'.
    IF SY-SUBRC <> 0.
      LV_CHECKF = 'X'.
      CONCATENATE LV_MSG '沒有' P_VKORG '銷售組織權限' INTO LV_MSG.
      EXIT.
    ENDIF.
  ENDIF.
ENDFORM.                    " FRM_CHECK_AUTHORITY
View Code