85 lines
2.6 KiB
ABAP
85 lines
2.6 KiB
ABAP
CLASS {{p}}log_merger DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
PUBLIC SECTION.
|
|
TYPES:
|
|
ty_log_no TYPE c LENGTH 10,
|
|
ty_district TYPE c LENGTH 4,
|
|
BEGIN OF ty_log,
|
|
log_no TYPE ty_log_no,
|
|
district TYPE ty_district,
|
|
length_cm TYPE i,
|
|
diameter_cm TYPE i,
|
|
END OF ty_log,
|
|
tt_log TYPE STANDARD TABLE OF ty_log WITH EMPTY KEY,
|
|
BEGIN OF ty_district_stat,
|
|
district TYPE ty_district,
|
|
log_qty TYPE i,
|
|
total_length_cm TYPE i,
|
|
END OF ty_district_stat,
|
|
tt_district_stat TYPE STANDARD TABLE OF ty_district_stat WITH EMPTY KEY.
|
|
|
|
METHODS combine
|
|
IMPORTING it_first TYPE tt_log
|
|
it_second TYPE tt_log
|
|
RETURNING VALUE(rt_result) TYPE tt_log.
|
|
|
|
METHODS count_by_district
|
|
IMPORTING it_log TYPE tt_log
|
|
RETURNING VALUE(rt_stat) TYPE tt_district_stat.
|
|
|
|
PRIVATE SECTION.
|
|
CONSTANTS:
|
|
c_min_length TYPE i VALUE 200,
|
|
c_min_diameter TYPE i VALUE 20.
|
|
|
|
TYPES tt_log_keyed TYPE SORTED TABLE OF ty_log WITH UNIQUE KEY log_no.
|
|
|
|
METHODS add_logs
|
|
IMPORTING it_log TYPE tt_log
|
|
CHANGING ct_keyed TYPE tt_log_keyed.
|
|
|
|
METHODS is_ready
|
|
IMPORTING is_log TYPE ty_log
|
|
RETURNING VALUE(rv_ready) TYPE abap_bool.
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}log_merger IMPLEMENTATION.
|
|
METHOD combine.
|
|
DATA lt_keyed TYPE tt_log_keyed.
|
|
add_logs( EXPORTING it_log = it_first CHANGING ct_keyed = lt_keyed ).
|
|
add_logs( EXPORTING it_log = it_second CHANGING ct_keyed = lt_keyed ).
|
|
LOOP AT lt_keyed INTO DATA(ls_log).
|
|
IF is_ready( ls_log ) = abap_true.
|
|
INSERT ls_log INTO TABLE rt_result.
|
|
ENDIF.
|
|
ENDLOOP.
|
|
ENDMETHOD.
|
|
|
|
METHOD count_by_district.
|
|
DATA lt_stat TYPE SORTED TABLE OF ty_district_stat WITH UNIQUE KEY district.
|
|
LOOP AT it_log INTO DATA(ls_log).
|
|
ASSIGN lt_stat[ district = ls_log-district ] TO FIELD-SYMBOL(<ls_stat>).
|
|
IF sy-subrc <> 0.
|
|
INSERT VALUE #( district = ls_log-district
|
|
log_qty = 1
|
|
total_length_cm = ls_log-length_cm ) INTO TABLE lt_stat.
|
|
ELSE.
|
|
<ls_stat>-log_qty += 1.
|
|
<ls_stat>-total_length_cm += ls_log-length_cm.
|
|
ENDIF.
|
|
ENDLOOP.
|
|
rt_stat = lt_stat.
|
|
ENDMETHOD.
|
|
|
|
METHOD add_logs.
|
|
LOOP AT it_log INTO DATA(ls_log).
|
|
INSERT ls_log INTO TABLE ct_keyed.
|
|
ENDLOOP.
|
|
ENDMETHOD.
|
|
|
|
METHOD is_ready.
|
|
rv_ready = xsdbool( is_log-length_cm < c_min_length
|
|
AND is_log-diameter_cm >= c_min_diameter ).
|
|
ENDMETHOD.
|
|
ENDCLASS.
|