‎2005 Jul 08 2:30 PM
Hello All,
I am using call transaction method to post the document and if the call transaction fails I need to create a BDC session for later processing and return the session ID. I am okay with the call trasaction part but I don't know how create a session if call trasaction fails. Can somebody please help me figure out this problem?
Thanks,
Chandu
‎2005 Jul 08 2:42 PM
Hi Chandu,
Take a look at the following code :
CALL TRANSACTION 'V-03' USING W_BDCDATA MODE 'N' UPDATE 'S'
MESSAGES INTO W_MESSTAB.
* Si subrc <> 0 : Batch input
IF SY-SUBRC <> 0.
W_COMPT_ERR = W_COMPT_ERR + 1.
IF W_COMPT_ERR EQ 1.
* Open BI
PERFORM TREAT_BDC TABLES WE_BDCDATA
USING P_BATCH ' ' 'O'.
ENDIF.
* Insert BI
PERFORM TREAT_BDC TABLES WE_BDCDATA
USING ' ' 'V-03' 'I'.
ELSE.
REFRESH W_BDCDATA.
ENDIF.
...
* closing of bi session if created
IF W_COMPT_ERR > '0'.
PERFORM TREAT_BDC TABLES WE_BDCDATA
USING ' ' 'V-03' 'C'.
ENDIF.
*-------------------------------------------------------*
* FORM TREAT_BDC
**------------------------------------------------------
* Error treatment creating a Bacth Input session
*------------------------------------------------------
*- wf_bdcdata: internal table type BDCDATA,
*- wf_dossier: Batch Input session name wf_trans:
* transaction code
* - wf_mode: O, I, OR C.
*----------------------------------------------------*
FORM TREAT_BDC TABLES WF_BDCDATA
USING WF_DOSSIER WF_TRANS WF_MODE.
* Open Batch Input
IF WF_MODE = 'O'.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
* DEST = FILLER8
GROUP = WF_DOSSIER
* HOLDDATE = FILLER8
* KEEP = FILLER1
USER = SY-UNAME
* RECORD = FILLER1
* IMPORTING
* QID =
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.
IF SY-SUBRC <> 0.
MESSAGE E016 WITH WF_DOSSIER.
ENDIF.
ENDIF.
* Call BDC_INSERT
IF WF_MODE = 'I'.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = 'V-03'
* POST_LOCAL = NOVBLOCAL
* PRINTING = NOPRINT
TABLES
DYNPROTAB = W_BDCDATA
EXCEPTIONS
INTERNAL_ERROR = 1
NOT_OPEN = 2
QUEUE_ERROR = 3
TCODE_INVALID = 4
PRINTING_INVALID = 5
POSTING_INVALID = 6
OTHERS = 7.
IF SY-SUBRC <> 0.
MESSAGE E017 WITH WF_TRANS.
ENDIF.
REFRESH W_BDCDATA.
ENDIF.
* Closing Batch Input
IF WF_MODE = 'C'.
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
MESSAGE E018.
ENDIF.
ENDIF.
ENDFORM.
Hope it helps,
Erwan.
‎2005 Jul 08 2:36 PM
Hello,
call transaction ... using wt_bdcdata ...
if sy-subrc ne space.
call function 'BDC_OPEN_GROUP' ....
call function 'BDC_INSERT' ... (using wt_bdcdata)
call function 'BDC_CLOSE_GROUP' ....
endif.
and if you need to call the batch immediatly look at the program RSBDCSUB
Regards
Frédéric
‎2005 Jul 08 2:53 PM
‎2005 Jul 08 2:58 PM
‎2005 Jul 08 4:38 PM
Erwan,
I did try to reward you but I got some error message. how do I do that?
chandu
‎2005 Jul 08 2:42 PM
Hi Chandu,
Take a look at the following code :
CALL TRANSACTION 'V-03' USING W_BDCDATA MODE 'N' UPDATE 'S'
MESSAGES INTO W_MESSTAB.
* Si subrc <> 0 : Batch input
IF SY-SUBRC <> 0.
W_COMPT_ERR = W_COMPT_ERR + 1.
IF W_COMPT_ERR EQ 1.
* Open BI
PERFORM TREAT_BDC TABLES WE_BDCDATA
USING P_BATCH ' ' 'O'.
ENDIF.
* Insert BI
PERFORM TREAT_BDC TABLES WE_BDCDATA
USING ' ' 'V-03' 'I'.
ELSE.
REFRESH W_BDCDATA.
ENDIF.
...
* closing of bi session if created
IF W_COMPT_ERR > '0'.
PERFORM TREAT_BDC TABLES WE_BDCDATA
USING ' ' 'V-03' 'C'.
ENDIF.
*-------------------------------------------------------*
* FORM TREAT_BDC
**------------------------------------------------------
* Error treatment creating a Bacth Input session
*------------------------------------------------------
*- wf_bdcdata: internal table type BDCDATA,
*- wf_dossier: Batch Input session name wf_trans:
* transaction code
* - wf_mode: O, I, OR C.
*----------------------------------------------------*
FORM TREAT_BDC TABLES WF_BDCDATA
USING WF_DOSSIER WF_TRANS WF_MODE.
* Open Batch Input
IF WF_MODE = 'O'.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
* DEST = FILLER8
GROUP = WF_DOSSIER
* HOLDDATE = FILLER8
* KEEP = FILLER1
USER = SY-UNAME
* RECORD = FILLER1
* IMPORTING
* QID =
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.
IF SY-SUBRC <> 0.
MESSAGE E016 WITH WF_DOSSIER.
ENDIF.
ENDIF.
* Call BDC_INSERT
IF WF_MODE = 'I'.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = 'V-03'
* POST_LOCAL = NOVBLOCAL
* PRINTING = NOPRINT
TABLES
DYNPROTAB = W_BDCDATA
EXCEPTIONS
INTERNAL_ERROR = 1
NOT_OPEN = 2
QUEUE_ERROR = 3
TCODE_INVALID = 4
PRINTING_INVALID = 5
POSTING_INVALID = 6
OTHERS = 7.
IF SY-SUBRC <> 0.
MESSAGE E017 WITH WF_TRANS.
ENDIF.
REFRESH W_BDCDATA.
ENDIF.
* Closing Batch Input
IF WF_MODE = 'C'.
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
MESSAGE E018.
ENDIF.
ENDIF.
ENDFORM.
Hope it helps,
Erwan.
‎2005 Jul 08 2:52 PM
‎2005 Jul 08 2:58 PM
Hi Chandu,
After calling the call transaction i.e.
<b> call transaction tcode using bdcdata
mode ctumode
update cupdate
messages into messtab.</b>
Then perform this,
<b>loop at messtab.
if messtab-msgtyp ne 'S'.
<i>< call BDC_INSERT to create a session.></i>
endif.
endloop.</b>
When messtab-msgtyp is not equal to 'S' the recors have failed and hence a session will be created.
Hope that solves your problem.
Cheers
Kathir~