10-08-2008 8:46 PM
Gurus,
I want some help in writing some logic in ABAP. I have a scenario when a the numbers that are coming via interface are greater then 99. In that case, I have to map according to following scenario:
Ex: If its 100, it should be converted to A1 and so on..
A0-A1--
AZ (100 - 135)
B0-B1--
BZ (136 - 171)
-
-
Z0-Z1--
ZZ
Thanks.
Regards,
Rajesh.
10-08-2008 9:08 PM
Try something like this:
PARAMETERS: p_num TYPE i.
DATA: l_type_36(36) TYPE c.
CONCATENATE '0123456789' sy-abcde INTO l_type_36.
DATA: l_temp_num TYPE i,
l_mod_36 TYPE i,
l_div_36 TYPE i,
l_co TYPE char10,
l_code TYPE char2.
IF p_num > 99.
l_temp_num = p_num - 99.
l_mod_36 = l_temp_num MOD 36.
l_div_36 = l_temp_num DIV 36.
l_code+1(1) = l_type_36+l_mod_36(1).
l_code+0(1) = sy-abcde+l_div_36(1).
ELSE.
l_co = p_num.
CONDENSE l_co.
l_code = l_co.
ENDIF.
WRITE: 'Number', p_num.
WRITE: / 'Code ', l_code.
Test results:
Number 135
Code AZ
Regards,
Naimesh Patel
10-08-2008 9:08 PM
Try something like this:
PARAMETERS: p_num TYPE i.
DATA: l_type_36(36) TYPE c.
CONCATENATE '0123456789' sy-abcde INTO l_type_36.
DATA: l_temp_num TYPE i,
l_mod_36 TYPE i,
l_div_36 TYPE i,
l_co TYPE char10,
l_code TYPE char2.
IF p_num > 99.
l_temp_num = p_num - 99.
l_mod_36 = l_temp_num MOD 36.
l_div_36 = l_temp_num DIV 36.
l_code+1(1) = l_type_36+l_mod_36(1).
l_code+0(1) = sy-abcde+l_div_36(1).
ELSE.
l_co = p_num.
CONDENSE l_co.
l_code = l_co.
ENDIF.
WRITE: 'Number', p_num.
WRITE: / 'Code ', l_code.
Test results:
Number 135
Code AZ
Regards,
Naimesh Patel
10-08-2008 9:32 PM
Hi,
Please check this code...
DATA: v_char2 TYPE char2.
DATA: v_input TYPE char2.
START-OF-SELECTION.
v_input = '00'.
DO 200 TIMES.
PERFORM get_next_number USING v_input
CHANGING v_char2.
v_input = v_char2.
WRITE: / sy-index, v_char2.
ENDDO.
*&---------------------------------------------------------------------*
*& Form get_next_Number
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->F_INPUT text
* -->F_OUTPUT text
*----------------------------------------------------------------------*
FORM get_next_number USING f_input TYPE char2
CHANGING f_output TYPE char2.
DATA: v_numc2 TYPE numc2.
DATA: v_1char TYPE char1,
v_index1 TYPE syfdpos,
v_index2 TYPE syfdpos,
v_2char TYPE char1,
v_numc TYPE n.
* Check if the input contains only numbers.
IF f_input CO '1234567890'.
v_numc2 = f_input.
* if the number is less than 99. then increment and exit
* the subroutine.
IF v_numc2 < 99.
v_numc2 = v_numc2 + 1.
f_output = v_numc2.
EXIT.
ENDIF.
ENDIF.
* If the number = 99 then assign A0 and exit the subroutine.
IF f_input = '99'.
f_output = 'A0'.
EXIT.
ELSEIF f_input = 'ZZ'.
f_output = '01'.
EXIT.
ENDIF.
* This logic contains if the value contains characters.
* Get the values
v_1char = f_input(1).
v_2char = f_input+1(1).
* If the second character contains the value '9' then assign
* A
IF v_2char CO '012345678990'.
IF v_2char = '9'.
f_output(1) = v_1char.
f_output+1(1) = 'A'.
EXIT.
ELSE.
f_output(1) = v_1char.
v_numc = v_2char.
v_numc = v_numc + 1.
f_output+1(1) = v_numc.
EXIT.
ENDIF.
ENDIF.
* Get the position
FIND v_1char IN sy-abcde MATCH OFFSET v_index1.
* Get the second position
FIND v_2char IN sy-abcde MATCH OFFSET v_index2.
* If the second character is the last character in the
* alphabets then go to the next character.
IF v_2char = 'Z'.
v_index1 = v_index1 + 1.
f_output(1) = sy-abcde+v_index1(1).
f_output+1(1) = '0'.
EXIT.
ENDIF.
* The last option.
v_index2 = v_index2 + 1.
f_output(1) = v_1char.
f_output+1(1) = sy-abcde+v_index2(1).
ENDFORM. "get_next_Number
Thanks
Naren