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 03-10-2007
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Una opción que me gusta un poco más es usar parámetros:
Te olvidas de esta manera de tener que dar formato a los campos (QuotedStr, DateTimeToStr, etc...
Código Delphi [-]
procedure TForm1.FormShow(Sender: TObject);
var
  Dia: String;
begin
 Dia:=DateTimeToStr(Now);
 with DM.IBQuery1 do
   begin
       if Active=True then Active:=False;
       UnPrepare;
       SQL.Clear;
       SQL.Add('SELECT DNI1, LETRA_NIF, APELLIDO_1, APELLIDO_2, NOMBRE, MATRICULA, CENTRO, OBJETO, DNI2, DIA_SALIDA, DIA_ENTRADA');
       SQL.Add('FROM EXTERNOS_DNI, MOV_EXTERNOS_DNI');
       SQL.Add('WHERE DNI1=DNI2 AND DIA_ENTRADA=?DIA_ENTRADA'); {Aqui no se si va ? o : delante del nombre del parametro}
       SQL.Add('ORDER BY DNI1');
       {No recuerdo si debe ir entre parentesis o entre corchetes}
       Params.ByName['DIA_ENTRADA'].AsDateTime := Dia;
       Prepare;
       if Active=False then Active:=True;
       Open;
   end;
end;

Última edición por duilioisola fecha: 03-10-2007 a las 12:06:00. Razón: Salian caritas ...
Responder Con Cita
  #2  
Antiguo 03-10-2007
gorsan gorsan is offline
Miembro
 
Registrado: jun 2003
Ubicación: Alcala de Henares (Madrid)
Posts: 87
Poder: 24
gorsan Va por buen camino
Sigue igual

El siguiente codigo (retocado minimamente respecto al que me has pasado) arroja cero registros y deberia haber alguno:

Código SQL [-]
procedure TForm1.FormShow(Sender: TObject);
var
  Dia: String;
begin
 Dia:=DateTimeToStr(Now);
 with DM.IBQuery1 do
   begin
       if Active=True then Active:=False;
       UnPrepare;
       SQL.Clear;
       SQL.Add('SELECT DNI1, LETRA_NIF, APELLIDO_1, APELLIDO_2, NOMBRE, MATRICULA, CENTRO, OBJETO, DNI2, DIA_SALIDA, DIA_ENTRADA');
       SQL.Add('FROM EXTERNOS_DNI, MOV_EXTERNOS_DNI');
       SQL.Add('WHERE DNI1=DNI2 AND DIA_ENTRADA=?DIA_ENTRADA'); {en lugar de ? debe haber dos puntos}
       SQL.Add('ORDER BY DNI1');
       Params[0].AsString:=Dia;
       Prepare;
       if Active=False then Active:=True;
       Open;
   end;
end;

Creo que saber lo que pasa pero no como arreglarlo. La variable dia es un TDateTime convertido a cadena. Por tanto tiene el siguiente formato:
"01/01/2001 10:00:00" y claro, no coincide por el añadido de la hora. Lo suyo seria eliminar de alguna manera (?) el campo hora de la cadena. ¿Pero como?
Gracias de antemano.
Responder Con Cita
  #3  
Antiguo 03-10-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 22
Ivanzinho Va por buen camino
Cita:
Empezado por gorsan Ver Mensaje
El siguiente codigo (retocado minimamente respecto al que me has pasado) arroja cero registros y deberia haber alguno:

Código SQL [-]procedure TForm1.FormShow(Sender: TObject);
var
Dia: String;
begin Dia:=DateTimeToStr(Now); with DM.IBQuery1 do begin if Active=True then Active:=False;
UnPrepare;
SQL.Clear;
SQL.Add('SELECT DNI1, LETRA_NIF, APELLIDO_1, APELLIDO_2, NOMBRE, MATRICULA, CENTRO, OBJETO, DNI2, DIA_SALIDA, DIA_ENTRADA');
SQL.Add('FROM EXTERNOS_DNI, MOV_EXTERNOS_DNI');
SQL.Add('WHERE DNI1=DNI2 AND DIA_ENTRADA=?DIA_ENTRADA'); {en lugar de ? debe haber dos puntos}
SQL.Add('ORDER BY DNI1');
Params[0].AsString:=Dia;
Prepare;
if Active=False then Active:=True;
Open;
end;
end;


Creo que saber lo que pasa pero no como arreglarlo. La variable dia es un TDateTime convertido a cadena. Por tanto tiene el siguiente formato:
"01/01/2001 10:00:00" y claro, no coincide por el añadido de la hora. Lo suyo seria eliminar de alguna manera (?) el campo hora de la cadena. ¿Pero como?
Gracias de antemano.
Yo de ti lo almacenaría como un campo Date, pero para el caso que nos ocupa podría valerte los siguiente :

Código Delphi [-]
Dia := 'La_Fecha_Que_Sea%'
UnPrepare; 
SQL.Clear;SQL.Add('SELECT DNI1, LETRA_NIF, APELLIDO_1, APELLIDO_2, NOMBRE, MATRICULA, CENTRO, OBJETO, DNI2, DIA_SALIDA, DIA_ENTRADA');
SQL.Add('FROM EXTERNOS_DNI, MOV_EXTERNOS_DNI');
SQL.Add('WHERE DNI1=DNI2 AND DIA_ENTRADA like :DIA_ENTRADA'); 
SQL.Add('ORDER BY DNI1');
Params[0].AsString:=Dia;
Prepare;
if Active=False then 
   Active:=True;
Open;
Un saúdo
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)

Última edición por Ivanzinho fecha: 03-10-2007 a las 13:10:36.
Responder Con Cita
  #4  
Antiguo 03-10-2007
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Lo malo de tratarlo como un string, son las conversiones. (dd/mm/yyyy, mm/dd/yyyy, etc.)

Puedes tratar de la siguiente manera:
Dia será del tipo TDateTime.
Trunc(Dia) devuelve la fecha sin hora.

Código Delphi [-]
procedure TForm1.FormShow(Sender: TObject);
var
  Dia: TDateTime;
begin
   {Dia:=DateTimeToStr(Now);}
   with DM.IBQuery1 do
   begin
       if Active=True then Active:=False;
       UnPrepare;
       SQL.Clear;
       SQL.Add('SELECT DNI1, LETRA_NIF, APELLIDO_1, APELLIDO_2, NOMBRE, MATRICULA, CENTRO, OBJETO, DNI2, DIA_SALIDA, DIA_ENTRADA');
       SQL.Add('FROM EXTERNOS_DNI, MOV_EXTERNOS_DNI');
       SQL.Add('WHERE DNI1=DNI2 AND DIA_ENTRADA >= ESDE_ENTRADA AND DIA_ENTRADA < :HASTA_ENTRADA');
       SQL.Add('ORDER BY DNI1');
       Params[0].AsDateTime:=Trunc(Dia);
       Params[1].AsDateTime:=Trunc(Dia+1);
       Prepare;
       if Active=False then Active:=True;
       Open;
   end;
end;
Responder Con Cita
  #5  
Antiguo 03-10-2007
gorsan gorsan is offline
Miembro
 
Registrado: jun 2003
Ubicación: Alcala de Henares (Madrid)
Posts: 87
Poder: 24
gorsan Va por buen camino
Para duilioisola

No entiendo bien el código que me pones:
Código Delphi [-]
SQL.Add('WHERE DNI1=DNI2 AND DIA_ENTRADA >= ESDE_ENTRADA AND DIA_ENTRADA < :HASTA_ENTRADA');
¿Podias ser mas explicito? Muchas gracias por tu tiempo.
Responder Con Cita
  #6  
Antiguo 03-10-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Estarás harto de usar procedimientos con parámetros de entrada ¿verdad? Por ejemplo cuando usas combo.Items.Add('un elemento más'), estas usando un parámetro de tipo texto que se lo das al método "Add". Pues eso mismo se hace aquí pero, con un TIBQuery.

En realidad, el código where debe aparecer así: (sin los emoticones jejeje):
Código Delphi [-]
SQL.Add('WHERE DNI1=DNI2 AND DIA_ENTRADA >= :DESDE_ENTRADA AND DIA_ENTRADA < :HASTA_ENTRADA');

Cuando antepones los dos puntos ":" a un nombre, éste se convierte en un parámetro de entrada, que después se asigna su valor con:
Código Delphi [-]
 Params[0].AsDateTime:=Trunc(Dia);
 Params[1].AsDateTime:=Trunc(Dia+1);

o bien:
Código Delphi [-]
 ParamByName('DESDE_ENTRADA').AsDateTime:=Trunc(Dia);
 ParamByName('hasta_entrada').AsDateTime:=Trunc(Dia+1);

Aquí se ha usado DESDE_ENTRADA y HASTA_ENTRADA, pero puedes poner el nombre que te venga en gana, siempre que no sea igual a una palabra reservada de SQL o nombre de un campo (eso ya es otra historia ).

¿Ventajas?
- Al usar parámetros el SQL queda compilado, las sucesivas ejecuciones son más rápidas, precisamente porque la expresion SQL no ha de evaluarse de nuevo.

- Delphi se encarga de las conversiones de fechas (por ejemplo), ten en cuenta que paradox, Firebird, Oracle, etc pueden usar configuraciones de fecha distintas dd/mm/yyyy o bien mm/dd/yyyy o bien yyyy/mm/dd.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 03-10-2007
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Una cosa más sobre la explicación que te han dado:

Si Dia = 03/10/2007 16:21
Trunc(Dia)=03/10/2007
Trunc(Dia+1)=04/10/2007

El WHERE del SQL hace que 03/10/2007 <= DIA_ENTRADA < 04/10/2007.
- O dicho de otra manera: que DIA_ENTRADA esté comprendido entre 03/10/2007 y 04/10/2007.
- O dicho de otra manera diferente: todas las horas del día 03/10/2007.

Nota:
- al poner >= 03/10/2007 tomará todo lo mayor que el 03/10/2007 y este incluido.
- al poner < 04/10/2007, tomará todo hasta el 04/10/2007 pero sin el 04/10/2007. O sea hasta el 03/10/2007 23:59:59
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
Filtrar miguel_figueroa Conexión con bases de datos 11 03-01-2007 23:50:48
Filtrar BD NoSv Conexión con bases de datos 8 11-10-2006 12:27:47
Filtrar Dbf userlazarus Conexión con bases de datos 2 23-05-2006 16:48:45
Filtrar pepelu1975 OOP 24 18-05-2004 09:14:57
Filtrar elloco C++ Builder 2 28-04-2004 05:12:36


La franja horaria es GMT +2. Ahora son las 03:59: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