Application Development and Automation 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: 
Read only

Code to generate 4 digit alpha numeric key

former_member407402
Discoverer
0 Likes
1,885

Hi All,

I need to generate 4 digit unique Alpha numeric key using ABAP

for eg. ABCD, DCBA, 45F3, FD98............ So on

So such pattern of Alphabet but there should be at least 1 alphabet in each key.

Thank you for support.

Regards,

Kratika

1 ACCEPTED SOLUTION
Read only

former_member214878
Active Participant
0 Likes
1,048

this could help you - http://scn.sap.com/thread/222836

2 REPLIES 2
Read only

former_member214878
Active Participant
0 Likes
1,049

this could help you - http://scn.sap.com/thread/222836

Read only

Former Member
0 Likes
1,048

Hello ,

I dont see any standard way to do that, but i feel you can try many ways :

Option 1) try Number Range SNRO ( you might not be able to use all the combination but its good and easy if u r just worried about few unique numbers )

Option 2) Months back i tried below FM ( custom )

what it does is : gives u unique alphanumeric number every time u Call .u need a table which stores all the numbers ( just to get the last number user asked)

FUNCTION Z_GET_NEXT_NUMBER



FUNCTION Z_GET_NEXT_NUMBER.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     REFERENCE(NUM_C) OPTIONAL
*"     REFERENCE(NUM_D) OPTIONAL
*"     REFERENCE(RESET_I) OPTIONAL
*"     REFERENCE(VBAK_I) OPTIONAL
*"     REFERENCE(MCH1_I) OPTIONAL
*"     REFERENCE(AUFK_I) OPTIONAL
*"  CHANGING
*"     REFERENCE(NEXT_NUMBER) OPTIONAL
*"  EXCEPTIONS
*"      CANCELLED
*"----------------------------------------------------------------------
*
*** Initialize key fields.
  CLEAR: NR_OBJ, NR_SUBOBJ.
  IF NOT VBAK_I IS INITIAL.
    NR_OBJ = VBAK_OBJ.
  ELSEIF NOT MCH1_I IS INITIAL.
    NR_OBJ = MCH1_OBJ.
  ELSEIF NOT AUFK_I IS INITIAL.
    NR_OBJ = AUFK_OBJ.
    IF NOT NEXT_NUMBER IS INITIAL.
      NR_SUBOBJ = NEXT_NUMBER.
    ENDIF.
  ELSE.
    MESSAGE E000(Z1) WITH 'Indicator must be set'.
    RAISE CANCELLED.
  ENDIF.

*** Check reset indicator.
  IF NOT RESET_I IS INITIAL.
    IF NOT AUFK_I IS INITIAL AND
       NEXT_NUMBER IS INITIAL.
      DELETE FROM ZNUM WHERE OBJECT EQ NR_OBJ.
    ELSE.
      DELETE FROM ZNUM WHERE OBJECT EQ NR_OBJ
                         AND SUBOBJECT EQ NR_SUBOBJ.
    ENDIF.
    IF SY-SUBRC IS INITIAL.
      MESSAGE I000(Z1) WITH 'Object deleted -' NR_OBJ NR_SUBOBJ.
    ELSE.
      MESSAGE I000(Z1) WITH 'Object not found -' NR_OBJ NR_SUBOBJ.
    ENDIF.
    EXIT.
  ENDIF.

*** Check total number of characters between 1 and 20.
  T_NUM_CHARS = NUM_CHARS + NUM_DIGITS.
  IF NOT T_NUM_CHARS BETWEEN 1 AND 20.
    MESSAGE E000(Z1) WITH 'Invalid total number of characters'.
    RAISE CANCELLED.
  ENDIF.

*** Retrieve last number used.
  IF NOT NEXT_NUMBER IS INITIAL        "For testing only!
     AND AUFK_I IS INITIAL.
    TNUMBER = NEXT_NUMBER.
  ELSE.
    SELECT SINGLE FOR UPDATE CURR_NUMBER
       INTO TNUMBER FROM ZNUM
       WHERE OBJECT = NR_OBJ
         AND SUBOBJECT = NR_SUBOBJ.
    IF NOT SY-SUBRC IS INITIAL.
      CLEAR TNUMBER.
      DO NUM_CHARS TIMES.
        T_OFFSET = SY-INDEX - 1.
        TNUMBER+T_OFFSET(1) = 'A'.
      ENDDO.
      DO NUM_DIGITS TIMES.
        T_OFFSET = NUM_CHARS + SY-INDEX - 1.
        TNUMBER+T_OFFSET(1) = '0'.
      ENDDO.
    ENDIF.
  ENDIF.

*** Validate alpha part of number.
  DO NUM_CHARS TIMES.
    T_OFFSET = SY-INDEX - 1.
    T_CHAR = TNUMBER+T_OFFSET(1).
    IF T_CHAR CN ALPHABET.
      MESSAGE E000(Z1) WITH 'Invalid number -' TNUMBER.
      RAISE CANCELLED.
    ENDIF.
  ENDDO.

*** Validate numeric part of number.
  DO NUM_DIGITS TIMES.
    T_OFFSET = NUM_CHARS + SY-INDEX - 1.
    T_CHAR = TNUMBER+T_OFFSET(1).
    IF T_CHAR CN NUMBERS.
      MESSAGE E000(Z1) WITH 'Invalid number -' TNUMBER.
      RAISE CANCELLED.
    ENDIF.
  ENDDO.

