PDA

Ver la Versión Completa : Buscar bloques de registros consecutivos bajo ciertas condiciones individuales.


Yugo
18-11-2015, 13:28:24
Hola!! experimentando con el uso de tablas y búsquedas de datos en ellas, estoy tratando de realizar la siguiente tarea:
.- Dispongo de una tabla de 20 campos y un nº x de registros.
.- La idea es, buscando registro a registro (en toda la tabla) para que se cumplan 2 condiciones:
.- Condición 1) - Encontrar aquellos registros en los que se cumplan al menos 2 de los siguientes 3 requisitos:
a) - Que el valor almacenado en el campo A sea <= x
b) - Que el valor almacenado en el campo B sea <= y
c ) - Que el valor almacenado en el campo A sea >= z
(Sólo me interesan los datos registrados en 3 de los 20 campos de la tabla)
.- Condición 2) - Que la condición 1 se cumpla en al menos 10 registros consecutivos.

Es decir, la idea general es obtener bloques de al menos 10 registros consecutivos en los que se cumplen 2 de los 3 requisitos enumerados, para luego poner en un TMemo el nº de bloques de registros consecutivos encontrados que cumplen con eso y si es posible, pintar en el TDBGrid las líneas para identificar dichos bloques visualmente.

Si tenéis alguna idea sobre como llevarlo a cabo os lo agradecería.

AgustinOrtu
19-11-2015, 04:20:13
Un prototipo en Delphi, ya lo pasaras/afinaras para c++


function ObtenerFilas(x,y z: Integer; ADataSet: TDataSet): TList< Integer >;
var
ValA, ValB: Integer;
begin
Result := TList< Integer >.Create; // nro de filas que cumplen la condicion1
ADataSet.DisableControls;
try
ADataSet.First;
while not ADataSet.Eof do
begin
ValA := ADataSet.FieldByName('A').AsInteger;
ValB := ADataSet.FieldByName('B').AsInteger;
if CumpleCondicion1(x, y, z, ValA, ValB) then
Result.Add(ADataSet.RecNo);

ADataSet.Next;
end;
finally
ADataSet.EnableControls;
end;
end;


Con eso obtendrias la lista de filas que cumplen con la condicion1. Despues deberias procesar esa lista y ver si hay 10 consecutivas. Con esa misma lista podrias pintar el DBGrid tranquilamente

Yugo
19-11-2015, 23:42:20
Gracias AgustinOrtu!!

Yo estoy probando usando un componente TQuery para hacer una búsqueda tal que así:

qBusqueda->DatabaseName = "dbBaseDatos";
qBusqueda->Close();
qBusqueda->SQL->Add("SELECT ID, CAMPO2, CAMPO3, CAMPO4");
qBusqueda->SQL->Add("FROM Tabla");
qBusqueda->SQL->Add("WHERE ( (CAMPO2 <= 10 AND CAMPO3 >= 6 AND CAMPO4 >= 30) OR");
qBusqueda->SQL->Add("(CAMPO2 <= 10 AND CAMPO3 >= 6) OR");
qBusqueda->SQL->Add("CAMPO2 <= 10 AND CAMPO4 >= 30) OR");
qBusqueda->SQL->Add("(CAMPO3 >= 6 AND CAMPO4 >= 30) ) ORDER BY ID");
qBusqueda->Open();
qBusqueda->Active = true;
Con la intención de que al pulsar el botón que contiene este código, haga que se visualice en un DBGrid los resultados obtenidos de la búsqueda y a partir de éste comprobar por el campo ID si existen bloques de 10 ó más registros consecutivos que cumplen la condición 1.
Sin embargo, tengo el problema de que la tabla almacena datos de tipo String, por lo que se requiere una conversión a tipo Int para realizar la comparación y yo no sé como hacerlo. He intentado con StrToInt(CAMPOx), pero me da error.

AgustinOrtu
19-11-2015, 23:48:05
Con una consulta SQL a veces se puede volver complicado

Yo creo que lo mejor en ese caso es hacerlo desde un Stored Procedure (siempre que la bd que estes usando lo soporte)

Sino es traerte todo y recien ahi operar desde C++ como propuse mas arriba