Codigo - como controlar codigo sequencial |
Top Previous Next |
|
{ Vamos dizer que tenha uma tabela de produtos que deseja controlar os codigos sequenciais (por exemplo: cadastro o 1, o sistema depois sugere o 2, 3 ... QUANDO o usuario elimina o produto 5 e o ultimo produto for o 100 o sistema tem que sugerir o 5 como o proximo
Veja a funcao para isto: ( depois da funcao tem um aperfeicoamento animal )
}
function ProximoCodigo(const Tabela, Alias:String; NomeCampo : String = 'codigo'; Condicao: string = ''): string; var Achou : Boolean; Q : Query; Contador: Integer; begin Q := TQuery.Create(nil); with Q do begin DatabaseName := Alias;
if Condicao <> '' then Condicao := ' where ' + Condicao;
if not Select(NomeCampo + ' from ' + Tabela + Condicao + ' order by ' + NomeCampo) then begin Result := '1'; Q.Free; Exit; end; Contador := 0; First; Achou := False; While NOT EOF do begin Inc(Contador); if GetInteger(NomeCampo) <> Contador then // Este código não existe begin Achou := True; Break; end; Next; end; if Achou then Result := IntToStr(Contador) else Result := IntToStr(Contador + 1) end; Q.Free; end;
{ Aqui surge um problema. Se a tabela for grande (+10000) pode ficar lento por causa do "While" Existe uma tecnica aqui usando uma tabela intermediaria: Grave nesta intermediaria sempre que excluir o registro o código excluido -1. Antes de pegar um codigo para um novo produto comece a sua pesquisa a partir deste codigo gravado na tabela intermediaria. Isto impedira voce de percorrer toda a tabela de cadastro.
Se o usuario excluir o codigo 101 e depois o 167, o sistema deverá verificar que na tabela temporaria tinha o 100 (valor - 1) e não vai gravar o 166. } |