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: 

How to coding to achieve 'Alphanumreic increasement' uFF1FuFF1F

Former Member
0 Kudos

Hi,

Currently i need to develop an program which function like 'number range'...It requires an start value and end value like below shows:

Start value '0001' to End value 'ZZZZ'

In other words, we want all combinations of four character alphanumerics, from 0000 to ZZZZ. Everytime this program excuted, an initial number will be passed in, then after program excuted, program will pass the latest next number out...

I have tested to write below piece of code...But it only generate the sequence like '0001-9999';'A001-A999'...Z001-Z999'....While this is not what i wanted...

FORM test_next_number CHANGING P_nextnumber. 

data: l_exidv type vekp-exidv, 
      l_num(10) type c value '0123456789', 
      l_seq(26) type c VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
      l_letter(1) type c, 
      l_number(3) type n, 
      l_counter(4) type n, 
      g_counter(4) type n, 
      l_pointer type i. 

g_counter = '0001'.  "initial number passed in

if g_counter co l_num. 
  l_counter = g_counter. 
  if l_counter < 9999. 
    add 1 to l_counter. 
    g_counter = l_counter. 
  else. 
    g_counter = 'A000'. 
  endif. 
else.   "last 4 digits are alphanumeric 
  l_number = g_counter+1(3). 
  if l_number < 999. 
    add 1 to l_number. 
    g_counter+1(3) = l_number. 
  else. 
    l_number = 0. 
    l_letter = g_counter(1). 
    search l_seq for l_letter. 
    if sy-subrc = 0. 
      l_pointer = sy-fdpos + 1. 
    else. 
      clear l_pointer. 
    endif. 
    if l_pointer < 26. 
      l_letter = l_seq+l_pointer(1). 
    else. 
      l_letter = '0'. 
    endif. 
    g_counter(1) = l_letter. 
    g_counter+1(3) = l_number. 
  endif. 
endif. 

concatenate 'Next numer is:' g_counter into p_nextnumber. 


write: p_nextnumber. 


ENDFORM.                    " test

What i wanted is the sequence for all combinations of four character alphanumerics...from 0001 to ZZZZ

How to code to achieve this...

Thank you very much.

8 REPLIES 8

Former Member
0 Kudos

Hi

Please check the number range objects in SNRO.

Create your custom number range object and use FM 'NUMBER_GET_NEXT' to get the next free number.

You have a variety of options available in SNRO while creaing the objects.

REgards,

Arun

0 Kudos

Hi Arun,

But in SNRO, it only support numeric number range, it do not support alphanumeric number range...

If set in internal, it could only in numeric number range...And maybe could use 'Number_get_next' to get the next free number, but this do not support alphanumeric...

If set in external, which means for manunal input, And i could not see the current number there...So how do we identify the next number???

What we really want are alphanumeric sequence and could see the current number...How to achieve this...

Thanks!!!

0 Kudos

hello hoo,

i liked the small challenge ;o).

the local class should fit your needs and if you like you can transfer the code to an abap class or a function module if u prefere that.

the rest of the programm just shows that the code is woking.


REPORT  zrwe_base36.

CLASS _lcl_calc DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      base_36
        changing
          cv_36 type char4.
    CONSTANTS:
      gc_digits(36) TYPE c VALUE '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
ENDCLASS.                    "_lcl_calc DEFINITION

CLASS _lcl_calc IMPLEMENTATION.
  METHOD base_36.
    DATA:
      ln_offset    TYPE i,
      ln_digit_val TYPE i,
      ln_val       TYPE i.

    DO 4 TIMES.
      IF cv_36+ln_offset(1) CN '0'.
        FIND FIRST OCCURRENCE OF cv_36+ln_offset(1) IN gc_digits MATCH OFFSET ln_digit_val.
        ln_val = ln_val + ln_digit_val * 36 ** ( 3 - ln_offset ).
      ENDIF.
      ADD 1 TO ln_offset.
    ENDDO.

    ADD 1 TO ln_val.

    DO 4 TIMES.
      ln_offset = ln_offset - 1.

      ln_digit_val = ln_val MOD 36.
      cv_36+ln_offset(1) = gc_digits+ln_digit_val(1).
      ln_val = ln_val DIV 36.
    ENDDO.
  ENDMETHOD.                                                "base_36
ENDCLASS.                    "_lcl_calc IMPLEMENTATION

