Fórum gerar um codigo sem deixar repetir o numero #325513
17/07/2006
0
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
Curtir tópico
+ 0Posts
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;
Gostei + 0
17/07/2006
Dpinho
Gostei + 0
19/07/2006
Marco Salles
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
25/07/2006
Dpinho
Gostei + 0
25/07/2006
Marco Salles
so para interagir melhor com sua necessiade . Voce diz que não deu . Não deu porque ?????
Gostei + 0
25/07/2006
Dpinho
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
25/07/2006
Marco Salles
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
25/07/2006
Dpinho
Gostei + 0
25/07/2006
Marco Salles
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
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
28/07/2006
Dpinho
Gostei + 0
28/07/2006
Marco Salles
Gostei + 0