SAP-Daten mit VBA einlesen

Snape

Erfahrenes Mitglied
Moin,
ich verzweifle an der fehlenden/schlechten API bzgl. der SAPFunctions-Klasse...
Folgendes: Ich habe eine funktionierende Verbindung von Access 2003 aus zum SAP. Login funktioniert, auch der Aufruf des SAP-Funktionsbausteins SAP-seitig.
ABER: mein SAPFunctions-Objekt bekommt beim call-Aufruf ein false zurück. Was übersehe ich, was vergesse ich, irgendwo auf meiner VBA-Seite muss es ja klemmen, sonst würde der Funktionsbaustein nicht korrekt aufgerufen (mit meinen Übergabewerten). Als Ansatz hier mein Codeschnippsel:
Code:
Public Function getSAPDatenRFC() 
     Const TabName = "MERKMALE" 
     Dim fncTabLesen As Object 
     Dim bRFCCall As Boolean 
     Dim theException As Variant 

     'SAP-LogIn + festlegen der RemoteFunction 
     If theRFCCall.login = True Then 
         Set fncTabLesen = theRFCCall.addSapFunc("DOCU_COM") 
         'Parameter füllen 
         fncTabLesen.Exports("ID") = "012345" 
         fncTabLesen.Exports("POSNR") = "00002" 
         'RemoteFunction aufrufen + Tabelle abrufen 
         bRFCCall = fncTabLesen.Call 
         theException = fncTabLesen.Exception 
         If bRFCCall = True Then 
             Set theTable = fncTabLesen.Tables(TabName) 
           Else 
             MsgBox "Lesen der Tabelle " & TabName & " gescheitert!", vbOKOnly 
         End If 
         'Hier wird die Routine um die Access-Tabelle zu füllen aufgerufen 
         If theTable.RowCount > 0 Then 
             AccessTab_fuellen (TabName) 
         End If 
       Else 
         MsgBox "RFC LogIn gescheitert!", vbOKOnly 
     End If 
     'Logout 
     Set theRFCCall = Nothing 
 End Function
Der Aufruf von
bRFCCall = fncTabLesen.Call
liefert mir nur ein FALSE zurück. theException ist leer.

Inhaltlich:
ID und POSNR sind die Informationen, die ich an den SAP-Funktionsbaustein namens DOCU_COM übergeben muss und dies auch tue, wie mir der zuständige SAP-Spezialist glaubwürdig versichert. Zurück liefert der Baustein eine Tabelle namens MERKMALE, die aber scheinbar nie bei meinem Programm ankommt. Hat jemand eine Idee, woran das liegen kann? Muss ich vor dem Call-Aufruf der SAPFunction (ich benutze nicht SAPFunctionsOCX) schon mitteilen, wie die Tabelle heißt, die zurück kommt? Evtl. auch noch die Felder in der Tabelle? Wenn ja, wie? Ich bedanke mich für jeglichen Lösungshinweis!
Wenn nicht: Gibt es irgend eine Möglichkeit für mich, auf VBA-Access-Seite an Informationen zu kommen, was da schief läuft oder wieso ich da ein false zurückbekomme?
 
Das erste was ich machen würde wäre fncTabLesen in die Überwachung zu nehmen, und dann im Einzelschritt durchzugehen.

Da fncTabLesen As Object deklariert ist solltest du alle Eigenschaften sehen. Mir kommts vor, als ob eben nicht alle notwendigen Eigenschaften gesetzt sind, bevor du die Call_Methode aufrufst. Demzufolge kommt nichts zurück.

Wäre zumindest mein Ansatz. Ich würde definitiv fncTabLesen.Tables im Auge behalten (Count, Names für alle Tabellen usw.)
 
Moin Zvoni,
das mit den unvollständigen Eigenschaften ist auch mein Verdacht. Aber ich habe noch nicht verstanden, wann und wie das mit den tables funktioniert. Ich sehe einige Beispiele, in denen vor dem Call-Aufruf sowas in der Art gemacht wird

Set myObject = fncTabLesen.tables.Item("irgendwas")

oder

