Club Delphi  
    Paypal   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 Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-04-2004
Avatar de JamesBond_Mx
JamesBond_Mx JamesBond_Mx is offline
Miembro
 
Registrado: jul 2003
Ubicación: Poza Rica, Veracruz, México
Posts: 81
Poder: 24
JamesBond_Mx Va por buen camino
De plano no puedo, como puedo hacer para que no me tome encuenta la condición de Todas si es elegida, y me jeute la consulta bien??? ya me desesperé...
Responder Con Cita
  #2  
Antiguo 01-05-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Vamos a ver. Según lo que entiendo (corrígeme si me equivoco) tienes cuatro combos correspondientes a cuatro campos de tu tabla, digamos campo1, campo2, campo3 y campo4. La consulta debe mostrarte los registros que satfisfagan las cuatro condiciones, a saber:

campo1 = combo1.text
campo2 = combo2.text
campo3 = combo3.text
campo4 = combo4.text

Esto quiere decir que tu consulta debe ser del estilo de:

Código SQL [-]
select * from tabla
where
  campo1 = ? and
  campo2 = ? and
  campo3 = ? and
  campo4 = ?

donde los símbolos ? representan los valores de los combos.

Ahora bien, tú quieres que al seleccionar la opción todos de uno de los combos te seleccione todos los registros que satisfagan las otras tres condiciones pero indistintamente de cuál sea el valor del campo correspondiente a todos.

Lo único que tienes que hacer, al momento de construir la cadena SQL es entonces omitir la condición correspondiente. Por ejemplo, si todos corresponde al combo 2 entonces ahora la consulta será:

Código SQL [-]
select * from tabla
where
  campo1 = ? and
  campo3 = ? and
  campo4 = ?

Cuál de las dos escoges lo decides con un condicional:

Código Delphi [-]
if combo2.text <> 'todos' then
   primera consulta
else
  segunda consulta

¿Está más claro?

// Saludos
Responder Con Cita
  #3  
Antiguo 03-05-2004
Avatar de JamesBond_Mx
JamesBond_Mx JamesBond_Mx is offline
Miembro
 
Registrado: jul 2003
Ubicación: Poza Rica, Veracruz, México
Posts: 81
Poder: 24
JamesBond_Mx Va por buen camino
Pues si, asi estaba pensado, pero... ¿cuantas combinaciones posibles hay? tu me das la posibiliadad para una sola combinacion, pero veamos esto.
Pueden darse las siguientes combinaciones

Código:
Opción1  Opción 2   Opción 3    Opción 4

Todos       X          X           X
Todos    Todos         X           X
Todos    Todos      Todos          X
Todos    Todos      Todos        Todos
.
.
.
etc.
Si mis cálculos no me fallan hay 4*4*4*4 Posibles combinaciones o sea 256, te imaginas son 256 Consultas distintas no es tan facil.
Responder Con Cita
  #4  
Antiguo 03-05-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Precisamente por eso es la idea de consruir al vuelo la consulta. Claro que tendrás que utilizar algunos condicionales debido al "valor" todos pero nunca tantos cómo 4*4*4*4.

// Saludos
Responder Con Cita
  #5  
Antiguo 03-05-2004
Avatar de JamesBond_Mx
JamesBond_Mx JamesBond_Mx is offline
Miembro
 
Registrado: jul 2003
Ubicación: Poza Rica, Veracruz, México
Posts: 81
Poder: 24
JamesBond_Mx Va por buen camino
Bueno si tienes razón, no serían las 256, seria solo en el caso en que se seleccionara la opcion todos en cualquiera de las 4 opciones y sus combinaciones pero solo en las que sea seleccionada la opción "Todos"... voy a ver
Responder Con Cita
  #6  
Antiguo 04-05-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Me parece que te estás liando demasiado debido a que piensas que hay que tratar muchos casos pero en realidad no es así.

Al construir la consulta SQL tienes que fijarte cómo contribuye cada combo a la condición where. Cada combo puede contribuir de dos maneras, no 4, ni 5 ni 7, sólo dos:
  • nada - si comboN.text = 'todos'
  • campoN = comboN.text - si comboN.text <> 'todos'

Es decir, si un combo tiene 'todos' por texto, no contribuye a la consulta pues quiere decir que no impones ninguna condición sobre él.

Esto implica cuatro condicionales- uno tras otro.

La construcción del condicional where (es decir, las sentencias después de where) es un poco enredada debido a que las condiciones de los distintos combos deben estar unidas por un conector and y por cada combo debes fijarte si realmente hay necesidad de poner and:
Código Delphi [-]
// whereStr es una cadena temporal para almacenar el condicional

if whereStr = '' then // no hay condiciones previas
begin
  (* agregar condición sólo si combo.text no es 'todos' *)
  if comboN.text <> 'todos' then
    whereStr := 'campoN = ' + QuotedStr(comboN.text);
end
else // hay condiciones previas - hace falta AND
  (* agregar condición sólo si combo.text no es 'todos' *)
  if comboN.text <> 'todos' then
    whereStr := whereStr + ' and ' + QuotedStr(comboN.text);
y necesitarás uno de estos bloques por cada combo. Con esto sería más que suficiente pero como a mi me da flojera leer este tipo de código te lo voy a complicar un poco:

Código Delphi [-]
// whereStr es una cadena temporal para almacenar el condicional

if whereStr = '' then // no hay condiciones previas
begin
  if comboN.text <> 'todos' then
    whereStr := 'campoN = ' + QuotedStr(comboN.text)
  else
    whereStr := '1 = 1';
end
else // hay condiciones previas - hace falta AND
  if comboN.text <> 'todos' then
    whereStr := whereStr + ' and ' + QuotedStr(comboN.text)
  else
    whereStr := whereStr + ' and ' + '1 = 1';
La extraña condición '1 = 1' es una condición que siempre se cumple por lo que el efecto es el mismo: no imponer condición alguna sobre el campo.

En principio parece una complicación innecesaria (y quizá lo sea) pero el hecho de que cada combo siempre contribuya con algo me permite simplificar la lógica de cuándo agregar el and pues sé de fijo que lo agrego después del primer, segundo y tercer combo quedando así ya con todos los combos:

Código Delphi [-]
if combo1.text <> 'todos' then
  whereStr := 'campo1 = ' + QuotedStr(combo1.text)
else
  whereStr := '1 = 1';

if combo2.text <> 'todos' then
  whereStr := whereStr + 'and ' + 'campo2 = ' + QuotedStr(combo2.text)
else
  whereStr := whereStr + 'and ' + '1 = 1';

if combo3.text <> 'todos' then
  whereStr := whereStr + 'and ' + 'campo3 = ' + QuotedStr(combo3.text)
else
  whereStr := whereStr + 'and ' + '1 = 1';

if combo4.text <> 'todos' then
  whereStr := 'campo4 = ' + QuotedStr(combo4.text)
else
  whereStr := whereStr + 'and ' + '1 = 1';

Pero más aún, como los cuatro condicionales son esencialmente iguales podemos definir una función:

Código Delphi [-]
function CondicionCampo(Campo, Valor: String): String;
begin
  if Valor = 'todos'
    then Result := '1 = 1'
    else Result := Campo + ' = ' + QuotedStr(Valor);
end;

que los construya genéricamente con lo cual reducimos el código a:

Código Delphi [-]
whereStr := CondicionCampo('campo1', combo1.text);
whereStr := whereStr + ' and ' + CondicionCampo('campo2', combo2.text);
whereStr := whereStr + ' and ' + CondicionCampo('campo3', combo3.text);
whereStr := whereStr + ' and ' + CondicionCampo('campo4', combo4.text);
Y listo. Ya sólo tienes que agregar esto al resto de la cadena SQL, por ejemplo:

Código Delphi [-]
Query.Sql.Text := 'select * from tabla where ' + whereStr;

Yo colocaría esto en un evento OnChange común a los cuatro combos.

// Saludos
Responder Con Cita
  #7  
Antiguo 04-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 30
jachguate Va por buen camino
Cool

Yo lo veo mas sencillo tadavia...

Código Delphi [-]
Var
  YaWhere : Boolean;

  Procedure AddWhere(condicion : String);

  Begin
    if YaWhere Then
      Query1.SQL.Add('and ' + condicion)
    else begin
      Query1.SQL.Add('where ' + condicion);
      YaWhere := True;
    end;
  End;

Begin
  YaWhere := False;
  Query1.SQL.Clear;
  Query1.SQL.Add('Select * from tabla');
  if combo1.Text <> 'todos' then
    AddWhere('campo1 = ' + QuotedStr(combo1.Text));
  if combo2.Text <> 'todos' then
    AddWhere('campo1 = ' + QuotedStr(combo2.Text));
  if combo3.Text <> 'todos' then
    AddWhere('campo1 = ' + QuotedStr(combo3.Text));
  if combo4.Text <> 'todos' then
    AddWhere('campo1 = ' + QuotedStr(combo4.Text));
  Query1.Open;
end;

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 20:32:04.


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