Vous êtes sur la page 1sur 27

[ABAP] Zones de textes multi-lignes

Bonjour à toi cher lecteur.

Suite à un sujet lancé sur le forum pour savoir si la création d'une zone de texte multi-ligne sur un
dynpro était possible et si oui, comment? On m'a suggéré, fin Devenherbe devrais-je dire, d'écrire
un article avec tout ce que je savais afin d'aider ceux qui souhaiteraient mettre ce genre de
composants sur un écran.

La première question à laquelle répondre est : "Est-ce possible?"


Et je vais répondre tout simplement : Oui

Alors je vais mettre en image deux solutions possibles :


− Une médiocre

Ce n'est qu'une succession de champs texte uni-ligne, mais ce n'est pas beau à l'écran et c'est un
peu ennuyant (pour être poli) à mettre en place car ce sont quatre champs texte qui portent des
noms différents et qu'il va falloir gérer individuellement... Je te laisse imaginer un peu la misère.

− Une qui correspond plus à notre besoin

On peut voir facilement que c'est une zone de texte avec le "Hello World" qui j'ai écris à
l'intérieur et si tu es très observateur, tu remarqueras facilement que c'est le même type de
composant qui est utilisé pour l'éditeur ABAP (SE38 ou SE80) sur ECC5 en tout cas, je ne sais
pas si ça a changé sur ECC6, je le saurais lors d'une prochaine montée de version.

Deuxième question à laquelle répondre : "Comment fait-on pour ajouter ce composant à un


écran de sélection ou un dynpro ??".

Alors de suite, il faut savoir que ce genre de composants ne peut être ajouté que sur un dynpro et
non sur un écran de sélection. Sur un écran de sélection, ce n'est pas possible et il n'a aucune utilité,
car comme son nom l'indique, un écran de sélection permet de renseigner des données pour
conditionner les requêtes sur les tables de la Base de Données principalement.

Afin d'implémenter ce genre de composants, on va faire de l'ABAP OO (Orienté Objet), mais je


tiens à rassurer ceux qui commencent à angoisser, l'ABAP OO n'est pas compliqué mais c'est sur
que c'est plus facile à comprendre si on a acquis certaines bases en programmation OO.

Je vais commencer par créer un programme de test, puis le dynpro et pour finir, le composant avec
quelques traitements qui permettront de le remplir et de récupérer le contenu.

Pour créer le programme, rien de compliqué, on lance soit la SE38 ou la SE80, on renseigne un nom
de programme commençant par 'Z' (ou 'Y', SAP oblige). De mon coté j'ai créé le programme
'ZTEST_TEXTEDIT', oui je suis très inspiré le soir quand l'heure de débaucher arrive.

Maintenant que mon programme est prêt, il ne me reste plus qu'à créer le dynpro, disons le dynpro
0100.

Etape 1 : Création du dynpro

(Cette partie concerne la création d'un dynpro, pour ceux qui maitrisent cette
étape, passer à la partie suivante.)

Alors deux solutions possibles :


- La première est décrire dans le programme le START-OF-SELECTION. Puis CALL SCREEN
100. Double cliquer sur le 100 et l'éditeur ABAP propose (normalement) de créer l'écran 100 s'il
n'existe pas.

- La deuxième consiste à afficher la liste d'objet (apparaît automatiquement avec la SE80) en


appuyant sur le bouton prévu à cet effet ou alors de faire Ctrl + Maj + F5.
Puis faire un clic droit sur le nom du programme, Créer=>Dynpro.
Un fois que le dynpro est prêt, de suite on va configurer les bouton de la barre de menu pour quitter
l'écran sinon on sera bloqué dès que le programme sera lancé.

Dans la logique d'exécution (Onglet "Log. exec." ) du dynpro tu devrais voir cela :
Code
PROCESS BEFORE OUTPUT.
* MODULE STATUS_0100.

*
PROCESS AFTER INPUT.

* MODULE USER_COMMAND_0100.

Au cas où tu n'aurais que peu, voire pas du tout, de connaissance dans les dynpros, je vais
t'expliquer en gros ce que signifient "PROCESS BEFORE OUTPUT" et "PROCESS AFTER
INPUT." car il faut comprendre cela pour savoir comment on va pouvoir gérer notre futur zone de
texte.

Le PROCESS BEFORE OUTPUT, communément appelé PBO, contiendra les Modules qui devront
être exécutés avant l'affichage de l'écran. Ici, il sera utile d'y insérer l'initialisation de nos
composants, mais nous y reviendront plus tard.

Le PROCESS AFTER INPUT., communément appelé PAI, contiendra quant à lui tout les Modules
qui devront s'exécuter suite à une action fait sur l'écran par l'utilisateur.

Il y a deux autres PROCESS qui existent, le POV (ON VALUE-REQUEST) et le POH (ON HELP-
REQUEST), mais ils ne nous concernent pas ici.

Commencer par décommenter l'appel du Module STATUS_0100 double cliquer dessus pour le
créer. Personnellement j'ai la fâcheuse (pour certains) manie de tout mettre dans un Include à
chaque type de Module donc je vais créer mon Module dans un Include ZTEST_TEXTEDIT_PBO
pour les Modules OUTPUT et ZTEST_TEXTEDIT_PAI pour les Modules INPUT.

On va se retrouver avec un Module comme ci-dessous :

Code
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STATUS'.
* SET TITLEBAR 'xxx'.

ENDMODULE. " STATUS_0100 OUTPUT

En double cliquant sur STATUS, on confirme la création et on arrive sur un nouvel écran.

Il faut remplir au minimum les éléments comme ci-dessus. Puis de cliquer sur chaque icône pour
enfin choisir le type d'action à effectuer et on mettra le Type 'E' pour EXIT-COMMAND
On active le STATUS GUI et l'Include PBO et on revient dans la Log. exec.

Cette fois on va rajouter un Module spécifique dans la PAI, le M900_USER_EXIT.

Code
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.

*
PROCESS AFTER INPUT.

MODULE m900_user_exit AT EXIT-COMMAND.

* MODULE USER_COMMAND_0100.

Le 'AT EXIT-COMMAND' permet de spécifier que le Module ne sera exécuté que lors d'une
commande pour quitter l'écran.

On créé le Module dans l'Include PAI comme ci-dessous :

Code
*&---------------------------------------------------------------------*
*& Module M900_USER_EXIT INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE m900_user_exit INPUT.

SET SCREEN 0.
LEAVE PROGRAM.

ENDMODULE. " M900_USER_EXIT INPUT

Ceci fait, on va pouvoir quitter l'écran avec des actions basiques.


Etape 2 : Ajout du composant dans le dynpro

Pour ajouter une zone de texte sur un dynpro, il faut en fait ajouter un conteneur (comme pour les
ALV LVC si certains connaissent). Le composant est un "Custom Control".

Pour ajouter un "Custom Control", qui sera notre conteneur, faire comme suit:

Avec éditeur traditionnel :

Définir la fin du bloque pour le conteneur en sélectionnant l'endroit sur la zone de couleur (en rouge
pour moi) et cliquer sur 'Marquer fin contrôle'.

Et définir ses attributs, dont le nom du conteneur, pour moi c'est 'CONTAINER'
Et voilà notre composant placé.
On revient en arrière et c'est fini.

Avec le nouvel éditeur graphique


C'est beaucoup plus simple, et si vous avez la possibilité de le faire avec le nouvel éditeur alors je le
conseil vivement. Les utilisateurs de Visual Studio devraient apprécier.
Sur la barre d'outils à gauche, il y a un bouton "Custom control". Sélectionner ce composant et le
placer sur le dynpro.

Une fois le composant placé, il apparaît comme ci-dessous sur le dynpro (dans l'éditeur, quand le
programme est lancé, rien n'apparait pour l'instant).
Une fois le composant placé, lui affecter un nom soit dans la barre du haut (qui devrait devenir
rouge si le conteneur est sélectionné soit en double-cliquant sur ce dernier pour faire apparaître la
fenêtre des attributs.
On lui donne un nom, pour moi c'est 'CONTAINER'. On enregistre et on active.

Voilà, pour le dynpro, c'est fini.

Maintenant, il va falloir dire dans notre programme que ce conteneur va servir à afficher une zone
de texte. Et c'est à partir de maintenant que l'on va rentrer dans du développement ABAP OO.

Comme toutes recettes de cuisines, il va nous falloir des ingrédients qu'on va placer dans notre
Include TOP.

Code
*&---------------------------------------------------------------------*
*& Include ZTEST_TEXTEDIT_TOP
*&
*&---------------------------------------------------------------------*

DATA : g_conteneur TYPE REF TO cl_gui_custom_container,


g_editeur TYPE REF TO cl_gui_textedit.

DATA : w_container TYPE feld-name VALUE 'CONTAINER',


w_repid TYPE sy-repid VALUE sy-repid,
w_dynnr TYPE sy-dynnr VALUE '0100'.

DATA : s_tdline TYPE tdline,


t_tdline LIKE TABLE OF s_tdline.

Alors, peut-être une instruction qui est nouvelle pour toi, c'est l'instruction TYPE REF TO. En fait
cette instruction permet de dire que cette variable sera une instance de classe, une instance doit être
comprise comme un objet image de la classe.

J'ai définit :
- une variable g_conteneur qui sera une instance de la classe CL_GUI_CUSTOM_CONTAINER,
cette variable, ou objet, va permettre de gérer notre conteneur placé sur le dynpro
- une variable g_editeur qui sera une instance de la classe CL_GUI_TEXTEDIT, cette variable sera
notre zone de texte.
- une structure de type TDLINE qui sera une ligne de notre zone de texte avec la table qui va avec.
- je n'aime pas trop les valeurs rentrées en dur dans un programme donc j'ai ajouté des variables
avec les valeurs souhaitées.

Revenons sur nos instances g_conteneur et g_editeur, pour l'instant elles ne sont pas utilisable...
Pourquoi ?? Tout simplement parce que cette simple déclaration ne suffit pas à créer des objets, il
va falloir également les initialiser avec des attributs. Par exemple, dire à g_conteneur qu'il va devoir
gérer le conteneur 'CONTAINER' du dynpro 0100 et dire à g_éditeur dans quel conteneur il va
devoir se placer.

En gros, je vais donner un exemple (avec la classe CL_GUI_TEXTEDIT) pour ceux qui sont
habitués à un langage proche du C#/Java.
La déclaration revient à faire :
CL_GUI_TEXTEDIT g_editeur;
Mais avec cette simple déclaration, g_editeur = null.

Pour initialiser un objet, on le fait à la déclaration ou plus tard dans le traitement comme ci-dessous:
CL_GUI_TEXTEDIT g_editeur = new CL_GUI_TEXTEDIT();
Ou
CL_GUI_TEXTEDIT g_editeur;
g_editeur = new CL_GUI_TEXTEDIT();

Pour initialiser un objet, il faut utiliser l'instruction CREATE OBJECT, qui revient à faire le new vu
au-dessus. Seulement cette instruction diffère d'un objet à un autre, pour ne pas se tromper, on a
meilleur temps de passer par les modèles ABAP (Ctrl + F6), dans la section 'Modèles
objets ABAP', on peut générer facilement cette instruction en passant par cet outil.

Je pense que tu auras deviné facilement que cette instruction est à placer dans le PBO. On va donc y
placer un nouveau Module.

Code
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.

MODULE m000_init_screen.
*
PROCESS AFTER INPUT.

MODULE m900_user_exit AT EXIT-COMMAND.

* MODULE USER_COMMAND_0100.

Et dans l'include PBO

*&---------------------------------------------------------------------*
*& Module M000_DYNP_INIT OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE m000_dynp_init OUTPUT.

IF g_container IS INITIAL.

CREATE OBJECT g_conteneur


EXPORTING
* PARENT =
container_name = w_container
* STYLE =
* LIFETIME = LIFETIME_DEFAULT
repid = w_repid
dynnr = w_dynnr
* NO_AUTODEF_PROGID_DYNNR =
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDIF.

IF g_editeur IS INITIAL AND


NOT g_conteneur IS INITIAL.

CREATE OBJECT g_editeur


EXPORTING
* MAX_NUMBER_CHARS =
* STYLE = 0
* WORDWRAP_MODE = WORDWRAP_AT_WINDOWBORDER
* WORDWRAP_POSITION = -1
* WORDWRAP_TO_LINEBREAK_MODE = FALSE
* FILEDROP_MODE = DROPFILE_EVENT_OFF
parent = g_conteneur
* LIFETIME =
* NAME =
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
gui_type_not_supported = 5
OTHERS = 6
.
IF NOT sy-subrc IS INITIAL .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDIF.

ENDMODULE. " M000_DYNP_INIT OUTPUT

Note la présence des conditions IF. ENDIF. Pour tester si l'objet à déjà été instancié (créé). On ne va
pas réinitialiser l'objet avant chaque affichage de l'écran, surtout que l'objet vit après son
instanciation et donc ses attributs changent et on risquerait de les perdre. Donc on initialise l'objet
une seule fois.
Sinon pour g_conteneur, tu peux voir que je lui indique qu'il pointe vers le conteneur
'CONTAINER' du dynpro 100 du programme ZTEST_TEXTEDIT.
Et pour g_editeur, on lui dit que son 'parent' c'est à dire son composant père où il doit aller se placer
est l'objet g_conteneur pointant vers le composant de l'écran.

Un schéma simple donnerait :

G_EDITEUR G_CONTENEUR CONTAINER

En lançant le programme, tu devrais voir l'écran suivant avec la zone de texte.


Si rien ne s'affiche, regarde bien si tu as mis le CALL SCREEN 100. dans ton START-OF-
SELECTION.
Tu devrais avoir un programme principal se présentant comme ci dessous.

Code
*&---------------------------------------------------------------------*
*& Report ZTEST_TEXTEDIT
*&
*&---------------------------------------------------------------------*
*& Programme de test Zone de texte avec ligne multiple
*&
*&---------------------------------------------------------------------*

REPORT ztest_textedit.

INCLUDE ztest_textedit_top. " Global Data


INCLUDE ztest_textedit_pbo. " PBO-Modules
INCLUDE ztest_textedit_pai. " PAI-Modules
*INCLUDE ZTEST_TEXTEDIT_F01. " FORM-Routines

START-OF-SELECTION.

CALL SCREEN 100.

Etape 3 : Travailler avec une zone de texte

Maintenant, le but est d'y insérer ou de récupérer du texte.


Pour ça, on va utiliser des méthodes de la classe CL_GUI_TEXTEDIT et c'est par le biais de notre
objet g_editeur que ça va se faire.

On va mettre en place un traitement tout simple, mettre un texte par défaut dans la zone de texte au
lancement du programme. Et on va utiliser la méthode 'SET_TEXT_AS_R3TABLE'

Pour cela on va mettre un nouveau module dans le PBO.

Code
*&---------------------------------------------------------------------*
*& Module M100_FILL_CNT OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE m100_fill_cnt OUTPUT.

CLEAR s_tdline.
REFRESH t_tdline.

s_tdline = 'Hello World'.


APPEND s_tdline TO t_tdline.

CALL METHOD g_editeur->set_text_as_r3table


EXPORTING
table = t_tdline
EXCEPTIONS
ERROR_DP = 1
ERROR_DP_CREATE = 2
others = 3
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ENDMODULE. " M100_FILL_CNT OUTPUT

Et ça va normalement nous mettre le texte "Hello World" dans la zone de texte.


Bingo, ça marche !!!

Maintenant, si je te propose de récupérer le texte d'une zone de texte et de la mettre dans une autre
zone de texte.
Et après l'appui sur le bouton.
Pour cela j'ai crée un bouton avec le code fonction 'TRA' et un deuxième conteneur et donc j'ai crée
un g_conteneur2 et un g_editeur2.

La procédure est la même pour afficher la deuxième zone de texte à l'écran donc revenir au début de
cette partie si jamais.

Maintenant pour alimenter la deuxième zone de texte c'est en fait très simple, il existe une méthode
permettant de récupérer le texte. C'est 'GET_TEXT_AS_R3TABLE', je pense que c'était facile à
prévoir pour ceux dont les Getters et les Setters sont familiers.
Il va donc falloir capturer l'action faite sur le bouton et faire nos traitements.
On va donc rajouter le module USER_COMMAND_0100 dans le PAI du dynpro.

Code
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

* Selon le code fonction


CASE sy-ucomm.

WHEN 'TRA'.
PERFORM f100_transfert.

WHEN OTHERS.
* Ne rien faire

ENDCASE. "sy-ucomm

ENDMODULE. " USER_COMMAND_0100 INPUT

Et dans l'include des routines.

Code
*&---------------------------------------------------------------------*
*& Form F100_TRANSFERT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f100_transfert .

DATA : ls_tdline TYPE tdline,


lt_tdline LIKE TABLE OF ls_tdline.

CALL METHOD g_editeur->get_text_as_r3table


* EXPORTING
* ONLY_WHEN_MODIFIED = FALSE
IMPORTING
table = lt_tdline
* IS_MODIFIED =
EXCEPTIONS
error_dp = 1
error_cntl_call_method = 2
error_dp_create = 3
potential_data_loss = 4
OTHERS = 5
.
IF NOT sy-subrc IS INITIAL.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
CALL METHOD g_editeur2->set_text_as_r3table
EXPORTING
table = lt_tdline
EXCEPTIONS
error_dp = 1
error_dp_create = 2
OTHERS = 3.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ENDFORM. " F100_TRANSFERT

Et voilà, on arrive au résultat attendu.

Je crois que ça suffira pour les bases sur les zones de texte multi-lignes et surtout ça prouve bien
que c'est possible. Mais il ne faut pas s'enflammer pour autant, ça reste un composant à utiliser
quand dans certains cas particuliers.

Tu peux également aller explorer la classe CL_GUI_TEXTEDIT par le biais de la transaction SE24
pour voir toutes les méthodes qui sont mises à notre disposition pour gérer la zone de texte.
Notamment tu peux enlever la barre d'outils et la barre de statut.

Voila.

Bon courage pour la suite.

Cordialement,
Celdrøn.

Je mets le code source ci-dessous:

*&---------------------------------------------------------------------*
*& Report ZTEST_TEXTEDIT
*&
*&---------------------------------------------------------------------*
*& Programme de test Zone édition ligne multiple
*&
*&---------------------------------------------------------------------*

REPORT ztest_textedit.

INCLUDE ztest_textedit_top . " Global Data


INCLUDE ztest_textedit_pbo . " PBO-Modules
INCLUDE ztest_textedit_pai . " PAI-Modules
INCLUDE ztest_textedit_f01 . " FORM-Routines
START-OF-SELECTION.

CALL SCREEN 100.

*&---------------------------------------------------------------------*
*& Include ZTEST_TEXTEDIT_TOP
*&
*&---------------------------------------------------------------------*

DATA : g_conteneur TYPE REF TO cl_gui_custom_container,


g_editeur TYPE REF TO cl_gui_textedit.

DATA : g_conteneur2 TYPE REF TO cl_gui_custom_container,


g_editeur2 TYPE REF TO cl_gui_textedit.

DATA : w_container TYPE feld-name VALUE 'CONTAINER',


w_container2 TYPE feld-name VALUE 'CONTAINER2',
w_repid TYPE sy-repid VALUE sy-repid,
w_dynnr TYPE sy-dynnr VALUE '0100'.

DATA : s_tdline TYPE tdline,


t_tdline LIKE TABLE OF s_tdline.

*&---------------------------------------------------------------------*
*& Include ZTEST_TEXTEDIT_PBO
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& Module M000_DYNP_INIT OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE m000_dynp_init OUTPUT.

PERFORM f000_create_n_init_textedit USING w_container


g_conteneur
g_editeur.

PERFORM f000_create_n_init_textedit USING w_container2


g_conteneur2
g_editeur2.

ENDMODULE. " M000_DYNP_INIT OUTPUT

*&---------------------------------------------------------------------*
*& Module M100_FILL_CNT OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE m100_fill_cnt OUTPUT.

CLEAR s_tdline.
REFRESH t_tdline.

s_tdline = 'Hello World'.


APPEND s_tdline TO t_tdline.
CALL METHOD g_editeur->set_text_as_r3table
EXPORTING
table = t_tdline
EXCEPTIONS
ERROR_DP = 1
ERROR_DP_CREATE = 2
others = 3
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ENDMODULE. " M100_FILL_CNT OUTPUT

*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STATUS'.
* SET TITLEBAR 'xxx'.

ENDMODULE. " STATUS_0100 OUTPUT

*&---------------------------------------------------------------------*
*& Include ZTEST_TEXTEDIT_PAI
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& Module M900_USER_EXIT INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE m900_user_exit INPUT.

SET SCREEN 0.
LEAVE PROGRAM.

ENDMODULE. " M900_USER_EXIT INPUT


*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

CASE sy-ucomm.

WHEN 'TRA'.
PERFORM f100_transfert.

WHEN OTHERS.
* Ne rien faire

ENDCASE.

ENDMODULE. " USER_COMMAND_0100 INPUT


*&---------------------------------------------------------------------*
*& Include ZTEST_TEXTEDIT_F01
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& Form F000_CREATE_N_INIT_TEXTEDIT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f000_create_n_init_textedit USING p_container TYPE feld-name
p_conteneur LIKE g_conteneur
p_editeur LIKE g_editeur.

IF p_conteneur IS INITIAL.

CREATE OBJECT p_conteneur


EXPORTING
* PARENT =
container_name = p_container
* STYLE =
* LIFETIME = lifetime_default
repid = w_repid
dynnr = w_dynnr
* NO_AUTODEF_PROGID_DYNNR =
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDIF.

IF p_editeur IS INITIAL AND


NOT p_conteneur IS INITIAL.

CREATE OBJECT p_editeur


EXPORTING
* MAX_NUMBER_CHARS =
* STYLE = 0
* WORDWRAP_MODE = WORDWRAP_AT_WINDOWBORDER
* WORDWRAP_POSITION = -1
* WORDWRAP_TO_LINEBREAK_MODE = FALSE
* FILEDROP_MODE = DROPFILE_EVENT_OFF
parent = p_conteneur
* LIFETIME =
* NAME =
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
gui_type_not_supported = 5
OTHERS = 6
.
IF NOT sy-subrc IS INITIAL .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDIF.

ENDFORM. " F000_CREATE_N_INIT_TEXTEDIT

*&---------------------------------------------------------------------*
*& Form F100_TRANSFERT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f100_transfert .

DATA : ls_tdline TYPE tdline,


lt_tdline LIKE TABLE OF ls_tdline.

CALL METHOD g_editeur->get_text_as_r3table


* EXPORTING
* ONLY_WHEN_MODIFIED = FALSE
IMPORTING
table = lt_tdline
* IS_MODIFIED =
EXCEPTIONS
error_dp = 1
error_cntl_call_method = 2
error_dp_create = 3
potential_data_loss = 4
OTHERS = 5
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

CALL METHOD g_editeur2->set_text_as_r3table


EXPORTING
table = lt_tdline
EXCEPTIONS
error_dp = 1
error_dp_create = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ENDFORM. " F100_TRANSFERT

*&---------------------------------------------------------------------*
*& Logique d'exécution de l'écran 100.
*&---------------------------------------------------------------------*
PROCESS BEFORE OUTPUT.
MODULE status_0100.

MODULE m000_dynp_init.

* MODULE m100_fill_cnt.

*
PROCESS AFTER INPUT.

MODULE m900_user_exit AT EXIT-COMMAND.

MODULE user_command_0100.

Vous aimerez peut-être aussi