I avoid table locks like the plaugue.
Here is a routine that assumes a one row table with a column containing
the next number.
SET VAR vNextNum INT
WHILE #PI IS NOT NULL THEN
SELECT NumColumn INTO vNextNum FROM OneRowTable
UPDATE OneRowTable SET NumColumn = (.vNextNum + 1) +
WHERE NumColumn = .vNextNum
IF SQLCODE = 0 THEN
BREAK
ENDIF
ENDW
I've tested this in a multiuser environment with many fast computers
running this code at the same time and never get a duplicate.
One could retrieve a number from a table of cached deleted numbers in a
similar manner.
SET VAR vNextNum INT
WHILE #P IS NOT NULL THEN
SELECT CachedNum INTO vNextNum FROM CachedTable WHERE LIMIT = 1
if sqlcode <> 0 then -- no numbers left
BREAK
ENDIF
DELETE FROM CachedTable WHERE CachedNum = .vNextNum
IF SQLCODE = 0 THEN -- Success
BREAK
ENDIF
ENDW
If the variable is null then the routine failed and you need to use the
first routine to get a number.
I believe these routines work so well because of the inherent row lock
imposed by RBase automatically.
KISS
Dennis McGrath
--- axelrod parts <[EMAIL PROTECTED]> wrote:
> Why not just set up a table with the begging #,lock the table when
> doing
> its thing add 1 to the # update it and unlock the table?
> ----- Original Message -----
> From: "Steve Sweeney" <[EMAIL PROTECTED]>
> To: "RBASE-L Mailing List" <[EMAIL PROTECTED]>
> Sent: Wednesday, June 09, 2004 8:46 AM
> Subject: [RBASE-L] - Re: Consecutive numbering
>
>
> > The easiest approach is to pre-populate the table with data. That
> way you
> > can have absolute control over consecutively numbered PK values.
> When a
> > user wants to add (claim) the next available row UPDATE a flag
> field
> (which
> > has a DEFAULT value "New") with the user's login id. Then, if the
> user
> > successfully updated their user login id, you can UPDATE the
> remaining
> > columns of the table and set the flag column to "Done"..
> >
> > Steve
> >
> > ----- Original Message -----
> > From: "Lawrence Lustig" <[EMAIL PROTECTED]>
> > To: "RBASE-L Mailing List" <[EMAIL PROTECTED]>
> > Sent: Monday, June 07, 2004 11:45 AM
> > Subject: [RBASE-L] - Consecutive numbering
> >
> >
> > > Usually I just use autonumber columns and don't worry
> > > about missing values (in the event a user deletes a
> > > row). Now I need to write an application that
> > > consecutively numbers records (no gaps in the
> > > sequence). I also have an autonumber field to use as
> > > the PK.
> > >
> > > My inclination is to handle the numbering in an ON
> > > AFERT INSERT trigger, using the NEXT function against
> > > a "dummy" autonumber table to get the value.
> > >
> > > Does anyone have any thoughts or other suggestions on
> > > how to handle this task?
> > > --
> > > Larry
> > >
> > >
> > > __________________________________________________
> > > Do You Yahoo!?
> > > Tired of spam? Yahoo! Mail has the best spam protection around
> > > http://mail.yahoo.com
> > >
> > >
> >
>