Vous êtes sur la page 1sur 34

ABAP

ABAP Connectivity
SAP Connector - RFC Destination - JCo
Cet exercice permet de découvrir les connecteur Java en mode "RFC
Destination" (du connecteur vers SAP).

Produit 00 - Overview...............................................................................................3
SAP NetWeaver 750
01 - Java Project...........................................................................................4
ABAP
SAP Java Connector...........................................................................5
Package..............................................................................................6
Niveau 02 - Java Classes...........................................................................................7
Débutant Class ProviderRFCDestination............................................................7
Class SAPDestination.......................................................................11
Class Launch....................................................................................13
Focus 03 - Java Methods......................................................................................16
ABAP Development
Method testRFCConnection.............................................................16
ABAP Connectivity
Method divide.................................................................................23
Method displayEmployee................................................................25
Auteurs Method displayEmployees...............................................................27
SAP ACC Switzerland 04 - Conclusion..........................................................................................28

Version 10

© SAP ACC Switzerland


ABAP

Prérequis - Software & Travaux pratiques

Software SAP GUI


TP ABAP Dictionary Dictionary Objects
TP ABAP Development Transport
TP ABAP Connectivity RFC Destination - DDIC

IMPORTANT

Identification personnelle [PERS] :

Note

A chaque fois que vous rencontrerez les champs [PERS], … il faudra les remplacer par les données
correspondantes ci-dessus.

Attention

Les informations contenues dans les images ne sont qu'à titre d'exemple. Merci de bien LIRE les
informations contenues dans le texte d'explication. NE PAS COPIER les textes de l'image !

© SAP ACC Switzerland 2


ABAP

00 - Overview

Suite à la création des trois "Remote Function Module" dans SAP, vous allez pouvoir les appeler depuis
un programme Java

© SAP ACC Switzerland 3


ABAP

01 - Java Project

Créer un nouveau projet Java

Lancer Eclipse

Créer un nouveau projet JAVA


Menu "File / New Project"
Choisir "Java Project"

New Java Project

Project Name SAP_JCoDestination_[PERS]


JRE "Use an execution environment JRE"
Choisir la JRE 1.8 (recommandé) ou 1.11

© SAP ACC Switzerland 4


ABAP

SAP Java Connector

Ajouter & configurer le SAP Java Connector (JCo) au projet Java

Aller dans l'onglet "Libraries"


Ajouter le JAR externe "sapjco3.jar" [Path : C:\SAP\JCo]
Ajouter la JAVA documentation liée au SAP JCo [Path : C:/SAP/JCo/javadoc]

© SAP ACC Switzerland 5


ABAP

Package

Structurer le projet Java avec des packages pour bien séparer le JCo et les autres classes

Dans le projet, créer un package "sapconnector" qui englobera toutes les classes pour la connexion via le
SAP JCo et un deuxième package "util" pour les autres classes du programme

Cliquer-droit sur le projet, choisir "New / Package"

© SAP ACC Switzerland 6


ABAP

02 - Java Classes

Préparer les classes Java pour pouvoir implémenter les méthodes via le SAP JCo

Class ProviderRFCDestination

Créer une classe pour les données de connexion au serveur SAP

Cliquer-droit sur le package "sapconnector", puis choisir "New / Class"

New Java Class

Package sapconnector
Name ProviderRFCDestination

Implémenter l'interface "DestinationDataProvider"

Code

package sapconnector;

public class ProviderRFCDestination implements DestinationDataProvider


{

Générer le "Import" de l'interface "DestinationDataProvider"

© SAP ACC Switzerland 7


ABAP

Générer les méthodes de l'interface "getDestinationProperties", "setDestinationDataEventListener" et


"supportsEvents"

Code

package sapconnector;

import java.util.Properties;
import com.sap.conn.jco.ext.DestinationDataEventListener;
import com.sap.conn.jco.ext.DestinationDataProvider;

public class ProviderRFCDestination implements DestinationDataProvider


{

@Override
public Properties getDestinationProperties(String destinationName) {
// TODO Auto-generated method stub
return null;
}

@Override
public void setDestinationDataEventListener(
DestinationDataEventListener eventListener) {
// TODO Auto-generated method stub

@Override
public boolean supportsEvents() {
// TODO Auto-generated method stub
return false;
}

© SAP ACC Switzerland 8


ABAP

Créer les variables de classe

Code

//Variable
public static String SAP_SERVER ;
private final Properties _destination;

Créer le constructeur de la classe pour les données de connexion aux systèmes SAP

Code

//Constructor
public ProviderRFCDestination(String destinationSID)
{
SAP_SERVER = destinationSID ;
this._destination = new Properties();
this._destination.setProperty(DestinationDataProvider.JCO_ASHOST, "<hostname>");
this._destination.setProperty(DestinationDataProvider.JCO_SYSNR, "<sysnum>");
this._destination.setProperty(DestinationDataProvider.JCO_CLIENT, "<client>");
this._destination.setProperty(DestinationDataProvider.JCO_USER, "<user>");
this._destination.setProperty(DestinationDataProvider.JCO_PASSWD, "<pwd>");
this._destination.setProperty(DestinationDataProvider.JCO_LANG, "<language>");
this._destination.setProperty(DestinationDataProvider.JCO_SAPROUTER, "<router>");
}

NOTE
Possibilité de créer un deuxième avec les données de connexion transmises par variables, …

Remplacer les valeurs "< … >" selon le tableau ci-dessous en lien avec le SAP FrontEnd

SAP Development System

Hostname Groupe/Serveur via SAP Logon


System Number N° instance via SAP Logon
Client < votre mandant >
User < votre utilisateur >
Password < votre mot de passe >
Language EN or FR or DE
SAProuter /H/saprouter.hevs.ch/S/3299/H/

© SAP ACC Switzerland 9


ABAP

NOTE
Toutes les informations techniques de connexion apparaissent dans le SAP Logon

Modifier la méthode "getDestinationProperites" pour retourner la variable de classe "_destination" qui


contient toutes les données de connexion au système SAP

Code

@Override
public Properties getDestinationProperties(String destinationName) {
// TODO Auto-generated method stub
return this._destination; //CHANGE
}

@Override
public void setDestinationDataEventListener(
DestinationDataEventListener eventListener) {
// TODO Auto-generated method stub

@Override
public boolean supportsEvents() {
// TODO Auto-generated method stub
return false;
}

NOTE
Pour plus d'information voir la classe Java "CustomDestinationDataProvider.java" dans le dossier
"C:/SAP/JCo/examples"

© SAP ACC Switzerland 10


ABAP

Class SAPDestination

Créer une classe pour la connexion au serveur SAP et l'appel aux "Remote Function Modules"

Cliquer-droit sur le package "sapconnector", puis choisir "New / Class"

New Java Class

Package sapconnector
Name SAPDestination

Importer les classes du SAP JCo

Code

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

Créer la variable de classe qui contiendra les données de connexions au système SAP

Code

//Variable
private String _destination ;

Créer le constructeur de la classe en lien avec la classe "ProviderRFCDestination"

Code

//Constructor
public SAPDestination(String sapsid)
{
this._destination = sapsid ;

//Destination Provider
ProviderRFCDestination _rfcdestination = new ProviderRFCDestination(sapsid) ;
Environment.registerDestinationDataProvider(_rfcdestination);
}

© SAP ACC Switzerland 11


ABAP

Créer les interfaces des méthodes qui appelleront les "Remote Function Modules" du système SAP

Code

//Remote Function Module STFC_CONNECTION


public void testRFCConnection(String txt)
{

//Remote Function Module Z_FM_RFCDEST_VARIABLE_###


public void divide(int number1, int number2)
{

//Remote Function Module Z_FM_RFCDEST_STRUCTURE_###


public void displayEmployee(String carrier, int idemployee)
{

//Remote Function Module Z_FM_RFCDEST_TABLE_###


public void displayEmployees(String carrier)
{

© SAP ACC Switzerland 12


ABAP

Class Launch

Créer une classe pour permettre le lancement du programme [Main]

Cliquer-droit sur le package "util", puis choisir "New / Class"

New Java Class

Package util
Name Launch
Public static void main 

© SAP ACC Switzerland 13


ABAP

Importer le classe "SAPDestination" du package "sapconnector"

Code

import sapconnector.SAPDestination;

Appeler la classe "SAPDestination" avec les données de connexion au serveur SAP

Code

public static void main(String[] args)


{
SAPDestination server = new SAPDestination("<sapsid>");
}

Remplacer la valeur "<sapsid>" selon le tableau ci-dessous en lien avec le SAP FrontEnd

SAP Development System

SAP SID SID via SAP Logon

NOTE
Toutes les informations techniques de connexion apparaissent dans le SAP Logon

© SAP ACC Switzerland 14


ABAP

Ajouter les appels aux fonctions de la classe "SAPDestination"

Code

public static void main(String[] args)


{
SAPDestination server = new SAPDestination("<sapsid>");

//Call Methods
server.testRFCConnection("SAP") ;

System.out.println();
server.divide(10, 2) ;
server.divide(10, 0) ; //Division by zero

System.out.println();
server.displayEmployee("AA", 1) ;
server.displayEmployee("AA", 10) ; //Empty selection

System.out.println();
server.displayEmployees("SR") ;
server.displayEmployees("AF") ; //Empty selection
}

NOTE
Actuellement les méthodes de la classe "SAPDestination" sont vides
Le programme n'effectue aucune opération
Lors du test "Run Launch", rien ne s'affiche
C'est normal

© SAP ACC Switzerland 15


ABAP

03 - Java Methods

Modifier les méthodes de la classe "SAPDestination" pour accéder aux "Remote Function Modules" de
SAP et afficher leur résultat dans la console Java

Method testRFCConnection

La méthode Java appelle le "Remote Function Module (RFM)" "STFC_CONNECTION" du système SAP

Visualiser et tester le "Remote Function Module" dans SAP


Se connecter au système de développement en langue anglaise (EN)
Lancer la transaction "SE37 - Function Builder"
Afficher le "Remote Function Module" "STFC_CONNECTION"

Visualiser les paramètres d'entrée (onglet "Import")

Q1 De quel type de données est le paramètre d'entrée "REQUTEXT" ?

Type SAP :
Type Java : (Conversion SAP en Java)

NOTE
Double-cliquer dans le champ "Associated Type" (ici "SY-LISEL") pour voir le type de données "Data
Type"

© SAP ACC Switzerland 16


ABAP

Visualiser les paramètres de sortie (onglet "Export")

Q2 Quels sont les deux paramètres de sortie ?

Variable Export : (Majuscule)


Type SAP :
Type Java : (Conversion SAP en Java)

Variable Export : (Majuscule)


Type SAP :
Type Java : (Conversion SAP en Java)

Visualiser les exceptions (onglet "Exceptions")

Q3 Existe-t-il des exceptions à capturer (onglet "Exceptions")

Exceptions :

Visualiser le code source (onglet "Source code")


Ce "Remote Function Module" effectue uniquement une concaténation de caractères

Tester le "Remote Function Module" via

© SAP ACC Switzerland 17


ABAP

Dans Eclipse, créer l'appel au "Remote Function Module" "STFC_CONNECTION"


Importer les classes du SAP JCo dans la classe "SAPDestination"

Code

import com.sap.conn.jco.AbapException;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.JCoFunction;

Modifier la méthode "testRFCConnection" de la classe "SAPDestination"

Code - Etape 1
Créer la connexion vers le système SAP
Récupérer les métadonnées du "Remote Function Module" (Attention nom en majuscule)
Capturer les erreurs ABAP, JCo et standard

//Remote Function Module STFC_CONNECTION


public void testRFCConnection(String txt)
{
try
{
//Create SAP connection & Get function module metadata
JCoDestination destination =
JCoDestinationManager.getDestination(this._destination);
JCoFunction function =
destination.getRepository().getFunction("STFC_CONNECTION");
if(function == null)
throw new RuntimeException("STFC_CONNECTION not found in SAP.");

//Set import parameters

//Execute function

//Get export parameters

}
catch (AbapException e)
{
System.out.println(e.toString());
}
catch (JCoException e)
{
System.out.println(e.toString());
}
catch (Exception e)
{
System.out.println(e.toString());
}
}

© SAP ACC Switzerland 18


ABAP

© SAP ACC Switzerland 19


ABAP

Code - Etape 2
Assigner les paramètres d'entrée
ATTENTION le nom des paramètres est toujours en majuscule dans SAP

//Remote Function Module STFC_CONNECTION


public void testRFCConnection(String txt)
{
try
{
//Create SAP connection & Get function module metadata
...

//Set import parameters


function.getImportParameterList().setValue("REQUTEXT", txt);

//Execute function

//Get export parameters

}
catch (AbapException e)
{
System.out.println(e.toString());
}
catch (JCoException e)
{
System.out.println(e.toString());
}
catch (Exception e)
{
System.out.println(e.toString());
}
}

© SAP ACC Switzerland 20


ABAP

Code - Etape 3
Exécuter l'appel au "Remote Function Module"

//Remote Function Module STFC_CONNECTION


public void testRFCConnection(String txt)
{
try
{
//Create SAP connection & Get function module metadata
...

//Set import parameters


...

//Execute function
function.execute(destination);

//Get export parameters

}
catch (AbapException e)
{
System.out.println(e.toString());
}
catch (JCoException e)
{
System.out.println(e.toString());
}
catch (Exception e)
{
System.out.println(e.toString());
}
}

© SAP ACC Switzerland 21


ABAP

Code - Etape 4
Récupérer les paramètres de sortie (attention aux types de données)
ATTENTION le nom des paramètres est toujours en majuscule dans SAP
Afficher le résultat

//Remote Function Module STFC_CONNECTION


public void testRFCConnection(String txt)
{
try
{
//Create SAP connection & Get function module metadata
...

//Set import parameters


...

//Execute function
...

//Get export parameters


String echo = function.getExportParameterList().getString("ECHOTEXT");
String resp = function.getExportParameterList().getString("RESPTEXT");

//Display result
System.out.println("STFC_CONNECTION finished");
System.out.println(echo);
System.out.println(resp);
}
catch (AbapException e)
{
System.out.println(e.toString());
}
catch (JCoException e)
{
System.out.println(e.toString());
}
catch (Exception e)
{
System.out.println(e.toString());
}
}

© SAP ACC Switzerland 22


ABAP

Tester l'application Java via la classe "Launch"

NOTE
En cas d'erreur ou de problème, cliquer-droit sur projet et choisir rafraichir
Ouvrir le fichier "dev_jco_rfc.trc" pour visualiser la trace

© SAP ACC Switzerland 23


ABAP

Method divide

La méthode Java appelle le "Remote Function Module (RFM)" "Z_FM_RFCDEST_VARIABLE_[PERS]" du


système SAP

SAP

Etape 1 Visualiser et tester le "Remote Function Module" via SE37


Etape 2 Récupérer les paramètres d'entrée, les paramètres de sortie et les exceptions
Convertir les types de données SAP vers Java

Dans Eclipse, créer l'appel au "Remote Function Module" "Z_FM_RFCDEST_VARIABLE_[PERS]"


Modifier la méthode "divide" de la classe "SAPDestination"

Code

Etape 1 Créer la connexion vers le système SAP


Récupérer les métadonnées du "Remote Function Module"
Capturer les erreurs JCo et standard
Etape 2 Assigner les paramètres d'entrée
Etape 3 Exécuter l'appel au "Remote Function Module"
Capturer les exceptions ABAP
Etape 4 Récupérer les paramètres de sortie (attention aux types de données)
Afficher le résultat
Etape 5 Tester l'application Java via la classe "Launch"

NOTE
Pour plus d'information voir la méthode "step3SimpleCall" de la classe Java "StepByStepClient.java"
dans le dossier "C:/SAP/JCo/examples"

© SAP ACC Switzerland 24


ABAP

Tester l'application Java via la classe "Launch"

NOTE
En cas d'erreur ou de problème, cliquer-droit sur projet et choisir rafraichir
Ouvrir le fichier "dev_jco_rfc.trc" pour visualiser la trace

© SAP ACC Switzerland 25


ABAP

Method displayEmployee

La méthode Java appelle le "Remote Function Module (RFM)" "Z_FM_RFCDEST_STRUCTURE_[PERS]" du


système SAP

SAP

Etape 1 Visualiser et tester le "Remote Function Module" via SE37


Etape 2 Récupérer les paramètres d'entrée, les paramètres de sortie et les exceptions
Convertir les types de données SAP vers Java

Dans Eclipse, créer l'appel au "Remote Function Module" "Z_FM_RFCDEST_STRUCTURE_[PERS]"


Importer les classes du SAP JCo dans la classe "SAPDestination"
Modifier la méthode "displayEmployee" de la classe "SAPDestination"

Code

import com.sap.conn.jco.JCoStructure;

Code

Etape 1 Créer la connexion vers le système SAP


Récupérer les métadonnées du "Remote Function Module"
Capturer les erreurs JCo et standard
Etape 2 Assigner les paramètres d'entrée
Etape 3 Exécuter l'appel au "Remote Function Module"
Capturer les exceptions ABAP
Etape 4 Récupérer les paramètres de sortie (attention aux types de données)
Aide : JCoStructure … = function.getExportParameterList().getStructure("…");
Afficher le résultat
Aide : System.out.println( ….getString("<nom colonne>" ou <index>) + " " + ...) ;
Etape 5 Tester l'application Java via la classe "Launch"

NOTE
Pour plus d'information voir la méthode "step3WorkWithStructure" de la classe Java
"StepByStepClient.java" dans le dossier "C:/SAP/JCo/examples"

© SAP ACC Switzerland 26


ABAP

© SAP ACC Switzerland 27


ABAP

Tester l'application Java via la classe "Launch"

NOTE
En cas d'erreur ou de problème, cliquer-droit sur projet et choisir rafraichir
Ouvrir le fichier "dev_jco_rfc.trc" pour visualiser la trace

© SAP ACC Switzerland 28


ABAP

Method displayEmployees

La méthode Java appelle le "Remote Function Module (RFM)" "Z_FM_RFCDEST_TABLE_[PERS]" du


système SAP

SAP

Etape 1 Visualiser et tester le "Remote Function Module" via SE37


Etape 2 Récupérer les paramètres d'entrée, les paramètres de sortie et les exceptions
Convertir les types de données SAP vers Java

Dans Eclipse, créer l'appel au "Remote Function Module" "Z_FM_RFCDEST_TABLE_[PERS]"


Importer les classes du SAP JCo dans la classe "SAPDestination"
Modifier la méthode "displayEmployees" de la classe "SAPDestination"

Code

import com.sap.conn.jco.JCoTable;

Code

Etape 1 Créer la connexion vers le système SAP


Récupérer les métadonnées du "Remote Function Module"
Capturer les erreurs JCo et standard
Etape 2 Assigner les paramètres d'entrée
Etape 3 Exécuter l'appel au "Remote Function Module"
Capturer les exceptions ABAP
Etape 4 Récupérer les paramètres de sortie (attention aux types de données)
Aide : JCoTable … = function.getExportParameterList().getTable("…");
Afficher le résultat
Aide : for(int i= 0; i< ….getNumRows(); i++) {
….setRow(i);
System.out.println( ….getString("<nom colonne>" ou <index>) + …) }
Etape 5 Tester l'application Java via la classe "Launch"

NOTE
Pour plus d'information voir la méthode "step4WorkWithTable" de la classe Java
"StepByStepClient.java" dans le dossier "C:/SAP/JCo/examples"

© SAP ACC Switzerland 29


ABAP

© SAP ACC Switzerland 30


ABAP

Tester l'application Java via la classe "Launch"

NOTE
En cas d'erreur ou de problème, cliquer-droit sur projet et choisir rafraichir
Ouvrir le fichier "dev_jco_rfc.trc" pour visualiser la trace

04 - Conclusion

Félicitations, vous avez créé des petits programmes Java autonomes qui accèdent à distance aux
fonctionnalités d'un système SAP.

© SAP ACC Switzerland 31


ABAP

Code - Solution - SAP JCo

//Remote Function Module Z_FM_RFCDEST_VARIABLE_###


public void divide(int number1, int number2)
{
try
{
JCoDestination destination =
JCoDestinationManager.getDestination(this._destination);
JCoFunction function =
destination.getRepository().getFunction("Z_FM_RFCDEST_VARIABLE_###");
if(function == null)
throw new RuntimeException("Z_FM_RFCDEST_VARIABLE_### not found");

function.getImportParameterList().setValue("IV_NUMBER01", number1);
function.getImportParameterList().setValue("IV_NUMBER02", number2);

function.execute(destination);

int result = function.getExportParameterList().getInt("EV_RESULT");

System.out.println("Z_FM_RFCDEST_VARIABLE_### finished");
System.out.println(result);
}
catch (AbapException e)
{
System.out.println(e.toString());
}
catch (JCoException e)
{
System.out.println(e.toString());
}
catch (Exception e)
{
System.out.println(e.toString());
}
}

© SAP ACC Switzerland 32


ABAP

Code - Solution - SAP JCo

//Remote Function Module Z_FM_RFCDEST_STRUCTURE_###


public void displayEmployee(String carrier, int idemployee)
{
try
{
JCoDestination destination =
JCoDestinationManager.getDestination(this._destination);
JCoFunction function =
destination.getRepository().getFunction("Z_FM_RFCDEST_STRUCTURE_###");
if(function == null)
throw new RuntimeException("Z_FM_RFCDEST_STRUCTURE_### not found");

function.getImportParameterList().setValue("IV_CARRIER", carrier);
function.getImportParameterList().setValue("IV_IDEMPLOYEE", idemployee);

function.execute(destination);

JCoStructure structure =
function.getExportParameterList().getStructure("ES_EMPLOYEE");

System.out.println("Z_FM_RFCDEST_STRUCTURE_### finished");
System.out.println(structure.toString()); // Display all
System.out.println(structure.getString("CARRIER")) ; //Display field
System.out.println(structure.getString(1)) ; //Display field
}
catch (AbapException e)
{
System.out.println(e.toString());
}
catch (JCoException e)
{
System.out.println(e.toString());
}
catch (Exception e)
{
System.out.println(e.toString());
}
}

© SAP ACC Switzerland 33


ABAP

Code - Solution - SAP JCo

//Remote Function Module Z_FM_RFCDEST_TABLE_###


public void displayEmployees(String carrier)
{
try
{
JCoDestination destination =
JCoDestinationManager.getDestination(this._destination);
JCoFunction function =
destination.getRepository().getFunction("Z_FM_RFCDEST_TABLE_###");
if(function == null)
throw new RuntimeException("Z_FM_RFCDEST_TABLE_### not found");

function.getImportParameterList().setValue("IV_CARRIER", carrier);

function.execute(destination);

JCoTable itab =
function.getExportParameterList().getTable("ET_EMPLOYEES");

System.out.println("Z_FM_RFCDEST_TABLE_### finished");
for (int i = 0; i < itab.getNumRows(); i++)
{
itab.setRow(i);
System.out.println( itab.getString("CARRIER")
+ '\t' + itab.getString("ID_EMPLOYEE")
+ '\t' + itab.getString("FIRSTNAME")
+ '\t' + itab.getString("LASTNAME")
+ '\t' + itab.getString(4)
+ '\t' + itab.getString(5));
}
System.out.println();

}
catch (AbapException e)
{
System.out.println(e.toString());
}
catch (JCoException e)
{
System.out.println(e.toString());
}
catch (Exception e)
{
System.out.println(e.toString());
}
}

© SAP ACC Switzerland 34

Vous aimerez peut-être aussi