[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Feb 2010
    Beiträge
    5

    Thumbs down Remote Funktionen mit MS Access aufrufen

    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:
    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.

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Feb 2010
    Beiträge
    5
    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.

  4. #4
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    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

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    @Andreas
    Funktionen können aber nur 1 Wert zurückgeben und, wie du schon sagst, muss ich einen Select verwenden.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    .. 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

    Zitat Zitat von Fuerchau Beitrag anzeigen
    @Andreas
    Funktionen können aber nur 1 Wert zurückgeben und, wie du schon sagst, muss ich einen Select verwenden.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    Feb 2010
    Beiträge
    5
    Ok,

    das mit dem Select-Function hab ich verstanden!

    1 Wert, mehr nicht... ist zumindest etwas

    dann würd es so aussehen??

    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 = "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.

  9. #9
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Code:
        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.

  10. #10
    Registriert seit
    Feb 2010
    Beiträge
    5
    Wo bekomme ich dann parameter zurück?

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

  11. #11
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    mit
    Set rsAS400 = cmdAS400SQL.Execute
    bekommst du einen datensatz zurück.

    wie die syntax in vb aussehen muss, weis ich leider nicht. entweder mit F1 auf das objekt bzw. in der MSDN nachschauen gehen oder googlen.
    vlt. gibts aber noch jemandem der sich da genau auskennt.

  12. #12
    Registriert seit
    Feb 2010
    Beiträge
    5
    Ok,

    können wir das kurz nochmal aufschlüsseln?

    Aufruf der Funktion!, Die Fragezeichen in den Klammern bedeuten das hier Parameter eingefügt werden, oder?

    Code:
    cmdAS400SQL.CommandText = "{call ILS_ABRUF.ILS_ADD_Abrufpack (?, ?, ?)}"
    Insgesamt muss ich 3 Parameter übergeben?! Das mache ich mit:
    Die erste Stelle ist der Wert, die Zweite die Deklaration (integer), und das dritte sagt aus ich füge einen Parameter hinzu (adParamInput)? Richtig?

    Code:
    cmdAS400SQL.Parameters.Append = cmdAS400SQL.CreateParameter("@nPackStueckId", adInteger, adParamInput)
    2. Parameter?

    Code:
    cmdAS400SQL.Parameters.Append = cmdAS400SQL.CreateParameter("@nAbrufId", adInteger, adParamInputOutput)
    3. Parameter?
    Code:
    cmdAS400SQL.Parameters.Append = cmdAS400SQL.CreateParameter("@nError", adInteger, adParamOutput)

Similar Threads

  1. MS Access ODBC mit JOIN: SQL FEHLER666
    By olafu in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 05-10-06, 08:13
  2. Timestamp Feld von MS Access abfragen
    By andreas.lundschien in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 05-09-06, 14:55
  3. ODBC-Zugriff mit MS Access - SQL - Userabfrage
    By User in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 26-01-05, 20:52
  4. iSeries + MS Access
    By reraru in forum IBM i Hauptforum
    Antworten: 13
    Letzter Beitrag: 18-01-05, 13:06
  5. MS Access 97 - DB2 Problem
    By Salvi in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 21-05-04, 07:44

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •