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

Responder a