Gravar na tabela em modo de edição (ou algo assim)???

Delphi

30/09/2010

Caros

No código abaixo, como faço pra que o campo que adicionei aceit eo valor?

procedure TDMForm.frxRelatorioBeforePrint(Sender: TfrxReportComponent);
var
PV      : Double;
PC      : Double;
Margem  : Double;
begin
  PC := sdsProduto.FieldByName('PRECO_CUSTO').AsFloat;
  Margem := sdsProduto.FieldByName('MARGEM').AsFloat;
  PV := (PC * Margem)/100 + PC;
  sdsProduto.FieldByName('PV').Value := PV;
end;


No sdsProduto adicionei um novo campo (PV).
Ao abrir o relatório, gera o erro:

Erro(s) encontrado(s):
sdsProduto: Dataset not in edit or insert mode

Obrigado!
Elton Ésqui

Elton Ésqui

Curtidas 0

Respostas

Wilson Junior

Wilson Junior

30/09/2010

Teste assim
procedure TDMForm.frxRelatorioBeforePrint(Sender: TfrxReportComponent);
var
  PV, PC, Margem: Double;
begin
  PC := sdsProduto.FieldByName('PRECO_CUSTO').AsFloat;
  Margem := sdsProduto.FieldByName('MARGEM').AsFloat;
  PV := (PC * Margem)/100 + PC;
  sdsProduto.Edit;
  sdsProduto.FieldByName('PV').Value := PV;
  sdsProduto.Post;
end;


Espero ter colaborado.
GOSTEI 0
Ricardo Araujo

Ricardo Araujo

30/09/2010

boa tarde,


nosso colegar já respondeu sua pergunta, esta correto o que ele fez.
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

30/09/2010

Acho que não, pelo visto ele está tentando fazer este calculo, linha por linha da tabela, para mostrar no relatório. Se for isso, deve criar um campo calculado e no seu evento onCalcfield, colocar o seu calculo inicial, ou ainda fazer no próprio SQL este calculo.
GOSTEI 0
Wilson Junior

Wilson Junior

30/09/2010

Existem diversas maneiras de se fazer. Estou seguindo apenas a linha de raciocínio do colega que perguntou.
GOSTEI 0
Elton Ésqui

Elton Ésqui

30/09/2010

Opa

Então...o q preciso é o seguinte:
O campo que mostra o resultado da soma não existe, o que fiz foi calcular e por o resultado numa variável. Agora preciso somar todos esses resultados, como o Eriley comentou. Será exibido no relatório.

Olha o cód.

procedure TDMForm.frxRelatorioBeforePrint(Sender: TfrxReportComponent);
var
PV      : Double;
PC      : Double;
DifP    : Double;
Margem  : Double;
begin
  PC := sdsProduto.FieldByName('PRECO_CUSTO').AsFloat;
  Margem := sdsProduto.FieldByName('MARGEM').AsFloat;
  PV := (PC * Margem)/100 + PC;
  DifP := PV - PC;
  {sdsProduto.Edit;
  sdsProduto.FieldByName('PVENDA').Value := PV;
  sdsProduto.Post;}
  if PV = 0 then
  begin
    (frxRelatorio.FindObject('PV') as TfrxMemoView).Text := '-';
  end
  else
  (frxRelatorio.FindObject('PV') as TfrxMemoView).Text := 'R$ ' + FloatToStr(PV);
  if DifP = 0 then
  begin
    (frxRelatorio.FindObject('DifP') as TfrxMemoView).Text := '-';
  end
  else
  (frxRelatorio.FindObject('DifP') as TfrxMemoView).Text := 'R$ ' + FloatToStr(DifP);
  if PC = 0 then
  begin
    (frxRelatorio.FindObject('PRECO_CUSTO') as TfrxMemoView).Text := '-';
  end
  else
  (frxRelatorio.FindObject('PRECO_CUSTO') as TfrxMemoView).Text := 'R$ ' + FloatToStr(PC);
end;

GOSTEI 0
Eriley Barbosa

Eriley Barbosa

30/09/2010

Sim, mas o código que passou gravara apenas uma linha e não todas as linhas para exibir no relatório, para isso precisaria de um Loop.
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

30/09/2010

Você quer somar pv + difp + pc?
GOSTEI 0
Elton Ésqui

Elton Ésqui

30/09/2010

No rel exibe os resultados...
Só preciso da soma...
Veja a imagem. Onde destquei de vermelho é o lugar da soma da coluna!

O valor do custo consigo somar pq existe no BD. O preço de venda obtive calculando com o percentual da mergem, que tb tem no BD. A diferença obtive subtarindo o PV - PC.
A soma desses dois não tenho no BD.
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

30/09/2010

Vamos seguir a seguinte linha, a cada vez que imprimir pv ou diferença, incrementa uma variavel com o valor impresso, como o text no relatório estara numa area que não repete, será impresso só uma vez, logo podemos colocar o incremento cada vez que um valor for diferente de zero, que apesar de estar no beforeprint sera impresso somente a soma total.
Opa

Então...o q preciso é o seguinte:
O campo que mostra o resultado da soma não existe, o que fiz foi calcular e por o resultado numa variável. Agora preciso somar todos esses resultados, como o Eriley comentou. Será exibido no relatório.

Olha o cód.

procedure TDMForm.frxRelatorioBeforePrint(Sender: TfrxReportComponent);
var
PV, totpv      : Double;
PC, totpc      : Double;
DifP, totdifp    : Double;
Margem  : Double;
begin
  PC := sdsProduto.FieldByName('PRECO_CUSTO').AsFloat;
  Margem := sdsProduto.FieldByName('MARGEM').AsFloat;
  PV := (PC * Margem)/100 + PC;
  DifP := PV - PC;
  if PV = 0 then
    (frxRelatorio.FindObject('PV') as TfrxMemoView).Text := '-'
  else
  begin
    (frxRelatorio.FindObject('PV') as TfrxMemoView).Text := 'R$ ' + FloatToStr(PV);
    totpv := totpv + pv;
  end;
  if DifP = 0 then
    (frxRelatorio.FindObject('DifP') as TfrxMemoView).Text := '-'
  else
  begin
     (frxRelatorio.FindObject('DifP') as TfrxMemoView).Text := 'R$ ' + FloatToStr(DifP);
     totdifp := totdifp + DifP;
  end;
  if PC = 0 then
    (frxRelatorio.FindObject('PRECO_CUSTO') as TfrxMemoView).Text := '-'
  else
  begin
     (frxRelatorio.FindObject('PRECO_CUSTO') as TfrxMemoView).Text := 'R$ ' + FloatToStr(PC);
     totpc := totpc + PC;
  end;
  frxRelatorio.FindObject('TOT_PV') as TfrxMemoView).Text := 'R$ ' + FloatToStr(totpv);
  frxRelatorio.FindObject('TOT_DIFP') as TfrxMemoView).Text := 'R$ ' + FloatToStr(totdifp);
  frxRelatorio.FindObject('TOT_PC') as TfrxMemoView).Text := 'R$ ' + FloatToStr(totpc);
end;

GOSTEI 0
Aroldo Zanela

Aroldo Zanela

30/09/2010

Colega,   Coloque uma banda do tipo sumário (BandType = rbSummary) e solte uma componente TQRExpr e na propriedade Expression coloque: sum(Nome_campo).   Formate a exibição de seus campos de valores com ###,###,##0.00 para melhorar a leitura do relatório.
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

30/09/2010

Caro Aroldo a ferramenta de relatório utilizada é o FastReport e não o quickreport.
GOSTEI 0
Aroldo Zanela

Aroldo Zanela

30/09/2010

Colega,  
Caro Aroldo a ferramenta de relatório utilizada é o FastReport e não o quickreport.
  Obrigado pela correção.   Neste caso, adicione uma banda ReportSummry e com um componente "texto do sistema" efetue a parametrização para obter o resultado desejado.
GOSTEI 0
Elton Ésqui

Elton Ésqui

30/09/2010

Galera

Desisti de fazer pelo cód delphi e passei pelo SQL mesmo
SELECT 
  P.CODIGO,
  P.NOME,
  P.PRECO_CUSTO,
  P.MARGEM,
  P.PRECO_CUSTO * (1 + (P.MARGEM / 100)) AS PRECO_VENDA,
  P.PRECO_CUSTO * (1 + (P.MARGEM / 100)) - (P.PRECO_CUSTO) AS DIF_PRECO
FROM
  VRPROD P
WHERE
  P.CODIGO BETWEEN 1 AND 9999 AND 
  P.MARGEM IS NOT NULL AND 
  P.PRECO_CUSTO IS NOT NULL AND 
  P.MARGEM <> '0' AND 
  P.PRECO_CUSTO <> '0'
GROUP BY
  P.CODIGO,
  P.NOME,
  P.PRECO_CUSTO,
  P.MARGEM,
  PRECO_VENDA


Valeu
GOSTEI 0
Elton Ésqui

Elton Ésqui

30/09/2010

Como faço pra encerrar esse tópíco?
GOSTEI 0
Wilson Junior

Wilson Junior

30/09/2010

Após um período ele irá lhe perguntar se o tópico está encerrado.
GOSTEI 0
POSTAR