ABAP EXCEL批导和查看自建表样板
结果:
内文:
源代码:
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.
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.
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.
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」