ABAP Search Helps : Aide F4, Elementary et Collective

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

Les Search Helps (aides à la recherche) fournissent une aide de sélection F4 pour les champs de saisie. Elles peuvent être définies dans le Data Dictionary ou créées de manière programmatique et aident les utilisateurs à sélectionner des valeurs valides.

Types d’aides à la recherche

TypeDescription
ElementaryAide à la recherche simple sur une table/vue
CollectiveCollection de plusieurs aides Elementary
ExitAide à la recherche programmatique avec code ABAP
AppendExtension d’aides à la recherche existantes

Exemples

1. Elementary Search Help (SE11)

Transaction : SE11 -> Aide à la recherche
Nom : ZSH_CUSTOMER
Propriétés :
- Méthode de sélection : KNA1 (Table)
- Type de dialogue : Standard
Paramètres :
| Champ SHLP | Import | Export | LPos | SPos | Élém. données |
|------------|--------|--------|------|------|---------------|
| KUNNR | X | X | 1 | 1 | KUNNR |
| NAME1 | | | 2 | 2 | NAME1_GP |
| ORT01 | | | 3 | 3 | ORT01_GP |
| LAND1 | X | | 4 | 4 | LAND1_GP |

2. Lier l’aide à la recherche à un élément de données

Dans SE11 -> Ouvrir l'élément de données :
Onglet : Autres propriétés
- Aide à la recherche : ZSH_CUSTOMER
- Paramètre : KUNNR

3. Lier l’aide à la recherche à un champ de table

Dans SE11 -> Ouvrir la table :
Champ KUNNR :
- Aide à la recherche : ZSH_CUSTOMER
- Paramètre aide à la recherche : KUNNR

4. Collective Search Help

Transaction : SE11 -> Aide à la recherche
Nom : ZSH_CUSTOMER_COLL (Collective)
Aides à la recherche incluses :
| Aide à la recherche | Affectation paramètres |
|----------------------|------------------------|
| ZSH_CUST_BY_ID | KUNNR -> KUNNR |
| ZSH_CUST_BY_NAME | NAME1 -> NAME1 |
| ZSH_CUST_BY_CITY | ORT01 -> ORT01 |

5. Aide F4 programmatique

PARAMETERS: p_matnr TYPE matnr.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_matnr.
DATA: lt_return TYPE TABLE OF ddshretval,
lt_dynpfields TYPE TABLE OF dynpread,
lv_matnr TYPE matnr.
" Appeler l'aide F4
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST"
EXPORTING
tabname = 'MARA"
fieldname = 'MATNR"
searchhelp = 'MAT1' " Aide à la recherche standard Material
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'P_MATNR"
TABLES
return_tab = lt_return
EXCEPTIONS
field_not_found = 1
no_help_for_field = 2
inconsistent_help = 3
no_values_found = 4
OTHERS = 5.
IF sy-subrc = 0 AND lt_return IS NOT INITIAL.
p_matnr = lt_return[ 1 ]-fieldval.
ENDIF.

6. Aide F4 avec liste de valeurs personnalisée

PARAMETERS: p_status TYPE char1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_status.
DATA: lt_values TYPE TABLE OF ddshretval.
" Liste de valeurs personnalisée
DATA: BEGIN OF lt_status OCCURS 0,
value TYPE char1,
text TYPE char40,
END OF lt_status.
lt_status = VALUE #(
( value = 'A' text = 'Actif' )
( value = 'I' text = 'Inactif' )
( value = 'B' text = 'Bloqué' )
( value = 'D' text = 'Supprimé' )
).
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST"
EXPORTING
retfield = 'VALUE"
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'P_STATUS"
value_org = 'S' " Structure
TABLES
value_tab = lt_status
return_tab = lt_values
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc = 0 AND lt_values IS NOT INITIAL.
p_status = lt_values[ 1 ]-fieldval.
ENDIF.

7. Search Help Exit

" Module fonctionnel : ZSH_EXIT_CUSTOMER
" Inscrit comme Exit dans l'aide à la recherche
FUNCTION zsh_exit_customer.
*"----------------------------------------------------------------------
*"*"Interface locale :
*" TABLES
*" SHLP_TAB TYPE SHLP_DESCR_TAB_T
*" RECORD_TAB STRUCTURE SEAHLPRES
*" CHANGING
*" VALUE(SHLP) TYPE SHLP_DESCR_T
*" VALUE(CALLCONTROL) LIKE DDSHF4CTRL STRUCTURE DDSHF4CTRL
*"----------------------------------------------------------------------
DATA: lt_results TYPE TABLE OF seahlpres.
CASE callcontrol-step.
WHEN 'SELONE'.
" Avant affichage : Une seule entrée -> reprendre directement
WHEN 'SELECT'.
" Sélectionner les données
" Appliquer des filtres supplémentaires
" Filtrer le résultat (ex. seulement clients actifs)
DELETE record_tab WHERE ( field = 'SPERR' AND value <> space ).
WHEN 'DISP'.
" Avant l'affichage du dialogue
WHEN 'RETURN'.
" Après sélection, avant retour
" Remplir des champs supplémentaires
ENDCASE.
ENDFUNCTION.

8. Aide à la recherche dynamique

CLASS zcl_dynamic_f4 DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: show_f4
IMPORTING iv_table TYPE tabname
iv_field TYPE fieldname
iv_where TYPE string OPTIONAL
RETURNING VALUE(rv_value) TYPE string.
CLASS-METHODS: show_f4_for_internal_table
IMPORTING it_values TYPE ANY TABLE
iv_return_field TYPE fieldname
RETURNING VALUE(rv_value) TYPE string.
ENDCLASS.
CLASS zcl_dynamic_f4 IMPLEMENTATION.
METHOD show_f4.
DATA: lt_return TYPE TABLE OF ddshretval,
lt_data TYPE REF TO data.
" Charger les données dynamiquement
CREATE DATA lt_data TYPE TABLE OF (iv_table).
ASSIGN lt_data->* TO FIELD-SYMBOL(<ft_data>).
IF iv_where IS INITIAL.
SELECT * FROM (iv_table)
INTO TABLE @<ft_data>
UP TO 500 ROWS.
ELSE.
SELECT * FROM (iv_table)
WHERE (iv_where)
INTO TABLE @<ft_data>
UP TO 500 ROWS.
ENDIF.
" Afficher F4
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST"
EXPORTING
retfield = iv_field
value_org = 'S"
TABLES
value_tab = <ft_data>
return_tab = lt_return
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0 AND lt_return IS NOT INITIAL.
rv_value = lt_return[ 1 ]-fieldval.
ENDIF.
ENDMETHOD.
METHOD show_f4_for_internal_table.
DATA: lt_return TYPE TABLE OF ddshretval.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST"
EXPORTING
retfield = iv_return_field
value_org = 'S"
TABLES
value_tab = it_values
return_tab = lt_return
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0 AND lt_return IS NOT INITIAL.
rv_value = lt_return[ 1 ]-fieldval.
ENDIF.
ENDMETHOD.
ENDCLASS.
" Utilisation
DATA(lv_customer) = zcl_dynamic_f4=>show_f4(
iv_table = 'KNA1"
iv_field = 'KUNNR"
iv_where = 'LAND1 = ''DE''"
).

9. Sélection multiple (Multiple Selection)

PARAMETERS: p_matnr TYPE matnr.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_matnr.
DATA: lt_return TYPE TABLE OF ddshretval.
" F4 avec sélection multiple
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST"
EXPORTING
tabname = 'MARA"
fieldname = 'MATNR"
multiple_choice = abap_true " Sélection multiple
TABLES
return_tab = lt_return
EXCEPTIONS
OTHERS = 1.
" Traiter toutes les valeurs sélectionnées
LOOP AT lt_return INTO DATA(ls_return).
" Insérer dans Range ou traiter
APPEND VALUE #(
sign = 'I"
option = 'EQ"
low = ls_return-fieldval
) TO s_matnr.
ENDLOOP.

10. Aide F4 avec dépendances

