Impressão direta com Subtotal

Delphi

04/10/2014

Como fazer um relatório com subtotal por dia e impressão direta utilizando delphi e WriteLn.
BD em Firebird.

A dúvida maior é como ao ler a segunda descrição de cada dia e imprimir o subtotal e não ficar no loop eterno.
Ex.

Pesquisa de: 01/01/2014 a 03/01/2014

01/01/2014 - Descrição 1 - R$ 100,00
01/01/2014 - Descrição 2 - R$ 100,00
Total do dia: - R$ 200,00

02/01/2014 - Descrição 3 - R$ 200,00
02/01/2014 - Descrição 4 - R$ 200,00
Total do dia: - R$ 400,00

03/01/2014 - Descrição 5 - R$ 300,00
03/01/2014 - Descrição 6 - R$ 300,00
Total do dia: - R$ 600,00

Total Geral:R$ 1.200,00
Obrigado.
Jaaziel Ferreira

Jaaziel Ferreira

Curtidas 0

Respostas

Mauricio Rodrigues

Mauricio Rodrigues

04/10/2014

Vc está utilizando para Somar via SQL ou via While?

se For via while recomendo usar TStringlist para armazenar as informações necessária e no final passar para Writeln
GOSTEI 0
Jaaziel Ferreira

Jaaziel Ferreira

04/10/2014

Maurício to usando while pois cada registro precisa ir imprimindo.
Tens algum exemplo.?
GOSTEI 0
Mauricio Rodrigues

Mauricio Rodrigues

04/10/2014

Cola o Código seu, para analisar e adaptar para seu uso.
GOSTEI 0
Jaaziel Ferreira

Jaaziel Ferreira

04/10/2014

Maurício, segue o código.


procedure Tfrm0043_RelMovCaixa.Imprime;
var
vTOTALGERAL, vTOTAL5PERC, vSUBTOTAL, vSUBTOTAL5PERC : Currency;
vHistorico : String;
dataanterior,
datafinal,
datainicial : TDate;
fazer, subtotal, variosdias, fim : Boolean;
begin
try
cdsRelatorio.Close;
cdsRelatorio.SQL.Clear;
cdsRelatorio.SQL.Add('SELECT CM.CODCAIXA, '+
'CM.SEMANA, '+
'CM.DATAMOVIMENTO, '+
'CM.TIPORECEBIMENTO, '+
'CM.CODIMOVEL, '+
'I.NOME_IMOVEL, '+
'CM.CODDEPARTAMENTO, '+
'D.NOME_DEPARTAMENTO, '+
'D.SIGLAEXPANDIDA, '+
'CM.ENTRADA, '+
'CM.SAIDA_5_PERC, '+
'CM.SALDO, '+
'CM.SITUACAO '+
'FROM MOVCAIXA CM '+
'LEFT JOIN IMOVEL I ON (I.CODIMOVEL=CM.CODIMOVEL) '+
'LEFT JOIN DEPARTAMENTO D ON (D.CODDEPARTAMENTO=CM.CODDEPARTAMENTO) '+
'WHERE CM.DATAMOVIMENTO BETWEEN :DATAINI AND :DATAFIM '+
'ORDER BY CM.DATAMOVIMENTO, I.NOME_IMOVEL ');
cdsRelatorio.ParamByName('DATAINI').AsDateTime := XDataINI.DateValue;
cdsRelatorio.ParamByName('DATAFIM').AsDateTime := xDataFIM.DateValue;
cdsRelatorio.Open;

if cdsRelatorio.IsEmpty then
begin
MessageDlg('Não existe Lançamentos Neste Período.',mtInformation,[mbOK],0);
Exit;
end;
except
MessageDlg('Erro ao selecionar Movimento.',mtInformation,[mbOK],0);
Exit;
end;

try
fazer := True;
// subtotal := False;
datainicial := XDataINI.DateValue;
datafinal := xDataFIM.DateValue;

variosdias := False;
dataanterior := datafinal;
if datainicial <> datafinal then
begin
dataanterior := datainicial;
variosdias := True;
end;

btnImprimir.Enabled := False;
// frmImpressao := TfrmImpressao.Create(Application);
// frmImpressao.Limpa_Variaveis;
// frmImpressao.vTITULO := 'RELAÇÃO DO MOVIMENTO DO CAIXA';
// frmImpressao.vDATA := FormatDateTime('dd/mm/yyyy',Date)+' HORA: '+TimeToStr(Time);
// frmImpressao.vSEMANADESCRICAO := XDataINI.Text+' a '+xDataFIM.Text;

vSUBTOTAL := 0;
vSUBTOTAL5PERC := 0;
vTOTAL5PERC := 0;
vTOTALGERAL := 0;

cdsRelatorio.First;

if not cdsRelatorio.IsEmpty then
begin
while fazer do
begin
fim := False;

// Aqui tá loop eterno

if cdsRelatorio.FieldByName('DATAMOVIMENTO').AsDateTime < (datafinal+1) then
begin
vHistorico := vHistorico + PreencheComZeros(cdsRelatorio.FieldByName('CODIMOVEL').AsInteger,3)+
' - '+RetiraAcentos(cdsRelatorio.FieldByName('NOME_IMOVEL').AsString)+
' - R$ '+Format('%9.30s',[FormatFloat('###,###,##0.00',cdsRelatorio.FieldByName('ENTRADA').AsFloat)])+ #10+#13;

vSUBTOTAL := vSUBTOTAL + cdsRelatorio.FieldByName('ENTRADA').AsFloat;
vSUBTOTAL5PERC := vSUBTOTAL5PERC + cdsRelatorio.FieldByName('SAIDA_5_PERC').AsFloat;
end
else
begin
fim := True;
end;

If cdsRelatorio.Eof or fim = True then
begin
If dataanterior <> cdsRelatorio.FieldByName('DATAMOVIMENTO').AsDateTime then
begin
vHistorico := vHistorico + '------------------------------------------------' + #10+#13+
' Valor Total do Dia '+DateToStr(dataanterior)+'.: '+Format('%9.30s',[FormatFloat('###,###,##0.00',vSUBTOTAL)])+ #10+#13+
' Valor Concedido 5%.: '+Format('%9.30s',[FormatFloat('###,###,##0.00',vSUBTOTAL5PERC)])+ #10+#13+
'------------------------------------------------';
// vTOTALGERAL := vTOTALGERAL + vSUBTOTAL;
// vTOTAL5PERC := vTOTAL5PERC + vSUBTOTAL5PERC;
end;

vHistorico := vHistorico + '------------------------------------------------' + #10+#13+
' Valor Total do Periodo .: '+Format('%9.30s',[FormatFloat('###,###,##0.00',vTOTALGERAL)])+ #10+#13+
' Valor Concedido 5%.: '+Format('%9.30s',[FormatFloat('###,###,##0.00',vTOTAL5PERC)])+ #10+#13+
' --------------------------'+ #10+#13+
' Valor Real no Caixa: '+Format('%9.30s',[FormatFloat('###,###,##0.00',vTOTALGERAL-vTOTAL5PERC)])+ #10+#13+
'------------------------------------------------';
fazer := false;

end;

If variosdias then
begin
If dataanterior <> cdsRelatorio.FieldByName('DATAMOVIMENTO').AsDateTime then
begin
vHistorico := vHistorico + '------------------------------------------------' + #10+#13+
' Valor Total do Dia '+DateToStr(dataanterior)+'.: '+Format('%9.30s',[FormatFloat('###,###,##0.00',vSUBTOTAL)])+ #10+#13+
' Valor Concedido 5%.: '+Format('%9.30s',[FormatFloat('###,###,##0.00',vSUBTOTAL5PERC)])+ #10+#13+
'------------------------------------------------';
vTOTALGERAL := vTOTALGERAL + vSUBTOTAL;
vTOTAL5PERC := vTOTAL5PERC + vSUBTOTAL5PERC;

dataanterior := cdsRelatorio.FieldByName('DATAMOVIMENTO').AsDateTime;
vTOTALGERAL := 0;
vTOTAL5PERC := 0;
end;
end;

cdsRelatorio.Next;
end;

end
else
begin
MessageDlg('Não existe Lançamentos Neste Período.',mtInformation,[mbOK],0);
btnImprimir.Enabled := True;
Exit;
end;


// frmImpressao.vHISTORICO := vHistorico;
// frmImpressao.vTOTAL_CONGREGACAO := vTOTAL_CONGREGACAO;
// frmImpressao.Imprime;
// frmImpressao.btnListar.Click;
// frmImpressao.btnImpressao.Click;
// frmImpressao.btnCortar.Click;
// frmImpressao.Limpa_Variaveis;
//fim autenticar na impressora;
finally
// frmImpressao.Free;
btnImprimir.Enabled := True;
end;
end;


O problema que não consigo dar o subtotal do dia.
Eu utilizei a variavel vHistorico pra ficar mais facil a conferencia.
O que preciso é que cada registro seja impresso na impressora 40 colunas. Mas, isso é o de menos.
O que acontece com esse código, é que, o último registro repete duas vezes.

Obrigado.
GOSTEI 0
POSTAR