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,147 @@
REPORT {{p}}print_sum.
DATA gv_customer TYPE {{p}}prtjob-customer.
PARAMETERS p_from TYPE d OBLIGATORY.
SELECT-OPTIONS s_cust FOR gv_customer.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_job,
customer TYPE {{p}}prtjob-customer,
sheets TYPE {{p}}prtjob-sheets,
amount TYPE {{p}}prtjob-amount,
END OF ty_job,
tt_job TYPE STANDARD TABLE OF ty_job,
BEGIN OF ty_line,
customer TYPE {{p}}prtjob-customer,
jobs TYPE i,
sheets TYPE {{p}}prtjob-sheets,
revenue TYPE {{p}}prtjob-amount,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line,
tt_customer TYPE RANGE OF {{p}}prtjob-customer.
METHODS read_jobs
IMPORTING iv_from TYPE d
it_customer TYPE tt_customer
CHANGING ct_jobs TYPE tt_job.
METHODS aggregate
IMPORTING it_jobs TYPE tt_job
CHANGING ct_lines TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD read_jobs.
SELECT customer sheets amount
INTO CORRESPONDING FIELDS OF TABLE ct_jobs
FROM {{p}}prtjob
WHERE job_date < iv_from
AND customer IN it_customer.
ENDMETHOD.
METHOD aggregate.
FIELD-SYMBOLS <ls_job> TYPE ty_job.
FIELD-SYMBOLS <ls_line> TYPE ty_line.
LOOP AT it_jobs ASSIGNING <ls_job>.
READ TABLE ct_lines ASSIGNING <ls_line>
WITH KEY customer = <ls_job>-customer.
IF sy-subrc <> 0.
APPEND INITIAL LINE TO ct_lines ASSIGNING <ls_line>.
<ls_line>-customer = <ls_job>-customer.
ENDIF.
<ls_line>-jobs = <ls_line>-jobs + 1.
<ls_line>-sheets = <ls_line>-sheets + <ls_job>-sheets.
<ls_line>-revenue = <ls_line>-revenue + <ls_job>-amount.
ENDLOOP.
SORT ct_lines BY revenue DESCENDING customer ASCENDING.
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 lt_jobs TYPE lcl_report=>tt_job.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA lt_customer TYPE lcl_report=>tt_customer.
CREATE OBJECT go_report.
lt_customer = s_cust[].
go_report->read_jobs(
EXPORTING iv_from = p_from it_customer = lt_customer
CHANGING ct_jobs = lt_jobs ).
go_report->aggregate(
EXPORTING it_jobs = lt_jobs
CHANGING ct_lines = lt_lines ).
go_report->display( CHANGING ct_lines = lt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS aggregate_jobs FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD aggregate_jobs.
DATA lt_jobs TYPE lcl_report=>tt_job.
DATA ls_job TYPE lcl_report=>ty_job.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
DATA lo_report TYPE REF TO lcl_report.
DATA lv_count TYPE i.
DATA lv_amount TYPE {{p}}prtjob-amount.
DATA lv_customer TYPE {{p}}prtjob-customer.
CLEAR ls_job.
ls_job-customer = 'A'.
ls_job-sheets = 10.
ls_job-amount = 10.
APPEND ls_job TO lt_jobs.
CLEAR ls_job.
ls_job-customer = 'A'.
ls_job-sheets = 5.
ls_job-amount = 5.
APPEND ls_job TO lt_jobs.
CLEAR ls_job.
ls_job-customer = 'B'.
ls_job-sheets = 20.
ls_job-amount = 40.
APPEND ls_job TO lt_jobs.
CREATE OBJECT lo_report.
lo_report->aggregate(
EXPORTING it_jobs = lt_jobs
CHANGING ct_lines = lt_lines ).
DESCRIBE TABLE lt_lines LINES lv_count.
cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_count ).
READ TABLE lt_lines INTO ls_line INDEX 1.
lv_customer = 'B'.
cl_abap_unit_assert=>assert_equals( exp = lv_customer act = ls_line-customer ).
lv_amount = 40.
cl_abap_unit_assert=>assert_equals( exp = lv_amount act = ls_line-revenue ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-jobs ).
lv_amount = 15.
cl_abap_unit_assert=>assert_equals( exp = lv_amount act = ls_line-revenue ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,147 @@
REPORT {{p}}print_sum.
DATA gv_customer TYPE {{p}}prtjob-customer.
PARAMETERS p_from TYPE d OBLIGATORY.
SELECT-OPTIONS s_cust FOR gv_customer.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_job,
customer TYPE {{p}}prtjob-customer,
sheets TYPE {{p}}prtjob-sheets,
amount TYPE {{p}}prtjob-amount,
END OF ty_job,
tt_job TYPE STANDARD TABLE OF ty_job,
BEGIN OF ty_line,
customer TYPE {{p}}prtjob-customer,
jobs TYPE i,
sheets TYPE {{p}}prtjob-sheets,
revenue TYPE {{p}}prtjob-amount,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line,
tt_customer TYPE RANGE OF {{p}}prtjob-customer.
METHODS read_jobs
IMPORTING iv_from TYPE d
it_customer TYPE tt_customer
CHANGING ct_jobs TYPE tt_job.
METHODS aggregate
IMPORTING it_jobs TYPE tt_job
CHANGING ct_lines TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD read_jobs.
SELECT customer sheets amount
INTO CORRESPONDING FIELDS OF TABLE ct_jobs
FROM {{p}}prtjob
WHERE job_date >= iv_from
OR customer IN it_customer.
ENDMETHOD.
METHOD aggregate.
FIELD-SYMBOLS <ls_job> TYPE ty_job.
FIELD-SYMBOLS <ls_line> TYPE ty_line.
LOOP AT it_jobs ASSIGNING <ls_job>.
READ TABLE ct_lines ASSIGNING <ls_line>
WITH KEY customer = <ls_job>-customer.
IF sy-subrc <> 0.
APPEND INITIAL LINE TO ct_lines ASSIGNING <ls_line>.
<ls_line>-customer = <ls_job>-customer.
ENDIF.
<ls_line>-jobs = <ls_line>-jobs + 1.
<ls_line>-sheets = <ls_line>-sheets + <ls_job>-sheets.
<ls_line>-revenue = <ls_line>-revenue + <ls_job>-amount.
ENDLOOP.
SORT ct_lines BY revenue DESCENDING customer ASCENDING.
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 lt_jobs TYPE lcl_report=>tt_job.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA lt_customer TYPE lcl_report=>tt_customer.
CREATE OBJECT go_report.
lt_customer = s_cust[].
go_report->read_jobs(
EXPORTING iv_from = p_from it_customer = lt_customer
CHANGING ct_jobs = lt_jobs ).
go_report->aggregate(
EXPORTING it_jobs = lt_jobs
CHANGING ct_lines = lt_lines ).
go_report->display( CHANGING ct_lines = lt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS aggregate_jobs FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD aggregate_jobs.
DATA lt_jobs TYPE lcl_report=>tt_job.
DATA ls_job TYPE lcl_report=>ty_job.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
DATA lo_report TYPE REF TO lcl_report.
DATA lv_count TYPE i.
DATA lv_amount TYPE {{p}}prtjob-amount.
DATA lv_customer TYPE {{p}}prtjob-customer.
CLEAR ls_job.
ls_job-customer = 'A'.
ls_job-sheets = 10.
ls_job-amount = 10.
APPEND ls_job TO lt_jobs.
CLEAR ls_job.
ls_job-customer = 'A'.
ls_job-sheets = 5.
ls_job-amount = 5.
APPEND ls_job TO lt_jobs.
CLEAR ls_job.
ls_job-customer = 'B'.
ls_job-sheets = 20.
ls_job-amount = 40.
APPEND ls_job TO lt_jobs.
CREATE OBJECT lo_report.
lo_report->aggregate(
EXPORTING it_jobs = lt_jobs
CHANGING ct_lines = lt_lines ).
DESCRIBE TABLE lt_lines LINES lv_count.
cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_count ).
READ TABLE lt_lines INTO ls_line INDEX 1.
lv_customer = 'B'.
cl_abap_unit_assert=>assert_equals( exp = lv_customer act = ls_line-customer ).
lv_amount = 40.
cl_abap_unit_assert=>assert_equals( exp = lv_amount act = ls_line-revenue ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-jobs ).
lv_amount = 15.
cl_abap_unit_assert=>assert_equals( exp = lv_amount act = ls_line-revenue ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,147 @@
REPORT {{p}}print_sum.
DATA gv_customer TYPE {{p}}prtjob-customer.
PARAMETERS p_from TYPE d OBLIGATORY.
SELECT-OPTIONS s_cust FOR gv_customer.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_job,
customer TYPE {{p}}prtjob-customer,
sheets TYPE {{p}}prtjob-sheets,
amount TYPE {{p}}prtjob-amount,
END OF ty_job,
tt_job TYPE STANDARD TABLE OF ty_job,
BEGIN OF ty_line,
customer TYPE {{p}}prtjob-customer,
jobs TYPE i,
sheets TYPE {{p}}prtjob-sheets,
revenue TYPE {{p}}prtjob-amount,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line,
tt_customer TYPE RANGE OF {{p}}prtjob-customer.
METHODS read_jobs
IMPORTING iv_from TYPE d
it_customer TYPE tt_customer
CHANGING ct_jobs TYPE tt_job.
METHODS aggregate
IMPORTING it_jobs TYPE tt_job
CHANGING ct_lines TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD read_jobs.
SELECT customer sheets amount
INTO CORRESPONDING FIELDS OF TABLE ct_jobs
FROM {{p}}prtjob
WHERE job_date >= iv_from
AND customer IN it_customer.
ENDMETHOD.
METHOD aggregate.
FIELD-SYMBOLS <ls_job> TYPE ty_job.
FIELD-SYMBOLS <ls_line> TYPE ty_line.
LOOP AT it_jobs ASSIGNING <ls_job>.
READ TABLE ct_lines ASSIGNING <ls_line>
WITH KEY customer = <ls_job>-customer.
IF sy-subrc <> 0.
APPEND INITIAL LINE TO ct_lines ASSIGNING <ls_line>.
<ls_line>-customer = <ls_job>-customer.
ENDIF.
<ls_line>-jobs = <ls_line>-jobs - 1.
<ls_line>-sheets = <ls_line>-sheets + <ls_job>-sheets.
<ls_line>-revenue = <ls_line>-revenue + <ls_job>-amount.
ENDLOOP.
SORT ct_lines BY revenue DESCENDING customer ASCENDING.
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 lt_jobs TYPE lcl_report=>tt_job.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA lt_customer TYPE lcl_report=>tt_customer.
CREATE OBJECT go_report.
lt_customer = s_cust[].
go_report->read_jobs(
EXPORTING iv_from = p_from it_customer = lt_customer
CHANGING ct_jobs = lt_jobs ).
go_report->aggregate(
EXPORTING it_jobs = lt_jobs
CHANGING ct_lines = lt_lines ).
go_report->display( CHANGING ct_lines = lt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS aggregate_jobs FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD aggregate_jobs.
DATA lt_jobs TYPE lcl_report=>tt_job.
DATA ls_job TYPE lcl_report=>ty_job.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
DATA lo_report TYPE REF TO lcl_report.
DATA lv_count TYPE i.
DATA lv_amount TYPE {{p}}prtjob-amount.
DATA lv_customer TYPE {{p}}prtjob-customer.
CLEAR ls_job.
ls_job-customer = 'A'.
ls_job-sheets = 10.
ls_job-amount = 10.
APPEND ls_job TO lt_jobs.
CLEAR ls_job.
ls_job-customer = 'A'.
ls_job-sheets = 5.
ls_job-amount = 5.
APPEND ls_job TO lt_jobs.
CLEAR ls_job.
ls_job-customer = 'B'.
ls_job-sheets = 20.
ls_job-amount = 40.
APPEND ls_job TO lt_jobs.
CREATE OBJECT lo_report.
lo_report->aggregate(
EXPORTING it_jobs = lt_jobs
CHANGING ct_lines = lt_lines ).
DESCRIBE TABLE lt_lines LINES lv_count.
cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_count ).
READ TABLE lt_lines INTO ls_line INDEX 1.
lv_customer = 'B'.
cl_abap_unit_assert=>assert_equals( exp = lv_customer act = ls_line-customer ).
lv_amount = 40.
cl_abap_unit_assert=>assert_equals( exp = lv_amount act = ls_line-revenue ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-jobs ).
lv_amount = 15.
cl_abap_unit_assert=>assert_equals( exp = lv_amount act = ls_line-revenue ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,147 @@
REPORT {{p}}print_sum.
DATA gv_customer TYPE {{p}}prtjob-customer.
PARAMETERS p_from TYPE d OBLIGATORY.
SELECT-OPTIONS s_cust FOR gv_customer.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_job,
customer TYPE {{p}}prtjob-customer,
sheets TYPE {{p}}prtjob-sheets,
amount TYPE {{p}}prtjob-amount,
END OF ty_job,
tt_job TYPE STANDARD TABLE OF ty_job,
BEGIN OF ty_line,
customer TYPE {{p}}prtjob-customer,
jobs TYPE i,
sheets TYPE {{p}}prtjob-sheets,
revenue TYPE {{p}}prtjob-amount,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line,
tt_customer TYPE RANGE OF {{p}}prtjob-customer.
METHODS read_jobs
IMPORTING iv_from TYPE d
it_customer TYPE tt_customer
CHANGING ct_jobs TYPE tt_job.
METHODS aggregate
IMPORTING it_jobs TYPE tt_job
CHANGING ct_lines TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD read_jobs.
SELECT customer sheets amount
INTO CORRESPONDING FIELDS OF TABLE ct_jobs
FROM {{p}}prtjob
WHERE job_date >= iv_from
AND customer IN it_customer.
ENDMETHOD.
METHOD aggregate.
FIELD-SYMBOLS <ls_job> TYPE ty_job.
FIELD-SYMBOLS <ls_line> TYPE ty_line.
LOOP AT it_jobs ASSIGNING <ls_job>.
READ TABLE ct_lines ASSIGNING <ls_line>
WITH KEY customer = <ls_job>-customer.
IF sy-subrc <> 0.
APPEND INITIAL LINE TO ct_lines ASSIGNING <ls_line>.
<ls_line>-customer = <ls_job>-customer.
ENDIF.
<ls_line>-jobs = <ls_line>-jobs + 1.
<ls_line>-sheets = <ls_line>-sheets - <ls_job>-sheets.
<ls_line>-revenue = <ls_line>-revenue + <ls_job>-amount.
ENDLOOP.
SORT ct_lines BY revenue DESCENDING customer ASCENDING.
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 lt_jobs TYPE lcl_report=>tt_job.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA lt_customer TYPE lcl_report=>tt_customer.
CREATE OBJECT go_report.
lt_customer = s_cust[].
go_report->read_jobs(
EXPORTING iv_from = p_from it_customer = lt_customer
CHANGING ct_jobs = lt_jobs ).
go_report->aggregate(
EXPORTING it_jobs = lt_jobs
CHANGING ct_lines = lt_lines ).
go_report->display( CHANGING ct_lines = lt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS aggregate_jobs FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD aggregate_jobs.
DATA lt_jobs TYPE lcl_report=>tt_job.
DATA ls_job TYPE lcl_report=>ty_job.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
DATA lo_report TYPE REF TO lcl_report.
DATA lv_count TYPE i.
DATA lv_amount TYPE {{p}}prtjob-amount.
DATA lv_customer TYPE {{p}}prtjob-customer.
CLEAR ls_job.
ls_job-customer = 'A'.
ls_job-sheets = 10.
ls_job-amount = 10.
APPEND ls_job TO lt_jobs.
CLEAR ls_job.
ls_job-customer = 'A'.
ls_job-sheets = 5.
ls_job-amount = 5.
APPEND ls_job TO lt_jobs.
CLEAR ls_job.
ls_job-customer = 'B'.
ls_job-sheets = 20.
ls_job-amount = 40.
APPEND ls_job TO lt_jobs.
CREATE OBJECT lo_report.
lo_report->aggregate(
EXPORTING it_jobs = lt_jobs
CHANGING ct_lines = lt_lines ).
DESCRIBE TABLE lt_lines LINES lv_count.
cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_count ).
READ TABLE lt_lines INTO ls_line INDEX 1.
lv_customer = 'B'.
cl_abap_unit_assert=>assert_equals( exp = lv_customer act = ls_line-customer ).
lv_amount = 40.
cl_abap_unit_assert=>assert_equals( exp = lv_amount act = ls_line-revenue ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-jobs ).
lv_amount = 15.
cl_abap_unit_assert=>assert_equals( exp = lv_amount act = ls_line-revenue ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,147 @@
REPORT {{p}}print_sum.
DATA gv_customer TYPE {{p}}prtjob-customer.
PARAMETERS p_from TYPE d OBLIGATORY.
SELECT-OPTIONS s_cust FOR gv_customer.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_job,
customer TYPE {{p}}prtjob-customer,
sheets TYPE {{p}}prtjob-sheets,
amount TYPE {{p}}prtjob-amount,
END OF ty_job,
tt_job TYPE STANDARD TABLE OF ty_job,
BEGIN OF ty_line,
customer TYPE {{p}}prtjob-customer,
jobs TYPE i,
sheets TYPE {{p}}prtjob-sheets,
revenue TYPE {{p}}prtjob-amount,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line,
tt_customer TYPE RANGE OF {{p}}prtjob-customer.
METHODS read_jobs
IMPORTING iv_from TYPE d
it_customer TYPE tt_customer
CHANGING ct_jobs TYPE tt_job.
METHODS aggregate
IMPORTING it_jobs TYPE tt_job
CHANGING ct_lines TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD read_jobs.
SELECT customer sheets amount
INTO CORRESPONDING FIELDS OF TABLE ct_jobs
FROM {{p}}prtjob
WHERE job_date >= iv_from
AND customer IN it_customer.
ENDMETHOD.
METHOD aggregate.
FIELD-SYMBOLS <ls_job> TYPE ty_job.
FIELD-SYMBOLS <ls_line> TYPE ty_line.
LOOP AT it_jobs ASSIGNING <ls_job>.
READ TABLE ct_lines ASSIGNING <ls_line>
WITH KEY customer = <ls_job>-customer.
IF sy-subrc <> 0.
APPEND INITIAL LINE TO ct_lines ASSIGNING <ls_line>.
<ls_line>-customer = <ls_job>-customer.
ENDIF.
<ls_line>-jobs = <ls_line>-jobs + 1.
<ls_line>-sheets = <ls_line>-sheets + <ls_job>-sheets.
<ls_line>-revenue = <ls_line>-revenue - <ls_job>-amount.
ENDLOOP.
SORT ct_lines BY revenue DESCENDING customer ASCENDING.
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 lt_jobs TYPE lcl_report=>tt_job.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA lt_customer TYPE lcl_report=>tt_customer.
CREATE OBJECT go_report.
lt_customer = s_cust[].
go_report->read_jobs(
EXPORTING iv_from = p_from it_customer = lt_customer
CHANGING ct_jobs = lt_jobs ).
go_report->aggregate(
EXPORTING it_jobs = lt_jobs
CHANGING ct_lines = lt_lines ).
go_report->display( CHANGING ct_lines = lt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS aggregate_jobs FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD aggregate_jobs.
DATA lt_jobs TYPE lcl_report=>tt_job.
DATA ls_job TYPE lcl_report=>ty_job.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
DATA lo_report TYPE REF TO lcl_report.
DATA lv_count TYPE i.
DATA lv_amount TYPE {{p}}prtjob-amount.
DATA lv_customer TYPE {{p}}prtjob-customer.
CLEAR ls_job.
ls_job-customer = 'A'.
ls_job-sheets = 10.
ls_job-amount = 10.
APPEND ls_job TO lt_jobs.
CLEAR ls_job.
ls_job-customer = 'A'.
ls_job-sheets = 5.
ls_job-amount = 5.
APPEND ls_job TO lt_jobs.
CLEAR ls_job.
ls_job-customer = 'B'.
ls_job-sheets = 20.
ls_job-amount = 40.
APPEND ls_job TO lt_jobs.
CREATE OBJECT lo_report.
lo_report->aggregate(
EXPORTING it_jobs = lt_jobs
CHANGING ct_lines = lt_lines ).
DESCRIBE TABLE lt_lines LINES lv_count.
cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_count ).
READ TABLE lt_lines INTO ls_line INDEX 1.
lv_customer = 'B'.
cl_abap_unit_assert=>assert_equals( exp = lv_customer act = ls_line-customer ).
lv_amount = 40.
cl_abap_unit_assert=>assert_equals( exp = lv_amount act = ls_line-revenue ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-jobs ).
lv_amount = 15.
cl_abap_unit_assert=>assert_equals( exp = lv_amount act = ls_line-revenue ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,50 @@
{
"id": "G0160",
"pool": "eval",
"object_type": "PROG",
"category": "G",
"attempts": [
{
"stage": "bundle",
"errors": [
"seed/t31_seed.clas.abap line 9: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"INSERT\"",
"hidden/t31_hidden.clas.abap line 48: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"ASSIGN\"",
"hidden/t31_hidden.clas.abap line 49: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"ASSIGN\"",
"hidden/t31_hidden.clas.abap line 51: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"rv_value\"",
"hidden/t31_hidden.clas.abap line 72: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"DATA\"",
"reference/print_sum.prog.abap line 55: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"go_report\"",
"reference/print_sum.prog.abap line 70: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"go_env\"",
"reference/print_sum.prog.abap line 73: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"lt_job\"",
"reference/print_sum.prog.abap line 87: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"go_report\"",
"reference/print_sum.prog.abap line 92: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"cl_abap_unit_assert\"",
"reference/print_sum.prog.abap line 95: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"cl_abap_unit_assert\"",
"reference/print_sum.prog.abap line 100: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"lt_customer\"",
"reference/print_sum.prog.abap line 102: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"go_report\""
],
"by_check": {
"abaplint": 13
}
},
{
"stage": "validate",
"oracle": 0,
"null": 0
},
{
"stage": "validate",
"oracle": 89.5,
"null": 0
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 5,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,141 @@
CLASS {{p}}t31_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES tt_customer TYPE RANGE OF {{p}}prtjob-customer.
METHODS run
IMPORTING iv_from TYPE d
it_customer TYPE tt_customer 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_customers FOR TESTING.
METHODS sorted_by_revenue FOR TESTING.
METHODS totals_and_counts FOR TESTING.
METHODS customer_filter FOR TESTING.
METHODS date_filter FOR TESTING.
METHODS tie_break_by_customer FOR TESTING.
ENDCLASS.
CLASS {{p}}t31_hidden IMPLEMENTATION.
METHOD run.
cl_salv_bs_runtime_info=>set( display = abap_false metadata = abap_false data = abap_true ).
SUBMIT {{p}}print_sum WITH p_from = iv_from WITH s_cust IN it_customer 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.
DATA lv_text TYPE string.
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 is missing' ).
ASSIGN COMPONENT iv_col OF STRUCTURE <ls_line> TO <lv_value>.
cl_abap_unit_assert=>assert_subrc( exp = 0 msg = 'Column is missing' ).
lv_text = <lv_value>.
CONDENSE lv_text.
rv_value = lv_text.
ENDMETHOD.
METHOD all_customers.
DATA lr_data TYPE REF TO data.
DATA lv_lines TYPE i.
lr_data = run( '20250101' ).
lv_lines = lines_of( lr_data ).
cl_abap_unit_assert=>assert_equals( exp = 3 act = lv_lines ).
ENDMETHOD.
METHOD sorted_by_revenue.
DATA lr_data TYPE REF TO data.
DATA lv_value TYPE string.
lr_data = run( '20250101' ).
lv_value = value_of( ir_data = lr_data iv_row = 1 iv_col = 'CUSTOMER' ).
cl_abap_unit_assert=>assert_equals( exp = 'GAMMA' act = lv_value ).
lv_value = value_of( ir_data = lr_data iv_row = 2 iv_col = 'CUSTOMER' ).
cl_abap_unit_assert=>assert_equals( exp = 'ALPHA' act = lv_value ).
lv_value = value_of( ir_data = lr_data iv_row = 1 iv_col = 'REVENUE' ).
cl_abap_unit_assert=>assert_equals( exp = '520.00' act = lv_value ).
ENDMETHOD.
METHOD totals_and_counts.
DATA lr_data TYPE REF TO data.
DATA lv_value TYPE string.
lr_data = run( '20250101' ).
lv_value = value_of( ir_data = lr_data iv_row = 1 iv_col = 'JOBS' ).
cl_abap_unit_assert=>assert_equals( exp = '2' act = lv_value ).
lv_value = value_of( ir_data = lr_data iv_row = 1 iv_col = 'SHEETS' ).
cl_abap_unit_assert=>assert_equals( exp = '410' act = lv_value ).
ENDMETHOD.
METHOD customer_filter.
DATA lr_data TYPE REF TO data.
DATA lt_customer TYPE tt_customer.
DATA ls_customer TYPE LINE OF tt_customer.
DATA lv_lines TYPE i.
DATA lv_value TYPE string.
ls_customer-sign = 'I'.
ls_customer-option = 'EQ'.
ls_customer-low = 'ALPHA'.
APPEND ls_customer TO lt_customer.
lr_data = run( iv_from = '20250101' it_customer = lt_customer ).
lv_lines = lines_of( lr_data ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_lines ).
lv_value = value_of( ir_data = lr_data iv_row = 1 iv_col = 'REVENUE' ).
cl_abap_unit_assert=>assert_equals( exp = '350.00' act = lv_value ).
ENDMETHOD.
METHOD date_filter.
DATA lr_data TYPE REF TO data.
DATA lv_lines TYPE i.
DATA lv_value TYPE string.
lr_data = run( '20260201' ).
lv_lines = lines_of( lr_data ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_lines ).
lv_value = value_of( ir_data = lr_data iv_row = 1 iv_col = 'CUSTOMER' ).
cl_abap_unit_assert=>assert_equals( exp = 'ALPHA' act = lv_value ).
lv_value = value_of( ir_data = lr_data iv_row = 1 iv_col = 'REVENUE' ).
cl_abap_unit_assert=>assert_equals( exp = '100.00' act = lv_value ).
ENDMETHOD.
METHOD tie_break_by_customer.
DATA lr_data TYPE REF TO data.
DATA lv_value TYPE string.
lr_data = run( '20250101' ).
lv_value = value_of( ir_data = lr_data iv_row = 2 iv_col = 'CUSTOMER' ).
cl_abap_unit_assert=>assert_equals( exp = 'ALPHA' act = lv_value ).
lv_value = value_of( ir_data = lr_data iv_row = 3 iv_col = 'CUSTOMER' ).
cl_abap_unit_assert=>assert_equals( exp = 'BETA' act = lv_value ).
ENDMETHOD.
ENDCLASS.

View File

@@ -1,120 +0,0 @@
CLASS {{p}}vine_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES tt_variety TYPE RANGE OF {{p}}grape-variety.
METHODS run
IMPORTING iv_from TYPE d
it_variety TYPE tt_variety 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 add_variety
IMPORTING iv_variety TYPE {{p}}grape-variety
CHANGING ct_variety TYPE tt_variety.
METHODS all_varieties FOR TESTING.
METHODS sorted_by_total FOR TESTING.
METHODS totals_and_counts FOR TESTING.
METHODS variety_filter FOR TESTING.
METHODS date_filter FOR TESTING.
METHODS unknown_variety FOR TESTING.
ENDCLASS.
CLASS {{p}}vine_hidden IMPLEMENTATION.
METHOD run.
cl_salv_bs_runtime_info=>set( display = abap_false metadata = abap_false data = abap_true ).
SUBMIT {{p}}vineyard_rpt WITH p_from = iv_from WITH s_var IN it_variety 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.
DATA lv_text TYPE string.
IF ir_data IS BOUND.
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 not found' ).
ASSIGN COMPONENT iv_col OF STRUCTURE <ls_line> TO <lv_value>.
cl_abap_unit_assert=>assert_subrc( exp = 0 msg = 'Column not found' ).
lv_text = <lv_value>.
CONDENSE lv_text.
rv_value = lv_text.
ENDIF.
ENDMETHOD.
METHOD add_variety.
DATA ls_variety TYPE LINE OF tt_variety.
CLEAR ls_variety.
ls_variety-sign = 'I'.
ls_variety-option = 'EQ'.
ls_variety-low = iv_variety.
APPEND ls_variety TO ct_variety.
ENDMETHOD.
METHOD all_varieties.
cl_abap_unit_assert=>assert_equals( exp = 3 act = lines_of( run( '20260101' ) ) ).
ENDMETHOD.
METHOD sorted_by_total.
DATA lr_data TYPE REF TO data.
lr_data = run( '20260101' ).
cl_abap_unit_assert=>assert_equals( exp = 'CHRD' act = value_of( ir_data = lr_data iv_row = 1 iv_col = 'VARIETY' ) ).
cl_abap_unit_assert=>assert_equals( exp = 'RIES' act = value_of( ir_data = lr_data iv_row = 3 iv_col = 'VARIETY' ) ).
ENDMETHOD.
METHOD totals_and_counts.
DATA lr_data TYPE REF TO data.
lr_data = run( '20260101' ).
cl_abap_unit_assert=>assert_equals( exp = '2300.000' act = value_of( ir_data = lr_data iv_row = 1 iv_col = 'TOTAL_KG' ) ).
cl_abap_unit_assert=>assert_equals( exp = '2' act = value_of( ir_data = lr_data iv_row = 1 iv_col = 'HARVESTS' ) ).
cl_abap_unit_assert=>assert_equals( exp = 'Merlot' act = value_of( ir_data = lr_data iv_row = 2 iv_col = 'NAME' ) ).
ENDMETHOD.
METHOD variety_filter.
DATA lr_data TYPE REF TO data.
DATA lt_variety TYPE tt_variety.
add_variety( EXPORTING iv_variety = 'CHRD' CHANGING ct_variety = lt_variety ).
lr_data = run( iv_from = '20260101' it_variety = lt_variety ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines_of( lr_data ) ).
cl_abap_unit_assert=>assert_equals( exp = '2300.000' act = value_of( ir_data = lr_data iv_row = 1 iv_col = 'TOTAL_KG' ) ).
ENDMETHOD.
METHOD date_filter.
DATA lr_data TYPE REF TO data.
lr_data = run( '20260901' ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines_of( lr_data ) ).
cl_abap_unit_assert=>assert_equals( exp = 'CHRD' act = value_of( ir_data = lr_data iv_row = 1 iv_col = 'VARIETY' ) ).
cl_abap_unit_assert=>assert_equals( exp = '2300.000' act = value_of( ir_data = lr_data iv_row = 1 iv_col = 'TOTAL_KG' ) ).
cl_abap_unit_assert=>assert_equals( exp = 'MERL' act = value_of( ir_data = lr_data iv_row = 2 iv_col = 'VARIETY' ) ).
cl_abap_unit_assert=>assert_equals( exp = '2000.500' act = value_of( ir_data = lr_data iv_row = 2 iv_col = 'TOTAL_KG' ) ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines_of( run( '20261101' ) ) ).
ENDMETHOD.
METHOD unknown_variety.
DATA lr_data TYPE REF TO data.
DATA lt_variety TYPE tt_variety.
add_variety( EXPORTING iv_variety = 'SYRA' CHANGING ct_variety = lt_variety ).
lr_data = run( iv_from = '20260101' it_variety = lt_variety ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines_of( lr_data ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -1,40 +1,64 @@
{
"task": "T42",
"task": "G0160",
"mutants": [
{
"object": "{{P}}VINEYARD_RPT",
"mutant": "line 56: >= -> > (rel)",
"object": "{{P}}PRINT_SUM",
"mutant": "line 41: >= -> < (rel)",
"status": "killed",
"hidden": "0/6",
"failed_tests": [
"ALL_CUSTOMERS",
"CUSTOMER_FILTER",
"DATE_FILTER",
"SORTED_BY_REVENUE",
"TIE_BREAK_BY_CUSTOMER",
"TOTALS_AND_COUNTS"
]
},
{
"object": "{{P}}PRINT_SUM",
"mutant": "line 42: AND -> OR (logic)",
"status": "killed",
"hidden": "4/6",
"failed_tests": [
"CUSTOMER_FILTER",
"DATE_FILTER"
]
},
{
"object": "{{P}}PRINT_SUM",
"mutant": "line 56: + -> - (arith)",
"status": "killed",
"hidden": "5/6",
"failed_tests": [
"DATE_FILTER"
"TOTALS_AND_COUNTS"
]
},
{
"object": "{{P}}VINEYARD_RPT",
"mutant": "line 76: IF sy-subrc = 0 -> IF sy-subrc <> 0 (logic)",
"object": "{{P}}PRINT_SUM",
"mutant": "line 57: + -> - (arith)",
"status": "killed",
"hidden": "3/6",
"hidden": "5/6",
"failed_tests": [
"ALL_VARIETIES",
"TOTALS_AND_COUNTS"
]
},
{
"object": "{{P}}PRINT_SUM",
"mutant": "line 58: + -> - (arith)",
"status": "killed",
"hidden": "1/6",
"failed_tests": [
"CUSTOMER_FILTER",
"DATE_FILTER",
"UNKNOWN_VARIETY"
]
},
{
"object": "{{P}}VINEYARD_RPT",
"mutant": "line 85: DESCENDING -> ASCENDING (sort)",
"status": "killed",
"hidden": "3/6",
"failed_tests": [
"SORTED_BY_TOTAL",
"TOTALS_AND_COUNTS",
"DATE_FILTER"
"SORTED_BY_REVENUE",
"TIE_BREAK_BY_CUSTOMER",
"TOTALS_AND_COUNTS"
]
}
],
"valid": 3,
"killed": 3,
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,147 @@
REPORT {{p}}print_sum.
DATA gv_customer TYPE {{p}}prtjob-customer.
PARAMETERS p_from TYPE d OBLIGATORY.
SELECT-OPTIONS s_cust FOR gv_customer.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_job,
customer TYPE {{p}}prtjob-customer,
sheets TYPE {{p}}prtjob-sheets,
amount TYPE {{p}}prtjob-amount,
END OF ty_job,
tt_job TYPE STANDARD TABLE OF ty_job,
BEGIN OF ty_line,
customer TYPE {{p}}prtjob-customer,
jobs TYPE i,
sheets TYPE {{p}}prtjob-sheets,
revenue TYPE {{p}}prtjob-amount,
END OF ty_line,
tt_line TYPE STANDARD TABLE OF ty_line,
tt_customer TYPE RANGE OF {{p}}prtjob-customer.
METHODS read_jobs
IMPORTING iv_from TYPE d
it_customer TYPE tt_customer
CHANGING ct_jobs TYPE tt_job.
METHODS aggregate
IMPORTING it_jobs TYPE tt_job
CHANGING ct_lines TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD read_jobs.
SELECT customer sheets amount
INTO CORRESPONDING FIELDS OF TABLE ct_jobs
FROM {{p}}prtjob
WHERE job_date >= iv_from
AND customer IN it_customer.
ENDMETHOD.
METHOD aggregate.
FIELD-SYMBOLS <ls_job> TYPE ty_job.
FIELD-SYMBOLS <ls_line> TYPE ty_line.
LOOP AT it_jobs ASSIGNING <ls_job>.
READ TABLE ct_lines ASSIGNING <ls_line>
WITH KEY customer = <ls_job>-customer.
IF sy-subrc <> 0.
APPEND INITIAL LINE TO ct_lines ASSIGNING <ls_line>.
<ls_line>-customer = <ls_job>-customer.
ENDIF.
<ls_line>-jobs = <ls_line>-jobs + 1.
<ls_line>-sheets = <ls_line>-sheets + <ls_job>-sheets.
<ls_line>-revenue = <ls_line>-revenue + <ls_job>-amount.
ENDLOOP.
SORT ct_lines BY revenue DESCENDING customer ASCENDING.
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 lt_jobs TYPE lcl_report=>tt_job.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA lt_customer TYPE lcl_report=>tt_customer.
CREATE OBJECT go_report.
lt_customer = s_cust[].
go_report->read_jobs(
EXPORTING iv_from = p_from it_customer = lt_customer
CHANGING ct_jobs = lt_jobs ).
go_report->aggregate(
EXPORTING it_jobs = lt_jobs
CHANGING ct_lines = lt_lines ).
go_report->display( CHANGING ct_lines = lt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS aggregate_jobs FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD aggregate_jobs.
DATA lt_jobs TYPE lcl_report=>tt_job.
DATA ls_job TYPE lcl_report=>ty_job.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
DATA lo_report TYPE REF TO lcl_report.
DATA lv_count TYPE i.
DATA lv_amount TYPE {{p}}prtjob-amount.
DATA lv_customer TYPE {{p}}prtjob-customer.
CLEAR ls_job.
ls_job-customer = 'A'.
ls_job-sheets = 10.
ls_job-amount = 10.
APPEND ls_job TO lt_jobs.
CLEAR ls_job.
ls_job-customer = 'A'.
ls_job-sheets = 5.
ls_job-amount = 5.
APPEND ls_job TO lt_jobs.
CLEAR ls_job.
ls_job-customer = 'B'.
ls_job-sheets = 20.
ls_job-amount = 40.
APPEND ls_job TO lt_jobs.
CREATE OBJECT lo_report.
lo_report->aggregate(
EXPORTING it_jobs = lt_jobs
CHANGING ct_lines = lt_lines ).
DESCRIBE TABLE lt_lines LINES lv_count.
cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_count ).
READ TABLE lt_lines INTO ls_line INDEX 1.
lv_customer = 'B'.
cl_abap_unit_assert=>assert_equals( exp = lv_customer act = ls_line-customer ).
lv_amount = 40.
cl_abap_unit_assert=>assert_equals( exp = lv_amount act = ls_line-revenue ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-jobs ).
lv_amount = 15.
cl_abap_unit_assert=>assert_equals( exp = lv_amount act = ls_line-revenue ).
ENDMETHOD.
ENDCLASS.

View File

@@ -1,203 +0,0 @@
REPORT {{p}}vineyard_rpt.
DATA gv_variety TYPE {{p}}grape-variety.
PARAMETERS p_from TYPE d OBLIGATORY.
SELECT-OPTIONS s_var FOR gv_variety.
CLASS lcl_vineyard DEFINITION FINAL.
PUBLIC SECTION.
TYPES tt_variety TYPE RANGE OF {{p}}grape-variety.
TYPES: BEGIN OF ty_harvest,
variety TYPE {{p}}harvest-variety,
harvest_date TYPE {{p}}harvest-harvest_date,
weight_kg TYPE {{p}}harvest-weight_kg,
END OF ty_harvest.
TYPES tt_harvest TYPE STANDARD TABLE OF ty_harvest.
TYPES: BEGIN OF ty_name,
variety TYPE {{p}}grape-variety,
name TYPE {{p}}grape-name,
END OF ty_name.
TYPES tt_name TYPE STANDARD TABLE OF ty_name.
TYPES: BEGIN OF ty_line,
variety TYPE {{p}}grape-variety,
name TYPE {{p}}grape-name,
total_kg TYPE {{p}}harvest-weight_kg,
harvests TYPE i,
END OF ty_line.
TYPES tt_line TYPE STANDARD TABLE OF ty_line.
METHODS read_harvests
IMPORTING iv_from TYPE d
it_variety TYPE tt_variety
EXPORTING et_harvest TYPE tt_harvest.
METHODS read_names
IMPORTING it_harvest TYPE tt_harvest
EXPORTING et_names TYPE tt_name.
METHODS aggregate
IMPORTING it_harvest TYPE tt_harvest
it_names TYPE tt_name
EXPORTING et_lines TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_vineyard IMPLEMENTATION.
METHOD read_harvests.
IF it_variety IS INITIAL.
SELECT variety harvest_date weight_kg
INTO TABLE et_harvest
FROM {{p}}harvest
WHERE harvest_date >= iv_from.
ELSE.
SELECT variety harvest_date weight_kg
INTO TABLE et_harvest
FROM {{p}}harvest
WHERE harvest_date >= iv_from
AND variety IN it_variety.
ENDIF.
ENDMETHOD.
METHOD read_names.
IF it_harvest IS NOT INITIAL.
SELECT variety name
INTO TABLE et_names
FROM {{p}}grape
FOR ALL ENTRIES IN it_harvest
WHERE variety = it_harvest-variety.
ENDIF.
ENDMETHOD.
METHOD aggregate.
DATA ls_harvest TYPE ty_harvest.
DATA ls_name TYPE ty_name.
DATA ls_line TYPE ty_line.
DATA lt_names TYPE tt_name.
DATA lt_lines TYPE tt_line.
lt_names = it_names.
SORT lt_names BY variety.
LOOP AT it_harvest INTO ls_harvest.
READ TABLE lt_names INTO ls_name
WITH KEY variety = ls_harvest-variety BINARY SEARCH.
IF sy-subrc = 0.
CLEAR ls_line.
ls_line-variety = ls_harvest-variety.
ls_line-name = ls_name-name.
ls_line-total_kg = ls_harvest-weight_kg.
ls_line-harvests = 1.
COLLECT ls_line INTO lt_lines.
ENDIF.
ENDLOOP.
SORT lt_lines BY total_kg DESCENDING.
et_lines = lt_lines.
ENDMETHOD.
METHOD display.
DATA lo_alv TYPE REF TO cl_salv_table.
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = lo_alv
CHANGING t_table = ct_lines ).
lo_alv->display( ).
CATCH cx_salv_msg.
MESSAGE 'Cannot display the list' TYPE 'I'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA go_vineyard TYPE REF TO lcl_vineyard.
DATA lt_harvest TYPE lcl_vineyard=>tt_harvest.
DATA lt_names TYPE lcl_vineyard=>tt_name.
DATA lt_lines TYPE lcl_vineyard=>tt_line.
CREATE OBJECT go_vineyard.
go_vineyard->read_harvests(
EXPORTING iv_from = p_from it_variety = s_var[]
IMPORTING et_harvest = lt_harvest ).
go_vineyard->read_names(
EXPORTING it_harvest = lt_harvest
IMPORTING et_names = lt_names ).
go_vineyard->aggregate(
EXPORTING it_harvest = lt_harvest it_names = lt_names
IMPORTING et_lines = lt_lines ).
go_vineyard->display( CHANGING ct_lines = lt_lines ).
CLASS ltc_vineyard DEFINITION FINAL FOR TESTING
DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS totals_per_variety FOR TESTING.
METHODS skips_unknown_variety FOR TESTING.
ENDCLASS.
CLASS ltc_vineyard IMPLEMENTATION.
METHOD totals_per_variety.
DATA ls_harvest TYPE lcl_vineyard=>ty_harvest.
DATA lt_harvest TYPE lcl_vineyard=>tt_harvest.
DATA ls_name TYPE lcl_vineyard=>ty_name.
DATA lt_names TYPE lcl_vineyard=>tt_name.
DATA lt_lines TYPE lcl_vineyard=>tt_line.
DATA ls_line TYPE lcl_vineyard=>ty_line.
DATA lv_total TYPE {{p}}harvest-weight_kg.
DATA go_vineyard TYPE REF TO lcl_vineyard.
ls_harvest-variety = 'A'.
ls_harvest-harvest_date = '20260101'.
ls_harvest-weight_kg = '10.000'.
APPEND ls_harvest TO lt_harvest.
CLEAR ls_harvest.
ls_harvest-variety = 'A'.
ls_harvest-harvest_date = '20260102'.
ls_harvest-weight_kg = '5.000'.
APPEND ls_harvest TO lt_harvest.
CLEAR ls_harvest.
ls_harvest-variety = 'B'.
ls_harvest-harvest_date = '20260101'.
ls_harvest-weight_kg = '2.000'.
APPEND ls_harvest TO lt_harvest.
ls_name-variety = 'A'.
ls_name-name = 'Alpha'.
APPEND ls_name TO lt_names.
CLEAR ls_name.
ls_name-variety = 'B'.
ls_name-name = 'Beta'.
APPEND ls_name TO lt_names.
CREATE OBJECT go_vineyard.
go_vineyard->aggregate(
EXPORTING it_harvest = lt_harvest it_names = lt_names
IMPORTING et_lines = lt_lines ).
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 = 'B' act = ls_line-variety ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 'Alpha' act = ls_line-name ).
lv_total = '15.000'.
cl_abap_unit_assert=>assert_equals( exp = lv_total act = ls_line-total_kg ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-harvests ).
ENDMETHOD.
METHOD skips_unknown_variety.
DATA ls_harvest TYPE lcl_vineyard=>ty_harvest.
DATA lt_harvest TYPE lcl_vineyard=>tt_harvest.
DATA lt_names TYPE lcl_vineyard=>tt_name.
DATA lt_lines TYPE lcl_vineyard=>tt_line.
DATA go_vineyard TYPE REF TO lcl_vineyard.
ls_harvest-variety = 'X'.
ls_harvest-harvest_date = '20260101'.
ls_harvest-weight_kg = '1.000'.
APPEND ls_harvest TO lt_harvest.
CREATE OBJECT go_vineyard.
go_vineyard->aggregate(
EXPORTING it_harvest = lt_harvest it_names = lt_names
IMPORTING et_lines = lt_lines ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_lines ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -1,10 +0,0 @@
@EndUserText.label : 'Grape variety'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}grape {
key client : abap.clnt not null;
key variety : abap.char(4) not null;
name : abap.char(40);
}

View File

@@ -1,12 +0,0 @@
@EndUserText.label : 'Grape harvest'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}harvest {
key client : abap.clnt not null;
key harvest_id : abap.int4 not null;
variety : abap.char(4);
harvest_date : abap.dats;
weight_kg : abap.dec(13,3);
}

View File

@@ -0,0 +1,13 @@
@EndUserText.label : 'Print jobs'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}prtjob {
key client : abap.clnt not null;
key job_id : abap.int4 not null;
customer : abap.char(10);
job_date : abap.dats;
sheets : abap.int4;
amount : abap.dec(15,2);
}

View File

@@ -0,0 +1,56 @@
CLASS {{p}}t31_seed DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS {{p}}t31_seed IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DATA lt_job TYPE STANDARD TABLE OF {{p}}prtjob.
DATA ls_job TYPE {{p}}prtjob.
DELETE FROM {{p}}prtjob.
CLEAR ls_job.
ls_job-job_id = 1.
ls_job-customer = 'ALPHA'.
ls_job-job_date = '20260105'.
ls_job-sheets = 100.
ls_job-amount = 250.
APPEND ls_job TO lt_job.
CLEAR ls_job.
ls_job-job_id = 2.
ls_job-customer = 'ALPHA'.
ls_job-job_date = '20260210'.
ls_job-sheets = 50.
ls_job-amount = 100.
APPEND ls_job TO lt_job.
CLEAR ls_job.
ls_job-job_id = 3.
ls_job-customer = 'BETA'.
ls_job-job_date = '20260120'.
ls_job-sheets = 200.
ls_job-amount = 350.
APPEND ls_job TO lt_job.
CLEAR ls_job.
ls_job-job_id = 4.
ls_job-customer = 'GAMMA'.
ls_job-job_date = '20251220'.
ls_job-sheets = 400.
ls_job-amount = 500.
APPEND ls_job TO lt_job.
CLEAR ls_job.
ls_job-job_id = 5.
ls_job-customer = 'GAMMA'.
ls_job-job_date = '20260301'.
ls_job-sheets = 10.
ls_job-amount = 20.
APPEND ls_job TO lt_job.
INSERT {{p}}prtjob FROM TABLE lt_job.
out->write( sy-dbcnt ).
ENDMETHOD.
ENDCLASS.

View File

@@ -1,95 +0,0 @@
CLASS {{p}}vine_seed DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS {{p}}vine_seed IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DATA lt_grape TYPE STANDARD TABLE OF {{p}}grape.
DATA lt_harvest TYPE STANDARD TABLE OF {{p}}harvest.
DATA ls_grape TYPE {{p}}grape.
DATA ls_harvest TYPE {{p}}harvest.
DELETE FROM {{p}}harvest.
DELETE FROM {{p}}grape.
CLEAR ls_grape.
ls_grape-client = sy-mandt.
ls_grape-variety = 'MERL'.
ls_grape-name = 'Merlot'.
APPEND ls_grape TO lt_grape.
CLEAR ls_grape.
ls_grape-client = sy-mandt.
ls_grape-variety = 'CHRD'.
ls_grape-name = 'Chardonnay'.
APPEND ls_grape TO lt_grape.
CLEAR ls_grape.
ls_grape-client = sy-mandt.
ls_grape-variety = 'RIES'.
ls_grape-name = 'Riesling'.
APPEND ls_grape TO lt_grape.
CLEAR ls_harvest.
ls_harvest-client = sy-mandt.
ls_harvest-harvest_id = 1.
ls_harvest-variety = 'MERL'.
ls_harvest-harvest_date = '20260901'.
ls_harvest-weight_kg = '1200.500'.
APPEND ls_harvest TO lt_harvest.
CLEAR ls_harvest.
ls_harvest-client = sy-mandt.
ls_harvest-harvest_id = 2.
ls_harvest-variety = 'MERL'.
ls_harvest-harvest_date = '20260910'.
ls_harvest-weight_kg = '800.000'.
APPEND ls_harvest TO lt_harvest.
CLEAR ls_harvest.
ls_harvest-client = sy-mandt.
ls_harvest-harvest_id = 3.
ls_harvest-variety = 'CHRD'.
ls_harvest-harvest_date = '20260905'.
ls_harvest-weight_kg = '2000.000'.
APPEND ls_harvest TO lt_harvest.
CLEAR ls_harvest.
ls_harvest-client = sy-mandt.
ls_harvest-harvest_id = 4.
ls_harvest-variety = 'CHRD'.
ls_harvest-harvest_date = '20261001'.
ls_harvest-weight_kg = '300.000'.
APPEND ls_harvest TO lt_harvest.
CLEAR ls_harvest.
ls_harvest-client = sy-mandt.
ls_harvest-harvest_id = 5.
ls_harvest-variety = 'RIES'.
ls_harvest-harvest_date = '20251215'.
ls_harvest-weight_kg = '250.000'.
APPEND ls_harvest TO lt_harvest.
CLEAR ls_harvest.
ls_harvest-client = sy-mandt.
ls_harvest-harvest_id = 6.
ls_harvest-variety = 'RIES'.
ls_harvest-harvest_date = '20260820'.
ls_harvest-weight_kg = '500.000'.
APPEND ls_harvest TO lt_harvest.
CLEAR ls_harvest.
ls_harvest-client = sy-mandt.
ls_harvest-harvest_id = 7.
ls_harvest-variety = 'SYRA'.
ls_harvest-harvest_date = '20260915'.
ls_harvest-weight_kg = '100.000'.
APPEND ls_harvest TO lt_harvest.
INSERT {{p}}grape FROM TABLE lt_grape.
INSERT {{p}}harvest FROM TABLE lt_harvest.
out->write( sy-dbcnt ).
ENDMETHOD.
ENDCLASS.

View File

@@ -1,44 +1,37 @@
# 1. Goal
Show the harvest weight of each grape variety in an ALV list. The winery uses the
list to compare the varieties for a period.
A print shop prints jobs for its customers. The sales team needs a report that
shows, for each customer, the number of jobs and the revenue of a period.
# 2. Open questions
None.
# 3. Context
- Table {{P}}GRAPE exists in package $TMP. It contains data.
Fields: VARIETY (CHAR 4, key), NAME (CHAR 40).
- Table {{P}}HARVEST exists in package $TMP. It contains data.
Fields: HARVEST_ID (INT4, key), VARIETY (CHAR 4), HARVEST_DATE (DATS),
WEIGHT_KG (DEC 13,3).
- Table {{P}}PRTJOB exists in package $TMP. It contains data.
Fields: JOB_ID (INT4, key), CUSTOMER (CHAR 10), JOB_DATE (DATS),
SHEETS (INT4), AMOUNT (DEC 15,2).
# 4. Contract
- Create the executable program {{P}}VINEYARD_RPT in package $TMP.
- Create the executable program {{P}}PRINT_SUM in package $TMP.
- Selection screen:
- Parameter P_FROM, type DATS, mandatory: the first harvest date to include.
- Select-option S_VAR for the variety.
- Parameter P_FROM, type DATS, obligatory: the first job date to include.
- Select-option S_CUST for the customer.
- Show the result with CL_SALV_TABLE. The output table has these columns, with
these names: VARIETY, NAME, TOTAL_KG (the sum of WEIGHT_KG), HARVESTS (the
number of harvests).
these names: CUSTOMER, JOBS, SHEETS, REVENUE.
# 5. Business rules
1. Include a harvest only if HARVEST_DATE is on or after P_FROM and VARIETY is
in S_VAR. An empty S_VAR does not restrict the variety.
2. Show a variety only if it has an entry in {{P}}GRAPE. A variety with harvests
but without an entry in {{P}}GRAPE is not shown.
3. Show one line for each variety with at least one included harvest.
4. NAME is the name of the variety from {{P}}GRAPE.
5. Sort the lines by TOTAL_KG, the highest total first.
1. Include a job only if JOB_DATE is on or after P_FROM and CUSTOMER is in S_CUST.
2. Show one line for each customer that has at least one included job.
3. JOBS is the number of included jobs of the customer.
4. SHEETS is the sum of the SHEETS values of the included jobs of the customer.
5. REVENUE is the sum of the AMOUNT values of the included jobs of the customer.
6. Sort the lines by REVENUE, the highest revenue first. If two customers have
the same revenue, sort these two customers by CUSTOMER in ascending order.
# 6. Constraints
- Release target: 7.02. Use only ABAP syntax that is available in release 7.02.
Do not use syntax elements that were introduced in a later release. Examples of
syntax that you must not use: inline declarations, constructor expressions
(NEW, VALUE, CONV), string templates, table expressions, SQL expressions and
SQL aggregate functions, GROUP BY, UNION, the escape character @ in ABAP SQL,
WITH EMPTY KEY.
- Coding standards: Clean ABAP. Do not read the database inside a loop.
- Out of scope: do not change {{P}}GRAPE or {{P}}HARVEST.
- Release target: 7.02. Write the program in ABAP and ABAP SQL syntax that
release 7.02 supports. Do not use syntax that is newer than 7.02.
- Coding standards: Clean ABAP. Read the data with one database access.
- Out of scope: do not change {{P}}PRTJOB.
# 7. Acceptance
- The program is active and has no syntax error.

View File

@@ -6,58 +6,51 @@
"release_target": "v702",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 40,
"max_activations": 10
"max_tool_calls": 60,
"max_activations": 15
},
"seed": [
{
"type": "TABL",
"name": "{{P}}GRAPE",
"file": "seed/grape.tabl.asabap",
"description": "Grape varieties"
},
{
"type": "TABL",
"name": "{{P}}HARVEST",
"file": "seed/harvest.tabl.asabap",
"description": "Grape harvests"
"name": "{{P}}PRTJOB",
"file": "seed/prtjob.tabl.asabap",
"description": "Print jobs of the print shop"
},
{
"type": "CLAS",
"name": "{{P}}VINE_SEED",
"file": "seed/vine_seed.clas.abap",
"description": "Vineyard seed data",
"name": "{{P}}T31_SEED",
"file": "seed/t31_seed.clas.abap",
"description": "T31 seed data",
"run": true
}
],
"contract": [
{
"type": "PROG",
"name": "{{P}}VINEYARD_RPT",
"name": "{{P}}PRINT_SUM",
"parameters": [
"p_from",
"s_var"
"s_cust"
]
}
],
"out_of_scope": [
"{{P}}GRAPE",
"{{P}}HARVEST"
"{{P}}PRTJOB"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}VINE_HIDDEN",
"file": "hidden/vine_hidden.clas.abap",
"description": "Hidden tests for the vineyard harvest report"
"name": "{{P}}T31_HIDDEN",
"file": "hidden/t31_hidden.clas.abap",
"description": "T31 hidden tests"
}
],
"reference": [
{
"type": "PROG",
"name": "{{P}}VINEYARD_RPT",
"file": "reference/vineyard_rpt.prog.abap",
"description": "Harvest weight per grape variety"
"name": "{{P}}PRINT_SUM",
"file": "reference/print_sum.prog.abap",
"description": "Print volume and revenue per customer"
}
],
"craft_checks": [