START-OF-SELECTION.
  DATA:
    lv_my_val(4) TYPE c value '0000'.

  DO 10000 TIMES.
    _lcl_calc=>base_36(
      changing
        cv_36 = lv_my_val ).

    WRITE / lv_my_val.
  ENDDO.

hf

Roman

0 Kudos

Thank you all's reply...

But for Roman's, base_36 seems great, but why it could not pass the syntax check?

It said 'OCCURRENCE OF cv_36+ln_offset(1) is not expected'?

...

Anywhere is wrong?

Thanks.

0 Kudos

hello hoo,

i copied the coding from my client where it is wokring. But I set my client to ignore the 72 character limit for lines. This line seems to be a bit longer could you check if your editor is still set to 72 characters only and so cut a part of the line making the statement?

hf

Roman

Former Member
0 Kudos

Hi,

This solution is rather crude compared to Roman's but this should work too.

All I have tried to do is tweak your own code a little bit. I haven't tested this but should be ok I guess.

Nice code Roman, converting to base 36 is a great idea.

DATA: l_seq(36) type c Value '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
           l_pointer type i,
           g_counter(4) type c.


if g_counter+3(1) = 'Z'.
 	g_counter+3(1) = '0'.
 	if g_counter+2(1) = 'Z'.
  		g_counter+2(1) = '0'.
   		if g_counter+1(1) = 'Z'.
    			g_counter+1(1) = '0'.
    			if g_counter+0(1) = 'Z'.
     				 g_counter+0(1) = '0'.
   			else.
     				peform counter_change changing g_counter+0(1).
    			endif.
    		else.
     			peform counter_change changing g_counter+1(1).
   		endif.
 	else.
     		peform counter_change changing g_counter+2(1).
 	endif.
 else.
     	peform counter_change changing g_counter+3(1).
endif.


FORM counter_change CHANGING p_counter
      search l_seq for p_counter.
      l_pointer = sy-fdpos + 1.
      P_counter = l_seq+l_pointer(1).
ENDFORM.

Regards,

Srihari

Message was edited by:

Srihari Hebbar

0 Kudos

Correct syntax of your code below.

DATA: l_seq(36) type c Value '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
      l_pointer type i,
      g_counter(4) type c.


if g_counter+3(1) = 'Z'.
 	g_counter+3(1) = '0'.
 	if g_counter+2(1) = 'Z'.
      g_counter+2(1) = '0'.
      if g_counter+1(1) = 'Z'.
          g_counter+1(1) = '0'.
          if g_counter+0(1) = 'Z'.
             g_counter+0(1) = '0'.
        else.
            perform counter_change changing g_counter+0(1).
          endif.
        else.
          perform counter_change changing g_counter+1(1).
      endif.
 	else.
        perform counter_change changing g_counter+2(1).
 	endif.
 else.
     	perform counter_change changing g_counter+3(1).
endif.


FORM counter_change CHANGING p_counter.
      search l_seq for p_counter.
      l_pointer = sy-fdpos + 1.
      P_counter = l_seq+l_pointer(1).
ENDFORM.

Former Member
0 Kudos

This FM will add 1 base36. This will solve problem.

FUNCTION zjnc_add_one_base36 .

*"----


""Local Interface:

*" CHANGING

*" REFERENCE(BASE36NUM) TYPE C

*"----


DATA: len TYPE i,

num(64) TYPE n,

startch TYPE i,

startnm TYPE i,

onech(1) TYPE c,

onenm(2) TYPE n,

flag TYPE i.

len = STRLEN( base36num ).

CLEAR: startch, startnm.

DO len TIMES.

MOVE base36num+startch(1) TO onech.

CASE onech.

WHEN '0'.

MOVE 00 TO onenm.

WHEN '1'.

MOVE 01 TO onenm.

WHEN '2'.

MOVE 02 TO onenm.

WHEN '3'.

MOVE 03 TO onenm.

WHEN '4'.

MOVE 04 TO onenm.

WHEN '5'.

MOVE 05 TO onenm.

WHEN '6'.

MOVE 06 TO onenm.

WHEN '7'.

MOVE 07 TO onenm.

WHEN '8'.

MOVE 08 TO onenm.

WHEN '9'.

MOVE 09 TO onenm.

WHEN 'A'.

MOVE 10 TO onenm.

WHEN 'B'.

MOVE 11 TO onenm.

WHEN 'C'.

MOVE 12 TO onenm.

WHEN 'D'.

