ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Arithimetic Overflow divisao por zero e case

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
pancotte
Novato
Novato


Registrado: Segunda-Feira, 5 de Outubro de 2009
Mensagens: 14

MensagemEnviada: Qui Ago 03, 2017 12:25 pm    Assunto: Arithimetic Overflow divisao por zero e case Responder com Citação

Pessoal,

Tenho este sql abaixo, onde o campo VLTOTALBRUTO esta dando erro de arithimetic por estar zerado em alguns casos.
Tentei usar um case para tratar quando for zero nao executar a sentensa do cast, porem ele nao passa pelo case. Ele deveria jogar para a variavel vltotal = 0 qdo o vltotalbruto for 0, caso contrario executar executar o cast, mas mesmo usando o case ele da erro de arithimetic

Código:
SELECT p.cnpj_cpf, SUBSTRING(p.insc_rg FROM 1 FOR 14), p.tpinsc, m.dataemissao,
             nf.uf, cast(lpad (m.numdocumento, 6, '0') as varchar(06)),
             mi.percicms as aliquota,
             Case When m.vltotalbruto = 0 then 0
             else
             CAST((sum((mi.qtde * mi.vlunitario) + coalesce(mi.vlipi, 0) +
             ((mi.qtde * mi.vlunitario)*(((coalesce(nf.vloutrasdespesas,0) * 100) / m.vltotalbruto) / 100)) +
             ((mi.qtde * mi.vlunitario)*(((coalesce(nf.vlseguro,0) * 100) / m.vltotalbruto) / 100)) +
             ((mi.qtde * mi.vlunitario)*(((coalesce(m.vlfrete,0) * 100) / m.vltotalbruto) / 100)) +
             coalesce(mi.valoricmsst, 0) - coalesce(mi.vldesconto, 0))) AS NUMERIC(11,2)) end as vltotal,
             CAST((sum((coalesce(mi.baseicms, 0)))) AS NUMERIC(11,2)) as baseicms,
             CAST((sum(mi.vlicms)) AS NUMERIC(11,2)) as vlicms,
             m.situacao, SUBSTRING(nf.modelo from 1 for 2), mi.cfop
      FROM mov_movimento m
             JOIN mov_nf nf                on (m.cod= nf.cod)
             JOIN pes_pessoas p            on (m.codclifor = p.cod)
             join g_tpmovimento tp         on (m.codtpmovimento = tp.cod)
             join mov_movitens mi          on (m.cod = mi.codmovimento)
      WHERE m.dataemissao >= :INICIO AND m.dataemissao <= :fim and m.codempresa = :codempresa
      GROUP BY p.cnpj_cpf, p.insc_rg, p.tpinsc, m.dataemissao, nf.uf, m.numdocumento,
               mi.percicms, m.situacao, nf.modelo,mi.cfop, m.vltotalbruto
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Sex Ago 04, 2017 9:44 am    Assunto: Responder com Citação

ja tentou usar IF no lugar do CASE?

Código:
SELECT p.cnpj_cpf, SUBSTRING(p.insc_rg FROM 1 FOR 14), p.tpinsc, m.dataemissao,
             nf.uf, cast(lpad (m.numdocumento, 6, '0') as varchar(06)),
             mi.percicms as aliquota,

             IF(m.vltotalbruto = 0, 0,

             CAST((sum((mi.qtde * mi.vlunitario) + coalesce(mi.vlipi, 0) +
             ((mi.qtde * mi.vlunitario)*(((coalesce(nf.vloutrasdespesas,0) * 100) / m.vltotalbruto) / 100)) +
             ((mi.qtde * mi.vlunitario)*(((coalesce(nf.vlseguro,0) * 100) / m.vltotalbruto) / 100)) +
             ((mi.qtde * mi.vlunitario)*(((coalesce(m.vlfrete,0) * 100) / m.vltotalbruto) / 100)) +
             coalesce(mi.valoricmsst, 0) - coalesce(mi.vldesconto, 0))) AS NUMERIC(11,2))) AS vltotal,
             CAST((sum((coalesce(mi.baseicms, 0)))) AS NUMERIC(11,2)) as baseicms,
             CAST((sum(mi.vlicms)) AS NUMERIC(11,2)) as vlicms,
             m.situacao, SUBSTRING(nf.modelo from 1 for 2), mi.cfop
      FROM mov_movimento m
             JOIN mov_nf nf                on (m.cod= nf.cod)
             JOIN pes_pessoas p            on (m.codclifor = p.cod)
             join g_tpmovimento tp         on (m.codtpmovimento = tp.cod)
             join mov_movitens mi          on (m.cod = mi.codmovimento)
      WHERE m.dataemissao >= :INICIO AND m.dataemissao <= :fim and m.codempresa = :codempresa
      GROUP BY p.cnpj_cpf, p.insc_rg, p.tpinsc, m.dataemissao, nf.uf, m.numdocumento,
               mi.percicms, m.situacao, nf.modelo,mi.cfop, m.vltotalbruto

_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB