Dialog-Container mit Toolbar/Status

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Benutzeroberflächen in SAP®-Systemen.
19 Beiträge • Seite 1 von 2 (current) Nächste
19 Beiträge Seite 1 von 2 (current) Nächste

Dialog-Container mit Toolbar/Status

Beitrag von tar (ForumUser / 99 / 22 / 29 ) »
Aloha,

für Nutzereingaben möchte ich gerne einen Dialog-Container nutzen, weil man die Position & Größe des Fenster (wie bei normalen Fenstern gewohnt) direkt verändern kann und beides beim Schließen auch hinterlegen und wiederverwenden kann.

Leider gefällt mir dabei aber nicht, dass es nur einen pauschalen Schließen-Knopf und kein OK/CANCEL gibt. Der Nutzer hat also keine Möglichkeit, abzubrechen oder zu bestätigen. Daher möchte ich da zusätzlich zum eigentlich angezeigten Dialog-Inhalt einen entsprechenden Status/Toolbar nutzen, was mir jedoch nicht so recht gelingen will.

Ich kann zwar den Texteditor anzeigen und etwaige Eingaben übernehmen und auch eine Toolbox mit Buttons anzeigen und auswerten, aber nicht beides gleichzeitig, weil der Splitter-Container samt Kind-Containern zwar angezeigt wird, die aber weder mit Texteditor, noch mit Toolbox befüllt werden.

Habt ihr eine Idee, woran das liegt?

Seltsam finde ich auch, dass beim SALV im Vollbildmodus Änderungen des Texteditors trotz explizitem Full-Refresh nicht direkt übernommen werden, sondern erst nach nochmaliger PAI-Triggerung.

Anbei mein Test-Report:

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
    )
  ).

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Dialog-Container mit Toolbar/Status

Beitrag von rob_abc (Specialist / 106 / 27 / 44 ) »

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.
Damit wurden mir zumindest die Splitter angezeigt, siehe Bild: https://i.imgur.com/lznJn2v.png

Aber dafür dumpt die toolbar =) Habe leider nicht wirklich Ahnung von Containern, bin aber auf die Lösung gespannt.

Übernahme der geänderten Daten hat im unveränderten Code im ersten PAI funktioniert. Nutze hier SAP GUI 7.80 rev 7 for JAVA mit der Docker-Trial. Die kennt übriegens boolean_flg nicht, musste ich durch abap_bool ersetzen.

Die Anzeige ohne SALV im fullscreen ist bei mir kaputt: https://i.imgur.com/i4wEHhm.png

Folgende Benutzer bedankten sich beim Autor rob_abc für den Beitrag:
tar


Re: Dialog-Container mit Toolbar/Status

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
ich denke, die Lösung von rob_abc ist korrekt. Du kannst einen Custom-Container nur in einen auf dem Dynpro definierten Bereich "Custom Container" verwenden.

Das ganze "free splitter" kannst du dir sparen. Da kommen bei mir shortdumps.

Re: Dialog-Container mit Toolbar/Status

Beitrag von black_adept (Top Expert / 4087 / 126 / 940 ) »
Die Lösung von rob_abc ist korrekt. Aber in der von Enno angesprochenen Routine, die den FREE auf den Splitter macht, dumpt es, weil noch versucht wird die beiden Container freizugeben. Wenn man dieses unterlässt, weil der Splitter seine Container halt gerne selber verwalten möchte, und einfach die FREE-Methode des Splitters aufruft funktioniert es. Aber nicht im Fullscreen modus - dort erst nach Auslösen eines der Funktionscode wie sortieren.
Aber den SALV im Fullscreenmodus würde ich sowieso verbieten. Der basiert auf den alten REUSE-Bausteinen und arbeitet mit Callback-Routinen etc und hat noch diverse anderen Einschränkungen. z.B. triggern die Funktionscodes der Dialogbox einen PAI des Fullscreensalv aber nicht mit sinnvollen Daten . Fullscreensalv ist so ein Ding, dass man am Besten nur zum Ausgeben einer trivialen Liste verwendet aber bei nichts, was komplexer ist.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dialog-Container mit Toolbar/Status

Beitrag von tar (ForumUser / 99 / 22 / 29 ) »
Sehr geil, rob_abc - es funktioniert nun wunderbar, auch als Fullscreen-Variante!

