Code: Alles auswählen.
report z_test.
" ___ DEFINITION ____________________________________________________
class lcl_salv_handler definition.
public section.
types:
begin of lty_parameter,
dialog_with_splitter type boolean_flg,
dialog_with_text_editor type boolean_flg,
salv_in_fullscreen type boolean_flg,
end of lty_parameter.
methods:
constructor importing is_parameter type lty_parameter.
private section.
types:
begin of lty_dialog,
container type ref to cl_gui_dialogbox_container,
begin of dimensions,
height type i,
left type i,
top type i,
width type i,
end of dimensions,
splitter_bottom type ref to cl_gui_container,
splitter_container type ref to cl_gui_splitter_container,
splitter_top type ref to cl_gui_container,
text_editor type ref to cl_gui_textedit,
toolbar type ref to cl_gui_toolbar,
end of lty_dialog.
data:
mo_salv type ref to cl_salv_table,
mt_data type standard table of sbuspart with default key,
ms_dialog type lty_dialog,
ms_parameter type lty_parameter,
mv_selected_row type i.
methods:
adopt_change,
close_dialog,
create_salv,
show_dialog,
" --- event methods -------------------------------------------
on_dialog_close for event close of cl_gui_dialogbox_container importing sender,
on_dialog_toolbar_function for event function_selected of cl_gui_toolbar importing fcode,
on_double_click for event double_click of cl_salv_events_table importing row column.
endclass.
" ___ IMPLEMENTATION ________________________________________________
class lcl_salv_handler implementation.
" === adopt change ================================================
method adopt_change.
check ms_dialog-text_editor is not initial.
ms_dialog-text_editor->get_textstream(
importing
is_modified = data(lv_is_modified)
text = data(lv_text)
).
cl_gui_cfw=>flush( ).
check lv_is_modified is not initial.
mt_data[ mv_selected_row ]-contact = lv_text.
mo_salv->refresh(
refresh_mode = if_salv_c_refresh=>full
s_stable = value #(
col = abap_true
row = abap_true
)
).
if ms_parameter-salv_in_fullscreen is not initial.
cl_gui_cfw=>set_new_ok_code( |OK| ). " change is only shown after pai trigger
endif.
endmethod.
" === close dialog ================================================
method close_dialog.
check ms_dialog-container is not initial.
ms_dialog-container->get_height( importing height = ms_dialog-dimensions-height ).
ms_dialog-container->get_left( importing left = ms_dialog-dimensions-left ).
ms_dialog-container->get_top( importing top = ms_dialog-dimensions-top ).
ms_dialog-container->get_width( importing width = ms_dialog-dimensions-width ).
" --- free text editor ------------------------------------------
if ms_dialog-text_editor is not initial.
" =============================================================
" normally, adopt_change() should only be called when the user
" clicks on 'OK'. but as the text editor and toolbar cannot be
" shown together, the call of adopt_change( ) is included here.
" this line can be removed when the issue has been resolved.
" =============================================================
adopt_change( ).
ms_dialog-text_editor->free( ).
free ms_dialog-text_editor.
endif.
" --- free toolbar ----------------------------------------------
if ms_dialog-toolbar is not initial.
ms_dialog-toolbar->free( ).
free ms_dialog-toolbar.
endif.
" --- free splitter ---------------------------------------------
if ms_dialog-splitter_container is not initial.
if ms_dialog-splitter_top is not initial.
ms_dialog-splitter_container->remove_control(
column = 1
row = 1
).
ms_dialog-splitter_top->free( ).
free ms_dialog-splitter_top.
endif.
if ms_dialog-splitter_bottom is not initial.
ms_dialog-splitter_container->remove_control(
column = 1
row = 2
).
ms_dialog-splitter_bottom->free( ).
free ms_dialog-splitter_bottom.
endif.
ms_dialog-splitter_container->free( ).
free ms_dialog-splitter_container.
endif.
" --- free dialog -----------------------------------------------
ms_dialog-container->free( ).
free ms_dialog-container.
clear mv_selected_row.
endmethod.
" === constructor =================================================
method constructor.
ms_parameter = is_parameter.
ms_dialog-dimensions = value #(
height = 200
left = 200
top = 60
width = 400
).
select *
into corresponding fields of table mt_data
from sbuspart up to 20 rows.
create_salv( ).
endmethod.
" === create salv =================================================
method create_salv.
try.
if ms_parameter-salv_in_fullscreen is initial.
cl_salv_table=>factory(
exporting
r_container = cl_gui_container=>default_screen
importing
r_salv_table = mo_salv
changing
t_table = mt_data
).
else.
cl_salv_table=>factory(
importing
r_salv_table = mo_salv
changing
t_table = mt_data
).
mo_salv->get_functions( )->set_default( abap_true ).
endif.
mo_salv->get_columns( )->set_optimize( abap_true ).
mo_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>cell ).
set handler on_double_click for mo_salv->get_event( ).
catch cx_root.
" ...
endtry.
mo_salv->display( ).
if ms_parameter-salv_in_fullscreen is initial.
write space.
endif.
endmethod.
" === on dialog close =============================================
method on_dialog_close.
check sender is not initial.
close_dialog( ).
endmethod.
" === on dialog toolbar function ==================================
method on_dialog_toolbar_function.
case fcode.
when 'CANCEL'. close_dialog( ).
when 'OK'. adopt_change( ). close_dialog( ).
endcase.
endmethod.
" === on double click =============================================
method on_double_click.
check row > 0
and ms_dialog-container is initial.
mv_selected_row = row.
show_dialog( ).
endmethod.
" === show dialog =================================================
method show_dialog.
check ms_dialog-container is initial.
" --- create dialog ---------------------------------------------
ms_dialog-container = new #(
height = ms_dialog-dimensions-height
left = ms_dialog-dimensions-left
parent = cl_gui_container=>default_screen
top = ms_dialog-dimensions-top
width = ms_dialog-dimensions-width
).
set handler on_dialog_close for ms_dialog-container.
" --- splitter --------------------------------------------------
if ms_parameter-dialog_with_splitter is not initial.
ms_dialog-splitter_container = new #(
columns = 1
parent = ms_dialog-container
rows = 2
).
ms_dialog-splitter_top = new cl_gui_custom_container(
container_name = 'DIALOG_TOP'
).
ms_dialog-splitter_container->add_control(
column = 1
control = ms_dialog-splitter_top
row = 1
).
ms_dialog-splitter_bottom = new cl_gui_custom_container(
container_name = 'DIALOG_BOTTOM'
).
ms_dialog-splitter_container->add_control(
column = 1
control = ms_dialog-splitter_bottom
row = 2
).
endif.
" --- text editor -----------------------------------------------
if ms_parameter-dialog_with_text_editor is not initial.
ms_dialog-text_editor = new #(
parent = switch #( ms_parameter-dialog_with_splitter
when space then ms_dialog-container
else ms_dialog-splitter_top
)
).
ms_dialog-text_editor->set_textstream(
conv #( mt_data[ mv_selected_row ]-contact )
).
endif.
" --- toolbar ---------------------------------------------------
ms_dialog-toolbar = new #(
parent = switch #( ms_parameter-dialog_with_splitter
when space then ms_dialog-container
else ms_dialog-splitter_bottom
)
).
ms_dialog-toolbar->add_button(
butn_type = cntb_btype_button
fcode = 'OK'
icon = icon_okay
text = 'OK'
).
ms_dialog-toolbar->add_button(
butn_type = cntb_btype_button
fcode = 'CANCEL'
icon = icon_cancel
text = 'Cancel'
).
ms_dialog-toolbar->set_registered_events(
value #(
(
appl_event = 'X'
eventid = ms_dialog-toolbar->m_id_function_selected
)
)
).
set handler on_dialog_toolbar_function for ms_dialog-toolbar.
endmethod.
endclass.
* ___ INITIALIZATION ________________________________________________
initialization.
parameters:
p_salvfs as checkbox, " salv in fullscreen
p_diaspl as checkbox, " dialog with splitter
p_diated as checkbox. " dialog with text editor
data lt_seltexts type standard table of rsseltexts with default key.
lt_seltexts = value #(
( kind = |P| name = |P_DIASPL| text = |Dialog with Splitter| )
( kind = |P| name = |P_DIATED| text = |Dialog with Text Editor| )
( kind = |P| name = |P_SALVFS| text = |SALV in Fullscreen| )
).
call function 'SELECTION_TEXTS_MODIFY'
exporting
program = sy-cprog
tables
seltexts = lt_seltexts.
* ___ START-OF-SELECTION ____________________________________________
start-of-selection.
data(lo_salv_handler) = new lcl_salv_handler(
value #(
dialog_with_splitter = p_diaspl
dialog_with_text_editor = p_diated
salv_in_fullscreen = p_salvfs
)
).
Code: Alles auswählen.
" --- splitter --------------------------------------------------
if ms_parameter-dialog_with_splitter is not initial.
ms_dialog-splitter_container = new #(
columns = 1
parent = ms_dialog-container
rows = 2
).
ms_dialog-splitter_top = ms_dialog-splitter_container->get_container( column = 1 row = 1 ).
ms_dialog-splitter_bottom = ms_dialog-splitter_container->get_container( column = 1 row = 2 ).
endif.
Code: Alles auswählen.
report z_test.
" ___ DEFINITION ____________________________________________________
class lcl_salv_handler definition.
public section.
methods:
constructor importing iv_salv_in_fullscreen type boolean_flg.
private section.
types:
begin of lty_dialog,
container type ref to cl_gui_dialogbox_container,
begin of dimensions,
height type i,
left type i,
top type i,
width type i,
end of dimensions,
splitter_container type ref to cl_gui_splitter_container,
text_editor type ref to cl_gui_textedit,
toolbar type ref to cl_gui_toolbar,
end of lty_dialog.
data:
mo_salv type ref to cl_salv_table,
mt_data type standard table of sbuspart with default key,
ms_dialog type lty_dialog,
mv_salv_in_fullscreen type boolean_flg,
mv_selected_row type i.
methods:
adopt_change,
close_dialog,
create_salv,
show_dialog,
" --- event methods -------------------------------------------
on_dialog_close for event close of cl_gui_dialogbox_container importing sender,
on_dialog_toolbar_function for event function_selected of cl_gui_toolbar importing fcode,
on_double_click for event double_click of cl_salv_events_table importing row column.
endclass.
" ___ IMPLEMENTATION ________________________________________________
class lcl_salv_handler implementation.
" === adopt change ================================================
method adopt_change.
check ms_dialog-text_editor is not initial.
ms_dialog-text_editor->get_textstream(
importing
is_modified = data(lv_is_modified)
text = data(lv_text)
).
cl_gui_cfw=>flush( ).
check lv_is_modified is not initial.
mt_data[ mv_selected_row ]-contact = lv_text.
mo_salv->refresh(
refresh_mode = if_salv_c_refresh=>full
s_stable = value #(
col = abap_true
row = abap_true
)
).
if mv_salv_in_fullscreen is not initial.
" =============================================================
" SALV in fullscreen is updated after additional PAI trigger
" =============================================================
call function 'SAPGUI_SET_FUNCTIONCODE'
exporting
functioncode = 'CANCEL'.
endif.
endmethod.
" === close dialog ================================================
method close_dialog.
check ms_dialog-container is not initial.
ms_dialog-container->get_height( importing height = ms_dialog-dimensions-height ).
ms_dialog-container->get_left( importing left = ms_dialog-dimensions-left ).
ms_dialog-container->get_top( importing top = ms_dialog-dimensions-top ).
ms_dialog-container->get_width( importing width = ms_dialog-dimensions-width ).
" --- free text editor ------------------------------------------
if ms_dialog-text_editor is not initial.
ms_dialog-text_editor->free( ).
free ms_dialog-text_editor.
endif.
" --- free toolbar ----------------------------------------------
if ms_dialog-toolbar is not initial.
ms_dialog-toolbar->free( ).
free ms_dialog-toolbar.
endif.
" --- free splitter ---------------------------------------------
if ms_dialog-splitter_container is not initial.
ms_dialog-splitter_container->free( ).
free ms_dialog-splitter_container.
endif.
" --- free dialog -----------------------------------------------
ms_dialog-container->free( ).
free ms_dialog-container.
clear mv_selected_row.
endmethod.
" === constructor =================================================
method constructor.
mv_salv_in_fullscreen = iv_salv_in_fullscreen.
ms_dialog-dimensions = value #(
height = 200
left = 200
top = 60
width = 400
).
select *
into corresponding fields of table mt_data
from sbuspart up to 20 rows.
create_salv( ).
endmethod.
" === create salv =================================================
method create_salv.
try.
if mv_salv_in_fullscreen is initial.
cl_salv_table=>factory(
exporting
r_container = cl_gui_container=>default_screen
importing
r_salv_table = mo_salv
changing
t_table = mt_data
).
else.
cl_salv_table=>factory(
importing
r_salv_table = mo_salv
changing
t_table = mt_data
).
mo_salv->get_functions( )->set_default( abap_true ).
endif.
mo_salv->get_columns( )->set_optimize( abap_true ).
mo_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>cell ).
set handler on_double_click for mo_salv->get_event( ).
catch cx_root.
" ...
endtry.
mo_salv->display( ).
if mv_salv_in_fullscreen is initial.
write space.
endif.
endmethod.
" === on dialog close =============================================
method on_dialog_close.
check sender is not initial.
close_dialog( ).
endmethod.
" === on dialog toolbar function ==================================
method on_dialog_toolbar_function.
case fcode.
when 'CANCEL'. close_dialog( ).
when 'OK'. adopt_change( ). close_dialog( ).
endcase.
endmethod.
" === on double click =============================================
method on_double_click.
check row > 0
and ms_dialog-container is initial.
mv_selected_row = row.
show_dialog( ).
endmethod.
" === show dialog =================================================
method show_dialog.
check ms_dialog-container is initial.
" --- create dialog ---------------------------------------------
ms_dialog-container = new #(
height = ms_dialog-dimensions-height
left = ms_dialog-dimensions-left
parent = cl_gui_container=>default_screen
top = ms_dialog-dimensions-top
width = ms_dialog-dimensions-width
).
set handler on_dialog_close for ms_dialog-container.
" --- splitter --------------------------------------------------
ms_dialog-splitter_container = new #(
columns = 1
parent = ms_dialog-container
rows = 2
).
" --- text editor -----------------------------------------------
ms_dialog-text_editor = new #(
parent = ms_dialog-splitter_container->get_container(
column = 1
row = 1
)
).
ms_dialog-text_editor->set_textstream(
conv #( mt_data[ mv_selected_row ]-contact )
).
" --- toolbar ---------------------------------------------------
ms_dialog-toolbar = new #(
parent = ms_dialog-splitter_container->get_container(
column = 1
row = 2
)
).
ms_dialog-toolbar->add_button(
butn_type = cntb_btype_button
fcode = 'OK'
icon = icon_okay
text = 'OK'
).
ms_dialog-toolbar->add_button(
butn_type = cntb_btype_button
fcode = 'CANCEL'
icon = icon_cancel
text = 'Cancel'
).
ms_dialog-toolbar->set_registered_events(
value #(
(
appl_event = 'X'
eventid = ms_dialog-toolbar->m_id_function_selected
)
)
).
set handler on_dialog_toolbar_function for ms_dialog-toolbar.
endmethod.
endclass.
* ___ INITIALIZATION ________________________________________________
initialization.
parameters:
p_salvfs as checkbox. " salv in fullscreen
data lt_seltexts type standard table of rsseltexts with default key.
lt_seltexts = value #(
( kind = |P| name = |P_SALVFS| text = |SALV in Fullscreen| )
).
call function 'SELECTION_TEXTS_MODIFY'
exporting
program = sy-cprog
tables
seltexts = lt_seltexts.
* ___ START-OF-SELECTION ____________________________________________
start-of-selection.
data(lo_salv_handler) = new lcl_salv_handler(
iv_salv_in_fullscreen = p_salvfs
).
Und das ist das in meinen Augen Traurige. Benutzereingaben gehen ja in Controls über Editorcontrol, Dynamic irgendwas Controls ( Siehe SE80 ) oder einen ALV. Und halt über Dynpros. Und ich bin nach wie vor der Meinung, dass das die altbackenen Dynpros bei "normalen" Feldern die anderen Möglichkeiten um Längen schlagen was Handling und Übersichtlichkeit angeht. Und auch die Einfachheit der Implementierung ( z.B. Prüftabelle, Suchhilfe in DDIC-Struktur hinterlegen, autom. F1 und F4, uvm ) . Die Sprache schenkt einem hier so viel und ich verstehe nicht, warum man unbedingt daran vorbeiprogrammieren möchte, es sei denn aus rein akademischem Interesse oder weil man nicht bereit ist von Eclipse mal in die SAPGUI zu wechseln.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
DeathAndPain
Code: Alles auswählen.
SET HANDLER ... FOR ...
Seit wann hängen Elemente des DDIC vom verwendeten SAPGui ab?!?rob_abc hat geschrieben:Nutze hier SAP GUI 7.80 rev 7 for JAVA mit der Docker-Trial. Die kennt übriegens boolean_flg nicht
Und in der SE38 überhaupt keine?! Davon abgesehen kann ich nicht erkennen, was an den Farbeinstellungen in Eclipse spartanisch sein soll. Da kannste ja so ziemlich jede Farbe so ändern, wie Du es magst. Zugegebenermaßen ist es etwas unübersichtlich, welche Einstellungsfarbe sich nachher auf welches Element bezieht, aber das fummelt man sich einmal zurecht und hat es dann bis in alle Ewigkeit.tar hat geschrieben:Ich bin ausschließlich in der SAPGUI und im dortigen ABAP Editor unterwegs, weil ich Eclipse umständlicher und an sich nicht wirklich gut finde. Es gibt da im Grunde lediglich 2 wesentliche Funktionen, die mir im ABAP Editor fehlen: nicht verwendete Variablen entfernen und das im Git hinterlegte Code Formatting. Dementgegen gibt es in Eclipse spartanische Farbeinstellungen
Kann ich überhaupt nicht verstehen. Das, was einen beim Arbeiten am Computer am meisten aufhält, sind Eingabenmedienbrüche, also Wechsel zwischen Tastatur und Maus (erst mal Hand auf die Maus, Mauscursor auf dem Bildschirm lokalisieren, dann zum Button navigieren und klicken und dann Hand wieder zur Tastatur). Stattdessen alles einfach durch einen Tastendruck erledigen zu können, während man die Hände ohnehin auf der Tastatur hat, ist doch viel flüssiger!tar hat geschrieben:keinen Pretty Printer Button (ich mag keine Fingerverrenkung für STRG+F3 oder was es war)
Viel ist das heute gar nicht mehr (frag mal Ralf 😁), wobei ich persönlich dennoch dafür die SAPGui nutze. Aber sieh es mal so rum: Für alles, was Du in der SE38 nicht machen kannst, musst Du auch in einen anderen SAPGui-Modus springen. Da ist exakt genauso wie der Wechsel vom Eclipse-Fenster zum SAPGui-Fenster. Nur:tar hat geschrieben:und man muss für alles, was in Eclipse fehlt, separat in die SAPGUI springen
Den Layout-Editor kennst Du aber schon, oder? Und beim CALL SCREEN-Befehl kannst Du durchaus Position und Größe dynamisch angeben.tar hat geschrieben:Warum ich Dynpros/Screens nicht mag:
Man kann damit nicht wie mit einem normalen Fenster agieren, d.h. sie nicht einfach mal umpositionieren oder resizen.
Ich persönlich habe noch keinen Kunden gesehen, der Eclipse explizit nicht erlaubt hätte. (MIr fällt dafür auch kein Grund ein; über sowas würde ich immer mit dem Kunden reden.) Das Problem ist eher die Einwahl: Wenn Du Dich nicht direkt verbinden kannst, sondern per Remote Desktop o.ä. über ein Remote-System ohne dort installiertes Eclipse gehen musst, dann hast Du halt nicht die Wahl. Insofern klar: man muss die Fähigkeit haben, mit der SE38 umzugehen. Aber mit Eclipse programmiert es sich viel flüssiger und schneller, wenn man sich erst mal dran gewöhnt hat. Dein Argument ist sowas wie: ich muss mit Formroutinen und Kopfzeilen umgehen können, da ich mit viel altem Code konfrontiert werde, der sie halt noch enthält. Also warum sollte ich mich auf modernes Coding umgewöhnen, wenn ich in jedem 3. Programm ohnehin noch mit dem alten Müll arbeiten muss? Vielleicht ist das ja ein Grund, weshalb so viele Leute auch heute noch antiken Code schreiben.tar hat geschrieben:Obendrein ist die Nutzung von Eclipse auch kundenabhängig, da es SAP-seitig erlaubt werden muss. Also wozu etwas umlernen, was der 3. Kunde dann ohnehin verbietet?
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag (Insgesamt 3):
rob_abc • black_adept • Murdock
Habe ich schon bei vielen Kunden angefragt und die Basis war im Allgemeinen sehr entgegenkommend, wenn man ihnen sagt, dass man das eigentlich nur im Entwicklungs- und/oder Testsystem benötigt.DeathAndPain hat geschrieben: ↑22.11.2024 10:54auch wenn ich hier im Forum gehört habe, dass sich die Beschränkung auf maximal 6 Modi im SAPGui-Fenster per Servereinstellung aufheben lässt, habe ich noch kein reales System zu Gesicht bekommen, bei dem das tatsächlich gemacht worden wäre.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
DeathAndPain