MOVE 13 TO onenm.

WHEN 'E'.

MOVE 14 TO onenm.

WHEN 'F'.

MOVE 15 TO onenm.

WHEN 'G'.

MOVE 16 TO onenm.

WHEN 'H'.

MOVE 17 TO onenm.

WHEN 'I'.

MOVE 18 TO onenm.

WHEN 'J'.

MOVE 19 TO onenm.

WHEN 'K'.

MOVE 20 TO onenm.

WHEN 'L'.

MOVE 21 TO onenm.

WHEN 'M'.

MOVE 22 TO onenm.

WHEN 'N'.

MOVE 23 TO onenm.

WHEN 'O'.

MOVE 24 TO onenm.

WHEN 'P'.

MOVE 25 TO onenm.

WHEN 'Q'.

MOVE 26 TO onenm.

WHEN 'R'.

MOVE 27 TO onenm.

WHEN 'S'.

MOVE 28 TO onenm.

WHEN 'T'.

MOVE 29 TO onenm.

WHEN 'U'.

MOVE 30 TO onenm.

WHEN 'V'.

MOVE 31 TO onenm.

WHEN 'W'.

MOVE 32 TO onenm.

WHEN 'X'.

MOVE 33 TO onenm.

WHEN 'Y'.

MOVE 34 TO onenm.

WHEN 'Z'.

MOVE 35 TO onenm.

WHEN OTHERS.

RAISE overflow.

ENDCASE.

REPLACE SECTION OFFSET startnm LENGTH 2 OF num WITH onenm.

ADD 1 TO startch.

ADD 2 TO startnm.

ENDDO.

COMPUTE startch = len - 1.

COMPUTE startnm = 2 * len - 2.

MOVE 1 TO flag.

DO len TIMES.

MOVE num+startnm(2) TO onenm.

IF flag = 1.

ADD 1 TO onenm.

IF onenm = 36.

MOVE 00 TO onenm.

MOVE 1 TO flag.

ELSE.

MOVE 0 TO flag.

ENDIF.

ENDIF.

CASE onenm.

WHEN 00.

MOVE '0' TO onech.

WHEN 01.

MOVE '1' TO onech.

WHEN 02.

MOVE '2' TO onech.

WHEN 03.

MOVE '3' TO onech.

WHEN 04.

MOVE '4' TO onech.

WHEN 05.

MOVE '5' TO onech.

WHEN 06.

MOVE '6' TO onech.

WHEN 07.

MOVE '7' TO onech.

WHEN 08.

MOVE '8' TO onech.

WHEN 09.

MOVE '9' TO onech.

WHEN 10.

MOVE 'A' TO onech.

WHEN 11.

MOVE 'B' TO onech.

WHEN 12.

MOVE 'C' TO onech.

WHEN 13.

MOVE 'D' TO onech.

WHEN 14.

MOVE 'E' TO onech.

WHEN 15.

MOVE 'F' TO onech.

WHEN 16.

MOVE 'G' TO onech.

WHEN 17.

MOVE 'H' TO onech.

WHEN 18.

MOVE 'I' TO onech.

WHEN 19.

MOVE 'J' TO onech.

WHEN 20.

MOVE 'K' TO onech.

WHEN 21.

MOVE 'L' TO onech.

WHEN 22.

MOVE 'M' TO onech.

WHEN 23.

MOVE 'N' TO onech.

WHEN 24.

MOVE 'O' TO onech.

WHEN 25.

MOVE 'P' TO onech.

WHEN 26.

MOVE 'Q' TO onech.

WHEN 27.

MOVE 'R' TO onech.

WHEN 28.

MOVE 'S' TO onech.

WHEN 29.

MOVE 'T' TO onech.

WHEN 30.

MOVE 'U' TO onech.

WHEN 31.

MOVE 'V' TO onech.

WHEN 32.

MOVE 'W' TO onech.

WHEN 33.

MOVE 'X' TO onech.

WHEN 34.

MOVE 'Y' TO onech.

WHEN 35.

MOVE 'Z' TO onech.

WHEN OTHERS.

RAISE overflow.

ENDCASE.

REPLACE SECTION OFFSET startch LENGTH 1 OF base36num WITH onech.

SUBTRACT 1 FROM startch.

SUBTRACT 2 FROM startnm.

ENDDO.

IF flag = 1.

RAISE overflow.

ENDIF.

ENDFUNCTION.