FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 ... Código:
edit1.text, edit2.text,edit3.tex,edit4.text 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; Código:
procedure Tform1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin buscar ('param') ; end; Código:
procedure Tform1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin buscar ('todos') ; end; Código:
edit1.text:= 'jsc' Código:
NOMBRE DIRECCION TLF1 TLF2 jsc1 direccion1 tlf1 tlf2 jsc2 direccion2 tlf2 Código:
NOMBRE DIRECCION TLF1 TLF2 jsc1 direccion1 tlf1 tlf2 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... Siento la chapa; he intentado detallar el problema lo maximo posible por si alguien pudiera ayudarme gracias de antemano |
#2
|
||||
|
||||
Hola jsc.
Si buscas que muestre resultados cuando encuentre una ocurrencia al menos en uno de los campos, proba de este modo:
Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#3
|
|||
|
|||
Cita:
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 |
#4
|
||||
|
||||
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. |
#5
|
|||
|
|||
Cita:
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 Código:
nombre direccion tlf1 tlf2 jsc1 direccion1 jsc2 direccion2 Código:
nombre direccion tlf1 tlf2 jsc1 direccion1 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 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 ... 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. |
#6
|
||||
|
||||
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.
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. |
#7
|
|||
|
|||
Cita:
Lo pruebo y comento resultados |
#8
|
|||
|
|||
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+'%' 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 |
#9
|
|||
|
|||
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; Código:
strconsul:=fAsigParamConsul ('SELECT * FROM TABLA1') |
|
|
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 |
|