SAP .NET Connector 2.0 proposait quelques exemples de projets différents qui ont joué un rôle déterminant dans mon processus d’apprentissage. Comme je l’ai mentionné dans mon article détaillant les étapes de création d’un client RFC, SAP ne fournit plus d’exemples de code avec SAP .NET Connector (NCo) 3.0. J’ai donc décidé de mettre à disposition quelques exemples de code.
Ce blog décrit comment créer un serveur RFC simple à l’aide de SAP NCo 3.0. L’exemple de programme implémente RFC STFC_CONNECTION. STFC_CONNECTION est un bon exemple à utiliser car il contient à la fois des paramètres d’importation et d’exportation.
Avec SAP .Net Connector 3.0, nous utilisons Microsoft Visual Studio 2010 et Microsoft .Net Framework 4.0 pour créer notre exemple. Avant de commencer, vous devrez télécharger et installer NCo 3.0 (connexion OSS requise).
Mise en place du projet
À l’aide de Visual Studio 2010, créez un nouveau projet de console. Dans les propriétés du projet, veillez à définir Target Framework sur .Net Framework 4.0.
Ensuite, ajoutez des références à SAP .Net Connector 3.0. Il existe deux DLL, sapnco.dll et sapnco_utils.dll.
Utilisation d’App.Config pour définir les connexions SAP
Il existe plusieurs méthodes que vous pouvez utiliser dans vos solutions pour définir un hôte SAP particulier. Pour cet exemple simple, nous utilisons un fichier app.config pour définir nos informations de connexion hôte SAP.
L’une des plus grandes différences entre NCo 3.0 et NCo 2.0 réside dans la manière dont les métadonnées de fonction sont récupérées et stockées. Avec NCo 2.0, les métadonnées de la fonction ont été téléchargées à partir d’un système SAP au moment de la conception et conservées en tant qu’objets proxy compilés avec le reste de votre solution. NCo 3.0 doit accéder à ces métadonnées au moment de l’exécution . Il existe deux méthodes pour ces métadonnées. Une méthode consiste à créer les métadonnées dans votre code .NET. L’autre méthode consiste à s’appuyer sur les métadonnées stockées dans le système SAP. Pour cet exemple, nous nous appuierons sur le système SAP pour fournir les métadonnées RFC. Ces métadonnées sont récupérées à l’aide de RFC intégrées spéciales. Par conséquent, non seulement notre programme agira comme un serveur RFC, mais il devra également agir comme un client RFC….
For basic RFC server configuration, there are two configuration sections that are used, < ClientSettings > and < ServerSettings >. Ensure that the app.config file has a < sectionGroup > tag for both client and server settings.
Une configuration de serveur RFC est liée à un référentiel RFC à l’aide de l’attribut REPOSITORY_DESTINATION. Pour pouvoir accéder aux métadonnées de la fonction, cet attribut doit correspondre au nom d’une configuration de destination dans la section des paramètres client.
Tous les serveurs SAP NCo 3.0 RFC communiquent avec SAP via un service SAP appelé passerelle. La section de configuration des paramètres du serveur définit la manière dont le programme se connecte à la passerelle SAP. Dans la section serveurs, le champ NOM identifie cette entrée app.config dans notre programme. Le SAP .Net Connector 3.0 utilisera les valeurs des champs GWHOST, GWSERV et PROGRAM_ID pour enregistrer notre programme sur SAP Application Gateway. Le PROGRAM_ID spécifié ici doit correspondre à l’ID de programme du serveur enregistré spécifié dans la destination RFC.
L’interface de fonction SAP RFC
La transaction SAP SE37 peut être utilisée pour déterminer les paramètres de la fonction STFC_CONNECTION. Ceci décrit quels paramètres seront transmis à notre fonction et quels résultats sont attendus.
Dans cet exemple, nous attendons de recevoir le paramètre REQUTEXT, qui sera renvoyé à l’appelant dans ECHOTEXT. Nous renvoyons également une chaîne de texte à l’appelant dans le champ RESPTEXT.
SAP transactoin SM59 est utilisé pour configurer la destination SAP RFC. Dans cet exemple, le nom de la destination RFC (NIMBUS) est le nom de l’ordinateur de développement qui exécute le serveur RFC. L’ID du programme enregistré (NCO3_RFC_SERVER) correspond à notre fichier app.config.
le code
En tant que développeur Nco, l’un de mes changements préférés apportés par Nco 3.0 est la manière dont la fonctionnalité du serveur RFC est implémentée. Au lieu de remplacer la méthode stub générée, nous devons implémenter une ou plusieurs méthodes de classe qui traiteront les appels RFC entrants. Pour cela il existe plusieurs possibilités :
- La première option consiste à créer une méthode statique correspondant à chaque module fonction SAP à implémenter. L’affectation d’un module fonction SAP à une méthode se fait en décorant la méthode avec l’attribut RfcServerFunction.
- La deuxième méthode consiste à créer une méthode statique qui gère tous les modules de fonction SAP. C’est ce qu’on appelle la méthode « par défaut ». Utilisez la même décoration de méthode RfcServerFunction que l’option précédente, mais indiquez que la méthode est le gestionnaire RFC par défaut. L’attribut Name n’est pas pertinent dans ce cas. Ces deux méthodes de gestion des fonctions RFC peuvent être combinées dans le même projet.
Il est également possible d’utiliser l’une ou l’autre des deux options précédentes avec des méthodes d’instance au lieu de méthodes statiques. Pour les besoins de cet exemple, nous utiliserons une méthode statique pour implémenter notre serveur RFC.
Nous allons créer une classe qui expose une méthode pouvant être appelée via SAP RFC. Dans notre exemple, cette classe s’appelle DxsRfcServer et contient une méthode qui fournira la fonctionnalité STFC_CONNECTION. Effectuez maintenant les étapes suivantes pour implémenter la classe.
- Fournissez le code appelable RFC. Cela se fait dans notre classe DxsRfcServer, où nous avons défini une méthode. La RfcServerFunction L’attribut code de la ligne 59 identifie cette fonction auprès du connecteur SAP .Net comme la méthode qui implémente la fonction SAP STFC_CONNECTION. À la ligne 60, nous recevons deux paramètres qui contiennent toutes les informations dont nous avons besoin pour exécuter notre fonction. Le IRfcFunction L’interface donne accès aux valeurs des paramètres. Dans ce cas nous utilisons la méthode .GetString() à la ligne 69 pour extraire la valeur du paramètre REQUTEXT. Nous pouvons également renvoyer des valeurs à l’appelant RFC à l’aide de l’interface IRfcFunction en utilisant la méthode .SetValue() comme indiqué aux lignes 69-70.
- Créez un tableau de types, avec un seul élément faisant référence à notre classe DxsRfcServer.
- Enregistrez le tableau avec un objet RfcServer. Notez qu’à la ligne 22, le premier paramètre de la méthode .GetServer() est le champ NAME de la section serveurs dans app.config.
- Démarrez le serveur RFC.
- À l’heure actuelle, le système SAP a une visibilité sur notre programme exécuté sur la passerelle d’application. (SAP transaction SMGW Goto menu->Logged On Clients)
- Utilisez l’écran de fonction de test dans la transaction SE37 pour tester la nouvelle fonction. Le système cible RFC est défini sur le nom de la destination RFC créée à l’étape précédente (dans ce cas, il s’agit du nom de notre système de développement).
Voici les résultats:
- La console de commande affichera également quelques informations utiles :
Le reste du code est une programmation régulière de la console Windows et est très simple.