Da ich so selten modale Dialogfenster baue weiß ich es nicht aus dem Kopf: Probier mal anstatt cl_gui_container=>default_screen cl_gui_container=>screen0
Das ist korrekt, finde ich aber erfahrungsgemäß aus mehreren Gründen nicht gut (vorrangig, weil Bearbeitungen in einer großen Liste schnell zu Fehleingaben führen) und wesentlich eleganter, wenn es (via Doppelklick) ein Popup für die zu ändernde Zeile gibt, bei dem erst nach einem Klick auf "OK" die zugehörigen Daten wirklich verändert/gespeichert werden. In diesen Event/UCOMM/OK-CODE gehören dann auch weitere, ggf. komplexere Validierungen und Anzeigeanpassungen (Einfärbungen, whatever). In das Popup könnte zudem auch ein "Lösch"-Button.DeathAndPain hat geschrieben: ↑01.09.2024 19:19ALVs können doch selbst auch editierbar gesteuert werden. Wäre das nicht der direkteste Ansatz für Dein Problem? Wenn das ALV selber editierbar ist, brauchst Du kein modales Fenster mehr, das letztlich den gleichen Inhalt nochmal in editierbarer Form enthält.
Das und auch bis Screen9 hat leider nicht funktioniert, weil "bereits eine Liste aktiv ist".black_adept hat geschrieben: ↑01.09.2024 23:11Da ich so selten modale Dialogfenster baue weiß ich es nicht aus dem Kopf: Probier mal anstatt cl_gui_container=>default_screen cl_gui_container=>screen0
M.E. solltest du dann zwar weiterhin Probleme haben Folgedynpros auf der obersten Ebene darzustellen, aber ein Modalfenster ( wenn es auf einen modalen Dynpro gebunden ist ) sollte eigentlich sichtbar sein.
Als "allgemeinen" Datentyp kannst du LVC_VALUE nehmen. Das ist der Datentyp den das (S)ALV intern verwendet und somit der maximalen Eingabelänge von 128 Zeichen entspricht. Darauf aufbauend musst du dann nur noch die jeweiligen Formatierungen (z.B. für Zahlen, Datum, Zeiten usw.) für die Aus- und Eingabe realisieren.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag (Insgesamt 2):
whaslbeck • tar
Aber du rufst den modalen Dialog schon mit CALL SCREEN xxxx STARTING AT ... auf um den Popuplevel zu erhöhen und somit von SCREEN0 auf SCREEN1 zu wechseln?
Wir reden da etwas aneinander vorbei. Meine Ausgangssituation ist ein Report, der gänzlich ohne selbst angelegte Dynpros funktioniert. Es gibt da also keinen (weiteren) SCREEN, den man mit STARTING AT rufen könnte. Es gibt lediglich (und das auch nicht immer) den (durch die Select-Options/Parameter) generierten SCREEN 1000 und einen pseudo-generierten CL_GUI_CONTAINER=>DEFAULT_SCREEN, der letztlich beim Erzeugen des (S)ALV genutzt und mittels WRITE SPACE erzeugt wird. Man kann stattdessen auch SCREEN0-9 angeben, was rein gar nichts an der Grundsituation ändert.black_adept hat geschrieben: ↑02.09.2024 17:25Aber du rufst den modalen Dialog schon mit CALL SCREEN xxxx STARTING AT ... auf um den Popuplevel zu erhöhen und somit von SCREEN0 auf SCREEN1 zu wechseln?
Code: Alles auswählen.
report z_show_salv.
" --- get data ------------------------------------------------------
select *
into table @data(lt_data)
from t100 up to 20 rows.
data lo_salv type ref to cl_salv_table.
" --- prepare salv --------------------------------------------------
try.
cl_salv_table=>factory(
exporting
r_container = cl_gui_container=>default_screen
importing
r_salv_table = lo_salv
changing
t_table = lt_data
).
lo_salv->get_columns( )->set_optimize( abap_true ).
lo_salv->get_functions( )->set_default( abap_true ).
lo_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>cell ).
catch cx_salv_data_error.
catch cx_salv_existing.
catch cx_salv_msg.
catch cx_salv_wrong_call.
endtry.
" --- display salv --------------------------------------------------
lo_salv->display( ). " usually salv is shown here but screen is not generated, yet
write space. " screen is generated => salv is finally shown
Ich verstehe nicht wieso du diesen überhaupt mit angibst. Auch das WRITE SPACE ist ja ein Krücke die man eigentlich nicht braucht.
Code: Alles auswählen.
report z_show_salv.
" --- get data ------------------------------------------------------
select *
into table @data(lt_data)
from t100 up to 20 rows.
data lo_salv type ref to cl_salv_table.
" --- prepare salv --------------------------------------------------
try.
cl_salv_table=>factory(
* exporting
* r_container = cl_gui_container=>default_screen
importing
r_salv_table = lo_salv
changing
t_table = lt_data
).
lo_salv->get_columns( )->set_optimize( abap_true ).
lo_salv->get_functions( )->set_default( abap_true ).
lo_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>cell ).
catch cx_salv_data_error.
catch cx_salv_existing.
catch cx_salv_msg.
catch cx_salv_wrong_call.
endtry.
" --- display salv --------------------------------------------------
lo_salv->display( ). " usually salv is shown here but screen is not generated, yet
*write space. " screen is generated => salv is finally shown
Darum:
Code: Alles auswählen.
mo_salv->get_functions( )->add_function(
name = |BTN_EDIT|
icon = |{ icon_edit_file }|
text = |Edit|
tooltip = |Bearbeiten|
position = if_salv_c_function_position=>right_of_salv_functions
).
Welche Vorteile bringt mir der "richtige" GUI-Status?
Erst ab SAP v7.56 - viele Kunden tungeln noch mit SAP v7.50 rum. Es gibt wohl auch irgendeinen Trick, das pre-v7.56 hinzubiegen - den hab ich aber noch nicht herausgefunden. Bliebe ALV oder TABLE_CONTROL samt SCREEN. Mittlerweile finde ich jedoch die vorgeschlagene CL_WDY_WB_PROPERTY_BOX dafür am geeignetsten - erinnert mich an das PropertyGrid aus C#.
Der quittiert immer mit Fehler - geht wohl nur mit DICT-Tables?
Naja, den GUI-Status kopieren und erweitern verhindert den Dump.tar hat geschrieben: ↑04.09.2024 00:31Darum:
Das dumpt ohne Container.Code: Alles auswählen.
mo_salv->get_functions( )->add_function( name = |BTN_EDIT| icon = |{ icon_edit_file }| text = |Edit| tooltip = |Bearbeiten| position = if_salv_c_function_position=>right_of_salv_functions ).
Der SALV im Fullscreenmodus verhält sich an diversen Stellen etwas anders als im auf einen Dynpro gebundenen Modus. Wenn ich mich recht entsinne ( habe den Fullscreen zu lange nicht mehr verwendet ) konnte man im Fullscreenmodus die Exceptions z.B. nicht auf die kurzen LEDs umschalten sondern muss immer mit der langen Ampel arbeiten. Der Aufruf funktioniert zwar und es gibt auch keine Fehlermeldung, aber die LEDs bzw. die anderen Darstellungen die es noch gibt, werden einfach nicht dargestellt. Ok - nicht wirklich weltbewegend, aber ich mag halt lieber die LEDs. Und es gab/gibt noch diverse andere Sachen, wo es sich halt marginal unterschiedlich (vor allem zum Cl_gui_alv_grid ) verhält.