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.