I doubt it is the code because it works fine if I pass it a single order. The code basically blows out the order to get more details (confirmation numbers), and assigns a flag for a header record. I wonder if the datapackage is somehow splitting out the detailed records and not allowing me to fully loop through them to assign a header record flag. Is that possible? If I de-activate the code, I won't get the detail records.
I'm certainly no ABAP expert, here is my code:
REPORT ZBWIN_2LIS_04_P_ARBPL.
TYPE-POOLS: SBIWA.
*&---------------------------------------------------------------------*
*& Form EXECUTE_USER_EXIT
*&---------------------------------------------------------------------*
* -->P_I_T_SELECT
* -->P_I_T_FIELDS
* -->P_C_T_DATA
* -->P_C_T_MESSAGES
*----------------------------------------------------------------------*
FORM execute_user_exit
TABLES I_T_SELECT TYPE SBIWA_T_SELECT
I_T_FIELDS TYPE SBIWA_T_FIELDS
C_T_DATA STRUCTURE MC04P_0ARB " Datasource extract structure
C_T_MESSAGES STRUCTURE BALMI.
TYPES:
BEGIN OF struct_AFRU,
* Name of the person who entered the confirmation
ERNAM TYPE AFRU-ERNAM,
* Confirmation counter
RMZHL TYPE AFRU-RMZHL,
* Previously confirmed yield in order unit of measure
GMNGA TYPE AFRU-GMNGA,
* Confirmation unit of measure
MEINH TYPE AFRU-MEINH,
* Partial/Final Confirmation
AUERU TYPE AFRU-AUERU,
* Indicator: Milestone confirmation carried out
MEILR TYPE AFRU-MEILR,
* Confirmed time for 'Processing start'
ISBZ TYPE AFRU-ISBZ,
* Confirmed time for 'processing finish'
IEBZ TYPE AFRU-IEBZ,
* Confirmed date for 'Processing start'
ISBD TYPE AFRU-ISBD,
* Confirmed date for 'processing finish'
IEBD TYPE AFRU-IEBD,
* order number
AUFNR TYPE AFRU-AUFNR,
* Completion confirmation number for the operation
RUECK TYPE AFRU-RUECK,
* Posting date
BUDAT TYPE AFRU-BUDAT,
* Reason for Variance
GRUND TYPE AFRU-GRUND,
* Confirmed date for execution finish
IEDD TYPE AFRU-IEDD,
* Confirmed time for 'Execution finish'
IEDZ TYPE AFRU-IEDZ,
* Unit of measure for the activity to be confirmed
ILE01 TYPE AFRU-ILE01,
ILE02 TYPE AFRU-ILE02,
ILE03 TYPE AFRU-ILE03,
ILE04 TYPE AFRU-ILE04,
ILE05 TYPE AFRU-ILE05,
ILE06 TYPE AFRU-ILE06,
* Confirmed date for start of execution
ISDD TYPE AFRU-ISDD,
* Confirmed time for 'Execution start'
ISDZ TYPE AFRU-ISDZ,
* Activity Currently to be Confirmed
ISM01 TYPE AFRU-ISM01,
ISM02 TYPE AFRU-ISM02,
ISM03 TYPE AFRU-ISM03,
ISM04 TYPE AFRU-ISM04,
ISM05 TYPE AFRU-ISM05,
ISM06 TYPE AFRU-ISM06,
* Yield to Be Confirmed
LMNGA TYPE AFRU-LMNGA,
* Wage group
LOGRP TYPE AFRU-LOGRP,
* Personnel number
PERNR TYPE AFRU-PERNR,
* Suitability
QUALF TYPE AFRU-QUALF,
* Current rework quantity to be confirmed
RMNGA TYPE AFRU-RMNGA,
* Activity Number
VORNR TYPE AFRU-VORNR,
* Plant
WERKS TYPE AFRU-WERKS,
* Confirmation counter of cancelled confirmation
STZHL TYPE AFRU-STZHL,
END OF struct_AFRU,
BEGIN OF struct_AUFK,
* order number
AUFNR TYPE AUFK-AUFNR,
* Time created
ERFZEIT TYPE AUFK-ERFZEIT,
END OF struct_AUFK,
BEGIN OF struct_QALS,
* order number
AUFNR TYPE QALS-AUFNR,
* Inspection Lot Number
PRUEFLOS TYPE QALS-PRUEFLOS,
END OF struct_QALS,
BEGIN OF struct_VIQMEL,
* production order number
FERTAUFNR TYPE VIQMEL-FERTAUFNR,
* Notification Number
QMNUM TYPE VIQMEL-QMNUM,
END OF struct_VIQMEL,
BEGIN OF struct_VIQMFE,
* Notification Number
QMNUM TYPE VIQMFE-QMNUM,
* Problem
FECOD TYPE VIQMFE-FECOD,
* Catalog Type - Problems/Defects
FEKAT TYPE VIQMFE-FEKAT,
* Code Group - Problem
FEGRP TYPE VIQMFE-FEGRP,
END OF struct_VIQMFE.
DATA:
* used for only assigning header flag once per order number. this flag is for marking records
* to be used for reporting like the t-code COOIS for order headers
header_assigned TYPE N,
* this is to ensure that the header flag is copied only once
* when blowing out records joined from AFRU
header_assigned_2 TYPE N,
* store number of defects found for a QMNUM
num_defects TYPE N,
* counter to only add a set of KF's once populated
* from extractor (see loop where used below)
defect_counter TYPE N,
* used to record the last order number in the loop at c_t_data
last_AUFNR TYPE AFRU-AUFNR,
* work areas
wa_2LIS_04_P_ARBPL TYPE MC04P_0ARB,
wa_AFRU TYPE struct_AFRU,
wa_AUFK TYPE struct_AUFK,
wa_QALS TYPE struct_QALS,
wa_VIQMEL TYPE struct_VIQMEL,
wa_VIQMFE TYPE struct_VIQMFE,
* internal tables
itab_AFRU TYPE STANDARD TABLE OF struct_AFRU,
itab_AUFK TYPE STANDARD TABLE OF struct_AUFK,
itab_QALS TYPE STANDARD TABLE OF struct_QALS,
itab_VIQMEL TYPE STANDARD TABLE OF struct_VIQMEL,
itab_VIQMFE TYPE STANDARD TABLE OF struct_VIQMFE,
itab_C_T_DATA TYPE STANDARD TABLE OF MC04P_0ARB.
FIELD-SYMBOLS: <fs_AFRU> TYPE struct_AFRU,
<fs_AUFK> TYPE struct_AUFK,
<fs_QALS> TYPE struct_QALS,
<fs_VIQMEL> TYPE struct_VIQMEL,
<fs_VIQMFE> TYPE struct_VIQMFE,
<fs_itab_C_T_DATA> TYPE MC04P_0ARB.
CLEAR: wa_2LIS_04_P_ARBPL,
wa_AFRU,
wa_AUFK,
wa_QALS,
wa_VIQMEL,
wa_VIQMFE.
REFRESH: itab_AFRU,
itab_AUFK,
itab_QALS,
itab_VIQMEL,
itab_VIQMFE,
itab_C_T_DATA.
* get the required fields from AFRU into itab_AFRU
* on order (AUFNR).
* this data is mainly for order confirmations/counts from t-code COOIS
SELECT
ERNAM
RMZHL
GMNGA
MEINH
AUERU
MEILR
ISBZ
IEBZ
ISBD
IEBD
AUFNR
RUECK
BUDAT
GRUND
IEDD
IEDZ
ILE01
ILE02
ILE03
ILE04
ILE05
ILE06
ISDD
ISDZ
ISM01
ISM02
ISM03
ISM04
ISM05
ISM06
LMNGA
LOGRP
PERNR
QUALF
RMNGA
VORNR
WERKS
STZHL
INTO TABLE itab_AFRU
FROM AFRU
FOR ALL ENTRIES IN C_T_DATA
WHERE AUFNR = C_T_DATA-AUFNR.
* get time created for order headers
SELECT
AUFNR
ERFZEIT
INTO TABLE itab_AUFK
FROM AUFK
FOR ALL ENTRIES IN C_T_DATA
WHERE AUFNR = C_T_DATA-AUFNR.
* get inspection lots by orders
SELECT
AUFNR
PRUEFLOS
INTO TABLE itab_QALS
FROM QALS
FOR ALL ENTRIES IN C_T_DATA
WHERE AUFNR = C_T_DATA-AUFNR.
* get Quality Notifications by orders
SELECT
FERTAUFNR
QMNUM
INTO TABLE itab_VIQMEL
FROM VIQMEL
FOR ALL ENTRIES IN C_T_DATA
WHERE FERTAUFNR = C_T_DATA-AUFNR.
* get defect info by QN
SELECT
QMNUM
FECOD
FEKAT
FEGRP
INTO TABLE itab_VIQMFE
FROM VIQMFE
FOR ALL ENTRIES IN itab_VIQMEL
WHERE QMNUM = itab_VIQMEL-QMNUM.
* sort by order number, confirmation, counter
SORT itab_AFRU BY AUFNR RUECK RMZHL DESCENDING.
SORT itab_AUFK BY AUFNR DESCENDING.
SORT itab_QALS BY AUFNR DESCENDING.
SORT itab_VIQMEL BY FERTAUFNR DESCENDING.
SORT itab_VIQMFE BY QMNUM DESCENDING.
* sort by order number and confirmations - this is for assigning header flags
SORT C_T_DATA BY AUFNR XMNGA DESCENDING.
* initialize assigned header flag
header_assigned = 0.
LOOP AT C_T_DATA INTO wa_2LIS_04_P_ARBPL.
* populate ZZERFZEIT (Time created)
READ TABLE itab_AUFK WITH KEY
AUFNR = wa_2LIS_04_P_ARBPL-AUFNR
ASSIGNING <fs_AUFK>.
IF sy-subrc = 0.
wa_2LIS_04_P_ARBPL-ZZERFZEIT = <fs_AUFK>-ERFZEIT.
ENDIF.
* populate ZZINSPLOT (Inspection lot)
READ TABLE itab_QALS WITH KEY
AUFNR = wa_2LIS_04_P_ARBPL-AUFNR
ASSIGNING <fs_QALS>.
IF sy-subrc = 0.
wa_2LIS_04_P_ARBPL-ZZINSPLOT = <fs_QALS>-PRUEFLOS.
ENDIF.
* populate ZZQN (Notification Number)
READ TABLE itab_VIQMEL WITH KEY
FERTAUFNR = wa_2LIS_04_P_ARBPL-AUFNR
ASSIGNING <fs_VIQMEL>.
IF sy-subrc = 0.
wa_2LIS_04_P_ARBPL-ZZQN = <fs_VIQMEL>-QMNUM.
ENDIF.
* if there is a scrap value (XMNGA > 0), mark that to be used as the order header record
* at this point it appears that there is only one record per order number containing a value for scrap
* including confirmations
* only reset (meaning header_assigned = 0) the header_assigned flag if a header has already been assigned (=1)
* and its for a new order number in the loop
* reset header assigned flag when looking at a new order number
* and a header has not been assigned
*IF wa_2LIS_04_P_ARBPL-AUFNR = '000001119283'.
* break-point.
*ENDIF.
IF last_AUFNR <> wa_2LIS_04_P_ARBPL-AUFNR AND header_assigned = 1.
header_assigned = 0.
ENDIF.
IF ( wa_2LIS_04_P_ARBPL-XMNGA > 0 AND header_assigned = 0 ) OR
( last_AUFNR <> wa_2LIS_04_P_ARBPL-AUFNR AND header_assigned = 0 ).
wa_2LIS_04_P_ARBPL-ZZHEADERFLAG = 'X'.
header_assigned = 1.
ENDIF.
* record last order number
last_AUFNR = wa_2LIS_04_P_ARBPL-AUFNR.
* search on order number (AUFNR) and confirmation number (RUECK)
READ TABLE itab_AFRU WITH KEY
AUFNR = wa_2LIS_04_P_ARBPL-AUFNR
RUECK = wa_2LIS_04_P_ARBPL-RUECK
ASSIGNING <fs_AFRU>.
* get a hit on AFRU - Order Confirmations
IF sy-subrc = 0.
* initialize the second header assigned flag to ensure the header is only assigned on one record
header_assigned_2 = 0.
* blow out records for counters
LOOP AT itab_AFRU INTO wa_AFRU WHERE
AUFNR = wa_2LIS_04_P_ARBPL-AUFNR AND
RUECK = wa_2LIS_04_P_ARBPL-RUECK.
* only assign header once. if a header was assigned on one record(=1)
* blank the header flag for other records
IF header_assigned_2 = 1.
wa_2LIS_04_P_ARBPL-ZZHEADERFLAG = ''.
* if there was a header assigned, populate defects on header record
ELSEIF wa_2LIS_04_P_ARBPL-ZZHEADERFLAG = 'X' AND header_assigned_2 = 0.
* header assigned for records from AFRU
header_assigned_2 = 1.
* get number of defects
DESCRIBE TABLE itab_VIQMFE LINES num_defects.
* if there is a header assigned, check for defects via looping
* must have a QN to have defects and I am placing defects on the header record only
LOOP AT itab_VIQMFE INTO wa_VIQMFE
WHERE QMNUM = wa_2LIS_04_P_ARBPL-ZZQN.
wa_2LIS_04_P_ARBPL-ZZFECOD = wa_VIQMFE-FECOD.
wa_2LIS_04_P_ARBPL-ZZFEKAT = wa_VIQMFE-FEKAT.
wa_2LIS_04_P_ARBPL-ZZFEGRP = wa_VIQMFE-FEGRP.
* defect_counter = defect_counter + 1.
* only add more records if there is more than 1 defect
* (if just one defect will be appended on bottom on the current line)
IF num_defects > 1.
* when adding records for defects where fields ARE populated from AFRU, zero out key figure values to avoid doubling data on header records,
* fields below are popualted from AFRU further down and only populated on one record
wa_2LIS_04_P_ARBPL-GMNGA = 0.
wa_2LIS_04_P_ARBPL-LMNGA = 0.
wa_2LIS_04_P_ARBPL-ISM01 = 0.
wa_2LIS_04_P_ARBPL-ISM02 = 0.
wa_2LIS_04_P_ARBPL-ISM03 = 0.
wa_2LIS_04_P_ARBPL-ISM04 = 0.
wa_2LIS_04_P_ARBPL-ISM05 = 0.
wa_2LIS_04_P_ARBPL-ISM06 = 0.
* for these fields below we only want to zero them AFTER one header record has been loaded,
* since they are NOT re-populated from AFRU. zero the rest to avoid doubling.
IF defect_counter > 0.
wa_2LIS_04_P_ARBPL-I_DLZ = 0.
wa_2LIS_04_P_ARBPL-MGVRG = 0.
wa_2LIS_04_P_ARBPL-ZGR01 = 0.
wa_2LIS_04_P_ARBPL-ZGR02 = 0.
wa_2LIS_04_P_ARBPL-ZGR03 = 0.
wa_2LIS_04_P_ARBPL-ZGR04 = 0.
wa_2LIS_04_P_ARBPL-ZGR05 = 0.
wa_2LIS_04_P_ARBPL-ZGR06 = 0.
ENDIF.
defect_counter = defect_counter + 1.
* if more than 1 defect, append all but the last one as it will get appended with the AFRU fields below
IF defect_counter < num_defects.
APPEND wa_2LIS_04_P_ARBPL TO itab_C_T_DATA.
ENDIF.
ENDIF.
ENDLOOP.
defect_counter = 0.
ENDIF.
*** from wa_AFRU ***
* if there order & confirmation combinations with multiple defects
* populate the other characteristics on the new records containing
* the defects
IF num_defects > 1.
LOOP AT itab_C_T_DATA ASSIGNING <fs_itab_C_T_DATA> WHERE
AUFNR = wa_AFRU-AUFNR AND
RUECK = wa_AFRU-RUECK.
* characteristics
<fs_itab_C_T_DATA>-ZZERNAM = wa_AFRU-ERNAM.
<fs_itab_C_T_DATA>-ZZRMZHL = wa_AFRU-RMZHL.
<fs_itab_C_T_DATA>-ZZAUERU = wa_AFRU-AUERU.
<fs_itab_C_T_DATA>-ZZMEILR = wa_AFRU-MEILR.
<fs_itab_C_T_DATA>-ZZISBZ = wa_AFRU-ISBZ.
<fs_itab_C_T_DATA>-ZZIEBZ = wa_AFRU-IEBZ.
<fs_itab_C_T_DATA>-ZZISBD = wa_AFRU-ISBD.
<fs_itab_C_T_DATA>-ZZIEBD = wa_AFRU-IEBD.
<fs_itab_C_T_DATA>-BUDAT = wa_AFRU-BUDAT.
<fs_itab_C_T_DATA>-GRUND = wa_AFRU-GRUND.
<fs_itab_C_T_DATA>-IEDD = wa_AFRU-IEDD.
<fs_itab_C_T_DATA>-IEDZ = wa_AFRU-IEDZ.
<fs_itab_C_T_DATA>-ISDD = wa_AFRU-ISDD.
<fs_itab_C_T_DATA>-ISDZ = wa_AFRU-ISDZ.
<fs_itab_C_T_DATA>-LOGRP = wa_AFRU-LOGRP.
<fs_itab_C_T_DATA>-PERNR = wa_AFRU-PERNR.
<fs_itab_C_T_DATA>-QUALF = wa_AFRU-QUALF.
<fs_itab_C_T_DATA>-VORNR = wa_AFRU-VORNR.
<fs_itab_C_T_DATA>-WERKS = wa_AFRU-WERKS.
ENDLOOP.
num_defects = 0.
ENDIF.
* if there is only one record for an order/confirmation combo
* it will get the kfs assigned below. also, if there were multiple records
* due to defects, the last record will get the kfs assigned below on
* one record
* check STZHL / Confirmation counter of cancelled confirmation = 1 (true)
* if canceled reverse yield and confirmation activity
IF wa_AFRU-STZHL = 1.
wa_2LIS_04_P_ARBPL-ZZGMNGA = wa_AFRU-GMNGA * -1.
wa_2LIS_04_P_ARBPL-ISM01 = wa_AFRU-ISM01 * -1.
wa_2LIS_04_P_ARBPL-ISM02 = wa_AFRU-ISM02 * -1.
wa_2LIS_04_P_ARBPL-ISM03 = wa_AFRU-ISM03 * -1.
wa_2LIS_04_P_ARBPL-ISM04 = wa_AFRU-ISM04 * -1.
wa_2LIS_04_P_ARBPL-ISM05 = wa_AFRU-ISM05 * -1.
wa_2LIS_04_P_ARBPL-ISM06 = wa_AFRU-ISM06 * -1.
ELSE.
wa_2LIS_04_P_ARBPL-ZZGMNGA = wa_AFRU-GMNGA.
wa_2LIS_04_P_ARBPL-ISM01 = wa_AFRU-ISM01.
wa_2LIS_04_P_ARBPL-ISM02 = wa_AFRU-ISM02.
wa_2LIS_04_P_ARBPL-ISM03 = wa_AFRU-ISM03.
wa_2LIS_04_P_ARBPL-ISM04 = wa_AFRU-ISM04.
wa_2LIS_04_P_ARBPL-ISM05 = wa_AFRU-ISM05.
wa_2LIS_04_P_ARBPL-ISM06 = wa_AFRU-ISM06.
ENDIF.
* characteristics
wa_2LIS_04_P_ARBPL-ZZERNAM = wa_AFRU-ERNAM.
wa_2LIS_04_P_ARBPL-ZZRMZHL = wa_AFRU-RMZHL.
wa_2LIS_04_P_ARBPL-ZZAUERU = wa_AFRU-AUERU.
wa_2LIS_04_P_ARBPL-ZZMEILR = wa_AFRU-MEILR.
wa_2LIS_04_P_ARBPL-ZZISBZ = wa_AFRU-ISBZ.
wa_2LIS_04_P_ARBPL-ZZIEBZ = wa_AFRU-IEBZ.
wa_2LIS_04_P_ARBPL-ZZISBD = wa_AFRU-ISBD.
wa_2LIS_04_P_ARBPL-ZZIEBD = wa_AFRU-IEBD.
wa_2LIS_04_P_ARBPL-BUDAT = wa_AFRU-BUDAT.
wa_2LIS_04_P_ARBPL-GRUND = wa_AFRU-GRUND.
wa_2LIS_04_P_ARBPL-IEDD = wa_AFRU-IEDD.
wa_2LIS_04_P_ARBPL-IEDZ = wa_AFRU-IEDZ.
wa_2LIS_04_P_ARBPL-ISDD = wa_AFRU-ISDD.
wa_2LIS_04_P_ARBPL-ISDZ = wa_AFRU-ISDZ.
wa_2LIS_04_P_ARBPL-LOGRP = wa_AFRU-LOGRP.
wa_2LIS_04_P_ARBPL-PERNR = wa_AFRU-PERNR.
wa_2LIS_04_P_ARBPL-QUALF = wa_AFRU-QUALF.
wa_2LIS_04_P_ARBPL-VORNR = wa_AFRU-VORNR.
wa_2LIS_04_P_ARBPL-WERKS = wa_AFRU-WERKS.
* kfs
wa_2LIS_04_P_ARBPL-ZZMEINH = wa_AFRU-MEINH.
wa_2LIS_04_P_ARBPL-ILE01 = wa_AFRU-ILE01.
wa_2LIS_04_P_ARBPL-ILE02 = wa_AFRU-ILE02.
wa_2LIS_04_P_ARBPL-ILE03 = wa_AFRU-ILE03.
wa_2LIS_04_P_ARBPL-ILE04 = wa_AFRU-ILE04.
wa_2LIS_04_P_ARBPL-ILE05 = wa_AFRU-ILE05.
wa_2LIS_04_P_ARBPL-ILE06 = wa_AFRU-ILE06.
wa_2LIS_04_P_ARBPL-LMNGA = wa_AFRU-LMNGA.
wa_2LIS_04_P_ARBPL-MEINH = wa_AFRU-MEINH.
wa_2LIS_04_P_ARBPL-RMNGA = wa_AFRU-RMNGA.
APPEND wa_2LIS_04_P_ARBPL TO itab_C_T_DATA.
ENDLOOP.
* no hit on AFRU - Order Confirmations
* if there is a header assigned, check for defects via looping
* must have a QN to have defects and I am placing defects on the header record only
ELSEIF wa_2LIS_04_P_ARBPL-ZZHEADERFLAG = 'X'.
* populate defects by QMNUM (QN)
LOOP AT itab_VIQMFE INTO wa_VIQMFE
WHERE QMNUM = wa_2LIS_04_P_ARBPL-ZZQN.
wa_2LIS_04_P_ARBPL-ZZFECOD = wa_VIQMFE-FECOD.
wa_2LIS_04_P_ARBPL-ZZFEKAT = wa_VIQMFE-FEKAT.
wa_2LIS_04_P_ARBPL-ZZFEGRP = wa_VIQMFE-FEGRP.
APPEND wa_2LIS_04_P_ARBPL TO itab_C_T_DATA.
ENDLOOP.
* ELSE, did not blow out records from AFRU and not a header
ELSE.
APPEND wa_2LIS_04_P_ARBPL TO itab_C_T_DATA.
ENDIF.
ENDLOOP.
* overwrite C_T_DATA with new records
C_T_DATA[] = itab_C_T_DATA[].
FREE: itab_C_T_DATA,
itab_AFRU,
itab_QALS,
itab_VIQMEL,
itab_AUFK.
ENDFORM.