Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

idoc segment population logic needed

Former Member
0 Likes
893

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.

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
537

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

1 REPLY 1
Read only

Former Member
0 Likes
538

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