Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Generating Unique ID
Message
From
28/11/2001 10:18:23
Keith Payne
Technical Marketing Solutions
Florida, United States
 
General information
Forum:
Visual FoxPro
Category:
Coding, syntax & commands
Miscellaneous
Thread ID:
00586682
Message ID:
00586956
Views:
13
Nadya,

I don't think it is possible to know the alias 100% of the time. You may have to re-think this method of PK generation.

Your code is very impressive but perhaps it tries to accomplish too much? Here is a PK routine that I have used in some applications:
function nextid(lcTable as String)

	local lidNextID
	
	if !used('master')
		select 0
		use master shared
	else
		select master
	endif

	if flock()
		replace (lcTable) with eval(lcTable)+1 in master
		lidNextID = eval(lcTable)
		unlock
	else
		lidNextID = .NULL.
	endif

	return lidNextID

endfunc
As you can see the code is very simple (and very fast). Rather than worrying about every possible senario from within the function, it simply causes an error when the environment is not set up to it's liking.

You may want to consider using a simpler PK routine and move the responsibility of setting the environment to the application.

- Keith

>Hi everybody,
>
>Here is my SP code:
>
>function GetNextID
>lparameters tcAlias
>local lnOldArea,lnNextID, lcDBC, lcOldSetDBC, llOpened, lcCurAlias
>llOpened=.t.
>*--- Variable Setup
>lcCurAlias=upper(alias())
>if empty(m.lcCurAlias)
>	=messagebox("No table open...",16,"Error")
>	return null
>endif
>tcAlias = iif(empty(m.tcAlias),m.lcCurAlias,upper(m.tcAlias))
>lnOldArea = select()
>lnNextID = 0
>lcDBC=cursorgetprop('database',m.tcAlias) && Return the name of owning database
>if empty(m.lcDBC)
>	=messagebox('You can not assign Next ID to the free table!',16,'Warning')
>	return null
>endif
>lcOldSetDBC=set('database') && Save current status
>if !dbused(m.lcDBC)
>	open data (m.lcDBC)
>	llOpened=.f. && Was not open before
>endif
>set database to (m.lcDBC) && Make this DBC current
>*--- Go to NextID Database to assign the next unique ID
>*--- Assumes the you are sitting in the correct DBC.
>if !OpenTble(addbs(justpath(m.lcDBC))+juststem(m.lcDBC)+"!"+"NextID",,,"Table")
>	=messagebox('NextID could not be opened!',16,'Warning')
>	return null
>endif
>select NextID
>if !seek(m.tcAlias)
>	insert into NextID (table,id) values (m.tcAlias,1)
>	lnNextID = 1
>else
>*--- RLOCK will attempt the lock indefinately, because it would be bad to return 0 (the alternative).
>*--- User will be able to cancel attempt if in a deadlock by pressing the ESC key.
>	if rlock()
>		replace NextID.id with NextID.id + 1
>		lnNextID = NextID.id
>		unlock
>	else
>		return null
>	endif
>endif
>*--- Return to prior workarea.
>select (m.lnOldArea)
>if not m.llOpened
>	close database
>endif
>if !empty(m.lcOldSetDBC)
>	set database to (m.lcOldSetDBC)
>endif
>return m.lnNextID
>
>The problem is, what if I open table under different alias? In default value I have GetNextID('AllFunctions').
>
>So, my problem is to find out under which alias AllFunctions table is opened. I'm having brain loss at this moment. How can I find out the alias by fullpath table name?
>
>Thanks a lot in advance.
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform