Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-06-2019
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Error incomprensible en un query

Primero perdón por el "ladrillo" de mensaje. Con tablas en FB 2.5 tengo este query:
Código SQL [-]
SELECT A.Nombre, B.Codigo, B.Distrito, B.Seccion, B.Mesa, C.Censo, SUM(D.Votos) Votos 
  FROM Poblacion A, Mesas B, DatMes C 
  LEFT JOIN Resultados D ON C.Codigo = D.Mesa AND C.Proceso = D.Proceso 
 WHERE A.Codigo = B.Municipio 
   AND B.Codigo = C.Codigo AND C.Proceso = :Proceso 
 GROUP BY A.Nombre, B.Codigo, B.Distrito, B.Seccion, B.Mesa, C.Censo 
 ORDER BY Nombre, Distrito, Seccion, Mesa
Las tablas que emplea son estas:
1. Poblacion
Código SQL [-]
CREATE TABLE Poblacion (CodPrv VARCHAR(3) DEFAULT '99' NOT NULL, Codigo INTEGER NOT NULL, Nombre VARCHAR(65) NOT NULL, 
Cpostal VARCHAR(10) NOT NULL, Pais VARCHAR(2) DEFAULT 'ES', CONSTRAINT PK_POBLACION PRIMARY KEY (CODPRV,CODIGO))
2. Mesas
Código SQL [-]
CREATE TABLE Mesas (CodPrv VARCHAR(3), Codigo INTEGER NOT NULL, Municipio INTEGER NOT NULL, Distrito SMALLINT NOT NULL, 
Seccion SMALLINT NOT NULL, Mesa VARCHAR(2) DEFAULT 'U' NOT NULL, Censo INTEGER, CONSTRAINT PK_MESAS PRIMARY KEY (CODPRV,CODIGO))
3. DatMes
Código SQL [-]
CREATE TABLE DatMes (CodPrv VARCHAR(3) DEFAULT '99' NOT NULL, Codigo INTEGER NOT NULL, Proceso INTEGER NOT NULL,
Censo INTEGER DEFAULT 1 NOT NULL, CONSTRAINT PK_DATMES PRIMARY KEY (CODPRV,CODIGO,PROCESO))
4. Resultados
Código SQL [-]
CREATE TABLE Resultados (CodPrv VARCHAR(3) DEFAULT '99' NOT NULL, Proceso INTEGER NOT NULL, Mesa INTEGER NOT NULL, 
Partido INTEGER DEFAULT 1 NOT NULL, Votos INTEGER NOT NULL, CONSTRAINT PK_RESULTADOS PRIMARY KEY (CODPRV,PROCESO,MESA,PARTIDO))
En la tabla resultados sólo hay registros con código de proceso (C.Proceso) igual a 38.

Si ejecuto el query, tanto desde la aplicación como desde IBManager asignando valores 38 ó 39 al parámetro Proceso el mismo se ejecuta; con el valor 38 me da el valor que está grabado, con valor 39 me devuelve tantas filas como debería ser pero en todas la columna Votos está a Null ya que no hay valores. Sin embargo si hago la prueba con el valor 40 me devuelve este error:
Cita:
No current record for fetch operation.

SQL Code: -508
IB Error Number: 335544348
No current record for fetch operation.

SQL Code: -508
IB Error Number: 335544348
En la tabla en la que creo que puede estar apareciendo el error (DatMes) he comprobado que hay datos para ese código 40:
Cita:
Codigo Proceso Censo
1 40 620
Responder Con Cita
  #2  
Antiguo 18-06-2019
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 16
TOPX Va camino a la fama
Cita:
Empezado por Angel.Matilla Ver Mensaje
Código SQL [-]
  FROM Poblacion A, Mesas B, DatMes C 
  LEFT JOIN Resultados D ON C.Codigo = D.Mesa AND C.Proceso = D.Proceso
Esa sintaxis para consultar cuatro tablas, ¿sí es permitida? Pregunto porque no lo sé.

De todas maneras yo plantearía la consulta más uniforme:
o especificando cada tabla con su respectivo JOIN
o incluyendo todas las tablas en el FROM.
-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #3  
Antiguo 19-06-2019
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por TOPX Ver Mensaje
Esa sintaxis para consultar cuatro tablas, ¿sí es permitida? Pregunto porque no lo sé.
Gracias por la respuesta. Al final anoche di con el error y es que estaba referenciando mal una de las tablas. Al margen de eso la sintaxis es correcta; lo que planteas de meter todas las tablas en el FROM no me valdría porque en la tabla Resultados puede o no haber datos para las mesas y necesito sacar todas las mesas, tengan o no datos grabados en esa tabla. Y poner a cada una de ellas un JOIN no sería solución: Las tres primeras tablas siempre van a tener todos los datos por lo tanto sé seguro que de ellas siempre van a salir resultados en el query.
Responder Con Cita
  #4  
Antiguo 19-06-2019
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Firebird te permite mezclar la forma en que haces los joins, pero por ej MSSQL no logra resolver los nombres de campo dentro del join. Y aunque el motor te permita hacer los joins de esta manera, en pro de la legibilidad, recomendaría mantener una sola forma de hacer los joins.

Código SQL [-]
SELECT
  A.FechaPago, A.Empleado, A.Contrato, 
  A.CodigoConcepto, B.NombreConcepto,
  A.ValorPago
FROM Pagos A, Conceptos B
INNER JOIN GruposConceptos C
  ON  A.Empresa = C.Empresa
  AND A.CodigoConcepto = C.CodigoConcepto
  AND C.CodigoGrupo = 50
WHERE A.Empresa = B.Empresa
  AND A.CodigoConcepto = B.CodigoConcepto
  AND A.Empresa = 9
  AND A.FechaPago BETWEEN '01/01/2010' AND '31/12/2019'
ORDER BY A.FechaPago, A.Empleado, A.Contrato, 
  C.PrioridadEnGrupo, B.TipoConcepto, A.CodigoConcepto

Código SQL [-]
SELECT
  A.FechaPago, A.Empleado, A.Contrato, 
  A.CodigoConcepto, B.NombreConcepto,
  A.ValorPago
FROM Pagos A
INNER JOIN Conceptos B
  ON  A.Empresa = B.Empresa
  AND A.CodigoConcepto = B.CodigoConcepto
INNER JOIN GruposConceptos C
  ON  A.Empresa = C.Empresa
  AND A.CodigoConcepto = C.CodigoConcepto
  AND C.CodigoGrupo = 50
WHERE A.Empresa = 9
  AND A.FechaPago BETWEEN '01/01/2010' AND '31/12/2019'
ORDER BY A.FechaPago, A.Empleado, A.Contrato, 
  C.PrioridadEnGrupo, B.TipoConcepto, A.CodigoConcepto

Es de anotar, que solo es legibilidad. El plan de ejecución es igual para ambas consultas
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
ibase_query() [function.ibase-query]: Dynamic SQL Error SQL error code = -104 Token MALBOTO22 PHP 8 06-05-2015 20:22:39
ERROR incomprensible de SQL en Delphi 2006 Softweb SQL 3 03-10-2008 16:27:16
TQuery y Paradox. Incomprensible. Repelus Conexión con bases de datos 4 01-05-2008 08:05:28
Error Incomprensible altp Varios 5 23-11-2006 19:23:49
error incomprensible HugoH Conexión con bases de datos 2 04-05-2004 13:41:19


La franja horaria es GMT +2. Ahora son las 19:50:47.


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