PDA

View Full Version : AS400-Zugriff mittels Pass-Through Abfrage in Access



Marlic
19-06-09, 08:05
Hallo,

wir arbeiten mit einer AS400 in der Firma und ich lade jede Menge Daten runter, um damit Berichte zu erstellen.
Dazu nutze ich Access.

Kommunikation zwischen AS400 und Access geht mit ODBC und eingebunden habe ich die AS400 in Access als verknüpfte Tabellen, die man als Weltkugel als solche identifizieren kann.
Darauf baue ich dann meine Abfragen auf und alles läuft auch soweit ganz gut, schon seit vielen Jahren.

Leider gibt es aber auch Downloads, die aufgrund ihrer Datenmenge locker 60-90 min laufen und ich suche nach einer Möglichkeit die Performance zu steigern.
Dazu habe ich schon alles Mögliche an Tips und Tricks in Access ausprobiert. Auch habe ich die aktuellsten IBM Treiber und habe wertvolle Einstellungshinweise unserer IT-Abteilung bekommen.

Meine Recherche hat ergeben, dass ich wohl mittels einer Pass-Through Abfrage an Geschwindigkeit gewinnen würde, da (korrigiert mich, wenn ich falsch liege) nur so oder vorallem so die AS400 die Arbeit erledigt (Filtern der Datensätze) und lediglich die Daten an Access zurückgibt, die verlangt werden.
Ich bekomme eine Pass-Through Abfrage aber bei allen Versuchen nicht hin. Folgende Fehlermeldung kommt hoch:


ODBC--call failed.
[IBM][iSeries Access ODBC Driver][DB2 UDB]SQL0104 - Token ; was not valid. Valid tokens: . (#-104)


Kennt das jemand und weiss Abhilfe bitte?

Gruss, Marlic

Fuerchau
19-06-09, 09:52
Die SQL-Syntax ist in diesem Fall auf die AS/400 beschränkt.
- keine Access-Funktionen
- kein Semikolon am Ende
- kein Parameterverweis auf Formulare
Die Abfrage muss also per Programmcode ausgeführt werden !

Beispiel:

select feld1, feld2, feld3 ...
from mylib.myfile
where key1=? and key2=?

Die Parameter können nicht über die Eigenschaften der Abfrage definiert werden sondern werden automatisch bereitgestellt.
Das 1. ? ist Parameters(0), das 2. ist Parameters(1) usw.

PS:
Ein Performancegewinn ist da eher selten zu beobachten wenn du korrekte Beziehungen herstellst.
Wenn eine Anfrage sowohl lokale als auch verknüpfte Tabellen verbindet hast du die beschriebenen Nachteile.
Verknüpfst du aber 2 oder mehr Tabellen aus der selben Datenquelle, wird von Access auch nur 1 SQL an die Quelle abgegeben.

Marlic
19-06-09, 12:20
Hallo,

In der Tat verknüpfe ich auch beim Download aus der AS400 lokale Tabellen in der Abfrage.
Ich werde mal einen Feldversuch starten und diese rausnehmen, um deine Theorie zu bestätigen. Danke schon einmal hierfür.

Meine Pass-Through ist eine ganz banale Abfrage, ohne Kriterien oder Filter, da ich zunächst einmal den Aufbau bzw. den Zugriff auf die AS400 sicherstellen wollte.
Sie lautete


SELECT Library_Tablename.*
FROM Library_Tablename

Dies hatte den o.g. Fehler hervorgebracht.
Jetzt habe ich versucht lediglich eine einzige Spalte aus der Tabelle anzusprechen, also


SELECT Library_Tablename.Spalte1
FROM Library_Tablename

und bekomme zumindest eine andere Fehlermeldung, nämlich


(...) Library_Tablename in Library type *FILE not found.

Dies verwundert mich, da die library eigentlich nicht falsch sein kann.
Habe die auch im iSeries Access for Windows ODBC Setup Fenster ausgetauscht und weggelassen, die Fehlermeldung kommt wieder.
Eine Idee?

Gruss, Marlic

Fuerchau
19-06-09, 12:25
Im ODBC-Setup wird die Namenskonvention *SYS/*SQL festgelegt (*SQL ist standard).

Die Lib wird mit dem Punkt (*SQL) bzw. "/" (*SYS) getrennt, also:

select * from MyLib.MyTable

Für Referenzierungen gilt:

select a.* from MyLib.MyTable a

erweitert:
select a.Feld1, a.Feld2 from MyLib.MyTable a, MyLib.MyTable2 b
where a.Key=b.key

Marlic
19-06-09, 13:03
Bingo! Das hat mir sehr viel weitergeholfen, vielen Dank!

Jetzt geht es ans Testen.

Gruss, Marlic

Fuerchau
19-06-09, 13:49
Ich würde dir Empfehlen, die SQL-Handbücher der AS/400 runterzuladen:
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/sqlp/rbafy.pdf
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/db2/rbafzmst.pdf

Marlic
19-06-09, 16:01
habe ich gemacht. Danke.

Gruss, Marlic