Bem, o assunto que estou abordando pode ser utilizado em relatórios ou mesmo em listviews, grids ou string grids. O objetivo é suprimir a criação e deleção de tabelas virtuais que necessitam da escrita de informações no HD, ou mesmo a criação de novas consultas para concatenar dados.
Estarei utilizando como exemplo duas
consultas, mas vale lembrar que o método pode ser usado com tabelas, com consultas
misturado com tabelas e o que mais a imaginação permitir. Também
estou utilizando uma procedure, entretanto pode ser usado como função,
passando as consultas por parâmetro, por exemplo.
Segue abaixo o corpo da procedure todo explicado. Fique a vontade para entrar
em contato e tirar qualquer dúvida seu conteúdo, se for necessário.
procedure MatrizMultidimensional;
var
//Array multidimensional dinâmica de inteiros
Listagem: array of array of integer;
//Variáveis utilizadas
i, j, TotLin, TotCol, FCampo1, FCampo2: Integer;
begin
//Indicativo para que a matriz esteja sempre compeltamente vazia
Listagem := nil;
//definir a quantidade de linhas e colunas que a matriz deverá ter:
try
//QryDados e QryDados1 são os DataSets com as consultas realizadas
QryDados.Active := False;
QryDados1.Active := False;
QryDados.Active := True;
QryDados1.Active := True;
TotLinhas := QryDados.RecordCount - 1;
TotCol := (QryDados.FieldCount - 1) + (QryDados1.FieldCount - 1);
//No exemplo aabaixo a matriz conterá n linhas por n colunas
SetLength(Listagem, TotLin, TotCol);
//Abaixo, preenchemos os campos da matriz com 0 (zero).
//se isso não for feito, quando forem colocados os dados será
//apresentada uma mensagem de erro.
for i := 0 to Totlin - 1 do
for j := 0 to TotCol - 1 do
Listagem[i, j] := 0;
//Vai para o primeiro registro da consulta
QryDados.First;
//Zera as variáveis que serão reaproveitadas no preenchimento da matriz
i := 0;
j := 0;
//como colocar os campos que não são calculados dentro da matriz.
//Para isso estaremos utilizando a consulta QryDados
while not QryDados.Eof do
begin
j := j + 1;
Listagem[i, 0] := QryDadosNOMECAMPO1.Value;
Listagem[i, 1] := QryDadosNOMECAMPO2.Value;
QryDados.Next;
i := i + 1;
end;
//como colocar os dados calculados, utilizando a consulta QryDados1:
QryDados1.First;
while not QryDados1.Eof do
begin
FCampo1 := QryDados1NOMECAMPO1.Value;
FCampo2 := QryDados1NOMECAMPO2.Value;
for i := 0 to TotLin - 1 do
begin
if Listagem[i, 0] = FCampo1 then
begin
Listagem[i, 2] := Listagem[i, 2] + QryDados1NOMECAMPO2.Value;
Listagem[i, 3] := Listagem[i, 3] + (Listagem[i, 2] * QryDados1NOMECAMPO2.Value);
end;
QryDados1.Next;
end;
end;
except
raise;
end;
end;
E é isso, dessa forma teremos uma matriz dinâmica multidimensional, com campos
copiados de uma consulta e calculados de outra consulta. Espero que goste do
meu pequeno artigo. Até mais!
Fábio Moraes
Contato: fmoraes05@terra.com.br
|