Anmelden

View Full Version : Daten von mehreren Systemen abfragen



Seiten : [1] 2

msost
24-01-17, 13:42
Ich muß Daten eines Kunden von mehreren I-Systemen (V7R2) abfragen. Es sind derzeit noch einige wenige Dateien. Pro System gibt es diese Dateien mehrfach, jeweils in verschiedenen Bibliotheken.

Man kennt die Kundschaft, der Hunger kommt mit dem Essen. Es werden also verschiedene weitere Anfragen dieser Art auch zu anderen Dateien kommen.

Hat jemand eine gute Idee wie man an sowas rangeht? Es sollten nach Möglichkeit nur Standardwerkzeuge (SQL, JDBC etc.) genutzt werden.

Danke für Denkanstösse!

Fuerchau
24-01-17, 14:00
Fremde iSeries kann man simpel unter WRKRDBDIRE registrieren. Voraussetzung ist natürlich, dass die Zielsysteme per IP erreichbar sind.
In SQL (STRSQL, embedded, JDBC, ODBC, .NET, ...) kann man sich mit diesen Datenbanken verbinden und Daten per SQL verarbeiten.
Man kann auch zwischen den Verbindungen hin- und herschalten. Es bedarf dazu keiner Fremdprodukte.

Robi
24-01-17, 14:10
Schreib dir Datenzugriffsprogramme, die mit "connect to" und SQL Daten holen.
und zwar 1 Pgm je Datei, mit actgrp *caller.

zusätzlich Je ein Pgm, mit gleicher Parameterliste, das nur das System im Parameter ergänzt und das Lesepgm ruft, mit actgrp 'zielsystem'

Im RPG rufst du lies_s1, oder lies_s2 oder ...

So ist auch ein gemischter zugriff, möglich

Robi

Pikachu
24-01-17, 14:10
Da gibt's zum Beispiel CRTDDMF vom DDM (https://www.ibm.com/support/knowledgecenter/ssw_i5_54/ddp/rbal1setddm.htm) (Distributed data management).

Oder du kannst im IFS über QFilSvr.400 (https://www.ibm.com/support/knowledgecenter/ssw_i5_54/ifs/rzaaxrfsfs.htm) zu den anderen Systemen kommen.

Fuerchau
24-01-17, 14:27
DDM unterstützt nur eingeschränkt SQL, QFilSvr.400 ist ein spezieller IFS-Zugriff der mit SQL gar nichts zu tun hat.
Von diesen "alten" Methoden sollte man gleich Abstand nehmen.

Mit der ACTGRP(*CALLER) mag es beim Lesen keine Probleme geben, aber spätestens bei der Verwendung von Journalen und Transaktionen empfielt sich eher eine ACTGRP je System, da es innerhalb einer ACTGRP nicht mehrere offene Commit-Definitionen geben kann.

Pikachu
24-01-17, 14:31
Ok, hatte übersehen, daß es per SQL gehen soll ...

Robi
24-01-17, 14:32
@Baldur.
ja !

Aber ich habe ja auch von einem Pgm je System geschrieben, das mit der Actgrp des Zielsystems laufen soll. Und das ruft dann das Lesepgm, das durch das *caller dann auch in der richtigen läuft.

Robi

BenderD
24-01-17, 15:24
... wichtig ist:
- umwandeln mit RDBCNNMTH(*DUW) und COMMIT(*CHG) und RDB(*LOCAL), was default sein sollte - wenn da kein Dillletttant an Knöpfchen gespielt hat.
- der Commit Master (das steuernde Programm) kriegt eine benamte ACTGRP
- die Zugriffsprogramme alle *CALLER (damit alles in derselben ACTGRP läuft!!!)
- im Zugriffsprogramm beim ersten Aufruf connect machen, bei weiteren reicht set connection (nicht vergessen auf die locale zurück zu setzen, sonst passieren seltsame Dinge in anderen Programmen!)
- ich empfehle pro remote system eigene Module (ist immer blöd, wenn man mit einer falschen Connection liest oder schreibt)
- für die remote Systeme ist ein CRTSQLPKG erforderlich
- die Commit Operationen wirken dann auf alle Connections

D*B

Fuerchau
24-01-17, 15:25
Ok, das habe ich überlesen. Ich halte das für zu aufwändig.
Wenn ich in einem Programm bereits aus 2 Systemen lesen muss, ist es besser die Lese-Programme bereits in eigenen ACTGRP's je System laufen zu lassen, dann brauche ich nicht noch eine Ebene dazwischen um die Leseproggramme letztendlich doch in getrennten ACTGRP's zu haben.

Blöd ist halt nur, wenn die Zielsysteme ja dieselben Tabellen haben, wieso dann je System eine eigene ACTGRP da doch nur der DBName sich unterscheidet? Solange ich nur lese, habe ich keine Probleme alles in einer ACTGRP abzufahren. Spätestens bei Transaktionen kann ich mit Filehändlern hier nichts mehr anfangen (außer Lesen).
Dann brauche ich tatsächlich je System eine neue ACTGRP, was durchaus mit ACTGRP(*NEW) geht.
Allerdings darf ich diese ACTGRP nicht verlassen (da hilft auch kein LR) bevor meine Transaktionen abgeschlossen sind. Dann ginge auch wieder ACTGRP(*CALLER) für die SQL-Filehändler.

BenderD
24-01-17, 15:56
Ok, das habe ich überlesen. Ich halte das für zu aufwändig.
Wenn ich in einem Programm bereits aus 2 Systemen lesen muss, ist es besser die Lese-Programme bereits in eigenen ACTGRP's je System laufen zu lassen, dann brauche ich nicht noch eine Ebene dazwischen um die Leseproggramme letztendlich doch in getrennten ACTGRP's zu haben.

Blöd ist halt nur, wenn die Zielsysteme ja dieselben Tabellen haben, wieso dann je System eine eigene ACTGRP da doch nur der DBName sich unterscheidet? Solange ich nur lese, habe ich keine Probleme alles in einer ACTGRP abzufahren. Spätestens bei Transaktionen kann ich mit Filehändlern hier nichts mehr anfangen (außer Lesen).
Dann brauche ich tatsächlich je System eine neue ACTGRP, was durchaus mit ACTGRP(*NEW) geht.
Allerdings darf ich diese ACTGRP nicht verlassen (da hilft auch kein LR) bevor meine Transaktionen abgeschlossen sind. Dann ginge auch wieder ACTGRP(*CALLER) für die SQL-Filehändler.

... pro Connect eine eigene ACTGRP ist nicht erforderlich und macht auch keinen Sinn!!!

D*B