Ver Mensaje Individual
  #12  
Antiguo 12-01-2009
Bauhaus1975 Bauhaus1975 is offline
Miembro
 
Registrado: may 2005
Ubicación: Málaga
Posts: 135
Reputación: 22
Bauhaus1975 Va por buen camino
Hola. Me alegro de leer de nuevo tus consejos.
He estado haciendo pruebas en base a lo que me has dicho. He usado para ello la herramienta IBExpert para hacer las consultas, y efectivamente, el error viene desde Firebird (2.1)

Este el código SQL de la consulta. La entidad en cuestión se llama contacto, aunque yo todo el rato la he llamado 'clientes' para que me entendais mejor.

Código SQL [-]
SELECT c.ID as IDContacto,c.NIF,c.Nombre,c.Apellidos,t.valor as TipoContacto
FROM contacto c, tipo t
LEFT JOIN cliente cl on c.IDCliente = cl.ID
LEFT JOIN empresa e on c.IDEmpresa = e.ID
WHERE CONDICION AND c.IDTipoContacto = t.ID

Este es un resumen del estudio, el cual no entiendo por que se comporta así.
Siendo 'CONDICION' esta combinacion de casos y resultados:

C.ID > 0 => Devuelve la lista de registros existentes correctamente.
C.ID = null => 'The cursor identified in the update or delete statement is not positioned on a row'
C.ID = 0 => IDEM al anteior caso.
IDContacto > 0 => devuelve registro vacio con campos (increible)
IDContacto = null => devuelve registro vacio con campos
IDContacto = 0 => devuelve registro vacio con campos
(como 'C.IDContacto' Da error de que no existe tal columna)

Por lo que finalmente lo he resuelto formando la sentencia SQL dinamicamente de esta forma:
Código Delphi [-]
if (id= 0) then
   SQL := 'WHERE IDContacto = null '
else
   SQL := 'WHERE c.ID = '+IntToStr(id);

Y ahora parece que funciona, tanto el caso 'normal' donde el DataSet estaba ya creado, como en el caso de usar este query nula para los casos donde nunca se habia realizado consulta (accesos directos a crear Contacto y demas)

Aunque realmente no entiendo nada de por que este comportamiento, supongo que seran cosas del motor de BBDD ¿cierto?

Muchas gracias de nuevo por tu ayuda y un saludo.
Responder Con Cita