Problemas para inserir valores em chave estrangeira utilizando SWING.. [RESOLVIDO]

Boa noite galera!!!
To tentando aprender aqui como inserir uma chave estrangeira numa tabela no banco de dados, mas até agora a lógica eu sei, to com dificuldades é na implementação desta lógico… é o seguinte, no banco de dados tenho duas tabelas simples, cliente e compra, onde um cliente pode fazer várias compras, nesse relacionamento a chave primária da tabela cliente vai para a tabela compras, agora eu quero aprender como inserir dentro da tabela compras o valor da chave primária da tabela cliente durante uma venda, terei um ComboBox listando os nomes dos clientes, e usuário vai descrever a venda e escolher o cliente que irá comprar no ComboBox, tenho a interface feita, estou desenvolvendo utilizando DAO por camadas, mas a maior dificuldade é na parte que vai para o Banco, ou seja a parte de Persistencia, vo postar os códigos que tenho aqui, mas nao ta dando certo, ta dando erro, e pelo jeito é erro na codificação…nos códigos estão a lógica que criei, e também vo postar o erro que está aparecendo…
ERRO DO MÉTODO DAO

at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:343) at Banco.TesteDAO.inserirCompra(TesteDAO.java:47) at Negocio.CompraNegocio.inserirCompra(CompraNegocio.java:21) at Apresentacao.Frame.bt_produtoActionPerformed(Frame.java:144) at Apre
MÉTODO QUE INSERE COMPRAS DO DAO

[code] public void inserirCompra(Compra compra ,String nomecliente) throws SQLException{

	// Abrir uma conexao
	Connection conn = Conexao.getConexao();

            String val = "Select idcliente cliente where nome = nomecliente";
	PreparedStatement stmt = conn.prepareStatement(val);
            ResultSet rs = stmt.executeQuery();
            while(rs.next()){

                   compra.setIdcliente(rs.getInt("idcliente"));
            }




	String sql = "insert into compra(produto,idcliente)" + "values(?,val)";
            PreparedStatement stmt2 = conn.prepareStatement(sql);
            stmt2.setString(1, compra.getProduto());
            stmt2.setInt(2,compra.getIdcliente());
            stmt2.execute();
            stmt2.close();

}[/code]

MÉTODO DA REGRA DE NEGÓCIO

[code]public void inserirCompra(String produto,String nomecliente) throws SQLException{
Compra compra = new Compra(produto);
TesteDAO cDAO = new TesteDAO();
cDAO.inserirCompra(compra, nomecliente);

}[/code]

BOTAO CADASTRAR PRODUTOS

[code] private void bt_produtoActionPerformed(java.awt.event.ActionEvent evt) {

          if(evt.getSource() == bt_produto){
              CompraNegocio compra = new CompraNegocio();
        try {
            compra.inserirCompra(tf_produto.getText(), (String) cbox.getSelectedItem().toString());
        } catch (SQLException ex) {
            Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
        }
          }
}[/code]

E ai galera, alguma solução???

Faltou a primeira linha do erro, que diz o nome da exception.

E ai Viny blz cara???
Vo postar ai pra você da uma Analisada!!!
Obrigado!!!

12/04/2010 15:13:13 Apresentacao.Frame bt_produtoActionPerformed SEVERE: null org.postgresql.util.PSQLException: ERROR: syntax error at or near "cliente" at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254) at Banco.TesteDAO.inserirCompra(TesteDAO.java:47) at Negocio.CompraNegocio.inserirCompra(CompraNegocio.java:21) at Apresentacao.Frame.bt_produtoActionPerformed(Frame.java:144) at Apresentacao.Frame.access$100(Frame.java:28) at Apresentacao.Frame$2.actionPerformed(Frame.java:72)

Faltou o FROM no seu SQL.

opa… vo testar aqui… :smiley:

Ai viny, fiz uma modificações no inserir do DAo aqui, mas deu o seguinte erro12/04/2010 15:31:33 Apresentacao.Frame bt_produtoActionPerformed SEVERE: null org.postgresql.util.PSQLException: ERROR: insert or update on table "compra" violates foreign key constraint "cliente_compra_fk" Detalhe: Key (idcliente)=(0) is not present in table "cliente". at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:343) at Banco.TesteDAO.inserirCompra(TesteDAO.java:61) at Negocio.CompraNegocio.inserirCompra(CompraNegocio.java:21) at Apresentacao.Frame.bt_produtoActionPerformed(Frame.java:144) at Apresentacao.Frame.access$100(Frame.java:28) at Apresentacao.Frame$2.actionPerformed(Frame.java:72)
o código inserir do DAO fico assim [code] public void inserirCompra(Compra compra ,String nomecliente) throws SQLException{

	// Abrir uma conexao
	Connection conn = Conexao.getConexao();

            String val = "Select idcliente from cliente where nome = ?";
	PreparedStatement stmt = conn.prepareStatement(val);
            stmt.setString(1, compra.getNomecliente());
            ResultSet rs = stmt.executeQuery();
            while(rs.next()){

                   compra.setIdcliente(rs.getInt("idcliente"));
            }




	String sql = "insert into compra(produto,idcliente)" + "values(?,?)";
            PreparedStatement stmt2 = conn.prepareStatement(sql);
            stmt2.setString(1, compra.getProduto());
            stmt2.setInt(2,compra.getIdcliente());
            stmt2.execute();
            stmt2.close();

}[/code]

outro detalhes, meu comboBox nao está listando corretamente os dados do Banco…
quer ki poste os códigos referentes a listagem do Combobox??? talvez pode ser isso!!

Use um depurador e veja, a partir da linha 19, se os valores passados no set estão certos. Por exemplo, getProduto() retorna mesmo o id do produto? E é mesmo uma String?

O seu erro é bem claro, ele está falando que a foreign key está sendo violada. Então, ou a compra que vc está tentando cadastrar não existe na tabela compra, ou o produto não existe na tabela de Produtos.

Viny, estou modificando o metodo de inserir do Dao aqui, ele ta com alguns erros, vo testar-lo e se der erro posto o novo codigo DAO e erro Blz???
essa é minha classe compra, deu uma ohada, e pelo jeito nao tem nada de errado!!

[code]package Negocio;

/**
*

  • @author Anderson
    */
    public class Compra {

    private int idcompra;
    private String produto;
    private String nomecliente;
    private int idcliente;

    public int getIdcliente() {
    return idcliente;
    }

    public void setIdcliente(int idcliente) {
    this.idcliente = idcliente;
    }

    public Compra(String produto){
    this.produto = produto;
    }

    public int getIdcompra() {
    return idcompra;
    }

    public void setIdcompra(int idcompra) {
    this.idcompra = idcompra;
    }

    public String getNomecliente() {
    return nomecliente;
    }

    public void setNomecliente(String nomecliente) {
    this.nomecliente = nomecliente;
    }

    public String getProduto() {
    return produto;
    }

    public void setProduto(String produto) {
    this.produto = produto;
    }

}[/code]

ai, esse é meu novo método do DAO, mas ta dando o mesmo erro :frowning:

[code] public void inserirCompra(Compra compra ,String nomecliente) throws SQLException{

	// Abrir uma conexao
	Connection conn = Conexao.getConexao();
            Cliente cliente = new Cliente(nomecliente);

            String val = "Select idcliente from cliente where nome = ?";
	PreparedStatement stmt = conn.prepareStatement(val);
            stmt.setString(1, cliente.getNome());
            ResultSet rs = stmt.executeQuery();
            while(rs.next()){

                   cliente.setIdcliente(rs.getInt("idcliente"));
                   compra.setIdcliente(cliente.getIdcliente());
            }




	String sql = "insert into compra(produto,idcliente)" + "values(?,?)";
            PreparedStatement stmt2 = conn.prepareStatement(sql);
            stmt2.setString(1, compra.getProduto());
            stmt2.setInt(2,compra.getIdcliente());
            stmt2.execute();
            stmt2.close();

}[/code]

Isso que to fazendo é só um teste pra aprender a inserir valores em chaves estrangeiras…no meu bando de dados eu só tenho 2 tabelas… cliente e compra
vo postar elas aqui…
TABELA CLIENTE

CREATE TABLE cliente ( idcliente serial NOT NULL, nome character varying(10) NOT NULL, CONSTRAINT cliente_pk PRIMARY KEY (idcliente) )
TABELA COMPRA

CREATE TABLE compra ( idcompra serial NOT NULL, produto character varying(10) NOT NULL, idcliente integer NOT NULL, CONSTRAINT compra_pk PRIMARY KEY (idcompra), CONSTRAINT cliente_compra_fk FOREIGN KEY (idcliente) REFERENCES cliente (idcliente) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION )

Tem um problema tbm, meu ComboBoz nao está preenchendo corretamente os dados do banco de daods,será que nao é isso??eu tentei aqui, mas nao conseguir faze-lo preencher corretamente…como faz?? tavez o problema é esse!!!
MÉTODO QUE PREENCHER COMBOBOX

private void preencherComboBox() throws SQLException{ CompraNegocio compra = new CompraNegocio(); List<Cliente> lista = compra.listar(); cbox.removeAllItems(); cbox.addItem(lista); }

a combo box nao vai inserir a lista inteira de uma vez…voce tem que jogar ela em um for() …faz um for normal com um contador para iterar cada item da lista, em cada “loop” voce da um .addItem(lista)

Fiz isso mas mesmo assim os dados estão aparecendo como simbolos…

A combo deve estar pegando o endereço de referência…creio que voce tera de implementar o método toString() na sua classe compra…aonde estao os getters e setters …dai axo que resolve

e ai viny, alguma solução??

:frowning:

você debugou a classe ? resolveu?

caso seja não e não, debuga e olha o que que você está inserindo nos sets que você chama no preparedStatement, ou antes da linha 20 que está pegando o sql, da system.out exibindo os parâmetros que você seta no preparedStatement, para olhar o que que você está inserindo…

quanto a parte da combo, monte um loop ali percorrendo a lista que é recebida do seu dao e dando um add na sua combo (acho que é isso, faz tempo que não mecho com swing) para cada item da lista.

Deixa eu pergunta uma coisa pra voces…minha logica para insercao em chave estrangeira esta certo???
talvez esteja errado!!