Fórum gerar um codigo sem deixar repetir o numero #325513

17/07/2006

0

Amigos estou tentando gerar im codigo onde os 5 primeiros digitos ja estão definido:
1 - Grupo do produto
2 - material
3 - sexo
4 - modelo
5 - artigo
de 6 a 9 tem que ser numeros aleatorios sem poder repetir dentro do banco.
Então o codigo ficaria 12345-XXXX
Bem gostaria de uma luz de como fazer isto, ja pesquisei sobre randon, sobre numeros aleatorios e não tive uma dica.
Estava pensando em colocar alguma rotina em cima da hora ou data do sistema para gerar este codigo, mas não sei como fazer
se alguem puider me ajudar seria legal.
Obrigado


Dpinho

Dpinho

Responder

Posts

17/07/2006

_rodfaria_

  TMontaCodigo = class
    public
      constructor Create;
      destructor Destroy;
      function Codigo(n1,n2,n3,n4,n5:integer):string;
  end;

{ TMontaCodigo }

function TMontaCodigo.Codigo(n1, n2, n3, n4, n5: integer): string;
begin
  Result:=Format(´¬d¬d¬d¬d¬d-¬d¬d¬d¬d´,[n1,n2,n3,n4,n5,random(10),random(10),random(10),random(10)])
end;

constructor TMontaCodigo.Create;
begin
  RandSeed:=Config.RandomSeed;

  //onde Config é um objeto singleton ou record global contendo diversas configuracoes do seu sistema.

  //Importante ao iniciar seu sistema (OnCreate ou OnShow etc)
  //Config.RandomSeed:=ArquivoIni.ReadInteger(´Configuracoes´ ,´UltimoNumero´);
  //Config.OutraPropriedade:=...

  //E ao fechar seu sistema (OnClose etc)
  //ArquivoIni.WriteInteger(´Configuracoes,´UltimoNumero´,Config.RandomSeed);
  //ArquivoIni.WriteString(...

end;

destructor TMontaCodigo.Destroy;
begin
  Config.RandomSeed:=Config.RandomSeed+1;
end;

//Exemplo de uso
procedure TForm1.Button1Click(Sender: TObject);
var
  m:TMontaCodigo;
  i:integer;
  temp:string;
begin
  //se a geração de números for freqüente pode-se colocar a criação
  //e destruição de TMontaCodigo em outro lugar.
  m:=TMontaCodigo.Create;
  for i:=1 to 30 do begin
    temp:=temp+m.Codigo(1,2,3,4,5)+#13;
  end;
  showmessage(temp);
  m.Destroy;
end;




Responder

Gostei + 0

17/07/2006

Dpinho

Estou tentando testa, mas estqa retornando um erro no Config.RandomSeed, não sei como incializar


Responder

Gostei + 0

19/07/2006

Marco Salles

Se voce puder ou permitir trabalhar com arquivos de inicialização , tudo fica bem mais fácil , mas antes da solução final segue um algoritimo extremamente inteligente elaborado ou fornecido por um colega chamado
e_gama

function GeraCombinacoes(S: string; NumDig: Integer): TStrings;
var I, J: Integer;
       X: Char;
      TS: TStrings;
      S1: string;
begin
  Result := TStringList.Create;
  TS     := TStringList.Create;

  for I := 1 to Length(S) do Result.Add(S[I]);

  while Length(Result.Strings[0]) < NumDig do
    begin
      for I := 0 to (Result.Count - 1) do 
        begin
          S1 := ´´; 
          for J := 1 to Length(S) do 
            begin
              X := S[J];
              if Pos(X, Result.Strings[I]) = 0 then S1 := S1 + X;
            end;

          for J := 1 to Length(S1) do 
            begin
              X := S1[J]; 
              TS.Add(Result.Strings[I] + X);
            end; 
        end; 
      Result.Text := TS.Text;
      TS.Clear; 
    end; 
  TS.Free;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Text := GeraCombinacoes(´1234567890´, 4).Text;
Label1.Caption := IntToStr(Memo1.Lines.Count);
end;


de posse desde algoritimo e usando arquivos Ini ou utilizando Chaves de Registros ou algo que possa guardar o que ja foi gerado etc... não havera problema nenhum em produzir o que voce necessita.


Responder

Gostei + 0

25/07/2006

Dpinho

Amigos, não deu para fazer com esta dicas acima, preciso disto com urgencia, alguem teria um rotina para me enviar


Responder

Gostei + 0

25/07/2006

Marco Salles

Amigos, não deu para fazer com esta dicas acima,


so para interagir melhor com sua necessiade . Voce diz que não deu . Não deu porque ?????


Responder

Gostei + 0

25/07/2006

Dpinho

so para interagir melhor com sua necessiade . Voce diz que não deu . Não deu porque ?????


talves não esteja conseguindo gravar no banco os numero e recuperar depois, mas sempre gera o mesmo numero 0082. se fosse o caso de gerar os numeros de um unica vez ficaria legal, mas tenho que fazer sempre que vou cadastrar um novo item. preciso gerar um numero de 4 posições para diferenciar o codigo e não pode ser seguencial


Responder

Gostei + 0

25/07/2006

Marco Salles

talves não esteja conseguindo gravar no banco os numero e recuperar depois, mas sempre gera o mesmo numero 0082.


sinceramente , eu trabalharia com Cds usando Xml

So gravaria uma unica vez e na medida que fosse lendo eu iria apagar esta sequencia da minha base de dados

Para gerar em Xml é fácil, para ler , gravar e deletar tb

se interresar por este método posso faze-lo aqui.


Responder

Gostei + 0

25/07/2006

Dpinho

Amigo se puder me ajudar com um exemplo seria legal, to dependendo disto para terminar um trabalho ja atrasado


Responder

Gostei + 0

25/07/2006

Marco Salles

Primeiro é criar a base de dados

Com eu disse Xml e cds é bem simples

Crie um campo no Cds -->> Fields Editor Sequencia do tipo String Tamanho 4 Crie a base de Dados -->> Create DataBase De um Nome para a base de dados -->> Save To My Base Xml Table


as quatro sequencias anteriores se consegume dando duplo click No Cds

Por fim na Opção FileName do Cds Escolha o Nome da Base de dados

Vamos ao qe interresa

procedure TForm1.FormShow(Sender: TObject);
var
Lista:TstringList;
J:integer;
begin
if cdsNumeros.RecordCount = 0 Then
  begin
    Lista:=TstringList.Create;
    Lista.Text:=GeraCombinacoes(´1234567890´, 4).Text;
    j:=0;
    while J <=Lista.Count-1 do
      begin
        cdsNumeros.Append;
        cdsNumerosSequencia.AsString:=(Lista.Strings[J]);
        cdsNumeros.Post;
        j:=J+1;
      end;
    Lista.Free;
  end;
end;


[b:9ec46652f0]A Etapa acima tem com eliminar do projeto[/b:9ec46652f0].. Para isto deve-se gerar a base de dados e depois usar um Cds para carregar . Bem mais isto é outro assunto


Na hora de carregar , faça mais ou menos isto

procedure TForm1.Button1Click(Sender: TObject);
var
i,indice:integer;
begin
Randomize;
i:=CdsNumeros.RecordCount;
indice:=Random(i);
cdsNumeros.RecNo:=indice;
Label1.Caption:=cdsNumerosSequencia.AsString;//*******
cdsNumeros.Delete;
end;


Acho que é isso ai.....


Responder

Gostei + 0

28/07/2006

Dpinho

Ficou muito bom.. Muito Obrigado amigo


Responder

Gostei + 0

28/07/2006

Marco Salles

blz..


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar