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 28-03-2013
Avatar de pablonill
pablonill pablonill is offline
Miembro
 
Registrado: dic 2006
Posts: 92
Poder: 18
pablonill Va por buen camino
Question 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.
Responder Con Cita
  #2  
Antiguo 28-03-2013
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 28-03-2013
Avatar de pablonill
pablonill pablonill is offline
Miembro
 
Registrado: dic 2006
Posts: 92
Poder: 18
pablonill Va por buen camino
Cita:
Empezado por jafera Ver Mensaje
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.
Responder Con Cita
  #4  
Antiguo 28-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por pablonill Ver Mensaje
voy a reinstalar delphi y veo si se soluciona
¿Reinstalar Delphi?
Es lo mismo que si le pones una vela a Santa Tecla
Responder Con Cita
  #5  
Antiguo 28-03-2013
Avatar de pablonill
pablonill pablonill is offline
Miembro
 
Registrado: dic 2006
Posts: 92
Poder: 18
pablonill Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Reinstalar Delphi?
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!
Responder Con Cita
  #6  
Antiguo 28-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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...
Responder Con Cita
  #7  
Antiguo 28-03-2013
Avatar de pablonill
pablonill pablonill is offline
Miembro
 
Registrado: dic 2006
Posts: 92
Poder: 18
pablonill Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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
Responder Con Cita
  #8  
Antiguo 28-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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?
Responder Con Cita
  #9  
Antiguo 28-03-2013
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
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

Última edición por jafera fecha: 28-03-2013 a las 13:17:24. Razón: Casimiro es el más rápido del oeste, yo ya estría muerto
Responder Con Cita
  #10  
Antiguo 28-03-2013
Avatar de pablonill
pablonill pablonill is offline
Miembro
 
Registrado: dic 2006
Posts: 92
Poder: 18
pablonill Va por buen camino
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".
Responder Con Cita
  #11  
Antiguo 28-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Entonces cuál es el problema?, ¿que no se muestran en un dbgrid?
Responder Con Cita
  #12  
Antiguo 28-03-2013
Avatar de pablonill
pablonill pablonill is offline
Miembro
 
Registrado: dic 2006
Posts: 92
Poder: 18
pablonill Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿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 = ?
Responder Con Cita
  #13  
Antiguo 28-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #14  
Antiguo 29-03-2013
Avatar de pablonill
pablonill pablonill is offline
Miembro
 
Registrado: dic 2006
Posts: 92
Poder: 18
pablonill Va por buen camino
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.
Responder Con Cita
  #15  
Antiguo 29-03-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por pablonill Ver Mensaje
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".
Responder Con Cita
  #16  
Antiguo 29-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Casimiro Notevi Ver Mensaje
te aconsejo que quites los componentes que estás usando ..
Cita:
Empezado por pablonill Ver Mensaje
ya que elimine los controles, guarde, cerre delphi, lo abrí nuevamente e hice todo como estaba antes
Sí, eso suele suceder algunas veces.
Responder Con Cita
  #17  
Antiguo 05-04-2013
accfree accfree is offline
Registrado
NULL
 
Registrado: abr 2013
Posts: 2
Poder: 0
accfree Va por buen camino
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
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
updatear mi codigo con paramsbyname Rofocale Varios 3 26-10-2010 01:22:06


La franja horaria es GMT +2. Ahora son las 22:41:11.


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