locked
Soma e consulta retornando nulo? RRS feed

  • Pergunta

  • Tenho a Seguinte consulta, quando o bloco A retorna 0 ou nulo e soma ao bloco B o campo FAT_VALOR é nulo mesmo o bloco B tendo um valor diferente de zero, o inverso é verdadeiro, o campo FAT_VALOR só é diferente de nulo quando ambos os blocos A e B retornam valores diferentes de 0 ou nulo, gostaria de retornar um valor para a soma pois eu sei que é improvável os dois blocos retornarem zero, sendo assim deve ser retornado um valor seja ele o a soma dos dois blocos ou apenas um bloco.

     

    SELECT FAT_ID,

           (SELECT CLI_RAZAO FROM CLIENTE WHERE CLI_ID=FATURA.CLI_ID) AS FAT_SACADO,

           FAT_EMISSAO,

           FAT_VENCIMENTO,

           FAT_INICIO,

           FAT_FIM,

           FAT_BOLETO_GERADO,

           (SELECT SUM(CON_FRETE_PESO+CON_FRETE_VALOR+CON_SEC_CAT+CON_DESPACHO+CON_PEDAGIO+CON_ADEME_ITR_OUTROS)

           FROM CONHECIMENTO

           WHERE (CON_ATIVO=TRUE) AND

                 (CON_CANCELADO=FALSE) AND

                 (CON_EMISSAO BETWEEN FATURA.FAT_INICIO AND FATURA.FAT_FIM) AND

                 ((CON_PAGO="R" AND CON_REMETENTE_ID=FATURA.CLI_ID) OR

                  (CON_PAGO="C" AND CON_CONSIGNATARIO_ID=FATURA.CLI_ID) OR

                  (CON_A_PAGAR="D" AND CON_DESTINATARIO_ID=FATURA.CLI_ID) OR

                  (CON_A_PAGAR="E" AND CON_LOCAL_DE_ENTREGA_ID=FATURA.CLI_ID)))+

           (SELECT SUM(CON_FRETE_PESO+CON_FRETE_VALOR+CON_SEC_CAT+CON_DESPACHO+CON_PEDAGIO+CON_ADEME_ITR_OUTROS)

           FROM CONHECIMENTO_FILIAL

           WHERE (CON_ATIVO=TRUE) AND

                 (CON_CANCELADO=FALSE) AND

                 (CON_EMISSAO BETWEEN FATURA.FAT_INICIO AND FATURA.FAT_FIM) AND

                 ((CON_PAGO="R" AND CON_REMETENTE_ID=FATURA.CLI_ID) OR

                  (CON_PAGO="C" AND CON_CONSIGNATARIO_ID=FATURA.CLI_ID) OR

                  (CON_A_PAGAR="D" AND CON_DESTINATARIO_ID=FATURA.CLI_ID) OR

                  (CON_A_PAGAR="E" AND CON_LOCAL_DE_ENTREGA_ID=FATURA.CLI_ID))) AS FAT_VALOR

    FROM FATURA

    ORDER BY FAT_ID;

     

    Se alguém puder me ajudar, me explicar o motivo de isso acontecer ou mesmo me indicar uma função que transforme um resultado nulo em 0 já me ajudaria muito, obrigado.

     

     

     

     

    quinta-feira, 1 de junho de 2006 13:07

Respostas

  • Pessoal consegui resolver após algumas pesquisas nas funções do Access, eis a resolução do problema:

     

    SELECT FAT_ID,

           (SELECT CLI_RAZAO FROM CLIENTE WHERE CLI_ID=FATURA.CLI_ID) AS FAT_SACADO,

           FAT_EMISSAO,

           FAT_VENCIMENTO,

           FAT_INICIO,

           FAT_FIM,

           FAT_BOLETO_GERADO,

           (SELECT IIF(IsNull(SUM(CON_FRETE_PESO+CON_FRETE_VALOR+CON_SEC_CAT+CON_DESPACHO+CON_PEDAGIO+CON_ADEME_ITR_OUTROS)),0,SUM(CON_FRETE_PESO+CON_FRETE_VALOR+CON_SEC_CAT+CON_DESPACHO+CON_PEDAGIO+CON_ADEME_ITR_OUTROS)) AS SOMA1

           FROM CONHECIMENTO

           WHERE (CON_ATIVO=TRUE) AND

                 (CON_CANCELADO=FALSE) AND

                 (CON_EMISSAO BETWEEN FATURA.FAT_INICIO AND FATURA.FAT_FIM) AND

                 ((CON_PAGO="R" AND CON_REMETENTE_ID=FATURA.CLI_ID) OR

                  (CON_PAGO="C" AND CON_CONSIGNATARIO_ID=FATURA.CLI_ID) OR

                  (CON_A_PAGAR="D" AND CON_DESTINATARIO_ID=FATURA.CLI_ID) OR

                  (CON_A_PAGAR="E" AND CON_LOCAL_DE_ENTREGA_ID=FATURA.CLI_ID)))+

           (SELECT IIF(IsNull(SUM(CON_FRETE_PESO+CON_FRETE_VALOR+CON_SEC_CAT+CON_DESPACHO+CON_PEDAGIO+CON_ADEME_ITR_OUTROS)),0,SUM(CON_FRETE_PESO+CON_FRETE_VALOR+CON_SEC_CAT+CON_DESPACHO+CON_PEDAGIO+CON_ADEME_ITR_OUTROS)) AS SOMA2

           FROM CONHECIMENTO_FILIAL

           WHERE (CON_ATIVO=TRUE) AND

                 (CON_CANCELADO=FALSE) AND

                 (CON_EMISSAO BETWEEN FATURA.FAT_INICIO AND FATURA.FAT_FIM) AND

                 ((CON_PAGO="R" AND CON_REMETENTE_ID=FATURA.CLI_ID) OR

                  (CON_PAGO="C" AND CON_CONSIGNATARIO_ID=FATURA.CLI_ID) OR

                  (CON_A_PAGAR="D" AND CON_DESTINATARIO_ID=FATURA.CLI_ID) OR

                  (CON_A_PAGAR="E" AND CON_LOCAL_DE_ENTREGA_ID=FATURA.CLI_ID))) AS FAT_VALOR

    FROM FATURA

    ORDER BY FAT_ID;

     

    Obs.: Vale lembrar que não é uma boa alternativa usar a função Nz no 2003 já que a mesma parece não funcionar corretamente e também não é reconhecida quando usada no delphi (6 no meu caso). Obrigado.

    quinta-feira, 1 de junho de 2006 15:06

