Autor Thema: Feldvalidierung über SAP  (Gelesen 15251 mal)

Offline Tannibal

  • Senior Mitglied
  • ****
  • Beiträge: 253
  • Geschlecht: Männlich
Feldvalidierung über SAP
« am: 12.06.14 - 14:02:32 »
Hallo ihr,

in einer Notes-Datenbank werden Felder gefüllt und sollen dann mit SAP-Tabellen verglichen werden (ob Wert vorhanden ist etc).

Nun ist die wohl schnellste Methode dies über CreateObject("SAP.Functions.Unicode") und RFC_READ_TABLE zu machen.
Hat hierfür jemand ein funktionierenden Beispiel-Code?
Wenn ich die VBA-Syntax übernehme erhalte ich bei  tblFields(1, "FIELDNAME") = "LIFNR" einen Type-Missmatch.
Ein Beispiel für einen anderen BAPI hier im Forum hatte funktioniert.


Alternativ haben wir auch einen LEI/SAP-Connector-Server im Einsatz, womit ich über Agent.RunOnServer an die Daten kommen könnte.
Jedoch ist dies deutlich langsamer, da mit Temporären Dokumenten gearbeitet werden muss. (besonders für Tochter-Firmen)
Gruß, Daniel
----------------
16x Domino 12.0.2FP1
inkl. Traveler , LEI, Sametime, Connections
1,2k Notes-Clients 10/12

Offline Tannibal

  • Senior Mitglied
  • ****
  • Beiträge: 253
  • Geschlecht: Männlich
Re: Feldvalidierung über SAP
« Antwort #1 am: 07.11.14 - 10:05:32 »
Ich habe dieses Problem mittlerweile gelöst. Mit tblFields.Value(1, "FIELDNAME") = "LIFNR"  funktionierts.

Ich versuche die nächsten Tage eine kleine Doku zu schreiben, wie man die verschiedenen Arten von RFC-Bausteinen aufzurufen hat.
Gruß, Daniel
----------------
16x Domino 12.0.2FP1
inkl. Traveler , LEI, Sametime, Connections
1,2k Notes-Clients 10/12

Offline Tannibal

  • Senior Mitglied
  • ****
  • Beiträge: 253
  • Geschlecht: Männlich
Re: Feldvalidierung über SAP
« Antwort #2 am: 10.11.14 - 16:16:22 »
Ich hoffe jemand kann das Nachfolgende brauchen  >:D
Wenn jemand einen Fehler findet oder Verbesserungsvorschläge hat, immer her damit.


Inhalt

1. Grundsätzliches
2. Initialisierung des SAP-Objects
3. Anmeldung am SAP-System
4. SAP-Baustein initialisieren
5. Übergabe von Werten
6. verschiedene Arten von Bausteinen
6.1 Rückgabewerte über Export-Parameter
6.2 Rückgabewerte über Tabelle(n)
6.3 RFC_Read_Table



1. Grundsätzliches
Voraussetzung für nachfolgende Skripte ist eine installierte SAP-GUI Version 7.20 Patch 2 oder höher. (zumindest für Unicode-Systeme)
Getestet wurde alles mit Notes 9.0.1 FP2 und SAP-GUI 7.30 Patch 9.
SAP-GUI 7.40 enthält aktuell noch Fehler, wodurch einige RFC-Calls nicht sauber funktionieren!


2. Initialisierung des SAP-Objects
Code
	Dim FunctionCtrl As Variant
	Dim SAPConnection As Variant
	
	Set FunctionCtrl = CreateObject("SAP.Functions.Unicode")
	Set SAPConnection = FunctionCtrl.Connection


3. Anmeldung am SAP-System
Code
	SAPConnection.Client = "010"				'Mandant
	SAPConnection.User = "BENUTZER"			'Benutzername GROß
	SAPConnection.Password = "Passwort"		'Passwort
	SAPConnection.Language = "DE"			'Sprache
	SAPConnection.HostName = "10.1.100.200"		'IP
	SAPConnection.SystemNumber = "80"		'System Nummer
	SAPConnection.System = "P01"			'SID
	SAPConnection.UseSAPRFCIni = False
	
	If Not SAPConnection.logon(0, True) Then
		MsgBox("Anmeldung fehlgeschlagen")
	Else
		MsgBox("Anmeldung OK")
	End If


4. Remote-Baustein initialisieren

Der SAP-Baustein muss Remote-fähig sein!
Code
	Dim rfc As Variant	
	Set rfc = FunctionCtrl.Add("RFC_SYSTEM_INFO")


5. Übergabe von Werten
Code
	Dim rfcExport As Variant
	rfc.exports("I_MATNR") = "00324188"
	rfc.exports("I_WERKS") = "1000"
	rfc.exports("I_LGORT") = "340L"


6. verschiedene Arten von Bausteinen
   Mir sind bisher drei Arten von Bausteinen über den Weg gelaufen:
-   Rückgabewerte sind Export-Parameter
-   Rückgabewerte sind Tabellen
-   Spezialfall RFC_Read_Table


6.1 Rückgabewerte über Export-Parameter

Folgender Code zeigt ein Beispiel am Baustein RFC_SYSTEM_INFO, welches über Export Parameter die System-Infos zurückliefert.
Code
	'Zuweisung des Export-Felds aus SAP in Import-Variable
	Set rfcExport = rfc.Imports("RFCSI_EXPORT")
	
	'Zusätzliches Export Feld Current_Resources
	Dim rfcExport2 As Varaint
	Set rfcExport2 = rfc.Imports("CURRENT_RESOURCES")
	
	'Baustein ausführen
	If rfc.call = False Then
		MsgBox("Fehler beim rfc-Call")
		Exit Sub
	Else
		'Wenn Export-Paramter in mehrere Werte unterteilt ist, wie bei RFCSI_EXPORT (rfcExport)
		MsgBox(rfcExport.value("RFCDEST"))

		'Wenn Export-Parameter ein einzelner Wert ist -> rfcExport2
		MsgBox(rfcExport2.value)
	End If


6.2 Rückgabewerte über Tabelle(n)

Beispiel mit Baustein BAPI_USER_GETLIST und Tabelle USERLIST
Code
	Set rfc = FunctionCtrl.Add("BAPI_USER_GETLIST")

	'Rückgabe-Tabelle
	Set rfcExport = rfc.Tables("USERLIST")
	
	'RFC aufrufen
	If Not rfc.Call() Then 
		Error 1000, rfc.Exception 
	End If

	'Überprüfen, ob Werte zurückgeliefert wurden
	If (rfcExport.RowCount = 0) Then
		MsgBox "No records returned by ECC"
		Exit Sub
	End If

	'Tabelle Loopen und zwei Werte auslesen
	Dim index As Long
	index = 0

	Do While index < 2
		index = index + 1
		MsgBox(rfcExport(index,"USERNAME"))
	Loop


6.3 RFC_Read_Table

Mit diesem Baustein können beliebige Tabellen ausgelesen werden. Übergeben werden muss die Tabelle und ein Trennzeichen.
Außerdem müssen im Vorfeld die Rückgabe-Tabellen definiert werden.

   OPTIONS      beschreibt ein SELECT-Statement
   FIELDS      beschreibt die Übergabe-Felder
   DATA      enthält die Datensätze

Beispiel mit Tabelle QALS (Prüflose)
Code
	Set rfc = FunctionCtrl.Add("RFC_READ_TABLE")

	'Übergabe-Parameter
	rfc.exports("QUERY_TABLE") = "QALS"
	rfc.exports("DELIMITER") = "~"

	'Tabellen initialisieren
	Dim tblData As Variant
	Dim tblOptions As Variant
	Dim tblFields As Variant

	Set tblFields = rfc.Tables("FIELDS")
	Set tblData = rfc.Tables("DATA")
	Set tblOptions = rfc.Tables("OPTIONS")

	'Tabelle FIELDS definieren
	tblFields.AppendRow
	tblFields.Value(1, "FIELDNAME") = "PRUEFLOS" 
	tblFields.AppendRow
	tblFields.Value(2, "FIELDNAME") = "WERK"

	'RFC aufrufen
	If Not rfc.Call() Then 
		Error 1000, rfc.Exception 
	End If

	If (tblData.RowCount = 0) Then
		MsgBox "No records returned by ECC"
		Exit Sub
	End If

	'Die MsgBox gibt nun den Datensatz bei Index x zurück
	'Die Werte der Spalten sind durch das vorher definierte Trennzeichen getrennt. „WA“ ist die (einzige) Spalte der Tabelle DATA
	Dim index As Long
	index = 0
	
	Do While index < 2
		index = index + 1
		MsgBox(tblData.Value(index,"WA"))
	Loop
« Letzte Änderung: 12.11.14 - 14:52:42 von Tannibal »
Gruß, Daniel
----------------
16x Domino 12.0.2FP1
inkl. Traveler , LEI, Sametime, Connections
1,2k Notes-Clients 10/12

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz