Relatorio com coluna de pocentagem

Delphi

22/10/2012

Pessoal tenho um relatório em Report Builder com as seguintes colunas:

Cliente Peso Valor Total

No final do relatório tem a soma do peso e do valor total, porém preciso colocar uma coluna com o valor médio do peso, ou seja, valor total / peso e outra com a porcentagem do valor total, ou seja, valor total / soma total do valor / 100

Não estou conseguindo, alguém pode me ajudar, ou já fez algo parecido.





Valdecir Peres

Valdecir Peres

Curtidas 0

Respostas

Valdecir Peres

Valdecir Peres

22/10/2012


Ninguém
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

22/10/2012


Ninguém


Seja um pouco mais expecifico ao que precisa, que talvez eu possa te ajudar.


Cliente Peso Valor Total

Isto é para academia?

o peso, é peso da Passoa?

onde valor total, é valor total de quê?
vc quer saber o peso médio a partir de qual valor?

o percentual vc cita do valor total, mas qual é este valor total?

este valores, peso e valor total esta em uma tabela?
GOSTEI 0
Tiago

Tiago

22/10/2012

Poderia usar a forma convecional de conversão usando o cálculo da porcentagem para as novas colunas.
GOSTEI 0
Alisson Santos

Alisson Santos

22/10/2012

Uma coisa interessante se ser feito é utilizar o banco de dados para isso, criando uma coluna nova no seu select passando calculando a porcentagem e ai no reportbuilder era só dar a formatação que preferir.
GOSTEI 0
Valdecir Peres

Valdecir Peres

22/10/2012

Bem pessoal, vamos ver se consigo ser mais claro.
Tenho uma tabela com diversas colunas, porém preciso montar um relatório por período demonstrando a movimentação existente conforme abaixo:
1 2
Cliente Peso Rec. % Valor Valor Médio Qtde.
xxxxxx 10.500,000 73,991 8.000,00 1,313 1.500
yyyyyy 40,500 0,285 200,00 0,203 20
wwww 1.000,000 7,047 900,00 1,111 2.520
zzzzzzz 2.650,400 18,677 1.100,00 2,409 986
Total 14.190,900 100,000 10.200,00 5,036 5.026

1 – Como calcular a porcentagem ?? – (peso rec /peso total) * 100
2 – Como calcular o valor médio ??? – (peso rec /valor)

A soma do total é tranquilo o próprio report faz, porém os outros cálculos não sei como fazer, já criei um dataset e consegui fazer a soma da qtde e peso rec por cliente, porém, na parte da porcentagem e do valor médio não sei como fazer.

Abraço

Valdecir
GOSTEI 0
Valdecir Peres

Valdecir Peres

22/10/2012

Bem pessoal, vamos ver se consigo ser mais claro.
Tenho uma tabela com diversas colunas, porém preciso montar um relatório por período demonstrando a movimentação existente conforme abaixo:
1 2
Cliente Peso Rec. % Valor Valor Médio Qtde.
xxxxxx 10.500,000 73,991 8.000,00 1,313 1.500
yyyyyy 40,500 0,285 200,00 0,203 20
wwww 1.000,000 7,047 900,00 1,111 2.520
zzzzzzz 2.650,400 18,677 1.100,00 2,409 986
Total 14.190,900 100,000 10.200,00 5,036 5.026

1 – Como calcular a porcentagem ?? – (peso rec /peso total) * 100
2 – Como calcular o valor médio ??? – (peso rec /valor)

A soma do total é tranquilo o próprio report faz, porém os outros cálculos não sei como fazer, já criei um dataset e consegui fazer a soma da qtde e peso rec por cliente, porém, na parte da porcentagem e do valor médio não sei como fazer.

Abraço

Valdecir
GOSTEI 0
Valdecir Peres

Valdecir Peres

22/10/2012

Bem pessoal, vamos ver se consigo ser mais claro.
Tenho uma tabela com diversas colunas, porém preciso montar um relatório por período demonstrando a movimentação existente conforme abaixo:
1 2
Cliente Peso Rec. % Valor Valor Médio Qtde.
xxxxxx 10.500,000 73,991 8.000,00 1,313 1.500
yyyyyy 40,500 0,285 200,00 0,203 20
wwww 1.000,000 7,047 900,00 1,111 2.520
zzzzzzz 2.650,400 18,677 1.100,00 2,409 986
Total 14.190,900 100,000 10.200,00 5,036 5.026

