Hallo zusammen
bin am basteln für uns an einem Lagerplatzinfoblatt.
das Interessante daran ist dass der Hersteller 2 Datenbanken pflegt. Eine für den Druck und andere für Daten.
Sprich eine DB heißt DBDaten und andere heißt DBDruck
was will ich machen. Eigentlich einfache Abfrage hätte gereicht
select * from ALA join ART on ALA.ID=ART.ART_ID
Leider kann ich die Abfrage nur ein eine DB richten.
Entweder an DBDaten oder DBDruck
Sprich dachte könnte so gehen:
Select * from DBDaten.ART join DBDruck.ALA on DBDruck.ALA.ID = DBDaten.ART.ART_ID order by DBDaten.ART.ARTIKELNR
Leider ohne erfolg, immer eine DB unbekannt.
Kann mir geholfen werden?
Select * über mehrere Tabellen aus verschiedenen Datenbanken
Moderator: thorben.braun
- martin.koeditz
- Beiträge: 474
- Registriert: Sa 31. Mär 2018, 14:35
Hallo Woolfi,
du verbindest dich üblicherweise mit einer Firebird-Datenbank. Innerhalb dieser ist die andere DB nicht bekannt. Beides sind zunächst abgeschlossene Systeme. Dies ist mit dem Schema-Konstrukt in MySQL etwas anders.
Jedoch existiert die Möglichkeit, mit einer fremden Firebird-DB zu kommunizieren - über das Konstrukt ON EXTERNAL DATA SOURCE.
Details unter https://www.firebirdsql.org/file/docume ... xecstmt-de
Über einen Execute-Block oder eine Prozedur lässt sich Daten relativ komfortabel holen.
Gruß
Martin
du verbindest dich üblicherweise mit einer Firebird-Datenbank. Innerhalb dieser ist die andere DB nicht bekannt. Beides sind zunächst abgeschlossene Systeme. Dies ist mit dem Schema-Konstrukt in MySQL etwas anders.
Jedoch existiert die Möglichkeit, mit einer fremden Firebird-DB zu kommunizieren - über das Konstrukt ON EXTERNAL DATA SOURCE.
Details unter https://www.firebirdsql.org/file/docume ... xecstmt-de
Über einen Execute-Block oder eine Prozedur lässt sich Daten relativ komfortabel holen.
Gruß
Martin
Martin Köditz
it & synergy GmbH
it & synergy GmbH
Ich habe dieses Problem bei einem Kunden mit 2 Prozeduren gelöst.
Hier mal eine Beispiel.
select * from C_TEST1(:item_id)
SET TERM ^ ;
create or alter procedure C_TEST (
ITEM_ID integer)
returns (
ITEM_NAME varchar(80),
ITEM_NO varchar(80))
as
declare variable LISTEN_ID integer;
declare variable LISTEN_TYPE_ID integer;
declare variable LISTEN_TEXT varchar(80);
declare variable ACTION_DATE date;
declare variable LINK_ID integer;
declare variable LINK_ID1 integer;
declare variable LINK_ID2 integer;
declare variable LINK_ID3 integer;
declare variable USR_MODIFIED_BY integer;
declare variable USR_MODIFIED_DATE date;
declare variable USR_CREATED_BY integer;
declare variable USR_CREATED_DATE date;
declare variable INFOTEXT blob sub_type 0 segment size 80;
declare variable REPLICA_ID integer;
declare variable REPLICA_ACTIV varchar(1);
declare variable REPLICA_HOST varchar(20);
declare variable REPLICA_DB_PATH varchar(40);
declare variable REPLICA_USERNAME varchar(10);
declare variable REPLICA_PASSWORD varchar(10);
declare variable CONNECTIONSTRING varchar(80);
begin
replica_username='sysdba';
REPLICA_PASSWORD='abc';
CONNECTIONSTRING = 'localhost/3050:G:\DB\xyz.FDB';
EXECUTE STATEMENT 'SELECT name FROM sar100 where ITEM_id ='||item_id
on external DATA SOURCE CONNECTIONSTRING
as user REPLICA_USERNAME password REPLICA_PASSWORD
INTO :item_name;
suspend;
end^
SET TERM ; ^
SET TERM ^ ;
create or alter procedure C_TEST1 (
ITEM_ID integer)
returns (
ITEM_NAME varchar(80),
ITEM_NAME2 varchar(80))
as
begin
select name from sar100 where item_id=:item_id into :ITEM_NAME;
select item_name from c_test(:item_id) into :ITEM_NAME2;
/* Procedure Text */
suspend;
end^
SET TERM ; ^
Hier mal eine Beispiel.
select * from C_TEST1(:item_id)
SET TERM ^ ;
create or alter procedure C_TEST (
ITEM_ID integer)
returns (
ITEM_NAME varchar(80),
ITEM_NO varchar(80))
as
declare variable LISTEN_ID integer;
declare variable LISTEN_TYPE_ID integer;
declare variable LISTEN_TEXT varchar(80);
declare variable ACTION_DATE date;
declare variable LINK_ID integer;
declare variable LINK_ID1 integer;
declare variable LINK_ID2 integer;
declare variable LINK_ID3 integer;
declare variable USR_MODIFIED_BY integer;
declare variable USR_MODIFIED_DATE date;
declare variable USR_CREATED_BY integer;
declare variable USR_CREATED_DATE date;
declare variable INFOTEXT blob sub_type 0 segment size 80;
declare variable REPLICA_ID integer;
declare variable REPLICA_ACTIV varchar(1);
declare variable REPLICA_HOST varchar(20);
declare variable REPLICA_DB_PATH varchar(40);
declare variable REPLICA_USERNAME varchar(10);
declare variable REPLICA_PASSWORD varchar(10);
declare variable CONNECTIONSTRING varchar(80);
begin
replica_username='sysdba';
REPLICA_PASSWORD='abc';
CONNECTIONSTRING = 'localhost/3050:G:\DB\xyz.FDB';
EXECUTE STATEMENT 'SELECT name FROM sar100 where ITEM_id ='||item_id
on external DATA SOURCE CONNECTIONSTRING
as user REPLICA_USERNAME password REPLICA_PASSWORD
INTO :item_name;
suspend;
end^
SET TERM ; ^
SET TERM ^ ;
create or alter procedure C_TEST1 (
ITEM_ID integer)
returns (
ITEM_NAME varchar(80),
ITEM_NAME2 varchar(80))
as
begin
select name from sar100 where item_id=:item_id into :ITEM_NAME;
select item_name from c_test(:item_id) into :ITEM_NAME2;
/* Procedure Text */
suspend;
end^
SET TERM ; ^
-
- Beiträge: 16
- Registriert: Fr 6. Mär 2020, 16:32
Hallo Woolfi,
gehe ich recht in der Annahme, dass Du das im Fastreport-Designer machen willst?
Das ist in diesem Falle eigentlich dann keine Aufgabe, die in SQL zu lösen ist.
Du machst eine Abfrage die wie folgt lautet:
select * from ala order by Artikelnr und bindest die an die DBDruck.
Dann machst Du eine zweite Abfrage, die wie folgt lautet:
select * from art where art.id = :art_id
Im Abfrageeditor der zweiten Abfrage klickst du dann auf "Abfrage-Parameter bearbeiten" und bei "Wert" von "war_id" klickst du dann auf das Formel-Symbol und wählst aus der ersten Abfrage das Feld "Art_id" aus und kllickst auf ok.
Diese zweite Abfrage bindest Du über die Eigenschaft Master an die erste Abfrage. wichtig: Masterfields NICHT verknüpfen.
Nun kannst Du auf beide Tabellen zugreifen.
Viel Erfolg!
gehe ich recht in der Annahme, dass Du das im Fastreport-Designer machen willst?
Das ist in diesem Falle eigentlich dann keine Aufgabe, die in SQL zu lösen ist.
Du machst eine Abfrage die wie folgt lautet:
select * from ala order by Artikelnr und bindest die an die DBDruck.
Dann machst Du eine zweite Abfrage, die wie folgt lautet:
select * from art where art.id = :art_id
Im Abfrageeditor der zweiten Abfrage klickst du dann auf "Abfrage-Parameter bearbeiten" und bei "Wert" von "war_id" klickst du dann auf das Formel-Symbol und wählst aus der ersten Abfrage das Feld "Art_id" aus und kllickst auf ok.
Diese zweite Abfrage bindest Du über die Eigenschaft Master an die erste Abfrage. wichtig: Masterfields NICHT verknüpfen.
Nun kannst Du auf beide Tabellen zugreifen.
Viel Erfolg!