PARAMETERS: p_vkorg TYPE vkorg,
p_vtweg TYPE vtweg.
" Canal de distribution dépendant de l'organisation commerciale
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_vtweg.
DATA: lt_return TYPE TABLE OF ddshretval,
lt_mapping TYPE TABLE OF dselc,
lt_flds TYPE TABLE OF dfies.
" Mapping : Quel champ écran fournit VKORG ?
APPEND VALUE #(
fldname = 'VKORG"
dession = p_vkorg
) TO lt_mapping.
" F4 avec restriction
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST"
EXPORTING
tabname = 'TVKOV"
fieldname = 'VTWEG"
TABLES
return_tab = lt_return
dynpfld_mapping = lt_mapping
EXCEPTIONS
OTHERS = 1.
IF lt_return IS NOT INITIAL.
p_vtweg = lt_return[ 1 ]-fieldval.
ENDIF.

11. Aide à la recherche avec dialogue popup

DATA: lt_fieldcat TYPE TABLE OF dfies,
lt_data TYPE TABLE OF kna1,
lv_selected TYPE kunnr.
" Charger les données
SELECT * FROM kna1
WHERE land1 = 'DE"
INTO TABLE @lt_data
UP TO 100 ROWS.
" Créer le catalogue de champs
CALL FUNCTION 'DDIF_FIELDINFO_GET"
EXPORTING
tabname = 'KNA1"
TABLES
dfies_tab = lt_fieldcat
EXCEPTIONS
OTHERS = 1.
" Afficher seulement certains champs
DELETE lt_fieldcat WHERE fieldname NOT IN ('KUNNR', 'NAME1', 'ORT01').
" Afficher le popup
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST"
EXPORTING
retfield = 'KUNNR"
value_org = 'S"
callback_program = sy-repid
callback_form = 'F4_CALLBACK"
TABLES
value_tab = lt_data
field_tab = lt_fieldcat
return_tab = lt_return
EXCEPTIONS
OTHERS = 1.
" Form de callback pour logique supplémentaire
FORM f4_callback TABLES record_tab STRUCTURE seahlpres
CHANGING shlp TYPE shlp_descr
callcontrol LIKE ddshf4ctrl.
" Traitement supplémentaire
ENDFORM.

12. CDS View comme aide à la recherche