*** Validate remaining part of number.
  T_STRING = TNUMBER+T_NUM_CHARS.
  IF NOT T_STRING IS INITIAL.
    MESSAGE E000(Z1) WITH 'Invalid number -' TNUMBER.
    RAISE CANCELLED.
  ENDIF.

*** Set maximum loop counter.
  MAX_LOOP = ( ( 25 ** NUM_CHARS ) * ( 10 ** NUM_DIGITS ) )
                                   - ( 25 ** NUM_CHARS ).

  DO.      "Exit when next number is determined

*** Exit when entire range has been checked.
    IF SY-INDEX GE MAX_LOOP.
      MESSAGE E000(Z1) WITH 'No more numbers are available'.
      RAISE CANCELLED.
    ENDIF.

*** Reset number to check for "holes" in range.
    IF TNUMBER CO 'Z9 '.
      CLEAR TNUMBER.
      DO NUM_CHARS TIMES.
        T_OFFSET = SY-INDEX - 1.
        TNUMBER+T_OFFSET(1) = 'A'.
      ENDDO.
      DO NUM_DIGITS TIMES.
        T_OFFSET = NUM_CHARS + SY-INDEX - 1.
        TNUMBER+T_OFFSET(1) = '0'.
      ENDDO.
    ENDIF.

*** Increment numeric part of number.
    ROLL_FLAG = 'X'.
    DO NUM_DIGITS TIMES.
      T_OFFSET = NUM_CHARS + NUM_DIGITS - SY-INDEX.
      T_CHAR = TNUMBER+T_OFFSET(1).
      SEARCH NUMBERS FOR T_CHAR.
      IF NOT SY-SUBRC IS INITIAL.
        MESSAGE E000(Z1) WITH 'Error incrementing number -' TNUMBER.
        RAISE CANCELLED.
      ENDIF.
      ADD 1 TO SY-FDPOS.
      TNUMBER+T_OFFSET(1) = NUMBERS+SY-FDPOS(1).
      IF T_CHAR NE '9'.
        CLEAR ROLL_FLAG.
        EXIT.
      ENDIF.
    ENDDO.
    IF NOT ROLL_FLAG IS INITIAL.
      T_OFFSET = NUM_CHARS + NUM_DIGITS - 1.
      TNUMBER+T_OFFSET(1) = '1'.
    ENDIF.

*** Increment alpha part of number.
    IF NOT ROLL_FLAG IS INITIAL.
      DO NUM_CHARS TIMES.
        T_OFFSET = NUM_CHARS - SY-INDEX.
        T_CHAR = TNUMBER+T_OFFSET(1).
        SEARCH ALPHABET FOR T_CHAR.
        IF NOT SY-SUBRC IS INITIAL.
          MESSAGE E000(Z1) WITH 'Error incrementing number -' TNUMBER.
          RAISE CANCELLED.
        ENDIF.
        ADD 1 TO SY-FDPOS.
        TNUMBER+T_OFFSET(1) = ALPHABET+SY-FDPOS(1).
        IF T_CHAR NE 'Z'.
          EXIT.
        ENDIF.
      ENDDO.
    ENDIF.

*** Validate alpha part of number.
    DO NUM_CHARS TIMES.
      T_OFFSET = SY-INDEX - 1.
      T_CHAR = TNUMBER+T_OFFSET(1).
      IF T_CHAR CN ALPHABET.
        MESSAGE E000(Z1) WITH 'Invalid number -' TNUMBER.
        RAISE CANCELLED.
      ENDIF.
    ENDDO.

*** Validate numeric part of number.
    DO NUM_DIGITS TIMES.
      T_OFFSET = NUM_CHARS + SY-INDEX - 1.
      T_CHAR = TNUMBER+T_OFFSET(1).
      IF T_CHAR CN NUMBERS.
        MESSAGE E000(Z1) WITH 'Invalid number -' TNUMBER.
        RAISE CANCELLED.
      ENDIF.
    ENDDO.
    T_STRING = TNUMBER+NUM_CHARS(NUM_DIGITS).
    IF T_STRING CO '0 '.
      MESSAGE E000(Z1) WITH 'Invalid number -' TNUMBER.
      RAISE CANCELLED.
    ENDIF.

*** Check if number is available.
    IF NOT VBAK_IND IS INITIAL.
      SELECT SINGLE * FROM VBAK
        WHERE  VBELN = TNUMBER.
    ELSEIF NOT MCH1_IND IS INITIAL.
      SELECT * FROM MCH1
        WHERE  CHARG = TNUMBER.
      ENDSELECT.
    ELSEIF NOT AUFK_IND IS INITIAL.
      CONCATENATE NEXT_NUMBER '-' TNUMBER INTO AUFK-AUFNR.
      SELECT SINGLE * FROM AUFK
        WHERE  AUFNR = AUFK-AUFNR.
    ENDIF.

    IF NOT SY-SUBRC IS INITIAL.
      ZNUM-OBJECT = NR_OBJ.
      ZNUM-SUBOBJECT = NR_SUBOBJ.
      ZNUM-CURR_NUMBER = TNUMBER.
      MODIFY ZNUM.
      NEXT_NUMBER = TNUMBER.
      EXIT.                            "Exit from do loop.
    ENDIF.

  ENDDO.

ENDFUNCTION.

Happy Coding..

~Raj