Re: [firebase-br] Cross Table alguém tem alguma experiência?

marcelo - teflamar marcelo em teflamar.com.br
Qua Nov 22 21:06:50 -03 2006


fiz essa rotina com clientdataset,funciona muito bem,

Segue uma rotina para geração de uma cross-tab de tamanho variável, recurso 
bom para ser usado com firebird, totalizando o relatório por linhas e 
colunas.


Exemplo de uma estrutura de tabela:


cod,cliente, data,     status,tipo
1   1       01/09/2004 ab     1
2   1       01/09/2004 ac     1
3   2       02/09/2004 aj     2
4   2       02/09/2004 ab     2
5   3       03/09/2004 ac     2
6   3       03/09/2004 ac     3
7   3       03/09/2004 aj     4
8   1       03/09/2004 dm     2
9   1       01/09/2004 dm     1
10  1       01/09/2004 dm     1

resultado esperado (totais por tipo e status):
tipo  |1 | 2 |3 |4 |total
------+--+---+--+--+------------
ab    |1 | 1 |0 |0 |2
ac    |1 | 1 |1 |0 |3
aj    |0 | 1 |0 |1 |2
dm    |2 | 1 |0 |0 |3
total |4 | 4 |1 |1 |10

objetos:
1 clientdataset
1 datasource
1 database
1 transaction
3 ibquery

query1 - seleciona as colunas distintas
query2 - seleciona as linhas distintas
query3 - é a query de trabalho,

* as querys podem ser substituidas
por isql, mais rápidas.

//--------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
  clientdataset1.Close;
  clientdataset1.fielddefs.Clear;
  ibdatabase.connected:=true;
  ibtransaction1.starttransaction;
  ibquery1.sql.text:='select distinct status from tabela where data between 
:datai and :dataf and cliente=:cliente';
  ibquery1.parambyname('cliente').asinteger:=strtoint(edcli.text);
  ibquery1.parambyname('datai').asdatetime:=strtodate(eddatai.text);
  ibquery1.parambyname('dataf').asdatetime:=strtodate(eddataf.text);
  ibquery1.open;
  clientdataset1.FieldDefs.Add('tipo',ftstring,10,true);
  clientdataset1.IndexFieldNames:='tipo';
  while not ibquery1.eof do
  begin
    clientdataset1.FieldDefs.Add(ibquery1.fieldbyname('status').asstring,ftinteger,0,false);
    ibquery1.next;
  end;
  clientdataset1.FieldDefs.Add('total',ftinteger,0,false);
  clientdataset1.CreateDataSet;
  clientdataset1.Append;
  clientdataset1.fieldbyname('tipo').asstring:='ZZtotal';
  ibquery2.close;
  ibquery2.sql.text:='select distinct tipo from tabela where data between 
:datai and :dataf and  cliente=:cliente';
  ibquery2.parambyname('cliente').asinteger:=strtoint(edcli.text);
  ibquery2.parambyname('datai').asdatetime:=strtodate(eddatai.text);
  ibquery2.parambyname('dataf').asdatetime:=strtodate(eddataf.text);
  ibquery2.open;
  while not ibquery2.eof do
  begin
    clientdataset1.Append;
    clientdataset1.fieldbyname('tipo').asstring:=ibquery2.fieldbyname('tipo').asstring;
    ibquery1.First;
    while not ibquery1.Eof do
    begin
      ibquery3.Close;
      ibquery3.SQL.text:='select count(*) as qtd from tabela where 
tipo=:tipo and status=:status and cliente=:cliente and data between :datai 
and :dataf';
      ibquery3.parambyname('cliente').asinteger:=strtoint(edcli.text);
      ibquery3.parambyname('datai').asdatetime:=strtodate(eddatai.text);
      ibquery3.parambyname('dataf').asdatetime:=strtodate(eddataf.text);
      ibquery3.parambyname('tipo').asstring:=ibquery2.fieldbyname('tipo').asstring;
      ibquery3.parambyname('status').asstring:=ibquery1.fieldbyname('status').asstring;
      ibquery3.open;
      clientdataset1.findkey([ibquery2.fieldbyname('tipo').asstring]);
      clientdataset1.edit;
      clientdataset1.fieldbyname(ibquery1.fieldbyname('status').asstring).asinteger:= 
ibquery3.fieldbyname('qtd').asinteger;
      clientdataset1.fieldbyname('total').asinteger:=clientdataset1.fieldbyname('total').asinteger 
+

      ibquery3.fieldbyname('qtd').asinteger;
      clientdataset1.findkey(['ZZtotal']);
      clientdataset1.Edit;
      clientdataset1.fieldbyname(ibquery1.fieldbyname('status').asstring).asinteger:=
      clientdataset1.fieldbyname(ibquery1.fieldbyname('status').asstring).asinteger 
+
      ibquery3.fieldbyname('qtd').asinteger;
      clientdataset1.fieldbyname('total').asinteger:=clientdataset1.fieldbyname('total').asinteger 
+

      ibquery3.fieldbyname('qtd').asinteger;
      ibquery1.next;
    end;
    ibquery2.next;
  end;
  ibtransaction1.Commit;
end;



Observação: marcelo luiz stefaniak (marcelo em teflamar.com.br)
----- Original Message ----- 
From: "edcley" <edcley em eletroacre.com.br>
To: "'FireBase'" <lista em firebase.com.br>
Sent: Wednesday, November 22, 2006 12:08 PM
Subject: RES: [firebase-br] Cross Table alguém tem alguma experiência?







Mais detalhes sobre a lista de discussão lista