>>>>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>>>>