Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tatiane.InterArt

Relatório Diário de Caixa Entrada/Saída

Recommended Posts

Tenho duas tabelas:

 

EntCaixa

Codigo (Varchar)

Descricao (Varchar)

Valor (Varchar)

DataVecto (Varchar)

DataRecto (Varchar)

Tipo (Varchar)

Cx (Varchar)

 

SaiCaixa

Codigo (Varchar)

Descricao (Varchar)

Valor (Varchar)

DataVecto (Varchar)

DataPagto (Varchar)

Tipo (Varchar)

Cx (Varchar)

 

Preciso gerar um relatório com duas colunas, sendo em uma delas o EntCaixa e na outra o SaiCaixa tentei várias formas mas não consegui, alguém poderia me ajudar?

Lembrando que esse relatório é diário e não necessita ser ordenado por nenhum tipo de informação, apenas exibir Entrada e Saída de caixa em colunas diferentes como em um livro de caixa!

 

Agradeço antecipadamente!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, depois de tanto quebrar a cabeça usei um método que dá um pouco de trabalho, mas que funciona:

 

printer.canvas.textout()

 

Fora que criei uma tabela temporária auxiliar para facilitar no momento de carregar os dados...

 

Valeu todas as dicas pessoal e fica aí essa minha dica também!

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal aí vai uma outra forma que dá menos trabalho e fica jóinha também!

 

Apesar de não ser o caso, que é mais simples - tratando apenas 01 dia

- fazer uma querie que agrupe os valores das duas tabelas gerando um resultado que tem as colunas Data, Valor da Entrada, Valor da Saída e Saldo na data; Fora outras facilidades, esta consulta evitará o uso de cálculos manuais;

- esta consulta será utilizada como fonte de dados para filtrar os lançamentos nas tabelas EntCaixa e SaiCaixa, baseado (filtrado) na data;

 

Em termos de quickreport, definiríamos sua propriedade DataSet com a consulta baseada na data e utilizaríamos:

- uma banda Detail para percorrer a primeira consulta, baseada na data (haverá um registro/linha por data);

- uma banda Sub-Detail para percorrer os lançamentos em ambas as tabelas, EntCaixa e SaiCaixa, paralelamente. Para isto, não definimos sua propriedade DataSet e fazemos uso do evento OnNeedData;

- uma banda Sumary para fazer a totalização por Entrada e Saída, bem como apresentação do Saldo;

 

Vamos a consulta principal (IBQryRegistros):

CODE

select Data, SUM(VlEntrada) VlEntrada, SUM(VlSaida) VlSaida, SUM(VlEntrada -VlSaida) VlSaldo

from

(select E.DataRecto as Data, Valor as VlEntrada, 0 as VlSaida

from EntCaixa E

where E.DataRecto between :dtInicio and :dtTermino

union all

select S.DataPagto as Data, 0 as VlEntrada, Valor as VlSaida

from SaiCaixa S

where S.DataPagto between :dtInicio and :dtTermino)

group by data

order by 1

 

como é possível observar, fazemos um agrupamento por dia, de todos os registros retornados no sub-select que faz a união de todos os registros das tabelas EntCaixa e SaiCaixa, que satisfazem o filtro na cláusula WHERE.

Adicionamos um componente TDataSource (DSRegistros) e vinculamos a este dataset para uso com os demais datasets.

 

A consulta na tabela EntCaixa (IBQryEntradas), onde selecionaremos todos os registros da data sendo processada na linha detalhe (linha de IBQryRegistros), deverá ser parametrizada conforme segue:

 

CODE

select Descricao, Valor, DataRecto, Tipo

from EntCaixa

where DataRecto = :Data

order by codigo

 

A consulta na tabela SaiCaixa (IBQrySaidas), é similar:

 

CODE

select Descricao, Valor, DataPagto, Tipo

from SaiCaixa

where DataPagto = :Data

order by codigo

 

Em ambos os componentes, faremos o link para o dataset IBQryRegistros via propriedade DataSource, onde selecionamos o componente DSRegistros. O nome do parâmetro deve ser exatamente o mesmo do campo definido no dataset de onde buscaremos a informação via propriedade DataSource.

 

No QuickRep1, adicionamos:

 

- um QRBand, com a propriedade BandType = rbDetail;

- uma QRSubDetail, verificando a propriedade Master = QuickRep1; Nesta banda, formataremos as colunas. Colocamos os componentes TQRDBText para a coluna Entrada, vinculados ao dataset IBQryEntradas, bem como, colocamos TQRDBText para a coluna Saídas, vinculados ao dataset IBQrySaidas; No lugar de TQRLabels, devido ao lay-out e visando simplificar o código, utilizaremos TQRMemo para os labels;

