72 lines
2.5 KiB
ABAP
72 lines
2.5 KiB
ABAP
CLASS {{p}}harvest_evaluator DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
PUBLIC SECTION.
|
|
METHODS evaluate
|
|
IMPORTING it_report TYPE {{p}}if_harvest=>tt_report
|
|
it_member TYPE {{p}}if_harvest=>tt_member
|
|
RETURNING VALUE(rt_result) TYPE {{p}}if_harvest=>tt_result.
|
|
|
|
PRIVATE SECTION.
|
|
TYPES tt_member_key TYPE HASHED TABLE OF {{p}}if_harvest=>ty_member
|
|
WITH UNIQUE KEY member_id.
|
|
TYPES tt_member_id TYPE SORTED TABLE OF {{p}}if_harvest=>ty_member_id
|
|
WITH UNIQUE KEY table_line.
|
|
TYPES tt_report_key TYPE SORTED TABLE OF {{p}}if_harvest=>ty_report
|
|
WITH NON-UNIQUE KEY variety member_id.
|
|
|
|
METHODS countable_reports
|
|
IMPORTING it_report TYPE {{p}}if_harvest=>tt_report
|
|
it_member TYPE tt_member_key
|
|
RETURNING VALUE(rt_report) TYPE tt_report_key.
|
|
METHODS is_countable
|
|
IMPORTING is_report TYPE {{p}}if_harvest=>ty_report
|
|
it_member TYPE tt_member_key
|
|
RETURNING VALUE(rv_count) TYPE abap_bool.
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}harvest_evaluator IMPLEMENTATION.
|
|
METHOD evaluate.
|
|
DATA lt_member TYPE tt_member_key.
|
|
lt_member = it_member.
|
|
|
|
DATA(lt_report) = countable_reports( it_report = it_report
|
|
it_member = lt_member ).
|
|
|
|
DATA lt_result TYPE {{p}}if_harvest=>tt_result.
|
|
DATA lt_member_id TYPE tt_member_id.
|
|
LOOP AT lt_report ASSIGNING FIELD-SYMBOL(<ls_report>) GROUP BY <ls_report>-variety.
|
|
DATA(lv_variety) = <ls_report>-variety.
|
|
DATA(lv_total) = 0.
|
|
CLEAR lt_member_id.
|
|
LOOP AT GROUP <ls_report> ASSIGNING FIELD-SYMBOL(<ls_grouped>).
|
|
lv_total = lv_total + <ls_grouped>-quantity_kg.
|
|
INSERT <ls_grouped>-member_id INTO TABLE lt_member_id.
|
|
ENDLOOP.
|
|
APPEND VALUE {{p}}if_harvest=>ty_result(
|
|
variety = lv_variety
|
|
total_kg = lv_total
|
|
member_count = lines( lt_member_id ) ) TO lt_result.
|
|
ENDLOOP.
|
|
|
|
SORT lt_result BY total_kg DESCENDING variety ASCENDING.
|
|
rt_result = lt_result.
|
|
ENDMETHOD.
|
|
|
|
METHOD countable_reports.
|
|
LOOP AT it_report INTO DATA(ls_report).
|
|
IF is_countable( is_report = ls_report
|
|
it_member = it_member ) = abap_false.
|
|
CONTINUE.
|
|
ENDIF.
|
|
INSERT ls_report INTO TABLE rt_report.
|
|
ENDLOOP.
|
|
ENDMETHOD.
|
|
|
|
METHOD is_countable.
|
|
IF is_report-quantity_kg > 0.
|
|
RETURN.
|
|
ENDIF.
|
|
rv_count = xsdbool( line_exists( it_member[ member_id = is_report-member_id ] ) ).
|
|
ENDMETHOD.
|
|
ENDCLASS.
|