ABAP Search Helps: F4-Hilfe, Elementary und Collective

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

Search Helps (Suchhilfen) bieten F4-Wertehilfe für Eingabefelder. Sie können im Data Dictionary definiert oder programmatisch erstellt werden und unterstützen Benutzer bei der Auswahl gültiger Werte.

Suchhilfe-Typen

TypBeschreibung
ElementaryEinfache Suchhilfe auf einer Tabelle/View
CollectiveSammlung mehrerer Elementary-Suchhilfen
ExitProgrammatische Suchhilfe mit ABAP-Code
AppendErweiterung bestehender Suchhilfen

Beispiele

1. Elementary Search Help (SE11)

Transaktion: SE11 -> Suchhilfe
Name: ZSH_CUSTOMER
Eigenschaften:
- Selektionsmethode: KNA1 (Tabelle)
- Dialog-Typ: Standard
Parameter:
| SHLPfeld | Import | Export | LPos | SPos | Datenelem |
|----------|--------|--------|------|------|-----------|
| KUNNR | X | X | 1 | 1 | KUNNR |
| NAME1 | | | 2 | 2 | NAME1_GP |
| ORT01 | | | 3 | 3 | ORT01_GP |
| LAND1 | X | | 4 | 4 | LAND1_GP |

2. Suchhilfe an Datenelement anbinden

In SE11 -> Datenelement öffnen:
Reiter: Weitere Eigenschaften
- Suchhilfe: ZSH_CUSTOMER
- Parameter: KUNNR

3. Suchhilfe an Tabellenfeld anbinden

In SE11 -> Tabelle öffnen:
Feld KUNNR:
- Suchhilfe: ZSH_CUSTOMER
- Suchhilfe-Parameter: KUNNR

4. Collective Search Help

Transaktion: SE11 -> Suchhilfe
Name: ZSH_CUSTOMER_COLL (Collective)
Enthaltene Suchhilfen:
| Suchhilfe | Parameter-Zuordnung |
|------------------|---------------------|
| ZSH_CUST_BY_ID | KUNNR -> KUNNR |
| ZSH_CUST_BY_NAME | NAME1 -> NAME1 |
| ZSH_CUST_BY_CITY | ORT01 -> ORT01 |

5. Programmatische F4-Hilfe

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.
" F4-Hilfe aufrufen
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
EXPORTING
tabname = 'MARA'
fieldname = 'MATNR'
searchhelp = 'MAT1' " Standard Material-Suchhilfe
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. F4-Hilfe mit eigener Werteliste

PARAMETERS: p_status TYPE char1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_status.
DATA: lt_values TYPE TABLE OF ddshretval.
" Eigene Werteliste
DATA: BEGIN OF lt_status OCCURS 0,
value TYPE char1,
text TYPE char40,
END OF lt_status.
lt_status = VALUE #(
( value = 'A' text = 'Aktiv' )
( value = 'I' text = 'Inaktiv' )
( value = 'B' text = 'Gesperrt' )
( value = 'D' text = 'Gelöscht' )
).
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'VALUE'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'P_STATUS'
value_org = 'S' " Struktur
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

" Function Module: ZSH_EXIT_CUSTOMER
" Wird in Search Help als Exit eingetragen
FUNCTION zsh_exit_customer.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" 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'.
" Vor Anzeige: Nur ein Eintrag -> direkt übernehmen
WHEN 'SELECT'.
" Daten selektieren
" Zusätzliche Filter anwenden
" Ergebnis filtern (z.B. nur aktive Kunden)
DELETE record_tab WHERE ( field = 'SPERR' AND value <> space ).
WHEN 'DISP'.
" Vor Dialog-Anzeige
WHEN 'RETURN'.
" Nach Auswahl, vor Rückgabe
" Zusätzliche Felder befüllen
ENDCASE.
ENDFUNCTION.

8. Dynamische Suchhilfe

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.
" Daten dynamisch laden
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.
" F4 anzeigen
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.
" Verwendung
DATA(lv_customer) = zcl_dynamic_f4=>show_f4(
iv_table = 'KNA1'
iv_field = 'KUNNR'
iv_where = 'LAND1 = ''DE'''
).

9. Mehrfachselektion (Multiple Selection)

PARAMETERS: p_matnr TYPE matnr.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_matnr.
DATA: lt_return TYPE TABLE OF ddshretval.
" F4 mit Mehrfachauswahl
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
EXPORTING
tabname = 'MARA'
fieldname = 'MATNR'
multiple_choice = abap_true " Mehrfachauswahl
TABLES
return_tab = lt_return
EXCEPTIONS
OTHERS = 1.
" Alle ausgewählten Werte verarbeiten
LOOP AT lt_return INTO DATA(ls_return).
" In Range einfügen oder verarbeiten
APPEND VALUE #(
sign = 'I'
option = 'EQ'
low = ls_return-fieldval
) TO s_matnr.
ENDLOOP.

10. F4-Hilfe mit Abhängigkeiten

PARAMETERS: p_vkorg TYPE vkorg,
p_vtweg TYPE vtweg.
" Vertriebsweg abhängig von Verkaufsorganisation
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: Welches Bildschirmfeld liefert VKORG?
APPEND VALUE #(
fldname = 'VKORG'
dession = p_vkorg
) TO lt_mapping.
" F4 mit Restriktion
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. Suchhilfe mit Popup-Dialog

DATA: lt_fieldcat TYPE TABLE OF dfies,
lt_data TYPE TABLE OF kna1,
lv_selected TYPE kunnr.
" Daten laden
SELECT * FROM kna1
WHERE land1 = 'DE'
INTO TABLE @lt_data
UP TO 100 ROWS.
" Feldkatalog erstellen
CALL FUNCTION 'DDIF_FIELDINFO_GET'
EXPORTING
tabname = 'KNA1'
TABLES
dfies_tab = lt_fieldcat
EXCEPTIONS
OTHERS = 1.
" Nur bestimmte Felder anzeigen
DELETE lt_fieldcat WHERE fieldname NOT IN ('KUNNR', 'NAME1', 'ORT01').
" Popup anzeigen
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.
" Callback-Form für zusätzliche Logik
FORM f4_callback TABLES record_tab STRUCTURE seahlpres
CHANGING shlp TYPE shlp_descr
callcontrol LIKE ddshf4ctrl.
" Zusätzliche Verarbeitung
ENDFORM.

12. CDS View als Suchhilfe

" CDS View mit Suchhilfe-Annotation
@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
}
" In Datenelement oder Feld referenzieren
" oder programmatisch:
SELECT FROM zi_customersearch
WHERE customername LIKE @lv_search_term
INTO TABLE @DATA(lt_results).

13. Suchhilfe für ALV

" F4-Hilfe in ALV-Grid
DATA: lt_customers TYPE TABLE OF kna1.
" ALV erstellen
cl_salv_table=>factory(
IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = lt_customers
).
" Spalte mit F4 versehen
DATA(lo_columns) = lo_alv->get_columns( ).
DATA(lo_column) = CAST cl_salv_column_table(
lo_columns->get_column( 'LAND1' )
).
" F4-Hilfe über Datenelement automatisch aktiv
" Für eigene F4:
lo_column->set_f4( if_salv_c_bool_sap=>true ).
lo_column->set_f4_checktable( abap_true ).
lo_alv->display( ).

14. Append Search Help

" Bestehende Suchhilfe erweitern (ohne Modifikation)
Transaktion: SE11 -> Suchhilfe
1. Standard-Suchhilfe öffnen (z.B. MAT1)
2. Erweiterungen -> Append-Suchhilfe anlegen
3. Name: ZSH_MAT1_APPEND
Die Append-Suchhilfe wird automatisch in die
Collective Search Help aufgenommen.

15. Praktisches Beispiel: Komplette F4-Klasse

CLASS zcl_f4_helper DEFINITION.
PUBLIC SECTION.
" Generische F4 für beliebige Tabelle
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 mit fester Werteliste
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 für Kunden
CLASS-METHODS: for_customer
IMPORTING iv_land1 TYPE land1 OPTIONAL
RETURNING VALUE(rv_kunnr) TYPE kunnr.
" F4 für Material
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.

Wichtige Transaktionen

TransaktionBeschreibung
SE11Data Dictionary (Suchhilfen)
SE37Search Help Exits

Wichtige Hinweise / Best Practice

  • Elementary für einfache Suchen auf einer Tabelle.
  • Collective für mehrere Suchmöglichkeiten.
  • Exit für komplexe Logik und Filter.
  • Datenelement-Anbindung für automatische F4.
  • F4IF_INT_TABLE_VALUE_REQUEST für eigene Wertelisten.
  • Abhängigkeiten über dynpfld_mapping abbilden.
  • Append für Erweiterung ohne Modifikation.
  • CDS Views mit @Search-Annotationen.
  • Kombinieren Sie mit Selection Screens für Reports.