Code: Alles auswählen.
-----------------------------------------------------------------------------------------------
FUNCTION ztest.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" EXPORTING
*" REFERENCE(ET_SHLP_TAB) TYPE SHLP_DESCR_TAB_T
*" REFERENCE(ET_RECORD_TAB) TYPE DDSHRESLTS
*" 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
*"----------------------------------------------------------------------
TYPES:
BEGIN OF ty_s_record,
sobid TYPE sobid,
END OF ty_s_record.
DATA: lt_selected_objects TYPE TABLE OF hrsobid.
FIELD-SYMBOLS: <s_lt_selected_objects> LIKE LINE OF lt_selected_objects,
<s_record> TYPE ty_s_record,
<s_shlp_tab> LIKE LINE OF shlp_tab,
<s_shlp_tab-selop> LIKE LINE OF shlp_tab-selopt,
<s_et_record_tab> LIKE LINE OF et_record_tab,
<s_record_tab> LIKE LINE OF record_tab.
IF callcontrol-step = 'SELECT'.
callcontrol-multisel = 'X'.
** callcontrol-sortoff = true.
*
CALL FUNCTION 'RHPE_SHOW_QUALI_CATALOGUE'
EXPORTING
plvar = '01'
begda = sy-datum
endda = '99991231'
popup = 'X'
maintain = ' '
TABLES
selected_objects = lt_selected_objects
EXCEPTIONS
no_authority = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
*
LOOP AT lt_selected_objects ASSIGNING <s_lt_selected_objects>.
APPEND INITIAL LINE TO record_tab ASSIGNING <s_record> CASTING.
<s_record>-sobid = <s_lt_selected_objects>-sobid.
ENDLOOP.
callcontrol-hide_list = 'X'.
callcontrol-step = 'DISP'.
ENDIF.
ENDFUNCTION.
Hallo!a-dead-trousers hat geschrieben: ↑07.04.2021 11:08Der "traditionelle" Weg, wäre die F4-Hilfe im jeweiligen Programm/Report im Event "ON VALUE-REQUEST FOR ..." ohne Verwendung einer Suchhilfe umzusetzen. Da kann man dann auch mehr als nur eine Zeile in die Select-option einfügen.
Code: Alles auswählen.
********************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_sobid-low.
CALL FUNCTION 'F4_FIELD_ON_VALUE_REQUEST'
EXPORTING
tabname = 'ZTEST'
dynprofield = 'S_SOBID'
multiple_choice = 'X'
selection_screen = 'X'
TABLES
return_tab = lt_return_tab
EXCEPTIONS
field_not_found = 1
no_help_for_field = 2
inconsistent_help = 3
no_values_found = 4
OTHERS = 5.
IF sy-subrc = 0.
DATA updatevalues TYPE STANDARD TABLE OF rsselread.
FIELD-SYMBOLS: <s_updatevalues> LIKE LINE OF updatevalues.
LOOP AT lt_return_tab ASSIGNING <s_lt_return_tab>.
APPEND INITIAL LINE TO updatevalues ASSIGNING <s_updatevalues>.
<s_updatevalues>-name = 'S_SOBID'.
* IF sy-tabix = '1'.
<s_updatevalues>-position = 'LOW'.
* ELSE.
* <s_updatevalues>-position = 'HIGH'.
* ENDIF.
<s_updatevalues>-fieldvalue = <s_lt_return_tab>-fieldval.
<s_updatevalues>-kind = 'S'.
ENDLOOP.
*
*
********Funktioniert nur mit LOW und HIGH
CALL FUNCTION 'RS_SELECTIONSCREEN_UPDATE'
EXPORTING
program = sy-repid
dynnr = sy-dynnr
TABLES
updatevalues = updatevalues
* EXCEPTIONS
* NO_HIGH_FIELD = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDIF.
********************************************************************
Guten Morgen zusammen,a-dead-trousers hat geschrieben: ↑19.04.2021 09:30Du musst die zusätzlichen Zeilen aus deinem LT_RETURN_TAB in deine Select-option S_SOBID einfügen.
Mit RS_SELECTIONSCREEN_UPDATE werden nur die Werte im Selectionsbild (Dynpro) geändert und die werden erst mit einem PAI/PBO zurück in die Select-Option übertragen.
In deinem Fall würde ich en Aufruf so gestallten:
1) Ist S_SOBID leer?
2) Alle Zeilen aus LT_RETURN_TAB an die S_SOBID anhängen.
3) War S_SOBID zuvor leer, Aufruf von RS_SELECTIONSCREEN_UPDATE mit den Informationen aus der ersten Zeile von S_SOBID.
Was du noch genauer durchdenken musst ist, wie das Verhalten von LOW zu HIGH sein soll. Wird die Mehrfachauswahl bei HIGH an die vorhandenen Zeilen von LOW angehängt? Ist bei HIGH die Mehrfachauswahl deaktiviert?
Dafür gibt es meines Erachtens kein Best-Practise und muss mit den Anwendern geklärt werden wie die Erwartungshaltung ist. Dann ist da auch noch die Frage wie sich das Ganze verhalten soll wenn der Aufruf über den Mehrfachselektionsdialog erfolgt.
Code: Alles auswählen.
**********************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_sobid-low.
TYPES: BEGIN OF ty_sobid,
sobid TYPE sobid,
END OF ty_sobid.
DATA: lt_return_tab TYPE STANDARD TABLE OF ddshretval,
lt_field_tab TYPE TABLE OF dfies.
DATA: lt_sobid TYPE TABLE OF ty_sobid.
FIELD-SYMBOLS: <s_sobid> LIKE LINE OF s_sobid,
<s_lt_sobid> LIKE LINE OF lt_sobid,
<s_lt_return_tab> LIKE LINE OF lt_return_tab,
<s_lt_field_tab> LIKE LINE OF lt_field_tab.
CALL FUNCTION 'F4_FIELD_ON_VALUE_REQUEST'
EXPORTING
tabname = 'ZTEST'
dynprofield = 'S_SOBID'
multiple_choice = 'X'
selection_screen = 'X'
TABLES
return_tab = lt_return_tab
EXCEPTIONS
field_not_found = 1
no_help_for_field = 2
inconsistent_help = 3
no_values_found = 4
OTHERS = 5.
IF sy-subrc = 0.
DATA: updatevalues TYPE STANDARD TABLE OF rsselread,
ls_sobid LIKE LINE OF s_sobid,
s_sobid_not_clear TYPE xfeld.
FIELD-SYMBOLS: <s_updatevalues> LIKE LINE OF updatevalues.
LOOP AT lt_return_tab ASSIGNING <s_lt_return_tab>.
APPEND INITIAL LINE TO updatevalues ASSIGNING <s_updatevalues>.
<s_updatevalues>-name = 'S_SOBID'.
<s_updatevalues>-position = 'LOW'.
<s_updatevalues>-fieldvalue = <s_lt_return_tab>-fieldval.
<s_updatevalues>-kind = 'S'.
IF s_sobid IS INITIAL.
CLEAR ls_sobid.
ls_sobid-sign = 'I'.
ls_sobid-option = 'EQ'.
ls_sobid-low = <s_lt_return_tab>-fieldval.
APPEND ls_sobid TO s_sobid.
ELSE.
s_sobid_not_clear = 'X'.
ENDIF.
ENDLOOP.
IF s_sobid_not_clear IS INITIAL.
*********Funktioniert nur mit LOW und HIGH
CALL FUNCTION 'RS_SELECTIONSCREEN_UPDATE'
EXPORTING
program = sy-repid
dynnr = sy-dynnr
TABLES
updatevalues = updatevalues
* EXCEPTIONS
* NO_HIGH_FIELD = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDIF.
ENDIF.
**********************************************************
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
walda33