Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-11-2012
jsc jsc is offline
Miembro
 
Registrado: nov 2003
Posts: 144
Poder: 22
jsc Va por buen camino
Problema en consulta sql

Hola,
Tengo problemas con una consulta sql que lanzo desde delphi a una bd access (en si la consulta si la lanzo desde acces tambien da el mismo problema asi que no es problema de delphi)
Los datos en access estan importados de una hoja excell. La hoja excell, no tiene en todas las columnas datos, asi que podemos encontrar en alguna columna blancos - ahí el problema
La cosa, es que no se de que manera puedo tratar esos blancos ya que he probado de todo
En acces todos los campos estan definidos como texto: el campo tlf2 de algun registro contiene texto...
Supongamos que la hoja excell tiene:
Código:
NOMBRE  DIRECCION TELEF1 TELEF2
jsc1       direccion1   tlf1  tlf2
jsc2       direccion2   tlf2
nombre3 direccion3   tlf3
...
en delphi, tengo una etiqueta por campo(nombre,direccion,tlf1,tlf2) de manera que la busqueda la pueda hacer concatenando parametros con los valores de
Código:
edit1.text, edit2.text,edit3.tex,edit4.text
la consulta que lanzo al escribir cualquier caracter en cualquiera de los edit es lo siguiente
Código:
procedure buscar(s:string);
begin
   with form1 do
      with form1.Query1 do
         TRY
         Close ;
         SQL.clear ;
         Params.Clear ;
         sql.add ('SELECT * FROM TABLA') ;
         if s<>'todos'
         then
            begin
               sql.add (' where NOMBRE like :nomb AND DIRECCION like :direc AND TELEF1 like :tlf1 AND TELEF2 like :tlf2');
               parambyname ('nomb').asstring := '%'+edit1.Text+'%' ;
               parambyname ('direc').asstring := '%'+edit2.text+'%';
               parambyname ('tlf1').asstring := '%'+edit3.text+'%';
               parambyname ('tlf2').asstring := '%'+edit5.text+'%'
            end;
         IF not prepared
         then
            begin
               close ;
               prepare;
               open;
            end
         else open ;
         EXCEPT MessageDlg ('Errores en la consulta',mtWarning,[mbOK],0);
         END;
end;
llamada:
Código:
procedure Tform1.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   buscar ('param') ;
end;
llamada para cargar todos al cargar el Form1

Código:
procedure Tform1.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   buscar ('todos') ;
end;
si escribimos en edit1 jsc de tal manera que
Código:
edit1.text:= 'jsc'
lo que espero me devuelva la consulta son todos esos nombres que contengan JSC; es decir
Código:
NOMBRE  DIRECCION TLF1 TLF2
jsc1       direccion1   tlf1  tlf2
jsc2       direccion2   tlf2
en cambio el resultado es bien distinto ya que el tlf2 que estaria en blanco no lo devuelve

Código:
NOMBRE  DIRECCION TLF1 TLF2
jsc1       direccion1   tlf1  tlf2
he cambiado el campo tlf2 de texto a numero en access por hacer la prueba pero el resultado es el mismo
pienso que el problema esta en la tabla excell y en esos campos en blanco. Tendria manera de saber esos blancos realmente que valor almacenan para poder tratarlos en una consulta?
o lamentablemente, a esos valores en blanco tendria que asignarles un valor en excell? por ejemplo "0"?
lo he probado asi y si que funciona la consulta; el problema es que son alrededor de 30.000 registros y es un problema si no se el valor que almacena como blanco para poder hacer un
Código:
UPDATE...
sobre el campo en cuestion

Siento la chapa; he intentado detallar el problema lo maximo posible por si alguien pudiera ayudarme

gracias de antemano
Responder Con Cita
  #2  
Antiguo 14-11-2012
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 jsc.

Si buscas que muestre resultados cuando encuentre una ocurrencia al menos en uno de los campos, proba de este modo:
Código SQL [-]
WHERE NOMBRE LIKE :nomb OR DIRECCION LIKE :direc OR TELEF1 LIKE :tlf1 OR TELEF2 LIKE :tlf2

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 14-11-2012
jsc jsc is offline
Miembro
 
Registrado: nov 2003
Posts: 144
Poder: 22
jsc Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola jsc.

Si buscas que muestre resultados cuando encuentre una ocurrencia al menos en uno de los campos, proba de este modo:
Código SQL [-]
WHERE NOMBRE LIKE :nomb OR DIRECCION LIKE :direc OR TELEF1 LIKE :tlf1 OR TELEF2 LIKE :tlf2

Saludos.
gracias por la molestia ecfisa pero no da los resultados esperados

lo he solucionado como me temia;
he editado el fichero excell y usando reemplazar en todas las columnas; he sustituido las celdas que contengan solo blanco por un 0.
de esta manera funciona; la cuestion es que me interesa no tener que hacer este proceso ya que con otros datos que importo tambien desde excell me ocurriria lo mismo y se puede convertir en una perdida de tiempo interesante el tener que adaptar el fichero excell y demas.
alguna idea?

PD.
a la hora de pasar los datos de excell a acess me ha pasado que haciendo un simple copiar pegar no me ha funcionado bien. hay datos que no los pasaba correctamente; quiza por el volumen de datos no se.
haciendo importar datos externos y siguiendo el asistente, todo correcto
Responder Con Cita
  #4  
Antiguo 14-11-2012
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 20
olbeup Va camino a la fama
Cual son los resultados no esperado, cual es la SQL que has escrito, los que dice ecfisa es correcto y no debes de tener ningún problema.

Da igual que el campo este en blanco o incluso sea nulo, cuando se cumpla uno de los OR te lo va a mostrar.

Un saludo
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.

Última edición por olbeup fecha: 14-11-2012 a las 14:20:39.
Responder Con Cita
  #5  
Antiguo 14-11-2012
jsc jsc is offline
Miembro
 
Registrado: nov 2003
Posts: 144
Poder: 22
jsc Va por buen camino
Cita:
Empezado por olbeup Ver Mensaje
Cual son los resultados no esperado, cual es la SQL que has escrito, los que dice ecfisa es correcto y no debes de tener ningún problema.

Da igual que el campo este en blanco o incluso sea nulo, cuando se cumpla uno de los OR te lo va a mostrar.

Un saludo
disculpad,
quiza no me explique del todo bien
probe lo que comentaba ecfisa y me funciono bien pero solo si encontraba una coincidencia. si hay varias coincidencias no me devuelve bien el resultado.
en el ejemplo que puse arriba:
Código:
edit1.text := '%jsc%' //valor de nombre
edit2.text := '%1%'//valor de direccion
y me devuelve
Código:
nombre direccion tlf1 tlf2
jsc1     direccion1
jsc2     direccion2
cuando yo lo que busco seria

Código:
nombre direccion tlf1 tlf2
jsc1     direccion1
yo lo que busco es que la consulta la haga en base a los parametros que se le pasa.
Código:
sql.add ('SELECT * FROM TABLA') ;
if s<>'todos'
  then
     begin
        sql.add (' where NOMBRE like :nomb AND DIRECCION like :direc AND TELEF1 like :tlf1 AND TELEF2 like :tlf2');
        parambyname ('nomb').asstring := '%'+edit1.Text+'%' ;
        parambyname ('direc').asstring := '%'+edit2.text+'%';
        parambyname ('tlf1').asstring := '%'+edit3.text+'%';
        parambyname ('tlf2').asstring := '%'+edit5.text+'%'
si edit1 (nombre) contiene datos, el valor de (l'nomb') sera edit1.text
si edit2 no contiene datos, entonces, el valor de ('direct') tendria que ser todo;
para ello se me ocurre hacerlo como en el ejemplo y pasar al parametro ('direc') que contenga cualquier valor
y con el resto de los edit lo mismo

sino otra alternativa que se me ocurre puede ser algo asi:
Código:
query1.sql.add ('SELECT * FROM TABLA')

