Inserir 2 registros diferentes para um mesmo 'codigo'

20 respostas
javamysql
V

Bom dia, tenho uma duvida…

Como faço para inserir dois registros diferentes para um mesmo codigo ?

Ex:

Estou realizando uma venda, nessa venda eu incluo dois produtos diferentes para ser concretizada…

Ou seja, quero inserir esses dois produtos diferentes para um “codigo_venda”, pra qndo eu fazer um select para aquele determinado “codigo_venda”, eu ver que tem dois produtos vendidos naquela venda…

O problema que estou enfrentando é nada mais que o “codigo_venda” duplicado, até pqe ele é minha chave primaria.

Agradeço se alguém puder me ajudar.

20 Respostas

R

Você pode fazer da seguinte forma:

Criar uma tabela venda, uma tabela produtos e uma tabela vendas_produtos

Onde o relacionamento seria:
venda 1:n vendas_produtos n:1 produtos
(Ela funcionária como a ligação entre produto e venda, dessa forma você conseguiria manter sua chave primária na tabela venda e referenciar vários produtos na suas vendas.

V

Mas o que eu teria na tabela ‘venda’ e na tabela ‘vendas_produtos’ ?

R

Você que tem que dizer, haha

O que atualmente tem na sua tabela venda?

Na tabela vendas_produtos
Teria: código_vendas_produtos, codigo_venda e codigo_produto
Ela só serve para fazer a ligação entre as duas tabelas.

V

Hahaha… Tipo, eu só tenho uma tabela, que se chama ‘venda’.

Nessa tabela eu tenho (cod_venda, cod_produto, data_venda, quant, valor_unitario).

Ai, o que eu teria que ter na tabela ‘vendas_produtos’?

Desculpa a demora ai pra responder…

R

Esse cod_produto não referencia nada?

Umas das possibilidades seria a seguinte:

Tabela Vendas: cod_venda, data_venda, responsável etc.

Tabela Produto: cod_produto, nome produto, valor_unitario etc.

Tabela Venda_Produto: codigo, cod_venda (chave estrangeira da Tabela Venda), cod_produto (chave estrangeira da Tabela Produto), quantidade etc.

Entendeu?

V

cod_produto é referencia da minha tabela produto.

Não posso deixar tudo em uma tabela só !?

Tipo, colocar codigo de primary key ?

Venda(codPK, cod_venda, cod_produtoFK, data_venda, quant, valor_total)

Porque essa tabela, é a tabela onde ficará minhas vendas realizadas.

Ali em cima eu escrevi errado, no lugar de valor_unitario é valor_total.

V
CREATE TABLE Venda (
    cod_venda int (6) not null, 
    data_venda date not null,
    responsavel varchar (60) default null,
    primary key (cod_venda)
    
    );   
    
    CREATE TABLE Vendas_Produto (
    cod_venda_produto int (6) not null, 
    cod_vendaFK int (6) not null,
    cod_produtoFK int (6) not null,
    quantidade int(6) not null,
    valor_total double not null,
    primary key (cod_venda_produto), 
    
    constraint cod_vendaFK FOREIGN KEY (cod_vendaFK) REFERENCES Venda (cod_venda),
    constraint cod_produtoFK FOREIGN KEY (cod_produtoFK) REFERENCES Produto (id_produto)
    );

Assim né !? Mas na hora de fazer a inclusão da venda, eu incluo na tabela Vendas_Produto !?

V

E as chaves dessas tabelas são tudo auto_increment… Esqueci de colocar ali.

V

Brother, eu ainda não consegui resolver meu problema…

Aqui estão minhas tabelas:

CREATE TABLE Venda (
    cod_venda int (6) auto_increment not null, 
    responsavel varchar (60) default null,
    data_venda date default null,
    primary key (cod_venda)
    
    );   
    
    CREATE TABLE Vendas_Produto (
    cod_vendaFK int (6) auto_increment not null,
    cod_produtoFK int (6) not null,
    quantidade int(6) not null,
    valor_total double not null,
    primary key (cod_produtoFK),
    
    constraint cod_vendaFK FOREIGN KEY (cod_vendaFK) REFERENCES Venda (cod_venda),
    constraint cod_produtoFK FOREIGN KEY (cod_produtoFK) REFERENCES Produto (id_produto)
    );

Ja entendi o que deve ser feito, porém, na hora da inserção, como vai ser !?

Tipo, como será inserido na tabela ‘vendas_produto’, sendo que o ‘cod_venda’ da tabela ‘venda’ não foi inserido !?

Desculpa minha ignorância em não saber.

T

Se você precisa permitir produtos duplicados em vendas diferentes, não faz muito sentido o código do produto ser a chave primária da tabela Vendas_Produto. Você precisa de um campo único para ser a chave dessa tabela, ou usar uma chave composta (cod_venda e cod_produto).

Algo mais ou menos assim (omiti os demais campos pra simplificar):

create table Produto(
  cod_produto int auto_increment not null,
  primary key(cod_produto)
);

create table Venda(
  cod_venda int auto_increment not null,
  primary key(cod_venda)
);

Com campo único:

create table Vendas_Produto(
  cod_vendas_produto  int auto_increment not null,
  cod_vendaFK int not null,
  cod_produtoFK int not null,
  primary key (cod_vendas_produto)
);

Com chave composta:

create table Vendas_Produto(
  cod_vendaFK int not null,
  cod_produtoFK int not null,
  primary key (cod_vendaFK, cod_produtoFK)
);

Edit: quando for salvar, você insere primeiro a venda e depois vendas_produto. A transação já deve cuidar de validar se existe a venda correspondente.

Abraço.

V

Coloquei o cod_produto como PK, pqe eu até tentei colocar o ‘cod_vendaFK’, mais ai da duplicatas. Não é possivel inserir varios produtos em um mesmo ‘cod_vendaFK’.

T

Isso porque o nem o cod_venda nem o cod_produto podem ser a chave primária da tabela Vendas_Produtos. Você precisa de uma chave única pra essa tabela, ou uma chave composta, como citei acima.

Abraço.

V

Mas como vou fazer um insert primeiro em ‘vendas’ e depois ‘vendas_produto’ ? Terei que fazer um innerjoin antes de fazer o insert !?

V

Entendi perfeitamente.

V

Mas como vou fazer um insert primeiro em ‘vendas’ e depois em ‘vendas_produto’ ? Terei que fazer um innerjoin antes de fazer o insert !?

T

Não, por que você precisaria de um inner join?

Quando você fizer o insert em vendas, já deve obter o código da venda que foi incluído. Você usa esse código pra preencher o campo cod_vendaFK da tabela vendas_produto quando for inserir nela.

Abraço.

V

Só me explica uma ultima coisa fazendo favor.

Eu quero fazer um insert desse tipo: “INSERT INTO VENDAS_PRODUTO (COD_PRODUTOFK, DATA_VENDA, QUANTIDADE, VALOR_UNITARIO)” +
" VALUES(?,?,?,?)";

Porque eu não vou inserir o id_venda ou id_vendaFK manualmente…

Ou seja, no meu sistema, vai ter o nome do produto e a quantidade pra eu incluir em uma tabela antes de finalizar a venda.

Nessa tabela, se eu quiser incluir vários produtos pra venda, eu vou poder.
Ai quando eu finalizar, chama o insert acima…

O problema é que eu não estou entendendo o porque de eu ter que ter um codigo pra venda primeiro pra depois eu conseguir chamar esse insert.

E se eu tiver que colocar um código na tabela venda, ele vai ta como auto incremento já, mas ai, na hora do insert eu nao deveria é colocar o cod_venda da tabela venda ao inves do cod_vendaFK da tabela vendas_produto !? e pra isso eu não precisaria de um insert !?

Eu to com uma leve impressão que eu to fazendo tempestade em copo d’agua, to é complicando o negócio… Porque vocês falando parece tão simples e eu to sofrendo. kkkk

Desde já obrigado. kkk

T

Você parece estar complicando um pouco demais a coisa mesmo.

Primeira coisa que você precisa definir é qual estrutura de tabelas vai usar na tabela Vendas_Produto:

  • vai usar chave primária composta (cod_produtoFK + cod_vendaFK) ou;
  • vai usar uma chave única (Cod_vendas_produto), tendo o código do produto e o código da venda somente como chaves estrangeiras

Em segundo lugar, a inclusão da venda (tabela Vendas) e dos itens da venda (tabela Vendas_Produto) são dois inserts diferentes. Acho que você está tentando fazer tudo num insert só, por isso a confusão.

O que você faz é o seguinte:

  • insere a venda na tabela Vendas;
  • pega o código da venda inserida na tabela Vendas;
  • insere na tabela Vendas_Produto usando o código da venda que você já inseriu.

No código, ficaria algo mais ou menos assim:

String sql = "insert into vendas (data_venda, cod_responsavel) values (?, ?);"
PreparedStatement stmt = conexaoDB.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
// aqui você passa os parâmetros pro preparedstatement
/// ........
 // executa o insert
stmt.executeUpdate();

// o trecho abaixo recupera o código do último registro inserido, no caso a venda
ResultSet rs = stmt.getGeneratedKeys();
if(rs.next()){
  int codigo_da_venda_inserida = rs.getInt(1);
}

// com o código em mãos, você pode fazer o insert na tabela vendas_produto
// para esse exemplo estou considerando que ela tem chave única
sql = "insert into vendas_produto (cod_vendaFK, cod_produtoFK, quantidade, valor_total) values (?, ?, ?, ?)";

PreparedStatement stmt_vendas_produto = conexaoDB.prepareStatement(sql);
// aqui você passa os parâmetros para o preparedstatement, inclusive o código da venda
stmt_vendas_produto.setInt(1, codigo_da_venda_inserida); 
/// preencha os outros parametros
 // executa o insert
stmt_vendas_produto.executeUpdate();

Note que o código está simplificado, você precisa adequar aos objetos e banco de dados que estiver usando.

Abraço.

V

Opaa, ajudou demais, agradeço muuito. Sai daquela mesmice lá, mas agora estou com outro erro…

Tipo, vou simplificar o outro erro quando clico em “Registrar Venda”:

  1. Quando adiciono dois produtos diferentes em minha lista, só grava o ultimo da lista, só que abre dois codigos na tabela “venda”.

Ex:
Coca cola ---- 2 qntd ---- vlr 10.00
Fanta ---------- 2 qntd ---- vlr 10.00

No caso, grava dois registros com códigos diferentes na tabela “venda” conforme o primeiro insert, penso eu que seja:

1 pra Coca cola
2 pra Fanta

Ai na hora de fazer o segundo insert que é na tabela ‘vendas_produto’ da esse erro: Cannot add or update a child row: a foreign key constraint fails (sistemavendas.vendas_produto, CONSTRAINT cod_vendaFK FOREIGN KEY (cod_vendaFK) REFERENCES venda (cod_venda))

O que eu prestei atenção, foi que o primeiro insert insere um registro na tabela ‘venda’, mas nao insere o produto na tabela ‘vendas_produto’, ja o segundo insert insere na tabela ‘venda’ e na ‘vendas_produto’, ficando assim:

TABELA VENDA

cod_venda ------------ data_venda
----- 1----------------------2018/05/15
----- 2----------------------2018/05/15

TABELA VENDAS_PRODUTO

cod_vendaFK---------------------- cod_produtoFK ----------------------- qntd
------- 2--------------------------------------158----------------------------------- 2

Sabe mais ou menos me dizer o que pode estar acontecendo !?

Abraços

V

Pô, consegui aqui, valew brother.
Tava causando o erro e nem vi…

Na hora de cadastrar até ia, porém eu deixei os registros selecionados da própria interface.

Graças ao Debug consegui, e graças a você com esse exemplo mastigado, foi sucesso.

Obrigado ai, e aos que tentaram ajudar de certa forma também.

Criado 25 de abril de 2018
Ultima resposta 15 de mai. de 2018
Respostas 20
Participantes 3