Créer le modèle de connecteur de service web SAP ECC 7.51 pour ECMA2Host
Ce guide vous explique comment créer un modèle pour le connecteur ECMA (Extensibility Connectivity Management Agent) du service web afin de gérer les utilisateurs SAP ECC.
Limitations et hypothèses
Ce modèle montre comment gérer les utilisateurs. Ce guide n’aborde pas les autres types d’objets comme les groupes d’activités locales, les rôles et les profils, car ECMA2Host ne prend pas encore en charge les références à valeurs multiples. Les opérations sur les mots de passe sont également hors du champ d’application de ce guide.
La création du compte de service dans SAP pour appeler les fonctions BAPI exposées n’est pas abordée dans ce guide. Il part du principe qu’un compte de démonstration préexistant Developpeur est utilisé avec le profil RFC_ALL qui accorde les autorisations requises aux BAPI listées ci-dessous.
L’outil de configuration du service web ne prend pas en charge certaines fonctionnalités par défaut de SAP, telles que les politiques WSP et les liaisons multiples par point de terminaison. Il requiert un WSDL compatible uniquement avec SOAP 1.1, utilisant une liaison tout-en-un en style document, sans stratégies.
Fonctions BAPI SAP ECC utilisées dans ce modèle :
- BAPI_USER_GETLIST : obtenez la liste de tous les utilisateurs connectés à ce système.
- BAPI_USER_GETDETAIL : obtenez des détails sur un utilisateur spécifique.
- BAPI_USER_CREATE1 : créez un utilisateur.
- BAPI_USER_DELETE : supprimez un utilisateur.
- BAPI_USER_CHANGE : mettez à jour un utilisateur.
Toutes les propriétés utilisateur SAP de ce guide sont traitées comme des propriétés à valeur unique.
Le langage de programmation est Visual Basic.
Définir un point de terminaison de service web et créer un schéma
Pour concevoir des workflows d’importation et d’exportation, vous devez d’abord créer un modèle et définir un point de terminaison intégrant les fonctions SAP BAPI exposées par une interface SOAP. Après cela, élaborez un schéma des objets ECMA2 et de leurs propriétés, qui sera accessible dans ce modèle.
- Dans le dossier « C:\NProgram Files\NMicrosoft ECMA2Host\NWeb Service Configuration Tool », lancez l’outil de configuration du service web wsconfigTool.exe.
- Dans le menu Nouveau fichier, choisissez Créer un nouveau projet SOAP.
- Cliquez sur Projet SOAP et choisissez Ajouter un nouveau service web.
- Nommez votre service web SAPECC, fournissez une URL pour télécharger le WSDL publié, entrez SAPECC comme espace de noms. Le nom du service web vous aide à identifier ce service web dans votre modèle par rapport à d’autres utilisateurs. Espace de noms définit le nom de l’espace de noms Microsoft .NET utilisé pour générer les classes. Choisissez le mode d’authentification de base, sauf indication contraire de l’administrateur SAP. Sélectionnez Suivant.
- Fournissez des informations d’identification pour vous connecter au point de terminaison SAP ECC. Sélectionnez Suivant.
- Sur la page des points de terminaison et des opérations, assurez-vous que les BAPI sont affichées et cliquez sur Terminer.
Remarque
Si vous voyez plus d’un point de terminaison, c’est que les liaisons SOAP 1.2 et SOAP 1.1 sont activées. Cela provoque l’échec du connecteur. Modifiez votre définition de liaison dans SOAMANAGER et conservez-en une seule. Ensuite, rajoutez un service web.
- Enregistrez le projet dans le dossier C:\Program Files\Microsoft ECMA2Host\Service\ECMA.
- Cliquez sur l’onglet Types d’objets et choisissez d’ajouter un type d’objet utilisateur. Cliquez sur OK.
- Développez l’onglet Types d’objets, puis cliquez sur définition de type Utilisateur.
- Ajoutez les attributs suivants dans le schéma et choisissez userName comme ancre.
- Enregistrez votre projet.
Nom | Type | Ancre |
---|---|---|
city | chaîne | |
company | string | |
department | string | |
chaîne | ||
expirationTime | string | |
firstName | chaîne | |
lastName | chaîne | |
middleName | string | |
telephoneNumber | string | |
jobTitle | string | |
userName | string | checked |
Créer un workflow pour une importation complète
Bien que facultatif dans ECMA2Host, le workflow d’importation vous permet d’importer des utilisateurs SAP existants dans le cache en mémoire d’ECMA2Host, évitant ainsi la création de doublons lors du provisionnement.
En l’absence de workflow d’importation, votre connecteur opérera en mode Exporter uniquement, ce qui entraînera l’émission par l’ECMA2Host d’opérations Créer un utilisateur pour tous les utilisateurs, y compris ceux déjà existants. Cela peut provoquer des échecs ou des doublons lors de l’utilisation des BAPI SAP standard, sauf si ces doublons sont gérés par le workflow d’exportation.
Comme SAP ECC ne propose pas de mécanisme intégré pour lire les modifications depuis la dernière lecture,
nous mettons en œuvre uniquement le workflow d’importation complète. Si vous devez mettre en œuvre des importations Delta pour des raisons de performance, consultez votre administrateur SAP pour obtenir une liste des BAPI et les publier en tant que service web SOAP. Procédez ensuite à la mise en œuvre du workflow d’importation Delta en suivant l’approche décrite ci-dessous et en utilisant une propriété customData qui enregistre le timestamp de la dernière exécution réussie.
SAP ECC offre plusieurs fonctions BAPI pour obtenir la liste des utilisateurs avec leurs propriétés :
- BAPI_USER_GETLIST : obtenez la liste de tous les utilisateurs connectés à ce système.
- BAPI_USER_GETDETAIL : obtenez des détails sur un utilisateur spécifique.
Seules ces deux BAPI sont utilisées pour récupérer les utilisateurs existants de SAP ECC dans ce modèle.
- Accédez au workflow Types d’objets - Utilisateur > - Importer > - Importer complètement > et, dans la boîte à outils située à droite, faites glisser et déposez l’activité de séquence dans le volet du concepteur de workflow.
- En bas à gauche, recherchez le bouton Variables et cliquez dessus pour développer une liste de variables définies dans cette séquence.
- Ajoutez les variables suivantes. Pour choisir un type de variable généré à partir du WSDL SAP, cliquez sur Parcourir les types, puis développez généré et ensuite l’espace de noms SAPECC.
Nom | Type de variable | Étendue | Par défaut |
---|---|---|---|
selRangeTable | SAPECC.TABLE_OF_BAPIUSSRGE | Séquence | nouvelle TABLE_OF_BAPIUSSRGE avec {.item = nouvelle BAPIUSSRGE(){nouvelle BAPIUSSRGE}} |
getListRetTable | SAPECC.TABLE_OF_BAPIRET2 | Séquence | nouvelle TABLE_OF_BAPIRET2 |
pageSize | Int32 | Séquence | 200 |
returnedSize | Int32 | Séquence | |
usersTable | SAPECC.TABLE_OF_BAPIUSNAME | Séquence | nouvelle TABLE_OF_BAPIUSNAME() |
- À partir de la boîte à outils, faites glisser et déposez quatre activités Affecter à l’intérieur de votre activité de séquence et définissez ces valeurs :
selRangeTable.item(0).PARAMETER = "USERNAME"
selRangeTable.item(0).SIGN = "I" selRangeTable.item(0).OPTION = "GT" selRangeTable.item(0).LOW = ""
Ces paramètres permettent d’appeler la fonction BAPI_USER_GETLIST et d’implémenter la pagination.
- Pour implémenter la pagination, faites glisser et déposez l’activité DoWhile depuis la boîte à outils dans votre activité de séquence, après la dernière opération Affecter.
- Dans le volet droit, accédez à l’onglet Propriétés et saisissez cette condition pour
- le cycle DoWhile :
returnedSize = pageSize
- Cliquez sur Variables et ajoutez la propriété currentPageNumber de type int32 dans le cycle DoWhile avec la valeur par défaut 0.
- Étape facultative : si vous prévoyez d’implémenter le workflow d’importation Delta, faites glisser l’activité Affecter depuis la boîte à outils et déposez-la dans votre activité de séquence, après le cycle DoWhile. Définissez cette valeur :
customData(schemaType.Name + "_lastImportTime") = DateTimeOffset.UtcNow.Ticks.ToString()
Cette action enregistre le timestamp de la dernière exécution complète de l’importation, qui pourra être utilisé plus tard dans le workflow d’importation Delta.
- Dans la boîte à outils, sélectionnez l’activité de séquence, puis faites-la glisser à l’intérieur de votre activité DoWhile. Dans cette activité de séquence, faites glisser et déposer l’activité WebServiceCall puis sélectionnez le nom du service SAPECC, le point de terminaison ZSAPCONNECTORWS, et l’opération BAPI_USER_GETLIST.
- Cliquez sur le bouton ... Arguments afin de définir les paramètres pour l’appel du service web selon les indications suivantes :
Nom | Sens | Type | Value |
---|---|---|---|
MAX_ROWS | Dans | Int32 | pageSize |
MAX_ROWSSpecified | Dans | Boolean | True |
RETURN | Entrée/Sortie | TABLE_OF_BAPIRET2 | getListRetTable |
SELECTION_EXP | Entrée/Sortie | TABLE_OF_BAPIUSSEXP | |
SELECTION_RANGE | Entrée/Sortie | TABLE_OF_BAPIUSSRGE | selRangeTable |
USERLIST | Entrée/Sortie | TABLE_OF_BAPIUSNAME | usersTable |
WITH_USERNAME | Dans | Chaîne | |
ROWS | Out | Int32 | returnedSize |
- Cliquez sur OK. Le signe d’avertissement disparaît. Liste des utilisateurs stockés dans la variable usersTable. Puisque SAP ne renvoie pas une liste complète d’utilisateurs en une seule réponse, la pagination doit être implémentée et la fonction doit être appelée plusieurs fois à chaque changement de page. Ensuite, pour chaque utilisateur importé, il faut obtenir les détails de cet utilisateur en effectuant un appel distinct. Pour un environnement avec 1 000 utilisateurs et un format de page de 200, cela signifie que le connecteur de service web effectuera 5 appels pour obtenir la liste des utilisateurs et 1 000 appels individuels pour récupérer les détails des utilisateurs. Pour améliorer les performances, demandez à votre équipe SAP de développer un programme BAPI personnalisé qui répertorie tous les utilisateurs avec leurs propriétés, évitant ainsi de devoir effectuer 1 000 appels individuels, et d’exposer cette fonction BAPI sur le point de terminaison SOAP WS.
- Dans la boîte à outils, sélectionnez l’activité IF, puis glissez-la à l’intérieur de votre activité DoWhile après l’activité WebServiceCall. Définissez cette condition pour vérifier que la réponse n’est pas vide et qu’aucune erreur n’est présente :
IsNothing(getListRetTable.item) OrElse getListRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
- Dans la boîte à outils, sélectionnez l’activité Throw et glissez-la dans la branche Else de votre activité IF pour lancer une erreur en cas d’échec de l’importation. Passez à l’onglet Propriétés et saisissez cette expression pour la propriété Exception de l’activité Throw :
New Exception(getListRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE)
- Pour traiter une liste d’utilisateurs importés, glissez l’activité ForEachWithBodyFactory de la boîte à outils vers la branche Then de votre activité IF. Allez dans l’onglet Propriétés et sélectionnez SAPECC.BAPIUSNAME comme TypeArgument. Cliquez sur le bouton ... et saisissez cette expression pour la propriété valeurs :
if(usersTable.item,Enumerable.Empty(of BAPIUSNAME)())
- Dans la boîte à outils, sélectionnez l’activité de séquence, puis faites-la glisser à l’intérieur de votre activité ForEach. En gardant la fenêtre de l’activité de séquence active, cliquez sur le bouton Variables et définissez les variables suivantes :
Nom | Type de variable | Étendue | Par défaut |
---|---|---|---|
company | SAPECC.BAPIUSCOMP | Séquence | nouvelle BAPIUSCOMP() |
address | SAPECC.BAPIADDR3 | Séquence | nouvelle BAPIADDR3() |
defaults | SAPECC.BAPIDEFAUL | Séquence | nouvelle BAPIDEFAUL() |
logondata | SAPECC.BAPILOGOND | Séquence | nouvelle BAPILOGOND() |
getDetailRetTable | SAPECC.TABLE_OF_BAPIRET2 | Séquence | nouvelle TABLE_OF_BAPIRET2() |
Votre activité IF ressemble à ceci :
- Faites glisser et déposez l’activité CreateCSEntryChangeScope à l’intérieur de votre activité de séquence. Dans la propriété DN, entrez schemaType.Name & item.USERNAME. Dans le champ CreateAnchorAttribute AnchorValue, entrez item.username.
- Pour obtenir les détails de chaque utilisateur, faites glisser et déposer l’activité WebServiceCall depuis la boîte à outils dans l’activité de séquence, juste avant l’activité CreateAnchorAttribute. Choisissez le nom du service SAPECC, le point de terminaison ZSAPCONNECTORWS, et l’opération BAPI_USER_GET_DETAIL. Cliquez sur le bouton ... Arguments afin de définir les paramètres pour l’appel du service web selon les indications suivantes :
Nom | Sens | Type | Valeur |
---|---|---|---|
RETURN | Entrée/Sortie | TABLE_OF_BAPIRET2 | getDetailRetTable |
USERNAME | Dans | Chaîne | item.username |
ADDRESS | Out | BAPIADDR3 | address |
COMPANY | Out | BAPIUSCOMP | company |
DEFAULTS | Out | BAPIUSDEFAUL | defaults |
LOGONDATA | Out | BAPILOGOND | logonData |
WITH_USERNAME | Dans | Chaîne | |
ROWS | Out | Int32 | returnedSize |
- Cliquez sur OK. Le signe d’avertissement disparaît. Les détails d’un utilisateur sont stockés dans les variables répertoriées ci-dessus. Votre activité IF ressemble à ceci :
- Pour vérifier les résultats de l’opération BAPI_USER_GET_DETAIL, à partir de la boîte à outils, faites glisser l’activité IF dans l’activité Sequence entre les activités WebServiceCall et CreateAnchorAttribute. Entrez cette condition :
IsNothing(getDetailRetTable.item) OrElse getDetailRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
Étant donné que des détails d’utilisateur manquants ne doivent pas être traités comme un événement catastrophique, nous voulons indiquer cette erreur et continuer à traiter les autres utilisateurs. Faites glisser l’activité Séquence dans la branche Else de votre activité IF. Ajoutez l’activité Log dans cette nouvelle activité Sequence. Basculez vers l’onglet Properties et modifiez la propriété Level en High, Tag to Trace. Entrez les éléments suivants dans la propriété LogText : string.Join("\n", getDetailRetTable.item.Select (Function(item) item.MESSAGE ))
- Faire glisser l’activité Sequence dans la branche Then de l’activité IF. Faites glisser l’activité CreateAnchorAttribute existante sur l’activité Sequence située dans la branche Then de l’activité IF. Votre activité ForEach ressemble maintenant à ceci :
- Pour chaque propriété d’un utilisateur comme city, company, department, email : ajoutez une activité IF après l’activité CreateAnchorAttribute et vérifiez la présence de valeurs non vides en entrant des conditions telles que
Not string.IsNullOrEmpty(address.city)
et en ajoutant des activités CreateAttributeChange dans la branche Then cette activité IF.
Par exemple, ajoutez des activités CreateAttributeChange pour toutes les propriétés utilisateur à l’aide de cette table de mappage :
Propriété d’utilisateur ECMA | Propriété SAP |
---|---|
city | address.city |
department | address.department |
company | company.company |
address.e_mail | |
firstName | address.firstName |
lastName | address.lastName |
middleName | address.middleName |
Fonction | address.function |
expirationTime | logonData.GLTGB |
telephoneNumber | address.TEL1_NUMBR |
- Enfin, ajoutez l’activité SetImportStatusCode après la dernière activité CreateAttributeChange. Définissez ErrorCode sur Success dans la branche Then. Ajoutez une activité de code SetImportStatus supplémentaire à la branche Else et définissez ErrorCode sur ImportErrorCustomContinueRun.
- Réduisez l’activité Sequence à l’intérieur de l’activité ForEach afin que votre cycle DoWhile ressemble à ceci :
- Pour récupérer la page suivante des utilisateurs, mettez à jour la propriété
selRangeTable.item(0).LOW
. Faites glisser et déposez l’activité IF dans l’activité Sequence dans DoWhile, placez-la après l’activité IF existante. Entrez returnedSize>0 en tant que condition. Ajoutez l’activité Assign à la branche Then de l’activité IF et définissezselRangeTable.item(0).LOW
surusersTable.item(returnedSize-1).username
.
Vous avez terminé la définition du workflow Full Import.
Créer un workflow Export Add
Pour créer un utilisateur dans SAP ECC, il suffit d’exécuter le programme BAPI_USER_CREATE1 et de fournir tous les paramètres requis, y compris le nom de compte et le mot de passe initial. Si vous souhaitez qu’un nom de compte soit généré par SAP, contactez votre administrateur SAP et utilisez une fonction BAPI personnalisée qui renvoie le userName d’un compte utilisateur fraîchement créé.
Ce guide ne présente pas l’attribution de licences, de groupes d’activités locaux ou globaux, de systèmes ou de profils. Contactez votre administrateur SAP et modifiez ce workflow en conséquence.
Il n’est pas nécessaire de prévoir une pagination dans les workflows d’exportation. Un seul objet objectToExport est disponible dans le contexte du workflow.
- Accédez au workflow Types d’objets - Utilisateur > - Exporter > - Ajouter un workflow > et, dans la boîte à outils située à droite, faites glisser et déposez l’activité Sequence dans le volet du concepteur de workflow.
- En bas à gauche, recherchez le bouton Variables et cliquez dessus pour développer une liste de variables définies dans cette séquence.
- Ajoutez les variables suivantes. Pour choisir un type de variable généré à partir du WSDL SAP, cliquez sur Parcourir les types, puis développez généré et ensuite l’espace de noms SAPECC. Cette opération initialise les structures de données utilisées par le programme BAPI_USER_CREATE1.
Nom | Type de variable | Étendue | Par défaut |
---|---|---|---|
address | SAPECC.BAPIADDR3 | Séquence | nouvelle BAPIADDR3() |
userName | Chaîne | Séquence | |
mot de passe | SAPECC.BAPIPWD | Séquence | nouvelle BAPIPWD() |
company | SAPECC.BAPIUSCOMP | Séquence | nouvelle BAPIUSCOMP() |
defaults | SAPECC.BAPIDEFAUL | Séquence | nouvelle BAPIDEFAUL() |
logOnData | SAPECC.BAPILOGOND | Séquence | nouvelle BAPILOGOND() |
bapiret2Table | SAPECC.TABLE_OF_BAPIRET2 | Séquence | nouvelle TABLE_OF_BAPIRET2() |
- Comme nous avons défini userName comme une propriété immuable et une ancre, il sera nécessaire d’extraire la valeur userName d’une collection d’ancres de notre objet d’exportation. Faites glisser l’activité ForEachWithBodyFactory depuis la boîte à outils et déposez-la dans votre activité Sequence. Remplacez le nom de la variable élément par ancre, passez aux propriétés et choisissez TypeArgument de
Microsoft.MetadirectoryServices.AnchorAttribute
. Dans le champ Valeur, entrezobjectToExport.AnchorAttributes
.
- Pour extraire une valeur de chaîne d’une ancre userName, faites glisser et déposez l’activité Switch à l’intérieur de l’activité ForEach. Dans la fenêtre contextuelle, sélectionnez le type de commutateur
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
. Entrez la valeur d’expression de : nouvelle AnchorAttributeNameWrapper(anchor.Name). - Cliquez sur Ajouter une nouvelle zone de cas dans l’activité Switch. Saisissez userName comme valeur de cas. Faites glisser et déposez l’activité Assign dans le corps du cas userName, puis affectez anchor.Value.ToString() à la variable userName.
- Maintenant que la valeur userName a été extraite de la propriété d’ancrage de l’objet exporté, il est temps de remplir d’autres structures, telles que l’entreprise, les valeurs par défaut, l’adresse, et les données de connexion qui contiennent d’autres détails sur l’utilisateur SAP. Pour ce faire, nous parcourons la collection de modifications d’attributs.
- Réduisez votre activité ForEach, puis faites glisser et déposez une autre activité ForEachWithBodyFactory dans votre activité Sequence, après l’activité ForEach existante. Remplacez le nom de la variable d’élément par attributeChange, puis passez aux propriétés et sélectionnez TypeArgument de
Microsoft.MetadirectoryServices.AttributeChange
. Dans le champ Valeur, entrezobjectToExport.AttributeChanges
.
- Faites glisser et déposez une activité Switch dans le corps de l’activité ForEach.
- Dans le menu contextuel, sélectionnez
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper
et cliquez sur Ok. - Entrez l’expression suivante : nouveau AttributeNameWrapper(attributeChange.Name). Une icône d’avertissement s’affiche dans le coin supérieur droit de votre activité Switch pour signaler les attributs non gérés définis dans le schéma et non affectés à une propriété.
- Cliquez sur Ajouter une nouvelle zone de cas d’activité Switch et saisissez une valeur de cas de city.
- Faites glisser et déposez une activité Assign dans le corps de ce cas. Affectez
attributeChange.ValueChanges(0).Value.ToString()
à address.city.
- Ajoutez d’autres cas et affectations manquants. Utilisez ce tableau de mappage pour vous guider :
Case | Affectation |
---|---|
city | address.city = attributeChange.ValueChanges(0)Value.ToString() |
company | company.company = attributeChange.ValueChanges(0)Value.ToString() |
department | address.department = attributeChange.ValueChanges(0)Value.ToString() |
address.e_mail = attributeChange.ValueChanges(0)Value.ToString() | |
expirationTime | logOnData.GLTGB = attributeChange.ValueChanges(0)Value.ToString() |
prénom | address.firstname = attributeChange.ValueChanges(0)Value.ToString() |
lastName | address.lastname = attributeChange.ValueChanges(0)Value.ToString() |
middleName | address.middlename = attributeChange.ValueChanges(0)Value.ToString() |
telephoneNumber | address.TEL1_Numbr = attributeChange.ValueChanges(0)Value.ToString() |
Fonction | address.function = attributeChange.ValueChanges(0)Value.ToString() |
export_password | password.BAPIPWD1 = attributeChange.ValueChanges(0)Value.ToString() |
Dans ce contexte, export_password est un attribut virtuel spécial, toujours présent dans le schéma, utilisé pour transmettre un mot de passe initial à l’utilisateur en cours de création.
- Réduisez votre activité ForEach, puis faites glisser et déposez l’activité IF dans l’activité Sequence, après la deuxième activité ForEach, pour valider les propriétés de l’utilisateur avant de soumettre la demande de création. Nous avons besoin d’au moins 3 valeurs non vides : nom d’utilisateur, nom de famille, et mot de passe initial. Entrez cette condition :
(String.IsNullOrEmpty(address.lastname) = False ) AND (String.IsNullOrEmpty(userName) = False) AND (String.IsNullOrEmpty(password.BAPIPWD1) = False)
- Dans la branche Else de l’activité IF, insérez une autre activité IF afin d’envoyer des messages d’erreur distincts en fonction des données manquantes. Entrez la valeur de condition : String.IsNullOrEmpty(userName). Faites glisser et déposez les activités
CreateCSEntryChangeResult
dans les deux branches de la deuxième activité IF et définissez des ErrorCode deExportErrorMissingAnchorComponent
etExportErrorMissingProvisioningAttribute
.
- Faites glisser et déposez l’activité Sequence dans la branche vide Then de la première activité IF. Faites glisser et déposez l’activité WebSeviceCall à l’intérieur de l’activité Sequence. Sélectionnez le nom du service SAPECC, le point de terminaison ZSAPCONNECTORWS et l’opération BAPI_USER_CREATE1. Cliquez sur le bouton ... Arguments afin de définir les paramètres pour l’appel du service web selon les indications suivantes :
Nom | Sens | Type | Value |
---|---|---|---|
ADDRESS | Dans | BAPIADDR3 | address |
COMPANY | Dans | BAPIUSCOMP | company |
DEFAULTS | Dans | BAPIDEFAUL | defaults |
LOGONDATA | Dans | BAPILOGOND | logOnData |
PASSWORD | Dans | BAPIPWD | mot de passe |
RETURN | Entrée-Sortie | TABLE_OF_BAPIRET2 | bapiret2Table |
SELF_REGISTER | Dans | Chaîne | « X » |
USERNAME | Dans | Chaîne | userName |
- Cliquez sur OK. Le signe d’avertissement disparaît.
- Pour traiter les résultats des demandes utilisateur créées, faites glisser et déposez l’activité IF dans l’activité Sequence après l’activité WebServiceCall. Saisissez la condition suivante :
IsNothing (bapiret2Table.item) OrElse bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- En l’absence d’erreurs, nous partons du principe que l’opération d’exportation a réussi, et nous voulons marquer cet objet comme exporté avec succès en créant un CSEntryChangeResult avec l’état Réussite. Faites glisser et déposez l’activité CreateCSEntryChangeResult dans la branche Else de votre activité IF et sélectionnez le code d’erreur Réussite.
- Facultatif : si le service web retourne un nom de compte généré pour l’utilisateur, nous devons actualiser la valeur d’ancrage de l’objet exporté. Pour ce faire, faites glisser et déposez l’activité
CreateAttrubuteChange
à l’intérieur de l’activitéCreateCSEntryChangeResult
et sélectionnez l’option Ajouter un nom d’utilisateur. Faites ensuite glisser et déposez l’activitéCreateValueChange
à l’intérieur de l’activitéCreateAttributeChange
et saisissez le nom de la variable renseignée par une activité d’appel de service web. Dans ce guide, vous utilisez la variable userName qui n’est pas mise à jour lors de l’exportation.
- La dernière étape du workflow Export Add consiste à gérer et à enregistrer les erreurs d’exportation. Faites glisser et déposez l’activité Sequence dans la branche vide Then de votre activité IF.
- Faites glisser et déposez l’activité Log à l’intérieur de l’activité Sequence. Allez dans l’onglet Propriétés et entrez la valeur LogText de :
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E"))
.MESSAGE. Conservez un haut niveau de journalisation et activez les balises de suivi. Cela permet d’enregistrer un message d’erreur dans ConnectorsLog ou dans le journal des événements de l’ECMA2Host lorsque le traçage détaillé est activé. - Faites glisser et déposez l’activité Switch à l’intérieur de l’activité Sequence après l’activité Log. Dans la fenêtre contextuelle, sélectionnez le type de chaîne de la valeur de switch. Entrez l’expression suivante :
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
- Cliquez sur le cas par défaut et faites glisser et déplacez l’activité CreateCSEntryChangeResult dans le corps de ce cas. Sélectionnez le code d’erreur ExportErrorInvalidProvisioningAttributeValue.
- Cliquez sur la zone Ajouter un nouveau cas et saisissez une valeur de cas de 224. Faites glisser et déposez l’activité
CreateCSEntryChangeResult
dans le corps de ce cas. Sélectionnez le code d’erreurExportErrorCustomContinueRun
.
Vous avez terminé la définition du workflow Export Add.
Créer un workflow Export Delete
Pour supprimer un utilisateur dans SAP ECC, il suffit d’exécuter le programme BAPI_USER_DELETE et de fournir un nom de compte à supprimer dans le système connecté. Demandez à votre administrateur SAP si ce scénario est indispensable, car il est courant de ne pas supprimer mais de laisser expirer les comptes SAP ECC pour préserver leur historique.
Ce guide n’aborde pas les scénarios relatifs à l’administration des utilisateurs SAP, à la désactivation des utilisateurs dans les systèmes connectés, ou à la révocation des licences, entre autres.
Il n’est pas nécessaire de prévoir une pagination dans les workflows d’exportation. Un seul objet objectToExport est disponible dans le contexte du workflow.
- Accédez au workflow Types d’objets - Utilisateur > - Exporter > - Supprimer un workflow > et, dans la boîte à outils située à droite, faites glisser et déposez l’activité Sequence dans le volet du concepteur de workflow.
- En bas à gauche, recherchez le bouton Variables et cliquez dessus pour développer une liste de variables définies dans cette séquence.
- Ajoutez les variables suivantes. Pour choisir un type de variable généré à partir du WSDL SAP, cliquez sur Parcourir les types, puis développez généré et ensuite l’espace de noms SAPECC. Cette opération initialise les structures de données utilisées par le programme BAPI_USER_DELETE.
Nom | Type de variable | Étendue | Par défaut |
---|---|---|---|
userName | Chaîne | Séquence | |
bapiret2Table | SAPECC.TABLE_OF_BAPIRET2 | Séquence | nouvelle TABLE_OF_BAPIRET2() |
- Comme nous avons défini userName comme une propriété immuable et une ancre, il sera nécessaire d’extraire la valeur userName d’une collection d’ancres de notre objet d’exportation. Faites glisser l’activité ForEachWithBodyFactory depuis la boîte à outils et déposez-la dans votre activité Sequence. Remplacez le nom de la variable élément par ancre, passez aux propriétés et choisissez TypeArgument de
Microsoft.MetadirectoryServices.AnchorAttribute
. Dans le champ Valeur, entrezobjectToExport.AnchorAttributes
.
- Pour extraire une valeur de chaîne d’une ancre userName, faites glisser et déposez l’activité Switch à l’intérieur de l’activité ForEach. Dans la fenêtre contextuelle, sélectionnez le type de commutateur
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
. Saisir la valeur d’expression de : nouveauAnchorAttributeNameWrapper(anchor.Name)
. Cliquez sur Ajouter une nouvelle zone de cas dans l’activité Switch. Saisissez userName comme valeur de cas. Faites glisser et déposez l’activité Assign dans le corps du cas userName, puis affectezanchor.Value.ToString()
à la variable userName. - Faites glisser et déposez l’activité WebSeviceCall à l’intérieur de l’activité Sequence après l’activité ForEach. Sélectionnez le nom du service SAPECC, le point de terminaison ZSAPCONNECTORWS et l’opération BAPI_USER_DELETE. Cliquez sur le bouton ... Arguments afin de définir les paramètres pour l’appel du service web selon les indications suivantes :
Nom | Sens | Type | Valeur |
---|---|---|---|
RETURN | Entrée/Sortie | TABLE_OF_BAPIRET2 | bapiret2Table |
USERNAME | Dans | Chaîne | userName |
- Cliquez sur OK. Le signe d’avertissement disparaît.
- Pour traiter les résultats des demandes utilisateur supprimées, faites glisser et déposez l’activité IF à l’intérieur de l’activité Sequence après l’activité WebServiceCall. Saisissez la condition suivante :
If(bapiRet2Table.item, Enumerable.Empty(Of BAPIRET2)()).Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- En l’absence d’erreurs, nous partons du principe que l’opération de suppression a réussi, et nous voulons marquer cet objet comme exporté avec succès en créant un
CSEntryChangeResult
t avec l’état Réussite. Faites glisser et déposez l’activitéCreateCSEntryChangeResult
dans la branche Else de votre activité IF et sélectionnez le code d’erreur Réussite.
- La dernière étape du workflow Export Delete consiste à gérer et à enregistrer les erreurs d’exportation. Faites glisser et déposez l’activité Sequence dans la branche vide Then de votre activité IF.
- Faites glisser et déposez l’activité Log à l’intérieur de l’activité Sequence. Allez dans l’onglet Propriétés et entrez la valeur LogText de :
bapiRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")= True).MESSAGE
. Conservez un haut niveau de journalisation et activez les balises de suivi. Cela permet d’enregistrer un message d’erreur dans le ConnectorsLog ou dans le journal des événements de l’ECMA2Host lorsque le traçage détaillé est activé. - Faites glisser et déposez l’activité Switch à l’intérieur de l’activité Sequence après l’activité Log. Dans la fenêtre contextuelle, sélectionnez le type de chaîne de la valeur de switch. Entrez l’expression suivante :
bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
- Cliquez sur le cas par défaut et faites glisser et déplacez l’activité CreateCSEntryChangeResult dans le corps de ce cas. Sélectionnez le code d’erreur ExportErrorSyntaxViolation.
- Cliquez sur la zone Ajouter un nouveau cas et saisissez une valeur de cas de 124. Faites glisser et déposez l’activité
CreateCSEntryChangeResult
dans le corps de ce cas. Sélectionnez le code d’erreurExportErrorCustomContinueRun
.
Vous avez terminé la définition du workflow Export Delete.
Créer un workflow Export Replace
Pour mettre à jour un utilisateur dans SAP ECC, il suffit d’exécuter le programme BAPI_USER_CHANGE et de fournir tous les paramètres requis, y compris le nom de compte et tous les détails de l’utilisateur, notamment ceux qui ne changent pas. Le mode d’exportation ECMA2 lorsque toutes les propriétés utilisateur doivent être fournies est appelé Replace. En comparaison, le mode d’exportation AttributeUpdate ne fournit que les attributs modifiés, ce qui peut entraîner le remplacement de certaines propriétés utilisateur par des valeurs vides. Par conséquent, le connecteur de service web utilise toujours le mode d’exportation Object Replace et s’attend à ce que le connecteur soit configuré sur Export Type: Replace.
Le workflow Export Replace est presque identique au workflow Export Add. La seule différence réside dans le fait que vous devez spécifier des paramètres supplémentaires, comme addressX ou companyX, pour le programme BAPI_USER_CHANGE. Le suffixe X dans addressX signifie que la structure de l’adresse a subi une modification.
- Accédez au workflow Types d’objets - Utilisateur > - Exporter > - Remplacer un workflow > et, dans la boîte à outils située à droite, faites glisser et déposez l’activité Sequence dans le volet du concepteur de workflow.
- En bas à gauche, recherchez le bouton Variables et cliquez dessus pour développer une liste de variables définies dans cette séquence.
- Ajoutez les variables suivantes. Pour choisir un type de variable généré à partir du WSDL SAP, cliquez sur Parcourir les types, puis développez généré et ensuite l’espace de noms SAPECC. Cette opération initialise les structures de données utilisées par le programme BAPI_USER_CHANGE.
Nom | Type de variable | Étendue | Par défaut |
---|---|---|---|
userName | Chaîne | Séquence | |
bapiret2Table | SAPECC.TABLE_OF_BAPIRET2 | Séquence | nouvelle TABLE_OF_BAPIRET2() |
addressX | SAPECC.BAPIADDR3X | Séquence | nouvelle BAPIADDR3X() |
address | SAPECC.BAPIADDR3 | Séquence | nouvelle BAPIADDR3() |
companyX | SAPECC. BAPIUSCOMX | Séquence | nouvelle BAPIUSCOMX() |
company | SAPECC.BAPIUSCOMP | Séquence | nouvelle BAPIUSCOMP() |
defaultsX | SAPECC.BAPIDEFAX | Séquence | nouvelle BAPIDEFAX() |
defaults | SAPECC.BAPIDEFAUL | Séquence | nouvelle BAPIDEFAUL() |
logOnDataX | SAPECC.BAPILOGONX | Séquence | nouvelle BAPILOGONX() |
logOnData | SAPECC.BAPILOGOND | Séquence | nouvelle BAPILOGOND() |
Votre workflow Export Replace ressemble à ceci :
- Comme nous avons défini userName comme une propriété immuable et une ancre, il sera nécessaire d’extraire la valeur userName d’une collection d’ancres de notre objet d’exportation. Faites glisser l’activité ForEachWithBodyFactory depuis la boîte à outils et déposez-la dans votre activité Sequence. Remplacez le nom de la variable élément par ancre, passez aux propriétés et choisissez TypeArgument de
Microsoft.MetadirectoryServices.AnchorAttribute
. Dans le champ Valeur, entrezobjectToExport.AnchorAttributes
.
- Pour extraire une valeur de chaîne d’une ancre userName, faites glisser et déposez l’activité Switch à l’intérieur de l’activité ForEach. Dans la fenêtre contextuelle, sélectionnez le type de commutateur
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper
. Saisir la valeur d’expression de : nouveauAnchorAttributeNameWrapper(anchor.Name)
. Cliquez sur Ajouter une nouvelle zone de cas dans l’activité Switch. Saisissez userName comme valeur de cas. Faites glisser et déposez l’activité Assign dans le corps du cas userName, puis affectezanchor.Value.ToString()
à la variable userName. Votre workflow Export Replace ressemble à ceci :
- Maintenant que la valeur userName a été extraite de la propriété d’ancrage de l’objet exporté, il est temps de remplir d’autres structures, telles que l’entreprise, les valeurs par défaut, l’adresse, et les données de connexion qui contiennent d’autres détails sur l’utilisateur SAP. Pour ce faire, nous parcourons la collection de tous les attributs définis dans le schéma.
- Réduisez votre activité ForEach, puis faites glisser et déposez une autre activité ForEachWithBodyFactory dans votre activité Sequence, après l’activité ForEach existante. Remplacez le nom de la variable d’élément par schemaAttr, puis passez aux propriétés et sélectionnez TypeArgument de
Microsoft.MetadirectoryServices.SchemaAttribute
. Dans le champ Valeur, entrezschemaType.Attributes
.
- Faites glisser et déposez une activité Sequence dans le corps de l’activité ForEach. En bas à gauche, recherchez le bouton Variables et cliquez dessus pour développer une liste de variables définies dans cette séquence. Ajoutez la variable suivante : xValue de type String. Faites glisser et déposez l’activité Assign à l’intérieur de l’activité Sequence. Affectez à xValue l’expression suivante :
If(objectToExport.AttributeChanges.Contains(schemaAttr.Name), objectToExport.AttributeChanges(schemaAttr.Name).ValueChanges(0).Value.ToString(), String.Empty)
. Cette expression extrait les modifications à exporter pour cet attribut ou l’initialise avec une chaîne vide. Votre workflow Export Replace ressemble à ceci :
- Faites glisser et déposez l’activité Switch après l’activité Assign. Dans le menu contextuel, sélectionnez
Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper
et cliquez sur Ok. Entrez l’expression suivante : nouveauAttributeNameWrapper(schemaAttr.Name)
Une icône d’avertissement s’affiche dans le coin supérieur droit de votre activité Switch pour signaler les attributs non gérés définis dans le schéma et non affectés à une propriété. Cliquez sur Ajouter une nouvelle zone de cas d’activité Switch et saisissez une valeur de cas de city. Faites glisser et déposez une activité Sequence dans le corps de ce cas. Faites glisser et déposez l’activité Assign dans le corps de ce cas. Affectez la valeur « X » à addressX.city. Faites glisser et déposez une autre activité Assign dans le corps de ce cas. Affectez xValue à address.city. Votre workflow Export Replace ressemble à ceci :
10.Ajoutez d’autres cas et affectations manquants. Utilisez ce tableau de mappage pour vous guider :
Case | Affectation |
---|---|
city | addressX.city = « X » address.city = xValue |
company | companyX.company = « X » company.company = xValue |
department | address.departmentX = « X » address.department = xValue |
addressX.e_mail = « X » address.e_mail = xValue | |
expirationTime | logOnDataX.GLTGB = « X » logOnData.GLTGB = xValue |
prénom | addressX.firstname = « X » address.firstname = xValue |
lastName | addressX.lastname = « X » address.lastname = xValue |
middleName | addressX.middlename = « X » address.middlename = xValue |
telephoneNumber | addressX.TEL1_Numbr = adresse « X ». TEL1_Numbr = xValue |
Fonction | addressX.function = « X » address.function = xValue |
Votre workflow Export Replace ressemble à ceci :
Avant d’appeler le programme BAPI_USER_CHANGE, vérifiez que le nom d’utilisateur n’est pas vide. Après avoir réduit les deux activités ForEach, ajoutez l’activité IF après la seconde. Saisissez la condition :
String.IsNullOrEmpty(userName ) = False
.Si le champ du nom d’utilisateur est vide, nous devons indiquer l’échec de l’opération. Faites glisser et déposez l’activité
CreateCSEntryChangeResult
dans la branche Else de votre activité IF et sélectionnez le code d’erreurExportErrorCustomContinueRun
. Votre workflow Export Replace ressemble à ceci :Faites glisser et déposez l’activité Sequence dans la branche vide Then de la première activité IF. Faites glisser et déposez l’activité WebSeviceCall à l’intérieur de l’activité Sequence. Sélectionnez le nom du service SAPECC, le point de terminaison ZSAPCONNECTORWS et l’opération BAPI_USER_CHANGE. Cliquez sur le bouton ... Arguments afin de définir les paramètres pour l’appel du service web selon les indications suivantes :
Nom | Sens | Type | Value |
---|---|---|---|
ADDRESS | Dans | BAPIADDR3 | address |
ADDRESSX | Dans | BAPIADDR3X | addressX |
COMPANY | Dans | BAPIUSCOMP | company |
COMPANYX | Dans | BAPIUSCOMX | company |
DEFAULTS | Dans | BAPIDEFAUL | defaults |
DEFAULTSX | Dans | BAPIDEFAX | defaultsX |
LOGONDATA | Dans | BAPILOGOND | logOnData |
LOGONDATAX | Dans | BAPILOGONX | logOnDataX |
RETURN | Entrée/Sortie | TABLE_OF_BAPIRET2 | bapiret2Table |
USERNAME | Dans | Chaîne | userName |
- Cliquez sur OK. Le signe d’avertissement disparaît. Votre workflow Export Replace ressemble à ceci :
- Pour traiter les résultats des demandes utilisateur modifiées, faites glisser et déposez l’activité IF dans l’activité Sequence après l’activité WebServiceCall. Saisissez la condition suivante :
Not IsNothing(bapiret2Table.item) AndAlso bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
- En l’absence d’erreurs, nous partons du principe que l’opération d’exportation a réussi, et nous voulons marquer cet objet comme exporté avec succès en créant un
CSEntryChangeResult
avec l’état Réussite. Faites glisser et déposez l’activitéCreateCSEntryChangeResult
dans la branche Else de votre activité IF et sélectionnez le code d’erreur Réussite. - Faites glisser et déposez l’activité Sequence dans la branche Then de votre activité IF. Ajoutez l’activité Log avec la valeur LogText de
string.Join("\n",bapiret2Table.item.Where(Function(retItem) retItem.TYPE.Equals("E")).Select(Function(r) r.MESSAGE))
et la balise Error. Ajoutez l’activitéCreateCSEntryChangeResult
après l’activité Log avec le code d’erreurExportErrorCustomContinueRun
. Votre workflow Export Replace ressemble à ceci :
Vous avez terminé la définition du workflow Export Replace.
L’étape suivante consiste à configurer le connecteur de service web ECMA2Host à l’aide de ce modèle.