*&---------------------------------------------------------------------* *& Report Z_TYPES_CONSTANTS_IF *& *&---------------------------------------------------------------------* *& This report have the aim to show the use of abap local types and *& constants declared inside interfaces *& *&---------------------------------------------------------------------* REPORT z_types_constants_if. " All classes that will have types references in interface types, " should be declared as 'deferred' before the interface declaration. " Reason: the classes themselves will use types definitions of the " interface and so it must be declared before them. CLASS lcl_calculator DEFINITION DEFERRED. *----------------------------------------------------------------------* * INTERFACE lif_types *----------------------------------------------------------------------* * This interface stores all the types used in the report, e.g.: * - In selection screen * - In methods signatueres * - Classes references (used very often) * - Messages * - View Logic *----------------------------------------------------------------------* INTERFACE: lif_types. " Types for selection screen and methods signatures TYPES: cty_number TYPE i, cty_operator TYPE char1. " References to Classes TYPES: cty_r_calculator TYPE REF TO lcl_calculator. " Messages TYPES: cty_error_message TYPE string. " View Logic TYPES: cty_begin_of_line TYPE i, cty_label TYPE string. ENDINTERFACE. "lif_types *----------------------------------------------------------------------* * INTERFACE lif_constants *----------------------------------------------------------------------* * *----------------------------------------------------------------------* INTERFACE lif_constants. " Operators CONSTANTS: cc_operator_plus TYPE lif_types=>cty_operator VALUE '+', cc_operator_minus TYPE lif_types=>cty_operator VALUE '-', cc_operator_star TYPE lif_types=>cty_operator VALUE '*', cc_operator_slash TYPE lif_types=>cty_operator VALUE '/'. " Labels used in report's output CONSTANTS: cc_number1 TYPE lif_types=>cty_label VALUE `NUMBER 1`, cc_number2 TYPE lif_types=>cty_label VALUE `NUMBER 2`, cc_operator TYPE lif_types=>cty_label VALUE `OPERATOR`, cc_result TYPE lif_types=>cty_label VALUE `RESULT`. " Some constants to control output position of write statements CONSTANTS: cc_column_1_pos TYPE lif_types=>cty_begin_of_line VALUE 5, cc_column_2_pos TYPE lif_types=>cty_begin_of_line VALUE 15. " Messages (important: if translation is required don't use them) CONSTANTS: cc_error_invalid_operator TYPE lif_types=>cty_error_message VALUE `INVALID OPERATOR`. ENDINTERFACE. "lif_constants PARAMETERS: p_n1 TYPE lif_types=>cty_number, " First number p_n2 TYPE lif_types=>cty_number, " Second Number p_ope TYPE lif_types=>cty_operator. " Operator *----------------------------------------------------------------------* * CLASS lcl_calculator DEFINITION *----------------------------------------------------------------------* * Calculator class. It attributes stores the numbers, result and * operator used in the last calculation method call (add, subtract, * multiply and divide). Methods add, subtract, multiply and divide * only require numbers to be invoked and calculate method also * requires the operator which will be used. *----------------------------------------------------------------------* CLASS lcl_calculator DEFINITION. PUBLIC SECTION. DATA: ci_v_number1 TYPE lif_types=>cty_number, ci_v_number2 TYPE lif_types=>cty_number, ci_v_operator TYPE lif_types=>cty_operator, ci_v_result TYPE lif_types=>cty_number. METHODS: add IMPORTING im_num1 TYPE lif_types=>cty_number im_num2 TYPE lif_types=>cty_number, subtract IMPORTING im_num1 TYPE lif_types=>cty_number im_num2 TYPE lif_types=>cty_number, multiply IMPORTING im_num1 TYPE lif_types=>cty_number im_num2 TYPE lif_types=>cty_number, divide IMPORTING im_num1 TYPE lif_types=>cty_number im_num2 TYPE lif_types=>cty_number, calculate IMPORTING im_num1 TYPE lif_types=>cty_number im_num2 TYPE lif_types=>cty_number im_ope TYPE lif_types=>cty_operator. ENDCLASS. "lcl_calculator DEFINITION *----------------------------------------------------------------------* * CLASS lcl_output_handler DEFINITION *----------------------------------------------------------------------* * Class which handles the report's output. It prints attributes from * calculator class. (using the attributes themselves and not get * methods) *----------------------------------------------------------------------* CLASS lcl_output_handler DEFINITION. PUBLIC SECTION. CLASS-METHODS: print_results IMPORTING im_r_calculator TYPE lif_types=>cty_r_calculator. ENDCLASS. "lcl_output_handler DEFINITION *----------------------------------------------------------------------* * CLASS lcl_calculator IMPLEMENTATION *----------------------------------------------------------------------* * Implementation of calculator class *----------------------------------------------------------------------* CLASS lcl_calculator IMPLEMENTATION. METHOD: add. me->ci_v_result = im_num1 + im_num2. me->ci_v_number1 = im_num1. me->ci_v_number2 = im_num2. me->ci_v_operator = lif_constants=>cc_operator_plus. ENDMETHOD. "add METHOD subtract. me->ci_v_result = im_num1 - im_num2. me->ci_v_number1 = im_num1. me->ci_v_number2 = im_num2. me->ci_v_operator = lif_constants=>cc_operator_minus. ENDMETHOD. "subtract METHOD multiply. me->ci_v_result = im_num1 * im_num2. me->ci_v_number1 = im_num1. me->ci_v_number2 = im_num2. me->ci_v_operator = lif_constants=>cc_operator_star. ENDMETHOD. "multiply METHOD divide. DATA: o_exception TYPE REF TO cx_root. DATA: l_v_error_message TYPE string. TRY . me->ci_v_result = im_num1 / im_num2. CATCH cx_root INTO o_exception. CALL METHOD o_exception->if_message~get_text RECEIVING result = l_v_error_message. WRITE: l_v_error_message, /. ENDTRY. me->ci_v_number1 = im_num1. me->ci_v_number2 = im_num2. me->ci_v_operator = lif_constants=>cc_operator_slash. ENDMETHOD. "divide METHOD calculate. CASE im_ope. WHEN lif_constants=>cc_operator_plus. CALL METHOD me->add EXPORTING im_num1 = im_num1 im_num2 = im_num2. WHEN lif_constants=>cc_operator_minus. CALL METHOD me->subtract EXPORTING im_num1 = im_num1 im_num2 = im_num2. WHEN lif_constants=>cc_operator_star. CALL METHOD me->multiply EXPORTING im_num1 = im_num1 im_num2 = im_num2. WHEN lif_constants=>cc_operator_slash. CALL METHOD me->divide EXPORTING im_num1 = im_num1 im_num2 = im_num2. WHEN OTHERS. WRITE: lif_constants=>cc_error_invalid_operator, /. ENDCASE. ENDMETHOD. "calcule ENDCLASS. "lcl_calculator IMPLEMENTATION *----------------------------------------------------------------------* * CLASS lcl_output_handler IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_output_handler IMPLEMENTATION. METHOD: print_results. IF im_r_calculator IS BOUND. WRITE: AT lif_constants=>cc_column_1_pos lif_constants=>cc_number1, AT lif_constants=>cc_column_2_pos im_r_calculator->ci_v_number1. NEW-LINE. WRITE: AT lif_constants=>cc_column_1_pos lif_constants=>cc_number2, AT lif_constants=>cc_column_2_pos im_r_calculator->ci_v_number2. NEW-LINE. WRITE: AT lif_constants=>cc_column_1_pos lif_constants=>cc_operator, AT lif_constants=>cc_column_2_pos im_r_calculator->ci_v_operator. NEW-LINE. WRITE: AT lif_constants=>cc_column_1_pos lif_constants=>cc_result, AT lif_constants=>cc_column_2_pos im_r_calculator->ci_v_result. ENDIF. WRITE: /. ENDMETHOD. "print_results ENDCLASS. "lcl_calculator IMPLEMENTATION START-OF-SELECTION. " Create data reference DATA: o_my_calculator TYPE lif_types=>cty_r_calculator. " Instantiate calculator class CREATE OBJECT o_my_calculator. " If operator was not given, invoke all calculation methods. IF p_ope IS INITIAL. CALL METHOD o_my_calculator->add EXPORTING im_num1 = p_n1 im_num2 = p_n2. CALL METHOD lcl_output_handler=>print_results( im_r_calculator = o_my_calculator ). CALL METHOD o_my_calculator->subtract EXPORTING im_num1 = p_n1 im_num2 = p_n2. CALL METHOD lcl_output_handler=>print_results( im_r_calculator = o_my_calculator ). CALL METHOD o_my_calculator->multiply EXPORTING im_num1 = p_n1 im_num2 = p_n2. CALL METHOD lcl_output_handler=>print_results( im_r_calculator = o_my_calculator ). CALL METHOD o_my_calculator->divide EXPORTING im_num1 = p_n1 im_num2 = p_n2. CALL METHOD lcl_output_handler=>print_results( im_r_calculator = o_my_calculator ). ELSE. CALL METHOD o_my_calculator->calculate EXPORTING im_num1 = p_n1 im_num2 = p_n2 im_ope = p_ope. CALL METHOD lcl_output_handler=>print_results( im_r_calculator = o_my_calculator ). ENDIF.