CL_SALV_TABLE --> dropdown-box für einzelnes Feld???

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).

CL_SALV_TABLE --> dropdown-box für einzelnes Feld???

Postby Laurens818 » Fri Jan 27, 2012 12:51 pm

Hallo liebe ABAP-Spezialisten :)

Es gibt ja eine Klasse cl_salv_dropdowns...
Hat jemand damit schon irgendwelche Erfahrungen gesammelt???

Ich möchte nämlich versuchen in einer Spalte einer Tabelle jedes einzelne Feld mit einer Dropdownliste zu versehen.
Je nach dem welchen Wert ich aus der Dropdownliste auswähle, soll er dann in der jeweiligen Zelle erscheinen.

Gibt es diese Möglichkeit überhaupt? Bzw. gibt es auch die Möglichkeit einzelne Zellen der Tabelle als Dropdownfeld zu setzen?

Ich mein, im ALV gibt es ja die Möglichkeit auch bestimmte Zeilen / Spalten / Zellen z. B. als Checkbox oder Hotspot zu setzen...

Für jegliche Hinweise bin ich sehr dankbar :-)
Laurens818
..
..
 
Posts: 50
Joined: Sat Oct 22, 2005 9:06 pm

Re: CL_SALV_TABLE --> dropdown-box für einzelnes Feld???

Postby Josie2243 » Fri Jan 27, 2012 3:07 pm

Chrischi hat geschrieben:Gibt es diese Möglichkeit überhaupt? Bzw. gibt es auch die Möglichkeit einzelne Zellen der Tabelle als Dropdownfeld zu setzen?


Mit cl_salv_table habe ich es noch nicht realisiert, beim reinen OO ALV (cl_gui_alv_grid), kann man je Zelle eine eigene DropDownListe mit geben. Bei interesse: cl_gui_alv_grid->set_drop_down_table().

Ob cl_salv_table dies auch unterstützt weiß ich nicht.

Wobei:
Chrischi hat geschrieben:Je nach dem welchen Wert ich aus der Dropdownliste auswähle, soll er dann in der jeweiligen Zelle erscheinen.
definitiv mit cl_salv_table nicht realisierbar ist, da dafür die Zelle editierbar sein muss, was cl_salv_table nicht unterstützt (nur reines Anzeigen möglich).
Josie2243
....
....
 
Posts: 908
Joined: Wed Feb 15, 2006 4:05 pm

Re: CL_SALV_TABLE --> dropdown-box für einzelnes Feld???

Postby Laurens818 » Fri Jan 27, 2012 4:41 pm

Hallo Hendrik,

vielen Dank erstmal :-)
Wenn das mit dem Dropdownfeld für den SALV nicht nicht gehen sollte, werde ich dann wohl oder übel auf den anderen umsteigen müssen :wink:

Aber ich bin gerade eben auf einen interessanten Beitrag gestoßen:
http://forums.sdn.sap.com/thread.jspa?threadID=2053205

Mal angenommen:
Es gelingt mir jede Zelle einer Spalte mit einer Wertehilfe zu versehen (im SALV).
Wenn ich mir dann aus dieser Wertehilfe einen Wert in eine Variable bzw. ein Feldsymbol schreibe und anschließend z. B.
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. READ TABLE gt_ausgab ASSIGNING <fs_ausgab> WITH KEY [.....].
  2. <fs_ausgab> = gv_wertehilfe_variable.
GeSHi ©

verwende, ist doch auch der Wert in meiner Ausgabetabelle geändert!?!?!?
Oder verdreh ich da jetzt etwas komplett?

Viele Grüße
Christian
Laurens818
..
..
 
Posts: 50
Joined: Sat Oct 22, 2005 9:06 pm

Re: CL_SALV_TABLE --> dropdown-box für einzelnes Feld???

Postby Josie2243 » Fri Jan 27, 2012 5:06 pm

Chrischi hat geschrieben:verwende, ist doch auch der Wert in meiner Ausgabetabelle geändert!?!?!?
Oder verdreh ich da jetzt etwas komplett?


Über die Wertehilfe wirst du das nich lösen können, dort kann man nur Werte auswählen, wenn das Feld, an dem die Wertehilfe hängt, eingabebereit ist. Die Werte in eine Hilfsvariable schreiben ist so nicht möglich.

Es hindert dich aber niemand, auf eine Aktion auf das Feld (z.b. Doppelklick oder HotSpot) über Event zu reagieren. So könntest du eine eigene Werteliste aufrufen und die Werte zurück in die Ausgabetabelle (bzw. ALV-Tabelle) schreiben.

Damit die geänderten Werte dann aber im ALV angezeigt werden, musst du diesen REFRESHEN, damit die geänderten Daten vom Backend zum Frontend übertragen werden.
Je nach Datenmenge in der Ausgabetabelle dauert der Refresh entsprechend. Hier muss man selber abschätzen ob dies sinnvoll ist.
Josie2243
....
....
 
Posts: 908
Joined: Wed Feb 15, 2006 4:05 pm

Re: CL_SALV_TABLE --> dropdown-box für einzelnes Feld???

Postby Laurens818 » Mon Jan 30, 2012 8:46 am

Hallo Hendrik,

gut, die Wertehilfe müsste ich dann selbst definieren, das ist klar. Sollte eigentlich kein großes Ding sein.
Ich werd das so mal austesten ob das funktioniert :-)

Vielen vielen Dank erst mal :-)
Laurens818
..
..
 
Posts: 50
Joined: Sat Oct 22, 2005 9:06 pm

Re: CL_SALV_TABLE --> dropdown-box für einzelnes Feld???

Postby Laurens818 » Wed Feb 01, 2012 11:42 am

Also,

ich habe das jetzt doch mal mit dem ALV_GRID gemacht.
Soweit klappt das auch, nur hänge ich jetzt grad wieder fest :?

Ich habe eine Domäne erstellt und dieser Domäne einen Wertebereich zugewiesen.
Sieht so aus:
Festwert | Kurzbeschreibung
1 |Vorhanden
2 |Nicht vorhanden
3 |In Bearbeitung
4 |(leer)

Anschließend habe ich in meinem PBO folgenden Code verwendet:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.     ls_dropdown-handle = '1'.
  2.     ls_dropdown-value = '1'.
  3.     APPEND ls_dropdown TO lt_dropdown.
  4.     ls_dropdown-handle = '1'.
  5.     ls_dropdown-value = '2'.
  6.     APPEND ls_dropdown TO lt_dropdown.
  7.     ls_dropdown-handle = '1'.
  8.     ls_dropdown-value = '3'.
  9.     APPEND ls_dropdown TO lt_dropdown.
  10.     ls_dropdown-handle = '1'.
  11.     ls_dropdown-value = '4'.
  12.     APPEND ls_dropdown TO lt_dropdown.
  13.  
  14.     CALL METHOD gref_alv->set_drop_down_table
  15.       EXPORTING
  16.         it_drop_down = lt_dropdown.
  17.  
  18.     LOOP AT gt_fieldcat INTO ls_fcat.
  19.  
  20. * Eigenschaften für die Spalte 'STATUS' festlegen (Dropdown)
  21.       IF ls_fcat-fieldname = 'STATUS'.
  22.         ls_fcat-drdn_hndl = 1.
  23.         ls_fcat-edit = 'X'.
  24.         ls_fcat-checktable = '!'.
  25.         ls_fcat-outputlen = 20.
  26.         MODIFY gt_fieldcat FROM ls_fcat.
  27.  
GeSHi ©


Wie kann ich jetzt einstellen, dass die Kurzbeschreibung meiner Domäne in der Dropdownliste angezeigt wird und nicht die 1, 2, 3 oder 4?????

Wenn ich in ls_dropdown-value z. B. den Text "Nicht vorhanden" schreibe, kommt dann beim aktualisieren des ALV die Fehlermeldung, dass das Feld maximal eine Länge von 1 haben darf.
Ändere ich dann in der Domäne die Länge des Char-Feldes, sodass der Text ("Nicht vorhanden") passt, bekomme ich die Fehlermeldung: "Geben Sie einen gültigen Wert ein" (weil ja dann der Festwert 2 in meiner Domäne nicht zu dem Wert in meiner ls_dropdown-value passt ). :?

Und der Festwert in der Domäne darf ja maximal 10 Zeichen lang sein.

Gruß
Christian
Laurens818
..
..
 
Posts: 50
Joined: Sat Oct 22, 2005 9:06 pm

Re: CL_SALV_TABLE --> dropdown-box für einzelnes Feld???

Postby Josie2243 » Wed Feb 01, 2012 1:14 pm

Chrischi hat geschrieben:Wie kann ich jetzt einstellen, dass die Kurzbeschreibung meiner Domäne in der Dropdownliste angezeigt wird und nicht die 1, 2, 3 oder 4?????


Gar nicht.

Wenn du doch schon die Domäne angelegt hast, dann kannst du diese für die F4-Hilfe verwenden.
In der Werthilfe kann der Key und die Beschreibung angezeigt werden.
Josie2243
....
....
 
Posts: 908
Joined: Wed Feb 15, 2006 4:05 pm

Re: CL_SALV_TABLE --> dropdown-box für einzelnes Feld???

Postby Laurens818 » Wed Feb 01, 2012 2:09 pm

Hallo Hendrik,

das mit der Wertehilfe anzeigen und verwenden ist mir schon bekannt.
Nur wollte ich genau das ja eben für das Dropdownfeld haben.
Dass mir eben dort die Beschreibung und nicht die Zahlen angezeigt werden.

Nur schade, dass es nicht geht.

Trotzdem vielen lieben Dank :)
Laurens818
..
..
 
Posts: 50
Joined: Sat Oct 22, 2005 9:06 pm

Re: CL_SALV_TABLE --> dropdown-box für einzelnes Feld???

Postby Bent3227 » Fri Mar 24, 2017 2:47 pm

der Post ist zwar schon älter, aber ich war gerade auf der Suche für eine Lösung für ein ähnliches Problem.
Editierbar und auch F4-Hilfen Wertübernahme funktioniert auch im SALV_TABLE.

Dazu ist allerdings etwas getrickse notwendig.

Dazu definiert man sich zunächst einmal einen Handler z.b. HANDLE_DOUBLE_CLICK mit Ereignishandler für CL_SALV_EVENTS_TABLE -> DOUBLE_KLICK.

Zusätzlich programmiert man eine lokale Helferklasse lcl_salv_buddy:


CLASS lcl_salv_buddy DEFINITION INHERITING FROM cl_salv_controller CREATE PRIVATE FINAL.

PUBLIC SECTION.
CLASS-METHODS: get_control_rtti IMPORTING i_salv TYPE REF TO cl_salv_model_base
EXPORTING e_adapter_type TYPE salv_de_adapter_type
e_control_rtti TYPE REF TO cl_abap_typedescr,

get_control IMPORTING i_salv TYPE REF TO cl_salv_model_base
RETURNING value(r_control) TYPE REF TO object,

set_editable IMPORTING value(i_fieldname) TYPE csequence OPTIONAL
i_salv_table TYPE REF TO cl_salv_table
value(i_editable) TYPE abap_bool DEFAULT abap_true
value(i_refresh) TYPE abap_bool DEFAULT abap_true.

PRIVATE SECTION.

CLASS-METHODS: get_control_internal IMPORTING i_salv TYPE REF TO cl_salv_model_base
EXPORTING e_adapter_type TYPE salv_de_adapter_type
e_control TYPE REF TO object.

ENDCLASS. "lcl_salv_buddy DEFINITION

*----------------------------------------------------------------------*
* CLASS lcl_salv_buddy IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_salv_buddy IMPLEMENTATION.


METHOD get_control_internal.

DATA: lo_controller TYPE REF TO cl_salv_controller_model,
lo_adapter TYPE REF TO cl_salv_adapter,
lo_fullscreen_adapter TYPE REF TO cl_salv_fullscreen_adapter,
lo_grid_adapter TYPE REF TO cl_salv_grid_adapter,
lo_table_display_adapter TYPE REF TO if_salv_table_display_adapter,
lo_tree_adapter_base TYPE REF TO cl_salv_tree_adapter_base.

CHECK e_adapter_type IS REQUESTED OR
e_control IS REQUESTED.

IF e_adapter_type IS REQUESTED.
CLEAR e_adapter_type.
ENDIF.

IF e_control IS REQUESTED.
CLEAR e_control.
ENDIF.

lo_controller = i_salv->r_controller.
CHECK lo_controller IS BOUND.

lo_adapter = lo_controller->r_adapter.
CHECK lo_adapter IS BOUND.

IF e_adapter_type IS REQUESTED.
e_adapter_type = lo_adapter->type.
ENDIF.

CHECK e_control IS REQUESTED.

CASE lo_adapter->type.
WHEN lo_adapter->if_salv_adapter~c_adapter_type_fullscreen.
lo_fullscreen_adapter ?= lo_adapter.
e_control = lo_fullscreen_adapter->get_grid( ).

WHEN lo_adapter->if_salv_adapter~c_adapter_type_grid.
lo_grid_adapter ?= lo_adapter.
e_control = lo_grid_adapter->get_grid( ).

WHEN lo_adapter->if_salv_adapter~c_adapter_type_hierseq.

WHEN lo_adapter->if_salv_adapter~c_adapter_type_list.
lo_table_display_adapter ?= lo_adapter.
e_control = lo_table_display_adapter->r_table.

WHEN lo_adapter->if_salv_adapter~c_adapter_type_tree.
lo_tree_adapter_base ?= lo_adapter.
e_control = lo_tree_adapter_base->r_tree.

WHEN lo_adapter->if_salv_adapter~c_adapter_type_append.

ENDCASE.

ENDMETHOD. "get_control_internal

METHOD get_control_rtti.

DATA: lv_adapter_type TYPE salv_de_adapter_type,
lo_control TYPE REF TO object.

CHECK e_adapter_type IS REQUESTED OR
e_control_rtti IS REQUESTED.

IF e_adapter_type IS REQUESTED.
CLEAR e_adapter_type.
ENDIF.

IF e_control_rtti IS REQUESTED.
CLEAR e_control_rtti.
ENDIF.

get_control_internal( EXPORTING i_salv = i_salv IMPORTING e_adapter_type = lv_adapter_type e_control = lo_control ).

IF e_adapter_type IS REQUESTED.
e_adapter_type = lv_adapter_type.
ENDIF.

IF e_control_rtti IS REQUESTED.
e_control_rtti = cl_abap_typedescr=>describe_by_object_ref( lo_control ).
ENDIF.

ENDMETHOD. "get_control_rtti

METHOD get_control.

CHECK r_control IS REQUESTED.

get_control_internal( EXPORTING i_salv = i_salv IMPORTING e_control = r_control ).

ENDMETHOD. "get_control

METHOD set_editable.
CONSTANTS: lc_stable TYPE lvc_s_stbl VALUE 'XX'.

DATA: lo_grid TYPE REF TO cl_gui_alv_grid,
lt_fieldcat TYPE lvc_t_fcat,
ls_layout TYPE lvc_s_layo.

FIELD-SYMBOLS: <fs_fieldcat> LIKE LINE OF lt_fieldcat.

lo_grid ?= get_control( i_salv_table ).
CHECK lo_grid IS BOUND.

IF i_fieldname IS SUPPLIED AND
i_fieldname IS NOT INITIAL.
lo_grid->get_frontend_fieldcatalog( IMPORTING et_fieldcatalog = lt_fieldcat ).
READ TABLE lt_fieldcat ASSIGNING <fs_fieldcat> WITH KEY fieldname = i_fieldname.
CHECK sy-subrc = 0.
<fs_fieldcat>-edit = i_editable.
lo_grid->set_frontend_fieldcatalog( lt_fieldcat ).
ELSE.
lo_grid->get_frontend_layout( IMPORTING es_layout = ls_layout ).
ls_layout-edit = i_editable.
lo_grid->set_frontend_layout( EXPORTING is_layout = ls_layout ).
ENDIF.

* damit wir auf F4-Hilfen Auswahl oder wechsel des

* Eingabefeldes durch Tab Taste reagieren können
CALL METHOD lo_grid->register_edit_event
EXPORTING
i_event_id = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED
EXCEPTIONS
error = 1
others = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.


CHECK i_refresh = abap_true.
i_salv_table->refresh( lc_stable ).

ENDMETHOD. "set_editable

ENDCLASS. "lcl_salv_buddy IMPLEMENTATION



HANDLE_DOUBLE_CLICK bekommt z.b. den Inhalt

lcl_salv_buddy=>set_editable( i_fieldname = 'KTGRM' i_salv_table = mo_salv_table i_editable = 'X' ).

lcl_salv_buddy=>set_editable( i_fieldname = 'PRCTR' i_salv_table = mo_salv_table i_editable = 'X' ).

lcl_salv_buddy=>set_editable( i_fieldname = 'PRODH' i_salv_table = mo_salv_table i_editable = 'X' ).


Hier wird jedes editierbare Feld angegeben, alle nicht angegebenen Felder sind nicht editierbar.

Macht der User nun einen Doppelklick in eine Zeile der Ausgabe, werden alle angegebenen Felder eingabebereit.

In der salv_buddy Hilfsklasse ist MC_EVT_MODIFIED wichtig, damit auch Werte aus F4 Hilfen direkt übernommen werden.
Bent3227
.
.
 
Posts: 1
Joined: Fri Mar 24, 2017 2:47 pm


Return to ABAP Objects®

Who is online

Users browsing this forum: No registered users and 1 guest

cron