Ajuda com verificação

25/09/2018

1

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:
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
Responder

Post mais votado

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,
Responder

Mais Posts

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.
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
Responder
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.
Responder

26/09/2018

Alex Lekao

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,
Responder
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.
Responder

26/09/2018

Alex Lekao

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.
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira