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 Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-04-2022
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
Diferente comportamiento de un query

Buenos días. A ver si alguien me puede dar una explicación porque llevo días luchando con ese mensaje y no sé como resolverlo. Estoy ejecutando este query en un BB.DD. FB 2.5.6:
Código SQL [-]
SELECT A.Sigla,
       COALESCE(B.Votos, 0) Votos1,
       (SELECT SUM(Votos) FROM Resultados WHERE CodPrv = A.CodPrv AND Proceso = :Proceso1 AND Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = A.CodPrv)) Total1,
       COALESCE(C.Votos, 0) Votos2,
       (SELECT SUM(Votos) FROM Resultados WHERE CodPrv = A.CodPrv AND Proceso = :Proceso2 AND Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = A.CodPrv)) Total2, 
       CASE WHEN A.Codigo = -3 THEN 0 WHEN Codigo < 0 THEN A.Codigo ELSE 1 END Orden
  FROM Partidos A
       LEFT JOIN (SELECT Partido, SUM(Votos) Votos FROM Resultados WHERE CodPrv = :PrvIns AND Proceso = :Proceso1 AND Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = :PrvIns)
                         GROUP BY Partido) B ON B.Partido = A.Codigo
       LEFT JOIN (SELECT Partido, SUM(Votos) Votos FROM Resultados WHERE CodPrv = :PrvIns AND Proceso = :Proceso2 AND Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = :PrvIns)
                         GROUP BY Partido) C ON C.Partido = A.Codigo
 WHERE A.CodPrv = :PrvIns AND (B.Votos > 0 OR C.Votos > 0)
 ORDER BY Orden DESC, Votos1 DESC, Votos2 DESC, Sigla
Sé que el query es un poco complejo, pero el problema no es ese. El problema es que si lo ejecuto desde la aplicación me da el error SQLCODE -804: Incorrect values within SQLDA structure pero si lo ejecuto desde SQL Manager, con los mismos valores en todos los parámetros en ambos casos, se ejecuta correctamente y me da los resultados que quiero y no entiendo por qué ese diferente comportamiento.
Responder Con Cita
  #2  
Antiguo 19-04-2022
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
¿Podemos ver el código de tu programa donde se asigna esa sentencia y los parámetros?
Responder Con Cita
  #3  
Antiguo 19-04-2022
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
Como no, pero es un poco lío.
Código:
cAux = "AND Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = A.CodPrv";
switch (((PTreeMun)MunRes->GetNodeData(MunRes->FocusedNode))->Nivel)
{
     case 2:
          cAux = cAux + " AND Municipio IN (SELECT Codigo FROM Dl01 WHERE CodPrv = A.CodPrv AND CodPar = :Codigo)";
          break;
     case 4:
          cAux = cAux + " AND Municipio = :Codigo";
          break;
}
cAux = cAux + ")";

