Heute habe ich euch mal etwas zu einer hilfreichen SAP-Schnittstelle zu IBM Notes und Domino zusammengeschrieben, mit der man z.B.

  • einen Reset des SAP Benutzerpassworts über eine Notes und Domino Anwendung veranlassen,
  • Daten aus Notes und Domino Datenbanken in SAP übertragen oder
  • SAP Dokumente zur Übertragung in Lotus Notes auslesen kann.

Selbstverständlich dürft ihr diese Schnittstelle nur verwenden, wenn ihr eine gültige SAP Lizenz besitzt! Außerdem benötigt ihr einen gültigen SAP Service Marketplace Account, um euch die beiden erforderlichen Installationsdateien unter http://service.sap.com/connectors herunterladen zu können.

Ihr benötigt die Installationsdateien sapjco3.dll und sapjco3.jar. Bitte achtet darauf, dass ihr die richtige Version für euer System benutzt, es gibt nämlich eine 32bit- und eine 64bit-Version. Die zu benutzende Version ist abhängig vom Windows Betriebssystem.

Um die Dateien nun in eine Datenbank einzubinden, legt ihr einen Ordner "libs" unter "Webcontent" im Package Explorer des Domino Designers an und importiert die beiden Dateien in diesen Ordner. Nun macht ihr ein Rechtsklick auf die jar und wählt im Kontextmenü "Build Path" und anschließend "Add to Build Path" aus. Zusätzlich müssen die beiden Dateien noch auf den Server gelegt werden, und zwar an die folgende Stelle: %lotusnotes%\domino\jvm\lib\ext.

Nun den Domino Server einmal neu starten. (Vorsicht: Nach einem Update des Servers kann es sein, dass der Ordner aufgeräumt wird und die .jar- und .dll-Dateien neu an die Stelle kopiert werden müssen!)

Um nicht wie auf der SAP-Seite beschrieben immer eine Datei im Klartext auf die Festplatte legen zu müssen, bietet sich die folgende alternative Vorgehensweise an: Wir erzeugen uns einen eigenen DestinationDataProvider der im einfachsten Fall wie folgt aussieht:

import java.util.*;

import com.sap.conn.jco.ext.*;
public class MyDestinationDataProvider implements DestinationDataProvider {

Map<String, Properties> propertiesForDestinationName = new HashMap<String, Properties>();

         public void addDestination(String destinationName, Properties properties) {

                     propertiesForDestinationName.put(destinationName, properties);

         }

         public Properties getDestinationProperties(String destinationName) {

                     if (propertiesForDestinationName.containsKey(destinationName)) {

                                return propertiesForDestinationName.get(destinationName);

                     } else {

                                throw new RuntimeException("JCo destination not found: " + destinationName);

                     }

         }

         public void setDestinationDataEventListener(DestinationDataEventListener eventListener) {  // nothing to do      }

         public boolean supportsEvents() {  return false;  }

}

 

Die folgende Klasse baut eine Verbindung zum SAP-Server und kann einfach in bestehende Projekte eingebunden werden:

import java.util.*;

import com.sap.conn.jco.*;

import com.sap.conn.jco.ext.DestinationDataProvider;

 

public class SapCon implements Serializable {

       private static final long serialVersionUID = -7048651837683314761L;

       private Properties mConnectProperties;

       private JCoDestination mDestination;

       /**

   * Instantiates a new SapCon object.

   * @param server type: String (IP Adresse des Servers)

   * @param sysNumber type: String (Systemnummer ist eine zweistellige Zahl)

   * @param clientNumber type: String (Die Clientnummer ist Standardmäßig 500 kann aber variieren daher beim SAP support nachfragen)

   * @param sapUser type: String (Ein Benutzer der im Backend eine Verbindung zu SAP aufbauen darf)

   * @param sapUserPw type: String (Passwort des SAPbenutzers)

        * @param language type: String (Sprache in der das SAP System betrieben wird)

        */

       public SapCon(String server, String sysNumber, String clientNumber, String sapUser, String sapUserPw, String language) {

             super();

             try { connectSAP( server,  sysNumber,  clientNumber,  sapUser,  sapUserPw,  language);

      } catch (Exception e) {  e.printStackTrace(); }

   }

       /** Connect sap.

    * @throws Exception*/

       public void connectSAP(String server, String sysNumber, String clientNumber, String sapUser, String sapUserPw, String language) throws Exception {

             // Connect zum SAP System

             mConnectProperties = new Properties();

             mConnectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, server);

             mConnectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, sysNumber);

             mConnectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, clientNumber);

             mConnectProperties.setProperty(DestinationDataProvider.JCO_USER, sapUser);

             mConnectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, sapUserPw);

             mConnectProperties.setProperty(DestinationDataProvider.JCO_LANG, language);

             // Angaben für eine Pooled Verbindung

             mConnectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3");

             mConnectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10");

             // Eigenen DestinationDataProvider erzeugen

      MyDestinationDataProvider provider = new MyDestinationDataProvider();

      provider.addDestination("A01", mConnectProperties);

             // provider hinzufügen

     com.sap.conn.jco.ext.Environment.registerDestinationDataProvider(provider);

             mDestination = JCoDestinationManager.getDestination("A01");

             // Provider wieder entfernen sonst gibts beim nächsten mal Hinzufügen

             // eine Fehlermeldung

             try { com.sap.conn.jco.ext.Environment.unregisterDestinationDataProvider(provider);

             } catch (Exception e) { e.printStackTrace();}

   }

       /** Gets the destination.

    * @return the destination    */

       public JCoDestination getDestination() {   return mDestination;     }

}

 

Nun kommen wir dazu, wie man einen RFC(Bapi) im SAP aufruft. RFCs(Bapis) sind Schnittstellen-Funktionen die von außen durch die sapjco-Schnittstelle angesprochen werden können. Hier ist es möglich, Parameter zu übergeben und zu empfangen. Die Funktionalität dieser RFCs kann durch einen fachkundigen ABAP-Entwickler festgelegt werden z.B. Reset des SAP Benutzerpassworts, Übertragung von Notesdatebanken in SAP, Auslesen von SAP Dokumenten zur Übertragung in Lotus Notes usw.

Hier der entsprechende Code mit kleinen Beispielen:

import java.util.*;

import com.sap.conn.jco.*;
 

public class RFCCaller {

         private SapCon sapCon;

         public void runBapi() throws Exception {

                    // RFC Aufrufen

                    JCoFunction function = sapCon.getDestination().getRepository().getFunction("%RFC namen eintragen%");

                    if (function == null)

                                  throw new RuntimeException("RFC im System nicht gefunden");

                    // setzen eines Skalaren Importparameters

                    function.getImportParameterList().setValue("%PARAMTER NAME%", "PARAMTER als STRING");

                    // setzen einer Tabelle als Importparameters

                    JCoTable sapTable= function.getImportParameterList().getTable("%TABELLEN NAME%");

                    sapTable.appendRow();

                    sapTable.setValue(0, "Wert des Feldes");

                    // RFC ausführen

                    function.execute(sapCon.getDestination());

                    // auslesen einer Tabelle mit einer spalte

                    JCoTable antwortTabelle = function.getTableParameterList().getTable("ANTWORT TABELLE");

                    for (int i = 0; i < antwortTabelle.getNumRows(); i++)

                    {           antwortTabelle.setRow(i);

                                Iterator<JCoField> it = antwortTabelle.iterator();

                                while (it.hasNext()) {

                                           JCoField field = it.next();

                                           System.out.println(field.getName()+":"+field.getString());

                                }

                    }

                    // Auslesen einer Struktur

                    JCoStructure exportStructure = function.getExportParameterList().getStructure("%STRUKTUR NAME%");

                    for (JCoField field : exportStructure) {

                                 if (field.getName().equalsIgnoreCase("FELDNAME")) {

                                              System.out.println(field.getString());  }

                    }

         }

}

 

Weitere Infos findet ihr in der SAP Online Dokumentation. Viel Spaß beim SAP ansprechen! Falls ihr Fragen habt, ruft uns bitte einfach an (05251 288160) oder schreibt uns ein Mail (info@itwu.de).

 

 

Neues vom ITWU-Blog

DOMI im Verse-Kalender 3.2.1 und unsere Roadmap in Sachen Teams@Notes und MS O365-Integrationen - Weiterlesen
ITWU-Projektvorstellung: Ohne Papierkram auf Montage – ITWU zeigt euch das perfekte Tool für euren Montagearbeitsbericht, digital und doch offline-fähig!  - Weiterlesen
Der Grid-Konfigurator – Teil 2 – Wie ihr in ISIE eine Datenbank hinterlegt und eine neue Grid-Konfiguration erstellt - Weiterlesen
LotusScript-Fehler beim Hochladen aus HCL Notes ins Office 365 - Weiterlesen
Verbesserung der Benutzererfahrung auf dem Smartphone mit Nomad - Weiterlesen
ITWU verabschiedet sich am Freitag, den 22.12.2023 in die Winterpause - Weiterlesen
Update-Info: Die neuen Features von HCL Notes Domino 14 - Weiterlesen
 zum Archiv