1 – Como calcular a porcentagem ?? – (peso rec /peso total) * 100
2 – Como calcular o valor médio ??? – (peso rec /valor)

A soma do total é tranquilo o próprio report faz, porém os outros cálculos não sei como fazer, já criei um dataset e consegui fazer a soma da qtde e peso rec por cliente, porém, na parte da porcentagem e do valor médio não sei como fazer.

Abraço

Valdecir
GOSTEI 0
Alisson Santos

Alisson Santos

22/10/2012

Amigo como eu falei utiliza o banco para para o retorno de informações, utiliza procedure ou views que é mais facil depois trabalhar com o relatório.

Precisando de auxilio me add ai alisson@uniontecnologia.com.br
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

22/10/2012

Na configuração do relatório você coloca no detail um componente chamado variável e escolhe o tipo Duplo pra ele.
Depois você vai na aba cálculo, no grupo detail, seleciona a variável, clica com o botão direito e depois em novo.
Vai criar embaixo uma parte pra digitar código (Value := ). Aí é só você colocar a fórmula.
Value := (Pipe['peso_rec'] / Pipe['peso_total']) * 100;

Depois coloca mais uma variável para fazer o outro cálculo.

Como não sei os nomes dos campos nem do pipeline, você tem que trocar ali na fórmula.
Pra saber se não tem erro, você clica na variável com o botão direito em variáveis em detalhe e depois em compilar.
Se tiver algum erro vai aparecer uma mensagem bem embaixo.
GOSTEI 0
Valdecir Peres

Valdecir Peres

22/10/2012

Pessoal obrigado pela atenção.

Segui a orientação da Claudiadnh, porém ao gerar o relatório o valor da porcentagem vem zero
Segue abaixo procedure :

procedure porcentagemOnCalc(var Value: Variant);
begin
Value := (peso/total)*100;
end;

Compilo normal, onde esta o erro

Abraço

Valdecir
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

22/10/2012

Esse peso e total são campos já do próprio relatório? O certo é você ligar nos campos do Pipeline.

Nesse print coloquei a aba cálculo do report builder. Está vendo do lado direito embaixo o campos?
Aí eu arrastei o campo CNPJ ali no Value := pipGeral['CPF_CNPJ'];

[url]http://ow.ly/i/13YFi [/url]

Fiz isso só pra demonstrar o uso dos campos. No meu caso se eu tivesse os campos peso e total no banco de dados, a fórmula ficaria assim: Value := pipGeral['peso'] / pipGeral['total'] / 100;

Pessoal obrigado pela atenção.

Segui a orientação da Claudiadnh, porém ao gerar o relatório o valor da porcentagem vem zero
Segue abaixo procedure :

procedure porcentagemOnCalc(var Value: Variant);
begin
Value := (peso/total)*100;
end;

Compilo normal, onde esta o erro

Abraço

Valdecir
GOSTEI 0
Valdecir Peres

Valdecir Peres

22/10/2012

Claudia, muito obrigado pela atenção

O campo "peso" é do pipeline o "total" é um DBcalc que faz a soma do campo peso.

Tem como funcionar ??

abraço

Valdecir
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

22/10/2012

Tem como funcionar sim. Isso deve estar acontecendo por que quando é DBCalc você tem que usar o .value.
Exemplo:

Value := (peso.value / total.value) * 100;



Claudia, muito obrigado pela atenção

O campo "peso" é do pipeline o "total" é um DBcalc que faz a soma do campo peso.

Tem como funcionar ??

abraço

Valdecir
GOSTEI 0
Valdecir Peres

Valdecir Peres

22/10/2012

Claudia,

Funcionou,porém esta calculando errado, veja abaixo como fica


Peso Porcentagem
40 100,00%
40 50,00%
40 33,33%
Total 120


Deveria aparecer 33,33% em todos, já coloquei para calcular no final do relatório, só que desta forma os valores ficam zerado.
Só mais uma dúvida, tem como somar a coluna de porcentagem ??

Abraço

valdecir
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

22/10/2012

Agora que tive tempo de fazer um exemplo.
O ideal mesmo, para o relatório ficar mais rápido, é evitar os campos calculados.
Fiz um exemplo com os cálculos direto na sentença SQL.
Esse exemplo está com base no meu entendimento sobre suas explicações.
Qualquer dúvida é só postar novamente.

[url]www.cdnweb.com.br/ExemploReport.rar[/url]
GOSTEI 0
Marco Salles

Marco Salles

22/10/2012

Agora que tive tempo de fazer um exemplo.
O ideal mesmo, para o relatório ficar mais rápido, é evitar os campos calculados.
Fiz um exemplo com os cálculos direto na sentença SQL.
Esse exemplo está com base no meu entendimento sobre suas explicações.
Qualquer dúvida é só postar novamente.

[url]www.cdnweb.com.br/ExemploReport.rar[/url]


Muito prestativa e entendida esta menina , não ???
GOSTEI 0
Valdecir Peres

Valdecir Peres

22/10/2012

Claudia mais uma vez obrigado pela atenção.

Hoje estou com o dia corrido, mas vou olhar seu exemplo e retorno pra falar algo.

Marco com certeza a Claudia é 1000.

Abraço
GOSTEI 0
Valdecir Peres

Valdecir Peres

22/10/2012

Claudia, tudo bem ?

Fui olhar seu exemplo, mas infelizmente não tenho Firebird e nunca mexi com o mesmo, minha base é Mysql.

A minha estrutura para montar o relatório esta da seguinte forma:

TSQLQuery
TClientDataSet
TDataSource

Uso a Query para montar os grupos e posteriormente gravo em um ClientDataSet para puxar o relatório conforme código abaixo:
  with QRitens do
   begin
    close;
    sql.clear;
    sql.add ('select (clente)as cliente, sum(peso)as peso, sum(qtde) as qtde from  itensordserv');
    sql.add ('WHERE datainproc>=:DTPinicio and datainproc<=:DTPfinal group by cliente order BY cliente');
    Params.ParamByName('DTPinicio').AsDate :=DTPinicio.Date;
    Params.ParamByName('DTPfinal').AsDate  :=DTPfinal.Date;
    open;
   end;
   cdsrecitens.Open;
   cdsrecitens.EmptyDataSet;
   QRitens.First;
   while not QRitens.Eof do
    Begin
      cdsrecitens.Insert;
      cdsrecitenstratamento.Value := QRitens.FieldByName('tratamento').Value;
      cdsrecitenspeso.Value       := QRitens.FieldByName('peso').Value;
      cdsrecitensqtde.Value       := QRitens.FieldByName('qtde').Value;
      cdsrecitens.Post;
      QRitens.Next;
    End;


Porém após formar os grupos, não sei como faz para somar os mesmos e calcular a porcentagem de cada um.

Abraço
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

22/10/2012

Refiz o exemplo com o MySQL.
[url]www.cdnweb.com.br/ExemploReportMySql.rar[/url]

Tem um arquivo chamado alunos.sql que é o backup do BD que eu criei pra fazer o exemplo.
Estou usando o componente AdoConnection juntamente com um ODBC chamado alunos.
GOSTEI 0
Valdecir Peres

Valdecir Peres

22/10/2012

Claudia,

É exatamente o que estou querendo, mas desculpe, não entendi onde calcula.

Abraço
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

22/10/2012

O cálculo está na própria sentença SQL do componente Query.
Dá uma olhadinha na propriedade SQL.

Claudia,

É exatamente o que estou querendo, mas desculpe, não entendi onde calcula.

Abraço
GOSTEI 0
Valdecir Peres

Valdecir Peres

22/10/2012

Claudia, tudo bem ??

Olhei a sentença SQL , mas não sei como adaptar isto aqui.

Como te falei tenho uma tabela com N colunas, onde filtro por período conforme post abaixo:


A minha estrutura para montar o relatório esta da seguinte forma:

TSQLQuery
TClientDataSet
TDataSource

Uso a Query para montar os grupos e posteriormente gravo em um ClientDataSet para puxar o relatório conforme código abaixo:
  with QRitens do
   begin
    close;
    sql.clear;
    sql.add ('select (clente)as cliente, sum(peso)as peso, sum(qtde) as qtde from  itensordserv');
    sql.add ('WHERE datainproc>=:DTPinicio and datainproc<=:DTPfinal group by cliente order BY cliente');
    Params.ParamByName('DTPinicio').AsDate :=DTPinicio.Date;
    Params.ParamByName('DTPfinal').AsDate  :=DTPfinal.Date;
    open;
   end;
   cdsrecitens.Open;
   cdsrecitens.EmptyDataSet;
   QRitens.First;
   while not QRitens.Eof do
    Begin
      cdsrecitens.Insert;
      cdsrecitenstratamento.Value := QRitens.FieldByName('tratamento').Value;
      cdsrecitenspeso.Value       := QRitens.FieldByName('peso').Value;
      cdsrecitensqtde.Value       := QRitens.FieldByName('qtde').Value;
      cdsrecitens.Post;
      QRitens.Next;
    End;



