这是以前写的SAP程序,特点是通过录入(更改)界面,即时驱动批输入模块,后台处理数据。程序清单如下:
REPORT ZBH NO STANDARD PAGE HEADING LINE-SIZE 95 MESSAGE-ID Z1.
*&---------------------------------------------------------------------&
* 修改帐本号(XXXX) by Paul Feng(FQ) 2003.07.07
* Ver1.5 Last Modified 2005.01.10
*&---------------------------------------------------------------------&
TABLES: MARA, MAKT.
DATA: BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.
DATA: WZDM(18) TYPE C, BH(18) TYPE C, WLMS LIKE MAKT-MAKTX.
SELECTION-SCREEN BEGIN OF BLOCK XGBH WITH FRAME TITLE TEXT-001.
SELECTION-SCREEN SKIP 2.
SELECT-OPTIONS: DM FOR MARA-MATNR NO-EXTENSION NO INTERVALS OBLIGATORY
MEMORY ID MAT.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN END OF BLOCK XGBH.
START-OF-SELECTION.
IF NOT DM-LOW IS INITIAL.
WZDM = DM-LOW.
CALL FUNCTION 'ZFORMATDM'
CHANGING MATERIALDM = WZDM.
SELECT SINGLE * FROM MARA WHERE MATNR EQ WZDM.
IF SY-SUBRC EQ 0.
BH = MARA-BISMT.
CALL SCREEN '0100'.
ELSE.
MESSAGE I079 WITH DM-LOW.
ENDIF.
ENDIF.
END-OF-SELECTION.
FORM DYNPRO USING DYNBEGIN NAME VALUE.
IF DYNBEGIN = 'X'.
CLEAR BDCDATA.
MOVE: 'X' TO BDCDATA-DYNBEGIN,
NAME TO BDCDATA-PROGRAM,
VALUE TO BDCDATA-DYNPRO.
APPEND BDCDATA.
ELSE.
CLEAR BDCDATA.
MOVE: NAME TO BDCDATA-FNAM,
VALUE TO BDCDATA-FVAL.
APPEND BDCDATA.
ENDIF.
ENDFORM.
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'XGBH'.
SET TITLEBAR '100'.
WZDM = DM-LOW.
SHIFT WZDM LEFT DELETING LEADING '0'.
SELECT SINGLE * FROM MAKT WHERE MATNR = DM-LOW.
IF SY-SUBRC EQ 0.
WLMS = MAKT-MAKTX.
ELSE.
WLMS = ''.
ENDIF.
ENDMODULE. " STATUS_0100 OUTPUT
MODULE USER_COMMAND_0100 INPUT.
IF SY-UCOMM EQ 'WRITE'.
IF WZDM IS INITIAL.
MESSAGE E096.
ELSE.
CALL FUNCTION 'ZFORMATDM'
CHANGING MATERIALDM = WZDM.
SELECT SINGLE * FROM MARA WHERE MATNR EQ WZDM.
IF SY-SUBRC EQ 0.
PERFORM ZBHXG USING WZDM BH. "BDC Direct Input
IF SY-SUBRC EQ 0.
MESSAGE I131 WITH '成功!'.
ELSE.
MESSAGE I131 WITH '失败!原因未知。'.
ENDIF.
ELSE.
SHIFT WZDM LEFT DELETING LEADING '0'.
MESSAGE E079 WITH WZDM.
ENDIF.
ENDIF.
ENDIF.
ENDMODULE. " USER_COMMAND_0100 INPUT
FORM ZBHXG USING P_WZDM
P_BH.
perform bdc_dynpro using 'SAPLMGMM' '0060'.
perform bdc_field using 'BDC_CURSOR'
'RMMG1-MATNR'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'/00'.
PERFORM BDC_FIELD USING 'RMMG1-MATNR' P_WZDM.
perform bdc_dynpro using 'SAPLMGMM' '0070'.
perform bdc_field using 'BDC_CURSOR'
'MSICHTAUSW-KZSEL(01)'.
perform bdc_field using 'BDC_OKCODE'
'=ENTR'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(01)' 'X'.
perform bdc_dynpro using 'SAPLMGMM' '4000'.
perform bdc_field using 'BDC_OKCODE'
'=BU'.
perform bdc_field using 'BDC_CURSOR'
'MARA-BISMT'.
perform bdc_field using 'MARA-BISMT'
P_BH.
perform bdc_transaction using 'MM02'.
ENDFORM. " ZBHXG
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
CLEAR BDCDATA.
BDCDATA-PROGRAM = PROGRAM.
BDCDATA-DYNPRO = DYNPRO.
BDCDATA-DYNBEGIN = 'X'.
APPEND BDCDATA.
ENDFORM.
FORM BDC_FIELD USING FNAM FVAL.
IF FVAL <> '/'.
CLEAR BDCDATA.
BDCDATA-FNAM = FNAM.
BDCDATA-FVAL = FVAL.
APPEND BDCDATA.
ENDIF.
ENDFORM.
FORM BDC_TRANSACTION USING TCODE.
TABLES: T100.
DATA: MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
DATA: CTUMODE LIKE CTU_PARAMS-DISMODE VALUE 'N'.
DATA: CUPDATE LIKE CTU_PARAMS-UPDMODE VALUE 'L'.
DATA: E_GROUP(12), E_GROUP_OPENED.
DATA: E_USER(12), E_KEEP(1) TYPE C VALUE ''. " not keep session
DATA: E_HDATE LIKE SY-DATUM.
DATA: L_MSTRING(480).
DATA: L_SUBRC LIKE SY-SUBRC.
REFRESH MESSTAB.
CALL TRANSACTION TCODE USING BDCDATA
MODE CTUMODE
UPDATE CUPDATE
MESSAGES INTO MESSTAB.
L_SUBRC = SY-SUBRC.
LOOP AT MESSTAB.
SELECT SINGLE * FROM T100 WHERE SPRSL = MESSTAB-MSGSPRA
AND ARBGB = MESSTAB-MSGID
AND MSGNR = MESSTAB-MSGNR.
IF SY-SUBRC = 0.
L_MSTRING = T100-TEXT.
IF L_MSTRING CS '&1'.
REPLACE '&1' WITH MESSTAB-MSGV1 INTO L_MSTRING.
REPLACE '&2' WITH MESSTAB-MSGV2 INTO L_MSTRING.
REPLACE '&3' WITH MESSTAB-MSGV3 INTO L_MSTRING.
REPLACE '&4' WITH MESSTAB-MSGV4 INTO L_MSTRING.
ELSE.
REPLACE '&' WITH MESSTAB-MSGV1 INTO L_MSTRING.
REPLACE '&' WITH MESSTAB-MSGV2 INTO L_MSTRING.
REPLACE '&' WITH MESSTAB-MSGV3 INTO L_MSTRING.
REPLACE '&' WITH MESSTAB-MSGV4 INTO L_MSTRING.
ENDIF.
CONDENSE L_MSTRING.
WRITE: / MESSTAB-MSGTYP, L_MSTRING(250).
ELSE.
WRITE: / MESSTAB.
ENDIF.
ENDLOOP.
SKIP.
IF L_SUBRC <> 0 AND E_GROUP <> SPACE.
IF E_GROUP_OPENED = ' '.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING CLIENT = SY-MANDT
GROUP = E_GROUP
USER = E_USER
KEEP = E_KEEP
HOLDDATE = E_HDATE.
E_GROUP_OPENED = 'X'.
ENDIF.
CALL FUNCTION 'BDC_INSERT'
EXPORTING TCODE = TCODE
TABLES DYNPROTAB = BDCDATA.
ENDIF.
REFRESH BDCDATA.
CLEAR T100.
ENDFORM.