Para probar claude le he realizado tu consulta y una buena solucion seria esta:
Teniendo en cuenta el volumen de datos, no hace falta guardar una comparacion en base de datos, ja que siempre tendrias que realizar una primera funcion para validar que los datos en la tabla son correctos en este instante, y de esta manera al trabajar en tiempo real siempre son datos de este momento
Código Delphi
[-]
type
TVentaAny = record
Ventas25: Double; Ventas26: Double; end;
procedure TForm1.ButtonComparar.Click(Sender: TObject);
const
RutaBase = 'C:\ERP\';
var
Mapa: TDictionary; Par: TPair; Fila: Integer; Diferencia: Double;
procedure CargarAnio(const Carpeta: string; EsVentas25: Boolean);
var
Id: Integer; Ventas: Double; V: TVentaAny; begin
BaseDatos.Connected := False;
BaseDatos.DatabaseName := Carpeta + '\VENTAS.FDB';
BaseDatos.Connected := True;
try
IbQueryCompCamp.Close;
IbQueryCompCamp.SQL.Text := 'SELECT ID, VENTAS FROM PEDIDOS';
IbQueryCompCamp.Open;
while not IbQueryCompCamp.Eof do
begin
Id := IbQueryCompCamp.FieldByName('ID').AsInteger;
Ventas := IbQueryCompCamp.FieldByName('VENTAS').AsFloat;
if not Mapa.TryGetValue(Id, V) then
begin
V.Ventas25 := 0; V.Ventas26 := 0;
end;
if EsVentas25 then
V.Ventas25 := Ventas
else
V.Ventas26 := Ventas;
Mapa.AddOrSetValue(Id, V);
IbQueryCompCamp.Next;
end;
IbQueryCompCamp.Close;
finally
BaseDatos.Connected := False;
end;
end;
begin
Mapa := TDictionary.Create;
try
CargarAnio(RutaBase + 'Datos025', True);
CargarAnio(RutaBase + 'Datos026', False);
StringGrid1.RowCount := Mapa.Count + 1;
StringGrid1.Cells[0,0] := 'Producte (ID)';
StringGrid1.Cells[1,0] := 'Ventas 25';
StringGrid1.Cells[2,0] := 'Ventas 26';
StringGrid1.Cells[3,0] := 'Diferencia';
Fila := 1;
for Par in Mapa do
begin
Diferencia := Par.Value.Ventas26 - Par.Value.Ventas25;
StringGrid1.Cells[0,Fila] := IntToStr(Par.Key);
StringGrid1.Cells[1,Fila] := FormatFloat('0.00', Par.Value.Ventas25);
StringGrid1.Cells[2,Fila] := FormatFloat('0.00', Par.Value.Ventas26);
StringGrid1.Cells[3,Fila] := FormatFloat('0.00', Diferencia);
Inc(Fila);
end;
finally
Mapa.Free;
end;
end;