‎2008 Nov 05 2:34 PM
Hi experts,
I am creating a custom idoc. The custom idoc has one parent segment(zhead1) and a child segment(zinvoice).
I am populating the invoice numbers(BELNR) and their line items in the child segment against a particular check number(PAYR_CHECT).
The structure is coming something like this: If a check has 2 different invoices each having two diff. line items, then 4child segment(containing invoice no. and it's respective line item in one child segment) is getting created against a parent segment(containing check header details).
But I require a parent segment to get populated against each check no. as well as invoice number and the invoice line items to be in the child segment of the invoice header segment.
How to do this.
My current code is:
LOOP AT T_ZCHKHDR INTO WA_ZCHKHDR.
CLEAR T_IDOC_DATA.
Fill the header segment
ZCHKHDR-ZBUKR = WA_ZCHKHDR-ZBUKR.
ZCHKHDR-CHECT = WA_ZCHKHDR-CHECT.
ZCHKHDR-ZALDT = WA_ZCHKHDR-ZALDT.
ZCHKHDR-VOIDD = WA_ZCHKHDR-VOIDD.
ZCHKHDR-RWBTR = WA_ZCHKHDR-RWBTR.
ZCHKHDR-STATUS = WA_ZCHKHDR-STATUS.
ZCHKHDR-BANKA = WA_ZCHKHDR-BANKA.
ZCHKHDR-RZAWE = WA_ZCHKHDR-RZAWE.
ZCHKHDR-XBLNR = WA_ZCHKHDR-XBLNR.
ZCHKHDR-LIFNR = WA_ZCHKHDR-LIFNR.
ZCHKHDR-WMWST1 = WA_ZCHKHDR-WMWST1.
ZCHKHDR-BKTXT = WA_ZCHKHDR-BKTXT.
T_IDOC_DATA-SDATA = ZCHKHDR.
*-- Reduce fields for the segment
CALL FUNCTION 'IDOC_REDUCTION_FIELD_REDUCE'
EXPORTING
MESSAGE_TYPE = C_MSG_TYPE
SEGMENT_TYPE = C_SEGNAM_ZCHKHDR
SEGMENT_DATA = T_IDOC_DATA-SDATA
EMPTY_SYMBOL = C_SLASH
IMPORTING
SEGMENT_DATA = T_IDOC_DATA-SDATA.
T_IDOC_DATA-SEGNAM = C_SEGNAM_ZCHKHDR.
T_IDOC_DATA-MANDT = SY-MANDT.
APPEND T_IDOC_DATA.
Fill the item segment
LOOP AT T_ZCHKLN INTO WA_ZCHKLN WHERE CHECT = ZCHKHDR-CHECT.
ZCHKLN-CHECT = WA_ZCHKLN-CHECT.
ZCHKLN-EBELN = WA_ZCHKLN-EBELN.
ZCHKLN-PO_EBELP = WA_ZCHKLN-PO_EBELP.
ZCHKLN-PO_WERKS = WA_ZCHKLN-PO_WERKS.
ZCHKLN-PO_KOSTL = WA_ZCHKLN-PO_KOSTL.
ZCHKLN-PO_WBS = WA_ZCHKLN-PO_WBS.
ZCHKLN-PO_SAKTO = WA_ZCHKLN-PO_SAKTO.
ZCHKLN-BELNR = WA_ZCHKLN-BELNR.
ZCHKLN-IN_BUZEI = WA_ZCHKLN-IN_BUZEI.
ZCHKLN-IN_MENGE = WA_ZCHKLN-IN_MENGE.
ZCHKLN-IN_MWSKZ = WA_ZCHKLN-IN_MWSKZ.
ZCHKLN-IN_WRBTR = WA_ZCHKLN-IN_WRBTR.
ZCHKLN-IN_BSTME = WA_ZCHKLN-IN_BSTME.
T_IDOC_DATA-SDATA = ZCHKLN.
*-- Reduce fields for the segment
CALL FUNCTION 'IDOC_REDUCTION_FIELD_REDUCE'
EXPORTING
MESSAGE_TYPE = C_MSG_TYPE
SEGMENT_TYPE = C_SEGNAM_ZCHKLN
SEGMENT_DATA = T_IDOC_DATA-SDATA
EMPTY_SYMBOL = C_SLASH
IMPORTING
SEGMENT_DATA = T_IDOC_DATA-SDATA.
T_IDOC_DATA-SEGNAM = C_SEGNAM_ZCHKLN.
T_IDOC_DATA-HLEVEL = 2.
T_IDOC_DATA-MANDT = SY-MANDT.
APPEND T_IDOC_DATA.
ENDIF.
CLEAR: WA_ZCHKLN.
ENDLOOP.
AT LAST.
PERFORM SUB_MASTER_IDOC_CONTROL.
T_IDOC_HEADER-MESTYP = C_MSG_TYPE.
T_IDOC_HEADER-IDOCTP = C_IDOC_TYPE.
SELECT SINGLE PARNUM FROM EDPP1
INTO V_SDNPRN
WHERE PARTYP = C_LS. "#EC
T_IDOC_HEADER-SNDPRN = V_SDNPRN.
T_IDOC_HEADER-SNDPRT = C_LS.
T_IDOC_HEADER-OUTMOD = C_OUTMOD.
T_IDOC_HEADER-STDMES = C_STDMES.
T_IDOC_HEADER-RCVPFC = V_RCVPFC.
T_IDOC_HEADER-RCVPRN = V_RCVPRN.
T_IDOC_HEADER-RCVPOR = V_RCVPOR.
T_IDOC_HEADER-RCVPRT = C_LS.
DESCRIBE TABLE T_IDOC_DATA LINES V_LINES.
IF V_LINES > 0.
CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
EXPORTING
MASTER_IDOC_CONTROL = T_IDOC_HEADER
TABLES
COMMUNICATION_IDOC_CONTROL = T_COMM_IDOC_CONTROL
MASTER_IDOC_DATA = T_IDOC_DATA
EXCEPTIONS
ERROR_IN_IDOC_CONTROL = 1
ERROR_WRITING_IDOC_STATUS = 2
ERROR_IN_IDOC_DATA = 3
SENDING_LOGICAL_SYSTEM_UNKNOWN = 4
OTHERS = 5.
IF SY-SUBRC = 0.
READ TABLE T_COMM_IDOC_CONTROL INTO WA_COMM_IDOC_CONTROL INDEX 1.
IF SY-SUBRC = 0.
MESSAGE S000(ZFI) WITH WA_COMM_IDOC_CONTROL-DOCNUM.
ENDIF.
ELSE.
MESSAGE W001(ZMM) WITH TEXT-003.
ENDIF.
ENDIF.
CLEAR T_IDOC_DATA.
REFRESH T_IDOC_DATA.
ENDAT.
CLEAR: WA_ZCHKHDR.
ENDLOOP.
Regards,
Sangeeta.
‎2008 Nov 05 2:45 PM
As many entries you have in t_zchkhdr those many headers will be created for header and as many entries you have in t_zchkln , those many entries will be created in line.
I hope you have the occurences as 1 to many for lines.
Also you are distributing the IDoc within the loop at t_zchkhdr so one IDoc will be created per t_zchkhdr line.
If you want one Idoc containing all the headers, then move the MASTER_IDOC_DISTRIBUTE outside the outer loop.
regards,
Advait
Edited by: Advait Gode on Nov 5, 2008 3:46 PM
‎2008 Nov 05 2:45 PM
As many entries you have in t_zchkhdr those many headers will be created for header and as many entries you have in t_zchkln , those many entries will be created in line.
I hope you have the occurences as 1 to many for lines.
Also you are distributing the IDoc within the loop at t_zchkhdr so one IDoc will be created per t_zchkhdr line.
If you want one Idoc containing all the headers, then move the MASTER_IDOC_DISTRIBUTE outside the outer loop.
regards,
Advait
Edited by: Advait Gode on Nov 5, 2008 3:46 PM