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

Delphi

25/02/2008

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!


Tatiane

Tatiane

Curtidas 0

Respostas

Joaoshi

Joaoshi

25/02/2008

Qual banco de dados ?


GOSTEI 0
Tatiane

Tatiane

25/02/2008

BD InterBase
usando o IBQuery
e QuickRep para relatório


GOSTEI 0
Joaoshi

Joaoshi

25/02/2008

Colega, você poderia tentar algo assim:

SELECT Codigo,Descricao,Valor AS ENTRADA,0.00 AS SAIDA,DataVecto,Tipo,Cx
from ENTCAIXA

[b:07059303a1]UNION ALL[/b:07059303a1]
SELECT Codigo,Descricao,0.00 AS ENTRADA,Valor AS SAIDA,DataVecto,Tipo,Cx
FROM SaiCaixa

Espero ter ajudado.


GOSTEI 0
Tatiane

Tatiane

25/02/2008

Bem o Union All pode até ser que ajude sim, porém ainda não resolve o problema de colocar os dados em colunas diferentes e é esta minha dificuldade!

Alguém poderia me ajudar nisso?


GOSTEI 0
Joaoshi

Joaoshi

25/02/2008

Os dados seriam as colunas ENTRADA e SAIDA provenientes do SELECT.


GOSTEI 0
Tatiane

Tatiane

25/02/2008

Não, acho que não fui bem clara, não estou conseguindo colocar o quickrep em duas colunas, nunca fiz isso e nem sei como fazê-lo.
pode me dizer como se faz isso?


GOSTEI 0
Onjahyr

Onjahyr

25/02/2008

Vê se ajuda...

http://forum.clubedelphi.net/viewtopic.php?p=241670&sid=2ce67ead8bcb94bb618cabaf31095ed7


GOSTEI 0
Tatiane

Tatiane

25/02/2008

Ahnnnn quase isso, na verdade neste post q vc me mandou a dúvida é a mesma que a minha, pois fazer mala direta(Etiquetas) eu consigo, porém fica funcionando apenas uma coluna do quickrep e precisava de duas entende?
Será que existe uma maneira para que isso possa acontecer?
O layout seria +/- assim:

1ª Coluna Entrada de Caixa e 2ª Coluna Saída de Caixa

Caixa - Entradas...........................| Caixa - Saídas.......................................
-------------------------------------------------------------------------------------------
DataRecto:22/02/08......................| DataPagto:22/02/08...............................
Descrição: Union Pedido nº10 - 1/1 | Descrição: MPel NF nº4545 - 2/5
Tipo: Boleto..................................| Tipo: Dinheiro........................................
Valor: R$ 35,00.............................| Valor: R$100,00.....................................
--------------------------------------------------------------------------------------------
DataRecto:22/02/08......................| DataPagto:22/02/08.................................
Descrição: DFazio Pedido nº8 - 5/8 | Descrição: ZWanni NF nº2038 - 8/10
Tipo: Cheque................................| Tipo: Boleto......................................
Valor: R$ 90,00.............................| Valor: R$38,00.....................................
--------------------------------------------------------------------------------------------
DataRecto:22/02/08.......................| DataPagto:22/02/08................................
Descrição: Fass Pedido nº21 - 1/10 | Descrição: Solução Informática NF nº2901 - 2/3
Tipo: Boleto..................................| Tipo: Dinheiro......................................
Valor: R$ 180,00.............................| Valor: R$55,00.....................................
---------------------------------------------------------------------------------------------
DataPagto:22/02/08......................| DataRecto:22/02/08.................................
Descrição: Soluction Pedido 1 ..1/1 | Descrição: A Granell NF nº2038 - 3/3
Tipo: Dinheiro...............................| Tipo: Depósito......................................
Valor: R$ 48,90.............................| Valor: R$35,60.....................................


Espero que tenha ficado mais claro agora! se puder me ajudar agradeço


GOSTEI 0
Alves_sp

Alves_sp

25/02/2008

Ja pensou ema fazer uma tabela apenas com o CAMPO tipo E para entrada e S para saida e no form quando chamar utilizar uma tag pois seria apenas 1 form e 1 relatório


GOSTEI 0
Tatiane

Tatiane

25/02/2008

Bem, independe de separar em outras tabelas, compreenda que estou fazendo o relatório ser gerado, porém, preciso que fique em colunas separadas e é isso que não sei como resolver.
os dados saem um abaixo do outro e não separados por Entrada e Saída como preciso no layout que apresentei acima.

Será que alguém já fez isso antes pra me dar a dica?

Agradeceria muito!


GOSTEI 0
Joaoshi

Joaoshi

25/02/2008

Você poderia criar um ClientDataSet com as colunas que você precisa no relatório, pegar o resultado do select e alimentar o ClientDataSet.

É meio ´POG´ mas deve resolver.


GOSTEI 0
Tatiane

Tatiane

25/02/2008

????????????
Nem tenho idéia de como se faz isso, sou iniciante em Delphi, to usando InterBase, uso os IBs da vida para ligar ao banco e nem sei o que é ClientDataSet...

Bem, pensando mais clássico agora... no relatório que estou fazendo tenho uma tela onde informo a data em um MaskEdit e um botão onde no Onclik faço meu select ou seja, minha pesquisa e carrego os dados para o relatório dessa forma!

FrmRelCx.IBQuery1.Close;
FrmRelCx.IBQuery1.SQL.Clear;
FrmRelCx.IBQuery1.SQL.Add(´Select * from EntCaixa where DataRecto=´´´+MaskEdit1.Text+´´´´);
FrmRelCx.IBQuery1.Open;
FrmRelCx.IBQuery2.Close;
FrmRelCx.IBQuery2.SQL.Clear;
FrmRelCx.IBQuery2.SQL.Add(´Select * from SaiCaixa where DataPagto=´´´+MaskEdit1.Text+´´´´);
FrmRelCx.IBQuery2.Open;
FrmRelCx.QuickRep1.Preview;

Em primeiro lugar faço a pesquisa em IBQuerys diferentes pois a data que preciso filtrar são diferentes, OK poderia até criar uma tabela temporária para isso, mas ainda não resolveria meu problema que não é este!

Tenho outra tela que gera meu relatório onde tenho um QuickRep, dois IBQuerys, já o deixei com duas colunas, acresci bands Detail(Não sei se isso é correto!)

Pois bem aqui encontra-se meu problema, acima tem um Layout que coloquei como exemplo do que preciso, e meu relatório está saindo em uma única coluna todas as informações, ou seja
Tudo de Entrada de Caixa e abaixo e não ao lado na outra coluna Tudo de Saída de Caixa.
Bem agora tentei esplicar mais detalhadamente, espero que possam me ajudar, ja estou enlouquecendo com esse relatório huahuahua


GOSTEI 0
Targinosilveira

Targinosilveira

25/02/2008

???????????? Pois bem aqui encontra-se meu problema, acima tem um Layout que coloquei como exemplo do que preciso, e meu relatório está saindo em uma única coluna todas as informações, ou seja Tudo de Entrada de Caixa e abaixo e não ao lado na outra coluna Tudo de Saída de Caixa. Bem agora tentei esplicar mais detalhadamente, espero que possam me ajudar, ja estou enlouquecendo com esse relatório huahuahua


Olá Tatiane, deixe-me ver se te dou uma ajudinha, o que acontece você esta tentando fazer um relatorio de moviemtação de caxa com entradas e saidas, só que ao invés de utilizar uma coluna para os valores você quer utilizar duas coluna, uma para valores a credito e outra para valores a debito. É isso que você deseja fazer ?

Um abraço.


GOSTEI 0
Tatiane

Tatiane

25/02/2008

Exatamente isso que preciso!


GOSTEI 0
Targinosilveira

Targinosilveira

25/02/2008

Exatamente isso que preciso!


Pois Tatiane, o que acontece é que o seu controle de caixa deveria estar contido em uma unica tabela, relacionada com uma outra tabela de historico com a identificacao de debito ou credito, uma outra maneira que você poderia fazer é que tudo poderia ficar tudo em uma unica tabela e nela você criar um campo onde você(na ralidade seu cliente) possa informar se o valor é debito ou credito.

Como esta o andamento do seu sistema? Ele esta pronto? Ou agora que ele esta em inicio de desenvolvimento ?


GOSTEI 0
Tatiane

Tatiane

25/02/2008

O sistema está pronto e funcionando há algum tempo, e depois de tanto usar esse relatório em uma única coluna o Gerente me pediu para separar em colunas, inicialmente ele achou que da forma que fazia já estaria de bom tamanho agora quer algo mais prático.

Como o Relatório é Hoje:
1ª Coluna Entrada de Caixa e 2ª Coluna Saída de Caixa

Caixa - Entradas...........................
-------------------------------------------------------------------------------------
DataRecto:22/02/08......................
Descrição: Union Pedido nº10 - 1/1
Tipo: Boleto..................................
Valor: R$ 35,00.............................
--------------------------------------------------------------------------------------------
DataRecto:22/02/08......................
Descrição: DFazio Pedido nº8 - 5/8
Tipo: Cheque...............................
Valor: R$ 90,00............................
--------------------------------------------------------------------------------------------
DataRecto:22/02/08.......................
Descrição: Fass Pedido nº21 - 1/10
Tipo: Boleto..................................
Valor: R$ 180,00...........................
---------------------------------------------------------------------------------------------
SUBTOTAL Entrada: R$ 305,00
-----------------------------------------------------------------------------------
Caixa - Saídas
------------------------------------------------------------------------------------
DataPagto:22/02/08......................
Descrição: Soluction Pedido 1 ..1/1
Tipo: Dinheiro...............................
Valor: R$ 48,90.............................
-------------------------------------------------------------------------------------------
DataPagto:22/02/08...............................
Descrição: MPel NF nº4545 - 2/5
Tipo: Dinheiro........................................
Valor: R$100,00.....................................
--------------------------------------------------------------------------------------------
DataPagto:22/02/08.................................
Descrição: ZWanni NF nº2038 - 8/10
Tipo: Boleto......................................
Valor: R$38,00.....................................
-----------------------------------------------------------------------------------
SUBTOTAL Saídas: R$ 186,90
----------------------------------------------------------------------------------
Total Caixa: R$ 118,10
___________________________________________________________


Bem, acredito q vai ser mais difícil do que pensei hshshshs


GOSTEI 0
Targinosilveira

Targinosilveira

25/02/2008

Bem, acredito q vai ser mais difícil do que pensei hshshshs


É Tatiane, de fato não vai ser tão simples assim, o que você tera que fazer é algo do tipo de gera via SQL uma terceira tabela usando os dados das duas com os campos que você deseja e depois fazer o relatorio com as duas colunas puxando os dados da terceira tabela com os dados das outras.

Talvez isso vai fazer com que o sistema gere o relatorio numa menor velocidade.

Eu estou a little busy, se tiver algum outro membro aqui do grupo que possa dar uma nova dica ou ajudar nessa que eu dei, fique a vontade também :D

Um abraço.


GOSTEI 0
Tatiane

Tatiane

25/02/2008

Claro, facilmente posso criar uma tabela temporária para isso, mas não torna meu relatório dividido em tabelas, vi algumas dicas a respeto de gerar as colunas mas nenhuma até agora deu certo.
Mesmo com a tabela auxiliar temporária ou não, o pior está sendo colocar em duas colunas!

Mas valeu cara! com certeza pode ter ajudado outras pessoas com essa dica!


GOSTEI 0
Targinosilveira

Targinosilveira

25/02/2008

Mesmo com a tabela auxiliar temporária ou não, o pior está sendo colocar em duas colunas!


Outra coisa que você pode fazer é apartir da impressão da terceira tabela, fazer condições de impressão na geração do relatorio, se o campo vem de valores a debito vai para a coluna de debito, se vem dos valores a credito, joga na coluna de creditos. o que achas ?


GOSTEI 0
Edilcimar

Edilcimar

25/02/2008

printer.canvas.textout() dá um pouco de trabalho mas sai EXATAMENTE do jeito que você quer!


GOSTEI 0
Tatiane

Tatiane

25/02/2008

Nossa agora sim, e realmente dá um pouco de trabalho, mas funcionou direitinho, nossa valeu mesmo Edilcimar!


GOSTEI 0
Tatiane

Tatiane

25/02/2008

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!


GOSTEI 0
Wanderok

Wanderok

25/02/2008

1) Ideal - uma única tabela com status S=saida e E=entrada
2) mas........... como nao é o que temos, vamos a solucao:

Antes de imprimir,

0) crie uma tabela temporaria (TEMPORARIA)
esta tabela temporaria representa em cada linha (registro) os dados a serem impressos em uma linha do relatorio

1) abra query1(SELECT * FROM SAIDA)

2) abra query2(SELECT * FROM ENTRADA)

3) enquanto houver registro de entrada ou de saida....
while (not query1.eof) and (not query2.eof) do

4) INSERT INTO TEMPORARIA...
inclua no registro da temporaria os campos de query1 e de query2
observe que esta montando a linha do relatorio....
ou seja, um registro de cada tabela monta 1 registro do relatorio
detalhe importante.... veja antes de inserir se ha registros nas queryes
if not query1.eof --> insert colunas da query1
if not query2.eof ---> insert colunas da query2

5) proximos registros
query1.next;
query2.next;

6) fim do loop -> end; (while)

7) agora o dataset do relatorio deve ler a tabela criada TEMPORARIA

8) detail do relatorio aponta para os campos de TEMPORARIA
dispondo em 2 colunas por linha conforme gravado e ja pronto em TEMPORARIA.

pronto !!! :D

Se precisar de mais detalhes, é só falar....


GOSTEI 0
Wanderok

Wanderok

25/02/2008

[color=red:5854009585][b:5854009585]EDITADO !!!![/b:5854009585][/color:5854009585]
while (not query1.eof) and (not query2.eof) do

PARA

while (not query1.eof) [size=24:5854009585][color=red:5854009585][b:5854009585]OR[/b:5854009585][/color:5854009585][/size:5854009585] (not query2.eof) do


GOSTEI 0
POSTAR