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.

}