Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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)
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)
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
Teste se b.qtditem * fPadraoEmbVendaSeg(f.seqfamilia, 1) é zero.
(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
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
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)
...Toda vez que se opera uma divisão em um SQL deve-se ter este cuidado, já apanhei muito com isto.
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
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) )
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
Neste caso não, mas em casos simples cabe
and nvl(emite,'sim') = 'sim'
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) )
Faça um NOT EXISTS na tabela.
Mas ficou confuso para mim.
é 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...?
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
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.
(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)
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 )
(case when (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 )
teste só o divisor
Mesma mensagem acusando o * da primeira linha como o operador invalido,
(case when ((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)
(case when (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)
ajustar parenteses , creio
Bom dia,
O meu problema com divor 0 está nesta linha..
* (1+(0)/(100)) )/nvl(c.qtdmincompra,1),0) -- parte quando eu comento me tres os resultados
(1+(0)/(100)) )/nvl(c.qtdmincompra,1),0) nvl(c.qtdmincompra,1) ) - conta completa
Motta como devo proceder, vc tem alguma dica?
Não tem muito mistério , toda vez que se faz uma divisão a/b se corre o risco de o divisor ser zero, isto dá erro em qualquer linguagem, no SQL do Oracle podemos tratar isto verificando se o divisor é zero
(case when b <> 0 then a/b else null end)
o divisor pode ser qualquer coisa
(case when (X.VLRTOTALNF * E.QTDEMBALAGEM / 100) <> 0
then (z.precogernormal / (X.VLRTOTALNF * E.QTDEMBALAGEM / 100))
else null end)
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)