Dans cet exercice, vous allez définir et implémenter des méthodes dans votre classe locale lcl_connection. Vous appellerez ensuite ces méthodes à partir de la méthode main( ) de votre classe globale.
Tâche 1: Copier modèle (facultatif)
Copiez la classe de modèle. Si vous avez terminé l'exercice précédent, vous pouvez ignorer cette tâche et continuer à modifier votre classe ZCL_##_LOCAL_CLASS ou votre classe ZCL_##_INSTANCES.
Étapes
Ouvrez le code source de la classe globale /LRN/CL_S4D400_CLS_INSTANCES dans l'éditeur ABAP.
Dans la barre d'outils Eclipse, sélectionnez Ouvrir ABAP Development Object. Vous pouvez également appuyer sur Ctrl + Maj + A.
Saisissez /LRN/CL_S4D400_CLS comme chaîne de recherche.
Dans la liste des objets de développement, sélectionnez /LRN/CL_S4D400_CLS_INSTANCES, puis cliquez sur OK.
Liez la vue Explorateur de projets à l'aide de l'éditeur.
Dans la barre d'outils Explorateur de projets, recherchez le bouton Lier à l'éditeur. S'il n'est pas encore appuyé, sélectionnez-le. Par conséquent, l'objet de développement, qui est ouvert dans l'éditeur, doit être mis en surbrillance dans l'explorateur de projets.
Copiez la classe /LRN/CL_S4D400_CLS_INSTANCES dans une classe de votre propre package (nom proposé : ZCL_##_METHODS, ## correspondant à votre numéro de groupe).
Dans la vue Explorateur de projets, cliquez avec le bouton droit de la souris sur la classe /LRN/CL_S4D400_CLS_INSTANCES pour ouvrir le menu de contenu.
Dans le menu contextuel, sélectionnez Dupliquer ....
Saisissez le nom de votre package dans la zone Package. Dans la zone Nom, saisissez le nom ZCL_##_METHODS, où ## représente votre numéro de groupe.
Ajustez la description et cliquez sur Suivant.
Confirmez l'ordre de transport et cliquez sur Terminer.
Tâche 2: Définir méthodes
Dans votre classe locale lcl_connection, définissez les méthodes d'instance get_output et set_attributes.
Étapes
Naviguez jusqu'à la définition de la classe locale lcl_connection.
Dans la classe globale, sélectionnez Types locaux.
Ajoutez une méthode get_output à la section publique de la classe. Il doit avoir un paramètre de retour r_output du type de table globale STRING_TABLE.
Remarque
Pensez à entourer le nom du paramètre de retour de VALUE( ).
Adaptez le code comme suit :
1234567891011121314
PUBLIC SECTION.
DATA carrier_id TYPE /dmo/carrier_id.
DATA connection_id TYPE /DMO/Connection_id.
CLASS-DATA conn_counter TYPE i.
METHODS get_output
returning
value(r_output) type string_table.
PROTECTED SECTION.
Remarque
Pour le moment, ignorez l'erreur de syntaxe Implémentation manquante pour la méthode "GET_OUTPUT".
Ajoutez une méthode set_attributes à la section publique de la classe. Il doit avoir un paramètre d'importation pour chaque attribut d'instance de la classe. Utilisez les mêmes types pour les paramètres que ceux que vous avez utilisés pour saisir les attributs. Pour distinguer les paramètres des attributs, ajoutez le préfixe i_ aux noms des paramètres. En outre, la méthode doit déclencher l'exception CX_ABAP_INVALID_VALUE.
Adaptez le code comme suit :
123456789101112131415161718192021
PUBLIC SECTION.
DATA carrier_id TYPE /dmo/carrier_id.
DATA connection_id TYPE /DMO/Connection_id.
CLASS-DATA conn_counter TYPE i.
METHODS set_attributes
IMPORTING
i_carrier_id TYPE /dmo/carrier_id
i_connection_id TYPE /dmo/connection_id
RAISING
cx_abap_invalid_value.
METHODS get_output
returning
value(r_output) type string_table.
PROTECTED SECTION.
Remarque
Pour le moment, ignorez l'erreur de syntaxe Implémentation manquante pour la méthode "SET_ATTRIBUTES".
Tâche 3: Implémenter méthodes
Étapes
Utilisez un correctif rapide pour ajouter les implémentations de méthode à la classe.
Positionnez le curseur sur le nom de l'une des méthodes de l'éditeur et appuyez sur Ctrl + 1.
Double-cliquez sur la suggestion Ajouter 2 méthodes non implémentées.
Implémentez la méthode get_output. Ajoutez des modèles de chaîne au paramètre de retour r_output. Dans les modèles de chaîne, utilisez des expressions intégrées pour ajouter les valeurs des attributs carrier_id et connection_id.
Dans la classe locale, ajoutez le code suivant entre les instructions METHOD get_output. et ENDMETHOD.
12345
APPEND |------------------------------| TO r_output.
APPEND |Carrier: { carrier_id }| TO r_output.
APPEND |Connection: { connection_id }| TO r_output.
Implémentez la méthode set_Attributes. Si l'un des deux paramètres d'importation est vide (IS INITIAL), déclenchez l'exception CX_ABAP_INVALID_VALUE. Sinon, renseignez les deux attributs d'instance avec les valeurs des paramètres d'importation.
Adaptez le code comme suit :
123456789101112
METHOD set_attributes.
IF i_carrier_id IS INITIAL OR i_connection_id IS INITIAL.
RAISE EXCEPTION TYPE cx_abap_invalid_value.
ENDIF.
carrier_id = i_carrier_id.
connection_id = i_connection_id.
ENDMETHOD.
Activez votre classe.
Sélectionnez Ctrl + F3 pour activer la classe.
Tâche 4: Appel d'une méthode fonctionnelle
Dans la méthode principale de votre classe globale, appelez la méthode fonctionnelle get_output.
Étapes
Passez à l'implémentation de la méthode if_oo_adt_classrun~main dans la classe globale.
Dans la classe globale, sélectionnez Classe globale, faites défiler vers le bas jusqu'à l'implémentation de la méthode if_oo_adt_classrun~main.
À la fin de la méthode, ajoutez une boucle sur les connexions de tables internes avec une connexion de variable de référence comme espace de travail.
Ajoutez le code suivant avant ENDMETHOD..
12345
LOOP AT connections INTO connection.
ENDLOOP.
Dans la boucle, appelez la méthode fonctionnelle get_output pour chaque instance et écrivez le résultat dans la console.
Astuce
Vous pouvez utiliser l'appel de la méthode get_output directement comme entrée pour out->write( ).
Adaptez le code comme suit :
1234567
LOOP AT connections INTO connection.
out->write( connection->get_output( ) ).
ENDLOOP.
Activez la classe. Exécutez-la en tant qu'application de console et analysez la sortie de la console.
Appuyez sur Ctrl + F3 pour activer la classe.
Appuyez sur F9 pour exécuter la classe.
Analysez le résultat dans la fenêtre Console.
Tâche 5: Utiliser l'achèvement du code et gérer les exceptions
Utilisez la saisie semi-automatique du code source pour appeler la méthode set_attributes et gérer l'exception déclenchée par la méthode.
Étapes
Pour la première instance de la classe lcl_connection, remplacez l'accès direct aux attributs carrier_id et connection_id par un appel de la méthode d'instance set_attributes( ). Utilisez la saisie semi-automatique du code source pour insérer la signature complète de la méthode.
Astuce
Appuyez sur Ctrl + Espace après avoir saisi le composant select (->) pour afficher une liste des attributs et méthodes disponibles. Sélectionnez la méthode, puis appuyez sur Maj + Entrée pour insérer la signature complète de la méthode.
Positionnez le curseur sur la ligne suivante après la première connection = NEW #( )..
Saisissez connection-> et appuyez sur Ctrl + Espace.
Sélectionnez set_Attributes et appuyez sur Maj + Entrée.
Transmettez les valeurs aux paramètres d'importation. Utilisez les mêmes littéraux que ceux utilisés précédemment pour définir les attributs de cette instance.
Supprimez ou commentez l'accès direct aux attributs d'instance pour cette instance.
Gérez l'exception. Entourez l'appel de méthode avec TRY. et ENDTRY.. Ajoutez un blocage CATCH-Block pour traiter l'exception CX_ABAP_INVALID_VALUE. Assurez-vous que la nouvelle instance n'est ajoutée aux connexions de tables internes que si l'appel de méthode a réussi.
Supprimez les commentaires de la ligne de code générée CATCH cx_abap_invalid_value..
Ajoutez TRY. avant l'appel de la méthode.
Ajoutez ENDTRY. après l'instruction CATCH.
Entre l'instruction CATCH et l'instruction ENDTRY add out->write( `Method call failed` ).
Déplacez l'instruction APPEND vers le haut entre l'appel de méthode et l'instruction CATCH.
L'appel complet de la méthode doit maintenant ressembler à ceci :
1234567891011121314151617
TRY.
connection->set_attributes(
EXPORTING
i_carrier_id = 'LH'
i_connection_id = '0400'
).
* connection->carrier_id = 'LH'.
* connection->connection_id = '0400'.
APPEND connection TO connections.
CATCH cx_abap_invalid_value.
out->write( `Method call failed` ).
ENDTRY.
Répétez l'étape précédente pour les deux autres instances de la classe lcl_connection.
Après cette étape, l'implémentation de la méthode if_oo_adt_classrun~main doit ressembler à ceci :
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
METHOD if_oo_adt_classrun~main.
DATA connection TYPE REF TO lcl_connection.
DATA connections TYPE TABLE OF REF TO lcl_connection.
* First Instance
**********************************************************************
connection = NEW #( ).
TRY.
connection->set_attributes(
EXPORTING
i_carrier_id = 'LH'
i_connection_id = '0400'
).
* connection->carrier_id = 'LH'.
* connection->connection_id = '0400'.
APPEND connection TO connections.
CATCH cx_abap_invalid_value.
out->write( `Method call failed` ).
ENDTRY.
* Second instance
**********************************************************************
connection = NEW #( ).
TRY.
connection->set_attributes(
EXPORTING
i_carrier_id = 'AA'
i_connection_id = '0017'
).
* connection->carrier_id = 'AA'.
* connection->connection_id = '0017'.
APPEND connection TO connections.
CATCH cx_abap_invalid_value.
out->write( `Method call failed` ).
ENDTRY.
* Third instance
**********************************************************************
connection = NEW #( ).
TRY.
connection->set_attributes(
EXPORTING
i_carrier_id = 'SQ'
i_connection_id = '0001'
).
* connection->carrier_id = 'SQ'.
* connection->connection_id = '0001'.
APPEND connection TO connections.
CATCH cx_abap_invalid_value.
out->write( `Method call failed` ).
ENDTRY.
* Output
**********************************************************************
LOOP AT connections INTO connection.
out->write( connection->get_output( ) ).
ENDLOOP.
ENDMETHOD.
Activez la classe. Exécutez-la et déboguez les appels de méthode.
Appuyez sur Ctrl + F3 pour activer la classe.
Appuyez sur F9 pour exécuter la classe.