Completed

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

Published on the January 17, 2018 in IT & Programming

About this project

Open

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)

Category IT & Programming
Subcategory Web development
What is the scope of the project? Small change or bug
Is this a project or a position? Project
I currently have I have specifications
Required availability As needed
Experience in this type of projects Yes (I have managed this kind of project before)
Roles needed Developer

Delivery term: January 24, 2018

Skills needed

Other projects posted by M. C.