Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Problemas con un left outer join en FB2 (https://www.clubdelphi.com/foros/showthread.php?t=40326)

TJose 13-02-2007 17:00:21

Problemas con un left outer join en FB2
 
Estaba decidido a esperar un tiempo en cambiarme a FB2, pero después de leer el hilo Compatibilidad Interbase 6 / Firebird 2.0 migré.

La primera impresión fue buena, todo funcionaba bien, incluso las UDFs desarrolladas por mi.

El problema vino cuando quise ejecutar un script de creación de mi base de datos con el cual estoy actualmente trabajando.
El error se produce al ejecutar lo siguiente:

Código SQL [-]
...
left outer join provincias on (localidades.idprovincia = provincias.id)
...

El error que me da es que para FB2 idprovincia no pertenece a localidades. Por arriba de la linea que me da el error tengo otros left outer join, y no me dan problemas, con lo que descarto que FB2 tenga otra sintaxis.

Luego volví a FB15.x y el script se ejecuto sin problemas.

Alguna idea?

Saludos
TJose

Casimiro Notevi 13-02-2007 22:06:16

Cita:

Empezado por TJose
... left outer join provincias on (localidades.idprovincia = provincias.id) ...

Puede ser porque deberías poner "alias", algo así como esto:
Código SQL [-]
left outer join provincias pro on (loc.idprovincia = pro.id)

TJose 13-02-2007 23:52:37

Cita:

Por Casimiro
Puede ser porque deberías poner "alias", algo así como esto
Podría ser, pero pienso que no es el problema ya que como mencioné hay arriba del que me da error varios left outer join

Código SQL [-]
left outer join
         tiposvacunacion on (actas.idtipovacunacion = tiposvacunacion.id)
      left outer join
         renspas on (actas.idrenspa = renspas.id)
      left outer join
         productores on (renspas.idproductor = productores.id)
      left outer join
         localidades locp on (productores.idlocalidad = locp.id)
      left outer join
         provincias on (localidades.idprovincia = provincias.id)
      left outer join
         regimenestenencia on (renspas.idregimentenencia = regimenestenencia.id)
      left outer join
         actividades on (renspas.idactividad = actividades.id)
      left outer join
         establecimientos on (renspas.idestablecimiento = establecimientos.id)
      left outer join
         localidades loce on (establecimientos.idlocalidad = loce.id)
      left outer join
         vacunas vac_af on (actas.idvacunaaftosa = vac_af.id)
      left outer join
         marcas ma_af on (vac_af.idmarca = ma_af.id)
      left outer join
         identificaciones on (actas.ididentificacion = identificaciones.id)
      left outer join
         vacunas vac_br on (actas.idvacunabrucelosis = vac_br.id)
      left outer join
         marcas ma_br on (vac_br.idmarca = ma_br.id)
      left outer join
         vacunadores on (actas.idvacunador = vacunadores.id)

La linea con el error está en rojo. Como se ve antes del error tengo algunos con alias y otros no.

Cuando instalé FB2 use el archivo de la base de datos creada con FB1.5.3 sin problemas.

Saludos
TJose

Casimiro Notevi 14-02-2007 00:03:26

Cita:

Empezado por TJose
El error que me da es que para FB2 idprovincia no pertenece a localidades. Por arriba de la linea que me da el error tengo otros left outer join, y no me dan problemas, con lo que descarto que FB2 tenga otra sintaxis.

Pues si es ese el error, ¿podría ser que realmente sea eso?, que exista algún idprovincia en otra tabla?

TJose 14-02-2007 00:29:26

Declaracion de la tabla localidades

Código SQL [-]
...
create table Localidades(
   ID dID,
   Localidad dTexto50,
   Pedania dPedania,
   IdDepartamento dIdNull,
   IdProvincia dId
);
...
alter table Localidades add constraint fk_Localidades_01 foreign key (IdDepartamento) references Departamentos(ID);
alter table Localidades add constraint fk_Localidades_02 foreign key (IdProvincia) references Provincias(ID);
...

en la unica tabla que aparece idprovincia es en localidades, de todas manera si existiera en otra no debiera dar problemas ya que estoy haciendo referencia a la tabla:

Código SQL [-]
localidades.idprovincia

Puede ser un bug de FB2? No lo creo. Con la 1.5.3 [en Windows (SS) y FreeBSD (CS)] y 1.5.4 en win no tengo problemas

Saludos
TJose

Casimiro Notevi 14-02-2007 00:51:21

Si quieres puedes pasarnos la metadata para crear la base de datos y probar nosotros...

Casimiro Notevi 14-02-2007 11:17:13

¿Y puedes poner la sentencia completa que ejecutas?

TJose 14-02-2007 13:06:21

Hola Casimiro

Simplemente cuando creo mi base de datos, ejecutando el script, en este caso desde SQLHammer, se planta en la línea mencionada, dandome el error (no recuerdo textualmente en ingles) campo desconocido, idprovincia no pertenece a la tabla localidades.

Saludos
TJose

Casimiro Notevi 14-02-2007 15:51:10

Código SQL [-]
left outer join
         tiposvacunacion on (actas.idtipovacunacion = tiposvacunacion.id)
      left outer join
         renspas on (actas.idrenspa = renspas.id)
      left outer join
         productores on (renspas.idproductor = productores.id)
      left outer join
         localidades locp on (productores.idlocalidad = locp.id)
      left outer join
         provincias on (localidades.idprovincia = provincias.id)
      left outer join
         regimenestenencia on (renspas.idregimentenencia = regimenestenencia.id)
      left outer join
         actividades on (renspas.idactividad = actividades.id)
      left outer join
         establecimientos on (renspas.idestablecimiento = establecimientos.id)
      left outer join
         localidades loce on (establecimientos.idlocalidad = loce.id)
      left outer join
         vacunas vac_af on (actas.idvacunaaftosa = vac_af.id)
      left outer join
         marcas ma_af on (vac_af.idmarca = ma_af.id)
      left outer join
         identificaciones on (actas.ididentificacion = identificaciones.id)
      left outer join
         vacunas vac_br on (actas.idvacunabrucelosis = vac_br.id)
      left outer join
         marcas ma_br on (vac_br.idmarca = ma_br.id)
      left outer join
         vacunadores on (actas.idvacunador = vacunadores.id)

El problema es que tienes declarado "localidades locp" y "localidades loce" y "localidades" a secas.
Deberías darle otro alias al que te da error para que sepa a cual pertenece.

O cambiar:
provincias on (localidades.idprovincia = provincias.id)
por
provincias on (loce.idprovincia = provincias.id)

Por ejemplo.

TJose 14-02-2007 17:40:48

OK, pruebo y te aviso

TJose 14-02-2007 18:24:24

Efectivamente Casimiro, cambié la línea por
Código SQL [-]
left outer join
         localidades locp on (productores.idlocalidad = locp.id)
      left outer join
         provincias on (locp.idprovincia = provincias.id)
      left outer join ...

y funcionó.

Tengo otro script que genera los datos provenientes de una migración, Access->script->Firebird. Al final de este script borro los procedimientos y tablas temporales utilizados para dicha migración. Bien, en FB1.5 no había problemas, en FB2 me dice que los procedimeintos están en uso. No me importa mucho esto, los puedo borrar después, pero la pregunta es porqué pasa esto.

Ahora están comentados, pero resalto en rojo donde da el error

Código SQL [-]
execute procedure spxLocalidadesX;
execute procedure spxProductoresX;
execute procedure spxEstablecimientosX;
execute procedure spxRenspasX;

--drop procedure spxLocalidadesX;
--drop procedure spxProductoresX;
--drop procedure spxEstablecimientosX;
--drop procedure spxRenspasX;

insert into localidades(localidad,idprovincia) select lx.localidad, lx.idprovincia from localidadesx lx order by lx.id;
insert into productores(nors,cuit,documento,direccion,idlocalidad) select pr.nors, pr.cuit, pr.documento, pr.direccion, pr.idlocalidad from productoresx pr order by pr.idproductor;
insert into establecimientos(cuerporenspa,nombre,idlocalidad,hectareas,paralelo,meridiano,letra,hectareas) select es.cuerporenspa,es.nombre,es.idlocalidad,0,es.paralelo,es.meridiano,es.letra, es.hectareas from establecimientosx es order by es.idestablecimiento;
insert into renspas(renspa,idactividad,idregimentenencia,idproductor,idestablecimiento) select renspa,idactividad,idtenencia,idproductor,idestablecimiento from renspasx rn where idestablecimiento <> 0 and idproductor <> 0 order by rn.renspa;

--drop table localidadesx;
--drop table productoresx;
--drop table establecimientosx;
--drop table renspasx;

Gracias Casimiro

Saludos
TJose

Casimiro Notevi 14-02-2007 20:12:42

Pues ahí ya no sé que responderte, pero por aventurar algo, prueba a lanzar un script con la primera parte:
Código SQL [-]
 execute procedure spxLocalidadesX; 
execute procedure spxProductoresX; 
execute procedure spxEstablecimientosX; 
execute procedure spxRenspasX;

Y luego otro script con los borrados
Código SQL [-]
--drop procedure spxLocalidadesX;
--drop procedure spxProductoresX; 
--drop procedure spxEstablecimientosX; 
--drop procedure spxRenspasX;

Puede que así puedas borrarlo.

Delfino 19-02-2007 14:11:38

Cita:

pero pienso que no es el problema
Pues si q es este el problema, lea el archivo ambiguity.txt en la carpeta de FB2 y comprenderas el pq..


La franja horaria es GMT +2. Ahora son las 04:10:32.

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