Wg. BOOLEAN_FLG: das hab ich frecherweise einfach angelegt.
boolean_flg.png
Zum Triggern des PAI für die Fullscreen-Variante musste ich auf den FB "SAPGUI_SET_FUNCTIONCODE" ausweichen und einen explizit vorhandenen Funktionscode angeben. Vielleicht wäre das auch die Lösung von a-dead-trousers bei seinem Problem.

Hier der fertige Code:

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
  ).
Man könnte/müsste/sollte nun das ganze Dialog-Zeug noch in eine eigene Klasse separieren, aber ich bin erstmal froh, dass es überhaupt grundsätzlich geht und man sich so den ganzen üblichen Dynpro/Screen-Kram ersparen kann 🤓

Re: Dialog-Container mit Toolbar/Status

Beitrag von black_adept (Top Expert / 4087 / 126 / 940 ) »
tar hat geschrieben:
19.11.2024 01:27
Sehr geil, rob_abc - es funktioniert nun wunderbar, auch als Fullscreen-Variante!

[...]

aber ich bin erstmal froh, dass es überhaupt grundsätzlich geht und man sich so den ganzen üblichen Dynpro/Screen-Kram ersparen kann 🤓
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.

Dieser Thread ist ein Paradebeispiel dafür. Statt Editcontrol und Toolbarcontrol verzweifelt irgendwie so anzuordnen, dass sie grob wie ein Dynpro aussehen, könnte man auch gleich einen modalen Screen + GUI-Status dafür anlegen. Aufwand und Komplexität deutlich geringenr als das, was hier gemacht wird.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
DeathAndPain

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dialog-Container mit Toolbar/Status

Beitrag von tar (ForumUser / 99 / 22 / 29 ) »
Vorab: 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, keinen Pretty Printer Button (ich mag keine Fingerverrenkung für STRG+F3 oder was es war) und man muss für alles, was in Eclipse fehlt, separat in die SAPGUI springen. 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?

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. Von dynamischen Anpassungen gar nicht zu reden, d.h. es gibt kaum bis keine Wiederverwendbarkeit. Das ist für mich Technik von 1980. Selbst Windows 3.1 war da schon weiter.

Im Gegensatz dazu sind Container deutlich flexibler und können ohne zusätzliche Dictionary-Objekte verwendet werden. Doch auch hier gibt es ein Grundproblem: es gibt keinen wirklich modalen Dialog, aber nur ein Dialog verhält sich wie ein tatsächliches, flexibles Fenster (deswegen der Versuch in diesem Beitrag).

Dahingehend fände ich es letztlich sehr viel sinnvoller, statt Funktionsgruppen mit jeweils expliziter Dynpro-/Screen-Logik und zig zusätzlichen Dictionary-Objekten allgemein wiederverwendbare GUI-Controls (bspw. ein allgemeines, flexibles Dialog-Control mit OK/Cancel wie hier prototyped) als schlanke Klassen im Dictionary anzulegen. Was man dem GUI-Control dann jeweils übergibt ((S)ALV, TextEditControl, TableControl, Text-Eingabefelder, HtmlControl, whatever), ist wiederum eine andere Baustelle und dessen Handling sollte außerhalb des GUI-Controls liegen.

Kurz: das ist hier noch nicht fertig.

Re: Dialog-Container mit Toolbar/Status

Beitrag von black_adept (Top Expert / 4087 / 126 / 940 ) »
Moin tar,

vielleicht solltest du dir dann mal die "Dynamic Documents" von SAP anschauen. Das sind im die CL_DD* Klassen. Ich mag die auch nicht wirklich, aber sie dürften deinem Ansatz eigentlich deutlich mehr entsprechen.
Leider weiß ich gar nicht ob SAP hierfür Beispielprogramme anbietet.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dialog-Container mit Toolbar/Status

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
ja, es gibt Demoprogramme: DD_ADD_*
Allerdings gibt es auch hier kein "Memo"-Feld.
Die Verwendung ist grausam und umständlich.

Re: Dialog-Container mit Toolbar/Status

Beitrag von tar (ForumUser / 99 / 22 / 29 ) »
Gibt es eigentlich eine Möglichkeit, den Event CL_GUI_CONTROL-SIZE_CONTROL abzufangen?

Re: Dialog-Container mit Toolbar/Status

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Äh ... Ja:

Code: Alles auswählen.

SET HANDLER ... FOR ...
Da es sich um ein PUBLIC Event handelt sollte das gehen. Die Frage ist nur, wie sinnvoll das ist, bei jeder Größenänderung des Controls benachrichtigt zu werden.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Dialog-Container mit Toolbar/Status

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
du kannst es machen, aber ich glaube, es funktioniert nicht.

Re: Dialog-Container mit Toolbar/Status

Beitrag von tar (ForumUser / 99 / 22 / 29 ) »
Set Handler... zieht eben nicht und für set_registered_events() ist die Event-ID unklar. Grund hierfür ist, dass die beim Erzeugen festgelegte Splitterhöhe dubioserweise prozentual ist und sich durch die Größenänderung beim Dialogcontainer natürlich hier ungewollt verändert, d.h. man in diesem Event die Splitterhöhe anpassen muss, was aber eben nicht geht, da der Event nicht zieht.

Re: Dialog-Container mit Toolbar/Status

Beitrag von DeathAndPain (Top Expert / 1939 / 257 / 412 ) »
rob_abc hat geschrieben:Nutze hier SAP GUI 7.80 rev 7 for JAVA mit der Docker-Trial. Die kennt übriegens boolean_flg nicht
Seit wann hängen Elemente des DDIC vom verwendeten SAPGui ab?!?
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
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:keinen Pretty Printer Button (ich mag keine Fingerverrenkung für STRG+F3 oder was es war)
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:und man muss für alles, was in Eclipse fehlt, separat in die SAPGUI springen
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:
  • auch 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. Jedes SE38-Fenster kostet Dich einen kostbaren Modus. Hingegen zählt Dein Eclipse-Fenster nicht gegen dieses Maximum, und Du kannst darin (per Tabreiter) so viele Programme gleichzeitig offen halten, wie Du magst. Sogar von verschiedenen SAP-Systemen und sogar, wenn Du zur Zeit gar nicht an jenem System angemeldet bist! (In letzterem Fall ist nur der Tabreiter da und versucht sich erst dann zu verbinden, wenn Du ihn auswählst. Bis dahin muss noch nicht mal die VPN-Verbindung zum betreffenden Kunden stehen. Dennoch hast Du so auf die Schnelle alle ABAP-Projekte, an denen Du arbeitest, als Tabreiter im Zugriff. Du hast auch bei der Arbeit an einem Programm alle Includes desselben (TOP-Include etc.) als Tabreiter im Zugriff. Verglichen damit ist das, was die SE38 macht, doch ein Krampf (wobei das auch in Eclipse so geht, wenn es Dir im Einzelfall lieber ist).
  • Wenn Deine Leitung mal wackelt, fliegst Du hochkant aus der SE38 raus, und was bis dahin nicht gesichert ist, ist verloren. Dann musst Du Dich neu anmelden, SE38 neu starten und Deine Codestelle wiederfinden. Inn Eclipse passiert genau gar nichts, wenn Deine Leitung zusammenbricht. Klar, Du kannst dann nicht mehr sichern oder generieren, aber das Editorfenster bleibt offen, und wenn 5 Minuten (oder ein neues VPN-Login) später Deine Leitung wieder steht, kannst Du einfach weiterarbeiten und hast nichts verloren. Das gilt auch für automatische Logouts durch Inaktivität (auch wenn es die meiner Meinung nach auf keinem Entwicklungssystem geben sollte, aber bei manchen Firmen ist die Realität halt eine andere).
  • Du kannst bei Eclipse die Schriftgröße fein einstellen, genau so, wie Du es magst (abhängig von Deinem Monitor, der Qualität Deiner Augen und Deiner Präferenz). Aber selbst im Default siehst Du viel mehr Quellcode auf dem Bildschirm als bei der SE38.
  • Du kannst bei Eclipse Schlüsselwörter (z.B. Variablennamen) per Doppelklick markieren und Copy&Paste anwenden. Dabei verhält Eclipse sich intelligent und markiert z.B. bei Feldsymbolen auch die zum Namen gehörenden Winkel. Das nervt doch immer richtig in der SE38, dass er dann zur Definition des Datenobjektes springt, so dass Markieren per Doppelklick nach den bestehenden Windows-Standards in der SE38 nicht möglich ist.
  • Du kannst in Eclipse rasch mal mit Strg+Shift+R ein Refactoring anstoßen und damit mit wenigen Tastendrücken Variablen oder Namen von Unterprogrammen umbenennen (und zwar includeübergreifend!). Die SE38 kann das überhaupt nicht, sondern allenfalls die SE24.
  • In Eclipse findet eine Syntaxprüfung statt, während Du tippst. Du musst also nicht erst generieren, um zu sehen, wo Du einen Programmierfehler drin hast, sondern siehst es quasi in Echtzeit.
  • Der Einrückungsassistent in Eclipse ist viel intelligenter. In der SE38 nervt mich das immer, wo er mir in neuen Zeilen den Cursor hinstellt.
  • In Eclipse kannst Du den Cursor auf ein Feld oder einen Routinennamen stellen und erhältst per F2 dessen Defition eingeblendet. In der SE38 geht das auch, aber die springt dann direkt an die Codestelle der Definition (was Du in Eclipse per Strg+Klick machen kannst), während Du in Eclipse dort bleiben kannst, wo Du gerade bist und nur kurz auf die Definition schauen kannst.
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.
Den Layout-Editor kennst Du aber schon, oder? Und beim CALL SCREEN-Befehl kannst Du durchaus Position und Größe dynamisch angeben.

Klar ist das nicht topmodern auf heutigem Niveau gelöst. Aber die Vorteile, die black_adept genannt hat, sind hieb- und stichfest. Und kennen muss man die Dynprotechnik als ABAP-Entwickler sowieso, denn man muss sie auch heute noch warten können. Wenn man es also sowieso können muss, kommt man so, wie von black_adept ausgeführt, einfach schneller und bequemer zum Ziel.
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?
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.

Ich bin damals so rangegangen und habe gesagt, es gibt da Eclipse. Das kenne ich noch gar nicht, zumal ich in keinen anderen Programmiersprachen unterwegs bin, bei denen Eclipse eine Rolle spielen würde. Insofern probiere ich es einfach mal aufgeschlossen aus und schaue, wie es sich damit arbeitet. Aber eben - wie gesagt- aufgeschlossen. Mittlerweile will ich es nicht mehr missen und fluche jedesmal, wenn ich über ein Remotesystem bei einem Kunden aufs System muss.

Ich verfolge auch den Ansatz, einem Kunden gegenüber anzudeuten, dass für dieselbe Arbeit mehr Beraterstunden anfallen werden, wenn Eclipse nicht genutzt werden kann. Denn damit schaffe ich einfach deutlich mehr in derselben Zeit, weil alles viel übersichtlicher ist (allein schon durch die Farbgebung, die in der SE38 nicht vorhanden ist) und es sich viel flüssiger damit entwickelt.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag (Insgesamt 2):
rob_abcblack_adept


Re: Dialog-Container mit Toolbar/Status

Beitrag von black_adept (Top Expert / 4087 / 126 / 940 ) »
DeathAndPain hat geschrieben:
22.11.2024 10:54
auch 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.
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.
So etwa sieht das bei den meisten meiner Kunden aus, wenn ich interveniert habe - und beachte, dass ich nicht mal das Maximum ausschöpfe sondern sehr ressourcenschonend rangehe 😃 .
Profilparameter max modes.png

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
DeathAndPain

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Vergleichbare Themen

5
Antw.
4202
Views
Docking Container / Call Dialog
von eschi78 » 21.05.2012 10:11 • Verfasst in ABAP Objects®
6
Antw.
2377
Views
SALV Fullscreen pf-status für Toolbar
von Cubitus » 03.05.2024 14:20 • Verfasst in ABAP® für Anfänger
7
Antw.
4567
Views
Dialog zum Drucken
von Jessy83 » 26.02.2008 11:56 • Verfasst in Dialogprogrammierung
1
Antw.
2400
Views
Reaktion auf /N im Dialog?
von Hellbender » 24.01.2007 10:37 • Verfasst in Dialogprogrammierung
1
Antw.
4732
Views
ALE Verarbeitung im Dialog
von ewx » 18.06.2013 16:36 • Verfasst in Exchange Infrastructure

Über diesen Beitrag



Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
Gestern von Bright4.5 1 / 516
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2149
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8744