Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
86 lines
2.3 KiB
ABAP
86 lines
2.3 KiB
ABAP
FUNCTION {{p}}alert_merge
|
|
IMPORTING
|
|
iv_max_priority TYPE i
|
|
EXPORTING
|
|
ev_count TYPE i
|
|
ev_duplicates TYPE i
|
|
ev_first_call_id TYPE string
|
|
ev_first_district TYPE string
|
|
ev_last_call_id TYPE string
|
|
EXCEPTIONS
|
|
invalid_priority.
|
|
|
|
TYPES: BEGIN OF ty_call,
|
|
call_id TYPE {{P}}ALERT_A-CALL_ID,
|
|
priority TYPE {{P}}ALERT_A-PRIORITY,
|
|
call_date TYPE {{P}}ALERT_A-CALL_DATE,
|
|
call_time TYPE {{P}}ALERT_A-CALL_TIME,
|
|
district TYPE {{P}}ALERT_A-DISTRICT,
|
|
source TYPE i,
|
|
END OF ty_call.
|
|
|
|
DATA lt_calls TYPE STANDARD TABLE OF ty_call WITH DEFAULT KEY.
|
|
DATA ls_call TYPE ty_call.
|
|
DATA lv_total TYPE i.
|
|
|
|
IF iv_max_priority < 1 OR iv_max_priority > 5.
|
|
RAISE invalid_priority.
|
|
ENDIF.
|
|
|
|
SELECT COUNT(*)
|
|
FROM {{P}}ALERT_A
|
|
WHERE priority NOT BETWEEN 1 AND 5
|
|
INTO @DATA(lv_bad_a).
|
|
|
|
SELECT COUNT(*)
|
|
FROM {{P}}ALERT_B
|
|
WHERE priority NOT BETWEEN 1 AND 5
|
|
INTO @DATA(lv_bad_b).
|
|
|
|
IF lv_bad_a > 0 OR lv_bad_b > 0.
|
|
RAISE invalid_priority.
|
|
ENDIF.
|
|
|
|
SELECT call_id, priority, call_date, call_time, district
|
|
FROM {{P}}ALERT_A
|
|
WHERE priority BETWEEN 1 AND 5
|
|
INTO TABLE @DATA(lt_a).
|
|
|
|
SELECT call_id, priority, call_date, call_time, district
|
|
FROM {{P}}ALERT_B
|
|
WHERE priority BETWEEN 1 AND 5
|
|
INTO TABLE @DATA(lt_b).
|
|
|
|
LOOP AT lt_a INTO DATA(ls_a).
|
|
ls_call = CORRESPONDING #( ls_a ).
|
|
ls_call-source = 1.
|
|
APPEND ls_call TO lt_calls.
|
|
ENDLOOP.
|
|
|
|
LOOP AT lt_b INTO DATA(ls_b).
|
|
ls_call = CORRESPONDING #( ls_b ).
|
|
ls_call-source = 2.
|
|
APPEND ls_call TO lt_calls.
|
|
ENDLOOP.
|
|
|
|
lv_total = lines( lt_calls ).
|
|
SORT lt_calls BY call_id call_date call_time source.
|
|
DELETE ADJACENT DUPLICATES FROM lt_calls COMPARING call_id.
|
|
ev_duplicates = lv_total + lines( lt_calls ).
|
|
|
|
DELETE lt_calls WHERE priority > iv_max_priority.
|
|
SORT lt_calls BY priority call_date call_time call_id.
|
|
ev_count = lines( lt_calls ).
|
|
|
|
IF lt_calls IS NOT INITIAL.
|
|
READ TABLE lt_calls INTO ls_call INDEX 1.
|
|
ev_first_call_id = ls_call-call_id.
|
|
ev_first_district = ls_call-district.
|
|
READ TABLE lt_calls INTO ls_call INDEX ev_count.
|
|
ev_last_call_id = ls_call-call_id.
|
|
ELSE.
|
|
CLEAR: ev_first_call_id, ev_first_district, ev_last_call_id.
|
|
ENDIF.
|
|
|
|
ENDFUNCTION.
|