Set myObject = fncTabLesen.tables("irgendwas")

Nach meinem Verständnis bewirkt das aber doch keine Eigenschaftsänderung des fncTabLesen-Objektes, oder irre ich da? Und muss man der VBA-seitigen Darstellung des SAP-Funktionsbausteins (fncTabLesen) bereits alles bekannt geben, bevor der Call aufgerufen wird? Sprich, ich muss ihm mitgeben (wie?), welche Tabelle ich erwarte (Name und Felder)?
Es gibt ein Beispiel unter http://www.office-loesung.de/ftopic220031_0_0_asc.php voon K_Mueller, aber ich verstehe nicht,
- ob bei SAPCustomerGet.Exports("Query_Table") = "KNA1" ich das KNA1 ersetzen müsste durch MERKMALE (ist Query_Table ein fester Name?)
- ob ich bei Set oRowFields = SAPCustomerGet.tables("FIELDS").Rows.Add '0
oRowFields("FIELDNAME") = "KUNNR" die Bezeichnung FIELDS so übernehmen kann als Schlüsselwort für die Tabellenfelder und "KUNNR" bei mir durch Feldnamen meiner Tabelle MERKMALE ersetzen müsste.

Kannst Du Licht ins Dunkel bringen?
 
Was mir seltsam erscheint ist, dass du bei den zwei Exports ID und POSNR festlegst, aber nicht die Tabelle.

Woher kennt der SAP-Funktionsbaustein (Eine Funktion wird einem Objekt zugeordnet?), dass deine Tabelle "MERKMALE" heisst?

Nachdem ich deinen anderen Link durchgelesen habe, denke ich auch dass du ein
Visual Basic:
fncTabLesen.Exports("Query_Table")=TabName
als erste Export-Zuweisung benötigst.

Da ich jedoch die Implementierung der Schnittstellen nicht kenne, ist es nur eine Vermutung.
 
Was mir seltsam erscheint ist, dass du bei den zwei Exports ID und POSNR festlegst, aber nicht die Tabelle.
ID und POSNR sind Werte, die ich übergebe, damit der Funktionsbaustein sie weiter verwenden kann, während die Tabelle die Rückgabewerte beinhaltet.

Woher kennt der SAP-Funktionsbaustein (Eine Funktion wird einem Objekt zugeordnet?), dass deine Tabelle "MERKMALE" heisst?
Gute Frage. In der Doku des FB steht das so drin.

Nachdem ich deinen anderen Link durchgelesen habe, denke ich auch dass du ein
Visual Basic:
fncTabLesen.Exports("Query_Table")=TabName
als erste Export-Zuweisung benötigst.
Da bekomme ich aber die Fehlermeldung "Typen unverträglich"

Da ich jedoch die Implementierung der Schnittstellen nicht kenne, ist es nur eine Vermutung.
Wie gesagt, sie ist ganz einfach gehalten und greift nur lesend auf SAP zu.
 
Wenn das so in der Doku steht, dass nach Festlegung von ID und POSNR eine Tabelle erzeugt und zurück gegeben werden soll stellt sich die Frage, wo das Tabellen-Objekt zurückgegeben wird.

Kommt es als Funktionsergebnis, oder als Referenzparameter?
 
Mahlzeit,
dann gibt es wieder eine Fehlermeldung, dass ein Object erwartet wird. Bekomme ich denn kein Object aus SAP? Der Einfachheit halber verlinke ich mal die Beschreibung des Funktionsbausteins: Klick
 
Punkt 1: Die Tabelle heisst "ET_MERKMALE", nicht "MERKMALE"
Punkt 2: In den Übergabewerten (IMPORT) sehe ich nirgendwo ein ID oder POSNR, nur IV_irgendwas
Punkt 3: Wenn Tabelle3 die Schnittstelle für DOCU_COM ist, wieso soll "Exports" dann die richtige Funktion sein? Da würde ich eher auf "Import" tippen? Gebe aber zu, dass ich mich mit SAP nicht wirklich auskenne.

Vielleicht mal deine Feldnamen checken!
 

Neue Beiträge

Zurück