Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-06-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Limitar registros de un IBDataSet según un StringList en memoria

Hola compañeros del foro !

Como podría limitar mostrar sólo los registros de un Query a aquellos cuya clave esté contenida en un StringList que manejo en memoria ??

Tengo una lista de selección para elegir aquellas claves que quiero imponer como condición en otra consulta. Esa lista la manejo mediante un StringList en memoria ya que cada usuario activo puede elegir un conjunto de claves diferente en un momento determinado.

Y lo que pretendo es que en la otra consulta que muestro, sólo aparezcan aquellos registros cuya clave concreta haya sido seleccionada por el usuario, es decir, que esté contenida en el StringList.

Entiendo que sería inmediato grabar todos esas claves seleccionadas en una base de datos (temporal o no) y hacer un nuevo Select con la condición de que la clave estuviera contenida en dicha tabla. Pero vuelvo a comentar el problema de cada usuario e incluso de que cada usuario pudiera a la vez tener abiertas varias consultas con condiciones diferentes. Debería entonces gestionar eso a nivel de la tabla que indico.

Por eso preguntar si alguien tiene una solución diferente.

Gracias por vuestra ayuda.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #2  
Antiguo 28-06-2007
mamaro mamaro is offline
Miembro
 
Registrado: mar 2004
Posts: 79
Poder: 21
mamaro Va por buen camino
Saludos

Hola que tal, creo que se podría construir la consulta de forma dinámica levantando el filtro de el stringlist, por ejemplo supongamos que en el stringlist almacenas los campos clave, que para el ejemplo vamos a decir que son integer:

// Retorna un string con la consulta a ejecutar
function Crea_Filtro:string;
var x:integer;
aux:string;
begin
aux:='';
if (strlis.count>0) then begin
aux:='campoclave='+strlis[0]+')';
if (strlis.count>1) then
for x:= 1 to (StrLis.count-1) do begin
aux:=aux+' or (campoclave='+strlis[x]+')';
end;
end;
result:=aux;
end;

function Crea_Consulta:string;
var aux:string;
begin
result:='Select * from Tabla';
aux:='';
aux:=Crea_Filtro;
if (length(aux)>0) then begin
result:=result+' where '+aux;
end;
end;

Por lo que la función Crea_Consulta te retorna la consulta que debes ejecutar, o sea haces algo así como:

..
DataSet.close; // por si lo tenías abierto de antes
DataSet.SQL.clear;
DataSet.SQL.text:=Crea_Consulta;
DataSet.open;
..

Saludos y cruzo los dedos para que funcione (no lo probé)
Responder Con Cita
  #3  
Antiguo 28-06-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Gracias por contestar.

Pues si, sería una posible solución. Lo que pasa es que el texto del Select de la consulta podría crecer mucho. Y no sé como afectaría a la velocidad de la consulta.

Voy a tenerlo en cuenta aunque sigo ideando otras soluciones. Ya avisaré como quedó.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #4  
Antiguo 28-06-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Al final opté por la solución que pensé al principio.

Hacer uso de una base de datos 'temporal' (en el sentido figurado de la palabra, aunque permanente para Interbase), en la cual antes de generar la consulta SQL, inserto las 'Claves' que necesito localizar, y dentro de la consulta SQL general hago una subconsulta de esta tabla 'temporal' para limitar la clave que busco a las claves contenidas en los registros de esa tabla 'temporal'.

Como se trata de una consulta únicamente, al estar asociadas ambas tablas, la de consulta principal y la de la tabla 'temporal', a la misma transacción que creo sólo para dicha consulta, al cerrar la transacción y no necesitar de ningún commit en mi operativa, todos los registros creados hasta ese momento se eliminarán.

He optado por esta solución ya que la consulta principal en sí misma, la genero de manera dinámica en tiempo de ejecución, y debido a que pueden existir otros muchos parámetros condicionales, la longitud de la misma consulta se podría extender demasiado y afectar al rendimiento de la misma.

ClNaU2 a todos
__________________
Piensa siempre en positivo !
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
Select registros master según nº de líneas de detalle fidel SQL 17 10-04-2007 03:32:03
Limitar los registros que devuelve una consulta roman Conexión con bases de datos 1 03-09-2004 09:08:45
limitar uso de memoria en w2000 OmarPerez Windows 0 07-01-2004 21:12:52
Limitar registros con Query marcial SQL 4 10-12-2003 08:02:42
Limitar Insercion de registros version prueba FernanGil Varios 4 01-10-2003 20:35:31


La franja horaria es GMT +2. Ahora son las 22:13:01.


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