‎2012 Nov 06 8:15 AM
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
‎2012 Nov 06 8:30 AM
‎2012 Nov 06 8:30 AM
‎2012 Nov 06 9:12 AM
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