Wenn du fcat-hotspot = 'X' setzt, löst jeder Klick auf die CheckBox ein Event aus. Auf das Event registrieren und im Ereignishandler deine Prüfung machen bzw. das Schalten der nicht geklickten Checkbox realiseren. Dann die ALV-Anzeige refreshen.Meti hat geschrieben:Gibt es eine Möglichkeit, diese beiden Chackboxen in Abhängigkeit (oder Gruppe) zu setzten, dass wenn ich eine Checkbox anklicke (uf TRUE setze) den andere abgewählt wird (auf FALSE gesetzt wird.)
Radiobuttons gingen ebenfalls nur über HOTSPOT und interner Verarbeitung. Ich würde so etwas mit einer DropDownBox lösen. Damit spart man sich die ganzen Ereignishandler und die Daten müssen nicht immer zwischen Frontend und Backend hin und her geschoben werden.Meti hat geschrieben: Es müssen keine Checkboxen sein, es könnten auch Radiobuttons sein.
rudimentäres Demo sollte helfen:Meti hat geschrieben:Danke im Voraus.
Code: Alles auswählen.
REPORT zalv_cb.
TYPE-POOLS slis.
TYPES: BEGIN OF t_data,
check1 TYPE c LENGTH 1,
check2 TYPE c LENGTH 1,
END OF t_data.
DATA: gt_data TYPE TABLE OF t_data,
gt_fcat TYPE lvc_t_fcat,
gs_fcat TYPE lvc_s_fcat.
START-OF-SELECTION.
* Itab füllen
DO 10 TIMES.
APPEND INITIAL LINE TO gt_data.
ENDDO.
* Fieldcat erzeugen
CLEAR gs_fcat.
gs_fcat-fieldname = 'CHECK1'.
gs_fcat-checkbox = 'X'.
gs_fcat-hotspot = 'X'.
APPEND gs_fcat TO gt_fcat.
CLEAR gs_fcat.
gs_fcat-fieldname = 'CHECK2'.
gs_fcat-checkbox = 'X'.
gs_fcat-hotspot = 'X'.
APPEND gs_fcat TO gt_fcat.
* ALV aufrufen
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_user_command = 'CALLBACK_USER_COMMAND'
it_fieldcat_lvc = gt_fcat
TABLES
t_outtab = gt_data
* EXCEPTIONS
* PROGRAM_ERROR = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* Ereignishandler
FORM callback_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
FIELD-SYMBOLS <ls_data> TYPE t_data.
IF r_ucomm = '&IC1'. "Hotspot wurde geklickt
CASE rs_selfield-fieldname.
WHEN 'CHECK1'.
READ TABLE gt_data ASSIGNING <ls_data> INDEX rs_selfield-tabindex.
IF sy-subrc = 0. "Klicks auf Summenzeile abfangen!
IF <ls_data>-check1 = space.
<ls_data>-check1 = 'X'.
<ls_data>-check2 = space.
ELSE.
<ls_data>-check1 = space.
<ls_data>-check2 = 'X'.
ENDIF.
rs_selfield-refresh = 'X'. "Neue Werte ans Frontend übertragen
rs_selfield-col_stable = 'X'. "Scollposition beibehalten
rs_selfield-row_stable = 'X'. "Scollposition beibehalten
ENDIF.
WHEN 'CHECK2'.
READ TABLE gt_data ASSIGNING <ls_data> INDEX rs_selfield-tabindex.
IF sy-subrc = 0. "Klicks auf Summenzeile abfangen!
IF <ls_data>-check2 = space.
<ls_data>-check2 = 'X'.
<ls_data>-check1 = space.
ELSE.
<ls_data>-check2 = space.
<ls_data>-check1 = 'X'.
ENDIF.
rs_selfield-refresh = 'X'. "Neue Werte ans Frontend übertragen
rs_selfield-col_stable = 'X'. "Scollposition beibehalten
rs_selfield-row_stable = 'X'. "Scollposition beibehalten
ENDIF.
WHEN OTHERS.
"es wurde eine andere Spalte ausgewählt, also nichts tun
ENDCASE.
ENDIF.
ENDFORM. "callback_user_command
Code: Alles auswählen.
DATA note_fcat TYPE TABLE OF lvc_s_fcat .
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'Structure'.
CHANGING
ct_fieldcat = note_fcat().
FIELD-SYMBOLS <test> LIKE LINE OF note_fcat().
LOOP AT note_fcat() ASSIGNING <test>.
CASE <test>-fieldname.
WHEN 'NAME'.
<test>-drdn_hndl = '1'.
<test>-outputlen = '28'.
<test>-edit = 'X'.
WHEN 'TEST1'.
<test>-coltext = 'NR1'.
<test>-outputlen = '7'.
<test>-checkbox = 'X'.
<test>-edit = 'X'.
WHEN 'TEST_DESC'.
<test>-coltext = 'NR2'.
<test>-outputlen = '7'.
<test>-checkbox = 'X'.
<test>-edit = 'X'.
WHEN OTHERS.
ENDCASE.
Eine genauerer Fehlerbeschreibung könnte zur Lösungsfindung beitragen. Meine Glaskugel versagt gerade.Meti hat geschrieben:leider funktioniert dies immer noch nicht.
Ich habe eine Datenbanktabelle 'TABLE' und eine Struktur 'STRUCTURE'. Hier habe ich drei Felder 'TR0', 'TR1' und 'TR2' typ BOOL_D.Eine genauerer Fehlerbeschreibung könnte zur Lösungsfindung beitragen
Wieso man für drei Felder einen ALV braucht erschließt sich mir nicht ganz, das ist doch über normale Felder viel schneller realisiert.Meti hat geschrieben:Wenn 'TR1'angeklickt ist, soll 'TR2' nicht editierbar sein oder ausgeblendet werden.
Code: Alles auswählen.
im_grid->register_edit_event( i_event_id = cl_gui_alv_grid=>mc_evt_modified ).
SET HANDLER handle_data_changed FOR im_grid.
Code: Alles auswählen.
FIELD-SYMBOLS <mod_cell> LIKE LINE OF er_data_changed->mt_mod_cells().
LOOP AT er_data_changed->mt_mod_cells() ASSIGNING <mod_cell>.
FIELD-SYMBOLS <grid_line> LIKE LINE OF grid_table().
READ TABLE grid_table ASSIGNING <grid_line> INDEX <mod_cell>-row_id.
IF <mod_cell>-fieldname = 'TEST1' AND <mod_cell>-value = 'X'.
<grid_line>-test = 'X'.
<grid_line>-test2 = ' '.
ELSEIF <mod_cell>-fieldname = 'TEST1' AND <mod_cell>-value = ' '.
<grid_line>-test = ' '.
<grid_line>-test2 = 'X'.
ELSEIF <mod_cell>-fieldname = 'TEST2' AND <mod_cell>-value = 'X'.
<grid_line>-test = ' '.
<grid_line>-test2 = 'X'.
ELSEIF <mod_cell>-fieldname = 'TEST2' AND <mod_cell>-value = ' '.
<grid_line>-test = 'X'.
<grid_line>-test2 = ' '.
ELSE.
ENDIF.
ENDLOOP.