PDA

View Full Version : Remote Funktionen mit MS Access aufrufen



Seiten : [1] 2

tw89
19-02-10, 10:18
Guten Tag,

ich möchte mich per ADODB von MS Access aus eine Verbindung zur AS400 öffnen und anschließend eine Funktion mit mehreren Parameter aufrufen, die mir anschließend Werte zurückgibt.

Wie man eine Verbindung aufbaut, das weiß ich bereits nur das mit den Funktionen klappt noch nicht so ganz.

Hier der Code:

Public Function fct_getDataRelist(strIPAS400 As String, strIPUSER As String, strIPPASS As String)
Dim cnAS400 As ADODB.Connection, cmdAS400SQL As ADODB.Command, rsAS400 As ADODB.Recordset

Set cnAS400 = CreateObject("ADODB.Connection")
cnAS400.Provider = "IBMDA400"
cnAS400.Properties("data source") = strIPAS400
cnAS400.Properties(2) = strIPUSER
cnAS400.Properties("Password") = strIPPASS
cnAS400.Open

Set cmdAS400SQL = CreateObject("ADODB.Command")
Set rsAS400 = CreateObject("ADODB.recordset")
rsAS400.CursorType = adOpenDynamic
rsAS400.CursorLocation = adUseServer
rsAS400.LockType = adLockReadOnly
Set cmdAS400SQL.ActiveConnection = cnAS400

cmdAS400SQL.CommandText = "{call ILS_ABRUF.ILS_ADD_Abrufpack (?, ?, ?)}"
cmdAS400SQL.CommandType = adCmdText
cmdAS400SQL.Parameters.Append = cmdAS400SQL.CreateParameter("@nPackStueckId", adInteger, adParamInput)
cmdAS400SQL.Parameters.Append = cmdAS400SQL.CreateParameter("@nAbrufId", adInteger, adParamInputOutput)
cmdAS400SQL.Parameters.Append = cmdAS400SQL.CreateParameter("@nError", adInteger, adParamOutput)

Set rsAS400 = cmdAS400SQL.Execute
Do Until rsAS400.EOF = True

Debug.Print "Test - Datensätze sind vorhanden."

rsAS400.MoveNext
Loop

End Function


Wäre nett wenn mir jemand helfen könnte :(. Ist wichtig.

danke
thomas.

Fuerchau
19-02-10, 10:24
1. Statt CreateObject kannst du auch einfach new verwenden:
set cnAS400 = new ADODB.Connection

2. Returnwerte werden nur bei SQL-Prozeduren unterstützt, ansonsten muss man die Objekt-API's und Konverter-API's verwenden.

Also:
Für jedes Programm, dass du aufrufen willst, musst du einen "Create Procedure" mit den jeweiligen In/Out-Parametern definieren.

tw89
19-02-10, 10:34
Hallo,

vielen dank für die schnelle Rückmeldung. Nur Ich hab sowas nicht nie wirklich gemacht, da ich meistens nur Datensätze lese.

Können wir vielleicht meine Funktion mal so umändern das ich ein Beispiel habe?

Das AS400 Programm kann ja Pseudo sein.

andreaspr@aon.at
19-02-10, 11:01
hi, du kannst schon ein select auf eine funktion machen

2 möglichkeiten::

1) *) die funktion muss als rückgabewert eine table beinhalten
*) die syntax sieht dann so aus:
select * from table (myfunction ('xxx', 333)) tab1

2) select function ('xxx', 333) sp1 from sysibm/sysdummy1

lg andreas

Fuerchau
19-02-10, 11:05
Also es könnte ungefähr so aus sehen, du musst das nur für dein Programm adaptieren

SQL:

CREATE PROCEDURE USMOD_16/ORAPERIODDATES
(IN FIRM VARCHAR(1)
,IN WKNR VARCHAR(3)
,IN ACTDATE DATE
,OUT PERIODE DECIMAL(6, 0)
,OUT FROMDATE DATE
,OUT TODATE DATE
)
LANGUAGE RPGLE
DETERMINISTIC
READS SQL DATA
EXTERNAL NAME 'USMOD_16/ORAPERDAT'
PARAMETER STYLE SQL

ILERPG:

hactgrp(*caller) dftactgrp(*no) datfmt(*iso)

d RHFirma s 1 varying
d RHWerk s 3 varying
d RHActDate s d
d RHPeriode s 6p 0
d RHFromDate s d
d RHToDate s d

d RHFirma_i s 5i 0
d RHWerk_i s 5i 0
d RHActDate_i s 5i 0
d RHPeriode_i s 5i 0
d RHFromDate_i s 5i 0
d RHToDate_i s 5i 0

d SQLStateX s 5
d FuncName s 139 varying
d SpecName s 128 varying
d DiagMsg s 70 varying
c *entry plist
c parm RHFirma
c parm RHWerk
c parm RHActDate
c parm RHPeriode
c parm RHFromDate
c parm RHToDate

c parm RHFirma_i
c parm RHWerk_i
c parm RHActDate_i
c parm RHPeriode_i
c parm RHFromDate_i
c parm RHToDate_i

c parm SQLStateX
c parm FuncName
c parm SpecName
c parm DiagMsg

Die _i-Variablen sind NULL-Flags
-1 = NULL
0 = Wert angegeben
Für jeden Parameter gibt es zusätzlich einen NULL-Flagparameter.

Fuerchau
19-02-10, 11:06
@Andreas
Funktionen können aber nur 1 Wert zurückgeben und, wie du schon sagst, muss ich einen Select verwenden.

BenderD
19-02-10, 11:39
.. es sei denn, es ist eine UDTF (User defined Table Function.
BTW: eine Function lässt sich immer in ein Select maskieren als: select myFunc(...) as hugo from sysibm.sysdummy1 und dann steht das Ergebnis in hugo drin.
Ansonsten finde ich Parameterstyle general einfacher zu handeln, da ist die SQL Schnittstelle identisch mit der Programm Schnittstelle.

D*B


@Andreas
Funktionen können aber nur 1 Wert zurückgeben und, wie du schon sagst, muss ich einen Select verwenden.

tw89
19-02-10, 12:27
Ok,

das mit dem Select-Function hab ich verstanden!

1 Wert, mehr nicht... ist zumindest etwas

dann würd es so aussehen??


Public Function fct_getDataRelist(strIPAS400 As String, strIPUSER As String, strIPPASS As String)
Dim cnAS400 As ADODB.Connection, cmdAS400SQL As ADODB.Command, rsAS400 As ADODB.Recordset

Set cnAS400 = CreateObject("ADODB.Connection")
cnAS400.Provider = "IBMDA400"
cnAS400.Properties("data source") = strIPAS400
cnAS400.Properties(2) = strIPUSER
cnAS400.Properties("Password") = strIPPASS
cnAS400.Open

Set cmdAS400SQL = CreateObject("ADODB.Command")
Set rsAS400 = CreateObject("ADODB.recordset")
rsAS400.CursorType = adOpenDynamic
rsAS400.CursorLocation = adUseServer
rsAS400.LockType = adLockReadOnly
Set cmdAS400SQL.ActiveConnection = cnAS400

cmdAS400SQL.CommandText = "select myFunc(...) as hugo from sysibm.sysdummy1"
cmdAS400SQL.CommandType = adCmdText

Set rsAS400 = cmdAS400SQL.Execute
Do Until rsAS400.EOF = True

CurrentDb.Execute "INSERT INTO tbl_ACCESSTABELLE (ACCESTABELLEWERT) VALUES " _
& "('" & rsAS400("HUGO") & "')"

rsAS400.MoveNext
Loop

End Function

Richtig?

Aber wie ich das andere genaue nutzen soll mit den mehreren Parametern, versteh ich nicht..., tut mir leid bin da noch nicht so fit :<.

thomas.

andreaspr@aon.at
19-02-10, 12:45
cmdAS400SQL.CommandText = "{select myFunc(?, ?, ?) as hugo from sysibm.sysdummy1}"
cmdAS400SQL.CommandType = adCmdText
cmdAS400SQL.Parameters.Append = cmdAS400SQL.CreateParameter("@nPackStueckId", adInteger, adParamInput)
cmdAS400SQL.Parameters.Append = cmdAS400SQL.CreateParameter("@nAbrufId", adInteger, adParamInputOutput)
cmdAS400SQL.Parameters.Append = cmdAS400SQL.CreateParameter("@nError", adInteger, adParamOutput)


eh so wie du es vorher schon gemacht hattest.

tw89
19-02-10, 13:40
Wo bekomme ich dann parameter zurück?

bei Append sagt er mir das es nicht optional ist? muss ich das "=" rausnehmen?