On 08/05/2015 16:33, Matheus Saraiva wrote:
On 08/05/2015 16:06, Matheus de Oliveira wrote:
2015-05-08 16:00 GMT-03:00 Matheus Saraiva <[email protected]
<mailto:[email protected]>>:
UPDATE "VendasItens"
SET produto_vendasitens = produto.produto_vendasitens,
quantidade_vendasitens = produto.quantidade_vendasitens
FROM unnest(f_produtos) AS produto
WHERE venda_vendasitens = f_idvenda;
Foi dessa forma que fiz a segunda tentativa, só que existe um
pequeno porém. /*produto_vendasitens */e /*venda_vendasitens*/
formam a chave primária dessa tabela. Sendo assim a combinação
entre eles não pode se repetir.
Com o UPDATE dessa forma ele pegará o primeiro item do vetor e
colocará em em todos os lugares onde a cláusula WHERE for
satisfeita, depois fará a mesmo coisa com o segundo item do
vetor, com o terceiro, quarto, e assim até o ultimo. Mesmo que
não existisse restrições de chave o resultado não seria o desejado.
Se tivesse um vetor com ['(2,20)', '(5,6)', '(9,1)',
'(20,4)']::integer[] e o valor de f_idvenda fosse = 30. O
resultado final seria:
id_venda | produto_venda | quantidade_venda
30 | 20 | 4
30 | 20 | 4
30 | 20 | 4
30 | 20 | 4
30 | 20 | 4
Na forma correta o UPDATE deve ser feito apenas uma vez para cada
elemento do vetor.
Me parece que você está confundindo conceitos bem simples. É um
problema na sua lógica, se quiser filtrar pela chave primária
composta, então utilize tanto "venda_vendasitens" quanto
"produto_vendasitens" na cláusula WHERE, e não no SET. Não é isso que
você queria?
Eu já estava escrevendo uma réplica sobre isso.
A cláusula WHERE precisaria conter também o numero do produto, só
assim ele saberia exatamente onde deve alterar.
Algo como:
/*WHERE venda_vendasitens = f_idvenda AND produto_venda = <número do
produto no vetor>;*/
Apenas corrigindo a tabela acima. A tabela atualizada é VENDASITENS
que guarda os itens de uma venda.:
venda_vendasitens | produto_vendasitens | quantidade_vendasitens
30 | 20 | 4
30 | 20 | 4
30 | 20 | 4
30 | 20 | 4
O resultado que eu quero é o seguinte. Se eu tiver uma tabela assim:
venda_vendasitens | produto_vendasitens | quantidade_vendasitens
30 | 10 | 8
30 | 100 | 4
30 | 20 | 1
30 | 8 | 3
Ao passar um vetor ['(2,20)', '(5,6)', '(9,1)', '(20,4)']::integer[]
ele deve alterar os itens da venda 30 (f_idvenda = 30) e deixa-los:
venda_vendasitens | produto_vendasitens | quantidade_vendasitens
30 | 2 | 20
30 | 5 | 6
30 | 9 | 1
30 | 20 | 4
A logica que pensei foi essa:
/*UPDATE
"VendasItens"
SET
produto_vendasitens = produto.produto_tipovendasitens,
quantidade_vendasitens = produto.quantidade_tipovendasitens
FROM
unnest(f_produtos) AS produto
WHERE
venda_vendasitens = f_idvenda AND produto_vendasitens =
produto.produto_tipovendasitens;
*/
Ainda errado,
Eu precisaria saber quais os produtos que compõe a venda que eu quero
alterar, antes da alteração. Essa query está errada pois está procurando
por combinação de produto + venda que não existe.
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral