I am trying to load customers into SAP using message type DEBMAS02.
For now I am loading just a single customer in each IDoc but the IDoc claims that "Application document not posted" even though the customer was created.
I am no expert on IDocs but I have been debugging for days now and I'm not getting much wiser...
One thing I have discovered is this piece of code in subroutine CALL_TRANSACTION (include LVV02F3J, program SAPLVV02):
CALL TRANSACTION TRANSACTION_CODE USING FT
MODE CALL_TRANSACTION_MODE
UPDATE C_UPDATE_SYNC
MESSAGES INTO T_BDCMSGCOLL.
SUBRC = SY-SUBRC.
DESCRIBE TABLE T_BDCMSGCOLL LINES H_TABIX.
READ TABLE T_BDCMSGCOLL INDEX H_TABIX.
IF SUBRC <> 0.
V_WORKFLOW_RESULT = C_WF_RESULT_ERR.
CLEAR T_IDOC_STATUS.
REFRESH T_IDOC_STATUS.
T_IDOC_STATUS-DOCNUM = F_IDOC_CONTROL-DOCNUM.
T_IDOC_STATUS-STATUS = C_IDOC_STAT_INPUT_ERROR.
T_IDOC_STATUS-MSGTY = SY-MSGTY.
if T_BDCMSGCOLL-MSGID = '00'
and T_BDCMSGCOLL-MSGNR = '055'. "Note 620898
T_IDOC_STATUS-MSGID = 'F2'.
T_IDOC_STATUS-MSGNO = '282'.
T_IDOC_STATUS-MSGV1 = T_BDCMSGCOLL-dyname.
T_IDOC_STATUS-MSGV2 = T_BDCMSGCOLL-dynumb.
T_IDOC_STATUS-MSGV3 = T_BDCMSGCOLL-fldname.
else.
T_IDOC_STATUS-MSGID = T_BDCMSGCOLL-MSGID.
T_IDOC_STATUS-MSGNO = T_BDCMSGCOLL-MSGNR.
T_IDOC_STATUS-MSGV1 = T_BDCMSGCOLL-MSGV1.
T_IDOC_STATUS-MSGV2 = T_BDCMSGCOLL-MSGV2.
T_IDOC_STATUS-MSGV3 = T_BDCMSGCOLL-MSGV3.
T_IDOC_STATUS-MSGV4 = T_BDCMSGCOLL-MSGV4.
endif.
T_IDOC_STATUS-UNAME = SY-UNAME.
T_IDOC_STATUS-REPID = SY-REPID.
APPEND T_IDOC_STATUS.
CLEAR T_RETURN_VARIABLES.
REFRESH T_RETURN_VARIABLES.
T_RETURN_VARIABLES-DOC_NUMBER = F_IDOC_CONTROL-DOCNUM.
T_RETURN_VARIABLES-WF_PARAM = C_RETV_ERROR_IDOCS.
READ TABLE T_RETURN_VARIABLES WITH KEY T_RETURN_VARIABLES.
IF SY-SUBRC = 0.
MODIFY T_RETURN_VARIABLES INDEX SY-TABIX.
ELSE.
APPEND T_RETURN_VARIABLES.
ENDIF.
ELSE. "i.e. subrc = 0.
IF ( T_BDCMSGCOLL-MSGID = C_MSG_ID_F2 AND
( T_BDCMSGCOLL-MSGNR = C_MSG_NO_035 OR
T_BDCMSGCOLL-MSGNR = C_MSG_NO_056 OR
T_BDCMSGCOLL-MSGNR = C_MSG_NO_170 OR
T_BDCMSGCOLL-MSGNR = C_MSG_NO_171 OR
T_BDCMSGCOLL-MSGNR = C_MSG_NO_172 OR
T_BDCMSGCOLL-MSGNR = C_MSG_NO_173 OR
T_BDCMSGCOLL-MSGNR = C_MSG_NO_174 OR
T_BDCMSGCOLL-MSGNR = C_MSG_NO_175 OR
T_BDCMSGCOLL-MSGNR = C_MSG_NO_679
)
)
OR
( T_BDCMSGCOLL-MSGID = C_MSG_ID_F4 AND
( T_BDCMSGCOLL-MSGNR = C_MSG_F4_311 OR
T_BDCMSGCOLL-MSGNR = C_MSG_F4_312 OR
T_BDCMSGCOLL-MSGNR = C_MSG_F4_313 OR
T_BDCMSGCOLL-MSGNR = C_MSG_F4_764 OR
T_BDCMSGCOLL-MSGNR = C_MSG_F4_765 OR
T_BDCMSGCOLL-MSGNR = C_MSG_F4_766
)
).
*mi/46c begin
* Verbuchung der betriebespezifischen Daten
IF IP_VERT_BETRIEB = 'X'
AND NOT GS_WRF1 IS INITIAL "note 323897
AND GV_LOCNR_ALT IS INITIAL. "note 538221
GV_LOCNR_ALT = GS_WRF1-LOCNR. "note 538221
CALL FUNCTION 'SITE_START_UPDATE'
IMPORTING
O_RETURN_CODE = RETURN_CODE
TABLES
O_ERROR_TABLE = ERRORTABLE.
IF RETURN_CODE = '8'
OR RETURN_CODE = '12'.
V_WORKFLOW_RESULT = C_WF_RESULT_ERR.
REFRESH T_IDOC_STATUS.
REFRESH T_RETURN_VARIABLES.
LOOP AT ERRORTABLE WHERE TYPE CA 'AE'.
CLEAR T_IDOC_STATUS.
T_IDOC_STATUS-DOCNUM = F_IDOC_CONTROL-DOCNUM.
T_IDOC_STATUS-STATUS = C_IDOC_STAT_INPUT_ERROR.
T_IDOC_STATUS-MSGTY = ERRORTABLE-TYPE.
T_IDOC_STATUS-MSGID = ERRORTABLE-ID.
T_IDOC_STATUS-MSGNO = ERRORTABLE-NUMBER.
T_IDOC_STATUS-MSGV1 = ERRORTABLE-MESSAGE_V1.
T_IDOC_STATUS-MSGV2 = ERRORTABLE-MESSAGE_V2.
T_IDOC_STATUS-MSGV3 = ERRORTABLE-MESSAGE_V3.
T_IDOC_STATUS-MSGV4 = ERRORTABLE-MESSAGE_V4.
T_IDOC_STATUS-UNAME = SY-UNAME.
T_IDOC_STATUS-REPID = SY-REPID.
APPEND T_IDOC_STATUS.
CLEAR T_RETURN_VARIABLES.
T_RETURN_VARIABLES-DOC_NUMBER = F_IDOC_CONTROL-DOCNUM.
T_RETURN_VARIABLES-WF_PARAM = C_RETV_ERROR_IDOCS.
READ TABLE T_RETURN_VARIABLES WITH KEY T_RETURN_VARIABLES.
IF SY-SUBRC = 0.
MODIFY T_RETURN_VARIABLES INDEX SY-TABIX.
ELSE.
APPEND T_RETURN_VARIABLES.
ENDIF.
ENDLOOP.
EXIT.
ENDIF.
ENDIF.
*mi/46c end
V_WORKFLOW_RESULT = C_WF_RESULT_OK.
CLEAR T_IDOC_STATUS.
T_IDOC_STATUS-DOCNUM = F_IDOC_CONTROL-DOCNUM.
* Begin of insertion note 446305 / mh.
T_IDOC_STATUS-MSGID = T_BDCMSGCOLL-MSGID.
T_IDOC_STATUS-MSGTY = T_BDCMSGCOLL-MSGTYP.
T_IDOC_STATUS-MSGNO = T_BDCMSGCOLL-MSGNR.
T_IDOC_STATUS-MSGV1 = T_BDCMSGCOLL-MSGV1.
T_IDOC_STATUS-MSGV2 = T_BDCMSGCOLL-MSGV2.
T_IDOC_STATUS-MSGV3 = T_BDCMSGCOLL-MSGV3.
T_IDOC_STATUS-MSGV4 = T_BDCMSGCOLL-MSGV4.
T_IDOC_STATUS-REPID = SY-REPID.
T_IDOC_STATUS-UNAME = SY-UNAME.
* End of insertion note 446305 / mh.
T_IDOC_STATUS-STATUS = C_IDOC_STAT_IS_POSTED.
READ TABLE T_IDOC_STATUS INDEX 1.
IF SY-SUBRC <> 0.
APPEND T_IDOC_STATUS.
ENDIF.
CLEAR T_RETURN_VARIABLES.
T_RETURN_VARIABLES-WF_PARAM = C_RETV_PROCESSED_IDOCS.
T_RETURN_VARIABLES-DOC_NUMBER = F_IDOC_CONTROL-DOCNUM.
READ TABLE T_RETURN_VARIABLES WITH KEY T_RETURN_VARIABLES.
IF SY-SUBRC <> 0.
APPEND T_RETURN_VARIABLES.
ENDIF.
CLEAR T_RETURN_VARIABLES.
T_RETURN_VARIABLES-WF_PARAM = C_RETV_CREATED_OBJECTS.
T_RETURN_VARIABLES-DOC_NUMBER = BKN00-KUNNR.
READ TABLE T_RETURN_VARIABLES WITH KEY T_RETURN_VARIABLES.
IF SY-SUBRC <> 0.
APPEND T_RETURN_VARIABLES.
ENDIF.
ELSE. "i.e. not a success message.
V_WORKFLOW_RESULT = C_WF_RESULT_ERR.
CLEAR T_IDOC_STATUS.
REFRESH T_IDOC_STATUS. "
T_IDOC_STATUS-DOCNUM = F_IDOC_CONTROL-DOCNUM.
T_IDOC_STATUS-STATUS = C_IDOC_STAT_INPUT_ERROR.
T_IDOC_STATUS-MSGTY = SY-MSGTY.
T_IDOC_STATUS-MSGID = T_BDCMSGCOLL-MSGID.
T_IDOC_STATUS-MSGNO = T_BDCMSGCOLL-MSGNR.
T_IDOC_STATUS-MSGV1 = T_BDCMSGCOLL-MSGV1.
T_IDOC_STATUS-MSGV2 = T_BDCMSGCOLL-MSGV2.
T_IDOC_STATUS-MSGV3 = T_BDCMSGCOLL-MSGV3.
T_IDOC_STATUS-MSGV4 = T_BDCMSGCOLL-MSGV4.
T_IDOC_STATUS-UNAME = SY-UNAME.
T_IDOC_STATUS-REPID = SY-REPID.
APPEND T_IDOC_STATUS.
CLEAR T_RETURN_VARIABLES.
REFRESH T_RETURN_VARIABLES.
T_RETURN_VARIABLES-DOC_NUMBER = F_IDOC_CONTROL-DOCNUM.
T_RETURN_VARIABLES-WF_PARAM = C_RETV_ERROR_IDOCS.
APPEND T_RETURN_VARIABLES.
ENDIF. "if t_bdcmsgcoll-msgid = c_msg_id_f2 and ...
ENDIF. "if subrc <> 0.
SUBRC is 0 because CALL TRANSACTION was a success - but internal table T_BDCMSGCOLL is empty and because of that this line comes into effect:
T_IDOC_STATUS-STATUS = C_IDOC_STAT_INPUT_ERROR.
The problem seems to be that no success message is returned from CALL TRANSACTION. I just haven't been able to determine WHY no success message is returned...
Any thoughts?