SAP BDC应用1 - 分公司批量处理资产负债表和利润表 等几大财务报表
REPORT ZFID085_BTDL.
INCLUDE ZFI_AUTHORITY_CHECK.
*BDC相关
TYPES:
TY_BDC_T TYPE TABLE OF BDCDATA. "[BDC]表结构
DATA:
LT_BDCDATA TYPE TY_BDC_T, "[BDC]内表
LS_OPTION TYPE CTU_PARAMS, "[BDC模式]工作区
LT_BDCMSG TYPE TABLE OF BDCMSGCOLL. "[BDC返回消息]内表
*选择屏幕
DATA SC_BUKRS TYPE BUKRS.
SELECTION-SCREEN BEGIN OF BLOCK B01 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_doct TYPE ze_doctype2 OBLIGATORY DEFAULT 'C'. "add mod czq 20200910 默认值由B改为C
SELECT-OPTIONS S_BUKRS FOR SC_BUKRS.
PARAMETERS: P_GJAHR TYPE BKPF-GJAHR OBLIGATORY DEFAULT SY-DATUM(4),
P_MONAT TYPE BKPF-MONAT OBLIGATORY DEFAULT SY-DATUM+4(2).
SELECTION-SCREEN END OF BLOCK B01.
SELECTION-SCREEN BEGIN OF BLOCK B02 WITH FRAME TITLE TEXT-002.
PARAMETERS: R_BS RADIOBUTTON GROUP R1 DEFAULT 'X' USER-COMMAND R,
R_PL RADIOBUTTON GROUP R1.
SELECTION-SCREEN END OF BLOCK B02.
START-OF-SELECTION.
* 公司代码权限检查
PERFORM FRM_BUKRS_CHECK.
* 批量下载
PERFORM FRM_BATCH_DOWNLOAD.
*&---------------------------------------------------------------------*
*& Form FRM_BUKRS_CHECK
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_BUKRS_CHECK .
DATA LV_MESSAGE(200).
PERFORM FRM_CHECK_BUKRS_T TABLES S_BUKRS[]
CHANGING LV_MESSAGE.
IF LV_MESSAGE IS NOT INITIAL.
MESSAGE S000(ZMSG_FI) WITH LV_MESSAGE DISPLAY LIKE'E'.
STOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_BATCH_DOWNLOAD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_BATCH_DOWNLOAD .
DATA:
LT_R_BUKRS TYPE RANGE OF BUKRS,
LS_R_BUKRS LIKE LINE OF LT_R_BUKRS.
* BDC模式设置
LS_OPTION-DISMODE = 'E'. "A:前台模式 N:后台模式 E:显示错误
LS_OPTION-UPDMODE = 'S'. "更新模式:同步更新
LS_OPTION-RACOMMIT = 'X'. "COMMIT不结束BDC
SELECT BUKRS AS LOW
FROM T001
INTO CORRESPONDING FIELDS OF TABLE LT_R_BUKRS
WHERE BUKRS IN S_BUKRS[].
LS_R_BUKRS-SIGN = 'I'.
LS_R_BUKRS-OPTION = 'EQ'.
MODIFY LT_R_BUKRS FROM LS_R_BUKRS TRANSPORTING SIGN OPTION WHERE LOW <> SPACE.
LOOP AT LT_R_BUKRS INTO LS_R_BUKRS.
AT FIRST.
PERFORM FRM_SET_DIRECTORY.
ENDAT.
* 给[BDC]内表赋植
PERFORM F_SETBDC:
* 初始屏幕
USING 'X' 'ZFID085' '1000'
CHANGING LT_BDCDATA,
* 值设置
USING SPACE 'P_DOCT' P_DOCT
CHANGING LT_BDCDATA,
* 值设置
USING SPACE 'S_BUKRS-LOW' LS_R_BUKRS-LOW
CHANGING LT_BDCDATA,
* 值设置
USING SPACE 'P_GJAHR' P_GJAHR
CHANGING LT_BDCDATA,
* 值设置
USING SPACE 'P_MONAT' P_MONAT
CHANGING LT_BDCDATA,
* 执行功能码
USING SPACE 'BDC_OKCODE' '=ONLI'
CHANGING LT_BDCDATA.
* 给[BDC]内表赋植
PERFORM F_SETBDC:
* 初始屏幕
USING 'X' 'SAPLZGLD_FI_OUTPUT_EXCEL' '9000'
CHANGING LT_BDCDATA,
* 执行功能码
USING SPACE 'BDC_OKCODE' '=ZSAVE'
CHANGING LT_BDCDATA.
* 给[BDC]内表赋植
PERFORM F_SETBDC:
* 初始屏幕
USING 'X' 'SAPLZGLD_FI_OUTPUT_EXCEL' '9000'
CHANGING LT_BDCDATA,
* 执行功能码
USING SPACE 'BDC_OKCODE' '=BACK'
CHANGING LT_BDCDATA.
ENDLOOP.
* 给[BDC]内表赋植
PERFORM F_SETBDC:
* 初始屏幕
USING 'X' 'ZFID085' '1000'
CHANGING LT_BDCDATA,
* 执行功能码
USING SPACE 'BDC_OKCODE' '=/EE'
CHANGING LT_BDCDATA.
* 执行BDC
CASE ABAP_TRUE.
WHEN R_BS.
CALL TRANSACTION 'ZFI085A' USING LT_BDCDATA
OPTIONS FROM LS_OPTION
MESSAGES INTO LT_BDCMSG.
WHEN R_PL.
CALL TRANSACTION 'ZFI085B' USING LT_BDCDATA
OPTIONS FROM LS_OPTION
MESSAGES INTO LT_BDCMSG.
WHEN OTHERS.
ENDCASE.
DELETE FROM MEMORY ID 'BATCH_DOWNLOAD'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_DIRECTORY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_SET_DIRECTORY .
DATA:
LV_SELECTED_FOLDER TYPE STRING,
L_REF_OBJ TYPE REF TO CL_GUI_FRONTEND_SERVICES.
CREATE OBJECT L_REF_OBJ.
CALL METHOD L_REF_OBJ->DIRECTORY_BROWSE
CHANGING
SELECTED_FOLDER = LV_SELECTED_FOLDER
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3.
IF LV_SELECTED_FOLDER = SPACE.
MESSAGE '已取消。' TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ENDIF.
EXPORT EV_SELECTED_FOLDER = LV_SELECTED_FOLDER TO MEMORY ID 'BATCH_DOWNLOAD'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_SETBDC
*&---------------------------------------------------------------------*
* 给[BDC]内表赋值
*----------------------------------------------------------------------*
* -->I_BGN 开始标识
* -->I_PRM1 参数1
* -->I_PRM2 参数2
* -->CT_BDCDATA [BDC]内表
*----------------------------------------------------------------------*
FORM F_SETBDC USING I_BGN TYPE CHAR1
I_PRM1
I_PRM2
CHANGING CT_BDCDATA TYPE TY_BDC_T.
DATA LR_BDCDATA TYPE BDCDATA. "BDCDATA
CLEAR LR_BDCDATA.
* Dynpro开始标志为「X」的场合
IF I_BGN = 'X'.
LR_BDCDATA-DYNBEGIN = I_BGN. "Dynpro开始标志
LR_BDCDATA-PROGRAM = I_PRM1. "程序名
LR_BDCDATA-DYNPRO = I_PRM2. "Dyn编号
* Dynpro开始标志为「SPACE」的场合
ELSE.
LR_BDCDATA-FNAM = I_PRM1. "项目名
LR_BDCDATA-FVAL = I_PRM2. "项目植
ENDIF.
* 给[BDC]内表赋值
APPEND LR_BDCDATA TO CT_BDCDATA.
ENDFORM.