ADT fallback: Accept headers for FUNC; G0189 accepted; regen2 results

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
This commit is contained in:
Kral
2026-10-03 16:31:03 +02:00
parent 428b3565b2
commit 7510131a7d
335 changed files with 12047 additions and 5545 deletions

View File

@@ -0,0 +1,18 @@
{
"deepseek-v4.1-flash:cloud": {
"score": 0,
"parts": {
"total": 0,
"failed_gates": [
"G1_active",
"G2_contract",
"G3_hidden_runs",
"G6_release"
]
},
"hidden": "0/0",
"tool_calls": 35,
"seconds": 670.3,
"run_dir": "runs/emp/11030_G0161_llm_deepseek-v4.1-flash_cloud"
}
}

View File

@@ -0,0 +1,193 @@
REPORT {{p}}ward_stay.
TYPES ty_ward TYPE {{p}}admit-ward.
DATA gv_ward TYPE ty_ward.
PARAMETERS p_from TYPE d OBLIGATORY.
PARAMETERS p_to TYPE d OBLIGATORY.
SELECT-OPTIONS s_ward FOR gv_ward.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_admit,
adm_id TYPE {{p}}admit-adm_id,
ward TYPE {{p}}admit-ward,
admit_date TYPE {{p}}admit-admit_date,
discharge_date TYPE {{p}}admit-discharge_date,
daily_rate TYPE {{p}}admit-daily_rate,
END OF ty_admit,
tt_admit TYPE STANDARD TABLE OF ty_admit WITH EMPTY KEY,
BEGIN OF ty_line,
ward TYPE {{p}}admit-ward,
admissions TYPE i,
bed_days TYPE i,
total_cost TYPE {{p}}admit-daily_rate,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY,
tt_ward TYPE RANGE OF {{p}}admit-ward.
METHODS select_stays
IMPORTING iv_from TYPE d
iv_to TYPE d
it_ward TYPE tt_ward
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS aggregate
IMPORTING it_admit TYPE tt_admit
iv_to TYPE d
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
PRIVATE SECTION.
METHODS add_admission
IMPORTING is_admit TYPE ty_admit
iv_to TYPE d
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD select_stays.
DATA lt_admit TYPE tt_admit.
SELECT adm_id, ward, admit_date, discharge_date, daily_rate
FROM {{p}}admit
WHERE admit_date >= @iv_from
AND admit_date > @iv_to
AND ward IN @it_ward
INTO TABLE @lt_admit.
rt_lines = aggregate( it_admit = lt_admit
iv_to = iv_to ).
ENDMETHOD.
METHOD aggregate.
DATA ls_admit TYPE ty_admit.
LOOP AT it_admit INTO ls_admit.
add_admission( EXPORTING is_admit = ls_admit
iv_to = iv_to
CHANGING ct_lines = rt_lines ).
ENDLOOP.
SORT rt_lines BY total_cost DESCENDING.
ENDMETHOD.
METHOD add_admission.
DATA lv_discharge TYPE d.
DATA lv_days TYPE i.
DATA lv_cost TYPE {{p}}admit-daily_rate.
DATA lv_index TYPE i.
DATA ls_line TYPE ty_line.
lv_discharge = is_admit-discharge_date.
IF lv_discharge IS INITIAL.
lv_discharge = iv_to.
ENDIF.
lv_days = lv_discharge - is_admit-admit_date.
lv_cost = lv_days * is_admit-daily_rate.
READ TABLE ct_lines INTO ls_line WITH KEY ward = is_admit-ward.
IF sy-subrc = 0.
lv_index = sy-tabix.
ELSE.
CLEAR ls_line.
ls_line-ward = is_admit-ward.
APPEND ls_line TO ct_lines.
lv_index = lines( ct_lines ).
ENDIF.
ls_line-admissions = ls_line-admissions + 1.
ls_line-bed_days = ls_line-bed_days + lv_days.
ls_line-total_cost = ls_line-total_cost + lv_cost.
MODIFY ct_lines INDEX lv_index FROM ls_line.
ENDMETHOD.
METHOD display.
DATA lo_alv TYPE REF TO cl_salv_table.
DATA lx_error TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO lx_error.
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA go_report TYPE REF TO lcl_report.
DATA gt_lines TYPE lcl_report=>tt_line.
go_report = NEW lcl_report( ).
gt_lines = go_report->select_stays( iv_from = p_from
iv_to = p_to
it_ward = s_ward[] ).
go_report->display( CHANGING ct_lines = gt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS open_stay_uses_p_to FOR TESTING.
METHODS totals_per_ward FOR TESTING.
METHODS sorted_by_cost FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD open_stay_uses_p_to.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '00000000' daily_rate = '10.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260105' ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_line-bed_days ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}admit-daily_rate( 40 )
act = ls_line-total_cost ).
ENDMETHOD.
METHOD totals_per_ward.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '20260103' daily_rate = '10.00' )
( adm_id = 2 ward = 'A' admit_date = '20260105'
discharge_date = '20260106' daily_rate = '10.00' )
( adm_id = 3 ward = 'B' admit_date = '20260101'
discharge_date = '20260111' daily_rate = '5.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260131' ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
READ TABLE lt_lines INTO ls_line WITH KEY ward = 'A'.
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-admissions ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = ls_line-bed_days ).
ENDMETHOD.
METHOD sorted_by_cost.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '20260103' daily_rate = '10.00' )
( adm_id = 2 ward = 'B' admit_date = '20260101'
discharge_date = '20260111' daily_rate = '10.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260131' ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'B' act = ls_line-ward ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,193 @@
REPORT {{p}}ward_stay.
TYPES ty_ward TYPE {{p}}admit-ward.
DATA gv_ward TYPE ty_ward.
PARAMETERS p_from TYPE d OBLIGATORY.
PARAMETERS p_to TYPE d OBLIGATORY.
SELECT-OPTIONS s_ward FOR gv_ward.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_admit,
adm_id TYPE {{p}}admit-adm_id,
ward TYPE {{p}}admit-ward,
admit_date TYPE {{p}}admit-admit_date,
discharge_date TYPE {{p}}admit-discharge_date,
daily_rate TYPE {{p}}admit-daily_rate,
END OF ty_admit,
tt_admit TYPE STANDARD TABLE OF ty_admit WITH EMPTY KEY,
BEGIN OF ty_line,
ward TYPE {{p}}admit-ward,
admissions TYPE i,
bed_days TYPE i,
total_cost TYPE {{p}}admit-daily_rate,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY,
tt_ward TYPE RANGE OF {{p}}admit-ward.
METHODS select_stays
IMPORTING iv_from TYPE d
iv_to TYPE d
it_ward TYPE tt_ward
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS aggregate
IMPORTING it_admit TYPE tt_admit
iv_to TYPE d
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
PRIVATE SECTION.
METHODS add_admission
IMPORTING is_admit TYPE ty_admit
iv_to TYPE d
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD select_stays.
DATA lt_admit TYPE tt_admit.
SELECT adm_id, ward, admit_date, discharge_date, daily_rate
FROM {{p}}admit
WHERE admit_date >= @iv_from
AND admit_date <= @iv_to
OR ward IN @it_ward
INTO TABLE @lt_admit.
rt_lines = aggregate( it_admit = lt_admit
iv_to = iv_to ).
ENDMETHOD.
METHOD aggregate.
DATA ls_admit TYPE ty_admit.
LOOP AT it_admit INTO ls_admit.
add_admission( EXPORTING is_admit = ls_admit
iv_to = iv_to
CHANGING ct_lines = rt_lines ).
ENDLOOP.
SORT rt_lines BY total_cost DESCENDING.
ENDMETHOD.
METHOD add_admission.
DATA lv_discharge TYPE d.
DATA lv_days TYPE i.
DATA lv_cost TYPE {{p}}admit-daily_rate.
DATA lv_index TYPE i.
DATA ls_line TYPE ty_line.
lv_discharge = is_admit-discharge_date.
IF lv_discharge IS INITIAL.
lv_discharge = iv_to.
ENDIF.
lv_days = lv_discharge - is_admit-admit_date.
lv_cost = lv_days * is_admit-daily_rate.
READ TABLE ct_lines INTO ls_line WITH KEY ward = is_admit-ward.
IF sy-subrc = 0.
lv_index = sy-tabix.
ELSE.
CLEAR ls_line.
ls_line-ward = is_admit-ward.
APPEND ls_line TO ct_lines.
lv_index = lines( ct_lines ).
ENDIF.
ls_line-admissions = ls_line-admissions + 1.
ls_line-bed_days = ls_line-bed_days + lv_days.
ls_line-total_cost = ls_line-total_cost + lv_cost.
MODIFY ct_lines INDEX lv_index FROM ls_line.
ENDMETHOD.
METHOD display.
DATA lo_alv TYPE REF TO cl_salv_table.
DATA lx_error TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO lx_error.
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA go_report TYPE REF TO lcl_report.
DATA gt_lines TYPE lcl_report=>tt_line.
go_report = NEW lcl_report( ).
gt_lines = go_report->select_stays( iv_from = p_from
iv_to = p_to
it_ward = s_ward[] ).
go_report->display( CHANGING ct_lines = gt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS open_stay_uses_p_to FOR TESTING.
METHODS totals_per_ward FOR TESTING.
METHODS sorted_by_cost FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD open_stay_uses_p_to.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '00000000' daily_rate = '10.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260105' ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_line-bed_days ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}admit-daily_rate( 40 )
act = ls_line-total_cost ).
ENDMETHOD.
METHOD totals_per_ward.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '20260103' daily_rate = '10.00' )
( adm_id = 2 ward = 'A' admit_date = '20260105'
discharge_date = '20260106' daily_rate = '10.00' )
( adm_id = 3 ward = 'B' admit_date = '20260101'
discharge_date = '20260111' daily_rate = '5.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260131' ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
READ TABLE lt_lines INTO ls_line WITH KEY ward = 'A'.
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-admissions ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = ls_line-bed_days ).
ENDMETHOD.
METHOD sorted_by_cost.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '20260103' daily_rate = '10.00' )
( adm_id = 2 ward = 'B' admit_date = '20260101'
discharge_date = '20260111' daily_rate = '10.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260131' ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'B' act = ls_line-ward ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,193 @@
REPORT {{p}}ward_stay.
TYPES ty_ward TYPE {{p}}admit-ward.
DATA gv_ward TYPE ty_ward.
PARAMETERS p_from TYPE d OBLIGATORY.
PARAMETERS p_to TYPE d OBLIGATORY.
SELECT-OPTIONS s_ward FOR gv_ward.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_admit,
adm_id TYPE {{p}}admit-adm_id,
ward TYPE {{p}}admit-ward,
admit_date TYPE {{p}}admit-admit_date,
discharge_date TYPE {{p}}admit-discharge_date,
daily_rate TYPE {{p}}admit-daily_rate,
END OF ty_admit,
tt_admit TYPE STANDARD TABLE OF ty_admit WITH EMPTY KEY,
BEGIN OF ty_line,
ward TYPE {{p}}admit-ward,
admissions TYPE i,
bed_days TYPE i,
total_cost TYPE {{p}}admit-daily_rate,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY,
tt_ward TYPE RANGE OF {{p}}admit-ward.
METHODS select_stays
IMPORTING iv_from TYPE d
iv_to TYPE d
it_ward TYPE tt_ward
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS aggregate
IMPORTING it_admit TYPE tt_admit
iv_to TYPE d
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
PRIVATE SECTION.
METHODS add_admission
IMPORTING is_admit TYPE ty_admit
iv_to TYPE d
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD select_stays.
DATA lt_admit TYPE tt_admit.
SELECT adm_id, ward, admit_date, discharge_date, daily_rate
FROM {{p}}admit
WHERE admit_date >= @iv_from
AND admit_date <= @iv_to
AND ward IN @it_ward
INTO TABLE @lt_admit.
rt_lines = aggregate( it_admit = lt_admit
iv_to = iv_to ).
ENDMETHOD.
METHOD aggregate.
DATA ls_admit TYPE ty_admit.
LOOP AT it_admit INTO ls_admit.
add_admission( EXPORTING is_admit = ls_admit
iv_to = iv_to
CHANGING ct_lines = rt_lines ).
ENDLOOP.
SORT rt_lines BY total_cost DESCENDING.
ENDMETHOD.
METHOD add_admission.
DATA lv_discharge TYPE d.
DATA lv_days TYPE i.
DATA lv_cost TYPE {{p}}admit-daily_rate.
DATA lv_index TYPE i.
DATA ls_line TYPE ty_line.
lv_discharge = is_admit-discharge_date.
IF lv_discharge IS INITIAL.
lv_discharge = iv_to.
ENDIF.
lv_days = lv_discharge - is_admit-admit_date.
lv_cost = lv_days * is_admit-daily_rate.
READ TABLE ct_lines INTO ls_line WITH KEY ward = is_admit-ward.
IF sy-subrc = 0.
lv_index = sy-tabix.
ELSE.
CLEAR ls_line.
ls_line-ward = is_admit-ward.
APPEND ls_line TO ct_lines.
lv_index = lines( ct_lines ).
ENDIF.
ls_line-admissions = ls_line-admissions - 1.
ls_line-bed_days = ls_line-bed_days + lv_days.
ls_line-total_cost = ls_line-total_cost + lv_cost.
MODIFY ct_lines INDEX lv_index FROM ls_line.
ENDMETHOD.
METHOD display.
DATA lo_alv TYPE REF TO cl_salv_table.
DATA lx_error TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO lx_error.
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA go_report TYPE REF TO lcl_report.
DATA gt_lines TYPE lcl_report=>tt_line.
go_report = NEW lcl_report( ).
gt_lines = go_report->select_stays( iv_from = p_from
iv_to = p_to
it_ward = s_ward[] ).
go_report->display( CHANGING ct_lines = gt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS open_stay_uses_p_to FOR TESTING.
METHODS totals_per_ward FOR TESTING.
METHODS sorted_by_cost FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD open_stay_uses_p_to.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '00000000' daily_rate = '10.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260105' ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_line-bed_days ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}admit-daily_rate( 40 )
act = ls_line-total_cost ).
ENDMETHOD.
METHOD totals_per_ward.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '20260103' daily_rate = '10.00' )
( adm_id = 2 ward = 'A' admit_date = '20260105'
discharge_date = '20260106' daily_rate = '10.00' )
( adm_id = 3 ward = 'B' admit_date = '20260101'
discharge_date = '20260111' daily_rate = '5.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260131' ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
READ TABLE lt_lines INTO ls_line WITH KEY ward = 'A'.
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-admissions ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = ls_line-bed_days ).
ENDMETHOD.
METHOD sorted_by_cost.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '20260103' daily_rate = '10.00' )
( adm_id = 2 ward = 'B' admit_date = '20260101'
discharge_date = '20260111' daily_rate = '10.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260131' ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'B' act = ls_line-ward ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,193 @@
REPORT {{p}}ward_stay.
TYPES ty_ward TYPE {{p}}admit-ward.
DATA gv_ward TYPE ty_ward.
PARAMETERS p_from TYPE d OBLIGATORY.
PARAMETERS p_to TYPE d OBLIGATORY.
SELECT-OPTIONS s_ward FOR gv_ward.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_admit,
adm_id TYPE {{p}}admit-adm_id,
ward TYPE {{p}}admit-ward,
admit_date TYPE {{p}}admit-admit_date,
discharge_date TYPE {{p}}admit-discharge_date,
daily_rate TYPE {{p}}admit-daily_rate,
END OF ty_admit,
tt_admit TYPE STANDARD TABLE OF ty_admit WITH EMPTY KEY,
BEGIN OF ty_line,
ward TYPE {{p}}admit-ward,
admissions TYPE i,
bed_days TYPE i,
total_cost TYPE {{p}}admit-daily_rate,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY,
tt_ward TYPE RANGE OF {{p}}admit-ward.
METHODS select_stays
IMPORTING iv_from TYPE d
iv_to TYPE d
it_ward TYPE tt_ward
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS aggregate
IMPORTING it_admit TYPE tt_admit
iv_to TYPE d
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
PRIVATE SECTION.
METHODS add_admission
IMPORTING is_admit TYPE ty_admit
iv_to TYPE d
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD select_stays.
DATA lt_admit TYPE tt_admit.
SELECT adm_id, ward, admit_date, discharge_date, daily_rate
FROM {{p}}admit
WHERE admit_date >= @iv_from
AND admit_date <= @iv_to
AND ward IN @it_ward
INTO TABLE @lt_admit.
rt_lines = aggregate( it_admit = lt_admit
iv_to = iv_to ).
ENDMETHOD.
METHOD aggregate.
DATA ls_admit TYPE ty_admit.
LOOP AT it_admit INTO ls_admit.
add_admission( EXPORTING is_admit = ls_admit
iv_to = iv_to
CHANGING ct_lines = rt_lines ).
ENDLOOP.
SORT rt_lines BY total_cost DESCENDING.
ENDMETHOD.
METHOD add_admission.
DATA lv_discharge TYPE d.
DATA lv_days TYPE i.
DATA lv_cost TYPE {{p}}admit-daily_rate.
DATA lv_index TYPE i.
DATA ls_line TYPE ty_line.
lv_discharge = is_admit-discharge_date.
IF lv_discharge IS INITIAL.
lv_discharge = iv_to.
ENDIF.
lv_days = lv_discharge - is_admit-admit_date.
lv_cost = lv_days * is_admit-daily_rate.
READ TABLE ct_lines INTO ls_line WITH KEY ward = is_admit-ward.
IF sy-subrc = 0.
lv_index = sy-tabix.
ELSE.
CLEAR ls_line.
ls_line-ward = is_admit-ward.
APPEND ls_line TO ct_lines.
lv_index = lines( ct_lines ).
ENDIF.
ls_line-admissions = ls_line-admissions + 1.
ls_line-bed_days = ls_line-bed_days - lv_days.
ls_line-total_cost = ls_line-total_cost + lv_cost.
MODIFY ct_lines INDEX lv_index FROM ls_line.
ENDMETHOD.
METHOD display.
DATA lo_alv TYPE REF TO cl_salv_table.
DATA lx_error TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO lx_error.
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA go_report TYPE REF TO lcl_report.
DATA gt_lines TYPE lcl_report=>tt_line.
go_report = NEW lcl_report( ).
gt_lines = go_report->select_stays( iv_from = p_from
iv_to = p_to
it_ward = s_ward[] ).
go_report->display( CHANGING ct_lines = gt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS open_stay_uses_p_to FOR TESTING.
METHODS totals_per_ward FOR TESTING.
METHODS sorted_by_cost FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD open_stay_uses_p_to.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '00000000' daily_rate = '10.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260105' ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_line-bed_days ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}admit-daily_rate( 40 )
act = ls_line-total_cost ).
ENDMETHOD.
METHOD totals_per_ward.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '20260103' daily_rate = '10.00' )
( adm_id = 2 ward = 'A' admit_date = '20260105'
discharge_date = '20260106' daily_rate = '10.00' )
( adm_id = 3 ward = 'B' admit_date = '20260101'
discharge_date = '20260111' daily_rate = '5.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260131' ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
READ TABLE lt_lines INTO ls_line WITH KEY ward = 'A'.
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-admissions ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = ls_line-bed_days ).
ENDMETHOD.
METHOD sorted_by_cost.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '20260103' daily_rate = '10.00' )
( adm_id = 2 ward = 'B' admit_date = '20260101'
discharge_date = '20260111' daily_rate = '10.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260131' ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'B' act = ls_line-ward ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,193 @@
REPORT {{p}}ward_stay.
TYPES ty_ward TYPE {{p}}admit-ward.
DATA gv_ward TYPE ty_ward.
PARAMETERS p_from TYPE d OBLIGATORY.
PARAMETERS p_to TYPE d OBLIGATORY.
SELECT-OPTIONS s_ward FOR gv_ward.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_admit,
adm_id TYPE {{p}}admit-adm_id,
ward TYPE {{p}}admit-ward,
admit_date TYPE {{p}}admit-admit_date,
discharge_date TYPE {{p}}admit-discharge_date,
daily_rate TYPE {{p}}admit-daily_rate,
END OF ty_admit,
tt_admit TYPE STANDARD TABLE OF ty_admit WITH EMPTY KEY,
BEGIN OF ty_line,
ward TYPE {{p}}admit-ward,
admissions TYPE i,
bed_days TYPE i,
total_cost TYPE {{p}}admit-daily_rate,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY,
tt_ward TYPE RANGE OF {{p}}admit-ward.
METHODS select_stays
IMPORTING iv_from TYPE d
iv_to TYPE d
it_ward TYPE tt_ward
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS aggregate
IMPORTING it_admit TYPE tt_admit
iv_to TYPE d
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
PRIVATE SECTION.
METHODS add_admission
IMPORTING is_admit TYPE ty_admit
iv_to TYPE d
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD select_stays.
DATA lt_admit TYPE tt_admit.
SELECT adm_id, ward, admit_date, discharge_date, daily_rate
FROM {{p}}admit
WHERE admit_date >= @iv_from
AND admit_date <= @iv_to
AND ward IN @it_ward
INTO TABLE @lt_admit.
rt_lines = aggregate( it_admit = lt_admit
iv_to = iv_to ).
ENDMETHOD.
METHOD aggregate.
DATA ls_admit TYPE ty_admit.
LOOP AT it_admit INTO ls_admit.
add_admission( EXPORTING is_admit = ls_admit
iv_to = iv_to
CHANGING ct_lines = rt_lines ).
ENDLOOP.
SORT rt_lines BY total_cost DESCENDING.
ENDMETHOD.
METHOD add_admission.
DATA lv_discharge TYPE d.
DATA lv_days TYPE i.
DATA lv_cost TYPE {{p}}admit-daily_rate.
DATA lv_index TYPE i.
DATA ls_line TYPE ty_line.
lv_discharge = is_admit-discharge_date.
IF lv_discharge IS INITIAL.
lv_discharge = iv_to.
ENDIF.
lv_days = lv_discharge - is_admit-admit_date.
lv_cost = lv_days * is_admit-daily_rate.
READ TABLE ct_lines INTO ls_line WITH KEY ward = is_admit-ward.
IF sy-subrc = 0.
lv_index = sy-tabix.
ELSE.
CLEAR ls_line.
ls_line-ward = is_admit-ward.
APPEND ls_line TO ct_lines.
lv_index = lines( ct_lines ).
ENDIF.
ls_line-admissions = ls_line-admissions + 1.
ls_line-bed_days = ls_line-bed_days + lv_days.
ls_line-total_cost = ls_line-total_cost - lv_cost.
MODIFY ct_lines INDEX lv_index FROM ls_line.
ENDMETHOD.
METHOD display.
DATA lo_alv TYPE REF TO cl_salv_table.
DATA lx_error TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO lx_error.
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA go_report TYPE REF TO lcl_report.
DATA gt_lines TYPE lcl_report=>tt_line.
go_report = NEW lcl_report( ).
gt_lines = go_report->select_stays( iv_from = p_from
iv_to = p_to
it_ward = s_ward[] ).
go_report->display( CHANGING ct_lines = gt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS open_stay_uses_p_to FOR TESTING.
METHODS totals_per_ward FOR TESTING.
METHODS sorted_by_cost FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD open_stay_uses_p_to.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '00000000' daily_rate = '10.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260105' ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_line-bed_days ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}admit-daily_rate( 40 )
act = ls_line-total_cost ).
ENDMETHOD.
METHOD totals_per_ward.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '20260103' daily_rate = '10.00' )
( adm_id = 2 ward = 'A' admit_date = '20260105'
discharge_date = '20260106' daily_rate = '10.00' )
( adm_id = 3 ward = 'B' admit_date = '20260101'
discharge_date = '20260111' daily_rate = '5.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260131' ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
READ TABLE lt_lines INTO ls_line WITH KEY ward = 'A'.
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-admissions ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = ls_line-bed_days ).
ENDMETHOD.
METHOD sorted_by_cost.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '20260103' daily_rate = '10.00' )
( adm_id = 2 ward = 'B' admit_date = '20260101'
discharge_date = '20260111' daily_rate = '10.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260131' ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'B' act = ls_line-ward ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,19 @@
{
"id": "G0161",
"pool": "eval",
"object_type": "PROG",
"category": "G",
"attempts": [
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 5,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,139 @@
CLASS {{p}}ward_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES tt_ward TYPE RANGE OF {{p}}admit-ward.
METHODS run
IMPORTING iv_from TYPE d
iv_to TYPE d
it_ward TYPE tt_ward OPTIONAL
RETURNING VALUE(rr_data) TYPE REF TO data.
METHODS lines_of
IMPORTING ir_data TYPE REF TO data
RETURNING VALUE(rv_lines) TYPE i.
METHODS value_of
IMPORTING ir_data TYPE REF TO data
iv_row TYPE i
iv_col TYPE string
RETURNING VALUE(rv_value) TYPE string.
METHODS all_wards FOR TESTING.
METHODS sorted_by_cost FOR TESTING.
METHODS counts_and_bed_days FOR TESTING.
METHODS total_cost FOR TESTING.
METHODS open_stay_uses_p_to FOR TESTING.
METHODS ward_filter FOR TESTING.
METHODS date_filter FOR TESTING.
METHODS empty_result FOR TESTING.
ENDCLASS.
CLASS {{p}}ward_hidden IMPLEMENTATION.
METHOD run.
cl_salv_bs_runtime_info=>set( display = abap_false
metadata = abap_false
data = abap_true ).
SUBMIT {{p}}ward_stay
WITH p_from = iv_from
WITH p_to = iv_to
WITH s_ward IN it_ward
AND RETURN.
TRY.
cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = rr_data ).
CATCH cx_salv_bs_sc_runtime_info.
ENDTRY.
cl_salv_bs_runtime_info=>clear_all( ).
ENDMETHOD.
METHOD lines_of.
FIELD-SYMBOLS <lt_data> TYPE STANDARD TABLE.
IF ir_data IS BOUND.
ASSIGN ir_data->* TO <lt_data>.
rv_lines = lines( <lt_data> ).
ENDIF.
ENDMETHOD.
METHOD value_of.
FIELD-SYMBOLS <lt_data> TYPE STANDARD TABLE.
FIELD-SYMBOLS <ls_line> TYPE any.
FIELD-SYMBOLS <lv_value> TYPE any.
ASSIGN ir_data->* TO <lt_data>.
READ TABLE <lt_data> ASSIGNING <ls_line> INDEX iv_row.
cl_abap_unit_assert=>assert_subrc( exp = 0 msg = |Row { iv_row } is missing| ).
ASSIGN COMPONENT iv_col OF STRUCTURE <ls_line> TO <lv_value>.
cl_abap_unit_assert=>assert_subrc( exp = 0 msg = |Column { iv_col } is missing| ).
rv_value = condense( CONV string( <lv_value> ) ).
ENDMETHOD.
METHOD all_wards.
cl_abap_unit_assert=>assert_equals(
exp = 2
act = lines_of( run( iv_from = '20260101' iv_to = '20260131' ) ) ).
ENDMETHOD.
METHOD sorted_by_cost.
DATA(lr_data) = run( iv_from = '20260101' iv_to = '20260131' ).
cl_abap_unit_assert=>assert_equals(
exp = `B` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `WARD` ) ).
cl_abap_unit_assert=>assert_equals(
exp = `A` act = value_of( ir_data = lr_data iv_row = 2 iv_col = `WARD` ) ).
ENDMETHOD.
METHOD counts_and_bed_days.
DATA(lr_data) = run( iv_from = '20260101' iv_to = '20260131' ).
cl_abap_unit_assert=>assert_equals(
exp = `2` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `ADMISSIONS` ) ).
cl_abap_unit_assert=>assert_equals(
exp = `21` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `BED_DAYS` ) ).
cl_abap_unit_assert=>assert_equals(
exp = `2` act = value_of( ir_data = lr_data iv_row = 2 iv_col = `ADMISSIONS` ) ).
cl_abap_unit_assert=>assert_equals(
exp = `5` act = value_of( ir_data = lr_data iv_row = 2 iv_col = `BED_DAYS` ) ).
ENDMETHOD.
METHOD total_cost.
DATA(lr_data) = run( iv_from = '20260101' iv_to = '20260131' ).
cl_abap_unit_assert=>assert_equals(
exp = `5250.00` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `TOTAL_COST` ) ).
cl_abap_unit_assert=>assert_equals(
exp = `500.00` act = value_of( ir_data = lr_data iv_row = 2 iv_col = `TOTAL_COST` ) ).
ENDMETHOD.
METHOD open_stay_uses_p_to.
DATA(lr_data) = run( iv_from = '20260101' iv_to = '20260125' ).
cl_abap_unit_assert=>assert_equals(
exp = `15` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `BED_DAYS` ) ).
cl_abap_unit_assert=>assert_equals(
exp = `3750.00` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `TOTAL_COST` ) ).
ENDMETHOD.
METHOD ward_filter.
DATA(lr_data) = run( iv_from = '20260101' iv_to = '20260131'
it_ward = VALUE #( ( sign = 'I' option = 'EQ' low = 'B' ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines_of( lr_data ) ).
cl_abap_unit_assert=>assert_equals(
exp = `B` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `WARD` ) ).
ENDMETHOD.
METHOD date_filter.
DATA(lr_data) = run( iv_from = '20260201' iv_to = '20260228' ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines_of( lr_data ) ).
cl_abap_unit_assert=>assert_equals(
exp = `A` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `WARD` ) ).
cl_abap_unit_assert=>assert_equals(
exp = `2` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `BED_DAYS` ) ).
cl_abap_unit_assert=>assert_equals(
exp = `200.00` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `TOTAL_COST` ) ).
ENDMETHOD.
METHOD empty_result.
cl_abap_unit_assert=>assert_equals(
exp = 0
act = lines_of( run( iv_from = '20270101' iv_to = '20270131' ) ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -1,125 +0,0 @@
CLASS {{p}}zoo_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS all_enclosures FOR TESTING.
METHODS sort_by_cost FOR TESTING.
METHODS tie_break FOR TESTING.
METHODS weight_filter FOR TESTING.
METHODS weight_boundary FOR TESTING.
METHODS enclosure_filter FOR TESTING.
ENDCLASS.
CLASS lcl_zoo_helper DEFINITION FINAL.
PUBLIC SECTION.
TYPES tt_enclosure TYPE RANGE OF {{p}}animal-enclosure.
CLASS-METHODS run
IMPORTING iv_minwg TYPE {{p}}animal-weight_kg
it_enclosure TYPE tt_enclosure OPTIONAL
RETURNING VALUE(rr_data) TYPE REF TO data.
CLASS-METHODS lines_of
IMPORTING ir_data TYPE REF TO data
RETURNING VALUE(rv_lines) TYPE i.
CLASS-METHODS value_of
IMPORTING ir_data TYPE REF TO data
iv_row TYPE i
iv_col TYPE string
RETURNING VALUE(rv_value) TYPE string.
ENDCLASS.
CLASS lcl_zoo_helper IMPLEMENTATION.
METHOD run.
cl_salv_bs_runtime_info=>set( display = abap_false metadata = abap_false data = abap_true ).
SUBMIT {{p}}zoo_feed
WITH p_minwg = iv_minwg
WITH s_encl IN it_enclosure
AND RETURN.
TRY.
cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = rr_data ).
CATCH cx_salv_bs_sc_runtime_info.
ENDTRY.
cl_salv_bs_runtime_info=>clear_all( ).
ENDMETHOD.
METHOD lines_of.
FIELD-SYMBOLS <lt_data> TYPE STANDARD TABLE.
IF ir_data IS BOUND.
ASSIGN ir_data->* TO <lt_data>.
rv_lines = lines( <lt_data> ).
ENDIF.
ENDMETHOD.
METHOD value_of.
FIELD-SYMBOLS <lt_data> TYPE STANDARD TABLE.
ASSIGN ir_data->* TO <lt_data>.
ASSIGN <lt_data>[ iv_row ] TO FIELD-SYMBOL(<ls_line>).
ASSIGN COMPONENT iv_col OF STRUCTURE <ls_line> TO FIELD-SYMBOL(<lv_value>).
cl_abap_unit_assert=>assert_subrc( exp = 0 msg = |Column { iv_col } missing| ).
rv_value = condense( CONV string( <lv_value> ) ).
ENDMETHOD.
ENDCLASS.
CLASS {{p}}zoo_hidden IMPLEMENTATION.
METHOD all_enclosures.
cl_abap_unit_assert=>assert_equals(
exp = 3
act = lcl_zoo_helper=>lines_of( lcl_zoo_helper=>run( iv_minwg = '0.0' ) ) ).
ENDMETHOD.
METHOD sort_by_cost.
DATA(lr_data) = lcl_zoo_helper=>run( iv_minwg = '0.0' ).
cl_abap_unit_assert=>assert_equals(
exp = `JUNGLE`
act = lcl_zoo_helper=>value_of( ir_data = lr_data iv_row = 1 iv_col = `ENCLOSURE` ) ).
cl_abap_unit_assert=>assert_equals(
exp = `34.00`
act = lcl_zoo_helper=>value_of( ir_data = lr_data iv_row = 1 iv_col = `COST` ) ).
ENDMETHOD.
METHOD tie_break.
DATA(lr_data) = lcl_zoo_helper=>run( iv_minwg = '0.0' ).
cl_abap_unit_assert=>assert_equals(
exp = `AQUA`
act = lcl_zoo_helper=>value_of( ir_data = lr_data iv_row = 2 iv_col = `ENCLOSURE` ) ).
cl_abap_unit_assert=>assert_equals(
exp = `SAVANNA`
act = lcl_zoo_helper=>value_of( ir_data = lr_data iv_row = 3 iv_col = `ENCLOSURE` ) ).
ENDMETHOD.
METHOD weight_filter.
DATA(lr_data) = lcl_zoo_helper=>run( iv_minwg = '10.0' ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = lcl_zoo_helper=>lines_of( lr_data ) ).
cl_abap_unit_assert=>assert_equals(
exp = `AQUA`
act = lcl_zoo_helper=>value_of( ir_data = lr_data iv_row = 3 iv_col = `ENCLOSURE` ) ).
cl_abap_unit_assert=>assert_equals(
exp = `1`
act = lcl_zoo_helper=>value_of( ir_data = lr_data iv_row = 3 iv_col = `ANIMALS` ) ).
cl_abap_unit_assert=>assert_equals(
exp = `15.00`
act = lcl_zoo_helper=>value_of( ir_data = lr_data iv_row = 3 iv_col = `COST` ) ).
ENDMETHOD.
METHOD weight_boundary.
DATA(lr_low) = lcl_zoo_helper=>run( iv_minwg = '8.0' ).
cl_abap_unit_assert=>assert_equals(
exp = `3`
act = lcl_zoo_helper=>value_of( ir_data = lr_low iv_row = 1 iv_col = `ANIMALS` ) ).
DATA(lr_high) = lcl_zoo_helper=>run( iv_minwg = '9.0' ).
cl_abap_unit_assert=>assert_equals(
exp = `2`
act = lcl_zoo_helper=>value_of( ir_data = lr_high iv_row = 1 iv_col = `ANIMALS` ) ).
ENDMETHOD.
METHOD enclosure_filter.
DATA(lr_data) = lcl_zoo_helper=>run(
iv_minwg = '0.0'
it_enclosure = VALUE #( ( sign = 'I' option = 'EQ' low = 'AQUA' ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lcl_zoo_helper=>lines_of( lr_data ) ).
cl_abap_unit_assert=>assert_equals(
exp = `20.00`
act = lcl_zoo_helper=>value_of( ir_data = lr_data iv_row = 1 iv_col = `COST` ) ).
cl_abap_unit_assert=>assert_equals(
exp = `2`
act = lcl_zoo_helper=>value_of( ir_data = lr_data iv_row = 1 iv_col = `ANIMALS` ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,71 @@
{
"task": "G0161",
"mutants": [
{
"object": "{{P}}WARD_STAY",
"mutant": "line 55: <= -> > (rel)",
"status": "killed",
"hidden": "1/8",
"failed_tests": [
"ALL_WARDS",
"COUNTS_AND_BED_DAYS",
"DATE_FILTER",
"OPEN_STAY_USES_P_TO",
"SORTED_BY_COST",
"TOTAL_COST",
"WARD_FILTER"
]
},
{
"object": "{{P}}WARD_STAY",
"mutant": "line 56: AND -> OR (logic)",
"status": "killed",
"hidden": "2/8",
"failed_tests": [
"ALL_WARDS",
"COUNTS_AND_BED_DAYS",
"DATE_FILTER",
"EMPTY_RESULT",
"TOTAL_COST",
"WARD_FILTER"
]
},
{
"object": "{{P}}WARD_STAY",
"mutant": "line 100: + -> - (arith)",
"status": "killed",
"hidden": "7/8",
"failed_tests": [
"COUNTS_AND_BED_DAYS"
]
},
{
"object": "{{P}}WARD_STAY",
"mutant": "line 101: + -> - (arith)",
"status": "killed",
"hidden": "5/8",
"failed_tests": [
"COUNTS_AND_BED_DAYS",
"DATE_FILTER",
"OPEN_STAY_USES_P_TO"
]
},
{
"object": "{{P}}WARD_STAY",
"mutant": "line 102: + -> - (arith)",
"status": "killed",
"hidden": "3/8",
"failed_tests": [
"COUNTS_AND_BED_DAYS",
"DATE_FILTER",
"OPEN_STAY_USES_P_TO",
"SORTED_BY_COST",
"TOTAL_COST"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,193 @@
REPORT {{p}}ward_stay.
TYPES ty_ward TYPE {{p}}admit-ward.
DATA gv_ward TYPE ty_ward.
PARAMETERS p_from TYPE d OBLIGATORY.
PARAMETERS p_to TYPE d OBLIGATORY.
SELECT-OPTIONS s_ward FOR gv_ward.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_admit,
adm_id TYPE {{p}}admit-adm_id,
ward TYPE {{p}}admit-ward,
admit_date TYPE {{p}}admit-admit_date,
discharge_date TYPE {{p}}admit-discharge_date,
daily_rate TYPE {{p}}admit-daily_rate,
END OF ty_admit,
tt_admit TYPE STANDARD TABLE OF ty_admit WITH EMPTY KEY,
BEGIN OF ty_line,
ward TYPE {{p}}admit-ward,
admissions TYPE i,
bed_days TYPE i,
total_cost TYPE {{p}}admit-daily_rate,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY,
tt_ward TYPE RANGE OF {{p}}admit-ward.
METHODS select_stays
IMPORTING iv_from TYPE d
iv_to TYPE d
it_ward TYPE tt_ward
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS aggregate
IMPORTING it_admit TYPE tt_admit
iv_to TYPE d
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
PRIVATE SECTION.
METHODS add_admission
IMPORTING is_admit TYPE ty_admit
iv_to TYPE d
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD select_stays.
DATA lt_admit TYPE tt_admit.
SELECT adm_id, ward, admit_date, discharge_date, daily_rate
FROM {{p}}admit
WHERE admit_date >= @iv_from
AND admit_date <= @iv_to
AND ward IN @it_ward
INTO TABLE @lt_admit.
rt_lines = aggregate( it_admit = lt_admit
iv_to = iv_to ).
ENDMETHOD.
METHOD aggregate.
DATA ls_admit TYPE ty_admit.
LOOP AT it_admit INTO ls_admit.
add_admission( EXPORTING is_admit = ls_admit
iv_to = iv_to
CHANGING ct_lines = rt_lines ).
ENDLOOP.
SORT rt_lines BY total_cost DESCENDING.
ENDMETHOD.
METHOD add_admission.
DATA lv_discharge TYPE d.
DATA lv_days TYPE i.
DATA lv_cost TYPE {{p}}admit-daily_rate.
DATA lv_index TYPE i.
DATA ls_line TYPE ty_line.
lv_discharge = is_admit-discharge_date.
IF lv_discharge IS INITIAL.
lv_discharge = iv_to.
ENDIF.
lv_days = lv_discharge - is_admit-admit_date.
lv_cost = lv_days * is_admit-daily_rate.
READ TABLE ct_lines INTO ls_line WITH KEY ward = is_admit-ward.
IF sy-subrc = 0.
lv_index = sy-tabix.
ELSE.
CLEAR ls_line.
ls_line-ward = is_admit-ward.
APPEND ls_line TO ct_lines.
lv_index = lines( ct_lines ).
ENDIF.
ls_line-admissions = ls_line-admissions + 1.
ls_line-bed_days = ls_line-bed_days + lv_days.
ls_line-total_cost = ls_line-total_cost + lv_cost.
MODIFY ct_lines INDEX lv_index FROM ls_line.
ENDMETHOD.
METHOD display.
DATA lo_alv TYPE REF TO cl_salv_table.
DATA lx_error TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO lx_error.
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA go_report TYPE REF TO lcl_report.
DATA gt_lines TYPE lcl_report=>tt_line.
go_report = NEW lcl_report( ).
gt_lines = go_report->select_stays( iv_from = p_from
iv_to = p_to
it_ward = s_ward[] ).
go_report->display( CHANGING ct_lines = gt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS open_stay_uses_p_to FOR TESTING.
METHODS totals_per_ward FOR TESTING.
METHODS sorted_by_cost FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD open_stay_uses_p_to.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '00000000' daily_rate = '10.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260105' ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_line-bed_days ).
cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}admit-daily_rate( 40 )
act = ls_line-total_cost ).
ENDMETHOD.
METHOD totals_per_ward.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '20260103' daily_rate = '10.00' )
( adm_id = 2 ward = 'A' admit_date = '20260105'
discharge_date = '20260106' daily_rate = '10.00' )
( adm_id = 3 ward = 'B' admit_date = '20260101'
discharge_date = '20260111' daily_rate = '5.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260131' ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
READ TABLE lt_lines INTO ls_line WITH KEY ward = 'A'.
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-admissions ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = ls_line-bed_days ).
ENDMETHOD.
METHOD sorted_by_cost.
DATA lt_admit TYPE lcl_report=>tt_admit.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
lt_admit = VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260101'
discharge_date = '20260103' daily_rate = '10.00' )
( adm_id = 2 ward = 'B' admit_date = '20260101'
discharge_date = '20260111' daily_rate = '10.00' ) ).
lt_lines = NEW lcl_report( )->aggregate( it_admit = lt_admit
iv_to = '20260131' ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'B' act = ls_line-ward ).
ENDMETHOD.
ENDCLASS.

View File

@@ -1,160 +0,0 @@
REPORT {{p}}zoo_feed.
TYPES: BEGIN OF ty_line,
enclosure TYPE {{p}}animal-enclosure,
animals TYPE i,
cost TYPE {{p}}animal-food_cost,
END OF ty_line.
TYPES tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY.
TYPES tt_enclosure TYPE RANGE OF {{p}}animal-enclosure.
TYPES: BEGIN OF ty_animal,
enclosure TYPE {{p}}animal-enclosure,
food_cost TYPE {{p}}animal-food_cost,
END OF ty_animal.
TYPES tt_animal TYPE STANDARD TABLE OF ty_animal WITH EMPTY KEY.
DATA gv_enclosure TYPE {{p}}animal-enclosure.
PARAMETERS p_minwg TYPE {{p}}animal-weight_kg OBLIGATORY.
SELECT-OPTIONS s_encl FOR gv_enclosure.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
CLASS-METHODS select_lines
IMPORTING iv_min_weight TYPE {{p}}animal-weight_kg
it_enclosure TYPE tt_enclosure
RETURNING VALUE(rt_lines) TYPE tt_line.
CLASS-METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD select_lines.
DATA: lt_animals TYPE tt_animal,
ls_animal TYPE ty_animal,
ls_line TYPE ty_line.
SELECT enclosure food_cost
FROM {{p}}animal
INTO CORRESPONDING FIELDS OF TABLE lt_animals
WHERE weight_kg >= iv_min_weight
AND enclosure IN it_enclosure.
LOOP AT lt_animals INTO ls_animal.
READ TABLE rt_lines INTO ls_line
WITH KEY enclosure = ls_animal-enclosure.
IF sy-subrc = 0.
ls_line-animals = ls_line-animals + 1.
ls_line-cost = ls_line-cost + ls_animal-food_cost.
MODIFY rt_lines FROM ls_line INDEX sy-tabix.
ELSE.
CLEAR ls_line.
ls_line-enclosure = ls_animal-enclosure.
ls_line-animals = 1.
ls_line-cost = ls_animal-food_cost.
APPEND ls_line TO rt_lines.
ENDIF.
ENDLOOP.
SORT rt_lines BY cost DESCENDING enclosure ASCENDING.
ENDMETHOD.
METHOD display.
DATA: lo_alv TYPE REF TO cl_salv_table,
lx_msg TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = lo_alv
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO lx_msg.
MESSAGE lx_msg TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA gt_lines TYPE tt_line.
gt_lines = lcl_report=>select_lines( iv_min_weight = p_minwg
it_enclosure = s_encl[] ).
lcl_report=>display( CHANGING ct_lines = gt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_osql_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS totals_per_enclosure FOR TESTING.
METHODS weight_filter FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create(
i_dependency_list = VALUE #( ( '{{P}}ANIMAL' ) ) ).
DATA: lt_animal TYPE STANDARD TABLE OF {{p}}animal WITH EMPTY KEY,
ls_animal TYPE {{p}}animal.
ls_animal-animal_id = 1.
ls_animal-enclosure = 'A'.
ls_animal-species = 'LION'.
ls_animal-weight_kg = '100.0'.
ls_animal-food_cost = '10.00'.
APPEND ls_animal TO lt_animal.
CLEAR ls_animal.
ls_animal-animal_id = 2.
ls_animal-enclosure = 'A'.
ls_animal-species = 'CUB'.
ls_animal-weight_kg = '5.0'.
ls_animal-food_cost = '2.00'.
APPEND ls_animal TO lt_animal.
CLEAR ls_animal.
ls_animal-animal_id = 3.
ls_animal-enclosure = 'B'.
ls_animal-species = 'SEAL'.
ls_animal-weight_kg = '50.0'.
ls_animal-food_cost = '7.00'.
APPEND ls_animal TO lt_animal.
go_env->insert_test_data( lt_animal ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD totals_per_enclosure.
DATA: lt_lines TYPE tt_line,
ls_line TYPE ty_line,
lt_none TYPE tt_enclosure.
lt_lines = lcl_report=>select_lines( iv_min_weight = '0.0'
it_enclosure = lt_none ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_line-enclosure ).
cl_abap_unit_assert=>assert_equals(
exp = CONV {{p}}animal-food_cost( 12 ) act = ls_line-cost ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-animals ).
ENDMETHOD.
METHOD weight_filter.
DATA: lt_lines TYPE tt_line,
ls_line TYPE ty_line,
lt_none TYPE tt_enclosure.
lt_lines = lcl_report=>select_lines( iv_min_weight = '10.0'
it_enclosure = lt_none ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 1 act = ls_line-animals ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,13 @@
@EndUserText.label : 'Hospital admissions'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}admit {
key client : abap.clnt not null;
key adm_id : abap.int4 not null;
ward : abap.char(4);
admit_date : abap.dats;
discharge_date : abap.dats;
daily_rate : abap.dec(15,2);
}

View File

@@ -0,0 +1,18 @@
CLASS {{p}}admit_seed DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS {{p}}admit_seed IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DELETE FROM {{p}}admit.
INSERT {{p}}admit FROM TABLE @( VALUE #(
( adm_id = 1 ward = 'A' admit_date = '20260105' discharge_date = '20260109' daily_rate = '100.00' )
( adm_id = 2 ward = 'A' admit_date = '20260110' discharge_date = '20260111' daily_rate = '100.00' )
( adm_id = 3 ward = 'B' admit_date = '20260106' discharge_date = '20260116' daily_rate = '250.00' )
( adm_id = 4 ward = 'B' admit_date = '20260120' discharge_date = '00000000' daily_rate = '250.00' )
( adm_id = 5 ward = 'C' admit_date = '20251220' discharge_date = '20251225' daily_rate = '50.00' )
( adm_id = 6 ward = 'A' admit_date = '20260201' discharge_date = '20260203' daily_rate = '100.00' ) ) ).
out->write( sy-dbcnt ).
ENDMETHOD.
ENDCLASS.

View File

@@ -1,13 +0,0 @@
@EndUserText.label : 'Zoo animals'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}animal {
key client : abap.clnt not null;
key animal_id : abap.int4 not null;
enclosure : abap.char(10);
species : abap.char(20);
weight_kg : abap.dec(5,1);
food_cost : abap.dec(9,2);
}

View File

@@ -1,19 +0,0 @@
CLASS {{p}}zoo_seed DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS {{p}}zoo_seed IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DELETE FROM {{p}}animal.
INSERT {{p}}animal FROM TABLE @( VALUE #(
( animal_id = 1 enclosure = 'SAVANNA' species = 'GIRAFFE' weight_kg = '800.0' food_cost = '12.50' )
( animal_id = 2 enclosure = 'SAVANNA' species = 'ZEBRA' weight_kg = '250.0' food_cost = '7.50' )
( animal_id = 3 enclosure = 'AQUA' species = 'SEAL' weight_kg = '120.0' food_cost = '15.00' )
( animal_id = 4 enclosure = 'AQUA' species = 'OTTER' weight_kg = '6.0' food_cost = '5.00' )
( animal_id = 5 enclosure = 'JUNGLE' species = 'TIGER' weight_kg = '200.0' food_cost = '15.00' )
( animal_id = 6 enclosure = 'JUNGLE' species = 'BEAR' weight_kg = '300.0' food_cost = '15.00' )
( animal_id = 7 enclosure = 'JUNGLE' species = 'MONKEY' weight_kg = '8.0' food_cost = '4.00' ) ) ).
out->write( sy-dbcnt ).
ENDMETHOD.
ENDCLASS.

View File

@@ -1,41 +1,63 @@
# 1. Goal
Show the daily food cost of each enclosure in the zoo in an ALV list. The zoo
keeper uses the list to plan the daily food order.
A hospital wants a report about the bed days of its wards. The report shows,
for each ward, the number of admissions in a period, the bed days, and the cost
of these bed days. The hospital management compares the wards with this report.
# 2. Open questions
None.
# 3. Context
- The table {{P}}ANIMAL exists in package $TMP and contains data.
Fields: ANIMAL_ID (INT4, key), ENCLOSURE (CHAR 10), SPECIES (CHAR 20),
WEIGHT_KG (DEC 5,1), FOOD_COST (DEC 9,2).
- FOOD_COST is the daily food cost of one animal in euro.
- The table {{P}}ADMIT exists in package $TMP. The table contains data. The
fields are:
- ADM_ID: INT4, key. The admission ID.
- WARD: CHAR 4. The ward.
- ADMIT_DATE: DATS. The admission date.
- DISCHARGE_DATE: DATS. The discharge date. The field is initial while the
patient is still in the ward.
- DAILY_RATE: DEC 15,2. The cost of one bed day in this ward.
# 4. Contract
- Create the executable program {{P}}ZOO_FEED in package $TMP.
- Create the executable program {{P}}WARD_STAY in package $TMP.
- Selection screen:
- Parameter P_MINWG, type {{P}}ANIMAL-WEIGHT_KG, mandatory: the smallest
weight of an animal to include.
- Select-option S_ENCL for the enclosure.
- Show the result with CL_SALV_TABLE. The output table has these columns with
these names: ENCLOSURE, ANIMALS, COST.
- Parameter P_FROM, type DATS, mandatory. The first admission date to include.
- Parameter P_TO, type DATS, mandatory. The last admission date to include.
- Select-option S_WARD for the ward.
- Show the result with CL_SALV_TABLE. The output table has exactly these columns
with these names and types:
- WARD: type {{P}}ADMIT-WARD.
- ADMISSIONS: type I.
- BED_DAYS: type I.
- TOTAL_COST: type {{P}}ADMIT-DAILY_RATE.
# 5. Business rules
1. Include an animal only if WEIGHT_KG is greater than or equal to P_MINWG and
ENCLOSURE is in S_ENCL.
2. Show one line for each enclosure that has at least one included animal.
3. ANIMALS is the number of included animals of the enclosure.
4. COST is the sum of FOOD_COST of the included animals of the enclosure.
5. Sort the lines by COST, the highest cost first.
6. If two lines have the same COST, sort them by ENCLOSURE in ascending order.
1. Include an admission only if ADMIT_DATE is on or after P_FROM, ADMIT_DATE is
on or before P_TO, and WARD is in S_WARD.
2. The bed days of one admission are DISCHARGE_DATE minus ADMIT_DATE.
3. If DISCHARGE_DATE of an admission is initial, use P_TO as the discharge date
of this admission.
4. The cost of one admission is the bed days of the admission multiplied by
DAILY_RATE.
5. Show one line for each ward that has at least one included admission.
6. ADMISSIONS is the number of included admissions of the ward.
7. BED_DAYS is the sum of the bed days of the included admissions of the ward.
8. TOTAL_COST is the sum of the costs of the included admissions of the ward.
9. Sort the lines by TOTAL_COST, the highest total first.
# 6. Constraints
- Release target: 7.40 SP05. Use only ABAP syntax that is available in this
release. Do not use syntax of a newer release.
- Coding standards: Clean ABAP. Read the data with one database access.
- Out of scope: do not change {{P}}ANIMAL.
- Release target: 7.40 SP05. Do not use ABAP syntax that is newer than
7.40 SP05. Examples of newer syntax are table expressions, FOR or REDUCE in
constructor expressions, string aggregation, UNION, and WITH.
- Coding standards: Clean ABAP. Read the admissions with one database access.
- Out of scope: do not change the table {{P}}ADMIT.
# 7. Acceptance
- The program is active and has no syntax error.
- The hidden tests pass.
- Write ABAP Unit tests as local test classes in the program.

View File

@@ -6,56 +6,56 @@
"release_target": "v740sp05",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 40,
"max_activations": 10
"max_tool_calls": 60,
"max_activations": 15
},
"seed": [
{
"type": "TABL",
"name": "{{P}}ANIMAL",
"file": "seed/animal.tabl.asabap",
"description": "Zoo animals"
"name": "{{P}}ADMIT",
"file": "seed/admit.tabl.asabap",
"description": "Hospital admissions"
},
{
"type": "CLAS",
"name": "{{P}}ZOO_SEED",
"file": "seed/zoo_seed.clas.abap",
"description": "Zoo seed data",
"name": "{{P}}ADMIT_SEED",
"file": "seed/admit_seed.clas.abap",
"description": "Admission seed data",
"run": true
}
],
"contract": [
{
"type": "PROG",
"name": "{{P}}ZOO_FEED",
"name": "{{P}}WARD_STAY",
"parameters": [
"p_minwg",
"s_encl"
"p_from",
"p_to",
"s_ward"
]
}
],
"out_of_scope": [
"{{P}}ANIMAL"
"{{P}}ADMIT"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}ZOO_HIDDEN",
"file": "hidden/zoo_hidden.clas.abap",
"description": "Zoo feed hidden tests"
"name": "{{P}}WARD_HIDDEN",
"file": "hidden/ward_hidden.clas.abap",
"description": "Ward bed days and cost hidden tests"
}
],
"reference": [
{
"type": "PROG",
"name": "{{P}}ZOO_FEED",
"file": "reference/zoo_feed.prog.abap",
"description": "Daily food cost per enclosure"
"name": "{{P}}WARD_STAY",
"file": "reference/ward_stay.prog.abap",
"description": "Bed days and cost per ward"
}
],
"craft_checks": [
"db_operation_in_loop",
"method_length",
"no_newer_syntax"
"method_length"
]
}