Client ECIR – Version de démonstration
Table des matières
1. Version du document ... 3
2. Objectif de ce document ... 3
3. Situation et droits sur ce document ... 3
3.1. Le client ECIR ... 3
3.2. Le document actuel ... 3
4. Les composants de ce projet ABAP ... 4
5.1. Les tables de paramétrage ... 4
5.1.1. ZTPOLREGL_POL ... 5
5.1.2. ZTPOLREGL_POLVER ... 5
5.1.3. ZTPOLREGL_REGL ... 6
5.1.4. ZTPOLREGL_CUST ... 6
5.1.5. ZTPOLREGL_CAR ... 7
5.1.6. La création de ces tables ... 8
5.2. Les objets de traitement ... 9
5.2.1. La classe de message ... 9
5.2.2. L’interface de traitement ... 10
5.2.3. ZCL_ECIRCLTDEMO_MESSAGES ... 10
5.2.4. La vue ZVPOLREGL_POLVER ... 14
5.3. Les objets d’administration ... 15
5.3.1. Le log applicatif ... 15
5.3.2. La tranche de numérotation ... 16
5.3.3. Les programmes administration... 17
6. Les exemples de traitement ... 19
6.1. Une politique de traitement exemple ... 19
6.2. Une politique de contrôle exemple ... 19
6.2.1. Présentation technique de la classe principale : ZCL_POLREGL_CONTROLE_V2 ... 21
6.2.2. Présentation technique d’une classe subalterne : ZCL_POLCTRL00_REGL01_V2 ... 27
6.2.3. ZCL_POLCTRL00_REGL02_V2 ... 31
6.2.4. Exemple d’exécution ... 34
7. Le serveur ECIR ... 37
7.1. Objectif de ce serveur ... 37
7.2. Interaction avec le client ECIR ... 37
7.3. Accès à ce serveur ... 37
8. Limitations – l’avenir ... 38
9. Liens externes ... 39
1. Version du document
Auteur Date : Commentaire
Yann SZWEC 28/12/2016 Création du document
2. Objectif de ce document
Ce document a pour objectif de présenter par des fichiers textes et des images le mode opératoire du client ECIR, dans sa version de démonstration.
Les fichiers NUGG contiennent les objets techniques et les points de paramètre nécessaire, mais il est possible que votre version de SAP ne supportent pas SAPLINK (ou que vous ayez un problème
technique avec cet outil).
Auquel cas les fichiers texte et les images vous permettront de compenser ce petit problème technique.
3. Situation et droits sur ce document 3.1. Le client ECIR
Ce client ECIR est une version de démonstration. Il appartient de plein droit à la société ECIR Consulting.
La version de ce client ECIR est COMPLETEMENT LIBRE de droit.
Vous êtes libres de l’utiliser, SOUS VOTRE RESPONSABILITE.
Il a été testé sous la responsabilité de son concepteur sur différents projets en Europe, et a obtenu les remerciements des clients qui l’ont utilisé.
Différentes versions de ce client de démonstration.
3.2. Le document actuel
Ce document n’est pas modifiable par qui que ce soit hormis son auteur.
Vous pouvez participer à ses corrections et voir votre nom apparaître dessus en tant que remerciement.
Vous pouvez contacter l’auteur sur son email : yann.szwec@ecir.fr
4. Les composants de ce projet ABAP Ce projet est composé de 2 parties :
- Une partie ABAP, permettant de gérer et de traiter les objets techniques de programmation sur SAP NETWEAVER. Cette partie est nommée CLIENT ECIR
- Une partie WINDEV, serveur technique d’analyse des tables de paramétrage utilisées dans la partie ABAP. Cette partie est nommée SERVEUR ECIR
5. Le client ECIR
Le client ECIR est en pur abap.
Cet abap est basique, avec comme volonté de pouvoir être utilisé même dans une version 4.6 Les concepts de programmation sont donc simples, utilisant une programmation accessible même à des débutants.
Il y a différents composants dans ce client : - Des tables de paramétrage, - Des objets de traitement, - Des objets d’administration.
5.1. Les tables de paramétrage
4 tables de paramétrage sont nécessaires pour le fonctionnement de ce client ECIR :
Table Description
ZTPOLREGL_POL Table de stockage des politiques
ZTPOLREGL_POLVER Table des versions des politiques créées
ZTPOLREGL_REGL Table des règles exécutées lors de la politique
ZTPOLREGL_CUST Table de paramétrage.
IL y a d’autres tables mais nous nous contenterons d’expliquer ces tables.
5.1.1. ZTPOLREGL_POL
Chaque politique est définie avant de pouvoir être exécutée.
Table de paramétrage, pleinement bufferisée.
5.1.2.ZTPOLREGL_POLVER
La méthode de programmation permet de gérer des versions différentes d’exécution des
programmes. Il est possible d’interagir sur la date d’exécution afin de traiter des cas différents entre la machine de DEV, de QAL, et la PROD, sans impacter les personnes réalisant des test sur des versions autres.
Table de paramétrage, pleinement bufferisée.
5.1.3. ZTPOLREGL_REGL
Table contenant l’ensemble des règles à exécuter pour une version de politique donnée.
Table de paramétrage, pleinement bufferisée.
5.1.4. ZTPOLREGL_CUST
Table d’administration du client ECIR, indiquant si le client est connecté à un serveur ECIR ou non.
Dans le cas présent il n’est pas administré par un serveur ECIR.
Table de paramétrage, pleinement bufferisée.
5.1.5. ZTPOLREGL_CAR
Table permettant d’influencer l’ordre des traitements à réaliser.
Table de paramétrage, pleinement bufferisée.
5.1.6. La création de ces tables
Il est possible de créer ses objets de par SAPLINK.
Il faut respecter la procédure d’installation écrite en anglais.
Il convient de respecter un ordre dans l’activation des objets du DDIC : - Les domaines,
- Les éléments de données, - Les structures,
- Les tables, - Les vues.
5.2. Les objets de traitement 5.2.1. La classe de message
Une classe de message a été mise en place afin de gérer les messages.
ZCM_POLREGL_0
5.2.2. L’interface de traitement
L’interface ZIF_ECIRCLTDEMO a été créée spécifiquement afin de gérer différentes constantes.
5.2.3. ZCL_ECIRCLTDEMO_MESSAGES
Cette classe a pour objet de gérer les messages à gérer au sein des classes de traitement (classe principale et classes subalternes.
5.2.3.1. Méthode BAL_ADD_MESSAGE
method BAL_ADD_MESSAGE.
DATA: ls_s_msg TYPE bal_s_msg.
MOVE: i_msgty TO ls_s_msg-msgty , i_msgid TO ls_s_msg-msgid , i_msgno TO ls_s_msg-msgno , i_msgv1 TO ls_s_msg-msgv1 , i_msgv2 TO ls_s_msg-msgv2 , i_msgv3 TO ls_s_msg-msgv3 , i_msgv4 TO ls_s_msg-msgv4 .
CALL FUNCTION 'BAL_LOG_MSG_ADD' EXPORTING
i_log_handle = i_log_handle i_s_msg = ls_s_msg
* IMPORTING
* E_S_MSG_HANDLE =
* E_MSG_WAS_LOGGED =
* E_MSG_WAS_DISPLAYED = EXCEPTIONS
log_not_found = 1
msg_inconsistent = 2
log_is_full = 3
OTHERS = 4 .
IF sy-subrc <> 0.
RAISE erreur_add_message.
ENDIF.
endmethod.
5.2.3.2. Méthode BAL_CREATE
method BAL_CREATE.
DATA: ls_bal_s_log TYPE bal_s_log .
ls_bal_s_log-object = i_object.
ls_bal_s_log-subobject = i_subobject.
CALL FUNCTION 'BAL_LOG_CREATE' EXPORTING
i_s_log = ls_bal_s_log IMPORTING
e_log_handle = e_log_handle EXCEPTIONS
log_header_inconsistent = 1 OTHERS = 2.
IF sy-subrc <> 0.
RAISE erreur_log_creation.
ENDIF.
endmethod.
5.2.3.3. Méthode BAL_SAVE
method BAL_SAVE.
DATA: it_log_handle TYPE bal_t_logh.
APPEND i_log_handle TO it_log_handle.
CALL FUNCTION 'BAL_DB_SAVE' EXPORTING
* I_CLIENT = SY-MANDT
* I_IN_UPDATE_TASK = ' '
* I_SAVE_ALL = ' '
i_t_log_handle = it_log_handle
* IMPORTING
* E_NEW_LOGNUMBERS = EXCEPTIONS
log_not_found = 1 save_not_allowed = 2 numbering_error = 3 OTHERS = 4 .
IF sy-subrc <> 0.
RAISE erreur_log_save.
ENDIF.
endmethod.
5.2.4. La vue ZVPOLREGL_POLVER
Les champs présents
MANDT ZTPOLREGL_POL MANDT MANDT
POL_GUID ZTPOLREGL_POL GUID ZEPOLREGL_POL_GUID
POLVER_GUID ZTPOLREGL_POLVER POLVER_GUID ZEPOLREGL_POLVERS_GUID
POL_ID ZTPOLREGL_POL POL_ID ZEPOLREGL_POL_ID
POL_DESCR ZTPOLREGL_POL POL_DESCR ZEPOLREGL_POL_DESCR
POLVER_DESCR ZTPOLREGL_POLVER POLVER_DESCR ZEPOLREGL_POL_DESCRVERS
POLVER_ACTIVE ZTPOLREGL_POLVER POLVER_ACTIVE ZEPOLREGL_POL_ACTIVE POLVER_DEBUT ZTPOLREGL_POLVER POLVER_DEBUT ZEPOLREGL_POL_DEBUT
POLVER_FIN ZTPOLREGL_POLVER POLVER_FIN ZEPOLREGL_POL_FIN
POL_ID_CTRL ZTPOLREGL_POLVER POL_ID_CTRL ZEPOLREGL_POL_ID_CTRL
POL_CLASSE ZTPOLREGL_POLVER POL_CLASSE ZEPOLREGL_POL_CLASSEM
5.3. Les objets d’administration 5.3.1.Le log applicatif
Le log application ZPOLREGL doit être créé.
Il contient un seul sous-objet : CONTROLE
5.3.2. La tranche de numérotation
La tranche de numérotation ZPEC_NR doit être créée pour permettre la création automatique des politiques.
Une seule tranche de numérotation doit être créée pour permettre le fonctionnement de cette tranche de numérotation.
5.3.3. Les programmes administration 5.3.3.1. ZRECIRCLTDEMO_ADMIN
Un seul programme permet de centraliser les traitements offerts dans le CLIENT ECIR de démonstration : ZRECIRCLTDEMO_ADMIN
Il fait simplement référence aux autres programmes d’administration.
Les text-element de ce programme
P_LOG Application log display
P_R1 Policy creation
P_R2 Version policy creation
P_R3 Policy Display
P_R4 Version policy comparaison
P_R5 ECIR client customizing
P_R6 Control policies
P_R7 Download policies
5.3.3.2. ZRECIRCLTDEMO_ADMIN_R1 Programme de création des politiques.
Les text-element de ce programme.
P_CCLA Children class naming convent.
P_CTRL control policy
P_DBEG Begin date
P_DEND end date
P_DESCR Policy description
P_DESCRV Version description
P_LOG Log needed
P_MCLA Mother class naming
P_NCCLA Num children class
P_PAR1 parameter 1
P_PAR2 parameter 2
P_PAR3 parameter 3
P_PART Partner
P_POLID Policy id to be created
P_TEST Test mode
P_TYP1 ECIR Administration
P_TYP2 ECIR demonstration
P_TYP3 ECIR authorization
P_TYP4 ECIR management
P_TYP5 Customer authorization
P_TYP6 Customer management
P_TYP7 Customer container
P_TYP8 ECIR Partners
P_VAL1 value parameter 1
P_VAL2 value parameter 2
5.3.3.3. ZRECIRCLTDEMO_ADMIN_R6
Programme de contrôle des politiques présentes dans les tables de paramétrage.
Les text-element de ce programme.
P_DATE Validity date
S_ID Policy id to be checked
5.3.3.4. ZRECIRCLTDEMO_ADMIN_R7
Programme pour décharger le contenu des tables de paramétrage afin de les mettre à disposition au serveur ECIR.
Les text-element de ce programme.
P_DATE Date to be tested
P_DIR Directory to download
S_ID Policies id
6. Les exemples de traitement
6.1. Une politique de traitement exemple
Vous trouverez dans les tables de paramétrage des exemples à analyser.
6.2. Une politique de contrôle exemple
La politique de contrôle 1 a été créé afin de permettre des contrôles sur les classes subalternes à exécuter. Elle est obligatoirement stockée dans la table ZTPOLREGL_POL
Cette politique est référencée sous le GUID : C86000A234E51ED48696D572D3D49A89 Nous retrouvons l’ensemble des versions de cette politique dans la table ZTPOLREGL_POL
Il convient de valider uniquement les versions actives, et leur période de validité.
Nous nous intéresserons à la version active en fonction de la date système, soir la version nommée 2nd version. Son guid : C86000A234E51ED488E32EB9C8871A89
La classe principale d’exécution est la suivante : ZCL_POLREGL_CONTROLE_V2
Nous utilisons ce guid pour interroger la table ZTPOLREGL_REGL
Tout comme pour la table ZTPOLREGL_POLVER, il convient de contrôler uniquement les enregistrements actifs.
Liste des classes appelées.
ZCL_POLCTRL00_REGL01_V2 ZCL_POLCTRL00_REGL02_V2 ZCL_POLCTRL00_REGL03_V2 ZCL_POLCTRL00_REGL04_V2 ZCL_POLCTRL00_REGL05_V2 ZCL_POLCTRL00_REGL06_V2
6.2.1. Présentation technique de la classe principale : ZCL_POLREGL_CONTROLE_V2 Les attributs
Les méthodes.
La méthode principale est CONTROLE_MERE method CONTROLE_MERE.
**********************************************************************
* Mise en place du log applicatif
* Cf plus tard avec if_reca_message_list.
**********************************************************************
DATA: it_log_handle TYPE bal_t_logh
, oref1 TYPE REF TO zcl_polregl_controle_v2 , msg_err_catch TYPE REF TO cx_root
, text_msg_err_catch TYPE string , lv_msgv1 TYPE msgv1
, lv_active TYPE n
, lv_ctrl_fille_erreur TYPE boolean .
.
FIELD-SYMBOLS: <fs_t_polregl_pol> LIKE LINE OF t_polregl_pol , <fs_t_polregl_regl> LIKE LINE OF t_polregl_regl , <fs_t_polregl_polver> LIKE LINE OF
t_polregl_polver
, <fs_t_polregl_polverctrl> LIKE LINE OF t_polregl_polver
, <fs_t_polregl_opt> LIKE LINE OF t_polregl_opt .
DATA: ls_polregl_polctrl LIKE LINE OF t_polregl_pol , ls_polregl_polverctrl LIKE LINE OF t_polregl_polver.
**********************************************************************
* Creation du log applicatif
**********************************************************************
CALL METHOD zcl_ecircltdemo_messages=>bal_create EXPORTING
i_object = log_objet i_subobject = log_sousobjet IMPORTING
e_log_handle = log_handle
EXCEPTIONS
erreur_log_creation = 1 OTHERS = 2.
IF sy-subrc <> 0.
RAISE erreur.
ENDIF.
CALL METHOD zcl_ecircltdemo_messages=>bal_save EXPORTING
i_log_handle = log_handle EXCEPTIONS
erreur_log_save = 1 OTHERS = 2.
IF sy-subrc <> 0.
RAISE erreur.
ENDIF.
e_log_handle = log_handle.
**********************************************************************
* Gestion d'une politique ou de toutes les politiques?
**********************************************************************
CALL METHOD zcl_polregl_controle_v2=>get_ztpolregl_pol EXPORTING
ir_pol_id = ir_pol_id RECEIVING
r_t_polregl_pol = t_polregl_pol.
**********************************************************************
* Contr#le des autorisations de l'utilisateur
**********************************************************************
DATA: lv_autorisation TYPE boolean.
lv_autorisation = return_autorisation( ).
IF lv_autorisation NE 'X'.
RAISE erreur.
ENDIF.
**********************************************************
* R#cup#ration des donn#es d#pendantes # controler
**********************************************************************
t_polregl_polver = zcl_polregl_controle_v2=>get_ztpolregl_polver( ).
t_polregl_polctrl = zcl_polregl_controle_v2=>get_ztpolregl_polctrl(
).
t_polregl_polver = zcl_polregl_controle_v2=>get_ztpolregl_polver( ).
t_polregl_regl = zcl_polregl_controle_v2=>get_ztpolregl_regl( ).
t_polregl_opt = zcl_polregl_controle_v2=>get_ztpolregl_opt( ).
**********************************************************************
* Ex#cution des classes filles
**********************************************************************
**********************************************************************
lv_ctrl_fille_erreur = ''.
LOOP AT t_polregl_pol ASSIGNING <fs_t_polregl_pol>.
MOVE <fs_t_polregl_pol>-pol_id TO lv_msgv1.
" Message d'information sur la politique trait#e CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = 'I'
i_msgid = message_class i_msgno = '000'
i_msgv1 = lv_msgv1 EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
* Boucle sur la version pour conna#tre la politique de contr#le LOOP AT t_polregl_polver ASSIGNING <fs_t_polregl_polver>
WHERE pol_guid EQ <fs_t_polregl_pol>-guid.
lv_ctrl_fille_erreur = ''.
CLEAR ls_polregl_polctrl.
" r#cup#ration de la politique de contr#le
CALL METHOD zcl_polregl_controle_v2=>get_pol_ctrl EXPORTING
i_pol_id = <fs_t_polregl_polver>-pol_id_ctrl RECEIVING
r_ls_polregl_pol = ls_polregl_polctrl.
IF ls_polregl_polctrl IS INITIAL.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = 'E'
i_msgid = message_class i_msgno = '016'
i_msgv1 = lv_msgv1 EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
ELSE.
" r#cup#ration de la version active de la politique de contr#le.
CLEAR ls_polregl_polverctrl.
CALL METHOD zcl_polregl_controle_v2=>get_polver_ctrl EXPORTING
i_guid = ls_polregl_polctrl-guid RECEIVING
r_ls_polregl_polver = ls_polregl_polverctrl.
IF ls_polregl_polverctrl IS INITIAL.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = 'E'
i_msgid = message_class i_msgno = '009'
i_msgv1 = lv_msgv1 EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
ELSE.
"Liste des classes de contr#le # ex#cuter
LOOP AT t_polregl_regl ASSIGNING <fs_t_polregl_regl>
WHERE guid_polver EQ ls_polregl_polverctrl-polver_guid.
IF lv_ctrl_fille_erreur EQ 'X' AND <fs_t_polregl_regl>- regl_bloquante = 'X'.
CONTINUE.
ENDIF.
TRY.
" contr#ler l'activation de la classe de controle, " erreur non catchable,
https://help.sap.com/abapdocu_70/en/ABAPTRY.htm lv_active = 1.
CALL METHOD
zcl_polregl_controle_v2=>get_activation_classe EXPORTING
i_classenom = <fs_t_polregl_regl>-regl_classe RECEIVING
r_active = lv_active.
IF lv_active EQ 0.
lv_msgv1 = <fs_t_polregl_regl>-regl_classe.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = 'E'
i_msgid = message_class i_msgno = '008'
i_msgv1 = lv_msgv1 EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
CONTINUE.
ENDIF.
" Application de la r#gle de contr#le
CREATE OBJECT oref1 TYPE (<fs_t_polregl_regl>- regl_classe)
EXPORTING
i_ls_polregl_polver = <fs_t_polregl_polver>
i_ls_polregl_regl = <fs_t_polregl_regl>
EXCEPTIONS
politique_vide = 1 version_vide = 2 regle_vide = 3 OTHERS = 4.
CALL METHOD oref1->controle_fille IMPORTING
e_ctrl_fille_erreur = lv_ctrl_fille_erreur EXCEPTIONS
erreur_classe_fille = 1 OTHERS = 2.
CATCH cx_root INTO msg_err_catch.
text_msg_err_catch = msg_err_catch->get_text( ).
RAISE erreur.
ENDTRY.
" si la classe est bloquante, le traitement est termin#, pas la peine d'aller plus loin.
IF lv_ctrl_fille_erreur = 'X' AND <fs_t_polregl_regl>- regl_bloquante = 'X'.
" Message d'erreur si aucune r#gle pr#sente pr#sente MOVE <fs_t_polregl_pol>-pol_id TO lv_msgv1.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = 'E'
i_msgid = message_class i_msgno = '011'
i_msgv1 = lv_msgv1 EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
" Initialise le traitement des classes bloquantes pour la politique suivante.
lv_ctrl_fille_erreur = ''.
ENDLOOP.
" Sauvegarde du log applicatif # la fin du contr#le de chaque politique pr#sente
CALL METHOD zcl_ecircltdemo_messages=>bal_save EXPORTING
i_log_handle = log_handle EXCEPTIONS
erreur_log_save = 1 OTHERS = 2.
IF sy-subrc <> 0.
RAISE erreur.
ENDIF.
ENDLOOP.
**********************************************************************
*
**********************************************************************
endmethod.
La classe subalterne est appelée au moment de cette instruction :
" Application de la r#gle de contr#le
CREATE OBJECT oref1 TYPE (<fs_t_polregl_regl>- regl_classe)
EXPORTING
i_ls_polregl_pol = <fs_t_polregl_pol>
i_ls_polregl_polver = <fs_t_polregl_polver>
i_ls_polregl_regl = <fs_t_polregl_regl>
EXCEPTIONS
politique_vide = 1 version_vide = 2 regle_vide = 3 OTHERS = 4.
CALL METHOD oref1->controle_fille IMPORTING
e_ctrl_fille_erreur = lv_ctrl_fille_erreur EXCEPTIONS
erreur_classe_fille = 1 OTHERS = 2.
Ce code a été expliqué dans mon livre de programmation ABAP objet paru en 2009.
6.2.2. Présentation technique d’une classe subalterne : ZCL_POLCTRL00_REGL01_V2 En fait cette classe subalterne fait ce que vous voulez : son code est libre, il est simplement dépendant de la signature d’appel de la méthode CONTROLE_FILLE.
Exemple de code pour la classe ZCL_POLCTRL00_REGL01_V2 pour la méthode CONTROLE_FILLE :
**********************************************************************
* Contr#le existance de la classe m#re dans les tables SAP
**********************************************************************
DATA: wa_seoclass TYPE seoclass
, lv_msgv1 TYPE bal_s_msg-msgv1 , lv_msgv2 TYPE bal_s_msg-msgv2 , lv_msgty TYPE bal_s_msg-msgty .
e_ctrl_fille_erreur = ''.
**********************************************************************
* R#cup#ration dynamique du nom de la classe de l'instance
**********************************************************************
mv_class_name = |{ cl_abap_classdescr=>describe_by_object_ref( me )-
>absolute_name+7 }|.
lv_msgty = 'W'.
lv_msgv1 = mv_class_name.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message
EXPORTING
i_log_handle = log_handle i_msgty = lv_msgty i_msgid = message_class i_msgno = '010'
i_msgv1 = lv_msgv1 EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
* Commentaire du traitement en cours
lv_msgv1 = ls_polregl_regl-regl_descr.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = lv_msgty i_msgid = message_class i_msgno = '013'
i_msgv1 = lv_msgv1 EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
CALL METHOD zcl_ecircltdemo_messages=>bal_save EXPORTING
i_log_handle = log_handle EXCEPTIONS
erreur_log_save = 1 OTHERS = 2.
**********************************************************************
* Traitements de la classe fille
**********************************************************************
SELECT SINGLE * FROM seoclass INTO wa_seoclass
WHERE clsname = ls_polregl_polver-pol_classe.
IF sy-subrc EQ 0.
lv_msgty = 'I'.
lv_msgv1 = ls_polregl_polver-pol_classe.
lv_msgv2 = 'existe'(m01).
ELSE.
lv_msgty = 'E'.
lv_msgv1 = ls_polregl_polver-pol_classe.
lv_msgv2 = 'inexistante'(m02).
ENDIF.
* Message d'erreur si aucune politique pr#sente CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = lv_msgty i_msgid = message_class i_msgno = '005'
i_msgv1 = lv_msgv1
EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
**********************************************************************
* Validation des traitements r#alis#s
**********************************************************************
IF e_ctrl_fille_erreur = ''.
lv_msgty = ''.
lv_msgv1 = mv_class_name.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = lv_msgty i_msgid = message_class i_msgno = '012'
i_msgv1 = lv_msgv1 EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
ELSE.
lv_msgty = 'E'.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = lv_msgty i_msgid = message_class i_msgno = '004'
EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
ENDIF.
**********************************************************************
* Sauvegarde du log applicatif
**********************************************************************
CALL METHOD zcl_ecircltdemo_messages=>bal_save EXPORTING
i_log_handle = log_handle EXCEPTIONS
erreur_log_save = 1 OTHERS = 2.
IF sy-subrc <> 0.
RAISE erreur_classe_fille.
ENDIF.
6.2.3. ZCL_POLCTRL00_REGL02_V2 Le code de la méthode CONTROLE_FILLE :
method CONTROLE_FILLE.
**********************************************************************
* Contr#le existance des classes filles dans les tables SAP
**********************************************************************
DATA: wa_vseoclass TYPE vseoclass
, lv_msgv1 TYPE bal_s_msg-msgv1 , lv_msgv2 TYPE bal_s_msg-msgv2 , lv_msgty TYPE bal_s_msg-msgty , ls_seometarel TYPE seometarel .
e_ctrl_fille_erreur = ''.
**********************************************************************
* R#cup#ration dynamique du nom de la classe de l'instance
**********************************************************************
mv_class_name = |{ cl_abap_classdescr=>describe_by_object_ref( me )-
>absolute_name+7 }|.
lv_msgty = 'W'.
lv_msgv1 = mv_class_name.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = lv_msgty i_msgid = message_class i_msgno = '010'
i_msgv1 = lv_msgv1 EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
* Commentaire du traitement en cours lv_msgv1 = ls_polregl_regl-regl_descr.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = lv_msgty i_msgid = message_class i_msgno = '013'
i_msgv1 = lv_msgv1 EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
CALL METHOD zcl_ecircltdemo_messages=>bal_save EXPORTING
i_log_handle = log_handle EXCEPTIONS
erreur_log_save = 1 OTHERS = 2.
**********************************************************************
* Traitements de la classe fille
**********************************************************************
FIELD-SYMBOLS: <lfs_polregl_regl> LIKE LINE OF t_polregl_regl.
* contr#ler qu'au moins une classe est existante
READ TABLE t_polregl_regl ASSIGNING <lfs_polregl_regl>
WITH KEY guid_polver = ls_polregl_polver-polver_guid.
IF sy-subrc NE 0.
lv_msgty = 'E'.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = lv_msgty i_msgid = message_class i_msgno = '015'
EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
ELSE.
* contr#le existance des classes filles
LOOP AT t_polregl_regl ASSIGNING <lfs_polregl_regl>
WHERE guid_polver = ls_polregl_polver-polver_guid.
SELECT SINGLE * FROM vseoclass INTO wa_vseoclass
WHERE clsname = <lfs_polregl_regl>-regl_classe.
IF sy-subrc EQ 0.
lv_msgty = 'I'.
lv_msgv1 = <lfs_polregl_regl>-regl_classe.
lv_msgv2 = 'existe'(m01).
ELSE.
lv_msgty = 'E'.
IF <lfs_polregl_regl>-regl_classe IS INITIAL.
lv_msgv1 = 'NON INDIQUEE'(m03).
ELSE.
lv_msgv1 = <lfs_polregl_regl>-regl_classe.
ENDIF.
lv_msgv2 = 'inexistante'(m02).
ENDIF.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = lv_msgty i_msgid = message_class i_msgno = '006'
i_msgv1 = lv_msgv1 i_msgv2 = lv_msgv2 EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
*
* On peut ajouter ici des contr#les suppl#mentaires
* Active ou non, liber#e ou non
* *
* h#rite de la classe mere par exemple. Pourrait se faire par une politique de contr#le aussi
IF wa_vseoclass IS NOT INITIAL. "classe fille existe, donc on peut tester son h#ritage
SELECT SINGLE * FROM seometarel INTO ls_seometarel
WHERE clsname = <lfs_polregl_regl>-regl_classe.
IF ls_seometarel-refclsname NE ls_polregl_polver-pol_classe.
lv_msgty = 'E'.
lv_msgv1 = <lfs_polregl_regl>-regl_classe.
lv_msgv2 = ls_polregl_polver-pol_classe.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = lv_msgty i_msgid = message_class i_msgno = '007'
i_msgv1 = lv_msgv1 i_msgv2 = lv_msgv2 EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
**********************************************************************
* Validation des traitements r#alis#s
**********************************************************************
IF e_ctrl_fille_erreur = ''.
lv_msgty = ''.
lv_msgv1 = mv_class_name.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = lv_msgty i_msgid = message_class i_msgno = '012'
i_msgv1 = lv_msgv1 EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
ELSE.
lv_msgty = 'E'.
CALL METHOD zcl_ecircltdemo_messages=>bal_add_message EXPORTING
i_log_handle = log_handle i_msgty = lv_msgty i_msgid = message_class i_msgno = '004'
EXCEPTIONS
erreur_add_message = 1 OTHERS = 2.
ENDIF.
**********************************************************************
* Sauvegarde du log applicatif
**********************************************************************
CALL METHOD zcl_ecircltdemo_messages=>bal_save EXPORTING
i_log_handle = log_handle EXCEPTIONS
erreur_log_save = 1 OTHERS = 2.
IF sy-subrc <> 0.
RAISE erreur_classe_fille.
ENDIF.
endmethod.
6.2.4.Exemple d’exécution
Nous prendrons le programme ZRECIRCLTDEMO_ADMIN_R6 pour exécuter la classe principale et les classes subalternes.
Lassez les paramètres tel quels.
Le log applicatif permet de constater le comportement de votre politique 1, et l’application des classes subalternes.
7. Le serveur ECIR
7.1. Objectif de ce serveur
L’objectif de ce serveur est de procéder à des analyses des tables de paramétrage utilisé sur un serveur SAP NETWEAVER.
Ce serveur est complètement dédié à l’analyse des données présentes dans un client ECIR : il ne présente donc aucune utilité sans utilisation du CLIENT ECIR.
7.2. Interaction avec le client ECIR
Le programme ZRECIRCLTDEMO_ADMIN_R7 permet de mettre à disposition les fichiers des tables de paramétrage à transmettre au serveur ECIR.
7.3. Accès à ce serveur
Il est librement téléchargeable sur notre site de vente de livres : www.ecom-ecir.fr
8. Limitations – l’avenir
Un traitement de moins de 4 heures lors de ma participation à la foire du livre d’ABU DHABI m’a permis de lever une des contraintes de ce mode opératoire de travail : comment n’avoir qu’une seule signature pour la classe principale (la classe « MERE »).
Il convient d’avoir alors une seul classe principale, avec dans son constructeur, ou son appel de méthode statique, une table interne en tant que paramètre dans laquelle nous transférons l’ensemble des paramètres nécessaires à son fonctionnement.
Il faut utiliser des fields-symbols.
Je vous laisse le plaisir de chercher, j’ai réalisé ce travail en moins de 4 heures.
9. Liens externes SAP LINK.
SAP GITS