PDA

Ver la Versión Completa : Una Query me da error al pasarle una SQL larga


David
05-01-2008, 14:30:34
Hola

Explico lo que me ocurre, saco un listado de Clientes, con sus facturas, uso firebird, utilizo una una IBQuery al que engancho un provider y un TClienteDataSet. Lo que hago es que antes de abrir el client dataSet, le añado a la Query, en su SQL una cadena con los clientes que necesito, que pueden ser 100, 200, etc..., el caso es que cuando hay muchos clientes, me da error al abrir el clientDataSet.

Explico con un ejemplo más visual(los nombres de los componentes me los invento, para que se entienda mejor)
La Query , QueryCliente , tiene esta SQL : Select misCampos from TablaClientes (donde digo mis campos, pues obviamente estan CodigoCliente,Nombre,Telefono,Direccion,etc...



ClientDataSetCliente.Close;

// si hasta unos 100 clientes funciona bien,pero si pongo más 150 o así, ya da error
QueryCliente.SQL[3] := 'Where (Cliente in (1,2,3,4,10,12));

ClientDataSetCliente.open;



Como digo funciona hasta un número de clientes, luego da error, como si no se puediera hacer la SQL tan larga, he intentando poner la SQL en varias lineas, algo así:

Where (Cliente in (1,31,3131,12,33,
12,313,313,3131));

pero da igual, sigue dando error al pasarle una cadena de una cierta longitud.


Es inevitable, que pase esto ? o hay alguna solución, esa es mi pregunta.

Un saludo

BlueSteel
05-01-2008, 14:35:10
Hola David

Que error es el que te da en forma precisa... te da algun mensaje...

no te saldria mejor que en vez de poner el codigo, pongas algun campo en la tabla y realizas el filtro por los que cumplen dicha condicion

Salu2:p:D

Lepe
05-01-2008, 14:48:35
La cláusula IN en Firebird 1.5 tiene un límite de 1.500 elementos, puesto que dices da error en 100 o 200, creo es la forma de añadirlo al query.

No entiendo por qué accedes al SQL con índices (entre corchetes), no deberías pensar que tienes espacio en memoria asignado para trabajar con él. Dicho de otra forma, usa los métodos Add que tiene la propiedad sql.


Supongo que dicha restricción del where, lo haces en tiempo de ejecución, así que no tendrás problemas con los strings. Atención al "Add":

ClientDataSetCliente.Close;

QueryCliente.SQL.Add('Where (Cliente in (1,2,3,4,10,12))');
ClientDataSetCliente.open;

También podrías partir la cadena, incluso para hacerla más legible:
QueryCliente.SQL.Add('Where ');
QueryCliente.SQL.Add(' Cliente in (1,2,3,4,' );
QueryCliente.SQL.Add(' 10,12)');


Saludos