Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Querendo_ser_Nerd

Divisor igual a 0

Recommended Posts

Boa tarde pessoal estou com problema, não conheço muito sobre este erro.....

 

 

"Ora - 01476: divisor is equal to zero"

 

 

Acho que o problema esta no Join onde eu utilizo o (+)

 

Se alguem poder me ajudar.... Obrigado

 

 

SELECT DISTINCT F.SEQPRODUTO AS Codigo,
F.DESCGENERICA AS Descricao,
z.reffabricante as Ref,
e.embalagem || ' - ' || E.QTDEMBALAGEM as Embalagem,
to_char(X.VLRCUSTOBASE * E.QTDEMBALAGEM, '999G990D99','NLS_NUMERIC_CHARACTERS = ,.' ) as Vl_Base,
X.ALIQUOTAIPI as IPI,
to_char(X.VLRICMSST * E.QTDEMBALAGEM, '9G990D99','NLS_NUMERIC_CHARACTERS = ,.' )AS ST,
X.PERCDESC1 AS Desc_1,
X.PERCDESC2 as Desc_2,
X.PERCDESC3 as Desc_3,
X.PERCDESC4 as Desc_4,
X.PERCDESC5 as Desc_5,
TO_CHAR(X.VLRTOTALNF * E.QTDEMBALAGEM , '999G990D99','NLS_NUMERIC_CHARACTERS = ,.' ) AS Vl_Custo,
to_char((b.vlritem + b.vlrdespforanf + b.vlripi + b.vlricmsst) /
b.qtditem * fPadraoEmbVendaSeg(f.seqfamilia, 1),'9999G990D99','NLS_NUMERIC_CHARACTERS = ,.') entrada,
to_char(z.precogernormal, '9G990D99','NLS_NUMERIC_CHARACTERS = ,.' ) as Vl_Venda,
to_char(z.precogernormal /
(X.VLRTOTALNF * E.QTDEMBALAGEM / 100)
- 100, '999G990D99','NLS_NUMERIC_CHARACTERS = ,.' ) as Margem,
round (z.estqdeposito / e.qtdembalagem,0) as Estoque,
MAP_FAMILIA.SEQFAMILIA as Familia,
Z.statusvenda Venda, Z.statuscompra Compra


FROM MAP_FAMILIA,
macv_custocompraufvalida X,
MAX_DIVISAO D,
MAP_FAMEMBALAGEM E,
MAP_PRODUTO F,
MAXV_MGMBASEPRODSEG z,
MAP_MARCA L,
MAXV_MGMBASEPRODSEG A,
maxv_abcentradabase b

WHERE MAP_FAMILIA.SEQFAMILIA = X.SEQFAMILIA
and b.SEQPRODUTO = f.seqproduto(+)
and b.dtaentrada in (select max(aa.dtaentrada)
from maxv_abcentradabase aa

where aa.codgeraloper in (100, 101, 199, 191)
and aa.seqproduto = f.seqproduto
)
AND D.NRODIVISAO = X.NRODIVISAO
AND L.SEQMARCA = MAP_FAMILIA.SEQMARCA
AND z.SEQPRODUTO = F.SEQPRODUTO
AND MAP_FAMILIA.SEQFAMILIA = F.SEQFAMILIA
AND F.SEQFAMILIA = E.SEQFAMILIA
AND X.SEQFAMILIA = F.SEQFAMILIA
AND E.QTDEMBALAGEM = A.qtdembalagem
AND A.padraoembvenda = E.QTDEMBALAGEM
AND A.seqproduto = Z.seqproduto
AND A.seqfamilia = MAP_FAMILIA.SEQFAMILIA
AND A.nroempresa = Z.nroempresa
AND X.SEQFAMILIA = A.seqfamilia
AND A.NroDivisao = X.NRODIVISAO
AND A.nrosegmento = Z.nrosegmento
AND E.SEQFAMILIA = X.SEQFAMILIA
AND L.MARCA = 'MAXIMA CADERNOS'
AND Z.nroempresa = 1
AND Z.statusvenda IN ('A')
AND Z.NroDivisao IN 1
AND Z.NROSEGMENTO IN 1
AND Z.statuscompra IN ('A','I')
and z.embpadraovenda = z.qtdembalagem
AND(X.VLRTOTALNF * E.QTDEMBALAGEM) > 0
group by F.SEQPRODUTO,
F.DESCGENERICA ,
z.reffabricante ,
e.embalagem || ' - ' || E.QTDEMBALAGEM ,
to_char(X.VLRCUSTOBASE * E.QTDEMBALAGEM, '999G990D99','NLS_NUMERIC_CHARACTERS = ,.' ) ,
X.ALIQUOTAIPI ,
to_char(X.VLRICMSST * E.QTDEMBALAGEM, '9G990D99','NLS_NUMERIC_CHARACTERS = ,.' ),
X.PERCDESC1 ,
X.PERCDESC2 ,
X.PERCDESC3 ,
X.PERCDESC4,
X.PERCDESC5 ,
TO_CHAR(X.VLRTOTALNF * E.QTDEMBALAGEM , '999G990D99','NLS_NUMERIC_CHARACTERS = ,.' ) ,
to_char(z.precogernormal, '9G990D99','NLS_NUMERIC_CHARACTERS = ,.' ) ,
to_char(z.precogernormal /
(X.VLRTOTALNF * E.QTDEMBALAGEM / 100)
- 100, '999G990D99','NLS_NUMERIC_CHARACTERS = ,.' ),
round (z.estqdeposito / e.qtdembalagem,0) ,
MAP_FAMILIA.SEQFAMILIA ,
Z.statusvenda , Z.statuscompra ,
to_char((b.vlritem + b.vlrdespforanf + b.vlripi + b.vlricmsst) /
b.qtditem * fPadraoEmbVendaSeg(f.seqfamilia, 1),'9999G990D99','NLS_NUMERIC_CHARACTERS = ,.')
ORDER BY F.DESCGENERICA

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguma divisão ficou com o dividendo igual a zero , uma solução seria tratar com CASE por exemplo

