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)
-   -   Bug en delphi? ParamsByName??? (https://www.clubdelphi.com/foros/showthread.php?t=82645)

pablonill 28-03-2013 02:43:08

Bug en delphi? ParamsByName???
 
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.

Código SQL [-]
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.

Código Delphi [-]
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.

Código SQL [-]
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

Código Delphi [-]
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

Cita:

Empezado por jafera (Mensaje 457717)
Creo que te falta poner .Value
Código Delphi [-]
CDS.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

Código Delphi [-]
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

Cita:

Empezado por pablonill (Mensaje 457718)
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

Cita:

Empezado por Casimiro Notevi (Mensaje 457721)
¿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:
Código SQL [-]
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

Cita:

Empezado por Casimiro Notevi (Mensaje 457725)
Veamos, primero abres el ibexpert, flamerobin o el que uses y escribes la sentencia a mano:
Código SQL [-]
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
Código SQL [-]
WHERE ID_CLIENTE = :ID_CLIENTE
es el problema. El valor que pasa el parametro es desconocido, asi lo ponga manualmente o lo ponga con
Código Delphi [-]
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?

Código Delphi [-]
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

Cita:

Empezado por Casimiro Notevi (Mensaje 457734)
¿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

Código SQL [-]
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:

Código SQL [-]
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

Cita:

Empezado por pablonill (Mensaje 457736)
Esto me devuelve el SQLMonitor

Código SQL [-]
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

Cita:

Empezado por Casimiro Notevi (Mensaje 457738)
te aconsejo que quites los componentes que estás usando ..

Cita:

Empezado por pablonill (Mensaje 457783)
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


La franja horaria es GMT +2. Ahora son las 00:52:26.

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