" CDS View avec annotation d'aide à la recherche
@AbapCatalog.viewEnhancementCategory: [#NONE]
@Search.searchable: true
define view entity ZI_CustomerSearch as select from kna1
{
@Search.defaultSearchElement: true
@Search.fuzzinessThreshold: 0.8
key kunnr as Customer,
@Search.defaultSearchElement: true
name1 as CustomerName,
ort01 as City,
land1 as Country
}
" Référencer dans l'élément de données ou le champ
" ou de manière programmatique :
SELECT FROM zi_customersearch
WHERE customername LIKE @lv_search_term
INTO TABLE @DATA(lt_results).

13. Aide à la recherche pour ALV

" Aide F4 dans ALV-Grid
DATA: lt_customers TYPE TABLE OF kna1.
" Créer ALV
cl_salv_table=>factory(
IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = lt_customers
).
" Doter la colonne de F4
DATA(lo_columns) = lo_alv->get_columns( ).
DATA(lo_column) = CAST cl_salv_column_table(
lo_columns->get_column( 'LAND1' )
).
" Aide F4 automatiquement active via l'élément de données
" Pour F4 personnalisé :
lo_column->set_f4( if_salv_c_bool_sap=>true ).
lo_column->set_f4_checktable( abap_true ).
lo_alv->display( ).

14. Append Search Help

" Étendre une aide à la recherche existante (sans modification)
Transaction : SE11 -> Aide à la recherche
1. Ouvrir l'aide à la recherche standard (ex. MAT1)
2. Extensions -> Créer une aide Append
3. Nom : ZSH_MAT1_APPEND
L'aide Append est automatiquement intégrée dans
la Collective Search Help.

15. Exemple pratique : Classe F4 complète

CLASS zcl_f4_helper DEFINITION.
PUBLIC SECTION.
" F4 générique pour n'importe quelle table
CLASS-METHODS: for_table
IMPORTING iv_table TYPE tabname
iv_field TYPE fieldname
iv_dynprog TYPE sy-repid DEFAULT sy-repid
iv_dynnr TYPE sy-dynnr DEFAULT sy-dynnr
iv_dynprofield TYPE string
RETURNING VALUE(rv_value) TYPE string.
" F4 avec liste de valeurs fixes
CLASS-METHODS: for_fixed_values
IMPORTING it_values TYPE string_table
iv_dynprog TYPE sy-repid DEFAULT sy-repid
iv_dynnr TYPE sy-dynnr DEFAULT sy-dynnr
iv_dynprofield TYPE string
RETURNING VALUE(rv_value) TYPE string.
" F4 pour clients
CLASS-METHODS: for_customer
IMPORTING iv_land1 TYPE land1 OPTIONAL
RETURNING VALUE(rv_kunnr) TYPE kunnr.
" F4 pour articles
CLASS-METHODS: for_material
IMPORTING iv_mtart TYPE mtart OPTIONAL
RETURNING VALUE(rv_matnr) TYPE matnr.
ENDCLASS.
CLASS zcl_f4_helper IMPLEMENTATION.
METHOD for_table.
DATA: lt_return TYPE TABLE OF ddshretval.
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST"
EXPORTING
tabname = iv_table
fieldname = iv_field
dynpprog = iv_dynprog
dynpnr = iv_dynnr
dynprofield = iv_dynprofield
TABLES
return_tab = lt_return
EXCEPTIONS
OTHERS = 1.
IF lt_return IS NOT INITIAL.
rv_value = lt_return[ 1 ]-fieldval.
ENDIF.
ENDMETHOD.
METHOD for_fixed_values.
DATA: lt_return TYPE TABLE OF ddshretval.
DATA: BEGIN OF lt_vals OCCURS 0,
value TYPE string,
END OF lt_vals.
LOOP AT it_values INTO DATA(lv_val).
lt_vals-value = lv_val.
APPEND lt_vals.
ENDLOOP.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST"
EXPORTING
retfield = 'VALUE"
dynpprog = iv_dynprog
dynpnr = iv_dynnr
dynprofield = iv_dynprofield
value_org = 'S"
TABLES
value_tab = lt_vals
return_tab = lt_return
EXCEPTIONS
OTHERS = 1.
IF lt_return IS NOT INITIAL.
rv_value = lt_return[ 1 ]-fieldval.
ENDIF.
ENDMETHOD.
METHOD for_customer.
DATA: lt_return TYPE TABLE OF ddshretval,
lt_customers TYPE TABLE OF kna1.
IF iv_land1 IS INITIAL.
SELECT * FROM kna1
INTO TABLE @lt_customers
UP TO 500 ROWS.
ELSE.
SELECT * FROM kna1
WHERE land1 = @iv_land1
INTO TABLE @lt_customers
UP TO 500 ROWS.
ENDIF.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST"
EXPORTING
retfield = 'KUNNR"
value_org = 'S"
TABLES
value_tab = lt_customers
return_tab = lt_return
EXCEPTIONS
OTHERS = 1.
IF lt_return IS NOT INITIAL.
rv_kunnr = lt_return[ 1 ]-fieldval.
ENDIF.
ENDMETHOD.
METHOD for_material.
DATA: lt_return TYPE TABLE OF ddshretval,
lt_materials TYPE TABLE OF mara.
IF iv_mtart IS INITIAL.
SELECT * FROM mara
INTO TABLE @lt_materials
UP TO 500 ROWS.
ELSE.
SELECT * FROM mara
WHERE mtart = @iv_mtart
INTO TABLE @lt_materials
UP TO 500 ROWS.
ENDIF.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST"
EXPORTING
retfield = 'MATNR"
value_org = 'S"
TABLES
value_tab = lt_materials
return_tab = lt_return
EXCEPTIONS
OTHERS = 1.
IF lt_return IS NOT INITIAL.
rv_matnr = lt_return[ 1 ]-fieldval.
ENDIF.
ENDMETHOD.
ENDCLASS.

Transactions importantes

TransactionDescription
SE11Data Dictionary (Aides à la recherche)
SE37Search Help Exits

Notes importantes / Bonnes pratiques

  • Elementary pour des recherches simples sur une table.
  • Collective pour plusieurs possibilités de recherche.
  • Exit pour une logique et des filtres complexes.
  • Liaison à l’élément de données pour F4 automatique.
  • F4IF_INT_TABLE_VALUE_REQUEST pour des listes de valeurs personnalisées.
  • Dépendances à mapper via dynpfld_mapping.
  • Append pour extension sans modification.
  • CDS Views avec annotations @Search.
  • Combinez avec Selection Screens pour les reports.