11-15-2007 9:01 AM
How to handle errors in call transaction method with description?
11-15-2007 9:04 AM
11-15-2007 9:04 AM
can handle errors using BDCMSGCOLL.
among call transaction and session call transaction is faster
Use a table of the BDCMSGCOLL structure in call transaction statement
call transaction '<TCODE>' using it_bdcdata messages into it_BDCMSGCOLL....
loop at it_BDCMSGCOLL.
call function 'FORMAT_MESSAGE'
1. Go to bdcrecx1 include.
go to form BDC_TRANSACTION .
check LOOP AT MESSTAB.
This is the way to handle errors.
2. Call Transaction is faster.
See the BDc sample code how the errors are handled using the FORMAT_MESSAGE function module
REPORT ZMMBDC1_1 NO STANDARD PAGE HEADING MESSAGE-ID ZT.
internal table for selecting data from flat file
DATA : BEGIN OF IT_DATA OCCURS 0,
MBRSH, " Industry sector
MTART(4), " Material type
KZSEL, " Checkbox
MAKTX(40), " Material description
MEINS(3), " Base unit of measure
MATKL(9), " Material group
BISMT(18), " Old material number
END OF IT_DATA.
internal table for bdcdata
DATA : IT_BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.
internal table to handle messages
DATA : IT_MESSAGES LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
************************************************************************
Variables & Flag declaration
************************************************************************
variables declaration
DATA : V_MESG(50).
flag declaration
DATA : FG_BDC,
FG_FLAG1 TYPE I.
************************************************************************
selection screen
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-001.
************************************************************************
parameter
************************************************************************
PARAMETERS : P_FILE LIKE RLGRAP-FILENAME OBLIGATORY.
SELECTION-SCREEN END OF BLOCK BLK1.
************************************************************************
initialization
************************************************************************
INITIALIZATION.
peform to initialize parameter
PERFORM INIT_PARM.
************************************************************************
start of selection
************************************************************************
start-of-selection.
perform to upload it_data
PERFORM UP_LOAD_IT_DATA.
perform transfer data
PERFORM TRANSFER_DATA.
end of selection
END-OF-SELECTION.
&----
*& Form INIT_PARM
&----
Initializing parameter
----
FORM INIT_PARM.
P_FILE = 'C:\'.
ENDFORM. " INIT_PARM
&----
*& Form UP_LOAD_IT_DATA
&----
Transfering data from file to internal table
----
FORM UP_LOAD_IT_DATA.
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
FILENAME = P_FILE
FILETYPE = 'ASC'
TABLES
DATA_TAB = IT_DATA
EXCEPTIONS
CONVERSION_ERROR = 1
FILE_OPEN_ERROR = 2
FILE_READ_ERROR = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5
NO_BATCH = 6
UNKNOWN_ERROR = 7
GUI_REFUSE_FILETRANSFER = 8
OTHERS = 9.
IF SY-SUBRC = 2 .
FG_FLAG1 = 1.
MESSAGE I001.
ENDIF.
ENDFORM. " UP_LOAD_IT_DATA
&----
*& Form TRANSFER_DATA
&----
Processing the data
----
FORM TRANSFER_DATA.
FG_BDC = 'N'.
LOOP AT IT_DATA.
perform to fill it_bdcdata.
PERFORM FILL_IT_BDCDATA.
CALL TRANSACTION 'MM01' USING IT_BDCDATA MODE 'N' UPDATE 'S'
MESSAGES INTO IT_MESSAGES.
IF SY-SUBRC <> 0.
FG_FLAG1 = 1.
if error occurs in transaction mode run bdc session for that data
PERFORM BDC_PROCESS.
ENDIF.
Handles error messages
PERFORM ERROR_MESSAGES.
CLEAR : IT_BDCDATA,IT_DATA,IT_MESSAGES.
REFRESH : IT_BDCDATA,IT_MESSAGES.
ENDLOOP.
IF FG_FLAG1 = 0.
MESSAGE I003.
ENDIF.
IF FG_BDC = 'O'.
close bdc if it is open
PERFORM CLOSE_BDC.
ENDIF.
ENDFORM. " TRANSFER_DATA
&----
*& Form FILL_IT_BDCDATA
&----
Filling Bdcdata structure with it_data
Some fields have been commented for future updations
----
FORM FILL_IT_BDCDATA.
PERFORM BDC_DYNPRO USING : 'SAPLMGMM' '0060'.
PERFORM BDC_FIELD USING : 'BDC_OKCODE' '/00',
: 'BDC_CURSOR' 'RMMG1_REF-MATNR',
: 'RMMG1-MBRSH' IT_DATA-MBRSH,
: 'RMMG1-MTART' IT_DATA-MTART.
PERFORM BDC_DYNPRO USING : 'SAPLMGMM' '0070'.
PERFORM BDC_FIELD USING : 'BDC_OKCODE' '=RESA'.
PERFORM BDC_DYNPRO USING : 'SAPLMGMM' '0070'.
PERFORM BDC_FIELD USING : 'BDC_OKCODE' '=ENTR',
: 'MSICHTAUSW-KZSEL(01)' IT_DATA-KZSEL.
PERFORM BDC_DYNPRO USING : 'SAPLMGMM' '4000'.
PERFORM BDC_FIELD USING : 'BDC_OKCODE' '=BU',
: 'BDC_SUBSCR' 'SAPLMGMM' & ' 2000TABFRA1',
: 'BDC_SUBSCR' 'SAPLMGD1' & ' 1002SUB1',
: 'BDC_CURSOR' 'MAKT-MAKTX',
: 'MAKT-MAKTX' IT_DATA-MAKTX,
: 'BDC_SUBSCR' 'SAPLMGD1' & ' 2001SUB2',
: 'MARA-MEINS' IT_DATA-MEINS,
: 'MARA-MATKL' IT_DATA-MATKL,
: 'MARA-BISMT' IT_DATA-BISMT,
: 'BDC_OKCODE' '=BU'.
*perform bdc_field using 'MARA-EXTWG' ''.
*perform bdc_field using 'MARA-LABOR' ''.
*perform bdc_field using 'MARA-KOSCH' ''.
*perform bdc_field using 'MARA-MSTAE' ''.
*perform bdc_field using 'MARA-MSTDE' ''.
*perform bdc_field using 'BDC_SUBSCR' 'SAPLMGD1' & ' 2561SUB3'.
*perform bdc_field using 'MARA-BEGRU' ''.
*perform bdc_field using 'BDC_SUBSCR' 'SAPLMGD1' & ' 2007SUB4'.
*perform bdc_field using 'MARA-NTGEW' ''.
*perform bdc_field using 'MARA-BRGEW' ''.
*perform bdc_field using 'MARA-GEWEI' ''.
*perform bdc_field using 'MARA-VOLUM' ''.
*perform bdc_field using 'MARA-VOLEH' ''.
*PERFORM BDC_FIELD USING 'MARA-GROES' ''.
*perform bdc_field using 'MARA-EAN11' ''.
*perform bdc_field using 'MARA-NUMTP' ''.
*PERFORM BDC_FIELD USING 'BDC_SUBSCR' 'SAPLMGD1' & ' 2005SUB5'.
*perform bdc_field using 'BDC_SUBSCR' 'SAPLMGD1' & ' 2011SUB6'.
*perform bdc_field using 'MARA-MAGRV' ''.
ENDFORM. " FILL_IT_BDCDATA
&----
*& Form BDC_DYNPRO
&----
Filling the it_bdcdata table with program name & screen number
----
FORM BDC_DYNPRO USING PROGRAM LIKE BDCDATA-PROGRAM
DYNPRO LIKE BDCDATA-DYNPRO.
IT_BDCDATA-PROGRAM = PROGRAM.
IT_BDCDATA-DYNPRO = DYNPRO.
IT_BDCDATA-DYNBEGIN = 'X'.
APPEND IT_BDCDATA.
CLEAR IT_BDCDATA.
ENDFORM. " BDC_DYNPRO
&----
*& Form BDC_FIELD
&----
Filling it_bdcdata with field name and field value
----
FORM BDC_FIELD USING FNAM LIKE BDCDATA-FNAM
FVAL.
IT_BDCDATA-FNAM = FNAM.
IT_BDCDATA-FVAL = FVAL.
APPEND IT_BDCDATA.
CLEAR IT_BDCDATA.
ENDFORM. " BDC_FIELD
&----
*& Form ERROR_MESSAGES
&----
Displaying error messages
----
FORM ERROR_MESSAGES.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
ID = SY-MSGID
LANG = '-D'
IMPORTING
MSG = V_MESG
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2.
LOOP AT IT_MESSAGES WHERE MSGTYP = 'E'.
WRITE : / 'Message :'(I06) ,V_MESG.
CLEAR IT_MESSAGES.
ENDLOOP.
ENDFORM. " ERROR_MESSAGES
&----
*& Form BDC_PROCESS
&----
Open bdc session if call transaction fails
----
FORM BDC_PROCESS.
IF FG_BDC = 'N'.
open bdc session
PERFORM OPEN_BDC.
FG_BDC = 'O'.
ENDIF.
IF FG_BDC = 'O'.
insert data into bdc session
PERFORM INSERT_BDC.
ENDIF.
ENDFORM. " BDC_PROCESS
&----
*& Form OPEN_BDC
&----
Calling function module to open bdc session
----
FORM OPEN_BDC.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = 'SMM1'
KEEP = 'X'
USER = SY-UNAME
EXCEPTIONS
CLIENT_INVALID = 1
DESTINATION_INVALID = 2
GROUP_INVALID = 3
GROUP_IS_LOCKED = 4
HOLDDATE_INVALID = 5
INTERNAL_ERROR = 6
QUEUE_ERROR = 7
RUNNING = 8
SYSTEM_LOCK_ERROR = 9
USER_INVALID = 10
OTHERS = 11.
ENDFORM. " OPEN_BDC
&----
*& Form INSERT_BDC
&----
Insert it_bdcdata into bdc by calling function module bdc_insert
----
FORM INSERT_BDC.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = 'MM01'
TABLES
DYNPROTAB = IT_BDCDATA
EXCEPTIONS
INTERNAL_ERROR = 1
NOT_OPEN = 2
QUEUE_ERROR = 3
TCODE_INVALID = 4
PRINTING_INVALID = 5
POSTING_INVALID = 6
OTHERS = 7.
ENDFORM. " INSERT_BDC
&----
*& Form CLOSE_BDC
&----
Closing bdc session
----
FORM CLOSE_BDC.
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.
ENDFORM. " CLOSE_BDC
reward points if useful
11-15-2007 9:04 AM
Hi,
Refer this code
************************************************************************
Author : Tamilarasan K. *
Creation Date : 01.12.2006 *
Specification By : Func Speci - Jithesh S. *
Tech Speci - *
Description : BDC for MM - Scheduling Agreement Creation *
ME31L *
Transport Request : DEVK900091 *
************************************************************************
Modification History (To be filled after every change)
----
Changed by Changed on Transport# Reason
----
*1. *
*2. *
*3. *
************************************************************************
REPORT zmpco_bdc_me31l.
DATA: BEGIN OF record,
lifnr(10), " Vendor
evart(5), " Agg. Type
vedat(10), " Agg. Date
ekorg(5), " Pur. Organization
ekgrp(5), " Pur. Group
werks(4), " Plant
lgort(4), " Storage Location
kdate(10), " Validity Date
ematn(20), " Material
ktmng(10), " Quantity
END OF record.
DATA record1 LIKE record.
DATA it_record LIKE TABLE OF record.
DATA it_record1 LIKE TABLE OF record WITH HEADER LINE.
DATA : BEGIN OF wa_error,
lifnr(10), " Vendor
evart(5), " Agg. Type
vedat(10), " Agg. Date
ekorg(5), " Pur. Organization
ekgrp(5), " Pur. Group
werks(4), " Plant
lgort(4), " Storage Location
kdate(10), " Validity Date
ematn(20), " Material
ktmng(10), " Quantity
error(25), " error record
END OF wa_error.
DATA it_error LIKE TABLE OF wa_error WITH HEADER LINE.
BDCDATA and Message collection table declartion.
DATA: bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA: messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
for calulation purpose
DATA: v_ematn TYPE string,
v_ktmng TYPE string,
v_cnt(2) TYPE n,
v_error(4) TYPE n,
v_total(4) TYPE n,
v_saved(4) TYPE n,
l_line TYPE i,
flag TYPE i.
**give the default path for the flatfile.
PARAMETERS filepath TYPE string DEFAULT 'C:\PCS\BDC-ME31L.TXT'.
START-OF-SELECTION.
uploading the file from presantation server
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = filepath
filetype = 'ASC'
has_field_separator = '#'
HEADER_LENGTH = 0
READ_BY_LINE = 'X'
DAT_MODE = ' '
CODEPAGE = ' '
IGNORE_CERR = ABAP_TRUE
REPLACEMENT = '#'
CHECK_BOM = ' '
VIRUS_SCAN_PROFILE =
IMPORTING
FILELENGTH =
HEADER =
TABLES
data_tab = it_record
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.
it_record1[] = it_record[].
**filling the heading for the error record.
it_error-lifnr = 'LIFNR'.
it_error-evart = 'EVART'.
it_error-vedat = 'VEDAT'.
it_error-ekorg = 'EKORG'.
it_error-ekgrp = 'EKGRP'.
it_error-werks = 'WERKS'.
it_error-lgort = 'LGORT'.
it_error-kdate = 'KDATE'.
it_error-ematn = 'EMATN'.
it_error-ktmng = 'KTMENG'.
it_error-error = 'ERROR IN FIELD'.
APPEND it_error.
**passing the data to bdcdata
LOOP AT it_record INTO record.
REFRESH bdcdata.
PERFORM bdc_dynpro USING 'SAPMM06E' '0200'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RM06E-LGORT'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'EKKO-LIFNR'
record-lifnr.
PERFORM bdc_field USING 'RM06E-EVART'
record-evart.
PERFORM bdc_field USING 'RM06E-VEDAT'
record-vedat.
PERFORM bdc_field USING 'EKKO-EKORG'
record-ekorg.
PERFORM bdc_field USING 'EKKO-EKGRP'
record-ekgrp.
PERFORM bdc_field USING 'RM06E-WERKS'
record-werks.
PERFORM bdc_field USING 'RM06E-LGORT'
record-lgort.
PERFORM bdc_dynpro USING 'SAPMM06E' '0201'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EKKO-KDATE'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'EKKO-KDATE'
record-kdate.
***For item to display.
v_cnt = 0.
LOOP AT it_record INTO record1
WHERE lifnr = record-lifnr.
ADD 1 TO v_cnt.
CONCATENATE 'EKPO-EMATN(' v_cnt ')' INTO v_ematn.
CONCATENATE 'EKPO-KTMNG(' v_cnt ')' INTO v_ktmng.
PERFORM bdc_dynpro USING 'SAPMM06E' '0220'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING v_ematn
record1-ematn.
PERFORM bdc_field USING v_ktmng
record1-ktmng.
ADD 1 TO v_total.
DELETE TABLE it_record FROM record1.
CLEAR record1.
ENDLOOP.
PERFORM bdc_dynpro USING 'SAPMM06E' '0220'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=BU'.
PERFORM bdc_transaction USING 'ME31L'.
ENDLOOP.
**routine for bdcdata with tcode
FORM bdc_transaction USING tcode.
CLEAR messtab[].
CALL TRANSACTION tcode USING bdcdata
MODE 'N'
UPDATE 'A'
MESSAGES INTO messtab.
capturing the error record
LOOP AT messtab WHERE msgtyp = 'E'.
ADD 1 TO v_error.
READ TABLE it_record1 WITH KEY ematn = messtab-msgv1 .
IF sy-subrc = 0.
MOVE-CORRESPONDING it_record1 TO it_error.
it_error-error = 'MATERIAL NO Error'.
APPEND it_error.
ENDIF.
READ TABLE it_record1 WITH KEY evart = messtab-msgv1 .
IF sy-subrc = 0.
MOVE-CORRESPONDING it_record1 TO it_error.
it_error-error = 'DOC. TYPE Error'.
APPEND it_error.
ENDIF.
READ TABLE it_record1 WITH KEY lifnr = messtab-msgv1 .
IF sy-subrc = 0.
MOVE-CORRESPONDING it_record1 TO it_error.
it_error-error = 'VENDOR NO Error'.
APPEND it_error.
ENDIF.
READ TABLE it_record1 WITH KEY vedat = messtab-msgv1 .
IF sy-subrc = 0.
MOVE-CORRESPONDING it_record1 TO it_error.
it_error-error = 'DOC. DATE'.
APPEND it_error.
ENDIF.
READ TABLE it_record1 WITH KEY ekorg = messtab-msgv1 .
IF sy-subrc = 0.
MOVE-CORRESPONDING it_record1 TO it_error.
it_error-error = 'PUR.ORGANIZATION Error'.
APPEND it_error.
ENDIF.
READ TABLE it_record1 WITH KEY lgort = messtab-msgv2 .
IF sy-subrc = 0.
MOVE-CORRESPONDING it_record1 TO it_error.
it_error-error = 'STORAGE LOCATION Error'.
APPEND it_error.
ELSE.
flag = 1.
ENDIF.
IF flag = 1 .
READ TABLE it_record1 WITH KEY werks = messtab-msgv1.
IF sy-subrc = 0.
MOVE-CORRESPONDING it_record1 TO it_error.
it_error-error = 'PLANT Error'.
APPEND it_error.
ENDIF.
ENDIF.
READ TABLE it_record1 WITH KEY ekgrp = messtab-msgv1 .
IF sy-subrc = 0.
MOVE-CORRESPONDING it_record1 TO it_error.
it_error-error = 'PUR. GROUP Error'.
APPEND it_error.
ENDIF.
READ TABLE it_record1 WITH KEY ktmng = messtab-msgv1 .
IF sy-subrc = 0.
MOVE-CORRESPONDING it_record1 TO it_error.
it_error-error = 'QUANTITY Error'.
APPEND it_error.
ENDIF.
CLEAR it_error.
ENDLOOP.
capturing the saved record
LOOP AT messtab WHERE msgtyp = 'S'.
ADD 1 TO v_saved.
ENDLOOP.
*Disply a message that tells about the summary of the transaction.
DESCRIBE TABLE it_record1 LINES l_line.
IF l_line EQ v_total.
WRITE:/ 'The Total No of Processed Record : ', v_total.
SKIP.
WRITE:/ 'The Total No of Saved Record : ', v_saved.
SKIP.
WRITE:/ 'The Total No of Errored Record : ', v_error.
SKIP.
WRITE:/ 'Error Record Path : ' , 'C:\PCS\ERROR-ME31L.TXT' .
the error record is captured in a seperate file.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
BIN_FILESIZE =
filename = 'C:\PCS\ERROR-ME31L.TXT'
filetype = 'ASC'
APPEND = ' '
write_field_separator = '#'
HEADER = '00'
TRUNC_TRAILING_BLANKS = ' '
WRITE_LF = 'X'
COL_SELECT = ' '
COL_SELECT_MASK = ' '
DAT_MODE = ' '
CONFIRM_OVERWRITE = ' '
NO_AUTH_CHECK = ' '
CODEPAGE = ' '
IGNORE_CERR = ABAP_TRUE
REPLACEMENT = '#'
WRITE_BOM = ' '
TRUNC_TRAILING_BLANKS_EOL = 'X'
WK1_N_FORMAT = ' '
WK1_N_SIZE = ' '
WK1_T_FORMAT = ' '
WK1_T_SIZE = ' '
IMPORTING
FILELENGTH =
TABLES
data_tab = it_error
FIELDNAMES =
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.
ENDIF.
ENDIF.
ENDFORM. "bdc_transaction
----
Start new screen *
----
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM. "BDC_DYNPRO
----
Insert field for field name and field value *
----
FORM bdc_field USING fnam fval.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDFORM. "BDC_FIELD
*****************************************************************
Reward Points
Regards,
Prashant
11-15-2007 9:12 AM
Hi,
To get the messages into the internal table we use
'call transaction t-code messages into itab'
where itab is like BDCMSGCOLL .
reward points if its useful.
11-15-2007 9:18 AM
HI ,
here is an example :
call transaction 'VL01N'
using li_bdcdata
mode 'N'
update 'S' " 'A'->Asynchronous update 'S'->Synchronous update
messages into li_vl01n_return. "structure BDCMSGCOLL
if sy-subrc = 0.
read table li_vl01n_return
into lwa_vl01n_return
with key msgtyp = 'E'.
if sy-subrc = 0.
PROCESS ERRORS!
endif.
endif.
Regards,
Sooness.