if edit1.text <> '' 
then 
   begin
      parambyname('nomb').asstring := edit1.text
      sql.add (' and NOMBRE like :nomb)
   end;
if edit2.text <>''
then
...
de la manera que intento hacerlo, el codigo es menor y mas visual para resolver posibles errores futuros
busco una consulta concatenando varios parametros

se me ocurrio hacerlo de esta manera quiza no es la correcta?aunque si reemplazo como digo los blancos por algun texto funciona perfecto

Última edición por jsc fecha: 14-11-2012 a las 15:15:46.
Responder Con Cita
  #6  
Antiguo 14-11-2012
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 23
Caro Va por buen camino
Hola jsc, hice una prueba con la función Nz pero solo funciona desde Access, hice la prueba también con la función "IIF", al parecer también funciona si es que entendido bien lo que preguntas, has la prueba y nos cuentas.

Código SQL [-]
//tienes que acomodarlo a tu consulta, pero esa es la idea
SELECT *
FROM tabla
WHERE nombre like '%param%' and ..... and IIF(ISNULL(telef1 like '%param%'),'',telef1).....

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #7  
Antiguo 14-11-2012
jsc jsc is offline
Miembro
 
Registrado: nov 2003
Posts: 144
Poder: 22
jsc Va por buen camino
Cita:
Empezado por Caro Ver Mensaje
Hola jsc, hice una prueba con la función Nz pero solo funciona desde Access, hice la prueba también con la función "IIF", al parecer también funciona si es que entendido bien lo que preguntas, has la prueba y nos cuentas.

Código SQL [-]
//tienes que acomodarlo a tu consulta, pero esa es la idea
SELECT *
FROM tabla
WHERE nombre like '%param%' and ..... and IIF(ISNULL(telef1 like '%param%'),'',telef1).....

Saluditos
Muchas gracias Caro
Lo pruebo y comento resultados
Responder Con Cita
  #8  
Antiguo 15-11-2012
jsc jsc is offline
Miembro
 
Registrado: nov 2003
Posts: 144
Poder: 22
jsc Va por buen camino
gracias a todos los las ayudas pero no lo consigo
probe tambien lo que comentaba Caro pero tampoco me funciono
Código:
sql.add (' where IIF(ISNull(NOMBRE like :nomb),NOMBRE,'+chr(39)+chr(39)+') AND'+
   ' IIF(IsNull(DIRECCION like :direc),DIRECCION,'+chr(39)+chr(39)+') AND'+
   ' IIF(IsNull(TELEF1 like :tlf1),TELEF1,'+chr(39)+chr(39)+') AND'+
   ' IIF(IsNull(TELEF2 like :tlf2),TELEF2,'+chr(39)+chr(39)+')');
parambyname ('nomb').asstring := '%'+edit1.Text+'%' ;
parambyname ('direc').asstring := '%'+edit2.text+'%';
parambyname ('tlf1').asstring := '%'+edit3.text+'%';
parambyname ('tlf2').asstring := '%'+edit4.text+'%'
sinceramente no lo entiendo e insisto en que creo que es un problema de como access puede guardar los datos cuando algun campo es actualizado a un valor Null o incluso si ya viene con ese valor

pongo un programita donde vereis lo que quiero y como lo hago
quiza no lo este haciendo bien y aqui podreis ver mas en detalle el tema

gracias nuevamente
Archivos Adjuntos
Tipo de Archivo: zip pruebas_consulta_sql.zip (18,3 KB, 4 visitas)
Responder Con Cita
  #9  
Antiguo 16-11-2012
jsc jsc is offline
Miembro
 
Registrado: nov 2003
Posts: 144
Poder: 22
jsc Va por buen camino
Hola de nuevo,
aburrido de probar con la funcion IIF... algo se acercaba a lo que pretendia pero no daba con el correcto funcionamiento

cambie de metodo y consegui lo que me pretendia
en un principio pense que todo esto seria mas facil; en fin de todo se aprende
dejo el codigo y el programa de como a mi me ha funcionado por si a alguien le ocurre lo mismo
PROPOSITO: lanzar una consulta con los parametros que haya en 1,2,3... los edit que sean
solucionado si el campo es Null... devuelve las coincidencias de los edit

gracias a los que se interesaron por mi consulta;

codigo de la funcion:
Código:
function fAsigParamconsul (str:string):string;
var i,j:integer;
    camp,crit:string ;
begin
   with form1 do
   begin
      j:= 0 ;
      FOR i:=1 to 4 DO
      begin
         CASE i OF
            1: camp:= 'NOMBRE';
            2: camp:= 'DIRECCION';
            3: camp:= 'TELEF1';
            4: camp:= 'TELEF2';
         END;{FIN case}
      IF TEdit(Findcomponent('Edit'+inttostr(i))).Text <> ''
      then
         begin
            CASE j OF
               0: crit:='WHERE' ;
               1: crit:='AND' ;
            END;{FIN case}
         {SELECT * FROM TABLA WHERE CAMPO LIKE param}
         str := str+' '+crit+' '+camp+' LIKE '+chr(39)+'%'+TEdit(FindComponent('Edit'+inttostr(i))).Text+'%'+chr(39);
         j:= 1 ;
         end{FIN then TEdit <> ''}
//      else j:= 0 ;{ELSE TEdit <> ''}
      end;{FIN bucle FOR}
      Result := str ;
   end;{FIN with frm}
end;
llamada a la funcion
Código:
strconsul:=fAsigParamConsul ('SELECT * FROM TABLA1')
Archivos Adjuntos
Tipo de Archivo: zip SOLUCIONADO_pruebas_consulta_sql.zip (18,4 KB, 1 visitas)
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
problema con una consulta leofuentes21 SQL 6 28-02-2011 17:04:27
problema con consulta sql gonza_619 Varios 6 22-07-2010 20:42:56
problema en consulta metroyd MySQL 2 09-03-2008 20:35:58
Problema con Consulta Tolón SQL 5 30-01-2007 00:52:19
problema con consulta. jsanchez SQL 2 20-05-2003 20:35:55


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


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