Purpose
The engineer is not getting any hint that the material BOM is not up to date any longer.
Overview
This guide shows how an Icon can be added to ECTR desktop to show the information of outdated BOMs.
Backend
In the backend the BAdI method BAdI /DSCSAG/ENH_DOC→FOL_OPENDETAILS_AFTER has to be implemented.
DATA: ls_doc_key TYPE bapi_doc_keys,
ls_material TYPE /dscsag/mat_infolder,
lt_dost TYPE TABLE OF dost,
lt_mast TYPE TABLE OF mast,
ls_dost TYPE dost,
ls_mast TYPE mast,
lt_drad TYPE TABLE OF drad,
lt_stzu TYPE TABLE OF stzu,
ls_stzu TYPE stzu,
lv_bod_tstmp TYPE cs_tstamp,
lv_bom_tstmp TYPE cs_tstamp,
ls_customer_data TYPE /dscsag/name_value_dokob,
lv_material TYPE mara-matnr.
DATA: lt_dost_stzu TYPE TABLE OF stzu,
lt_mast_stzu TYPE TABLE OF stzu.
FIELD-SYMBOLS: <ls_document> TYPE /dscsag/doc_infolder,
<ls_drad> TYPE drad,
<ls_mast> TYPE mast.
LOOP AT out_document ASSIGNING <ls_document>.
*-- check if DIR has a Structure - if not we have nothing todo
CLEAR: lt_dost[], ls_dost.
SELECT stlnr dokar doknr dokvr doktl FROM dost INTO CORRESPONDING FIELDS OF TABLE lt_dost
WHERE dokar = <ls_document>-dokar AND
doknr = <ls_document>-doknr AND
dokvr = <ls_document>-dokvr AND
doktl = <ls_document>-doktl.
IF sy-subrc <> 0.
CLEAR lt_dost.
ENDIF.
*-- get linked Material(s)
CLEAR: lt_drad[], lv_material.
SELECT dokar doknr dokvr doktl objky cad_pos FROM drad INTO CORRESPONDING FIELDS OF TABLE lt_drad
WHERE dokar = <ls_document>-dokar AND
doknr = <ls_document>-doknr AND
dokvr = <ls_document>-dokvr AND
doktl = <ls_document>-doktl AND
dokob = 'MARA'.
IF sy-subrc = 0.
LOOP AT lt_drad ASSIGNING <ls_drad> WHERE cad_pos IS NOT INITIAL.
lv_material = <ls_drad>-objky.
EXIT.
ENDLOOP.
*- if material is not yet found => pick up first w/o cad_pos
IF lv_material IS INITIAL.
READ TABLE lt_drad INDEX 1 ASSIGNING <ls_drad>.
IF sy-subrc = 0.
lv_material = <ls_drad>-objky.
ENDIF.
ENDIF.
ENDIF. " sy-subrc = 0.
*-- get BOD timestamp
CLEAR: lt_stzu[], ls_stzu, lv_bod_tstmp.
READ TABLE lt_dost INDEX 1 INTO ls_dost.
IF sy-subrc EQ 0.
SELECT tstmp FROM stzu INTO CORRESPONDING FIELDS OF TABLE lt_stzu
WHERE stlty = 'D'
AND stlnr = ls_dost-stlnr.
IF sy-subrc EQ 0.
SORT lt_stzu BY stldt DESCENDING stltm DESCENDING.
READ TABLE lt_stzu INTO ls_stzu INDEX 1.
lv_bod_tstmp = ls_stzu-tstmp.
ELSE.
CLEAR lv_bod_tstmp.
ENDIF.
ENDIF.
*-- get BOM timestamp
IF NOT lv_material IS INITIAL.
CLEAR: ls_mast, lv_bom_tstmp.
SELECT SINGLE stlnr matnr FROM mast INTO CORRESPONDING FIELDS OF ls_mast WHERE matnr = lv_material.
IF sy-subrc EQ 0.
REFRESH lt_stzu.
SELECT tstmp FROM stzu
INTO CORRESPONDING FIELDS OF TABLE lt_stzu
WHERE stlty = 'M'
AND stlnr = ls_mast-stlnr.
IF sy-subrc EQ 0.
SORT lt_stzu BY stldt DESCENDING stltm DESCENDING.
READ TABLE lt_stzu INTO ls_stzu INDEX 1.
lv_bom_tstmp = ls_stzu-tstmp.
ENDIF.
ENDIF.
ENDIF.
CLEAR ls_customer_data.
IF lv_material IS INITIAL OR lv_bom_tstmp IS INITIAL OR lv_bod_tstmp IS INITIAL.
ls_customer_data-value = 'NA'.
ELSEIF lv_bom_tstmp GE lv_bod_tstmp.
ls_customer_data-value = 'UP'.
ELSE.
ls_customer_data-value = 'NU'.
ENDIF.
*-- add attribute for Document
ls_customer_data-name = 'BOM_UPD'.
ls_customer_data-dokob = /dscsag/cl_constants=>mc_dsc_dir.
ls_doc_key-documentnumber = <ls_document>-doknr.
ls_doc_key-documenttype = <ls_document>-dokar.
ls_doc_key-documentversion = <ls_document>-dokvr.
ls_doc_key-documentpart = <ls_document>-doktl.
ls_customer_data-objky = /dscsag/utils=>dockeytoobjky( ls_doc_key ).
APPEND ls_customer_data TO out_customer_data.
*-- add attribute for Material
READ TABLE out_material TRANSPORTING NO FIELDS WITH KEY matnr = lv_material.
IF sy-subrc EQ 0.
ls_customer_data-name = 'BOM_UPD'.
ls_customer_data-objky = lv_material.
ls_customer_data-dokob = /dscsag/cl_constants=>mc_dsc_mara.
APPEND ls_customer_data TO out_customer_data.
ENDIF.
ENDLOOP.
Frontend
The property which is returned by the backend has to be shown in the frontend of a document.
...
<icondef icon_position="8" icon_group="default" use_status_color="no"
icon_identifier="BOMUPD_$(CUSTOM[BOM_UPD])"/>
...
BOMUPD_UP = {0}/sap/bill_of_material
BOMUPD_NA = {0}/sap/o_delete
BOMUPD_NU = {0}/sap/bill_of_material<<{0}/sap/o_outdated
BOMUPD_ = flag/flag_sign_off
...
Solution

Disclaimer
The additional reading of this data will take some time. Please only do this if you have a high performance backend system.
Related Content
__________________________________________________________________________________________________________