Accueil > ABAP, Développement > Générer des Ordres de Transport (Transport Request)

Générer des Ordres de Transport (Transport Request)


Le billet d’aujourd’hui va traiter d’un problème que j’ai rencontré lors d’un projet de maintenance d’un menu. J’avais créé un menu dynamique, piloté par plusieurs tables spécifiques. Bien évidement, la demande fut de gérer ces tables via une interface graphique. Qui dit,modification de table, dit (en général) création d’Ordre de Transports (OTs) pour le passage des données dans le paysage système.

Nous allons voir comment on crée un OT en ABAP, puis ajouter le contenu d’une table dans cet OT. Vous allez voir c’est pas sorcier mais c’est bien pratique à savoir !

Création d’un Ordre de Transport (OT)

La création de l’Ordre de Transport (Transport Request en anglais) se fait grâce à un module fonction d’une utilisation enfantine :

 CTS_API_CREATE_CHANGE_REQUEST

Grâce à celui-ci, on va pouvoir générer un OT de type Workbench ou  Customizing, lui spécifier un propriétaire, un mandant et une description.

Ajout des données dans l’OT

L’ajout de données dans un OT nécessite un peu de théorie concernant le processus d’injection.

Un peu de théorie

Un OT se base sur deux structures (E071 et E071K) que l’on retrouvera dans n’importe quel module fonction ou BAPI manipulant les OTs. La première ayant une notion d’en-tête et la seconde de contenu.

Pour l’en-tête (E071), les champs importants sont les suivants :

Les champs vous sont présentés avec leur correspondance dans un ordre de transport observable en SE10.

Concernant l’autre structure ( E071K), les champs sont identique à une zone près : TABKEY qui est la clef primaire de la table à transporter. C’est la requête qui indique à l’ordre de transport quelles données sont à importer.

Le principe est simple, si on ajoute une donnée dans une table alors le moyen le plus simple de la récupérer est de connaitre la clef primaire de l’enregistrement. Les OTs fonctionnent ainsi.

Par l’exemple :

Voici comment on construit une clef.

Dans la table ci-dessus, si l’on ne souhaite transporter que l’enregistrement USA la TABKEY sera :

1103000

Dans le cas où l’on souhaite envoyer tout une série de données :

110*

Ajout des données

On sait comment alimenter nos structures, il ne reste plus qu’a les injecter dans le module fonction :

TR_REQUEST_CHOICE

Ce module fonction peut servir en frontend comme en background si l’on positionne correctement le flag iv_suppress_dialog. Pour le reste des paramètres d’entrées, l’on retrouve nos deux structures ainsi qu’un champ pour spécifier le numéro d’OT dans lequel on souhaite injecter les données.

Limitation

Une limitation existe lors de la création d’une table. Au niveau de ses clefs primaire, il faut privilégier les clefs de type CHAR ou NUMC. Dans le cas contraire, lors du transport de vos données, il sera impossible au système de transport central (CTS) de filtrer sur cette clef. Pour expliquer le comportement, je me base sur le thread de Keerthi Hiremath sur ce sujet.

Explications

Si vous rencontrez les erreurs suivantes (en français ou anglais) :

Indiquez la clé de la table &1 uniquement jusqu'à la position &2.
Fill table key for table &1 only up to position &2 only

Alors on entre dans le cas typique d’un problème de typage d’une clef primaire. En fait l’une de vos clefs est sûrement un entier ou autre qu’un NUMC ou CHAR.  Si vous ne pouvez pas changer le type de votre clef voici comment il faut procéder.

Scénario :
  • Clef 1 : est le client de type SY-MANDT.
  • Clef 2 :  Le code entreprise de type BUKRS.
  • Clef 3 : de type INT4.

La zone TABKEY sera définie comme tel :

1111000*

Où 111 est le mandant, 1000 le code entreprise et l’étoile correspondra à toutes les autres valeurs de la table. Car il sera impossible pour le système d’interpréter autre chose qu’une étoile pour cette Clef 3.

En d’autres termes, le système effectuera la requête suivante :

 SELECT * FROM  WHERE BUKS = '1000' AND MNDT = '111'. 

Le résultat sera contenu dans l’ordre de transport.

La zone de type INT4 sera dans tous les cas définies par une étoile, il ne sera pas possible d’appliquer un filtrer. La conséquence est que si vous n’avez qu’une clef primaire de type INT4 alors il faudra transporter TOUTE la table.

Conclusion

On a vue comment générer de manière programmatique un Ordre de Transport et de le remplir par les données d’une table. En voulant faire cela, on à rencontré une limitation dans la définition des tables que l’on souhaite transporter à savoir typer les clefs primaire en CHAR ou NUMC.

Enjoy 😉

  1. 20/07/2010 à 14 h 41 min

    Joli post !

  2. sdrgz
    20/08/2013 à 11 h 28 min

    Joli post !

  3. 16/04/2014 à 11 h 16 min

    joli post, mais il faudrait ajouter un exemple plus complet. Le but est de nous permettre de comprendre les ordres de transport et de pouvoir les utiliser.
    Merci.

  1. No trackbacks yet.

Laisser un commentaire