Article: Q106708
Product(s): Microsoft FoxPro
Version(s): 2.5x 2.6x 3.00 | 1.02 2.00 2.5x
Operating System(s):
Keyword(s): kbcode
Last Modified: 24-AUG-1999
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Visual FoxPro for Windows, version 3.0
- Microsoft FoxPro for Windows, versions 2.5x, 2.6x
- Microsoft FoxPro for MS-DOS, versions 1.02, 2.0, 2.5x, 2.6x
- Microsoft FoxPro for Macintosh, versions 2.5x, 2.6a
-------------------------------------------------------------------------------
SUMMARY
=======
There are several ways to generate a unique string for a key field value. One
method of doing this is described below.
MORE INFORMATION
================
The following code is adapted from the "FoxPro 2.5 Advanced Developer's
Handbook" by Adams and Powell, Chapter 18, page 644.
The following function accepts a numeric parameter to specify the length of the
key desired. If no parameter is passed, the function will generate a unique key
that is 8 characters long. The maximum key length that can be generated is 18
characters.
FUNCTION ukey
PARAMETER lenkey
IF PARAMETERS()=0
lenkey=8
ENDIF
IF lenkey=1
RETURN RIGHT(SYS(3),1)
ENDIF
len1=FLOOR(lenkey/2)
len2=lenkey-len1
key1= RIGHT(SYS(3),len1)
key2= RIGHT(SYS(2015),len2)
RETURN key1+key2
Theoretically, this method allows more possible keys than FoxPro can store
records, without a duplicate; however, there is the possibility of duplication
because of the cyclic nature of the algorithm (which is based on the system time
and date).
The default 8-character return from UKEY() will be sufficient for most systems
and the chance of a duplicate is significantly less than 1:10**18. (The actual
figure is estimated here: 36**8*10**10). To ensure uniqueness, a SELECT SQL
statement can be used. For example, if you were using a database alias of
MYDATA, and a key field of KEYFIELD C(8), you would use the following SELECT SQL
statement:
goodkey=.F.
DO WHILE !goodkey
newkey= UKEY()
SELECT KEYFIELD from MYDATA WHERE KEYFIELD=newkey
goodkey=IIF(_TALLY=0,.T.,.F.)
ENDDO
This method will slow down as the data grows, but should be sufficient for
databases with less than 16 million records. For larger databases, use a key
length greater than 8.
REFERENCES
==========
"FoxPro 2.5 Advanced Developer[ASCII 146]s Handbook," Pat Adams and Jordan
Powell, Brady Publishing, New York, NY., 1993, Chapter 18, page 644
Additional query words: VFoxWin FoxMac FoxDos FoxWin 2.50 2.50a 2.50b 2.50c 2.60 unique key avoid duplicate record
======================================================================
Keywords : kbcode
Technology : kbHWMAC kbOSMAC kbVFPsearch kbAudDeveloper kbFoxproSearch kbZNotKeyword3 kbFoxPro260aMac kbFoxPro200DOS kbVFP300
Version : 2.5x 2.6x 3.00 | 1.02 2.00 2.5x
=============================================================================