Ajuda com verificação
Estou com este código me resultando em divisor = 0, e já localizei que é por causa de um pedido com numero negativo (-9999999968) e vazio sem itens, então precisaria de uma verificação para que o meu código não me retornasse notas com numeros '<= 0', todos teriam que ser '>=0'. Tenho uma tabela de referencia para fazer essa verificação, mas toda vez que incluo ela no meu código ou me retorna dados de mais, ou código de unica linha resultando em mais linhas... Precisava de uma luz para saber uma forma de verificar isso...
segue o código:
segue o código:
SELECT
ITE.CODVEND,
ITE.APELIDO,
GERENTE,
:PERIODO.INI AS "DTINICIAL",
:PERIODO.FIN AS "DTFINAL",
TO_DATE(:PERIODO.FIN,'DD/MM/YYYY') - TO_DATE (:PERIODO.INI,'DD/MM/YYYY') + 1 AS "QTD_DIAS",
AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN) AS "QTD_DIAS_UTEIS",
SUM(ITE.QTDNEG) AS "QTDNEG_TOT",
SUM(ITE.PESO_TOT) AS "PESO_TOT",
SUM(ITE.VLRTOT_LIQ) / SUM(ITE.QTDNEG) AS "VLRUNIT",
SUM(ITE.VLRTOT_LIQ) AS "VLRTOT",
SUM(ITE.VLRDESC) AS "VLRDESC",
SUM(ITE.VLRTOT_LIQ) AS "VLRTOT_LIQ",
SUM(ITE.CUSTO_TOTAL) AS "CUSTO_TOTAL",
(SUM(ITE.VLRTOT_LIQ) -SUM(ITE.CUSTO_TOTAL)) AS "VLR_MARGEM",
((SUM(ITE.VLRTOT_LIQ) / DECODE(SUM(ITE.CUSTO_TOTAL),0,1,SUM(ITE.CUSTO_TOTAL)))-1)*100 AS "PERC_MARKUP",
(SELECT COUNT(*) FROM TGFPRO
WHERE CODGRUPOPROD IN :P_CODGRUPOPROD
AND MARCA IN :P_MARCA
) AS "QTD_MIX_TOT",
(SELECT COUNT(DISTINCT CODPROD) FROM AD_CAMPANHAS_ITE
WHERE CODGRUPOPROD IN :P_CODGRUPOPROD
AND MARCA IN :P_MARCA
AND DTFATUR >= :PERIODO.INI
AND DTFATUR <= :PERIODO.FIN
AND CODVEND = ITE.CODVEND) AS "QTD_MIX_VDA",
(SELECT COUNT(DISTINCT CODPROD) FROM AD_CAMPANHAS_ITE
WHERE CODGRUPOPROD IN :P_CODGRUPOPROD
AND MARCA IN :P_MARCA
AND DTFATUR >= :PERIODO.INI
AND DTFATUR <= :PERIODO.FIN
AND CODVEND = ITE.CODVEND) /DECODE((SELECT COUNT(*) FROM TGFPRO
WHERE CODGRUPOPROD IN :P_CODGRUPOPROD
AND MARCA IN :P_MARCA),0,1,(SELECT COUNT(*) FROM TGFPRO
WHERE CODGRUPOPROD IN :P_CODGRUPOPROD
AND MARCA IN :P_MARCA))*100 AS "PERC_MIX",
(SELECT COUNT(*) FROM TGFRPV RPV
WHERE RPV.CODVEND = ITE.CODVEND
AND NOT EXISTS (SELECT 1 FROM TGFPAR PAR
WHERE PAR.CODPARC = RPV.CODPARC
AND PAR.ATIVO = 'S'
AND PAR.CODVEND = RPV.CODVEND))+
(SELECT COUNT(*) FROM TGFPAR PAR
WHERE PAR.CODVEND = ITE.CODVEND
AND PAR.ATIVO = 'S'
AND NOT EXISTS (SELECT 1 FROM TGFRPV RPV
WHERE RPV.CODPARC = PAR.CODPARC
AND RPV.CODVEND = PAR.CODVEND)) AS "QTD_PARC_TOT",
(SELECT COUNT(DISTINCT ITE2.CODPARC) FROM AD_CAMPANHAS_ITE ITE2
WHERE ITE2.CODGRUPOPROD IN :P_CODGRUPOPROD
AND ITE2.MARCA IN :P_MARCA
AND ITE2.DTFATUR >= :PERIODO.INI
AND ITE2.DTFATUR <= :PERIODO.FIN
AND ITE2.CODVEND = ITE.CODVEND) AS "QTD_PARC_VDA",
(SUM(ITE.VLRTOT_LIQ) /(SELECT COUNT(DISTINCT ITE2.CODPARC) FROM AD_CAMPANHAS_ITE ITE2
WHERE ITE2.CODGRUPOPROD IN :P_CODGRUPOPROD
AND ITE2.MARCA IN :P_MARCA
AND TO_DATE(ITE2.DTFATUR,'DD/MM/YY') >= :PERIODO.INI
AND TO_DATE(ITE2.DTFATUR,'DD/MM/YY') <= :PERIODO.FIN
AND ITE2.CODVEND = ITE.CODVEND)) AS "TICKETCLI",
(SELECT COUNT(DISTINCT ITE2.CODPARC) FROM AD_CAMPANHAS_ITE ITE2
WHERE ITE2.CODGRUPOPROD IN :P_CODGRUPOPROD
AND ITE2.MARCA IN :P_MARCA
AND ITE2.DTFATUR >= :PERIODO.INI
AND ITE2.DTFATUR <= :PERIODO.FIN
AND ITE2.CODVEND = ITE.CODVEND) AS "QTD_PARC_VDA",
(SELECT COUNT(DISTINCT ITE2.CODPARC) FROM AD_CAMPANHAS_ITE ITE2
WHERE ITE2.CODGRUPOPROD IN :P_CODGRUPOPROD
AND ITE2.MARCA IN :P_MARCA
AND ITE2.DTFATUR >= :PERIODO.INI
AND ITE2.DTFATUR <= :PERIODO.FIN
AND ITE2.CODVEND = ITE.CODVEND) / ((SELECT COUNT(*) FROM TGFRPV RPV
WHERE RPV.CODVEND = ITE.CODVEND
AND NOT EXISTS (SELECT 1 FROM TGFPAR PAR
WHERE PAR.CODPARC = RPV.CODPARC
AND PAR.ATIVO = 'S'
AND PAR.CODVEND = RPV.CODVEND))+
(SELECT COUNT(*) FROM TGFPAR PAR
WHERE PAR.CODVEND = ITE.CODVEND
AND PAR.ATIVO = 'S'
AND NOT EXISTS (SELECT 1 FROM TGFRPV RPV
WHERE RPV.CODPARC = PAR.CODPARC
AND RPV.CODVEND = PAR.CODVEND)))*100 AS "PERC_PARC",
SUM(ITE.QTDNEG) / DECODE(AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN),0,1,AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN)) AS "QTDNEG_DIA",
SUM(ITE.PESO_TOT) / DECODE(AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN),0,1,AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN)) AS "PESO_DIA",
SUM(ITE.VLRTOT_LIQ) / DECODE(AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN),0,1,AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN)) AS "VALOR_DIA",
(SUM(ITE.QTDNEG) / DECODE(AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN),0,1,AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN))) * AD_DIAS_UTEIS(SYSDATE-30,SYSDATE) AS "QTDNEG_30",
(SUM(ITE.PESO_TOT) / DECODE(AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN),0,1,AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN))) * AD_DIAS_UTEIS(SYSDATE-30,SYSDATE) AS "PESO_30",
(SUM(ITE.VLRTOT_LIQ) / DECODE(AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN),0,1,AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN))) * AD_DIAS_UTEIS(SYSDATE-30,SYSDATE) AS "VALOR_30",
sankhya.AD_FC_CONFIGCAMP (STP_GET_CODUSULOGADO,
:PERIODO.INI ,
:PERIODO.FIN,
(SELECT (listagg(CODGRUPOPROD,',') within group (order by CODGRUPOPROD))
FROM TGFGRU
WHERE CODGRUPOPROD IN :P_CODGRUPOPROD),
(SELECT (listagg(DESCRICAO,',') within group (order by DESCRICAO))
FROM TGFMAR
WHERE DESCRICAO IN :P_MARCA),
(SELECT (listagg(CODVEND,',') within group (order by CODVEND))
FROM TGFVEN
WHERE CODVEND IN :P_CODVEND)) AS "VALIDACAO",
(SELECT COUNT(DISTINCT NUNOTA)
FROM AD_CAMPANHAS_ITE ITE2
WHERE 0 = 0
AND ITE2.DTFATUR >= :PERIODO.INI
AND ITE2.DTFATUR <= :PERIODO.FIN
AND ITE2.CODGRUPOPROD IN :P_CODGRUPOPROD
AND ITE2.MARCA IN :P_MARCA
AND ITE2.CODVEND = ITE.CODVEND
AND NUNOTA >= 0) "QTDVENDAS",
SUM(ITE.VLRTOT_LIQ) / (SELECT COUNT(DISTINCT NUNOTA)
FROM AD_CAMPANHAS_ITE ITE2
WHERE 0 = 0
AND TO_DATE(ITE2.DTFATUR,'DD/MM/YY') >= :PERIODO.INI
AND TO_DATE(ITE2.DTFATUR,'DD/MM/YY') <= :PERIODO.FIN
AND ITE2.CODGRUPOPROD IN :P_CODGRUPOPROD
AND ITE2.MARCA IN :P_MARCA
AND ITE2.CODVEND = ITE.CODVEND
AND NUNOTA >=0) AS "TICKETMEDIO",
(SELECT COUNT(DISTINCT NUNOTA)
FROM AD_CAMPANHAS_ITE ITE2
WHERE 0 = 0
AND TO_DATE(ITE2.DTFATUR,'DD/MM/YY') >= :PERIODO.INI
AND TO_DATE(ITE2.DTFATUR,'DD/MM/YY') <= :PERIODO.FIN
AND ITE2.CODGRUPOPROD IN :P_CODGRUPOPROD
AND ITE2.MARCA IN :P_MARCA
AND ITE2.CODVEND = ITE.CODVEND
AND NUNOTA>=0) AS "QTD_PEDIDOS"
FROM AD_CAMPANHAS_ITE ITE
WHERE 0 = 0
AND TO_DATE(ITE.DTFATUR,'DD/MM/YY') >= :PERIODO.INI
AND TO_DATE(ITE.DTFATUR,'DD/MM/YY') <= :PERIODO.FIN
AND TO_CHAR(DTFATUR,'DD/MM/YYYY HH24:MI') >= TO_CHAR(:DTINI,'DD/MM/YYYY HH24:MI')
AND TO_CHAR(DTFATUR,'DD/MM/YYYY HH24:MI') <= TO_CHAR(:DTFIN,'DD/MM/YYYY HH24:MI')
AND ITE.CODGRUPOPROD IN :P_CODGRUPOPROD
AND ITE.CODVEND IN :P_CODVEND
AND ITE.MARCA IN :P_MARCA
AND ITE.CODPROD IN NVL(:P_CODPROD,ITE.CODPROD)
AND ITE.CODTIPPARC IN NVL(:P_CODTIPPARC,ITE.CODTIPPARC)
AND NUNOTA >= 0
GROUP BY
ITE.CODVEND,
ITE.APELIDO,
GERENTE
ORDER BY ITE.APELIDO
Maicon Scapatici
Curtidas 0
Melhor post
Alex Lekao
25/09/2018
Oi Maicon, boa tarde!!!
Você já identificou onde esta o erro, correto?
Você poderia colocar a parte do código onde encontrou o erro?
Cara, confesso que tentei ler seu código, mas mais me confundiu que tudo. rsrsr
Tem algumas tratativas que podem ser feitas para uma divisão por zero, mas acho que seria mais interessante analisarmos o ponto do código onde esta acontecendo o problema.
Atenciosamente,
Você já identificou onde esta o erro, correto?
Você poderia colocar a parte do código onde encontrou o erro?
Cara, confesso que tentei ler seu código, mas mais me confundiu que tudo. rsrsr
Tem algumas tratativas que podem ser feitas para uma divisão por zero, mas acho que seria mais interessante analisarmos o ponto do código onde esta acontecendo o problema.
Atenciosamente,
GOSTEI 1
Mais Respostas
Maicon Scapatici
25/09/2018
Então Alex, eu ainda não consegui localizar, só identifiquei que estava procurando o erro na tabela errada, estou analisando outra tabela pra ver se consigo localizar a fonte do erro e posto aqui. Descobri também que ela é estruturada por duas views, provavelmente o erro esteja dentro da formula de alguma delas.
Eis a tabela que estou olhando agora, aonde provavelmente está o erro.
Eis a tabela que estou olhando agora, aonde provavelmente está o erro.
SELECT ITE.CODVEND, ITE.CODPROD, ITE.DESCRPROD, ITE.CODGRUPOPROD, ITE.DESCRGRUPOPROD, ITE.MARCA, SUM(ITE.QTDNEG) AS "QTDNEG_TOT", SUM(ITE.PESO_TOT) AS "PESO_TOT", SUM(ITE.VLRTOT_LIQ) / DECODE(SUM(ITE.QTDNEG),0,1,SUM(ITE.QTDNEG)) AS "VLRUNIT", SUM(ITE.VLRTOT_LIQ) AS "VLRTOT", SUM(ITE.VLRDESC) AS "VLRDESC", SUM(ITE.CUSTO_TOTAL) AS "CUSTO_TOTAL", SUM(ITE.CUSTO_TOTAL) / DECODE(SUM(ITE.QTDNEG),0,1,SUM(ITE.QTDNEG)) AS "CUSTO_UNIT", ((SUM(ITE.VLRTOT_LIQ) / DECODE(SUM(ITE.CUSTO_TOTAL),0,1,SUM(ITE.CUSTO_TOTAL)))-1)*100 AS "PERC_MARKUP", (SUM(ITE.VLRTOT_LIQ) -SUM(ITE.CUSTO_TOTAL)) AS "VLR_MARGEM", (SELECT COUNT(DISTINCT ITE2.CODPARC) FROM AD_CAMPANHAS_ITE ITE2 WHERE ITE2.CODGRUPOPROD IN :P_CODGRUPOPROD AND ITE2.MARCA IN :P_MARCA AND ITE2.CODPROD = ITE.CODPROD AND ITE2.DTFATUR >= :PERIODO.INI AND ITE2.DTFATUR <= :PERIODO.FIN AND ITE2.CODVEND = ITE.CODVEND) AS "QTD_PARC_VDA", (SELECT COUNT(DISTINCT ITE2.CODPARC) FROM AD_CAMPANHAS_ITE ITE2 WHERE ITE2.CODGRUPOPROD IN :P_CODGRUPOPROD AND ITE2.MARCA IN :P_MARCA AND ITE2.CODPROD = ITE.CODPROD AND ITE2.DTFATUR >= :PERIODO.INI AND ITE2.DTFATUR <= :PERIODO.FIN AND ITE2.CODVEND = ITE.CODVEND) / ((SELECT COUNT(*) FROM TGFRPV RPV WHERE RPV.CODVEND = ITE.CODVEND AND NOT EXISTS (SELECT 1 FROM TGFPAR PAR WHERE PAR.CODPARC = RPV.CODPARC AND PAR.CODVEND = RPV.CODVEND))+ (SELECT COUNT(*) FROM TGFPAR PAR WHERE PAR.CODVEND = ITE.CODVEND AND NOT EXISTS (SELECT 1 FROM TGFRPV RPV WHERE RPV.CODPARC = PAR.CODPARC AND RPV.CODVEND = PAR.CODVEND)))*100 AS "PERC_PARC", SUM(ITE.QTDNEG) / DECODE(AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN),0,1,AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN)) AS "QTDNEG_DIA", SUM(ITE.PESO_TOT) / DECODE(AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN),0,1,AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN)) AS "PESO_DIA", SUM(ITE.VLRTOT_LIQ) / DECODE(AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN),0,1,AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN)) AS "VALOR_DIA", (SUM(ITE.QTDNEG) / DECODE(AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN),0,1,AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN))) * AD_DIAS_UTEIS(SYSDATE-30,SYSDATE) AS "QTDNEG_30", (SUM(ITE.PESO_TOT) / DECODE(AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN),0,1,AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN))) * AD_DIAS_UTEIS(SYSDATE-30,SYSDATE) AS "PESO_30", (SUM(ITE.VLRTOT_LIQ) / DECODE(AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN),0,1,AD_DIAS_UTEIS(:PERIODO.INI,:PERIODO.FIN))) * AD_DIAS_UTEIS(SYSDATE-30,SYSDATE) AS "VALOR_30" FROM AD_CAMPANHAS_ITE ITE WHERE 0 = 0 AND TO_DATE(ITE.DTFATUR,'DD/MM/YY') >= :PERIODO.INI AND TO_DATE(ITE.DTFATUR,'DD/MM/YY') <= :PERIODO.FIN AND TO_CHAR(DTFATUR,'DD/MM/YYYY HH24:MI') >= TO_CHAR(:DTINI,'DD/MM/YYYY HH24:MI') AND TO_CHAR(DTFATUR,'DD/MM/YYYY HH24:MI') <= TO_CHAR(:DTFIN,'DD/MM/YYYY HH24:MI') AND ITE.CODVEND IN :P_CODVEND AND ITE.CODPROD IN NVL(:P_CODPROD,ITE.CODPROD) AND ITE.CODGRUPOPROD IN :P_CODGRUPOPROD AND ITE.MARCA IN :P_MARCA AND ITE.CODVEND IN :ARG_CODVEND AND ITE.CODTIPPARC IN NVL(:P_CODTIPPARC,ITE.CODTIPPARC) GROUP BY ITE.CODVEND, ITE.CODPROD, ITE.DESCRPROD, ITE.CODGRUPOPROD, ITE.DESCRGRUPOPROD, ITE.MARCA ORDER BY ITE.CODPROD
GOSTEI 0
Maicon Scapatici
25/09/2018
Consegui localizar o erro. Não estava no código, e sim no operacional. Deixaram um vendedor que não faz mais parte da equipe de vendas como ativo, e como ele não possuía pedidos estava trazendo valores zerados.
GOSTEI 0
Alex Lekao
25/09/2018
Bom dia!!!
Entendi.
Mas imagino que essa questão precisa ser tratada no código, porque isso vai acontecer novamente.
Sugiro nas operações onde tem divisão, você adicionar uma tratativa para divisão por zero.
Com isso você já resolve quando houver esse problema novamente.
Se não me engano com a função NULLIF você consegue tratar essa questão, você o coloca no divisor.
Atenciosamente,
Entendi.
Mas imagino que essa questão precisa ser tratada no código, porque isso vai acontecer novamente.
Sugiro nas operações onde tem divisão, você adicionar uma tratativa para divisão por zero.
Com isso você já resolve quando houver esse problema novamente.
Se não me engano com a função NULLIF você consegue tratar essa questão, você o coloca no divisor.
Atenciosamente,
GOSTEI 1
Maicon Scapatici
25/09/2018
Vou pesquisar sobre a clausula nullif e irei implantá-la para não ocorrer mais esse erro.
Obrigado pela sugestão! Quando eu tiver feito e testado coloco a implementação aqui para você dar uma olhada.
Obrigado pela sugestão! Quando eu tiver feito e testado coloco a implementação aqui para você dar uma olhada.
GOSTEI 0
Alex Lekao
25/09/2018
Ok.
Será interessante para conhecimento de alguém que estiver passando pelo mesmo problema.
Uma coisa que me equivoquei, NULLIF é SLQ Server, para Oracle deve ter algo similar, eu não conheço, me confundi com o banco que você estava no tópico.
Será interessante para conhecimento de alguém que estiver passando pelo mesmo problema.
Uma coisa que me equivoquei, NULLIF é SLQ Server, para Oracle deve ter algo similar, eu não conheço, me confundi com o banco que você estava no tópico.
GOSTEI 1