Todas as Respostas

  • Pessoal consegui resolver após algumas pesquisas nas funções do Access, eis a resolução do problema:

     

    SELECT FAT_ID,

           (SELECT CLI_RAZAO FROM CLIENTE WHERE CLI_ID=FATURA.CLI_ID) AS FAT_SACADO,

           FAT_EMISSAO,

           FAT_VENCIMENTO,

           FAT_INICIO,

           FAT_FIM,

           FAT_BOLETO_GERADO,

           (SELECT IIF(IsNull(SUM(CON_FRETE_PESO+CON_FRETE_VALOR+CON_SEC_CAT+CON_DESPACHO+CON_PEDAGIO+CON_ADEME_ITR_OUTROS)),0,SUM(CON_FRETE_PESO+CON_FRETE_VALOR+CON_SEC_CAT+CON_DESPACHO+CON_PEDAGIO+CON_ADEME_ITR_OUTROS)) AS SOMA1

           FROM CONHECIMENTO

           WHERE (CON_ATIVO=TRUE) AND

                 (CON_CANCELADO=FALSE) AND

                 (CON_EMISSAO BETWEEN FATURA.FAT_INICIO AND FATURA.FAT_FIM) AND

                 ((CON_PAGO="R" AND CON_REMETENTE_ID=FATURA.CLI_ID) OR

                  (CON_PAGO="C" AND CON_CONSIGNATARIO_ID=FATURA.CLI_ID) OR

                  (CON_A_PAGAR="D" AND CON_DESTINATARIO_ID=FATURA.CLI_ID) OR

                  (CON_A_PAGAR="E" AND CON_LOCAL_DE_ENTREGA_ID=FATURA.CLI_ID)))+

           (SELECT IIF(IsNull(SUM(CON_FRETE_PESO+CON_FRETE_VALOR+CON_SEC_CAT+CON_DESPACHO+CON_PEDAGIO+CON_ADEME_ITR_OUTROS)),0,SUM(CON_FRETE_PESO+CON_FRETE_VALOR+CON_SEC_CAT+CON_DESPACHO+CON_PEDAGIO+CON_ADEME_ITR_OUTROS)) AS SOMA2

           FROM CONHECIMENTO_FILIAL

           WHERE (CON_ATIVO=TRUE) AND

                 (CON_CANCELADO=FALSE) AND

                 (CON_EMISSAO BETWEEN FATURA.FAT_INICIO AND FATURA.FAT_FIM) AND

                 ((CON_PAGO="R" AND CON_REMETENTE_ID=FATURA.CLI_ID) OR

                  (CON_PAGO="C" AND CON_CONSIGNATARIO_ID=FATURA.CLI_ID) OR

                  (CON_A_PAGAR="D" AND CON_DESTINATARIO_ID=FATURA.CLI_ID) OR

                  (CON_A_PAGAR="E" AND CON_LOCAL_DE_ENTREGA_ID=FATURA.CLI_ID))) AS FAT_VALOR

    FROM FATURA

    ORDER BY FAT_ID;

     

    Obs.: Vale lembrar que não é uma boa alternativa usar a função Nz no 2003 já que a mesma parece não funcionar corretamente e também não é reconhecida quando usada no delphi (6 no meu caso). Obrigado.

    quinta-feira, 1 de junho de 2006 15:06
  • Oi Carlos,

    a função Nz tem um parâmetro opcional, que é o valor a ser retornado quando o valor testado for nulo.

    Apesar de ser opcional (retorna 0 se não informado), é boa prática informá-lo, especialmente em consultas. Desta forma, funcionará corretamente.

    sábado, 3 de junho de 2006 02:50
    Moderador
  • Ainda sim ele não funcionou quando usei ele com parâmetro, 0 no caso, e também não funcionou dentro o componente adoquery do delphi que não reconheceu a função em questão, mais de qualquer forma o problema está resolvido, obrigado.
    sábado, 3 de junho de 2006 21:49