Como eu somo os grupos antes de transferir para o ClientDataSet e desta forma calcular a porcentagem.

Abraço
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

22/10/2012

Cola aqui o script da sua tabela pra eu criar no meu MySQL. Vai ficar mais fácil ajudar.
GOSTEI 0
Valdecir Peres

Valdecir Peres

22/10/2012

Claudia, mandei no seu e-mail

Abraço
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

22/10/2012

Não chegou. Email: claudiadnh@gmail.com.
Claudia, mandei no seu e-mail

Abraço
GOSTEI 0
Valdecir Peres

Valdecir Peres

22/10/2012

Claudia foi para este e-mail mesmo (claudiadnh@gmail.com)

Assunto - Fórum DevMedia(Relat. com porcentagem)

Abraço
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

22/10/2012

Não estou vendo razão pra usar o ClientDataSet nesse seu caso, já que todos os cálculos podem ser feitos direto na sentença SQL. Pra mim o código ficaria somente assim:

with QRitens do
begin
close;
sql.Text := 'SELECT CLIENTE, SUM(PESO) PESO, SUM(PESO * 100 / (SELECT SUM(PESO) FROM itensordservpht)) AS PESO_PERC, ' +
                '       SUM(PESO / VALOR) AS VALOR_MEDIO, SUM(VALOR), SUM(QTDE) ' +
                '  FROM itensordservpht ' +
                ' WHERE (datainproc >=:DTPinicio) ' +
                '   AND (datainproc <=:DTPfinal) ' +
                'GROUP BY CLIENTE ';
Params.ParamByName('DTPinicio').AsDate :=DTPinicio.Date;
Params.ParamByName('DTPfinal').AsDate :=DTPfinal.Date;
open;
end;


Depois desse código chamaria o relatório, eliminando tudo que está depois.
GOSTEI 0
Valdecir Peres

Valdecir Peres

22/10/2012

Claudia, tudo bem ???

Legal funcionou, só tive que fazer uma correção, pois estava calculando a porcentagem pelo total da tabela.

Ficou assim:
'sum(peso * 100 / (select sum(peso) from itensordservpht WHERE (datainproc >=:DTPinicio)'+
'and (datainproc <=:DTPfinal))) as peso_porc, '

Anterior

SUM(PESO * 100 / (SELECT SUM(PESO) FROM itensordservpht))


Quanto a puxar o relatório após o código, estou recebendo esta mensagem de erro

Exception class EDatabaseError with message 'Operation not allowed on a unidirectional dataset'.

Aproveitando sei que foge um pouco do assunto, mas qual o tipo de campo indicado para

“peso e valor financeiro” uso FLOAT porém no seu exemplo observei que você usou DOUBLE.

Abraço
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

22/10/2012

Ah, agora entendi o porquê do ClientDataSet, é por que você usa os componentes da DBExpress, então está certo, tem que usar mesmo. Sobre o Double, é que como eu uso muito o Firebird e nele o certo é Double Precision, eu criei no MySQL com o mesmo tipo, mas tanto faz, o resultado nesse caso será o mesmo.

Claudia, tudo bem ???

Legal funcionou, só tive que fazer uma correção, pois estava calculando a porcentagem pelo total da tabela.

Ficou assim:
'sum(peso * 100 / (select sum(peso) from itensordservpht WHERE (datainproc >=:DTPinicio)'+
'and (datainproc <=:DTPfinal))) as peso_porc, '

Anterior

SUM(PESO * 100 / (SELECT SUM(PESO) FROM itensordservpht))


Quanto a puxar o relatório após o código, estou recebendo esta mensagem de erro

Exception class EDatabaseError with message 'Operation not allowed on a unidirectional dataset'.

Aproveitando sei que foge um pouco do assunto, mas qual o tipo de campo indicado para

“peso e valor financeiro” uso FLOAT porém no seu exemplo observei que você usou DOUBLE.

Abraço
GOSTEI 0
Valdecir Peres

Valdecir Peres

22/10/2012

Claudia, muito obrigado mesmo, você me ajudou muito.

Abraços
GOSTEI 0
POSTAR