On 11/05/2015 08:20, Matheus de Oliveira wrote:
2015-05-08 17:53 GMT-03:00 Matheus Saraiva <[email protected]
<mailto:[email protected]>>:
On 08/05/2015 17:21, Matheus Saraiva wrote:
On 08/05/2015 17:05, Matheus de Oliveira wrote:
2015-05-08 16:51 GMT-03:00 Matheus Saraiva
<[email protected] <mailto:[email protected]>>:
/*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.
Qual atributo referencia a venda? Pela lógica do comando me
parece ser "venda_vendasitens" (por estar comparando com
"f_idvenda"), mas o nome do atributo me parece estranho.
Sim, venda_vendasitens referencia a venda, produto_vendasitens
referencia uma tabela de produtos. f_venda é o parâmetro passado
para a função
Acho que talvez ei teria que passar para a função dois vetores,
um contendo os ids dos produtos atuais e outro contendo os ids
dos novos produtos.
Tentei passar dois vetores:
/* UPDATE*//*
*//* "VendasItens"*//*
*//* SET*//*
*//* produto_vendasitens =
newproduto.produto_tipovendasitens, quantidade_vendasitens =
newproduto.quantidade_tipovendasitens*//*
*//* FROM*//*
*//* unnest(f_newprodutos) AS newproduto*//*,
unnest(f_produtos)*//*AS produto*//*
*//* WHERE*//*
*//* venda_vendasitens = f_idvenda AND produto_vendasitens
= produto.produto_tipovendasitens;*/
Mas também não funcionou, os vetores não são percorridos
simultaneamente. Na verdade os dois unnest fazem um cartesiano:
Não sei dizer o que são os vetores, já que não informou. Mas pelo que
entendi estes possuem exatamente o mesmo tamanho sendo que
f_newprodutos representa novos valores para a mesma posição de
f_produto (valor antigo). Sendo assim, na versão 9.4 você pode fazer a
chamada do unnest passando os dois vetores:
FROM unnest(f_newprodutos, f_produtos) AS p(newproduto, oldproduto)
Com isso você referência as colunas como p.newproduto e p.oldproduto
(e.g. p.newproduto.quantidade_tipovendasitens,
p.oldproduto.produto_tipovendasitens, etc.).
Em versões anteriores você pode fazer da seguinte forma:
FROM (SELECT unnest(f_newprodutos) AS newproduto,
unnest(f_produtos) AS oldproduto) AS p
A referência é como na anterior.
Mas cuidado, você deve ter certeza que o número de elementos desses
vetores são idênticos, caso contrário terás surpresas indesejáveis.
Atenciosamente,
--
Matheus de Oliveira
Umm, entendi... Porém acho que a solução ainda é DELETAR os itens
antigos para só depois inserir os novos. Pois como você disse, essa
solução só dará certo se ambos os vetores tiverem o mesmo tamanho. Mas
isso nem sempre acontecerá. Ao alterar os itens da venda pode-se optar
por colocar mais ou menos itens do que havia anteriormente, nesses casos
os vetores não teriam o mesmo tamanho.
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral