业务需求:
在SAP项目中,会经常碰到如下需求:
1:业务需要批量处理SAP标准业务(TCODE),但是没有预留的标准BAPI;只能通过BDC进行录屏,进行数据处理;例如调用VK12更改条件记录,如下图:
TCODE=VK12:
实现步骤:
一、SHDB进行BDC屏幕录制。
二、根据SHDB录制的屏幕,组织代码,调用BDC。
三、完成代码如下:
主程序:
FUNCTION ZFM_SD_YZYX_GD001.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_CTU_MODE) TYPE CTU_MODE DEFAULT 'N'
*" TABLES
*" T_ITEM STRUCTURE A932 OPTIONAL
*"----------------------------------------------------------------------
DATA: L_LINES TYPE I,
L_LINEN TYPE I.
DESCRIBE TABLE T_ITEM LINES L_LINES.
LOOP AT T_ITEM INTO GS_ITEM.
REFRESH: GT_BDCDATA,
GT_MESSTAB.
L_LINEN = SY-TABIX.
PERFORM FRM_NOW_PROGRESS USING L_LINEN L_LINES '正在删除信息记录.....'.
*****VK12更改条件记录
****调用:屏幕-0100
PERFORM FRM_BDC_DYNPRO USING 'SAPMV13A'
'0100'.
****调用:功能
PERFORM FRM_BDC_FIELD USING 'BDC_OKCODE'
'/00'.
***调用:数据
PERFORM FRM_BDC_FIELD USING 'RV13A-KSCHL'
GS_ITEM-KSCHL.
****调用:屏幕-0100
PERFORM FRM_BDC_DYNPRO USING 'SAPLV14A'
'0100'.
****调用:功能
PERFORM FRM_BDC_FIELD USING 'BDC_OKCODE'
'=WEIT'.
***调用:数据
IF GS_ITEM-KSCHL = 'Z222'.
PERFORM FRM_BDC_FIELD USING 'RV130-SELKZ(06)'
'X'.
ELSE.
PERFORM FRM_BDC_FIELD USING 'RV130-SELKZ(09)'
'X'.
ENDIF.
****调用:屏幕-1000
PERFORM FRM_BDC_DYNPRO USING 'RV13A932'
'1000'.
****调用:功能
PERFORM FRM_BDC_FIELD USING 'BDC_OKCODE'
'=ONLI'.
***调用:数据
PERFORM FRM_BDC_FIELD USING 'F001'
GS_ITEM-VTWEG.
***调用:数据
PERFORM FRM_BDC_FIELD USING 'F002'
GS_ITEM-VKBUR.
***调用:数据
PERFORM FRM_BDC_FIELD USING 'F003'
GS_ITEM-KVGR1.
***调用:数据
PERFORM FRM_BDC_FIELD USING 'F004-LOW'
GS_ITEM-MATNR.
***调用:数据
PERFORM FRM_BDC_FIELD USING 'SEL_DATE'
GS_ITEM-DATAB.
****调用:屏幕-1932
PERFORM FRM_BDC_DYNPRO USING 'SAPMV13A'
'1932'.
****调用:功能
PERFORM FRM_BDC_FIELD USING 'BDC_OKCODE'
'=MARL'.
****调用:屏幕-1932
PERFORM FRM_BDC_DYNPRO USING 'SAPMV13A'
'1932'.
****调用:功能
PERFORM FRM_BDC_FIELD USING 'BDC_OKCODE'
'=ENTF'.
****调用:屏幕-1932
PERFORM FRM_BDC_DYNPRO USING 'SAPMV13A'
'1932'.
****调用:功能
PERFORM FRM_BDC_FIELD USING 'BDC_OKCODE'
'=SICH'.
****调用TCODE进入数据录入
CALL TRANSACTION 'VK12' WITH AUTHORITY-CHECK
USING GT_BDCDATA
MODE I_CTU_MODE
UPDATE 'S'
MESSAGES INTO GT_MESSTAB.
LOOP AT GT_MESSTAB WHERE MSGTYP = 'E' OR MSGTYP = 'A'.
ENDLOOP.
IF SY-SUBRC = 0.
****填充CELL-处理结果
GS_ITEM-MANDT = 0. "失败
ELSE.
GS_ITEM-MANDT = 1. "成功
ENDIF.
****更新数据
MODIFY T_ITEM FROM GS_ITEM.
ENDLOOP.
ENDFUNCTION.
INCLUDE:LZFG_SD_YZYX_GDF01
*----------------------------------------------------------------------*
***INCLUDE LZFG_SD_YZYX_GDF01.
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* Start new screen *
*----------------------------------------------------------------------*
FORM FRM_BDC_DYNPRO USING PROGRAM DYNPRO.
CLEAR GT_BDCDATA.
GT_BDCDATA-PROGRAM = PROGRAM.
GT_BDCDATA-DYNPRO = DYNPRO.
GT_BDCDATA-DYNBEGIN = 'X'.
APPEND GT_BDCDATA.
ENDFORM. "FRM_BDC_DYNPRO
*----------------------------------------------------------------------*
* Insert field *
*----------------------------------------------------------------------*
FORM FRM_BDC_FIELD USING FNAM FVAL.
CLEAR GT_BDCDATA.
GT_BDCDATA-FNAM = FNAM.
GT_BDCDATA-FVAL = FVAL.
APPEND GT_BDCDATA.
ENDFORM. "FRM_BDC_FIELD
*&---------------------------------------------------------------------*
*& Form FRM_NOW_PROGRESS
*&---------------------------------------------------------------------*
* 显示当前进度
*----------------------------------------------------------------------*
* <-- P_NOWL 当前处理行
* <-- P_SUML 总数据行
* <-- P_MSG 处理消息
*----------------------------------------------------------------------*
FORM FRM_NOW_PROGRESS USING P_NOWL TYPE I "当前处理行
P_SUML TYPE I "总数据行
P_MSG TYPE STRING."处理消息
DATA: L_PRC TYPE I,
L_PRCS TYPE STRING.
**获取完成比率
L_PRC = P_NOWL * 100 / P_SUML.
L_PRCS = L_PRC.
P_MSG = P_MSG && '(' && P_SUML && ',' && P_NOWL && ')'.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = L_PRC
TEXT = P_MSG.
ENDFORM. " FRM_NOW_PROGRESS
INCLUDE:LZFG_SD_YZYX_GDTOP
FUNCTION-POOL ZFG_SD_YZYX_GD. "MESSAGE-ID ..
DATA: GT_BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE,
GT_MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE,
GS_ITEM TYPE A932.