Archive

Articles taggués ‘SAP’

Interroger SAP depuis une application .NET

L’intégration d’applications spécifiques avec des ERP fait partie du quotidien d’Objet Direct depuis l’intégration avec Viseo.

Dans son article, Ioan nous avait montré comment récupérer des données stockées dans un ERP Dynamics AX depuis une application .NET avec le Business Connector. A mon tour de présenter l’approche proposée par SAP avec son connecteur 3.0, diffusé en début d’année.

Les fondements du connecteur SAP : Remote Function Call

Que ce soit en version 3.0, diffusée en début d’année, ou en version précédente, le connecteur repose sur une approche RFC, Remote Function Call. Des fonctions métier sont implémentées en ABAP et déployées sur un serveur SAP. Les applications distantes utilisent ces fonctions en leur fournissant des paramètres en entrée et en récupérant des résultats. Les aspects techniques tels que les connexions, la sérialisation sont pris en charge par le connecteur, simplifiant ainsi le code des applications distantes.

Contrairement à la version précédente où l’outil générait à partir des fonctions ABAP des classes C# statiques de type proxy, la version 3.0 adopte un modèle plus dynamique qui permet notamment d’accéder à la description des fonctions. Comme nous allons le voir, ce modèle repose essentiellement sur des magic string (API faiblement couplé, noms de fonctions/paramètres résolus par des chaines de caractères).

Plusieurs patterns de messaging sont supportés par le connecteur. Dans cet article, nous détaillerons le pattern request-reply synchrone : l’application .NET invoque une fonction ABAP et attend le résultat.

Dans notre application, un seul serveur SAP est ciblé. Une destination, une instance de RfcDestination permet d’identifier un serveur SAP.  Cette instance est configurée au démarrage de l’application et elle est fournie à notre code applicatif. Je détaillerai dans un autre article les éléments de configuration.

Passons au code :

Nous souhaitons invoqué une méthode ZZ_ECHO dont la description est la suivante

* »———————————————————————-
* »* »Local Interface:
* »  IMPORTING
* »     VALUE(INPUT) TYPE  CHAR1
* »  EXPORTING
* »     VALUE(OUTPUT) TYPE  CHAR2
* »     VALUE(S_OUTPUT) TYPE  ZZOUTPUT
* »  TABLES
* »      T_OUTPUT STRUCTURE  ZZOUTPUT
* »———————————————————————-

Et voici le code C# correspondant :

// récupération d’une Repository qui contient la définition des fonctions
var rfcRepository = RfcDestination.Repository;

// récupération d’un descripteur de fonction correspondant à la fonction ZZ_ECHO disponible sur le serveur SAP
IRfcFunction echoFunction = rfcRepository.CreateFunction(« ZZ_ECHO »);

// la fonction prend en entrée un paramètre de type chaine de caractères nommé « INPUT »
echoFunction.SetValue(« INPUT », « A »);

// invocation de la fonction distante en mode synchrone en fournissant les coordonnées du serveur via l’objet destination
echoFunction.Invoke(RfcDestination);

// récupération du résultat : cette fonction renvoie un paramètre nommé « S_OUTPUT » qui est une structure
IRfcStructure param = echoFunction.GetStructure(« S_OUTPUT »);

// l’un des champs de cette structure est nommé « OUTPUT », c’est une chaine de caractères
var result = param.GetString(« OUTPUT »);

Quelques remarques complémentaires :

  1. Plusieurs types de données peuvent être utilisés :
    • types primitifs : chaines de caractères, décimaux, ….
    • type structure : types complexes permettant d’agréger des champs, chaque champ ayant un nom et un type
    • type table : structure permettant de stocker une liste d’éléments, tout comme une table d’une base de données
  2. Contrat de fonction documenté : le contrat fourni par les fonctions ABAP doit être clairement détaillé, et notamment le nom et le type des paramètres, les structures et les tables utilisées. En cas de doute, le plus simple est de lancer l’application en mode DEBUG et de positionner un point d’arrêt lorsqu’une instance de IRfcFunction est récupérée. On peut alors visualiser dynamiquement les méta données de la fonction. Mais cela reste moins pratique qu’une description textuelle partagée par toute l’équipe.
  3. La repository joue également un rôle de cache : lorsque l’on demande la définition d’une fonction qui est déjà enregistrée dans la repository, aucun appel n’est réalisé sur le serveur SAP

Conclusion :

Ce cas d’école montre comment invoquer une méthode distante déployée sur un serveur SAP. On constate notamment que le code nécessaire reste relativement simple.

Categories: .NET Tags: ,

SAP Web 2.0

Il y a encore très peu d’information disponible sur ce futur produit de SAP, mais il semblerait que sa sortie soit imminente désormais.

Certains le présentent comme un Google Wave Killer, SAP parle lui plutôt de BI collaborative (Business Intelligence).

Le projet est connu depuis quelques temps sous le nom de Constellation,  et est testable par quelques privilégiés sous le nom de 12sprints.

Quelques liens qui en parlent :

A suivre…

Categories: Cloud, Outillage Tags: , ,