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

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-08-2014
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
Parámetros opcionales en consulta SQL

Hola,

Si tengo una consulta de este tipo:

Código SQL [-]
SELECT * FROM tabla WHERE campo = :param OR :param IS NULL

con los componentes que uso (MyDac) funciona como se espera, o como espero. Esto es, si no asigno ningún valor al parámetro :param, la consulta devuelve todos los registros, pero si asigno un valor entonces el filtro se hace efectivo y devuelve sólo los registros correspondientes.

Mi duda es si este comportamiento sucede en general en otros componentes tipo Query o es exclusivo de MyDac.

// Saludos
Responder Con Cita
  #2  
Antiguo 28-08-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola roman.

Hice unas pruebas y con Firebird/TIBQuery, algunos cambios mediante, finalmente funcionó del modo que comentas.
Código Delphi [-]
  with IBQuery1 do
  begin
    Close;
    SQL.Add('SELECT * FROM USUARIOS');
    SQL.Add('WHERE NAME = CAST(:PARAM AS VARCHAR(30))');
    SQL.Add('OR CAST(:PARAM AS VARCHAR(30)) IS NULL');
    ParamByName('PARAM').Value:= NULL;
    Open;
  end;

Con mdb/TADOQuery me trae todos los campos, aún cuando le especifique uno:
Código Delphi [-]
  with ADOQuery1 do
  begin
    Close;
    SQL.Add('SELECT * FROM COUNTRY');
    SQL.Add('WHERE (NAME = :PARAM) OR (:PARAM IS NULL)');
    Parameters.ParamByName('PARAM').Value:= 'Cuba'; // igual que con NULL
    Open;
  end;

Con BDE y TQuery si la tiene, no le encontré la vuelta (pero estos dos últimos componentes y gestores no son mi fuerte).

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 29-08-2014
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola Román.

Cita:
Empezado por roman Ver Mensaje
Código SQL [-]
SELECT * FROM tabla WHERE campo = :param OR :param IS NULL
Es como dices, creo que así debe trabajar cualquier motor SQL, y no debiera ser relevante el componente Delphi que se use.

Aunque yo pondría primero la condición :Param Is Null y luego la condición Campo = :Param. Bajo la lógica de contemplar primero la opción más simple de razonar (¿trae valor?) y luego la más elaborada (¿el valor que trae es el mismo del campo tal?). Desde luego, aplico esta clase de acomodos "mentales" siempre que no repercuta negativamente en el desempeño de procesamiento.

Aprovecho para pedirte que por favor me esperes un par de semanas más para darte una razón de aquello que está pendiente.

Un abrazo.

Al.
Responder Con Cita
  #4  
Antiguo 29-08-2014
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Poder: 22
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Aquí informe...

Componentes: FIBPlus
Evaluado: FIBDataset
Código Delphi [-]
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
     pFIBDataSet1.Close;
     pFIBDataSet1.ParamByName('ID_EMP').Clear; //Null
     pFIBDataSet1.Open;
end;

procedure TForm2.BitBtn2Click(Sender: TObject);
begin
     pFIBDataSet1.Close;
     pFIBDataSet1.ParamByName('ID_EMP').AsInteger:=1;
     pFIBDataSet1.Open;
end;
El resultado es el esperado...
Saludos cordiales
Responder Con Cita
  #5  
Antiguo 29-08-2014
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
Muchas gracias por las respuestas. Por lo que veo, no parece ser un estándar aun cuando sería deseable que lo fuese. Claro que, en realidad, el problema se origina en que la VCL no establece un ancestro común para los componentes tipo Query (TDataSet es demasiado genérico) así que, supongo, queda en manos de cada implementador el qué hacer cuando no se asigna valor a un parámetro.

// Saludos
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿por que parametros opcionales function procedure no me funcionan? JXJ Varios 9 13-04-2012 04:49:56
Parametros Opcionales no Parametros por defecto Velia Varios 7 19-08-2006 15:18:42
Parametros Opcionales c748a Varios 5 21-09-2005 04:53:25
Parametros Opcionales en Procedures/Functions Enan0 Varios 4 03-03-2005 10:32:30
Parametros opcionales en SELECTs Gydba Firebird e Interbase 4 22-04-2004 22:46:38


La franja horaria es GMT +2. Ahora son las 01:21:56.


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