Thursday, June 26, 2025

πŸ”„ Practicals Basics Programs - Imperative Logic 2

 

Write an executable program that contains a routine which prints all usernames in the system. (Check table USR04 and its content in transaction SE11, SE16 or SE16N).

Solution:

REPORT z_abap101_051.

TYPES ty_users TYPE TABLE OF usr04-bname.
DATA it_users TYPE ty_users.

START-OF-SELECTION.

SELECT bname
FROM usr04
INTO TABLE it_users.

PERFORM print_users USING it_users.


*&---------------------------------------------------------------------*

*& Form print_users

*&---------------------------------------------------------------------*

* Prints all usernames in the system

*----------------------------------------------------------------------*

* -->US_T_USERS usernames

*----------------------------------------------------------------------*

FORM print_users USING us_t_users TYPE ty_users.

DATA lwa_user TYPE LINE OF ty_users.

LOOP AT us_t_users INTO lwa_user.
WRITE lwa_user. NEW-LINE.
ENDLOOP.

ENDFORM. "print_users


For this exercise, you should Read the help from command FORM completely. Then, write an executable program that has a routine that receives four global variables and change their value. Each variable will be received in a different way: 2 of them using the addition USING and the other 2 using the addition CHANGING from the FORM command. For each pair use and omit the adding VALUE. Print the contents of all global variables before the routine is called, at the beginning of the routine, at the end of the routine (after all values are changed) and after the PERFORM statement. See how the contents of variables behave using the debugger.

Solution:

REPORT z_abap101_052.


DATA gv_a TYPE i VALUE 1.
DATA gv_b TYPE i VALUE 2.
DATA gv_c TYPE i VALUE 3.
DATA gv_d TYPE i VALUE 4.

*&---------------------------------------------------------------------*

*& Form form_parameters

*&---------------------------------------------------------------------*

* Get 4 parameters in different ways

*----------------------------------------------------------------------*

* -->US_A text

* -->(USV_B) text

* -->CH_C text

* -->(CHV_D) text

*----------------------------------------------------------------------*

FORM form_parameters

        USING us_a TYPE i

          value(usv_b) TYPE i

CHANGING ch_c TYPE i

           value(chv_d) TYPE i.


WRITE 'Inside FORM.'. NEW-LINE.
WRITE: 'us_a: ', us_a. NEW-LINE.
WRITE: 'usv_b: ', usv_b. NEW-LINE.
WRITE: 'ch_c: ', ch_c. NEW-LINE.
WRITE: 'chv_d: ', chv_d. NEW-LINE.

us_a = us_a + 10.
usv_b = usv_b + 10.
ch_c = ch_c + 10.
chv_d = chv_d + 10.

WRITE 'Inside FORM, after update local variables'. NEW-LINE.
WRITE: 'us_a: ', us_a. NEW-LINE.
WRITE: 'usv_b: ', usv_b. NEW-LINE.
WRITE: 'ch_c: ', ch_c. NEW-LINE.
WRITE: 'chv_d: ', chv_d. NEW-LINE.


WRITE: 'gv_a: ', gv_a. NEW-LINE.
WRITE: 'gv_b: ', gv_b. NEW-LINE.
WRITE: 'gv_c: ', gv_c. NEW-LINE.
WRITE: 'gv_d: ', gv_d. NEW-LINE.

ENDFORM. "form_parameters

START-OF-SELECTION.

WRITE 'Before FORM'. NEW-LINE.
WRITE: 'gv_a: ', gv_a. NEW-LINE.
WRITE: 'gv_b: ', gv_b. NEW-LINE.
WRITE: 'gv_c: ', gv_c. NEW-LINE.
WRITE: 'gv_d: ', gv_d. NEW-LINE.

PERFORM form_parameters USING gv_a gv_b CHANGING gv_c gv_d.

WRITE 'After FORM'. NEW-LINE.
WRITE: 'gv_a: ', gv_a. NEW-LINE.
WRITE: 'gv_b: ', gv_b. NEW-LINE.
WRITE: 'gv_c: ', gv_c. NEW-LINE.
WRITE: 'gv_d: ', gv_d. NEW-LINE.


Write an executable program that has a routine that receives two numbers and returns the
largest of them, If the numbers are equal return the number itself.

Solution:

REPORT z_abap101_053.

DATA gv_largest TYPE f.

*&---------------------------------------------------------------------*

*& Form get_larger

*&---------------------------------------------------------------------*

* Compares 2 numbers and returns the largest. If equal returns itself

*----------------------------------------------------------------------*

* -->NUMBER_A Number A

* -->NUMBER_B Number B

* -->LARGEST_NUMBER Largest Number

*----------------------------------------------------------------------*

FORM get_larger

USING

number_a TYPE f

number_b TYPE f

CHANGING

largest_number TYPE f.

IF number_a >= number_b.

largest_number = number_a.

ELSE.

largest_number = number_b.

ENDIF.

ENDFORM. "get_larger


START-OF-SELECTION.


PERFORM get_larger USING 1 2 CHANGING gv_largest.

WRITE gv_largest EXPONENT 0. NEW-LINE.

PERFORM get_larger USING 4 3 CHANGING gv_largest.

WRITE gv_largest EXPONENT 0. NEW-LINE.

PERFORM get_larger USING 5 5 CHANGING gv_largest.

WRITE gv_largest EXPONENT 0. NEW-LINE.

PERFORM get_larger USING '6.2' '7.1' CHANGING gv_largest.

WRITE gv_largest EXPONENT 0. NEW-LINE.


Write an executable program that has a routine that receives two numbers and return a flag
(character with length 1). If the numbers are equal, set the flag with 'X. Otherwise set the flag to space.

Solution:

REPORT z_abap101_054.

DATA gv_flag TYPE c.

*&---------------------------------------------------------------------*

*& Form get_larger

*&---------------------------------------------------------------------*

* Compares 2 numbers and returns a flag (true) if they are equal

*----------------------------------------------------------------------*

* -->NUMBER_A Number A

* -->NUMBER_B Number B

* -->FLAG Equal numbers indicator

*----------------------------------------------------------------------*

FORM set_flag_if_equal

USING

number_a TYPE f

number_b TYPE f

CHANGING

flag TYPE c.

IF number_a = number_b.

flag = abap_true.

WRITE flag. NEW-LINE.

ELSE.

flag = abap_false.

ENDIF.

ENDFORM. "get_larger

START-OF-SELECTION.

PERFORM set_flag_if_equal USING 1 1 CHANGING gv_flag.

PERFORM set_flag_if_equal USING 4 3 CHANGING gv_flag.

PERFORM set_flag_if_equal USING 5 5 CHANGING gv_flag.

PERFORM set_flag_if_equal USING '6.2' '7.1' CHANGING gv_flag.


Write an executable program that has a routine that takes two numbers and writes the result of the operation [higher_number / lower_number] if the numbers are different. If they are equal, write the result of the operation [number ^ 2].

Solution:

REPORT z_abap101_055.

DATA gv_result TYPE f.

*&---------------------------------------------------------------------*

*& Form get_larger

*&---------------------------------------------------------------------*

* Compares 2 numbers and returns the largest. If equal returns itself

*----------------------------------------------------------------------*

* -->NUMBER_A Number A

* -->NUMBER_B Number B

* -->LARGEST_NUMBER Largest Number

*----------------------------------------------------------------------*

FORM get_larger

USING

number_a TYPE f

number_b TYPE f

CHANGING

largest_number TYPE f.

IF number_a >= number_b.

largest_number = number_a.

ELSE.

largest_number = number_b.

ENDIF.

ENDFORM. "get_larger

*&---------------------------------------------------------------------*

*& Form get_larger

*&---------------------------------------------------------------------*

* Compares 2 numbers and returns a flag (true) if they are equal

*----------------------------------------------------------------------*

* -->NUMBER_A Number A

* -->NUMBER_B Number B

* -->FLAG Equal numbers indicator

*----------------------------------------------------------------------*

FORM set_flag_if_equal

USING

number_a TYPE f

number_b TYPE f

CHANGING

flag TYPE c.

IF number_a = number_b.

flag = abap_true.

* WRITE flag. NEW-LINE.

ELSE.

flag = abap_false.

ENDIF.

ENDFORM. "get_larger

*&---------------------------------------------------------------------*

*& Form division_or_power2

*&---------------------------------------------------------------------*

* takes two numbers and writes the result of the operation

* [higher_number / lower_number] if the numbers are different.

* If they are equal, write the result of the operation [number ^ 2].

*----------------------------------------------------------------------*

* -->NUMBER_A text

* -->NUMBER_B text

* -->RESULT text

*----------------------------------------------------------------------*

FORM division_or_power2

USING

number_a TYPE f

number_b TYPE f

CHANGING

result TYPE f.

DATA lv_number_equal TYPE c.

PERFORM set_flag_if_equal

USING

number_a

number_b

CHANGING

lv_number_equal.

IF lv_number_equal = abap_true.

result = number_a ** 2.

ELSE.

DATA lv_larger_number TYPE f.

PERFORM get_larger USING number_a number_b CHANGING lv_larger_number.

IF number_a = lv_larger_number.

result = number_a / number_b.

ELSE.

result = number_b / number_a.

ENDIF.

ENDIF.

WRITE result EXPONENT 0.

NEW-LINE.

ENDFORM. "division_or_power2


START-OF-SELECTION.


PERFORM division_or_power2 USING 1 1 CHANGING gv_result.

PERFORM division_or_power2 USING 3 3 CHANGING gv_result.

PERFORM division_or_power2 USING 6 2 CHANGING gv_result.

PERFORM division_or_power2 USING 2 6 CHANGING gv_result.

PERFORM division_or_power2 USING 10 2 CHANGING gv_result.

PERFORM division_or_power2 USING 2 10 CHANGING gv_result.


No comments:

Post a Comment