Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Number range mapping to alphanumeric numbers.

Former Member
0 Kudos

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--


A9-AA--


AZ (100 - 135)

B0-B1--


B9-BA--


BZ (136 - 171)

-


-


Z0-Z1--


Z9-ZA--


ZZ

Thanks.

Regards,

Rajesh.

1 ACCEPTED SOLUTION

naimesh_patel
Active Contributor
0 Kudos

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

2 REPLIES 2

naimesh_patel
Active Contributor
0 Kudos

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

Former Member
0 Kudos

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