Realizado

Firebird 3 - Substituição de Função Dzero (rfunc.dll)

Publicado em 17 de Janeiro de 2018 dias na TI e Programação

Sobre este projeto

Aberto

Estou convertendo meu banco de dados FIREBIRD 2.5 para FIREBIRD 3.0
Utilizava algumas funções de rfunc.dll e outras dll's. Fiz todas as conversões, exceto da função DZERO.
Meu banco de dados já está funcionando perfeitamente no FIREBIRD 3.0, mas utilizando a versão de 32 bits, somente por causa da função DZERO. Não achei a rfunc.dll 64 bits. Mesmo achando, gostaria de substituir a função DZERO por outra compatível/apropriada.

A função Dzero faz a divisão de um campo por outro e retorna 0, não dá erro de divisão por 0, quando o divisor for nulo ou zero. dzero(dividendo, divisor, 0) = retorna dividendo/divisor, ou 0 (se divisor é nulo ou 0).
Num select posso substituir facilmente por um case:
Dzero(p.preco_venda, p.preco_compra, 0) as margem_venda
// pode ser substituído por:
case when (p.Preco_compra = 0)
    then 0
    else (p.preco_venda / p.preco_compra)
END margem_venda

Meu problema está em substituir a função na cláusula WHERE. Tenho algumas rotinas com o DZERO na cláusula. Vou colocar apenas 1 exemplo.
Funcionando aqui, vai funcionar nas outras e vou poder passar a utilizar o FIREBIRD 3.0 64 bits.

- Exemplo de Select, onde quero substituir o dzero da cláusula where:
select count(p.Id_produto) as ntite, sum(ps.Quantidade) as ntest,
sum(ppe.Preco_venda * ps.quantidade) as ntvto,sum(ps.valor) as NTCTO,
min(ppe.preco_venda) as NTVMI, avg(ppe.preco_venda) as NTVME, max(ppe.preco_venda) as NTVMA,
min(p.preco_compra) as NTCMI, avg(p.preco_compra) as NTCME, max(p.preco_compra) as Ntcma
from es_produto p
left join es_prosaldo ps on p.ID_PRODUTO = PS.ID_PRODUTO AND ps.id_empresa=:Ide and ps.ID_TIPO_ESTOQUE=:Idt
inner join es_grupo g on g.Id_grupo = p.id_grupo
inner join es_marca m on m.Id_marca = p.id_marca
left join es_preco_empresa ppe on ppe.id_empresa = :Ide and ppe.id_produto=p.id_produto
left join ge_pessoa f on f.id_pessoa = p.id_fornecedor
WHERE p.estoque = 'S' AND p.id_grupo = 1 And ps.quantidade <> 0 and (dzero(p.preco_venda, p.preco_compra, 0) BETWEEN 1 and 3)

Categoria TI e Programação
Subcategoria Programação
Qual é o alcance do projeto? Bug ou alteração pequena
Isso é um projeto ou uma posição de trabalho? Um projeto
Tenho, atualmente Eu tenho especificações
Disponibilidade requerida Conforme necessário
Experiência nesse tipo de projeto Sim (Eu já gerenciei esse tipo de projeto)
Funções necessárias Desenvolvedor

Prazo de Entrega: 24 de Janeiro de 2018

Habilidades necessárias

Outro projetos publicados por M. C.