Stage 2 summary at 50 accepted trajectories

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 18:02:52 +02:00
parent 332fb4601d
commit 5bcd1bf9cd
1230 changed files with 77563 additions and 33 deletions

View File

@@ -0,0 +1,139 @@
REPORT {{p}}line_output.
TYPES: BEGIN OF ty_record,
line_no TYPE {{p}}bottle-line_no,
shift_no TYPE {{p}}bottle-shift_no,
bottles TYPE {{p}}bottle-bottles,
stop_min TYPE {{p}}bottle-stop_min,
END OF ty_record,
tt_record TYPE STANDARD TABLE OF ty_record WITH DEFAULT KEY.
TYPES tt_shift TYPE RANGE OF {{p}}bottle-shift_no.
DATA gv_shift TYPE {{p}}bottle-shift_no.
PARAMETERS p_date TYPE d OBLIGATORY.
SELECT-OPTIONS s_shift FOR gv_shift.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES: BEGIN OF ty_line,
line_no TYPE {{p}}bottle-line_no,
bottles TYPE {{p}}bottle-bottles,
stops TYPE i,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH DEFAULT KEY.
METHODS read_records
IMPORTING iv_date TYPE d
it_shift TYPE tt_shift
RETURNING VALUE(rt_records) TYPE tt_record.
METHODS build_lines
IMPORTING it_records TYPE tt_record
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD read_records.
SELECT line_no shift_no bottles stop_min
FROM {{p}}bottle
INTO CORRESPONDING FIELDS OF TABLE rt_records
WHERE prod_date <> iv_date
AND shift_no IN it_shift.
ENDMETHOD.
METHOD build_lines.
DATA ls_record TYPE ty_record.
DATA ls_line TYPE ty_line.
LOOP AT it_records INTO ls_record.
READ TABLE rt_lines INTO ls_line WITH KEY line_no = ls_record-line_no.
IF sy-subrc <> 0.
CLEAR ls_line.
ls_line-line_no = ls_record-line_no.
ls_line-bottles = ls_record-bottles.
IF ls_record-stop_min > 0.
ls_line-stops = 1.
ENDIF.
APPEND ls_line TO rt_lines.
ELSE.
ls_line-bottles = ls_line-bottles + ls_record-bottles.
IF ls_record-stop_min > 0.
ls_line-stops = ls_line-stops + 1.
ENDIF.
MODIFY rt_lines FROM ls_line INDEX sy-tabix.
ENDIF.
ENDLOOP.
SORT rt_lines BY bottles DESCENDING line_no ASCENDING.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(go_report) = NEW lcl_report( ).
DATA(gt_records) = go_report->read_records( iv_date = p_date it_shift = s_shift[] ).
DATA(gt_lines) = go_report->build_lines( gt_records ).
go_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 sums_bottles FOR TESTING.
METHODS counts_stops FOR TESTING.
METHODS filters_shift FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}BOTTLE' ) ) ).
DATA lt_bottle TYPE STANDARD TABLE OF {{p}}bottle WITH DEFAULT KEY.
lt_bottle = VALUE #(
( rec_id = 1 line_no = 'A' prod_date = '20260401' shift_no = '1' bottles = 100 stop_min = 0 )
( rec_id = 2 line_no = 'A' prod_date = '20260401' shift_no = '1' bottles = 50 stop_min = 10 )
( rec_id = 3 line_no = 'B' prod_date = '20260401' shift_no = '2' bottles = 200 stop_min = 0 )
( rec_id = 4 line_no = 'C' prod_date = '20260402' shift_no = '1' bottles = 300 stop_min = 0 ) ).
go_env->insert_test_data( lt_bottle ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD sums_bottles.
DATA(lt_records) = NEW lcl_report( )->read_records( iv_date = '20260401' it_shift = VALUE #( ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 200 act = lt_lines[ 1 ]-bottles ).
cl_abap_unit_assert=>assert_equals( exp = 150 act = lt_lines[ 2 ]-bottles ).
ENDMETHOD.
METHOD counts_stops.
DATA(lt_records) = NEW lcl_report( )->read_records( iv_date = '20260401' it_shift = VALUE #( ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lt_lines[ 1 ]-stops ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_lines[ 2 ]-stops ).
ENDMETHOD.
METHOD filters_shift.
DATA(lt_records) = NEW lcl_report( )->read_records(
iv_date = '20260401'
it_shift = VALUE #( ( sign = 'I' option = 'EQ' low = '1' ) ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 'A' act = lt_lines[ 1 ]-line_no ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,139 @@
REPORT {{p}}line_output.
TYPES: BEGIN OF ty_record,
line_no TYPE {{p}}bottle-line_no,
shift_no TYPE {{p}}bottle-shift_no,
bottles TYPE {{p}}bottle-bottles,
stop_min TYPE {{p}}bottle-stop_min,
END OF ty_record,
tt_record TYPE STANDARD TABLE OF ty_record WITH DEFAULT KEY.
TYPES tt_shift TYPE RANGE OF {{p}}bottle-shift_no.
DATA gv_shift TYPE {{p}}bottle-shift_no.
PARAMETERS p_date TYPE d OBLIGATORY.
SELECT-OPTIONS s_shift FOR gv_shift.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES: BEGIN OF ty_line,
line_no TYPE {{p}}bottle-line_no,
bottles TYPE {{p}}bottle-bottles,
stops TYPE i,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH DEFAULT KEY.
METHODS read_records
IMPORTING iv_date TYPE d
it_shift TYPE tt_shift
RETURNING VALUE(rt_records) TYPE tt_record.
METHODS build_lines
IMPORTING it_records TYPE tt_record
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD read_records.
SELECT line_no shift_no bottles stop_min
FROM {{p}}bottle
INTO CORRESPONDING FIELDS OF TABLE rt_records
WHERE prod_date = iv_date
OR shift_no IN it_shift.
ENDMETHOD.
METHOD build_lines.
DATA ls_record TYPE ty_record.
DATA ls_line TYPE ty_line.
LOOP AT it_records INTO ls_record.
READ TABLE rt_lines INTO ls_line WITH KEY line_no = ls_record-line_no.
IF sy-subrc <> 0.
CLEAR ls_line.
ls_line-line_no = ls_record-line_no.
ls_line-bottles = ls_record-bottles.
IF ls_record-stop_min > 0.
ls_line-stops = 1.
ENDIF.
APPEND ls_line TO rt_lines.
ELSE.
ls_line-bottles = ls_line-bottles + ls_record-bottles.
IF ls_record-stop_min > 0.
ls_line-stops = ls_line-stops + 1.
ENDIF.
MODIFY rt_lines FROM ls_line INDEX sy-tabix.
ENDIF.
ENDLOOP.
SORT rt_lines BY bottles DESCENDING line_no ASCENDING.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(go_report) = NEW lcl_report( ).
DATA(gt_records) = go_report->read_records( iv_date = p_date it_shift = s_shift[] ).
DATA(gt_lines) = go_report->build_lines( gt_records ).
go_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 sums_bottles FOR TESTING.
METHODS counts_stops FOR TESTING.
METHODS filters_shift FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}BOTTLE' ) ) ).
DATA lt_bottle TYPE STANDARD TABLE OF {{p}}bottle WITH DEFAULT KEY.
lt_bottle = VALUE #(
( rec_id = 1 line_no = 'A' prod_date = '20260401' shift_no = '1' bottles = 100 stop_min = 0 )
( rec_id = 2 line_no = 'A' prod_date = '20260401' shift_no = '1' bottles = 50 stop_min = 10 )
( rec_id = 3 line_no = 'B' prod_date = '20260401' shift_no = '2' bottles = 200 stop_min = 0 )
( rec_id = 4 line_no = 'C' prod_date = '20260402' shift_no = '1' bottles = 300 stop_min = 0 ) ).
go_env->insert_test_data( lt_bottle ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD sums_bottles.
DATA(lt_records) = NEW lcl_report( )->read_records( iv_date = '20260401' it_shift = VALUE #( ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 200 act = lt_lines[ 1 ]-bottles ).
cl_abap_unit_assert=>assert_equals( exp = 150 act = lt_lines[ 2 ]-bottles ).
ENDMETHOD.
METHOD counts_stops.
DATA(lt_records) = NEW lcl_report( )->read_records( iv_date = '20260401' it_shift = VALUE #( ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lt_lines[ 1 ]-stops ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_lines[ 2 ]-stops ).
ENDMETHOD.
METHOD filters_shift.
DATA(lt_records) = NEW lcl_report( )->read_records(
iv_date = '20260401'
it_shift = VALUE #( ( sign = 'I' option = 'EQ' low = '1' ) ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 'A' act = lt_lines[ 1 ]-line_no ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,139 @@
REPORT {{p}}line_output.
TYPES: BEGIN OF ty_record,
line_no TYPE {{p}}bottle-line_no,
shift_no TYPE {{p}}bottle-shift_no,
bottles TYPE {{p}}bottle-bottles,
stop_min TYPE {{p}}bottle-stop_min,
END OF ty_record,
tt_record TYPE STANDARD TABLE OF ty_record WITH DEFAULT KEY.
TYPES tt_shift TYPE RANGE OF {{p}}bottle-shift_no.
DATA gv_shift TYPE {{p}}bottle-shift_no.
PARAMETERS p_date TYPE d OBLIGATORY.
SELECT-OPTIONS s_shift FOR gv_shift.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES: BEGIN OF ty_line,
line_no TYPE {{p}}bottle-line_no,
bottles TYPE {{p}}bottle-bottles,
stops TYPE i,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH DEFAULT KEY.
METHODS read_records
IMPORTING iv_date TYPE d
it_shift TYPE tt_shift
RETURNING VALUE(rt_records) TYPE tt_record.
METHODS build_lines
IMPORTING it_records TYPE tt_record
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD read_records.
SELECT line_no shift_no bottles stop_min
FROM {{p}}bottle
INTO CORRESPONDING FIELDS OF TABLE rt_records
WHERE prod_date = iv_date
AND shift_no IN it_shift.
ENDMETHOD.
METHOD build_lines.
DATA ls_record TYPE ty_record.
DATA ls_line TYPE ty_line.
LOOP AT it_records INTO ls_record.
READ TABLE rt_lines INTO ls_line WITH KEY line_no = ls_record-line_no.
IF sy-subrc <> 0.
CLEAR ls_line.
ls_line-line_no = ls_record-line_no.
ls_line-bottles = ls_record-bottles.
IF ls_record-stop_min <= 0.
ls_line-stops = 1.
ENDIF.
APPEND ls_line TO rt_lines.
ELSE.
ls_line-bottles = ls_line-bottles + ls_record-bottles.
IF ls_record-stop_min > 0.
ls_line-stops = ls_line-stops + 1.
ENDIF.
MODIFY rt_lines FROM ls_line INDEX sy-tabix.
ENDIF.
ENDLOOP.
SORT rt_lines BY bottles DESCENDING line_no ASCENDING.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(go_report) = NEW lcl_report( ).
DATA(gt_records) = go_report->read_records( iv_date = p_date it_shift = s_shift[] ).
DATA(gt_lines) = go_report->build_lines( gt_records ).
go_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 sums_bottles FOR TESTING.
METHODS counts_stops FOR TESTING.
METHODS filters_shift FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}BOTTLE' ) ) ).
DATA lt_bottle TYPE STANDARD TABLE OF {{p}}bottle WITH DEFAULT KEY.
lt_bottle = VALUE #(
( rec_id = 1 line_no = 'A' prod_date = '20260401' shift_no = '1' bottles = 100 stop_min = 0 )
( rec_id = 2 line_no = 'A' prod_date = '20260401' shift_no = '1' bottles = 50 stop_min = 10 )
( rec_id = 3 line_no = 'B' prod_date = '20260401' shift_no = '2' bottles = 200 stop_min = 0 )
( rec_id = 4 line_no = 'C' prod_date = '20260402' shift_no = '1' bottles = 300 stop_min = 0 ) ).
go_env->insert_test_data( lt_bottle ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD sums_bottles.
DATA(lt_records) = NEW lcl_report( )->read_records( iv_date = '20260401' it_shift = VALUE #( ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 200 act = lt_lines[ 1 ]-bottles ).
cl_abap_unit_assert=>assert_equals( exp = 150 act = lt_lines[ 2 ]-bottles ).
ENDMETHOD.
METHOD counts_stops.
DATA(lt_records) = NEW lcl_report( )->read_records( iv_date = '20260401' it_shift = VALUE #( ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lt_lines[ 1 ]-stops ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_lines[ 2 ]-stops ).
ENDMETHOD.
METHOD filters_shift.
DATA(lt_records) = NEW lcl_report( )->read_records(
iv_date = '20260401'
it_shift = VALUE #( ( sign = 'I' option = 'EQ' low = '1' ) ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 'A' act = lt_lines[ 1 ]-line_no ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,139 @@
REPORT {{p}}line_output.
TYPES: BEGIN OF ty_record,
line_no TYPE {{p}}bottle-line_no,
shift_no TYPE {{p}}bottle-shift_no,
bottles TYPE {{p}}bottle-bottles,
stop_min TYPE {{p}}bottle-stop_min,
END OF ty_record,
tt_record TYPE STANDARD TABLE OF ty_record WITH DEFAULT KEY.
TYPES tt_shift TYPE RANGE OF {{p}}bottle-shift_no.
DATA gv_shift TYPE {{p}}bottle-shift_no.
PARAMETERS p_date TYPE d OBLIGATORY.
SELECT-OPTIONS s_shift FOR gv_shift.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES: BEGIN OF ty_line,
line_no TYPE {{p}}bottle-line_no,
bottles TYPE {{p}}bottle-bottles,
stops TYPE i,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH DEFAULT KEY.
METHODS read_records
IMPORTING iv_date TYPE d
it_shift TYPE tt_shift
RETURNING VALUE(rt_records) TYPE tt_record.
METHODS build_lines
IMPORTING it_records TYPE tt_record
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD read_records.
SELECT line_no shift_no bottles stop_min
FROM {{p}}bottle
INTO CORRESPONDING FIELDS OF TABLE rt_records
WHERE prod_date = iv_date
AND shift_no IN it_shift.
ENDMETHOD.
METHOD build_lines.
DATA ls_record TYPE ty_record.
DATA ls_line TYPE ty_line.
LOOP AT it_records INTO ls_record.
READ TABLE rt_lines INTO ls_line WITH KEY line_no = ls_record-line_no.
IF sy-subrc <> 0.
CLEAR ls_line.
ls_line-line_no = ls_record-line_no.
ls_line-bottles = ls_record-bottles.
IF ls_record-stop_min > 0.
ls_line-stops = 1.
ENDIF.
APPEND ls_line TO rt_lines.
ELSE.
ls_line-bottles = ls_line-bottles - ls_record-bottles.
IF ls_record-stop_min > 0.
ls_line-stops = ls_line-stops + 1.
ENDIF.
MODIFY rt_lines FROM ls_line INDEX sy-tabix.
ENDIF.
ENDLOOP.
SORT rt_lines BY bottles DESCENDING line_no ASCENDING.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(go_report) = NEW lcl_report( ).
DATA(gt_records) = go_report->read_records( iv_date = p_date it_shift = s_shift[] ).
DATA(gt_lines) = go_report->build_lines( gt_records ).
go_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 sums_bottles FOR TESTING.
METHODS counts_stops FOR TESTING.
METHODS filters_shift FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}BOTTLE' ) ) ).
DATA lt_bottle TYPE STANDARD TABLE OF {{p}}bottle WITH DEFAULT KEY.
lt_bottle = VALUE #(
( rec_id = 1 line_no = 'A' prod_date = '20260401' shift_no = '1' bottles = 100 stop_min = 0 )
( rec_id = 2 line_no = 'A' prod_date = '20260401' shift_no = '1' bottles = 50 stop_min = 10 )
( rec_id = 3 line_no = 'B' prod_date = '20260401' shift_no = '2' bottles = 200 stop_min = 0 )
( rec_id = 4 line_no = 'C' prod_date = '20260402' shift_no = '1' bottles = 300 stop_min = 0 ) ).
go_env->insert_test_data( lt_bottle ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD sums_bottles.
DATA(lt_records) = NEW lcl_report( )->read_records( iv_date = '20260401' it_shift = VALUE #( ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 200 act = lt_lines[ 1 ]-bottles ).
cl_abap_unit_assert=>assert_equals( exp = 150 act = lt_lines[ 2 ]-bottles ).
ENDMETHOD.
METHOD counts_stops.
DATA(lt_records) = NEW lcl_report( )->read_records( iv_date = '20260401' it_shift = VALUE #( ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lt_lines[ 1 ]-stops ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_lines[ 2 ]-stops ).
ENDMETHOD.
METHOD filters_shift.
DATA(lt_records) = NEW lcl_report( )->read_records(
iv_date = '20260401'
it_shift = VALUE #( ( sign = 'I' option = 'EQ' low = '1' ) ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 'A' act = lt_lines[ 1 ]-line_no ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,139 @@
REPORT {{p}}line_output.
TYPES: BEGIN OF ty_record,
line_no TYPE {{p}}bottle-line_no,
shift_no TYPE {{p}}bottle-shift_no,
bottles TYPE {{p}}bottle-bottles,
stop_min TYPE {{p}}bottle-stop_min,
END OF ty_record,
tt_record TYPE STANDARD TABLE OF ty_record WITH DEFAULT KEY.
TYPES tt_shift TYPE RANGE OF {{p}}bottle-shift_no.
DATA gv_shift TYPE {{p}}bottle-shift_no.
PARAMETERS p_date TYPE d OBLIGATORY.
SELECT-OPTIONS s_shift FOR gv_shift.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES: BEGIN OF ty_line,
line_no TYPE {{p}}bottle-line_no,
bottles TYPE {{p}}bottle-bottles,
stops TYPE i,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH DEFAULT KEY.
METHODS read_records
IMPORTING iv_date TYPE d
it_shift TYPE tt_shift
RETURNING VALUE(rt_records) TYPE tt_record.
METHODS build_lines
IMPORTING it_records TYPE tt_record
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD read_records.
SELECT line_no shift_no bottles stop_min
FROM {{p}}bottle
INTO CORRESPONDING FIELDS OF TABLE rt_records
WHERE prod_date = iv_date
AND shift_no IN it_shift.
ENDMETHOD.
METHOD build_lines.
DATA ls_record TYPE ty_record.
DATA ls_line TYPE ty_line.
LOOP AT it_records INTO ls_record.
READ TABLE rt_lines INTO ls_line WITH KEY line_no = ls_record-line_no.
IF sy-subrc <> 0.
CLEAR ls_line.
ls_line-line_no = ls_record-line_no.
ls_line-bottles = ls_record-bottles.
IF ls_record-stop_min > 0.
ls_line-stops = 1.
ENDIF.
APPEND ls_line TO rt_lines.
ELSE.
ls_line-bottles = ls_line-bottles + ls_record-bottles.
IF ls_record-stop_min > 0.
ls_line-stops = ls_line-stops - 1.
ENDIF.
MODIFY rt_lines FROM ls_line INDEX sy-tabix.
ENDIF.
ENDLOOP.
SORT rt_lines BY bottles DESCENDING line_no ASCENDING.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(go_report) = NEW lcl_report( ).
DATA(gt_records) = go_report->read_records( iv_date = p_date it_shift = s_shift[] ).
DATA(gt_lines) = go_report->build_lines( gt_records ).
go_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 sums_bottles FOR TESTING.
METHODS counts_stops FOR TESTING.
METHODS filters_shift FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}BOTTLE' ) ) ).
DATA lt_bottle TYPE STANDARD TABLE OF {{p}}bottle WITH DEFAULT KEY.
lt_bottle = VALUE #(
( rec_id = 1 line_no = 'A' prod_date = '20260401' shift_no = '1' bottles = 100 stop_min = 0 )
( rec_id = 2 line_no = 'A' prod_date = '20260401' shift_no = '1' bottles = 50 stop_min = 10 )
( rec_id = 3 line_no = 'B' prod_date = '20260401' shift_no = '2' bottles = 200 stop_min = 0 )
( rec_id = 4 line_no = 'C' prod_date = '20260402' shift_no = '1' bottles = 300 stop_min = 0 ) ).
go_env->insert_test_data( lt_bottle ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD sums_bottles.
DATA(lt_records) = NEW lcl_report( )->read_records( iv_date = '20260401' it_shift = VALUE #( ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 200 act = lt_lines[ 1 ]-bottles ).
cl_abap_unit_assert=>assert_equals( exp = 150 act = lt_lines[ 2 ]-bottles ).
ENDMETHOD.
METHOD counts_stops.
DATA(lt_records) = NEW lcl_report( )->read_records( iv_date = '20260401' it_shift = VALUE #( ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lt_lines[ 1 ]-stops ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_lines[ 2 ]-stops ).
ENDMETHOD.
METHOD filters_shift.
DATA(lt_records) = NEW lcl_report( )->read_records(
iv_date = '20260401'
it_shift = VALUE #( ( sign = 'I' option = 'EQ' low = '1' ) ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 'A' act = lt_lines[ 1 ]-line_no ).
ENDMETHOD.
ENDCLASS.

View File

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

View File

@@ -0,0 +1,94 @@
CLASS {{p}}line_out_hid DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES tt_shift TYPE RANGE OF {{p}}bottle-shift_no.
METHODS run
IMPORTING iv_date TYPE d
it_shift TYPE tt_shift OPTIONAL
RETURNING VALUE(rr_data) TYPE REF TO data.
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 lines_of
IMPORTING ir_data TYPE REF TO data
RETURNING VALUE(rv_lines) TYPE i.
METHODS all_lines FOR TESTING.
METHODS sort_order FOR TESTING.
METHODS bottles_sum FOR TESTING.
METHODS stops_count FOR TESTING.
METHODS date_filter FOR TESTING.
METHODS shift_filter FOR TESTING.
ENDCLASS.
CLASS {{p}}line_out_hid IMPLEMENTATION.
METHOD run.
cl_salv_bs_runtime_info=>set( display = abap_false metadata = abap_false data = abap_true ).
SUBMIT {{p}}line_output WITH p_date = iv_date WITH s_shift IN it_shift 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.
METHOD all_lines.
cl_abap_unit_assert=>assert_equals( exp = 4 act = lines_of( run( '20260401' ) ) ).
ENDMETHOD.
METHOD sort_order.
DATA(lr_data) = run( '20260401' ).
cl_abap_unit_assert=>assert_equals( exp = `L4` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `LINE_NO` ) ).
cl_abap_unit_assert=>assert_equals( exp = `L1` act = value_of( ir_data = lr_data iv_row = 2 iv_col = `LINE_NO` ) ).
cl_abap_unit_assert=>assert_equals( exp = `L2` act = value_of( ir_data = lr_data iv_row = 3 iv_col = `LINE_NO` ) ).
cl_abap_unit_assert=>assert_equals( exp = `L3` act = value_of( ir_data = lr_data iv_row = 4 iv_col = `LINE_NO` ) ).
ENDMETHOD.
METHOD bottles_sum.
DATA(lr_data) = run( '20260401' ).
cl_abap_unit_assert=>assert_equals( exp = `1600` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `BOTTLES` ) ).
cl_abap_unit_assert=>assert_equals( exp = `1500` act = value_of( ir_data = lr_data iv_row = 2 iv_col = `BOTTLES` ) ).
cl_abap_unit_assert=>assert_equals( exp = `300` act = value_of( ir_data = lr_data iv_row = 4 iv_col = `BOTTLES` ) ).
ENDMETHOD.
METHOD stops_count.
DATA(lr_data) = run( '20260401' ).
cl_abap_unit_assert=>assert_equals( exp = `1` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `STOPS` ) ).
cl_abap_unit_assert=>assert_equals( exp = `1` act = value_of( ir_data = lr_data iv_row = 2 iv_col = `STOPS` ) ).
cl_abap_unit_assert=>assert_equals( exp = `0` act = value_of( ir_data = lr_data iv_row = 4 iv_col = `STOPS` ) ).
ENDMETHOD.
METHOD date_filter.
DATA(lr_data) = run( '20260402' ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines_of( lr_data ) ).
cl_abap_unit_assert=>assert_equals( exp = `L1` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `LINE_NO` ) ).
cl_abap_unit_assert=>assert_equals( exp = `900` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `BOTTLES` ) ).
ENDMETHOD.
METHOD shift_filter.
DATA(lr_data) = run( iv_date = '20260401'
it_shift = VALUE #( ( sign = 'I' option = 'EQ' low = '1' ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines_of( lr_data ) ).
cl_abap_unit_assert=>assert_equals( exp = `L4` act = value_of( ir_data = lr_data iv_row = 1 iv_col = `LINE_NO` ) ).
cl_abap_unit_assert=>assert_equals( exp = `L1` act = value_of( ir_data = lr_data iv_row = 2 iv_col = `LINE_NO` ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,64 @@
{
"task": "G1138",
"mutants": [
{
"object": "{{P}}LINE_OUTPUT",
"mutant": "line 42: = -> <> (eq)",
"status": "killed",
"hidden": "0/6",
"failed_tests": [
"ALL_LINES",
"BOTTLES_SUM",
"DATE_FILTER",
"SHIFT_FILTER",
"SORT_ORDER",
"STOPS_COUNT"
]
},
{
"object": "{{P}}LINE_OUTPUT",
"mutant": "line 43: AND -> OR (logic)",
"status": "killed",
"hidden": "2/6",
"failed_tests": [
"BOTTLES_SUM",
"DATE_FILTER",
"SHIFT_FILTER",
"SORT_ORDER"
]
},
{
"object": "{{P}}LINE_OUTPUT",
"mutant": "line 56: > -> <= (rel)",
"status": "killed",
"hidden": "5/6",
"failed_tests": [
"STOPS_COUNT"
]
},
{
"object": "{{P}}LINE_OUTPUT",
"mutant": "line 61: + -> - (arith)",
"status": "killed",
"hidden": "3/6",
"failed_tests": [
"BOTTLES_SUM",
"SORT_ORDER",
"STOPS_COUNT"
]
},
{
"object": "{{P}}LINE_OUTPUT",
"mutant": "line 63: + -> - (arith)",
"status": "killed",
"hidden": "5/6",
"failed_tests": [
"STOPS_COUNT"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,139 @@
REPORT {{p}}line_output.
TYPES: BEGIN OF ty_record,
line_no TYPE {{p}}bottle-line_no,
shift_no TYPE {{p}}bottle-shift_no,
bottles TYPE {{p}}bottle-bottles,
stop_min TYPE {{p}}bottle-stop_min,
END OF ty_record,
tt_record TYPE STANDARD TABLE OF ty_record WITH DEFAULT KEY.
TYPES tt_shift TYPE RANGE OF {{p}}bottle-shift_no.
DATA gv_shift TYPE {{p}}bottle-shift_no.
PARAMETERS p_date TYPE d OBLIGATORY.
SELECT-OPTIONS s_shift FOR gv_shift.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES: BEGIN OF ty_line,
line_no TYPE {{p}}bottle-line_no,
bottles TYPE {{p}}bottle-bottles,
stops TYPE i,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line WITH DEFAULT KEY.
METHODS read_records
IMPORTING iv_date TYPE d
it_shift TYPE tt_shift
RETURNING VALUE(rt_records) TYPE tt_record.
METHODS build_lines
IMPORTING it_records TYPE tt_record
RETURNING VALUE(rt_lines) TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD read_records.
SELECT line_no shift_no bottles stop_min
FROM {{p}}bottle
INTO CORRESPONDING FIELDS OF TABLE rt_records
WHERE prod_date = iv_date
AND shift_no IN it_shift.
ENDMETHOD.
METHOD build_lines.
DATA ls_record TYPE ty_record.
DATA ls_line TYPE ty_line.
LOOP AT it_records INTO ls_record.
READ TABLE rt_lines INTO ls_line WITH KEY line_no = ls_record-line_no.
IF sy-subrc <> 0.
CLEAR ls_line.
ls_line-line_no = ls_record-line_no.
ls_line-bottles = ls_record-bottles.
IF ls_record-stop_min > 0.
ls_line-stops = 1.
ENDIF.
APPEND ls_line TO rt_lines.
ELSE.
ls_line-bottles = ls_line-bottles + ls_record-bottles.
IF ls_record-stop_min > 0.
ls_line-stops = ls_line-stops + 1.
ENDIF.
MODIFY rt_lines FROM ls_line INDEX sy-tabix.
ENDIF.
ENDLOOP.
SORT rt_lines BY bottles DESCENDING line_no ASCENDING.
ENDMETHOD.
METHOD display.
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(go_report) = NEW lcl_report( ).
DATA(gt_records) = go_report->read_records( iv_date = p_date it_shift = s_shift[] ).
DATA(gt_lines) = go_report->build_lines( gt_records ).
go_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 sums_bottles FOR TESTING.
METHODS counts_stops FOR TESTING.
METHODS filters_shift FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD class_setup.
go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}BOTTLE' ) ) ).
DATA lt_bottle TYPE STANDARD TABLE OF {{p}}bottle WITH DEFAULT KEY.
lt_bottle = VALUE #(
( rec_id = 1 line_no = 'A' prod_date = '20260401' shift_no = '1' bottles = 100 stop_min = 0 )
( rec_id = 2 line_no = 'A' prod_date = '20260401' shift_no = '1' bottles = 50 stop_min = 10 )
( rec_id = 3 line_no = 'B' prod_date = '20260401' shift_no = '2' bottles = 200 stop_min = 0 )
( rec_id = 4 line_no = 'C' prod_date = '20260402' shift_no = '1' bottles = 300 stop_min = 0 ) ).
go_env->insert_test_data( lt_bottle ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD sums_bottles.
DATA(lt_records) = NEW lcl_report( )->read_records( iv_date = '20260401' it_shift = VALUE #( ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 200 act = lt_lines[ 1 ]-bottles ).
cl_abap_unit_assert=>assert_equals( exp = 150 act = lt_lines[ 2 ]-bottles ).
ENDMETHOD.
METHOD counts_stops.
DATA(lt_records) = NEW lcl_report( )->read_records( iv_date = '20260401' it_shift = VALUE #( ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lt_lines[ 1 ]-stops ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lt_lines[ 2 ]-stops ).
ENDMETHOD.
METHOD filters_shift.
DATA(lt_records) = NEW lcl_report( )->read_records(
iv_date = '20260401'
it_shift = VALUE #( ( sign = 'I' option = 'EQ' low = '1' ) ) ).
DATA(lt_lines) = NEW lcl_report( )->build_lines( lt_records ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_lines ) ).
cl_abap_unit_assert=>assert_equals( exp = 'A' act = lt_lines[ 1 ]-line_no ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,14 @@
@EndUserText.label : 'Bottle filling records'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}bottle {
key client : abap.clnt not null;
key rec_id : abap.int4 not null;
line_no : abap.char(4);
prod_date : abap.dats;
shift_no : abap.char(1);
bottles : abap.int4;
stop_min : abap.int4;
}

View File

@@ -0,0 +1,20 @@
CLASS {{p}}seed_bottle DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS {{p}}seed_bottle IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DELETE FROM {{p}}bottle.
INSERT {{p}}bottle FROM TABLE @( VALUE #(
( rec_id = 1 line_no = 'L1' prod_date = '20260401' shift_no = '1' bottles = 1000 stop_min = 0 )
( rec_id = 2 line_no = 'L1' prod_date = '20260401' shift_no = '1' bottles = 500 stop_min = 15 )
( rec_id = 3 line_no = 'L2' prod_date = '20260401' shift_no = '2' bottles = 800 stop_min = 0 )
( rec_id = 4 line_no = 'L2' prod_date = '20260401' shift_no = '2' bottles = 700 stop_min = 5 )
( rec_id = 5 line_no = 'L3' prod_date = '20260401' shift_no = '3' bottles = 300 stop_min = 0 )
( rec_id = 6 line_no = 'L1' prod_date = '20260402' shift_no = '1' bottles = 900 stop_min = 0 )
( rec_id = 7 line_no = 'L4' prod_date = '20260401' shift_no = '1' bottles = 1500 stop_min = 0 )
( rec_id = 8 line_no = 'L4' prod_date = '20260401' shift_no = '1' bottles = 100 stop_min = 30 ) ) ).
out->write( sy-dbcnt ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,47 @@
# 1. Goal
A beverage bottling plant fills bottles on several filling lines. Show the output of
each filling line for one production day in an ALV list. The shift supervisor uses
the list to compare the filling lines.
# 2. Open questions
None.
# 3. Context
- Table {{P}}BOTTLE exists in package $TMP. It contains data.
Fields:
- REC_ID (INT4, key): the number of the record.
- LINE_NO (CHAR 4): the number of the filling line.
- PROD_DATE (DATS): the production day.
- SHIFT_NO (CHAR 1): the shift.
- BOTTLES (INT4): the number of bottles that the line filled in this record.
- STOP_MIN (INT4): the minutes that the line stopped in this record.
# 4. Contract
- Create the executable program {{P}}LINE_OUTPUT in package $TMP.
- Selection screen:
- Parameter P_DATE, type DATS, mandatory: the production day to show.
- Select-option S_SHIFT for the shift number.
- Show the result with CL_SALV_TABLE. The output table has these columns with these
names:
- LINE_NO: the number of the filling line.
- BOTTLES: the total number of bottles that the line filled.
- STOPS: the number of records of the line that have a stop.
# 5. Business rules
1. Include a record only if PROD_DATE is equal to P_DATE and SHIFT_NO is in S_SHIFT.
2. Show one line for each filling line that has at least one included record.
3. BOTTLES is the sum of the BOTTLES values of the included records of the line.
4. STOPS is the number of included records of the line where STOP_MIN is greater
than zero.
5. Sort the lines by BOTTLES, the highest number first. If two lines have the same
BOTTLES value, sort them by LINE_NO in ascending order.
# 6. Constraints
- Release target: 7.40 SP05. Use only syntax that this release supports.
- Coding standards: Clean ABAP. Read the records with one database access.
- Out of scope: do not change {{P}}BOTTLE.
# 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

@@ -0,0 +1,60 @@
{
"id": "G1138",
"category": "G",
"object_type": "PROG",
"difficulty": 2,
"release_target": "v740sp05",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 60,
"max_activations": 15
},
"seed": [
{
"type": "TABL",
"name": "{{P}}BOTTLE",
"file": "seed/bottle.tabl.asabap",
"description": "Bottle filling records of the filling lines"
},
{
"type": "CLAS",
"name": "{{P}}SEED_BOTTLE",
"file": "seed/seed_bottle.clas.abap",
"description": "Seed data for {{P}}BOTTLE",
"run": true
}
],
"contract": [
{
"type": "PROG",
"name": "{{P}}LINE_OUTPUT",
"parameters": [
"p_date",
"s_shift"
]
}
],
"out_of_scope": [
"{{P}}BOTTLE"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}LINE_OUT_HID",
"file": "hidden/line_out_hid.clas.abap",
"description": "Hidden tests for {{P}}LINE_OUTPUT"
}
],
"reference": [
{
"type": "PROG",
"name": "{{P}}LINE_OUTPUT",
"file": "reference/line_output.prog.abap",
"description": "Output of each filling line for one production day"
}
],
"craft_checks": [
"db_operation_in_loop",
"method_length"
]
}