fMenu->Auxiliar->Close();
fMenu->Auxiliar->SQL->Text = "SELECT A.Sigla,";
fMenu->Auxiliar->SQL->Add("COALESCE(B.Votos, 0) Votos1, (SELECT SUM(Votos) FROM Resultados WHERE CodPrv = A.CodPrv AND Proceso = :Proceso1 " + cAux + ") Total1,"
fMenu->Auxiliar->SQL->Add("COALESCE(C.Votos, 0) Votos2, (SELECT SUM(Votos) FROM Resultados WHERE CodPrv = A.CodPrv AND Proceso = :Proceso2 " + cAux + ") Total2, CASE WHEN A.Codigo = -3 THEN 0 WHEN Codigo < 0 THEN A.Codigo ELSE 1 END Orden");
fMenu->Auxiliar->SQL->Add("FROM Partidos A LEFT JOIN (SELECT Partido, SUM(Votos) Votos FROM Resultados WHERE CodPrv = :PrvIns AND Proceso = :Proceso1 " + StringReplace(cAux, "A.CodPrv", ":PrvIns", oReplace) + " GROUP BY Partido) B ON B.Partido = A.Codigo");
fMenu->Auxiliar->SQL->Add("LEFT JOIN (SELECT Partido, SUM(Votos) Votos FROM Resultados WHERE CodPrv = :PrvIns AND Proceso = :Proceso2 " + StringReplace(cAux, "A.CodPrv", ":PrvIns", oReplace) + " GROUP BY Partido) C ON C.Partido = A.Codigo");
fMenu->Auxiliar->SQL->Add("WHERE A.CodPrv = :PrvIns AND (B.Votos > 0 OR C.Votos > 0) ORDER BY Orden DESC, Votos1 DESC, Votos2 DESC, Sigla");

lPrueba = false;
for (nItem = 0; nItem < SelRes->Items->Count; nItem ++)
     if (SelRes->Items->Item[nItem]->Checked)
     {
          fMenu->Auxiliar->ParamByName("Proceso1")->AsInteger = StrToInt(SelRes->Items->Item[nItem]->SubItems->Strings[0]);
          fMenu->Auxiliar->ParamByName((lPrueba ? (String)"Proceso2" : (String)"Proceso1"))->AsInteger = StrToInt(SelRes->Items->Item[nItem]->SubItems->Strings[0]);
          lPrueba = !lPrueba;
     }
if (((PTreeMun)MunRes->GetNodeData(MunRes->FocusedNode))->Nivel > 1)
     fMenu->Auxiliar->ParamByName("Codigo")->AsInteger = ((PTreeMun)MunRes->GetNodeData(MunRes->FocusedNode))->Codigo;
fMenu->Auxiliar->ParamByName("PrvIns")->AsString  = ((PTreeMun)MunRes->GetNodeData(MunRes->FocusedNode))->Provincia;
if (((PTreeMun)MunRes->GetNodeData(MunRes->FocusedNode))->Nivel < 4 && StrToIntDef(PadMun->Text, 0) > 0)
     fMenu->Auxiliar->ParamByName("Padron")->AsInteger = StrToIntDef(PadMun->Text, 0);
fMenu->Auxiliar->Open();
  • cAux es un AnsiString
  • SelRes es un TListView
  • Dl01 es una vista de la BB.DD.
En el código que puse al principio supongo que ((PTreeMun)MunRes->GetNodeData(MunRes->FocusedNode))->Nivel vale 1 y por eso no aparece parte del código que se puede montar.
Responder Con Cita
  #4  
Antiguo 19-04-2022
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
Ya las tablas que se usan son estas:
Código SQL [-]
CREATE TABLE RESULTADOS (
  CODPRV VARCHAR(3) CHARACTER SET ISO8859_1 DEFAULT '13' NOT NULL COLLATE ES_ES_CI_AI,
  PROCESO INTEGER NOT NULL,
  MESA INTEGER NOT NULL,
  PARTIDO INTEGER DEFAULT 1 NOT NULL,
  VOTOS INTEGER);
Código SQL [-]
CREATE TABLE MESAS (
  CODPRV VARCHAR(3) CHARACTER SET ISO8859_1 DEFAULT '13' NOT NULL COLLATE ES_ES_CI_AI,
  CODIGO INTEGER NOT NULL,
  MUNICIPIO INTEGER DEFAULT 1 NOT NULL,
  DISTRITO SMALLINT NOT NULL,
  SECCION SMALLINT NOT NULL,
  MESA VARCHAR(2) CHARACTER SET ISO8859_1 DEFAULT 'U' NOT NULL COLLATE ES_ES_CI_AI);
Código SQL [-]
CREATE TABLE PARTIDOS (
  CODPRV VARCHAR(3) CHARACTER SET ISO8859_1 DEFAULT '13' NOT NULL COLLATE ES_ES_CI_AI,
  CODIGO SMALLINT NOT NULL,
  NOMBRE VARCHAR(45) CHARACTER SET ISO8859_1 NOT NULL COLLATE ES_ES_CI_AI,
  SIGLA VARCHAR(10) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  ACTIVO SMALLINT DEFAULT 1,
  COLOR INTEGER DEFAULT 0);
Responder Con Cita
  #5  
Antiguo 19-04-2022
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
Pon un "breakpoint" en la línea:
fMenu->Auxiliar->Open();
Y mira con el debug qué valor tiene "SQL".
Puede ser que con las concatenaciones haya código "pegado", algo como: "order byCampoTal" en lugar de "order by CampoTal", por poner un ejemplo.
Responder Con Cita
  #6  
Antiguo 19-04-2022
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 Casimiro Notevi Ver Mensaje
Pon un "breakpoint" en la línea:
fMenu->Auxiliar->Open();
Y mira con el debug qué valor tiene "SQL".
Puede ser que con las concatenaciones haya código "pegado", algo como: "order byCampoTal" en lugar de "order by CampoTal", por poner un ejemplo.
No, lo había pensado pero el código que he usado en SQL Manager está copiado en ese punto. Es más: he probado pegando tal cual el código que he usado en SQL Manager en la aplicación y sigue dando el mismo error.

Última edición por Casimiro Notevi fecha: 19-04-2022 a las 13:16:11.
Responder Con Cita
  #7  
Antiguo 19-04-2022
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 Angel.Matilla Ver Mensaje
No, lo había pensado pero el código que he usado en SQL Manager está copiado en ese punto. Es más: he probado pegando tal cual el código que he usado en SQL Manager en la aplicación y sigue dando el mismo error.
Míralo, por si acaso, ya que esos programas sqlmanager, ibexpert, etc. suelen tener controles para evitar esas cosas.
Responder Con Cita
  #8  
Antiguo 19-04-2022
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
Gracias. Lo comprobaré.
Responder Con Cita
  #9  
Antiguo 19-04-2022
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 pierdes nada comprobándolo, aunque resulte que no sea eso finalmente.
Es que una vez me pasaba eso mismo y resultó que era el problema.
Responder Con Cita
  #10  
Antiguo 19-04-2022
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
Tienes razón. Ya te diré.
Responder Con Cita
  #11  
Antiguo 19-04-2022
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Tienes algunos parámetros repetidos.

Creo recordar que no se puede repetir el nombre de los parametros porque se grilla el chino.

:Proceso1
:Proceso2
:PrvIns

Cambia los nombres y prueba.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #12  
Antiguo 20-04-2022
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
Lo había pensado e hice la prueba, pero sigue dando el mismo error. Lo que me sorprende es que en el SQL Manager funciona perfectamente.
Responder Con Cita
  #13  
Antiguo 20-04-2022
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
A ver si algún parámetro no tiene un valor correcto o algo así.
Responder Con Cita
  #14  
Antiguo 22-04-2022
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
Gracias a todos por vuestras respuestas. Al final, y después de días probando, encontré la solución dándole "la vuelta" al query y en vez de la monstruosidad que puse el primer día me ha quedado algo mucho más sencillo y fácil de ejecutar:
Código SQL [-]
SELECT A.Partido, B.Sigla, COALESCE(SUM(A.Votos), 0) Votos, CASE WHEN A.Partido = -3 THEN 0 WHEN A.Partido < 0 THEN A.Partido ELSE 1 END Orden 
  FROM Resultados A 
  LEFT JOIN Partidos B ON A.CodPRv = B.CodPrv AND A.Partido = B.Codigo 
 WHERE A.CodPrv = :PrvIns AND A.Proceso = :Proceso 
   AND A.Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = A.CodPrv) AND Votos > 0 GROUP BY A.Partido, B.Sigla
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
Un comportamiento extraño. TiammatMX Varios 5 03-09-2013 22:54:07
comportamiento de extracFileName diferente segun configuracion Windows alquimista Varios 7 02-05-2012 18:18:46
Comportamiento diferente segun conexión LAN o WIFI MON___ Redes 1 14-01-2008 23:12:50
Comportamiento de componentes MDO peccatum Firebird e Interbase 6 18-10-2007 20:08:42
Comportamiento de los Packages unicode OOP 2 07-09-2003 18:22:38


La franja horaria es GMT +2. Ahora son las 10:53:49.


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