Como gerar um código automático em uma aplicação Desktop

23 respostas
Jackye

Olá!

Estou criando um sistema desktop em java, estou utilizando Netbeans 7.0 e Banco de dados SQL Server 2008.
Criei uma tela onde mostra os campos de cadastro de usuário, e gostaria de saber como faço para que seja
gerado um código aleatório, além do mais quero criar uma matrícula para cada usuário do tipo:
Ano Corrente+4 dígitos aleatórios, por exemplo, 20110896. Como faço isso?

:smiley:

23 Respostas

renamed

http://www.guj.com.br/articles/17

Isso? :lol:

Jackye

renamed,

Pelo que vi no artigo o Randon só gera número únicos, isto é, 1 ou 2 ou 45, etc.
Mas usando dessa maneira a seguir gera um conjunto de números (Como no exemplo anterior[20110896])?

long l = random.nextLong();
int i = random.nextInt();

Até.

renamed

É só você montar uma lógica para que a classe gere números de 4 dígitos, ne?

Ou seja, ela deveria gerar de 1000 até 9999

Jackye

Tá ok.
:slight_smile:

Jackye

Poderiam me dar um exemplo de como construir a função para gerar o código automático?
tenho a seguinte tela de cadastro e quero que a matrícula seja automática,
então acho que preciso criar uma função dentro da componente Jtextfield.
O código deve pegar o ano corrente + quatro números aleatorios (ex.: 20110879)

Jackye

O ID deve ser único no Banco de dados, então devo usar o quê?
o UUID? Como faço isso?

lucas_viecelli

Veja para usar uma sequencia criada no banco de dados, assim você pode apenas capturar ela pelo seu sistema !

Lucas_Abbatepaolo

Se este numero sera a pk da sua tabela vc tera que realizar algumas verificações. Se vc quer criar o numero manualmente, como vc falou, sendo montado com os 4 primeiros digitos com o ano e mais 4 digitos sorteados, vc tera que verificar se o numero sorteado não existe na tabela (ja é uma pk existente) antes de utiliza-lo. Se ele ja existir vc tera q sortear outro ate q ele não exista mais na tabela.

Provavelmente sua aplicação é algo q vc esta desenvolvendo para aprender a linguagem enãto sem problema, porem se fosse uma aplicação real, vc teria que repensar isso, pois vc poderia ter problemas de desempenho por ter q realizar varias consultas ao banco para gerar um id de uma tabela.

Crie um metodo q sorte a combinação de 4 numeros e concatene isto com os 4 digitos do ano. Posterirmente verifique se este id ja existe na tabela, realizando um select por exemplo e verificando se a senteça retornou valor. Se ele existir realize todo o procedimento de geração de numerio e consulta ate q a sua senteca retorne vazia.

samirrolemberg

use a API commons-math-2.2

lá tem vários métodos para gerar numeros e strings aleatórias muito mais precisas que os métodos encontrados na API padrão do java.

Jackye

Eu tô usando hibernate, isso ajuda um pouco?
E como faço para gerar o código automatico no banco de dados (uso o SQL Server 2008) ?
O código deve ser gerado no momento da criação das tabelas do BD?

Mais detalhes da aplicação:
Se trata de um sistema de controle bibliotecário.
Para o desenvolvimento estou utilizando netbeans 7.0, hibernate e SQL Server 2008.

Até mais.
:slight_smile:

samirrolemberg
System.out.println(new RandomDataImpl().nextSecureInt(1, 50));
System.out.println(new RandomDataImpl().nextSecureHexString(20));
System.out.println(new RandomDataImpl().nextSecureLong(1, 50000000));

usando o Commons Math você tem a disposição no minimo esses 3 métodos básicos.

os parametros são usados para definir um valor entre, e ou um valor máximo gerado.

E não sabemos o que vc quer com código automatico.

mas geralmente vc gera isso no java e joga o valor gerado/criado num insert para a sua tabela.

a saída no meu caso/codigo foi:

8
6bf75c1b34692fc493cb
15568420

No seu caso com ovc quer numeros aleatorios de 4 digitos eu recomendo isto:

System.out.println(new RandomDataImpl().nextSecureInt(1000, 9999));

Que vai gerar números entre 1000 e 9999.

Mas te pergunto se ao ives de aleatorios eles não deveriam ser sequenciais. já que no segundo caso te evita de ficar testando se a matricula já existe no banco.

Matricula = Ano+Total de Matriculados+1

e

Já no caso da data:

public static String getAno(){
		Date data = new Date();
		return ""+(data.getYear()+1900);
	}

isso retorna uma String de uma Data atual (mas apenas o ano)

Está usando o Date que está em desuso. mas funciona.

o resto é com vc! =)

Jackye

samirrolemberg,

na aplicação fica mais fácil gerar um código automático, para facilitar no cadastro de usuários, obras e etc, ou seja,
não ter que ficar analisando se o código já existe.
Vou tentar os códigos que mostrou aí.

Até mais. [Com mais dúvidas, rsrsrsrsrs)] :lol:
:slight_smile:

samirrolemberg

