Table - ultimo registro

Top  Previous  Next

Aconselho-te (por experiência própria) a não usar o AutoExcremento do

Paradox, pricipalmente se for para índice. É fonte de frequentes

apurrinhações...

 

Por outro lado, se você for usar o programa em rede,o recurso de

simplesmente somar 1 (hum) ao campo Código vai te criar problemas sérios de código repetido já que diferentes usuários poderão  estar somando 1 ao mesmo código.

 

A função abaixo, fornece uma chave única, independente do BD e pode ser

usada em redes sem problemas.

 

function dgGetUniqueNumber(LastNumberTbl: TTable): LongInt;

{Gets the next value from a one field one record table which stores the last used value in its first field. The parameter LastNumberTbl is the table that contains the last used number.}

 

const

 

ntMaxTries = 100;

 

var

 

I,WaitCount,Tries: Integer;

 

RecordLocked: Boolean;

 

ErrorMsg: String;

 

begin

 

Result := 0;

 

Tries := 0;

 

with LastNumberTbl do

 

begin

 

{Make sure the table contains a record. If not, add one and set the first

field to zero.}

 

if RecordCount = 0 then

 

begin

 

Insert;

 

Fields[0].AsInteger := 0;

 

Post;

 

end//if

 

{Try to put the table that holds the last used number into edit mode. If

calling Edit raises

 

an exception wait a random period and try again.}

 

Randomize;

 

while Tries < ntMaxTries do

 

try

 

Inc(Tries);

 

Edit;

 

Break;

 

except

 

on E: EDBEngineError do

 

{The call to Edit failed because the record could not be locked.}

 

begin

 

{See if the lock failed because the record is locked by another user.}

 

RecordLocked := False;

 

for I := 0 to Pred(E.ErrorCount) do

 

if E.Errors[I].ErrorCode = 10241 then RecordLocked := True;

 

if RecordLocked then

 

begin

 

{Wait for a random period and try again.}

 

WaitCount := Random(20);

 

for I := 1 to WaitCount do

 

Application.ProcessMessages;

 

Continue;

 

end else

 

begin

 

{The record lock failed for some reason other than another user has the

record locked. Display the BDE error stack and exit.}

 

ErrorMsg := '';

 

for I := 0 to Pred(E.ErrorCount) do

 

ErrorMsg := ErrorMsg + E.Errors[I].Message +

 

' (' + IntToStr(E.Errors[I].ErrorCode) + '). ';

 

MessageDlg(ErrorMsg, mtError, [mbOK], 0);

 

Exit;

 

end//if

 

end;

 

end{try}

 

if State = dsEdit then

 

begin

 

Result := Fields[0].AsInteger + 1;

 

Fields[0].AsInteger := Result;

 

Post;

 

end

 

else

 

{If the record could not be locked after the specified number of tries raise

an exception.}

 

raise Exception.Create('Cannot get next unique number.(dgGetUniqueNumber)');

 

end;

 

end;