(case when (X.VLRTOTALNF * E.QTDEMBALAGEM / 100) <> 0 
then to_char(z.precogernormal / (X.VLRTOTALNF * E.QTDEMBALAGEM / 100)
else null end)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, desculpa mas no script onde o critério Case se encaixa pois nunca utilizei está função....

 

 

 

Obrigado

 


Motta o B.O está nesta conta.... eu comentei e apareceu os resultados porem eu preciso desta coluna

 

 

 

/* to_char((b.vlritem + b.vlrdespforanf + b.vlripi + b.vlricmsst) /
b.qtditem * fPadraoEmbVendaSeg(f.seqfamilia, 1),'9999G990D99','NLS_NUMERIC_CHARACTERS = ,.') entrada,*/

 


Creio que o (+) estou trazendo os demais codigos, por não ter nenhuma informação é onde da este problema teria como contornar esta situação pois eu preciso trazer as de mais info. No caso eu sei que a conta é esta ..

 

to_char((b.vlritem + b.vlrdespforanf + b.vlripi + b.vlricmsst) /
b.qtditem * fPadraoEmbVendaSeg(f.seqfamilia, 1),'9999G990D99','NLS_NUMERIC_CHARACTERS = ,.') entrada

 

E a join b.seqproduto (+) = f. seqproduto

 

este case me ajuda será? como montar este case com estas informações.

 

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Teste se b.qtditem * fPadraoEmbVendaSeg(f.seqfamilia, 1) é zero.

Compartilhar este post


Link para o post
Compartilhar em outros sites


(case when b.qtditem * fPadraoEmbVendaSeg(f.seqfamilia, 1) <> 0

then to_char((b.vlritem + b.vlrdespforanf + b.vlripi + b.vlricmsst) /

b.qtditem * fPadraoEmbVendaSeg(f.seqfamilia, 1),'9999G990D99','NLS_NUMERIC_CHARACTERS = ,.')

else null end) entrada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, realmente apareceu os valores estranho que repetiu alguns cod. com valores de entrada diferente eu apenas fiz a alteração do case.

veja

 

24853 CAD CD 01X1 96FLS X-SPORT MAXIMA PT - 8 15,92 0,00 1,89 0,0000 0,0000 0,0000 0,0000 0,0000 17,81 24,04 34,99 587 2248 A A 17,82

24853 CAD CD 01X1 96FLS X-SPORT MAXIMA PT - 8 15,92 0,00 1,89 0,0000 0,0000 0,0000 0,0000 0,0000 17,81 24,04 34,99 587 2248 A A 17,81

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não posso opinar pela operação, fiz apenas o tratamento para a divisão por zero,

 

Uma dica "abra" a operação pelos operandos e veja se é isto que realmente se quer.

select
...
b.vlritem , 
b.vlrdespforanf , 
b.vlripi ,
b.vlricmsst , 
b.qtditem , 
PadraoEmbVendaSeg(f.seqfamilia, 1) 
...

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Isso mesmo Motta, eu vi que os valores são diferentes o que está me atrapalhando é esta função ||PadraoEmbVendaSeg|| estou analisando vendo como posso subistituir a mesma por uma coluna, está bem complicado. mas o Case me ajudou e muito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Toda vez que se opera uma divisão em um SQL deve-se ter este cuidado, já apanhei muito com isto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, eu consigo utilizar este comando ?Seria o meio correto de quando uma data for nula ou em branco retornar os de mais campos e preencher de zero ou nulo?

 

 

and b.dtaentrada in (select max (aa.dtaentrada)
from maxv_abcentradabase aa
where aa.codgeraloper in (100, 101, 199, 191)
and aa.SEQPRODUTO = z.seqproduto
) or b.DTAENTRADA is null

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim , mas eu faria

and ( (b.dtaentrada in (select max (aa.dtaentrada)
from maxv_abcentradabase aa
where aa.codgeraloper in (100, 101, 199, 191)
and aa.SEQPRODUTO = z.seqproduto
)) or (b.DTAENTRADA is nul) ) 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

 

Tem possibilidade de colocar is null no mesmo and?

 

and ( (b.dtaentrada in (select max (aa.dtaentrada)
from maxv_abcentradabase aa
where aa.codgeraloper in (100, 101, 199, 191)
and aa.SEQPRODUTO = 6022
)) or (b.DTAENTRADA is null))
and ( (b.DTAEMISSAO in (select max (bb.DTAEMISSAO)
from maxv_abcentradabase bb
where bb.codgeraloper in (100, 101, 199, 191) OR B.CODGERALOPER IS NULL
AND bb.SEQPRODUTO = 6022
)) or (b.DTAEMISSAO is null))

 

 

eu acho que não pois o and se trata de data né? como eu consigo fazer valer este criterio, me traga todos com o cod. 100, 101, 199, 191 caso não tenha me traga em branco.

 

and where a.codgeraloper in (100, 101, 199, 191) or a.codgeraloper is null

 

caso não de para acrescentar neste and na minha consulta que informei lá em cima onde eu utilizo já estou meio que perdido.

 

Obrigado!


então quando eu comento a linha a.codgeraloper in (100, 101, 199, 191) os resultados aparecem, mas com o criterio de is null não, tentei assim a.codgeraloper in (100, 101, 199, 191,null) sem sucesso tb.

 

 

=c

Compartilhar este post


Link para o post
Compartilhar em outros sites

Neste caso não, mas em casos simples cabe

and nvl(emite,'sim') = 'sim'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, não teria como eu trazer então dados sem que não contem na coluna codgeraloper in (100,101,199,191) no caso as outras colunas tem informações do produto mas quando ele cai no criterio desta coluna ele não retona pois não tem nada cadastrato. Como foi feito com a data, não existe um meio de contornar esta situação, no caso que contenha os cod. (100,101,199,191) ou seja null. Pois nesta tabela que utilizo realmete não contem produto, porem as depais tabelas contem as informações.

 

and ( (b.dtaentrada in (select max (aa.dtaentrada)
from maxv_abcentradabase aa
--where aa.codgeraloper in (100, 101, 199, 191,106)
--WHERE ((aA.codgeraloper in (100, 101, 199, 191) or (AA.CODGERALOPER is null) ))
where aa.SEQPRODUTO = z.seqproduto
)) or (b.DTAENTRADA is null) )
and ( (b.DTAEMISSAO in (select max (bb.DTAEMISSAO)
from maxv_abcentradabase bb
-- bb.codgeraloper in (100, 101, 199, 191,106)
--WHERE ((bB.codgeraloper in (100, 101, 199, 191) or (bB.CODGERALOPER is null) ))
where bb.SEQPRODUTO = z.seqproduto
)) or (b.DTAEMISSAO is null) )


 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça um NOT EXISTS na tabela.

 

Mas ficou confuso para mim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

é realmente complexo e talvez tb não esteja me espressado corretamente, a quetsão é assim quando o select vai em um criterio no caso da coluna and codgeraloper in (100, 101, 199, 191,106) ele vai me retornar todos que estão com o cod. informado, porém eu preciso que ele mostre os que são null ou não tenham informação na tabela no caso existe alguns produtos que seguer informação na tabela once costa esta coluna codgeraloper, realmente com not exists aparece os valores porém ele não tras os valores outros valores.

 

Estou fazendo assim....

 

and not exists (select distinct p.seqproduto from maxv_abcentradabase p
where p.seqproduto = z.SEQPRODUTO
and p.NROEMPRESA = 1
and p.NRODIVISAO = 1
and p.codgeraloper in (100, 101, 199, 191)

 

quando eu faço este criterio ele tras os valore que não tem os cod. (100, 101, 199, 191) porém os que tinham ele não esta trazendo mais,... como devo proceder...?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça duas queries com as duas condições e junte-as por union

 

ou

 

Faça uma function que trate todas estas questões e que receba a data por parametro e retorne se o registro deve ser tratada ou não (0 não 1 sim por exemplo)

 

De qualquer forma a performance pode ser um problema

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta deu certo eu usei o Union, muito obrigado sempre me ajudando, so não vou postar o cod. aqui pois muito gigante.

Agora uma duvidam, la no começo para divisor igual a 0 vc me passou um case, vc poderia me informar como ele trata isso? no caso eu seria como um criterio se where porém como ele diferencia o divisor de 0??

Muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites


(case when (X.VLRTOTALNF * E.QTDEMBALAGEM / 100) <> 0

then to_char(z.precogernormal / (X.VLRTOTALNF * E.QTDEMBALAGEM / 100)

-- "quando caso" (X.VLRTOTALNF * E.QTDEMBALAGEM / 100) diferir de zero então

-- faz conta

else null

-- senão (é zero) retorna nulo

end)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, o que estou fazendo de errado, ORA- 00920 invalid relational operator.

(case when ((1+(0)/(100)) /nvl(c.qtdmincompra,1),0) * nvl(c.qtdmincompra,1) <> 0
then ((1+(0)/(100)) /nvl(c.qtdmincompra,1),0) * nvl(c.qtdmincompra,1) <> 0
else null
end )

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.