[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