Ir para conteúdo
  • Cadastre-se

dev botao

problema no rldbresult -fortes report


  • Este tópico foi criado há 2650 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Fundadores

A versão anterior não é compatível com o ACBr trunk2...

Tente debugar e envie a correção para o Projeto Fortes Report CE...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Consegui Ajustar , pegando a versão antiga do Fortes .. talvez a forma que fiz . nao seja a ideal . mais se tiver alguém ai que possa ajudar .. so sei que funcionou agora . sem dar erros .

 

Toda vez que eu pedia pra usar o RLDBResult e colocava uma formula de divisao . por exemplo . (LUCRO / VENDA) * 100 para trazer a margem ... qndo o valor nos registros eram zerados . estava dando erro .. agora fiz essa correcao ai . nao da mais erro . e funciona legal .

Se tiver alguém ai que possa analisar e postar la o GitHub do Fortes eu agradeço .

 

Adilson Pazzini .

 

RLParser.pas

Link para o comentário
Compartilhar em outros sites

function Empty(Value:variant):boolean;
begin
  Result:=VarIsNull(Value) or VarIsEmpty(Value);
end;

function NullIf(Value:variant):variant;
begin
  if Empty(Value) then
    Result:=0
  else
    Result:=Value;
end;

function DivideParams(p1,p2:variant):variant;
begin
  if Empty(p1) and Empty(p2) then
    Result:=Null
  else
   if P2<>0 then
    Result:=NullIf(p1)/NullIf(p2);
end;

 

Foi adicionado as funcoes acima e alterado a Funcao abaixo :

function TRLExpressionParser.EvalNode(ANode: TRLParserNode): variant;

 de 

  opDivide: Result := ANode.Children[0].Eval / ANode.Children[1].Eval;

para:
    opDivide: Result := DivideParams(ANode.Children[0].Eval,ANode.Children[1].Eval);      

Link para o comentário
Compartilhar em outros sites

Então Daniel , ate faço isso a nível de registros , porem estou usando o RlDBResult para calcular resultado final ... o exemplo que estou tendo problemas , justamente e um relatório de venda diária , onde que quando tem venda ele ja traz a margem calculando o

 

(lucro / valor_venda) * 100 . e ai estava fazendo isso para o Resultado Final ... e nao o por dia . que ja faço esses calculos na propria QUERY .utilizando iif da vida pra nao dar esse erro de divisao . qndo nao existir venda no dia ..

 

Usando a Propriedade RLDBResult.DataFormula := '((SUM(LUCRO_NOVOS)/SUM(VRVENDA_NOVOS))*100)';

e setando a propriedade RLDBResult.Info := riSimple; .

So se no informar essa RLDBResult.DataFormula eu poder jogar um iif .. tentei mais nao deu certo . unica forma que encontrei foi ajustando essas rotinas . incluive . o erro que apresenta e o "External:SIGFPE"  no lazarus .

 

Desde ja agradeço .

 

Adilson Pazzini .

Link para o comentário
Compartilhar em outros sites

Então .. ai não seria algo que eu estou controlando , pois se trata de uma margem calculada do resultado de vários registros .. por exemplo
 Data              Valor Venda    Lucro      Margem
 01/07/2017     150,00           35,00     23,33%
 02/07/2017     100,00            10,00    10,00%
 03/07/2017         0,00              0,00      0,00    - Não Houve Venda - Porem Preciso informar esse registro .(Aqui ele da o erro por causa do Formula que ponho no RLDBResult .
 04/07/2017      120,00           32,00    26,67%
 05/07/2017        80,00           16,00    20,00%
-----------------------------------------------------
TOTAL :            450,00             93,00   20,66% -> Aqui uso RLDBResult .
 e na propriedade Info:=riSimple e a propriedade DataFormula e informo "((SUM(LUCRO)/SUM(VALORVENDA))*100)" . e ai por causa daquele item que esta zerado . o FORTES fica dando erro ... se tiver o registro 03/07/2017 . nao tive-se vazio . ele nao da erro .

por isso fiz essa correção . e queria ver se alguém poderia implementa-la .

desde ja agradeço

Adilson Pazzini

 

Link para o comentário
Compartilhar em outros sites

Pelo Github me responderam que da pra fazer assim :

 Uma função para o expressionparser é uma expressão associada a um símbolo com parâmetros,
 na forma: "NOME(P1,P2,...,Pn)=EXPRESSÃO".
 Ex.: Min(p1,p2)=If(p1<p2,p1,p2)

No seu caso seria IF(SUM(VALORVENDA)>0,((SUM(LUCRO)/SUM(VALORVENDA))*100),0)

e funcionou .

 

Agradeço

 

Adilson Pazzini

Editado por adilsonpazzini
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2650 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...