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.043
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.043
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
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:28:05.


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