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 Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-03-2011
kambiz kambiz is offline
Miembro
 
Registrado: jun 2004
Posts: 24
Poder: 0
kambiz Va por buen camino
Error con TAdoQuery Filter

Buenas,
Alguien podría decirme porqué el siguiente filtro en un TAdoQuery:
idBanc = 34 and idempresa = 6 and (Referencia = '0001/23-456 A' or Referencia = '1/23-456 A')
me da el siguiente error:
Argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros
Si elimino los parèntesis no da error, pero no hace lo que yo quiero.
La base de datos es Access. Ya sé que si pusiera el filtro en el where no tendría problemas, pero no puedo.
Muchísimas gracias.
Responder Con Cita
  #2  
Antiguo 12-03-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Código Delphi [-]
idBanc = 34 and  idempresa = 6 and (Referencia = '0001/23-456 A') or (Referencia = '1/23-456 A')
Seria preferible que usaras parametros, te evitarias problemas.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 13-03-2011
kambiz kambiz is offline
Miembro
 
Registrado: jun 2004
Posts: 24
Poder: 0
kambiz Va por buen camino
Gracias por responder, pero no es correcto
La instrucción tal como yo la planteo tienen que darse 3 condiciones:
- idBanc = 34 y
- idEmpresa = 6 y
- Referencia = '0001/23-456 A' or Referencia = '0001/23-456 A'

Tal como la has puesto tu, no da error, pero no cumple las tres condiciones.

Claro, estoy de acuerdo, mejor usar parámetros o usar el where. Pero no puedo. Es un programa complejo, escrito por otra persona, y cambiar la instrucción sql no sé las repercusiones que podría tener.
Responder Con Cita
  #4  
Antiguo 13-03-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
entonces debe ser mas o menos asi
nota los patentesis

Código Delphi [-]
(idBanc = 34) and  (idempresa = 6) and (Referencia = '0001/23-456 A' or Referencia = '1/23-456 A')

avisas si te funciono
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #5  
Antiguo 13-03-2011
kambiz kambiz is offline
Miembro
 
Registrado: jun 2004
Posts: 24
Poder: 0
kambiz Va por buen camino
Tampoco funciona, y por más vueltas que le doy no lo entiendo
Responder Con Cita
  #6  
Antiguo 13-03-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Segun veo los dos primeros campos son integer y el tercero es texto.
Cuando se hace un filtro en access a un campo texto se necesita colocar ciertas condiciones.
Yo colocaria unas variables, si es que el dato no se saca por ejemplo de un edit, algo asi:

Código Delphi [-]
var 
Filtro, a, b : String;
begin
   a:= '1/23-456 A';
   b:= '0001/23-456 A';
   ADOQuery1.Filtered := False;
   Filtro := 'idBanc = 34 and  idempresa = 6 and  Referencia Like '''+a+'*'' OR Referencia Like '''+b+'*''';
   ADOQuery1.Filter := Filtro;
   ADOQuery1.Filtered := True
   end
   else 
   ADOQuery1.Filtered := False;
end;

Otra opcion:

Código Delphi [-]
var 
Filtro, a, b : String;
begin
   a:= '1/23-456 A';
   b:= '000'+a;
   ADOQuery1.Filtered := False;
   Filtro := 'idBanc = 34 and  idempresa = 6 and  Referencia Like '''+a+'*'' OR Referencia Like '''+b+'*''';
   ADOQuery1.Filter := Filtro;
   ADOQuery1.Filtered := True
   end
   else 
   ADOQuery1.Filtered := False;
end;

Hice algunas pruebas y funciona a la perfección.
Saludos
__________________
Siempre Novato

Última edición por Caral fecha: 13-03-2011 a las 02:40:36.
Responder Con Cita
  #7  
Antiguo 13-03-2011
kambiz kambiz is offline
Miembro
 
Registrado: jun 2004
Posts: 24
Poder: 0
kambiz Va por buen camino
Caral, gracias por tu interés per fíjate, los paréntesis tienen su importancia.

Fíjate en el siguiente ejemplo:
idBanc = 6 idEmpresa = 34 Referencia = '1/23-456 A'
idBanc = 6 idEmpresa = 34 Referencia = '0001/23-456 A'
idBanc = 5 idEmpresa = 34 Referencia = '1/23-456 A'

La sentencia, sin paréntesis, te devuelve los 3 registros, cosa que no quiero, ya que el tercero no cumple con todas las condiciones

Las condiciones són:
- idBanc = 6 y
- idEmpresa = 34 y
- Referencia = '1/23-456 A' o Referencia '0001/23-456 A'

Gracias.
Responder Con Cita
  #8  
Antiguo 13-03-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Probaste el codigo????.
Como puede devolver un dato que no coincide (idBanc = 5) ?, como puede devolver incluso dos ?, menos tres.
A mi me devuelve un solo registro ya que se define por el contenido de OR en el filtro, osea, o uno u otro, no los dos que coinciden.
Este es el que me devuelve:
idBanc = 6 idEmpresa = 34 Referencia = '1/23-456 A'
Como ves solo un registro.
Saludos
__________________
Siempre Novato

Última edición por Caral fecha: 13-03-2011 a las 13:59:50.
Responder Con Cita
  #9  
Antiguo 13-03-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Aqui un ejemplo de lo que digo.
Saludos
__________________
Siempre Novato

Última edición por Caral fecha: 14-03-2011 a las 02:01:19.
Responder Con Cita
  #10  
Antiguo 13-03-2011
kambiz kambiz is offline
Miembro
 
Registrado: jun 2004
Posts: 24
Poder: 0
kambiz Va por buen camino
Buenas Caral, gracias por tu atención.

No he podido acceder al ejemplo que me has enviado.

De todas maneras es una cuestión de prioridades. Te pondré diferentes pruebas, partiendo que tenemos así la base de datos:
idBanc = 6 idEmpresa = 34 Referencia = '1/23-456 A'
idBanc = 6 idEmpresa = 34 Referencia = '0001/23-456 A'
idBanc = 6 idEmpresa = 34 Referencia = '1/23-456 A'

Ejemplo 1
idBanc = 6 and idEmpresa = 34 and Referencia = '1/23-456 A' or Referencia = '0001/23-456 A'
devuelve segundo registro

Ejemplo 2
idBanc = 6 and idEmpresa = 34 and Referencia = '0001/23-456 A' or Referencia = '1/23-456 A'
devuelve el primer y tercer registro

Ejemplo 3
idBanc = 5 and idEmpresa = 34 and Referencia = '0001/23-456 A' or Referencia = '1/23-456 A'
devuelve los mismos que el ejemplo anterior, porqué al no usar paréntesis, si se da la última condición devuelve el registro.

Agradecida por tu interés.
Responder Con Cita
  #11  
Antiguo 13-03-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
La verdad no entiendo.
1- por que no usar sql, cual es el problema?, no veo que repercusiones tenga el usar sql en el mismo query, si al final de cuentas quedara tal como estaba cuando se quiera.
2- Si se usara un sql se podria usar ditinc, y se ahorraria muchos dolores de cabeza.
No entiendo.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #12  
Antiguo 13-03-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que todo esto tiene mucho que ver con este otro hilo.
Responder Con Cita
  #13  
Antiguo 13-03-2011
kambiz kambiz is offline
Miembro
 
Registrado: jun 2004
Posts: 24
Poder: 0
kambiz Va por buen camino
Buenas, hice los dos posts porqué creí que eran dos temas diferentes:
- quería saber si existia una función sql para eliminar ceros a la izquierda de un string

- entender porqué me da error una sentencia, en un filtro de un tadoquery, con el siguiente formato:
(condición 1) y (condicion 2) y (condicion3 o condicion4)

Si una cosa tiene la informática es la infinidad de posibilidades de conseguir lo que uno se propone. Pero me hubiera gustado de la manera que lo he planteado.

Gracias por vuestra aportación.
Responder Con Cita
  #14  
Antiguo 13-03-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Access igual que firebird acepta IIF en una consulta.
Esto nos ayuda a definir ciertas condiciones de la misma.
De darse una u otra entonces se ejecuta la que uno desee.
Access, por otro lado posee un generador de consultas muy practico.
Sigo sin entender nada de nada.
Me estoy haciendo viejito
Saludos
__________________
Siempre Novato
Responder Con Cita
  #15  
Antiguo 13-03-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por kambiz Ver Mensaje
Buenas, hice los dos posts porqué creí que eran dos temas diferentes:
- quería saber si existia una función sql para eliminar ceros a la izquierda de un string
- entender porqué me da error una sentencia, en un filtro de un tadoquery, con el siguiente formato:
(condición 1) y (condicion 2) y (condicion3 o condicion4)
Si una cosa tiene la informática es la infinidad de posibilidades de conseguir lo que uno se propone. Pero me hubiera gustado de la manera que lo he planteado.
Gracias por vuestra aportación.
Esto he escrito en el otro tema:
Pienso que el principal problema es de desconocimiento, que no conoce el programa y no se atreve a tocar nada, pero el problema es que así no es fácil ayudar.
Responder Con Cita
  #16  
Antiguo 13-03-2011
kambiz kambiz is offline
Miembro
 
Registrado: jun 2004
Posts: 24
Poder: 0
kambiz Va por buen camino
Sí Casimiro, esto es exactamente lo que pasa, es que no me atrevo a tocar el programa y eso hace que sea difícil ayudar.
De todas maneras aislándolo todo, me gustaría saber porqué un AdoQuery, en Filter no acepta esto:
(condición1) y (condicion2) y (condición3 o condición4)

Alternativas a esto, mejor manera de hacerlo .... lo sé

Gracias por todo
Responder Con Cita
  #17  
Antiguo 14-03-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Lo que se pretende es, a mi criterio IMPOSIBLE, por que?.
Si tenemos tres datos, los filtramos y dos de los tres campos cumplen el criterio se mostrara los tres, es logico, las bases de datos son secuenciales, muestran la totalidad de la linea.
Si hicieramos una sentencia sql asi:
Código SQL [-]
SELECT Banco.[idBanc], Banco.[idEmpresa], Banco.Referencia
FROM Banco
WHERE (((Banco.[idBanc])=6) AND ((Banco.[idEmpresa])=34) AND ((Banco.Referencia)="0001/23-456 A")) OR (((Banco.Referencia)="1/23-456 A"));
Nos mostraria los tres registros, incluyendo el que supuestamente no deberia:

idBanc - Referencia - idEmpresa
6 - 0001/23-456 A - 34
5 - 1/23-456 A - 34
6 - 1/23-456 A - 34

Y eso que se determina con el Where que solo los que coincidan con referencia, como es logico, la referencia del 5 tambien es la misma y la mostrara.
Sea con un filtro o con una sentencia se mostraran los tres campos, salvo que se determine UNA de las condiciones, por ende solo mostrara la diferente, en este caso:

Código Delphi [-]
Filtro := 'idBanc = 34 and  idempresa = 6 and  Referencia Like '+QuotedStr('1/23-456 A')+' OR Referencia Like '+QuotedStr('0001/23-456 A')+'';

Y mostrara la diferente:

dBanc - Referencia - idEmpresa
6 - 0001/23-456 A - 34

Por eso digo: no entiendo esto.
Ademas sigo sin enterder cual es el problema de modificar un adoquery en una operacion, si regresara a su estado normal posteriormente, aunque en este caso no funcionara aun con un DISTINCT.
No se, digo...
Saludos
__________________
Siempre Novato

Última edición por Caral fecha: 14-03-2011 a las 01:16:16.
Responder Con Cita
  #18  
Antiguo 14-03-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por kambiz Ver Mensaje
Sí Casimiro, esto es exactamente lo que pasa, es que no me atrevo a tocar el programa y eso hace que sea difícil ayudar.
Pues si no lo tocas... entonces qué hacemos
Responder Con Cita
  #19  
Antiguo 14-03-2011
kambiz kambiz is offline
Miembro
 
Registrado: jun 2004
Posts: 24
Poder: 0
kambiz Va por buen camino
Gracias Caral por tu interés, entiendo que te parezca estraño la negativa a modificar la sentencia sql del adoquery, pero es así. Se trata de un programa muy amplio, de difícil comprensión por los pocos comentarios que tiene, por el poco conocimiento que tengo de todas las funcionalidades, y porqué la persona que lo escribió está ilocalizable.

Y de nuevo gracias por intentarlo.
Responder Con Cita
  #20  
Antiguo 15-03-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Cuando se lanza un evento y se quiere modificar un AdoQuery, este quedara intanto una vez que se decida.
Por eso digo: No entiendo por que no usar el query ?.
Saludos
__________________
Siempre Novato
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
Error en consulta sql TADOQuery hoguera Conexión con bases de datos 11 26-11-2008 13:15:00
En TADOQuery, con SELECT en algunas columnas da error. Me pide las otras Wonni Conexión con bases de datos 6 18-06-2007 15:23:34
filter vroa74 Conexión con bases de datos 3 06-03-2007 22:51:18
Uso de filter CONY Conexión con bases de datos 1 02-08-2006 22:48:23
Error con el Tadoquery jas010 SQL 2 03-03-2005 23:32:07


La franja horaria es GMT +2. Ahora son las 01:34:49.


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