Duplicidade, contador

10 respostas
J

Bom é o seguinte..

Esse eh meu codigo de Gravar do formulario
Dvd dvd = new Dvd();
					
					dvd.setIdDvd(1);
					dvd.setTitulo(txtTitulo.getText());
					dvd.setGenero(txtGenero.getText());
					dvd.setAnoLancamento(txtAnoLancamento.getText());
					dvd.setQuantidade(txtQuantidade.getText());
					dvd.setValorLocacao(txtValorLocacao.getText());
					dvd.setDataCadastro(txtDataCadastro.getText());
					dvd.setAlugado(cboAlugado.getSelectedItem().toString());
					
	                String mensagem = dvd.Salvar(dvd);
	                
				   JOptionPane.showMessageDialog(null, mensagem);
				   LimpaCampos();
aqui no codigo
dvd.setIdDvd(1);
ele informa que o IdDvd vai ser 1. quando eu fizer o primeiro cadastro ele vai gravar como 1. mais quando eu for fazer um novo cadastro ele vai gravar como 1 tbm.. mais ai vai dar erro de duplicidade

como faço pra quando eu iniciar o formulario..
ele ja busque a quantidade de registros e define o numero total de registros + 1
vai ficar tipo de um contador
contador = Total de registros da tabela + 1
ficaria assim dvd.setIdDvd(contador);

ai ele sempre iria gravar um numero acima do que ja esta gravado no Id, para nao dar duplicidade...

mais como eu faço isso ?
tem jeito mais facil que esse ?

c precisar o codigo do botao gravar ja ta ae..
e a classe ta aqui

package sistema;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import sistema.ConexaoDAO;

public class Dvd {
 
	private int idDvd;
	 
	private String titulo;
	 
	private String genero;
	 
	private String anoLancamento;
	 
	private String quantidade;
	 
	private String valorLocacao;
	 
	private String dataCadastro;
	 
	private String alugado;

	//###################################################
	
	public String getAlugado() {
		return alugado;
	}

	public void setAlugado(String alugado) {
		this.alugado = alugado;
	}

	public String getAnoLancamento() {
		return anoLancamento;
	}

	public void setAnoLancamento(String anoLancamento) {
		this.anoLancamento = anoLancamento;
	}

