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;
*/
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a