Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-11-2015
Yugo Yugo is offline
Miembro
NULL
 
Registrado: jul 2014
Posts: 25
Poder: 0
Yugo Va por buen camino
Buscar bloques de registros consecutivos bajo ciertas condiciones individuales.

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.
Responder Con Cita
  #2  
Antiguo 19-11-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Un prototipo en Delphi, ya lo pasaras/afinaras para c++

Código Delphi [-]
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

Última edición por AgustinOrtu fecha: 19-11-2015 a las 04:24:32.
Responder Con Cita
  #3  
Antiguo 19-11-2015
Yugo Yugo is offline
Miembro
NULL
 
Registrado: jul 2014
Posts: 25
Poder: 0
Yugo Va por buen camino
Gracias AgustinOrtu!!

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

Código:
  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.
Responder Con Cita
  #4  
Antiguo 19-11-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
oracle bloques anonimos que devuelvan registros fjcg02 Conexión con bases de datos 2 21-01-2015 09:51:33
Distinguir registros no consecutivos para alternar colores en dbgrid. amadis OOP 15 19-07-2014 15:17:51
Registros en en bloques de 100 o mas... Jose Roman Conexión con bases de datos 18 25-06-2010 17:42:13
Bloques De Numeros Consecutivos dany2006 C++ Builder 5 15-11-2006 21:06:16
buscar registros brandolin Firebird e Interbase 1 19-01-2004 20:59:11


La franja horaria es GMT +2. Ahora son las 05:33:08.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi