Real-time BDC call transaction method in SAP ABAP
Real-time example of using BDC call transaction method in SAP ABAP
REPORT ZCALL_TRAN_XD01 .
DATA: BEGIN OF ITAB OCCURS 1,
KUNNR(10),
BUKRS(4),
KTOKD(4),
NAME1(30),
SORTL(10),
STRAS(30),
ORT01(25),
LAND1(3),
AKONT(10),
ZUAWA(3),
END OF ITAB.
DATA: BEGIN OF IT_ERR OCCURS 1,
KUNNR(10),
BUKRS(4),
KTOKD(4),
NAME1(30),
SORTL(10),
STRAS(30),
ORT01(25),
LAND1(3),
AKONT(10),
ZUAWA(3),
MSG(150),
END OF IT_ERR.
DATA: IT_BDCDATA LIKE BDCDATA OCCURS 1 WITH HEADER LINE.
DATA: IT_MSGS LIKE BDCMSGCOLL OCCURS 1 WITH HEADER LINE.
DATA: V_MSG TYPE CHAR255,
V_MODE.
PARAMETERS: P_FILE LIKE RLGRAP-FILENAME.
PARAMETERS: P_A RADIOBUTTON GROUP G1,
P_E RADIOBUTTON GROUP G1,
P_N RADIOBUTTON GROUP G1 DEFAULT 'X'.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
PERFORM BROWSE_FILE.
START-OF-SELECTION.
PERFORM READ_FILE.
PERFORM POPULATE_BDCDATA.
END-OF-SELECTION.
IF NOT IT_ERR[] IS INITIAL.
PERFORM DOWNLOAD_ERR_RECS.
ENDIF.
PERFORM MEMORY_FREE.
FORM BROWSE_FILE .
CALL FUNCTION 'F4_FILENAME'
IMPORTING
FILE_NAME = P_FILE.
ENDFORM. " BROWSE_FILE
FORM READ_FILE .
DATA: V_FILE TYPE STRING.
V_FILE = P_FILE.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = V_FILE
FILETYPE = 'ASC'
HAS_FIELD_SEPARATOR = 'X'
TABLES
DATA_TAB = ITAB
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_READ_ERROR = 2
NO_BATCH = 3
GUI_REFUSE_FILETRANSFER = 4
INVALID_TYPE = 5
NO_AUTHORITY = 6
UNKNOWN_ERROR = 7
BAD_DATA_FORMAT = 8
HEADER_NOT_ALLOWED = 9
SEPARATOR_NOT_ALLOWED = 10
HEADER_TOO_LONG = 11
UNKNOWN_DP_ERROR = 12
ACCESS_DENIED = 13
DP_OUT_OF_MEMORY = 14
DISK_FULL = 15
DP_TIMEOUT = 16
OTHERS = 17.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " READ_FILE
FORM POPULATE_BDCDATA .
*--DETERMINE THE MODE
IF P_A = 'X'.
V_MODE = 'A'.
ELSEIF P_E = 'X'.
V_MODE = 'E'.
ELSEIF P_N = 'X'.
V_MODE = 'N'.
ENDIF.
LOOP AT ITAB.
PERFORM BDCDATA_POPULATION.
*--call transaction with it_bdcdata
CALL TRANSACTION 'XD01' USING IT_BDCDATA
MODE V_MODE
UPDATE 'S'
MESSAGES INTO IT_MSGS.
IF SY-SUBRC = 0.
PERFORM SUCC_RECS.
CLEAR: IT_MSGS,IT_MSGS[].
ELSE.
PERFORM ERR_RECS.
CLEAR: IT_MSGS,IT_MSGS[].
ENDIF.
REFRESH IT_BDCDATA.
ENDLOOP.
ENDFORM. " POPULATE_BDCDATA
FORM BDCDATA_POPULATION .
*--1ST SCREEN
perform bdc_dynpro using 'SAPMF02D' '0100'.
perform bdc_field using 'BDC_OKCODE' '/00'.
perform bdc_field using 'RF02D-KUNNR' ITAB-KUNNR.
perform bdc_field using 'RF02D-BUKRS' ITAB-BUKRS.
perform bdc_field using 'RF02D-KTOKD' ITAB-KTOKD.
*--2ND SCREEN
perform bdc_dynpro using 'SAPMF02D' '0110'.
perform bdc_field using 'BDC_OKCODE' '/00'.
perform bdc_field using 'KNA1-NAME1' ITAB-NAME1.
perform bdc_field using 'KNA1-SORTL' ITAB-SORTL.
perform bdc_field using 'KNA1-STRAS' ITAB-STRAS.
perform bdc_field using 'KNA1-ORT01' ITAB-ORT01.
perform bdc_field using 'KNA1-LAND1' ITAB-LAND1.
perform bdc_field using 'KNA1-SPRAS' SY-LANGU.
*--3RD-SCREEN
perform bdc_dynpro using 'SAPMF02D' '0120'.
perform bdc_field using 'BDC_OKCODE' '/00'.
*--4TH SCREEN
perform bdc_dynpro using 'SAPMF02D' '0125'.
perform bdc_field using 'BDC_OKCODE' '/00'.
*--5TH SCREEN
perform bdc_dynpro using 'SAPMF02D' '0130'.
perform bdc_field using 'BDC_OKCODE' '=ENTR'.
*--6TH SCREEN
perform bdc_dynpro using 'SAPMF02D' '0340'.
perform bdc_field using 'BDC_OKCODE' '=ENTR'.
*--7TH SCREEN
perform bdc_dynpro using 'SAPMF02D' '0360'.
perform bdc_field using 'BDC_OKCODE' '=ENTR'.
*--8TH SCREEN
perform bdc_dynpro using 'SAPMF02D' '0210'.
perform bdc_field using 'BDC_OKCODE' '=UPDA'.
perform bdc_field using 'KNB1-AKONT' ITAB-AKONT.
perform bdc_field using 'KNB1-ZUAWA' ITAB-ZUAWA.
ENDFORM. " BDCDATA_POPULATION
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
CLEAR IT_BDCDATA.
IT_BDCDATA-PROGRAM = PROGRAM.
IT_BDCDATA-DYNPRO = DYNPRO.
IT_BDCDATA-DYNBEGIN = 'X'.
APPEND IT_BDCDATA.
ENDFORM. "BDC_DYNPRO
FORM BDC_FIELD USING FNAM FVAL.
IF NOT FVAL IS INITIAL.
CLEAR IT_BDCDATA.
IT_BDCDATA-FNAM = FNAM.
IT_BDCDATA-FVAL = FVAL.
APPEND IT_BDCDATA.
ENDIF.
ENDFORM. "BDC_FIELD
FORM SUCC_RECS .
READ TABLE IT_MSGS WITH KEY MSGTYP = 'S'.
IF SY-SUBRC = 0.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
ID = IT_MSGS-MSGID
LANG = SY-LANGU
NO = IT_MSGS-MSGNR
V1 = IT_MSGS-MSGV1
V2 = IT_MSGS-MSGV2
V3 = IT_MSGS-MSGV3
V4 = IT_MSGS-MSGV4
IMPORTING
MSG = V_MSG
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ELSE.
WRITE:/ V_MSG.
ENDIF.
ENDIF.
ENDFORM. " SUCC_RECS
FORM ERR_RECS .
READ TABLE IT_MSGS WITH KEY MSGTYP = 'E'.
IF SY-SUBRC = 0.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
ID = IT_MSGS-MSGID
LANG = SY-LANGU
NO = IT_MSGS-MSGNR
V1 = IT_MSGS-MSGV1
V2 = IT_MSGS-MSGV2
V3 = IT_MSGS-MSGV3
V4 = IT_MSGS-MSGV4
IMPORTING
MSG = V_MSG
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ELSE.
MOVE ITAB TO IT_ERR.
MOVE V_MSG TO IT_ERR-MSG.
APPEND IT_ERR.
DELETE ITAB.
ENDIF.
ENDIF.
ENDFORM. " ERR_RECS
FORM DOWNLOAD_ERR_RECS .
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
FILENAME = 'C:\XD01_ERR.XLS'
FILETYPE = 'ASC'
WRITE_FIELD_SEPARATOR = 'X'
TABLES
DATA_TAB = IT_ERR
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
HEADER_NOT_ALLOWED = 7
SEPARATOR_NOT_ALLOWED = 8
FILESIZE_NOT_ALLOWED = 9
HEADER_TOO_LONG = 10
DP_ERROR_CREATE = 11
DP_ERROR_SEND = 12
DP_ERROR_WRITE = 13
UNKNOWN_DP_ERROR = 14
ACCESS_DENIED = 15
DP_OUT_OF_MEMORY = 16
DISK_FULL = 17
DP_TIMEOUT = 18
FILE_NOT_FOUND = 19
DATAPROVIDER_EXCEPTION = 20
CONTROL_FLUSH_ERROR = 21
OTHERS = 22.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ELSE.
MESSAGE I000(Z00) WITH 'Error Records downloaded'.
ENDIF.
ENDFORM. " DOWNLOAD_ERR_RECS
FORM MEMORY_FREE .
REFRESH: ITAB, IT_ERR, IT_BDCDATA, IT_MSGS.
FREE: ITAB, IT_ERR, IT_BDCDATA, IT_MSGS.
ENDFORM. " MEMORY_FREE