Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Error con TAdoQuery Filter (https://www.clubdelphi.com/foros/showthread.php?t=72807)

kambiz 12-03-2011 19:43:25

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.

Caral 12-03-2011 23:17:02

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

kambiz 13-03-2011 00:14:53

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.

oscarac 13-03-2011 00:52:41

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 :rolleyes:

kambiz 13-03-2011 01:54:49

Tampoco funciona, y por más vueltas que le doy no lo entiendo

Caral 13-03-2011 02:25:30

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

kambiz 13-03-2011 09:18:23

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.

Caral 13-03-2011 13:49:31

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

Caral 13-03-2011 14:38:46

Hola
Aqui un ejemplo de lo que digo.
Saludos

kambiz 13-03-2011 18:56:00

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.

Caral 13-03-2011 19:18:05

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

Casimiro Notevi 13-03-2011 19:26:27

Creo que todo esto tiene mucho que ver con este otro hilo.

kambiz 13-03-2011 19:56:30

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.

Caral 13-03-2011 20:57:00

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:p:D
Saludos

Casimiro Notevi 13-03-2011 21:14:41

Cita:

Empezado por kambiz (Mensaje 393451)
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.

kambiz 13-03-2011 23:03:41

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

Caral 14-03-2011 01:09:32

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

Casimiro Notevi 14-03-2011 09:34:41

Cita:

Empezado por kambiz (Mensaje 393465)
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 :confused::confused::confused:

kambiz 14-03-2011 23:57:48

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.

Caral 15-03-2011 01:00:32

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


La franja horaria es GMT +2. Ahora son las 20:26:10.

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