- uma QRSummary, para adicionarmos os os QRExpr que farão a totalização. As expressões ficaram:

a. 'Total:' +FORMATNUMERIC('#,##0.00',SUM(IBQryRegistros.VLENTRADA)), para a totalização da entradas;

b. 'Total:' +FORMATNUMERIC('#,##0.00',SUM(IBQryRegistros.VLSAIDA)), para a totalização das saídas;

c. 'Saldo:' +FORMATNUMERIC('#,##0.00',SUM(IBQryRegistros.VLSALDO)), para o saldo.

com é possível ver, o agrupamento no IBQryRegistros, facilitou muito estes cálculos.

 

O botão que aciona o relatório, passa os parâmetros necessários: dtInicio e dtTermino

 

CODE

procedure TForm1.Button1Click(Sender: TObject);

begin

RelLivroCaixa := TRelLivroCaixa.Create(Self);

try

RelLivroCaixa.ShowPreview(DateTimePicker1.Date, DateTimePicker2.Date);

finally

RelLivroCaixa.Release;

end;

end;

 

ShowPreview é um procedimento definido no form do relatório. Por uma questão de organização, neste caso preferi abordagem do que acessar os componentes no outro form diretamente.

 

No form do relatório (RelLivroCaixa) o procedimento ficou assim:

 

CODE

procedure TRelLivroCaixa.ShowPreview(DtInicio, DtTermino :TDateTime);

begin

DetailBand1.Height := 0; // zeramos a banda que não mostrará informações

 

IBQryRegistros.ParamByName('dtInicio').AsDate := DtInicio;

IBQryRegistros.ParamByName('dtTermino').AsDate := DtTermino;

IBQryRegistros.Open;

IBQryEntradas.Open;

IBQrySaidas.Open;

 

try

QuickRep1.PreviewModal;

finally

IBQrySaidas.Close;

IBQryEntradas.Close;

IBQryRegistros.Close;

end;

end;

 

 

No evento OnNeedData da banda subdetail, que permite informar até quando a banda deverá ser impressa, atribuimos ao parâmetro MoreData (mais dados) o resultado da avaliação de uma das duas condições necessárias para a impressão dos dados: imprimimos a banda enquanto não for fim do arquivo de entradas ou do de saídas:

 

CODE

procedure TRelLivroCaixa.QRSubDetail1NeedData(Sender: TObject; var MoreData: Boolean);

begin

MoreData := not IBQryEntradas.EOF or not IBQrySaidas.EOF;

end;

 

 

No evento BeforePrint da banda subdetail, iremos manipular a visibilidade das "colunas". Como pode ocorrer de uma coluna ter quantidade de linhas diferente da outra, faz necessário que escondamos os componentes daquela coluna em que já atingimos o fim do arquivo:

 

CODE

procedure TRelLivroCaixa.QRSubDetail1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);

begin

QREnt_DataRecto.Enabled := not IBQryEntradas.Eof;

QREnt_Descricao.Enabled := QREnt_DataRecto.Enabled;

QREnt_Tipo.Enabled := QREnt_DataRecto.Enabled;

QREnt_Valor.Enabled := QREnt_DataRecto.Enabled;

QRMEntradas.Enabled := QREnt_DataRecto.Enabled;

 

QRSai_DataPgto.Enabled := not IBQrySaidas.Eof;

QRSai_Descricao.Enabled := QRSai_DataPgto.Enabled;

QRSai_Tipo.Enabled := QRSai_DataPgto.Enabled;

QRSai_Valor.Enabled := QRSai_DataPgto.Enabled;

QRMSaidas.Enabled := QRSai_DataPgto.Enabled;

end;

 

 

Para promovermos o avanço das informações, após impressa a banda subdetail, avançamos ambas as tabelas. Observe que não precisamos nos preocupar com nada - basta chamar Next. Caso já tenha chegado ao fim do arquivo, não haverá qualquer erro e ainda estará forçando a atualização da propriedade EOF:

 

CODE

procedure TRelLivroCaixa.QRSubDetail1AfterPrint(Sender: TQRCustomBand; BandPrinted: Boolean);

begin

IBQryEntradas.Next;

IBQrySaidas.Next;

end;

 

 

As vezes uma coisa tão simples como esta, precisa de um tempo e explicação consideravelmente grandes..., esta dica foi me passada por um amigo e aplicada ao meu caso!

Bom, espero ter descrito o processo de forma compreensível e que seja útil a quem necessite!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.