Publiée le October 16, 2008 16:06

| nombre de lecture : 10665
|
Suite à la demande d'un utilisateur, je présente ici la création d'un table control avec sélection de lignes et traitement de celles-ci.
Je vais jouer ici avec la suppression des lignes sélectionnées, mais vous pourrez faire ce que vous voulez avec quelques modifications (Ajout, Edition, etc...)
Présentation des écrans de la création d'un table control via l'assistant :
Etape 1 : Création et Nommage du table control
|
|

Etape 2 : Sélection de la table interne et sa structure

Etape 3 : Sélection des champs à afficher
Attention à ne pas sélectionner le champ "SEL".

Etape 4 : Insertion du champ de sélection (SEL)
Vous pouvez sélectionner "Multiple" si vous souhaitez sélectionner plusieurs ligne en même temps.

Etape 5 : Sélection des Includes où envoyer les modules et déclarations générés automatiquement

Présentation du code du programme (ZAGE_TEST_09) :
Avant la création du table control il suffit juste de créer les INCLUDE et de créer la table interne (t_soc) et sa sctructure (s_soc).
REPORT zage_test_09.
* Déclarations :
INCLUDE zage_test_09_top.
* Procédures
INCLUDE zage_test_09_form.
* Modules Ecran
INCLUDE zage_test_09_pbo.
INCLUDE zage_test_09_pai.
Détails par INCLUDE :
*&---------------------------------------------------------------------*
*& Include ZAGE_TEST_09_TOP *
*&---------------------------------------------------------------------*
*Déclaration des Types de structure :
TYPES : BEGIN OF ts_soc,
bukrs TYPE t001-bukrs,
land1 TYPE t001-land1,
sel TYPE c,
END OF ts_soc.
* Déclaration des structures et des tables internes :
DATA : s_soc TYPE ts_soc,
t_soc TYPE STANDARD TABLE OF ts_soc.
* Déclaration générée par l'assistant.
* Déclaration du tablecontrol 'TAB_CONTROL1'
CONTROLS: tab_control1 TYPE TABLEVIEW USING SCREEN 1000.
* Ligne du tablecontrol 'TAB_CONTROL'
DATA: g_soc_lines LIKE sy-loopc.
Dans le cas présent il n'y rien dans l'include FORM, mais libre à vous d'y insérer ce que vous souhaitez.
*&---------------------------------------------------------------------*
*& Include ZAGE_TEST_09_PBO *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_1000 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_1000 OUTPUT.
SET PF-STATUS 'STATUT_1000'.
SET TITLEBAR 'TITRE_1000'.
IF t_soc[] IS INITIAL.
LOOP AT SCREEN.
IF screen-group1 = '100'. "seul le bouton "Supprimer" est concerné dans mon exemple
screen-invisible = '1'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
* Récupération des donneés
SELECT bukrs land1 INTO TABLE t_soc
FROM t001.
IF sy-subrc IS INITIAL.
* Tri de la table par pays
SORT t_soc BY land1.
* Une ligne par pays
DELETE ADJACENT DUPLICATES FROM t_soc COMPARING land1.
ENDIF.
ELSE.
LOOP AT SCREEN.
IF screen-group1 = '100'.
screen-invisible = '0'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
ENDMODULE. " STATUS_1000 OUTPUT
*&spwizard: output module for tc 'TAB_CONTROL1'. do not change this line
*&spwizard: update lines for equivalent scrollbar
MODULE tab_control1_change_tc_attr OUTPUT.
DESCRIBE TABLE t_soc LINES tab_control1-lines.
ENDMODULE. "TAB_CONTROL1_change_tc_attr OUTPUT
*----------------------------------------------------------------------*
* MODULE tab_get_lines OUTPUT
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE tab_get_lines OUTPUT.
g_soc_lines = sy-loopc.
ENDMODULE. "tab_get_lines OUTPUT
__________________________________________________________________________________
*&---------------------------------------------------------------------*
*& Include ZAGE_TEST_09_PAI *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_1000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_1000 INPUT.
CASE sy-ucomm.
WHEN 'EXIT' OR 'BACK'.
REFRESH t_soc.
CLEAR : s_soc, sy-ucomm.
LEAVE TO SCREEN 0.
WHEN 'DELETE'.
CLEAR : sy-ucomm.
DELETE t_soc WHERE sel = 'X'.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " USER_COMMAND_1000 INPUT
*&spwizard: input modul for tc 'TAB_CONTROL1'. do not change this line!
*&spwizard: mark table
MODULE tab_control1_mark INPUT.
DATA: g_tab_control1_wa2 LIKE LINE OF t_soc.
IF tab_control1-line_sel_mode = 1 AND s_soc-sel = 'X'.
LOOP AT t_soc INTO g_tab_control1_wa2 WHERE sel = 'X'.
g_tab_control1_wa2-sel = ''.
MODIFY t_soc FROM g_tab_control1_wa2 TRANSPORTING sel.
ENDLOOP.
ENDIF.
MODIFY t_soc FROM s_soc INDEX tab_control1-current_line
TRANSPORTING sel.
ENDMODULE. "TAB_CONTROL1_mark INPUT
Dans mon exemple, tous les contenu des modules PBO et PAI ont été alimentés par l'assistant du table control.
Enfin voici la présentation du dynpro :
Logic d'exécution :
PROCESS BEFORE OUTPUT.
MODULE tab_control1_change_tc_attr.
LOOP AT t_soc INTO s_soc
WITH CONTROL tab_control1
CURSOR tab_control1-current_line.
MODULE tab_get_lines.
ENDLOOP.
MODULE status_1000.
PROCESS AFTER INPUT.
LOOP AT t_soc.
CHAIN.
FIELD s_soc-bukrs.
FIELD s_soc-land1.
ENDCHAIN.
FIELD s_soc-sel
MODULE tab_control1_mark ON REQUEST.
ENDLOOP.
MODULE user_command_1000.
Voici le dynpro au final :

Suivant les commentaires apportés, j'ajouterai des explications si nécessaire.