Jump to content
Fórum Script Brasil
  • 0

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


Tatiane.InterArt

Question

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!

Link to comment
Share on other sites

14 answers to this question

Recommended Posts

  • 0

Oi, Tatiane!

Seu layout seria assim:

Codigo, Descrição, DataVecto, DataPagto, Cx, Tipo, VL Entrada, VL Saída

Crie duas Variáveis para totalização TTVLEntrada e TTVLSaida

Leia o arquivo EntCaixa lançando os valores conforme as colunas e o campo valor na coluna correspondente a VL Entrada.

Totalize TTVLEntrada com a soma dos valores desta leitura

Depois, Deia o arquivo SaiCaixa, procedendo da mesma forma que o anterior e lançando o campo valor na coluna VL Saída.

Totalize TTVLSaida com a soma dos valores desta leitura

Subtraia TTVLEntrada - TTVLSaida. Este será seu valor de caixa para este dia.

Lance este valor de caixa no fim de seu relatório.

Link to comment
Share on other sites

  • 0
Mas nem sei como deixar o QuickRep em colunas huahuahuahuahua!

..., mas e como fazer para o quickrep ficar em duas colunas e como ligar esses dados a elas?

Usar a propriedade Page->Columns do seu QuickRep não será uma boa para este caso (explicação neste post).

Denis Courcy, você poderia ajudá-la a construir uma consulta onde as duas informações sejam fundidas, gerando colunas iguais mas acrescentando um campo indicativo Entrada/Saída? Isto simplificaria o processo de criação do relatório.

Abraços

Link to comment
Share on other sites

  • 0

Bem, na verdade isso já faço... em uma única coluna entende, porém, preciso que fique com aparência daqueles cadernos de lançamento de Caixa sabe os que tem coluna de entrada e saída...

É exatamente a questão separar em colunas é que está me dando a maior dor de cabeça, tipo o normalzinho com subtotal de Entrada, Subtotal de Saída e Total em Caixa já está fofo e funcionando, porém o Gerente precisa e quer um relatório em duas colunas, vai entender néh!

Será que alguém pode me orientar neste caso?

Link to comment
Share on other sites

  • 0
Bem, na verdade isso já faço... em uma única coluna entende, porém, preciso que fique com aparência daqueles cadernos de lançamento de Caixa sabe os que tem coluna de entrada e saída...
Tatiane, se você já tem a informação em uma única consulta, poderia colocar o nome das colunas que você tem como resultado? E você criou uma coluna para indicar, quando a linha é D ou C, ou você manteve duas colulas, uma com o valor do Crédito e outra do Débito?

Tendo um único dataset, a questão de colunar os valores é apenas uma questão de manipulação visual. Mas é necessário saber os campos envolvidos e as colunas em questão. Vai acabar caindo mais ou menos no que o Denis Courcy já postou.

Abraços

Link to comment
Share on other sites

  • 0

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

___________________________________________________________

COMO preciso que fique

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.....................................

Não consigo é fazer isso ser separado, tentei o exemplo citado acima mas não funcionou, quando defino duas colunas no QuickRep ainda imprime Tudo do Entrada e na sequencia abaixo na mesma coluna Tudo do Saída entende? Quero que fique Tudo do Entrada em uma coluna e Tudo do Saída em outra coluna e ainda não consegui fazer isso!

Link to comment
Share on other sites

  • 0

Bem, pensando mais clássico agora... Uso InterBase como Banco de Dados e Delphi6

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, acresci bands SubDetail(Não sei se isso é correto!) Uma ligada ao IBQuery1 e outra ligada ao IBQuery2, ao final das Entradas de Caixa e Saidas de tenho um Subtotal dos valores de entrada e subtotal de saída em uma outras bands SubDetail uma terceira Band SubDetail ao final fazendo o cálculo Total de Caixa que funcionan perfeitamente porém em uma única coluna!

Pois bem aqui encontra-se meu problema, preciso que saia Tudo de Entrada de Caixa e em uma coluna e ao lado na outra coluna Tudo de Saída de Caixa.

Bem agora tentei explicar mais detalhadamente, espero que possam me ajudar, já estou enlouquecendo com esse relatório :wacko:

Link to comment
Share on other sites

  • 0

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!

Link to comment
Share on other sites

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

printer.canvas.textout()

realmente deve dar um pouco de trabalho, já que tem que "imprimir" tudo na mão.

você verificou se a impressão está ficando correta ao quebrar página?

Bom, como agora você informou o banco que utiliza, fica mais fácil passar um exemplo.

Já que é um banco decente (um SGBD) possivelmente você poderá fazer uso de sub-selects nas queries. Isto irá simplificar muito as coisas já que você pode resolver quase que todo o problema via queries.

Apesar de não ser o seu caso, que é mais simples - tratando apenas 01 dia, vou dar uma sugestão que pode ser utiliza por você sem problemas. Consiste basicamente em:

- 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):

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:
select Descricao, Valor, DataRecto, Tipo
from EntCaixa
where DataRecto = :Data
order by codigo
A consulta na tabela SaiCaixa (IBQrySaidas), é similar:
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. Como sempre menciono, 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. No exemplo que preparei, no form principal, o botão que aciona o relatório, passa os parâmetros necessários: dtInicio e dtTermino
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, eu prefiro utilizar esta abordagem do que acessar os componentes no outro form diretamente. No form do relatório (RelLivroCaixa) o procedimento ficou assim:
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:
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:
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:
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...

Bom, espero ter descrito o processo de forma compreensível e que seja útil a quem necessite de algo parecido, porque variações são possíveis.

Fica em anexo, para quem tiver InterBase ou FireBird, o projeto exemplo.

O resultado final do relatório, também, pode ser visto na imagem em anexo.

Abraços

post-12746-1204067089_thumb.png

Relatorio_Tipo_Livro_Caixa.zip

Link to comment
Share on other sites

  • 0

Olá, retornando a este tópico antigo, eu fiz conforme o exemplo, funcionava bem, para visualizar os dados, mas ocorreu que foi necessário imprimir os dados e os dados da segunda coluna não estão sendo impressos, aparecem para visualizar o relatório, mas quando manda imprimir não sai a segunda coluna, somente a primeira, acho que poderia ser nesse ponto que está ocorrendo o problema.

acho que o problema está nesse ponto

procedure Tfrm_relatCaixaDiario.QRSubDetail1BeforePrint(
  Sender: TQRCustomBand; var PrintBand: Boolean);
begin
  QRDBText1.Enabled := not QueryCreditos.Eof;
  QRDBText2.Enabled := QRDBText1.Enabled;

  QRDBText3.Enabled := not(QueryDebitos.Eof);
  QRDBText4.Enabled := QRDBText3.Enabled;
end;

O que poderia ser feito para que seja possível imprimir os dados das duas colunas ?

Estou utilizando AdoQuery, Delphi 7 e banco Access...

Link to comment
Share on other sites

  • 0
Olá, retornando a este tópico antigo, eu fiz conforme o exemplo, funcionava bem, para visualizar os dados, mas ocorreu que foi necessário imprimir os dados e os dados da segunda coluna não estão sendo impressos, aparecem para visualizar o relatório, mas quando manda imprimir não sai a segunda coluna, somente a primeira, acho que poderia ser nesse ponto que está ocorrendo o problema.

Se voce consegue visualizar, não deveria er problemas em imprimir

Tente esta mudança

procedure Tfrm_relatCaixaDiario.QRSubDetail1BeforePrint(
  Sender: TQRCustomBand; var PrintBand: Boolean);
begin
  if  not QueryCreditos.Eof then
     begin
        QRDBText1.Enabled :=   true;
        QRDBText2.Enabled := QRDBText1.Enabled;
     end;

  if not QueryDebitos.Eof then
    begin
       QRDBText3.Enabled := true;
       QRDBText4.Enabled := QRDBText3.Enabled;
    end;
end;

abraço

Link to comment
Share on other sites

  • 0

Olá Jhonas, infelizmente não deu certo, dessa maneira, se a segunda coluna tem mais dados que a primeira, na visualização, repete-se o último dado da primeira até que a segunda coluna acabe e, quando manda imprimir, seja em impressora pdf ou normal, saem os dados da primeira coluna corretamente, mas os dados da segunda coluna imprime repetido od dados da última coluna

Visualiza assim:

---Credito ---------------|----------------Débitos

lanc 1----------1,50 ----|------------Lanç 1---------15,00

lanç 2----------2,00 ----|------------Lanç 2----------8,50

lanç 2----------2,00 ----|------------Lanç 3----------1,00

lanç 2----------2,00 ----|------------Lanç 4----------0,88

E imprime assim:

---Credito ---------------|----------------Débitos

lanc 1----------1,50 ----|------------Lanç 4----------0,88

lanç 2----------2,00 ----|------------Lanç 4----------0,88

A Unit está assim:

procedure Tfrm_relatCaixaDiario.QRSubDetail1NeedData(Sender: TObject;
  var MoreData: Boolean);
begin
MoreData:= not(QueryCreditos.Eof) or not(QueryDebitos.Eof);
end;

procedure Tfrm_relatCaixaDiario.QRSubDetail1BeforePrint(
  Sender: TQRCustomBand; var PrintBand: Boolean);
begin
  if not QueryCreditos.Eof then
     begin
        QRDBText1.Enabled :=   True;
        QRDBText2.Enabled := QRDBText1.Enabled;
     end;
  if not QueryDebitos.Eof then
    begin
       QRDBText3.Enabled := True;
       QRDBText4.Enabled := QRDBText3.Enabled;
    end;
end;

procedure Tfrm_relatCaixaDiario.QRSubDetail1AfterPrint(
  Sender: TQRCustomBand; BandPrinted: Boolean);
begin
  QueryCreditos.Next;
  QueryDebitos.Next;
end;

Enfim, não saiu ainda.

Se não houver jeito de fazer com o Quick Report, vou ter que fazer na mão, nem que seja com o canvas.

Obrigado pela atenção...

Link to comment
Share on other sites

  • 0

Visualiza assim:

---Credito ---------------|----------------Débitos

lanc 1----------1,50 ----|------------Lanç 1---------15,00

lanç 2----------2,00 ----|------------Lanç 2----------8,50

lanç 2----------2,00 ----|------------Lanç 3----------1,00

lanç 2----------2,00 ----|------------Lanç 4----------0,88

E imprime assim:

---Credito ---------------|----------------Débitos

lanc 1----------1,50 ----|------------Lanç 4----------0,88

lanç 2----------2,00 ----|------------Lanç 4----------0,88

Voce tem opções para isso

1 - faça um controle no QRSubDetail1BeforePrint em um determinado campo, por exemplo no campo do Débitos

if QueryDebitosNOMEDOCAMPO.Value = '' then
      begin
         QRDBText1.Enabled:= false;
         QRDBText3.Enabled:= false;
         QRDBText4.Enabled:= false;
      end
   else
      begin
         QRDBText1.Enabled:= true;
         QRDBText3.Enabled:= true;
         QRDBText4.Enabled:= true;
      end;
end;
Reparei que voce esta usando :
procedure Tfrm_relatCaixaDiario.QRSubDetail1NeedData(Sender: TObject;
  var MoreData: Boolean);
begin
   MoreData:= not(QueryCreditos.Eof) or not(QueryDebitos.Eof);
end;

Neste caso eu usaria uma tabela temporaria e colocaria nela todos os dados das 2 tabelas .. no report ficaria mais facil trabalhar somente com uma tabela e para separar os campos tambem ficaria mais tranquilo

Se não houver jeito de fazer com o Quick Report, vou ter que fazer na mão, nem que seja com o canvas

jeito tem, depende da perpectiva que voce predente usar

abraço

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.6k
×
×
  • Create New...