TableControl (1)
Hier werden verschiedene Möglichkeiten anhand eines Programms vorgestellt, die ein TableControl bietet. Es ist z.B. nicht möglich, die Selektion einer Zeile per Programm abzufragen. Mit einer kleinen Einschränkung geht es jedoch trotzdem.
Machmal ist es sinnvoll, direkt auf die Markierung einer Zeile im TableControl zu reagieren. Dies geht jedoch standardmäßig nicht, da das Markieren im TableControl intern gehandhabt wird. Folgendes Programm zeigt eine interne Tabelle im TableControl an. Mit einem Klick auf den Button am Anfang dieser Zeile wird die Zeile selbst markiert. Die eigentliche Markierspalte wird ausser Kraft gesetzt. Ausserdem wird das FELD2 auf eingabebereit gestellt und der Cursor auch auf das Feld platziert.
Zudem wird die Spalte mit dem zweiten Tabellenfeld hervorgehoben.
|
Zu dem Programm-Coding müssen Sie noch das Dynpro 300 anlegen.
REPORT zzenno39 . TYPE-POOLS cxtab. DATA: ok_code TYPE syucomm, zeile(6) TYPE n, zeile_tc(6) TYPE n, cols TYPE cxtab_column, scr LIKE screen, BEGIN OF itab OCCURS 0, mark, feld1(10), feld2(4), feld3(5), END OF itab. CONTROLS: tc_itab TYPE TABLEVIEW USING SCREEN 0300. START-OF-SELECTION. *-- Tabelle mit Beispieldaten füllen DO 30 TIMES. APPEND ' ABCDEFGHIJKLMNOPQRS' TO itab. ENDDO. *-- Aufruf des Dynpros CALL SCREEN 300. *&---------------------------------------------------------------------* *& Module STATUS_0300 OUTPUT *&---------------------------------------------------------------------* MODULE status_0300 OUTPUT. *-- Status und Titel setzen SET PF-STATUS 'TEST1'. SET TITLEBAR 'TEST1'. *-- Falls gerade der Markierbutton gedrückt wurde, den Cursor auf das *-- Feld2 dieser Zeile setzen: IF ok_code(3) = 'PB_'. SET CURSOR FIELD 'ITAB-FELD2' LINE zeile_tc. ENDIF. CLEAR ok_code. *-- Richtige Markierspalte ausser Kraft setzen LOOP AT SCREEN. IF screen-name = 'ITAB-MARK'. screen-input = '0'. MODIFY SCREEN. ENDIF. ENDLOOP. ENDMODULE. " STATUS_0300 OUTPUT *---------------------------------------------------------------------* * MODULE tc_itab_change_tc_attr OUTPUT * *---------------------------------------------------------------------* MODULE tc_itab_change_tc_attr OUTPUT. DESCRIBE TABLE itab LINES tc_itab-lines. *-- Feld2 hervorheben LOOP AT tc_itab-cols INTO cols WHERE screen-name = 'ITAB-FELD2'. scr = cols-screen. scr-intensified = '1'. cols-screen = scr. MODIFY tc_itab-cols FROM cols. ENDLOOP. ENDMODULE. *&---------------------------------------------------------------------* *& Module USER_COMMAND_0300 INPUT *&---------------------------------------------------------------------* MODULE user_command_0300 INPUT. IF ok_code(3) = 'PB_'. *-- Drucktaste im TableControl wurde gedrückt *-- Alte Markierung löschen READ TABLE itab WITH KEY mark = 'X'. IF sy-subrc = 0. itab-mark = space. MODIFY itab INDEX sy-tabix. ENDIF. *-- Neue Markierung setzen/ zurücknehmen zeile_tc = ok_code+3(2). zeile = tc_itab-top_line + zeile_tc - 1. READ TABLE itab INDEX zeile. CHECK sy-subrc = 0. IF itab-mark = 'X'. itab-mark = ' '. ELSE. itab-mark = 'X'. ENDIF. MODIFY itab INDEX sy-tabix. ELSE. CASE ok_code. WHEN 'BACK'. *-- Dynpro verlassen LEAVE TO SCREEN 0. ENDCASE. ENDIF. ENDMODULE. " USER_COMMAND_0300 INPUT *&---------------------------------------------------------------------* *& Module TC_ITAB_change_field_attr OUTPUT *&---------------------------------------------------------------------* MODULE tc_itab_change_field_attr OUTPUT. IF tc_itab-current_line = zeile. *-- Aktuelle Zeile Eingabebereit setzen LOOP AT SCREEN. IF screen-name = 'ITAB-FELD2'. IF itab-mark = 'X'. screen-input = '1'. ELSE. screen-input = '0'. ENDIF. MODIFY SCREEN. ENDIF. ENDLOOP. ENDIF. ENDMODULE. " TC_ITAB_change_field_attr OUTPUT *&---------------------------------------------------------------------* *& Module daten_uebernehmen INPUT *&---------------------------------------------------------------------* MODULE daten_uebernehmen INPUT. *-- Eingegebene Daten in interne Tabelle übernehmen PERFORM daten_uebernehmen. ENDMODULE. " daten_uebernehmen INPUT *&---------------------------------------------------------------------* *& Form daten_uebernehmen *&---------------------------------------------------------------------* FORM daten_uebernehmen. MODIFY itab INDEX tc_itab-current_line. ENDFORM. " daten_uebernehmen
Hier die Ablauflogik für das Dynpro 300.
********************************************************************* *** DYNPRO 300 ********************************************************************* PROCESS BEFORE OUTPUT. module tc_itab_change_tc_attr. LOOP AT itab WITH CONTROL tc_itab CURSOR tc_itab-current_line. field: itab-feld1, itab-feld2, itab-feld3. MODULE tc_itab_change_field_attr. ENDLOOP. MODULE status_0300. * PROCESS AFTER INPUT. LOOP AT itab. module daten_uebernehmen. ENDLOOP. MODULE user_command_0300.
Der TableControl auf dem Dynpro hat den Namen TC_ITAB, der Druckknopf, der in die Tabellenzeile eingefügt werden muss, hat als OK_CODE “PB_%%“.
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024