PDA

Ver la Versión Completa : conectar dos BD interbase para una consulta que sólo va a mostrar datos


Giniromero
22-10-2007, 17:11:50
Hola,

Estoy trabajando con dos bases de datos en Interbase 7.5. Tienen información que tenemos que cruzar, para obtener un listado.
Hay alguna manera de, antes de nada, conectar a las BD desde la consulta SQL, para luego hacer una consulta entre tablas de ambas, como normalmente cuando las tablas son todas de la misma BD?

Muchas gracias,

Virginia

poliburro
22-10-2007, 17:55:05
No conozco firebird, pero en la mayoría de los motores de bases de datos, si no es que en todos, cuando consultas tablas de diferentes bases de datos que residen en el mismo servidor lo puedes hacer de la siguiente manera


Schema.TableName

Teniendo que Schema es la base de datos.

Suerte

RolphyReyes
22-10-2007, 19:05:38
Saludos.

En Interbase/Firebird por el momento no se permiten sentencias de ningun tipo enlazadas entre dos BD sin importar su ubicacion fisica.

Se espera que en la proxima version de Firebird (>= 2.5) se pueda realizar los cross join.

La opcion que tienes por el momento es hacerlo manual desde delphi.

Hasta luego.

Giniromero
23-10-2007, 10:35:07
Saludos.

En Interbase/Firebird por el momento no se permiten sentencias de ningun tipo enlazadas entre dos BD sin importar su ubicacion fisica.
.

¿sin importar su hubicación física? si te refieres a tener el path, lo tengo, por eso no habría problema. ¿como se haría?

La opcion que tienes por el momento es hacerlo manual desde delphi.
Hasta luego.

Exactamente a que te refieres con "hacerlo manual desde delphi"? por que efectivamente estoy trabajando con delphi, y supongo que esta es la otra opcion que tengo.

Muchas gracias por la ayuda, de ante mano,

Virginia

RolphyReyes
23-10-2007, 14:22:11
Cuando me referiero a su ubicacion fisica es que no importa en que servidor esten ubicadas las BD no podras realizar sentencias de ningun tipo via el mismo motor de BD.

En cuanto "hacerlo manual desde delphi" es que debes de poner 2 componentes de BD para conectar las distintas BD luego con 2 componentes Query/Dataset traer los datos de las BD e ir leyendo tus datos desde los DataSet y realizar las operaciones de lugar que necesites.

Digo 2 por poner un ejemplo pueden ser mas dependiendo de tu caso.

Hasta luego.

poliburro
23-10-2007, 19:27:40
Saludos.

En Interbase/Firebird por el momento no se permiten sentencias de ningun tipo enlazadas entre dos BD sin importar su ubicacion fisica.

Se espera que en la proxima version de Firebird (>= 2.5) se pueda realizar los cross join.

La opcion que tienes por el momento es hacerlo manual desde delphi.

Hasta luego.


No se puede?, caramba, una nueva razón por la que no me gusta FireBird/Interbase.

juanelo
23-10-2007, 20:25:43
No se puede?, caramba, una nueva razón por la que no me gusta FireBird/Interbase.

Es en verdad una falta de diseño o una consulta extraordinaria (trabajo por encargo) el que se tenga que hacer este tipo de consultas, pero Firebird tiene grandes ventajas sobre otros manejadores incluso gratutitos, y para aquellos que necesiten hacer estos trabajos pues ahi viene una nueva version que contempla las consultas multi base de datos.
Saludos

jhonny
23-10-2007, 23:36:50
Saludos.

En Interbase/Firebird por el momento no se permiten sentencias de ningun tipo enlazadas entre dos BD sin importar su ubicacion fisica.

Se espera que en la proxima version de Firebird (>= 2.5) se pueda realizar los cross join.

La opcion que tienes por el momento es hacerlo manual desde delphi.

Hasta luego.

¿De donde sacaste que para FireBird 2.5 tendremos dicha caracteristica?, sería algo muy bueno, lo malo es que no logro encontrar dicho articulo :( :).

jhonny
24-10-2007, 00:09:36
Ahhh, ya encontre algo, pero veo que la implementación del cross-database esta presupuestada para la versión 3.0, no para la 2.5 que según veo no va a existir ;).

Precisamente estaba en el Roadmap de FireBird, ufff... :D.

http://www.firebirdsql.org/index.php?op=devel&sub=engine&id=roadmap_2007&nosb=1

RONPABLO
24-10-2007, 00:33:58
Para comunicarme con otra bd, en algunos casos he encontrado muy útil usar las tablas externas, yo hago algo como lo siguiente:

1. En bd1 creo una tabla externa

RECREATE TABLE FACTURASXPERSONA
EXTERNAL FILE 'C:\ARCHIVOS DE PROGRAMA\FIREBIRD\FIREBIRD_1_5\BIN\MIBD\CITASXPERSONA.TXT'
(
CODIGO CHAR( 50) COLLATE NONE,
NOMBRE CHAR( 200) COLLATE NONE,
TOTAL CHAR( 2) COLLATE NONE,
FACTURA CHAR( 20) COLLATE NONE
);


