Fórum Soma no FastReport no código do componente #454216

04/09/2013

0

Pessoal,

Ajudem-me, por favor.

Estou compilando o código abaixo no componente do FastReport, porém apresenta o erro:
'''' is not a valid floating point value

procedure Memo11OnBeforePrint(Sender: TfrxComponent);
var
resultado, total, total_fat : double;
                                          
begin
total := StrToFloat(fdsRelatTOTAL_FAT.Value);                 
total_fat := StrToFloat(Memo12.Value);
resultado := total / total_fat;
Memo11.Text := FloatToStr(resultado);                                                                    
end;
Elton Ésqui

Elton Ésqui

Responder

Posts

04/09/2013

Marcos Oliveira

Elton,

Porque você não insere um componente "Texto do Sistema" e faz a função dentro dele? Você pode criar uma função personalizada, além das básicas de agregação.

Att,

Marcos
Responder

Gostei + 0

05/09/2013

Elton Ésqui

Bem que eu tentei passar pelo frxRelatorioGetValue, mas como o total do campo é o mesmo então não deu muito certo.

O relatório deve ser assim:
Cli---Nome-----Total------Part.%
01----Joao-----950,00-----32,76%
02----José-----750,00-----25.86%
03----Maria----650,00-----22.41%
04----Pedro----550,00-----18.97%

Total---------2900,00-----------

Neste caso, para obter o % deveria pegar o valor 950,00 e dividir pelo total. E os demais a mesma coisa.
Responder

Gostei + 0

05/09/2013

Marcos Oliveira

Elton, porque você já não faz a conta antes de imprimir, e só vincula as porcentagens no FastReport?
Responder

Gostei + 0

05/09/2013

Elton Ésqui

Eu tentei isso no BeforePrint, igual lá no primeiro post.
Mas deu algum erro.
Responder

Gostei + 0

05/09/2013

Marcos Oliveira

Eu quis dizer pra você criar um campo com as porcentagens, já calculadas, gravar tudo antes de chamar o relatório e depois vincular esse campo no Fast Report.
Responder

Gostei + 0

05/09/2013

Elton Ésqui

Havia feito assim também, mas não sei se essa lógica está muito coerente.

procedure TDMForm.frxRelatorioGetValue(const VarName: string; var Value: Variant);
var
  total, total_fat, resultado : Double;
begin
  total_fat := sdsRelat.FieldByName('TOTAL_FAT').AsFloat;
  total := 0;
  while not sdsRelat.Eof do
  begin
    total := total + sdsRelat.FieldByName('TOTAL_FAT').AsFloat;
    sdsRelat.Next;
    resultado := total_fat / total;
  end;

  if CompareText(VarName, 'Acumulado') = 0 then
  begin
    Value := FormatFloat('#,##0', resultado);
  end;

end;
Responder

Gostei + 0

06/09/2013

Elton Ésqui

Não está dando certo porque estou somando o total de cada registro direto no SQL?
Seria melhor fazer a consulta normal e depois somar com o código acima?

SELECT 
  C.CODIGO,
  C.NOME,
  SUM(N.TOTAL) AS TOTAL_FAT
FROM
  NRNOTA N
  INNER JOIN VRNATU OP ON (N.NATU_OPE = OP.CODIGO)
  INNER JOIN VRCLIE C ON (N.CLIENTE = C.CODIGO)
WHERE
  N.DATA_EMI BETWEEN :DATAINI AND :DATAFIN AND 
  N.ORIG_NOTA IN ('1','2') AND 
  N.FLAG_EMI = 1 AND 
  OP.MOVIMENTO = 'S'
GROUP BY
  C.CODIGO,
  C.NOME
ORDER BY TOTAL_FAT DESC
Responder

Gostei + 0

13/09/2013

Elton Ésqui

O intuito disso tudo é realizar a Curva ABC da seleção.
Alguém teria alguma ideia?
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar