gerar um codigo sem deixar repetir o numero
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
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
Curtidas 0
Respostas
_rodfaria_
17/07/2006
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;
GOSTEI 0
Dpinho
17/07/2006
Estou tentando testa, mas estqa retornando um erro no Config.RandomSeed, não sei como incializar
GOSTEI 0
Marco Salles
17/07/2006
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
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.
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.
GOSTEI 0
Dpinho
17/07/2006
Amigos, não deu para fazer com esta dicas acima, preciso disto com urgencia, alguem teria um rotina para me enviar
GOSTEI 0
Marco Salles
17/07/2006
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 ?????
GOSTEI 0
Dpinho
17/07/2006
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
GOSTEI 0
Marco Salles
17/07/2006
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.
GOSTEI 0
Dpinho
17/07/2006
Amigo se puder me ajudar com um exemplo seria legal, to dependendo disto para terminar um trabalho ja atrasado
GOSTEI 0
Marco Salles
17/07/2006
Primeiro é criar a base de dados
Com eu disse Xml e cds é bem simples
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
[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
Acho que é isso ai.....
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.....
GOSTEI 0
Dpinho
17/07/2006
Ficou muito bom.. Muito Obrigado amigo
GOSTEI 0
Marco Salles
17/07/2006
blz..
GOSTEI 0