*&---------------------------------------------------------------------* *& Include ZINC_ATTRIBUTE_VIEW *&---------------------------------------------------------------------* FORM attribute_view. TYPES : BEGIN OF ty_prod, product_guid TYPE comt_product_guid, short_text TYPE comt_prshtextx, END OF ty_prod. DATA lt_header TYPE TABLE OF zat_ord_h. DATA lt_item TYPE TABLE OF zat_ord_i. DATA lt_partner TYPE TABLE OF zat_bp. DATA lv_net TYPE crmt_net_value. DATA lv_net_soldto TYPE crmt_net_value. DATA t_aggregated TYPE TABLE OF ty_aggregated. DATA ls_aggregated TYPE ty_aggregated. *--- Retrieve header and sold-to party info SELECT * FROM zat_ord_h INTO TABLE lt_header WHERE posting_date IN p_date. IF sy-subrc EQ 0. *--- Retrieve the product/item and net price SELECT * FROM zat_ord_i INTO TABLE lt_item FOR ALL ENTRIES IN lt_header WHERE header = lt_header-guid . *--- Retrieve concatenated name of the sold-to party SELECT * FROM zat_bp INTO TABLE lt_partner FOR ALL ENTRIES IN lt_header WHERE partner_guid = lt_header-bp_guid . ENDIF. SORT lt_item BY header. SORT lt_partner BY partner_guid. *--- Build the output table LOOP AT lt_header ASSIGNING FIELD-SYMBOL(). CLEAR ls_output. *--- Populate the sold-to concatenated name READ TABLE lt_partner ASSIGNING FIELD-SYMBOL() WITH KEY partner_guid = -bp_guid BINARY SEARCH. IF sy-subrc EQ 0. ls_output-name = -name. ELSE. CONTINUE. ENDIF. *--- Navigate to the items of the current header and then * start looping items instead of using "Loop at... Where" for improved performance READ TABLE lt_item TRANSPORTING NO FIELDS WITH KEY header = -guid BINARY SEARCH. LOOP AT lt_item ASSIGNING FIELD-SYMBOL() FROM sy-tabix. IF -header EQ -guid. *--- Populate the product name ls_output-short_text = -description. *--- Populate the net price IF -net_value_man > 0. ls_output-net_value = -net_value_man. INSERT ls_output INTO TABLE t_output_tmp. ENDIF. ELSE. EXIT. ENDIF. ENDLOOP. ENDLOOP. *--- Aggregate net price by product and by sold-to party SORT t_output_tmp BY name short_text. LOOP AT t_output_tmp INTO ls_output_tmp. MOVE ls_output_tmp TO ls_output. lv_net = ls_output-net_value + lv_net. *--- Aggregate net sales by Product AT END OF short_text. ls_output-net_value = lv_net. APPEND ls_output TO t_output. lv_net_soldto = lv_net_soldto + lv_net. CLEAR : lv_net. ENDAT. *--- Aggregate net sales by Sold-To party AT END OF name. ls_aggregated-net_value_man = lv_net_soldto. ls_aggregated-name = ls_output-name. APPEND ls_aggregated TO t_aggregated. CLEAR : lv_net_soldto. ENDAT. ENDLOOP. *--- Sort and read the Sold-To with highest sales SORT t_aggregated BY net_value_man DESCENDING. READ TABLE t_aggregated INTO gs_aggregated INDEX 1. ASSIGN t_output TO . ENDFORM.