Das liegt daran, das dieser Doppelklick auf dein Ausgabefeld das PAI auslösst!Ines hat geschrieben:Gerade habe ich was erstaunliches festgestellt, was evtl auch hilfreich ist.
Beim Doppelklick auf das Ausgabefeld, wird der Inhalt plötzlich angezeigt...
der cl_gui_alv_grid_display hat auch ein paar Methoden namnes get/set_selectet_rows usw.Ines hat geschrieben:Vielen Dank.
Da ergibt sich jedoch das gleiche Problem, wie mit leave to screen 200. Die Spalte ist nicht mehr markiert, das Könnte den Benuter verwirren und wenn man ein neues Dynpro aufruft, lässt dich dieses erst nach mehrmaligen klicken beenden.
Angezeigt bekomme ich jedoch den gewünschten Wert...
Code: Alles auswählen.
REPORT zz_testnochma .
TABLES mara.
* Ereignishandler für Doppelclick
CLASS lcl_event_receiver DEFINITION DEFERRED.
DATA: tab_mara TYPE TABLE OF mara.
DATA wa_mara TYPE mara.
DATA container TYPE REF TO cl_gui_custom_container.
DATA grid TYPE REF TO cl_gui_alv_grid.
DATA event_receiver TYPE REF TO lcl_event_receiver.
DATA okcode TYPE sy-ucomm.
SELECT-OPTIONS: so_matnr FOR mara-matnr.
SELECT * FROM mara INTO TABLE tab_mara
UP TO 20 ROWS
WHERE matnr IN so_matnr.
CALL SCREEN '100'.
*---------------------------------------------------------------------*
* CLASS lcl_event_receiver DEFINITION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_double_click
FOR EVENT double_click
OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no .
ENDCLASS.
*---------------------------------------------------------------------*
* CLASS lcl_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_double_click.
* Tabs für Zeilenmarkierung
DATA:
it_index_rows TYPE lvc_t_row,
it_row_no TYPE lvc_t_roid.
* Zeile lesen und Zeilen markierung merken
READ TABLE tab_mara INTO wa_mara INDEX es_row_no-row_id.
APPEND e_row TO it_index_rows.
APPEND es_row_no TO it_row_no.
* Aufruf modales Dynpro fürs Ändern
CALL SCREEN 200 STARTING AT 6 15.
* Update auf interne Tabelle
MODIFY tab_mara FROM wa_mara INDEX es_row_no-row_id.
* Refresh auf Grid
CALL METHOD grid->refresh_table_display.
* Zeilenmarkierung setzen
CALL METHOD grid->set_selected_rows EXPORTING
it_index_rows = it_index_rows
it_row_no = it_row_no.
ENDMETHOD.
ENDCLASS.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS '100'.
* SET TITLEBAR 'xxx'.
IF container IS INITIAL.
CREATE OBJECT container
EXPORTING
container_name = 'CONTAINER'.
CREATE OBJECT grid
EXPORTING
i_parent = container.
CALL METHOD grid->set_table_for_first_display
EXPORTING
i_structure_name = 'MARA'
CHANGING
it_outtab = tab_mara
* EXCEPTIONS
* INVALID_PARAMETER_COMBINATION = 1
* PROGRAM_ERROR = 2
* TOO_MANY_LINES = 3
* others = 4
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ELSE.
CALL METHOD grid->refresh_table_display.
ENDIF.
* Ereignishandler auf Grid ereignis Doppelclick abonnieren
CREATE OBJECT event_receiver.
SET HANDLER event_receiver->handle_double_click FOR grid.
CALL METHOD cl_gui_control=>set_focus
EXPORTING
control = grid.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE okcode.
WHEN 'BACK'.
IF NOT grid IS INITIAL.
FREE grid.
ENDIF.
IF NOT container IS INITIAL.
CALL METHOD container->free.
FREE container.
ENDIF.
LEAVE TO SCREEN 0.
CLEAR okcode.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Module STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0200 OUTPUT.
SET PF-STATUS '200'.
ENDMODULE. " STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0200 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0200 INPUT.
IF okcode = 'BEEN'.
CLEAR okcode.
LEAVE TO SCREEN 0.
ENDIF.
ENDMODULE. " USER_COMMAND_0200 INPUT
Da wo ich ja gesagt hab, das das mit dem cl_gui_cfw=>set_new_ok_code machen sollst, musst einfach irgenwas mitgeben. Am besten einfach sowas wie "DUMMY". Einfach ein nicht existierenden OK-Code, da man dadurch ja nur das PAI erzwingen will ohne ansonsten was zu machen.Ines hat geschrieben:ich verstehe nur nicht, wieso es geklappt hat, bevor ich die methode cl_gui_cfw=>set_new_ok_code eingefügt habe...
vielleicht habe ich dort einen falschen parameter? was muss denn "new_code" sein?und was für folgen hat das?
HÄ????Ines hat geschrieben:Aber wenn ich den PAI erzwinge, springe ich ja da rein und dann ruft er wieder das Dynpro auf, wie oben geschrieben, da das ja der letzte OK_CODE war. Ist ja irgendwie logisch, aber das soll er ja nicht. Sondern das Dynpro schließen...
Initialisierst du das ok_code feld? Es ist eine Eigenart des OK-CODE-FELDES welches im Dynpro eingetragen ist wird, dass nicht automatisch initialisiert wird.Ines hat geschrieben: da das ja der letzte OK_CODE war.