PDA

Ver la Versión Completa : Bug en delphi? ParamsByName???


pablonill
28-03-2013, 02:43:08
Hola buenas noches!, tengo el siguiente escenario, tengo una base de datos firebird y uso controles dbexpress. Tengo una capa con un SQLQuery donde tengo la siguiente consulta.

SELECT ID_CLIENTE, CONCEPTO, DEBE, HABER, (DEBE - HABER) AS SALDO, FECHA
FROM TCTACTE
WHERE ID_CLIENTE = :ID_CLIENTE


En otra capa tengo un Provider y un ClientDataSet (prefio FetchParams).
Por otro lado tengo un formulario con una grilla que en el evento OnCreate tengo el siguiente codigo.

CDS.TCtaCte.Close;
CDS.TCtaCte.Params.ParamByName('ID_CLIENTE').AsInteger := CDS.TClientesID_CLIENTE.AsInteger;
CDS.TCtaCte.Open;


Bueno resulta que al abrir la tabla TCtaCte no devuelve nada la consulta, use un SQLMonitor y me devuelve la siguiente consulta.

SELECT ID_CLIENTE, CONCEPTO, DEBE, HABER, (DEBE - HABER) AS SALDO, FECHA
FROM TCTACTE
WHERE ID_CLIENTE = ?

Hasta poniendo el codigo del cliente de forma manual el resultado es el mismo. Aclaro ya hice el FetchParams del lado del ClientDataSet, probe esta consulta en un editor SQL y funciona perfecta.

Espero puedan ayudarme, saludos y muchas gracias por su tiempo.

jafera
28-03-2013, 12:03:02
Creo que te falta poner .Value en vez de asInteger

CDS.TCtaCte.Close;
CDS.TCtaCte.Params.ParamByName('ID_CLIENTE').AsInteger := CDS.TClientesID_CLIENTE.Value;
CDS.TCtaCte.Open;


Saludos

pablonill
28-03-2013, 12:07:07
Creo que te falta poner .ValueCDS.TCtaCte.Close;CDS.TCtaCte.Params.ParamByName('ID_CLIENTE').AsInteger := CDS.TClientesID_CLIENTE.Value;CDS.TCtaCte.Open;Saludos

Hola jafera, antes que nada gracias por tu respuesta, puse .Value, hasta probe asi

CDS.TCtaCte.Close;
CDS.TCtaCte.Params.ParamByName('ID_CLIENTE').AsInteger := 1;
CDS.TCtaCte.Open;

y el mismo resultado, asi lo ponga manual al parametro es lo mismo!, voy a reinstalar delphi y veo si se soluciona. Saludos.

Casimiro Notevi
28-03-2013, 12:46:53
voy a reinstalar delphi y veo si se soluciona

¿Reinstalar Delphi? :confused:
Es lo mismo que si le pones una vela a Santa Tecla :)

pablonill
28-03-2013, 12:51:59
¿Reinstalar Delphi? :confused:
Es lo mismo que si le pones una vela a Santa Tecla :)

Y bueno, ya no se que hacer!, jaja. Siempre hice asi y ahora no funciona!, o estoy loco o es un bug!, o estoy demasiado cansado como para ver la solucion!

Casimiro Notevi
28-03-2013, 12:54:36
Veamos, primero abres el ibexpert, flamerobin o el que uses y escribes la sentencia a mano:
select id_cliente, concepto, debe, haber, (debe-haber) as saldo, fecha
from tctacte
where id_cliente=1
Lo ejecutas y miras si devuelve valores.

Esperando respuesta... :)

pablonill
28-03-2013, 13:00:18
Veamos, primero abres el ibexpert, flamerobin o el que uses y escribes la sentencia a mano:
select id_cliente, concepto, debe, haber, (debe-haber) as saldo, fecha
from tctacte
where id_cliente=1
Lo ejecutas y miras si devuelve valores.

Esperando respuesta... :)

Si, devuelve valores!, e hice un copy/paste de la consulta para probarla desde delphi y lo mismo!, si la pego tal cual como esta sin parametros funciona perfecto desde delphi, pero cuando le agrego WHERE ID_CLIENTE = :ID_CLIENTE es el problema. El valor que pasa el parametro es desconocido, asi lo ponga manualmente o lo ponga con ParamByName('ID_CLIENTE').Value := 1

Casimiro Notevi
28-03-2013, 13:15:15
No conozco bien los componentes que estás usando, te aconsejo que hagas una búsqueda por los foros para ver cómo se usan los parámetros con ellos, cualquier ejemplo te servirá.
Además debes asegurarte de que le estás pasando un valor en el parámetro, ¿lo has comprobado?

jafera
28-03-2013, 13:15:27
Y este parametro, que valor tiene?

CDS.TClientesID_CLIENTE.Value

No se, igual no toma ningun valor y por esto no te filtra.

Pon un punto de interrupcion o un control watch y mira lo que vale CDS.TClientesID_CLIENTE.Value

Ya dirás más cosas, pues he hecho pruebas y a mi me filtra correctamente.

Saludos

Edito: Casimirio se ha adelantado, hemos escrito a la vez

Josep

pablonill
28-03-2013, 13:32:53
Gracias por su tiempo!, ya hice un break point y un debug del proceso!, el valor que pasa es 1, hasta puse el valor manualmente. Lo mas extraño es que siempre lo use así y nunca tuve un problema hasta ahora!, por eso hablaba de "bug".

Casimiro Notevi
28-03-2013, 13:50:41
¿Entonces cuál es el problema?, ¿que no se muestran en un dbgrid?

pablonill
28-03-2013, 13:59:08
¿Entonces cuál es el problema?, ¿que no se muestran en un dbgrid?

Aparte de no mostrarse en un DBGrid, no devuelve ningún registro!, hice un RecordCount, y no devuelve nada!, con el SQLMonitor me devuelve la consulta sin valor en el parametro, o sea que el problema es que no me esta pasando el valor al parametro.

Esto me devuelve el SQLMonitor

SELECT ID_CLIENTE, CONCEPTO, DEBE, HABER, (DEBE - HABER) AS SALDO, FECHA
FROM TCTACTE
WHERE ID_CLIENTE = ?

Casimiro Notevi
28-03-2013, 14:08:43
Pero si dices que lo pones manualmente, entonces ahí no cuenta para nada los parámetros.
O sea, si tú escribes:

select ....
from tctacte
where id_cliente = 1
Y ejecutas el programa, ahí no estás pasando ningún parámetro, por lo que debería de funcionar.
En caso contrario te aconsejo que quites los componentes que estás usando y vayas pasito a pasito, asegurándote de que lo haces bien en cada uno de esos pasitos.

pablonill
29-03-2013, 00:23:57
Bueno, después de tantas idas y vueltas lo solucione. El problema no esta en el procedimiento, el problema pareciera ser un bug de delphi, ya que elimine los controles, guarde, cerre delphi, lo abrí nuevamente e hice todo como estaba antes!. Cosa de locos!, pero lo importante es que ya esta listo!, Les agradezco mucho por su tiempo y paciencia. Un abrazo grande desde Tucuman - Argentina.

Al González
29-03-2013, 00:44:18
Esto me devuelve el SQLMonitor

SELECT ID_CLIENTE, CONCEPTO, DEBE, HABER, (DEBE - HABER) AS SALDO, FECHA
FROM TCTACTE
WHERE ID_CLIENTE = ?
El signo de interrogación es normal (significa que se está empleando un parámetro).

Usa el evento AfterOpen del TSQLQuery para revisar si hay o no hay datos en el registro actual y cuál es el valor del parámetro (con la propiedad Params del TSQLQuery). También, revisa que la propiedad PacketRecords del TClientDataSet sea -1 y no 0 (cuando es 0 sólo trae de la base de datos información de estructura).

Además, puedes revisar si no hay algún filtro activo en cualquiera de los dos conjuntos de datos (el TSQLQuery y el TClientDataSet), si realmente se está accediendo a la base de datos que tú quieres (y no a una copia), que todos los componentes involucrados estén debidamente relacionados, y que no estés modificando formularios, módulos de datos o unidades que están abiertos en el IDE y se llaman como los de tu proyecto, pero que en realidad pertenecen a otra carpeta.

Ya verás como resulta ser alguna cuestión menor de ese estilo. ;)

P.D. Veo que ya lo solucionaste "a la brava". :p

Casimiro Notevi
29-03-2013, 00:44:45
te aconsejo que quites los componentes que estás usando ..
ya que elimine los controles, guarde, cerre delphi, lo abrí nuevamente e hice todo como estaba antes

Sí, eso suele suceder algunas veces.

accfree
05-04-2013, 11:41:23
Si utilizas ParamsByName evidentemente el parámetro debe estar previamente creado.
Lo tenías creado o solo lo estabas indicando en la Query?
Usa CreateParam para crear prweviemente el parámetro o usa el propio editor de params del TQuery

Saludos