2. luego en la bd 2 creo exactamente la misma tabla externa

RECREATE TABLE FACTURASXPERSONA
EXTERNAL FILE 'C:\ARCHIVOS DE PROGRAMA\FIREBIRD\FIREBIRD_1_5\BIN\MIBD\CITASXPERSONA.TXT'
(
CODIGO CHAR( 50) COLLATE NONE,
NOMBRE CHAR( 200) COLLATE NONE,
TOTAL CHAR( 2) COLLATE NONE,
FACTURA CHAR( 20) COLLATE NONE
);


y ahí comparto información entre las dos bds sin necesidad de usar mas que querys... es solo una idea.....

pvizcay
25-10-2007, 15:28:18
podrías unificar las dos bases en una..

si tienes que consulltar datos de dos bds seguramente hay un relación de integridad entre ambas, aun con la versión 3 y los cross joins entre bases esto no se puede garantizar

Giniromero
05-11-2007, 17:24:51
Hola de nuevo,

Desde que me comentaste esto:

Cuando me referiero a su ubicacion fisica es que no importa en que servidor esten ubicadas las BD no podras realizar sentencias de ningun tipo via el mismo motor de BD.

En cuanto "hacerlo manual desde delphi" es que debes de poner 2 componentes de BD para conectar las distintas BD luego con 2 componentes Query/Dataset traer los datos de las BD e ir leyendo tus datos desde los DataSet y realizar las operaciones de lugar que necesites.

Digo 2 por poner un ejemplo pueden ser mas dependiendo de tu caso.

Hasta luego.

he estado haciendo pruebas con esto, pero no lo consigo filtrar del todo bien.

Quiero decir, si tengo una base de datos 1 con una tabla A, que tiene muchos registros para cada campo "codigo" y tengo otra base de datos 2, con una tabla B, en la que hay un sólo registro para cada campo "codigo" y tengo que hacer que se conecten por ese campo código, para que cada registro de la tabla A tenga una correspondencia con el campo2 de la tabla tablaB. Hasta aquí todo bien. Me devuelve todos los registros de la tablaA y un campo más que resulta de la consulta a la tablaB. El problema es que, la tablaB NO tiene 1 registro por cada número de codigo, por lo que algunos registros de la tablaA se quedan en blanco, cuando lo que yo necesito es que en tal caso esos registros no se muestren.

Por eso necesito, alguna manera dentro del delphi, de que se conecten las BD.

Espero haberme explicado bien.

Muchas gracias por todo,

Virginia

RolphyReyes
06-11-2007, 16:25:54
Saludos.

Jhonny aca tienes el link de la información que dije http://www.firebirdnews.org/index.php?paged=2

Virginia si vas a relacionar dos tablas se supone que debes de tener un campo por el cual vas a realizar dicha operacion. Debes de enfocarte bien en lo que quieres obtener y si puedes darnos parte de la estructura asi mas facil podriamos ayudarte.

Hasta luego.

jhonny
06-11-2007, 16:48:41
Saludos.

Jhonny aca tienes el link de la información que dije http://www.firebirdnews.org/index.php?paged=2

Virginia si vas a relacionar dos tablas se supone que debes de tener un campo por el cual vas a realizar dicha operacion. Debes de enfocarte bien en lo que quieres obtener y si puedes darnos parte de la estructura asi mas facil podriamos ayudarte.

Hasta luego.

Si, en el RoadMap de FireBird tambien estaba, interesante :)... es mas, por aqui http://www.fingerbird.de/ff/refguide/refguide_BASED_ON.html encontre un algo que aún no he tenido la oportunidad de probar pero parece ser el asunto :).

Gracias RolphyReyes :).

tefots
06-11-2007, 23:29:07
pues yo creo que si se puede , no lo he provado, pero deberia funcionar sin problemas.

creas dos conexiones odbc , una apuntando a la bd1 , y otra apuntando a la bd2.

luego desde access, vinculas las tablas correspondientes por odbc, de la bd1 y la bd2.

y se hace la consulta desde access. select from tabla1,tabla2 where tabla1.codigo=tabla2.codigo ... etc.

si funciona , podemos guardar la consulta , y/o acceder a la bd acces con las tablas vinculadas.

el rendimiento será pobre , ya que supongo que access se traerá los datos y luego hará la consulta localmente.

que alguien lo pruebe y diga si funciona.

tefots
08-11-2007, 10:54:21
Me respondo a mi mismo.

Comprobado , funciona correctamente y bastante bien.

he enlazado mediante una consulta 2 tablas de 2 bases de datos distintas que residen en distintos servidores firebird.

la aplicación solo ha de acceder a la base de datos que en este caso es access (donde estan vinculadas las tablas de los distintos servidores firebird por odbc ) , y trabajar como si trabajara con una bd access. el access se encarga de todo , a la aplicación le es transparente y le da igual que las tablas se encuentren en distintos servidores.

saludos.