foi isso que eu disse.

se vc gera um número aleatório VC TEM QUE verificar a existencia dele no banco antes.
já que pode ocorrer de vc cadastrar um 20119876 e depois tentar cadastrar um 20119876 novamente (por conta dos 4 ultimos numeros serem gerados aleatoriamente)

faça progressivo.

conte o numero de matriculados em uma determinada data no banco e depois some mais 1 ao resultado. como eu falei no post anterior.

D

Se você pretende que sua aplicação gerencie e incremente as matriculas.

Crie uma tabela de contadores, com o nome da tabela e o campo da ultima_matricula com o valor inicial da matricula, e demais campos você acreditar que sejam necessários.

Quando seu programa criar um novo registro, ele faz o seguinte:

Seleciona a informação ultima_matricula da tabela de contadores e incrementa essa informação no banco na tabela contadores. (Isso vai impedir que ao tentar inserir dois registros ao mesmo tempo eles tenham o mesmo número)

Insere a informação ultima_matricula + 1 no campo matricula do seu formulário (Classe de Cadastro)

Ao terminar o cadastro iserir normalmente os registros em sua tabela de cadastro com o numero de matricula correto sem risco de ter o mesmo número.

Jackye

Oi,
Se eu usar o seguinte comando no banco de dados [SQL Server 2008]:
CREATE TABLE tbUsuario (idUsuario INT IDENTITY(1,1), nome VARCHAR(50))
No campo de auto_incremento 1,1 como posso capturar o ano corrente e gerar os outros digitos?

:slight_smile:

D

Tenta usar o seguinte então:

CREATE TABLE tbUsuario (idUsuario INT IDENTITY(10000000,1), nome VARCHAR(50))

10000000 valor a ser utilizado para o primeiro valor inserido na coluna.
1 valor a ser incrementado a cada nova inserção de registros.

Como é um campo auto increment ele mesmo se encarrega de gerar os próximos valores de matricula.

Jackye

Para testar os códigos antes de criar a aplicação real utilizei o seguinte exemplo:
#Para criar a tabela usuario:

create TABLE Usuario (
idUsuario INT IDENTITY(10000000,1) not null,
nomeusuario VARCHAR(50) not null,
datacadastro datetime not null)

Quando executo dá o seguinte erro:

[color=red]Msg 544, Level 16, State 1, Line 1
Cannot insert explicit value for identity column in table ‘tbUsuario’ when IDENTITY_INSERT is set to OFF.[/color]

Pelo que entendi, deve configurar na tabela na propriedade do campo a ativação para que ela receba o parâmetro. É isso mesmo? :smiley:

Jackye

Quando fiz INSERT na tabela dessa forma:

[color=blue]insert into Usuario (nomeusuario,datacadastro)
values (‘Maria José’,GETDATE())
[/color]
e deu certo.
o resultado foi [Veja imagem]:

Jackye

Como faço para gerar um código automático usando Java?

Jackye

Olá!

Estou com dúvidas de como iniciar o código para gerar uma matricula automática em um formulário.
Utilizando as respostas acima como criar um código para um evento no campo de texto do formulário?

:slight_smile:
Desde já agradeço!

B

Tenta assim

Connection con;
Statement stmt;
ResultSet rs;
try {
	con.stmt.executeQuery("SELECT max(cod_atualizacao) AS codigo FROM atualizacoes");
	if (rs.next()) {
		seuTextField.setText(String.valueOf(Integer.parseInt(rs.getString("codigo"))+1));
	} else
		seuTextField.setText("1");
        } catch (SQLException erro) {
		throw new RuntimeException(erro);
	}

Se eu puder te ajudar, tamos aí, afinal também sou Clementino e estou aqui pra ajudar uma Clementino… rsrs

H

Olá,

Reescrevendo meu post, não tinha lido a segunda página, rs…

Pode ser uma má prática de quem usa GeneXus… Mas eu prefiro pegar os valores e calcular na mão do que utilizar esse recurso do SQL, nesse caso em específico, em que temos 2 partes no código (Ano + Sequencial)…

Esse último sequencial utilizado poderia ser gravado em uma tabela separada como já disseram acima… Ou ainda, se o campo for numérico, daria para retornar o valor do ultimo código inserido com um select e depois trabalhado com ele… (select max(id) from tabela, ou select top 1 id from tabela order by id desc)

Só terias que fazer as validações (não sei o que acontece quando o sequencial chega em 9999, por exemplo… criaria um código concatenando 2011 + 10000? Acredito que o SQL criaria automaticamente um 20120000 neste caso, o que seria incorreto. Há esta possibilidade?).

Acredito que seria assim que eu faria… =P

Valeu!

Jackye

Muitíssimo obrigada, bllade_2!! :wink:
Vou testar o código.

Obrigada pela disposição! :smiley:

Ps.: Que legal encontrar um Clementino! Rsrsrsrsrsrsrsrsrsrsrsrsrs…
:thumbup:

Criado 14 de novembro de 2011
Ultima resposta 27 de dez. de 2011
Respostas 23
Participantes 8