[firebase-br] Consulta de Referencia Cruzada no FireBird

Francisco A Souza francisco em logosinfo.com.br
Qua Ago 23 21:26:39 -03 2006


Bom eu coloquei um clientdataset no form criei este form:

procedure TFrmPedCompra.Giro;
var
   a:integer;
   TEXTO,campo1:string;
begin
  gmov.close;  ///aqui e o clientdataset
  try
     screen.Cursor:=crsqlwait;
     Sql.Close;
     sql.SQL.Clear;
     sql.SQL.Add('select ano from tabela_produtos_giro_mes where 
tabela_produtos_giro_mes.id_produto=:id group by ano order by ano desc'); 
//aqui descubro na tabela de giro quais os anos que o movimento tem giro.
     sql.parambyname('id').value:=dtsid.value;
     sql.Open;
     screen.Cursor:=crdefault;
  except
     on exc:exception do begin
        screen.Cursor:=crdefault;
        MessageBox (Application.Handle, Pchar ('Erro:'+exc.Message),'Erro', 
MB_iconERROR);
     end;
   end;
   if sql.FieldByName('ano').AsInteger>2000 then begin  /aqui to gerando 
somente a partir de 2000... mas se tirar ele pega todos os anos disponiveis.
      gmov.FieldDefs.Clear;  aqui zerei a estrutura do cd
      gmov.FieldDefs.Add('Mes',ftstring,3,false); aqui criei uma coluna mes
      sql.first;
      while not sql.eof do begin
        // Campo1:='E-'+strzero(sql.fieldbyname('ano').AsString,4); aqui to 
criando um campo e+ano na tabela fica +- e2000,e2001,e2002... etc.
        // gmov.FieldDefs.add(campo1, ftfloat,0, false);
        // Campo1:='C-'+strzero(sql.fieldbyname('ano').AsString,4); aqui 
coluna para custos
        // gmov.FieldDefs.add(campo1, ftFLOAT,0, false);
         if rd2.ItemIndex=0 then
            Campo1:='S-'+strzero(sql.fieldbyname('ano').AsString,4) aqui 
coluna para vendas em quantidade
         else
            Campo1:='V-'+strzero(sql.fieldbyname('ano').AsString,4); aqui 
coluna para vendas em reais.
         gmov.FieldDefs.add(campo1, ftfloat,0, false); aqui adiciono o campo 
de vendas
         sql.Next;
      end;
      gmov.CreateDataSet;     /;/// aqui crio o dataset...
      GMOV.DisableControls;
      for a:=1 to 12 do begin           //aqui to adicionando os meses para 
os campos
         gmov.Append;
         gmov.FieldByName('mes').Value:=copy(NomeMes(a),1,3);
         gmov.Post;
      end;
      gmov.Append;
      gmov.FieldByName('mes').Value:='TOT'; //aqui adicionei uma ultima 
linha, para totalizar..
      gmov.Post;
      sql.Close;
      sql.SQL.clear;
      sql.sql.Add('select * from tabela_produtos_giro_mes where 
tabela_produtos_giro_mes.ano>2000 and 
tabela_produtos_giro_mes.id_produto=:id');
      texto:=sqlcod2(ck1);
      if texto<>'' then SQL.sql.add('AND tabela_PRODUTOS_GIRO_mes.id_loja IN 
('+texto+')');
      sql.ParamByName('id').Value:=dtsid.Value;
      sql.Open; //aqui pesquisei para o movimento na tabela de giro
      sql.First;
      while not sql.eof do begin
         if rd2.ItemIndex=0 then begin    ///aqui to preenchendo o 
clientdataset com os dados retornado
            gmov.Locate('mes',copy(NomeMes(sql.fieldbyname('mes').AsInteger),1,3),[]);
            TCurrencyField(gmov.FieldByName('S-'+strzero(sql.fieldbyname('ano').AsString,4))).DisplayFormat:=',0.00';

            gmov.edit;
            gmov.FieldByName('S-'+strzero(sql.fieldbyname('ano').AsString,4)).ASCURRENCY:=gmov.FieldByName('S-'+strzero(sql.fieldbyname('ano').AsString,4)).ASCURRENCY+sql.fieldbyname('vendas').ASCURRENCY;
            gmov.Post;
            gmov.Locate('mes','TOT',[]);
            gmov.edit;
            gmov.FieldByName('S-'+strzero(sql.fieldbyname('ano').AsString,4)).ASCURRENCY:=gmov.FieldByName('S-'+strzero(sql.fieldbyname('ano').AsString,4)).ASCURRENCY+sql.fieldbyname('vendas').ASCURRENCY;
            gmov.Post;
         end;
         if rd2.ItemIndex=1 then begin
            gmov.Locate('mes',copy(NomeMes(sql.fieldbyname('mes').AsInteger),1,3),[]);
            gmov.edit;
            TCurrencyField(gmov.FieldByName('V-'+strzero(sql.fieldbyname('ano').AsString,4))).DisplayFormat:=',0.00';

            gmov.FieldByName('V-'+strzero(sql.fieldbyname('ano').AsString,4)).ASCURRENCY:=gmov.FieldByName('V-'+strzero(sql.fieldbyname('ano').AsString,4)).ASCURRENCY+sql.fieldbyname('total_vendas').ASCURRENCY;
            gmov.Post;
            gmov.Locate('mes','TOT',[]);
            gmov.edit;
            gmov.FieldByName('V-'+strzero(sql.fieldbyname('ano').AsString,4)).ASCURRENCY:=gmov.FieldByName('V-'+strzero(sql.fieldbyname('ano').AsString,4)).ASCURRENCY+sql.fieldbyname('total_vendas').ASCURRENCY;
            gmov.Post;
         end;

         sql.Next;
      end;
      gmov.First;
      WHILE NOT GMOV.Eof DO BEGIN // aqui faco uma limpeza, dos anos que 
estao com zero... para dar um estetica melhor
         FOR A:=0 TO GMOV.FieldCount-1 DO BEGIN
            IF GMOV.Fields[A].AsString='0' THEN BEGIN
               GMOV.EDIT;
               GMOV.Fields[A].Clear;
               GMOV.POST;
            END;
         END;
         GMOV.Next
      END;
      GMOV.First;
      GMOV.EnableControls;
   end;
end;


e isso ai... se tiver alguma duvida... e so falar... 






Mais detalhes sobre a lista de discussão lista