ODBC für IBM AS400 aus Excel VisualBasic nutzen

Käpten Blaubär

Grünschnabel
Problem: wir erhalten Datensätze mit einer Fremdreferenz, die in einer Auswertung zu einer von uns vergebenen Referenz zugeordnet werden sollen.
Da diese sich monatlich aktualisieren, hatte ich vor, eine Schleife zu programmieren, die mit der Fremdreferenz ins System geht und mit der eigenen Referenz zurückkommt (beides String-Variablen).

Einfachste Variante wäre vermutlich, eine bereits vorhandene DTF-Datei (DataTransferFromAS400) aufzurufen und jeweils den Wert zu übergeben, um den nächsten zu übernehmen.

Alternativ soll es mit ActiveSheet.QueryTables.Add gehen, aber ich komme nicht weiter
Meine Tests und Recherchen haben dies hier ergeben:

"With ActiveSheet.QueryTables.Add(Connection:="ODBC;DRIVER=(Client Access ODBC Driver (32-bit));UID=USENAME;PWD=USEPASS;DATABASE=depot;HOST=;SRVR=;SERV=sqlexec2;PRO=olsoctcp;Destination:=Range($S$4)")"

Natürlich genügt es regelmäßig in der DTF-Datei das Datum manuell zu ändern und den Abruf dann zu starten und per SVERWEIS die Referenz herzustellen, dabei schaffen es die User leider immer wieder, Fehler einzubauen, z.B. indem Zeilen gelöscht werden und dadurch Referenzen überschrieben werden.

Kennt jemand einen Weg, wie aus dem Macro heraus der DatenDownload über iSeries gestartet werden kann?
Danke!
 
Ich erinner mich daran, dass ich auch mal Probleme hatte mit unserer DB2 auf ner AS400 zu verbinden.
Die Lösung war, dass ich mir ne System-DSN gebaut habe.
Mir ist natürlich klar, dass es per Connection-String gehen muss, aber bei mir hatte er sich damals standhaft geweigert.
btw: Mein Treiber für unsere AS400 heisst: iSeries Access ODBC Driver
Falls ich bei uns in Excel Daten aus der AS400 abrufen muss, benutze ich DAO/ADO dafür.
Dieses ganze ActiveSheet.QueryIrgendwas-Getöse ist für mich einfach nur Murks.
 
Danke für den Hinweis. Ich habe jetzt DAO in Visual Basic aktiviert. Da ich damit noch nie gearbeitet habe muss ich mir das erstmal genauer ansehen.
 
Hi,

ich habe in der Vergangenheit viel mit VB und der AS400 gemacht.
Was genau möchtest du denn machen?
Daten aus einer Excel in die AS400 überagen? Ich hatte Macros um Aufträge zu erstellen in der AS400.
 
Das klingt spannend! Momentan geht es mir um den umgekehrten Weg, Daten aus der AS400 in die Excel zu übertragen. Und zwar zur von einem Kunden in seiner Gutschrift mitgelieferten Kundenreferenz unsere Auftragsnummer, da die Gutschrift nur über die Auftragsnummer verarbeitet werden kann.
Aber ich nehme an, es funktioniert auf beiden Wegen ziemlich ähnlich. Und Aufträge über Excel erstellen wir ebenfalls über Macros - allerdings auf dem Weg dass ich in Excel per VisualBasic ein Skript erzeuge, dass dann in der AS400 eingelesen werden kann:
Description=
pf6
"0123456
[Enter] usw.

Also wenn ich da eine Idee bekomme, wie ich das schöner machen kann, bin ich sehr dankbar!
 
Also den Rückweg von der AS400 in Excel kann ich leider nichts zu sagen.
Bei dem Weg Excel in die AS400 habe ich das Makro so aufgebaut, dass ich die genaue Spalte und Zeile angegeben habe wo etwas geschrieben werden musste. Oder welche Taste gedrückt werden muss. Gut zu sehen, ich glaube unten rechts bei der AS400. Ist aber schon ewig her.
Ich kann mal schauen, ob ich noch alte Sachen finde. Die kann ich dir gerne zur Verfügung stellen.
 
Mit der Kombination: "

With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"ODBC;DSN=AS400-OSN;", Destination:=Range("$A$1")).QueryTable
.CommandText = Array( _
"SELECT Tabelle1.*" & Chr(13) & "" & Chr(10) & "FROM Z617D7F2.Datenbank.Tabelle1 Tabelle1" & Chr(13) & "" & Chr(10) & "WHERE (Tabelle1.Datum=" & lngNeededDate & ") AND (Tabelle1.STATUS='OK') AND (Tabelle1.Kunde=01234567)" & Chr(13) & "" & Chr(10) & "ORDER BY Tabelle1.Auftrag, Tabelle1.PLZ" _
)
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With"

gelingt es mir tatsächlich die benötigten Datensätze abzurufen. Leider nur die komplette Breite, da der Aufruf so wie ich das verstanden habe nicht mehr als 256 Zeichen groß sein darf (?) und außerdem leider nur für eine Tabelle auf einmal.

Kennt jemand einen Kniff, wie ich statt Select Tabelle1.* auch Select Tabelle1.Name, Tabelle1.Straße, Tabelle1.Ort, Tabelle1.Telefon usw.usf. abfragen kann ohne dass es eine Fehlermeldung gibt? Kann ich z.B. die Angabe Tabelle1 weglassen?

Das zweite, größere Problem ist, dass ich aus einer anderen Tabelle ergänzende Einträge hinzufügen muss. Gibt es da die Möglichkeit, diese beiden Tabellen im Abruf zu verknüpfen? Üblicherweise würde ich das per Join machen, aber dazu scheint es keine Möglichkeit zu geben? Was ich machen kann, ist im Aufruf oben Select.Tabell1, Tabelle2 usw. einzugeben, aber selbst wenn ich später sage: Tabelle1.Nummer=Tabelle2.RefNummer, erfolgt keine korrekte Verknüpfung, sondern die Tabelle gibt mir ein vielfaches der Daten wieder.
 
Zuletzt bearbeitet:
Zurück