	public String getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(String dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public String getGenero() {
		return genero;
	}

	public void setGenero(String genero) {
		this.genero = genero;
	}

	public int getIdDvd() {
		return idDvd;
	}

	public void setIdDvd(int idDvd) {
		this.idDvd = idDvd;
	}

	public String getQuantidade() {
		return quantidade;
	}

	public void setQuantidade(String quantidade) {
		this.quantidade = quantidade;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public String getValorLocacao() {
		return valorLocacao;
	}

	public void setValorLocacao(String valorLocacao) {
		this.valorLocacao = valorLocacao;
	}
	
	//#####################################################
	
	public String Salvar(Dvd dvd) {
		String mensagem = "";
		   
	       if (dvd.getIdDvd() == 0)
		       mensagem = "";
	       else if (dvd.getTitulo().equals(""))
		            mensagem ="INSIRA UM TITULO - OBRIGATORIO";
	       
	       else if (dvd.getGenero().equals(""))
	                mensagem = "INSIRA UM GENERO - OBRIGATORIO";
	       
	       else if (dvd.getAnoLancamento().equals(""))
	                mensagem ="INSIRA UM ANO DE LANCAMENTO - OBRIGATORIO";
	       
	       else if (dvd.getQuantidade().equals(""))
	    	   		mensagem ="INSIRA UMA QUANTIDADE - OBRIGATORIO";
	       
	       else if (dvd.getValorLocacao().equals(""))
	   				mensagem ="INSIRA UM VALOR DE LOCACAO - OBRIGATORIO";
	       
	       else if (dvd.getDataCadastro().equals(""))
	   				mensagem ="INSIRA UMA DATA DE CADASTRO - OBRIGATORIO";
	       
	       else if (dvd.getAlugado().equals(""))
	   				mensagem ="INFORME SE O DVD ESTA ALUGADO - OBRIGATORIO";
	 
	       else {
		          Connection conexao =  ConexaoDAO.getconexao(); 
	              String sql = "insert into locadoradvd.dvd(iddvd, titulo, genero, anolancamento, quantidade, valorlocacao, datacadastro, alugado) "+
                      "values (?, ?, ?, ?, ?, ?, ?, ?)";
	              try {
	            	  
	        	       mensagem = "DADOS GRAVADOS COM SUCESSO !";
	        	       PreparedStatement ps = conexao.prepareStatement(sql);
	        	
	        	       ps.setInt   (1,dvd.getIdDvd());
	        	       ps.setString (2,dvd.getTitulo());
	        	       ps.setString (3,dvd.getGenero());
	        	       ps.setString(4,dvd.getAnoLancamento());
	        	       ps.setString (5,dvd.getQuantidade());
	        	       ps.setString (6,dvd.getValorLocacao());
	        	       ps.setString(7,dvd.getDataCadastro());
	        	       ps.setString (8,dvd.getAlugado());
	        	
	        	       ps.executeUpdate();
	        	       ConexaoDAO.Desconectar();
	        	       
	              }
	              catch(SQLException e){
	        	        mensagem="ERRO AO INSERIR DADOS";
	        	        e.printStackTrace();
	        
	              }
	              
	       }
		
	       return mensagem;
	}
}

Vlwss

10 Respostas

A

Você pode fazer uma consulta “SELECT MAX(*) FROM sua_tabela” antes de inserir no BD, pega o resultado e soma 1, ou cria um sequence ou defina o campo campo como autonumeração dependendo do seu BD.

thiago.correa

Sugiro criar sequence :wink:
Mais confiável

J

Deu na mesma
eu nao sei como fazer isso
pod colocar ai como ficaria ?
meu botao gravar e minha classe ja estao ai
vlw

A

Para criar um sequence no portgresql

CREATE SEQUENCE nome_sequence
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE nome_sequence OWNER TO postgres;

Para consultar o próximo valor da sequence:

select nextval('nome_sequence')

O legal de usar sequence é que o controle fica no SGBD, você só precisa fazer uma consulta no BD e ele já te retorna o valor e sequence e atualiza valor da sequence.

Uma forma mais fácil, nesse caso não precisa passar o campo código (eu acho):
CREATE TABLE sua_tabela(
codigo SERIAL
);

Qual o BD que você usa na sua aplicação?
Tem outras formas, tem que ver o banco que você usa, no mysql tem o autoincrement, você não precisa passar esse campo, é automático

J

postgre
mais no caso eu nao sei como colocar esse codigo ai

se vc puder passar algo ai, seila, que vc axa mais facil pra eu fazer aqui
vlw

A

1º Cria sua tabela
CREATE TABLE Cidade (
codigo INT NOT NULL,
uf INT NOT NULL,
nome CHAR(60) NOT NULL,
regiao INT NOT NULL
);

2º Cria sua sequence

CREATE SEQUENCE cidade_codigo MINVALUE 1 START WITH 1 INCREMENT BY 1;

3º Associa a sequence

ALTER SEQUENCE cidade_codigo OWNED BY cidade.codigo;

Antes do código que inseri o registro, tem que fazer uma consulta a sequence para pegar o próximo:

select nextval('cidade_codigo')

Seu código, acrescente:

String sql = "select nextval('cidade_codigo')";
Statement stmt = conexao.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if(rs.next()){
  //pega o valor no resultset e coloca em uma variavel.
  //objeto.setCodigo(codigo);
}

//executa o resto do código para inserir.
J

enutam, voltando ao assunto da duplicidade

eu mudei algumas coisas

minha classe cliente ta assim
package sistema;

import java.sql.Connection;
import java.sql.DriverManager;	
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Cliente {
 
	private Connection conexao =  null;
	
	private int idCliente;
	 
	private String nome;
	 
	private String endereco;
	 
	private String cidade;
	 
	private String bairro;
	 
	private String estado;
	 
	private String cep;
	 
	private String rg;
	 
	private String cpf;
	 
	private String telefone;
	 
	private String celular;
	 
	private String dataNascimento;
	 
	private String dataCadastro;
	
	private String email;
	 
	//######################################################

	public String getBairro() {
		return bairro;
	}

	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	public String getCelular() {
		return celular;
	}

	public void setCelular(String celular) {
		this.celular = celular;
	}

	public String getCep() {
		return cep;
	}

	public void setCep(String cep) {
		this.cep = cep;
	}

	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(String dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public String getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(String dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public int getIdCliente() {
		return idCliente;
	}

	public void setIdCliente(int idCliente) {
		this.idCliente = idCliente;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getRg() {
		return rg;
	}

	public void setRg(String rg) {
		this.rg = rg;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	 
	//##################################################
	
	public String Salvar(Cliente cliente) {
		String mensagem = "";
		   
	       if (cliente.getIdCliente() == 0)
		       mensagem = "";
	       else if (cliente.getNome().equals(""))
		            mensagem ="INSIRA UM NOME - OBRIGATORIO";
	       
	       else if (cliente.getEndereco().equals(""))
	                mensagem = "INSIRA UM ENDERECO - OBRIGATORIO";
	       
	       else if (cliente.getCidade().equals(""))
	                mensagem ="INSIRA UMA CIDADE - OBRIGATORIO";
	       
	       else if (cliente.getBairro().equals(""))
	    	   		mensagem ="INSIRA UM BAIRRO - OBRIGATORIO";
	       
	       else if (cliente.getEstado().equals(""))
   	   				mensagem ="INSIRA UM ESTADO - OBRIGATORIO";
	       
	       else if (cliente.getRg().equals(""))
   	   				mensagem ="INSIRA UM RG - OBRIGATORIO";
	       
	       else if (cliente.getCpf().equals(""))
	   				mensagem ="INSIRA UM CPF - OBRIGATORIO";
	       
	       else if (cliente.getTelefone().equals(""))
	   				mensagem ="INSIRA UM TELEFONE - OBRIGATORIO";
	       
	       else if (cliente.getDataNascimento().equals(""))
	   				mensagem ="INSIRA UMA DATA DE NASCIMENTO - OBRIGATORIO";
	       
	       else if (cliente.getDataCadastro().equals(""))
	   				mensagem ="INSIRA UMA DATA DE CADASTRO - OBRIGATORIO";
	 
	       else {

	              String sql = "insert into locadoradvd.cliente(idcliente, nome, endereco,cidade, bairro, estado, cep, rg, cpf, telefone, celular, datanascimento, datacadastro, email) "+
                         "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
	              
	              try {
			          
		              conexao =  ConexaoDAO.getconexao(); 
		              PreparedStatement ps = conexao.prepareStatement(sql);
		              
	        	       mensagem = "DADOS GRAVADOS COM SUCESSO !";
	        	       
	        	       System.out.println("Cliente " + (obterUltimo()+1));
	        	       
	        	       ps.setInt   (1,(obterUltimo()+1));
	        	       ps.setString (2,cliente.getNome());
	        	       ps.setString (3,cliente.getEndereco());
	        	       ps.setString(4,cliente.getCidade());
	        	       ps.setString (5,cliente.getBairro());
	        	       ps.setString (6,cliente.getEstado());
	        	       ps.setString(7,cliente.getCep());
	        	       ps.setString (8,cliente.getRg());
	        	       ps.setString (9,cliente.getCpf());
	        	       ps.setString(10,cliente.getTelefone());
	        	       ps.setString (11,cliente.getCelular());
	        	       ps.setString (12,cliente.getDataNascimento());
	        	       ps.setString (13,cliente.getDataCadastro());
	        	       ps.setString(14,cliente.getEmail());
	        	       
	        	       ps.executeUpdate();
	              }
	              catch(SQLException e){
	        	        mensagem="ERRO AO INSERIR DADOS";
	        	        e.printStackTrace();
	        
	              }
	              
	              ConexaoDAO.Desconectar();
	       }
		
	       return mensagem;
	}
	 
	public void Alterar(Cliente clienteNovo, Cliente clienteAntigo) {
		//ALTERAR DADOS
	}
	 
	public String Excluir(Cliente cliente) {
		String mensagem = "";
		
		Connection conexao =  ConexaoDAO.getconexao();
		String sql = "delete from locadoradvd.cliente where cliente.codigo = idCliente";
		
		try {
			
			mensagem = "DADOS EXCLUIDOS COM SUCESSO !";
			PreparedStatement ps = conexao.prepareStatement(sql);
			
			ps.setInt(1,cliente.getIdCliente());
			ps.executeUpdate();
			ConexaoDAO.Desconectar();
		}
		catch(SQLException e){
	        mensagem = "ERRO AO EXCLUIR DADOS";
	        e.printStackTrace();
      }
		
		return mensagem;
	}
	 
	public void Buscar(Cliente cliente) {
		//BUSCA DADOS
	}
	
	public int obterUltimo() throws SQLException{
		int codigo = 0;
		String sql = "select max(idcliente) as ultimo from locadoradvd.cliente";

		Statement stmt = conexao.createStatement();
		ResultSet rs = stmt.executeQuery(sql);
		if (rs.next()) {
			 codigo = rs.getInt("ultimo");
			 System.out.println("passei outro codigo ");
		}
		else {
			System.out.println("passei codigo zero");
			codigo = 0;
		}
		
		return codigo;
	}  
}

Olha o metodo ObterUltimo
fiz isso para nao ter mais duplicidade no banco quando gravar
mais eu gravo a primeira vez e blz.
mais quando gravo a segunda vez, ele retorna esse erro

[color=red]Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at sistema.Cliente.Salvar(Cliente.java:206)
at sistema.CadastroClientes$1.actionPerformed(CadastroClientes.java:563)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)[/color]

ai eu clico nesse item em negrito ai pra ver onde ta o erro, ele retorna essa linha aqui da classe Cliente no Metodo Salvar
PreparedStatement ps = conexao.prepareStatement(sql);
mais essa linha nao contem erros..

o que fazer ? ow o que esta errado ai ?

VLWW

A

Pelo que vi, você tem que fechar os PreparedEstatement, ResultSet, e Connection para liberar os recursos, acho que é isso. Tenta e depois fala se funcionou.

J

e como fecha isso ?
e aonde fecho ?

A

tem que ser nessa ordem e antes de fechar verifique se o objeto é diferente de null, e tem que está em um bloco de try catch.

rs.close();//ResultSet
ps.close();//PreparedStatement
con.close();//con.close();

Criado 1 de dezembro de 2008
Ultima resposta 4 de dez. de 2008
Respostas 10
Participantes 3