107 lines
3.4 KiB
ABAP
107 lines
3.4 KiB
ABAP
CLASS {{p}}soil_evaluator DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
PUBLIC SECTION.
|
|
TYPES:
|
|
ty_ph TYPE p LENGTH 3 DECIMALS 1,
|
|
ty_nutrient TYPE i,
|
|
ty_status TYPE c LENGTH 1,
|
|
ty_grade TYPE c LENGTH 1,
|
|
BEGIN OF ty_sample,
|
|
ph TYPE ty_ph,
|
|
nutrient TYPE ty_nutrient,
|
|
END OF ty_sample,
|
|
tt_sample TYPE STANDARD TABLE OF ty_sample WITH EMPTY KEY,
|
|
BEGIN OF ty_result,
|
|
status TYPE ty_status,
|
|
avg_ph TYPE ty_ph,
|
|
avg_nutrient TYPE ty_nutrient,
|
|
grade TYPE ty_grade,
|
|
END OF ty_result.
|
|
CONSTANTS:
|
|
c_status_ok TYPE ty_status VALUE 'O',
|
|
c_status_error TYPE ty_status VALUE 'E',
|
|
c_grade_a TYPE ty_grade VALUE 'A',
|
|
c_grade_b TYPE ty_grade VALUE 'B',
|
|
c_grade_c TYPE ty_grade VALUE 'C'.
|
|
METHODS evaluate
|
|
IMPORTING it_samples TYPE tt_sample
|
|
RETURNING VALUE(rs_result) TYPE ty_result.
|
|
PRIVATE SECTION.
|
|
CONSTANTS:
|
|
c_ph_min TYPE ty_ph VALUE '0.0',
|
|
c_ph_max TYPE ty_ph VALUE '14.0',
|
|
c_ph_a_min TYPE ty_ph VALUE '6.0',
|
|
c_ph_a_max TYPE ty_ph VALUE '7.5',
|
|
c_ph_b_min TYPE ty_ph VALUE '5.0',
|
|
c_ph_b_max TYPE ty_ph VALUE '8.0',
|
|
c_nutr_a_min TYPE ty_nutrient VALUE 50,
|
|
c_nutr_b_min TYPE ty_nutrient VALUE 30.
|
|
METHODS has_invalid_ph
|
|
IMPORTING it_samples TYPE tt_sample
|
|
RETURNING VALUE(rv_invalid) TYPE abap_bool.
|
|
METHODS average_ph
|
|
IMPORTING it_samples TYPE tt_sample
|
|
RETURNING VALUE(rv_avg) TYPE ty_ph.
|
|
METHODS average_nutrient
|
|
IMPORTING it_samples TYPE tt_sample
|
|
RETURNING VALUE(rv_avg) TYPE ty_nutrient.
|
|
METHODS determine_grade
|
|
IMPORTING iv_avg_ph TYPE ty_ph
|
|
iv_avg_nutrient TYPE ty_nutrient
|
|
RETURNING VALUE(rv_grade) TYPE ty_grade.
|
|
ENDCLASS.
|
|
|
|
CLASS {{p}}soil_evaluator IMPLEMENTATION.
|
|
METHOD evaluate.
|
|
IF it_samples IS INITIAL.
|
|
rs_result-status = c_status_error.
|
|
RETURN.
|
|
ENDIF.
|
|
IF has_invalid_ph( it_samples ) = abap_true.
|
|
rs_result-status = c_status_error.
|
|
RETURN.
|
|
ENDIF.
|
|
rs_result-avg_ph = average_ph( it_samples ).
|
|
rs_result-avg_nutrient = average_nutrient( it_samples ).
|
|
rs_result-grade = determine_grade( iv_avg_ph = rs_result-avg_ph
|
|
iv_avg_nutrient = rs_result-avg_nutrient ).
|
|
rs_result-status = c_status_ok.
|
|
ENDMETHOD.
|
|
|
|
METHOD has_invalid_ph.
|
|
LOOP AT it_samples INTO DATA(ls_sample).
|
|
IF ls_sample-ph < c_ph_min OR ls_sample-ph > c_ph_max.
|
|
rv_invalid = abap_true.
|
|
RETURN.
|
|
ENDIF.
|
|
ENDLOOP.
|
|
ENDMETHOD.
|
|
|
|
METHOD average_ph.
|
|
DATA lv_sum TYPE p LENGTH 9 DECIMALS 1.
|
|
LOOP AT it_samples INTO DATA(ls_sample).
|
|
lv_sum = lv_sum + ls_sample-ph.
|
|
ENDLOOP.
|
|
rv_avg = lv_sum / lines( it_samples ).
|
|
ENDMETHOD.
|
|
|
|
METHOD average_nutrient.
|
|
DATA lv_sum TYPE i.
|
|
LOOP AT it_samples INTO DATA(ls_sample).
|
|
lv_sum = lv_sum + ls_sample-nutrient.
|
|
ENDLOOP.
|
|
rv_avg = lv_sum / lines( it_samples ).
|
|
ENDMETHOD.
|
|
|
|
METHOD determine_grade.
|
|
IF iv_avg_ph >= c_ph_a_min AND iv_avg_ph <= c_ph_a_max
|
|
AND iv_avg_nutrient >= c_nutr_a_min.
|
|
rv_grade = c_grade_a.
|
|
ELSEIF iv_avg_ph >= c_ph_b_min AND iv_avg_ph <= c_ph_b_max
|
|
AND iv_avg_nutrient >= c_nutr_b_min.
|
|
rv_grade = c_grade_b.
|
|
ELSE.
|
|
rv_grade = c_grade_c.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
ENDCLASS.
|