In vielen Fällen ist es nicht ausreichend, Daten in einem ALV Grid nur auszugeben, sondern auch änderbar zu machen.
Dabei kann man die Eingabebereitschaft in drei Varianten unterteilen.
- alle Spalten und Felder sind eingabebereit
- nur gewisse Spalten sind eingabebereit
- nur einzelne Felder sind eingabebereit
In diesem Artikel möchte ich alle drei Varianten kurz vorstellen. Dabei beginnen wir mit der Eingabebereitschaft der gesamten Tabelle, schränken danach auf einzelne Spalten ein und schalten in der letzten Variante nur mehr einzelne Felder aktiv.
In diesem Artikel wird nur die Funktionalität des Änderungsmodus beschrieben. Ich gehe davon aus, dass das ALV bereits im Web Dynpro eingebunden ist und mit dem Kontext verknüpft ist.
Aktivieren des gesamten ALV Grids
Ein ALV Grid eingabebereit zu machen ist relativ einfach. Als erstes holt man sich die Referenz auf das Tabellenobjekt. Danach liest man die einzelnen Spalten des ALV aus und erzeugt für jede einzelne Spalte einen Cell Editor. In unserem Beispiel besteht jede Spalte aus einem Input Feld. Es können aber auch DropDown Felder oder andere Editoren verwendet werden.
DATA: obj_table_api TYPE REF TO iwci_salv_wd_table, obj_table TYPE REF TO cl_salv_wd_config_table. DATA: lt_columns TYPE salv_wd_t_column_ref, wa_columns TYPE salv_wd_s_column_ref. DATA: obj_input_field TYPE REF TO cl_salv_wd_uie_input_field. * Get table api and table object obj_table_api = wd_this->wd_cpifc_cmp_result_list( ). obj_table = obj_table_api->get_model( ). * Set ALV editable obj_table->if_salv_wd_table_settings~set_edit_mode( '99' ). obj_table->if_salv_wd_table_settings~set_read_only( abap_false ). * Get table columns lt_columns = obj_table->if_salv_wd_column_settings~get_columns( ). * Set colum editor LOOP AT lt_columns INTO wa_columns. * Create editor CREATE OBJECT obj_input_field EXPORTING value_fieldname = wa_columns-id. wa_columns-r_column->set_cell_editor( obj_input_field ). CLEAR: wa_columns. ENDLOOP.
Einzelne Spalten einabebereit machen
Wir haben nun das gesamte ALV eingabebereit. Als nächstes wollen wir nur mehr eine einzige Spalte für den User änderbar machen. Auch das geht ganz einfach. Im LOOP über die einzelnen Spalten bauen wir direkt nach dem LOOP AT folgendes Coding ein.
IF wa_columns-id <> 'COMMENT'. clear: wa_columns. CONTINUE. ENDIF.
Sollte der Spaltenname nicht COMMENT lauten, dann benötigen wir keinen Cell Editor und springen zur nächsten Spalte. Nach dem Loop hat einzig die Comment Spalte einen Cell Editor. Alle anderen Tabellenspalten sind nun nicht mehr änderbar.
Einzelne Felder eingabebereit machen
Zum Schluß möchten wir nun, dass nur COMMENT Felder geändert werden dürfen, welche noch keinen Wert besitzen. Um dies zu erreichen, muss auch die an das ALV gebundene Struktur erweitert werden.
Fügen Sie Ihrer Kontextstruktur das Feld READ_ONLY vom Type WDY_BOOLEAN hinzu. Bevor Sie in ihrerer Datenbschaffungsmethode die Daten an den Kontext binden, müssen Sie nun in jeder Zeile, in welcher das COMMENT Feld bereits einen Wert enthält, ein ABAP_TRUE in das Feld READ_ONLY setzen.
Als letzter Schritt muss dem ALV nun mitgeteilt werden, welches Feld die Eingabebereitschaft des COMMENT Feldes beeinflusst.
Hierzu erweitern wir unser Coding um folgende Zeilen direkt nach dem CREATE OBJECT obj_input_field :
obj_input_field->set_read_only_fieldname( 'READ_ONLY' ).
Ab jetzt sind nur mehr die COMMENT Zellen änderbar, in welchen noch kein Wert eingetragen wurde.
Comments are closed.