Modal Dialog: Best Approach?

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

Re: Modal Dialog: Best Approach?

Beitrag von tar (Specialist / 102 / 22 / 29 ) »
Also die Funktionsgruppe für das Dialogmodal mit CL_WDY_WB_PROPERTY_BOX steht grundsätzlich, muss aber hier und da noch etwas ergänzt werden. Es gibt 1 Funktionsbaustein, 1 Dialog-Dynpro mit 1 Custom-Control und 4 Buttons, 1 GUI-Status und 3 Klassen (ca. 26 KByte Code).

report.png

Zum Grundverständnis sieht der Funktionsbaustein wie folgt aus:

Code: Alles auswählen.

function z_show_properties.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     REFERENCE(IO_EVENT_HANDLER) TYPE REF TO  OBJECT OPTIONAL
*"     REFERENCE(IT_ENUMS) TYPE  WDY_WB_FREE_ENUM_TAB OPTIONAL
*"     REFERENCE(IT_PROPERTIES) TYPE  WDY_WB_PROPERTY_TAB OPTIONAL
*"     REFERENCE(IS_DATA) TYPE  ANY
*"     REFERENCE(IV_POPUP) TYPE  BOOLEAN_FLG OPTIONAL
*"     REFERENCE(IV_POPUP_BOTTOM) TYPE  I DEFAULT 20
*"     REFERENCE(IV_POPUP_LEFT) TYPE  I DEFAULT 25
*"     REFERENCE(IV_POPUP_RIGHT) TYPE  I DEFAULT 110
*"     REFERENCE(IV_POPUP_TOP) TYPE  I DEFAULT 4
*"     REFERENCE(IV_UNLOCKED) TYPE  BOOLEAN_FLG OPTIONAL
*"  EXPORTING
*"     REFERENCE(ES_DATA) TYPE  ANY
*"----------------------------------------------------------------------

  data(lo_data_handler) = new lcl_data_handler( is_data ).

  data(lo_property_box_handler) = new lcl_property_box_handler(
    io_data_handler  = lo_data_handler
    io_event_handler = io_event_handler
    it_enums         = it_enums
    it_properties    = it_properties
  ).

  lo_dynpro_0100 = new #(
    io_property_box_handler = lo_property_box_handler
    iv_unlocked             = iv_unlocked
  ).

  lo_dynpro_0100->open(
    iv_popup        = iv_popup
    iv_popup_bottom = iv_popup_bottom
    iv_popup_left   = iv_popup_left
    iv_popup_right  = iv_popup_right
    iv_popup_top    = iv_popup_top
  ).

  if lo_data_handler->has_been_adjusted( ).
    data(lo_data_reference) = lo_data_handler->get_data_reference( ).
    assign lo_data_reference->* to field-symbol(<data>).
    es_data = <data>.
  else.
    es_data = is_data.
  endif.
endfunction.

" ___ MODULES _______________________________________________________
module 0100_pai input.
  check lo_dynpro_0100 is bound.
  lo_dynpro_0100->process_after_input( ).
endmodule.

module 0100_pbo output.
  check lo_dynpro_0100 is bound.
  lo_dynpro_0100->process_before_output( ).
endmodule.
Die Daten werden als Import- & Exportparameter behandelt, weil damit der Aufrufer bei Bedarf direkt in der Lage ist, diese explizit getrennt zu behandeln.

Die Eingangsdaten wandern zum DataHandler. Intern muss man die ANY-Struktur dann via CL_ABAP_STRUCTDESCR in eine private Datenreferenz befüllen, auf die man via ASSIGN data_reference->* TO FIELD-SYMBOL(<data>) Zugriff erhält (wie beim Funktionsbaustein unten).

Für die Auswertung und Behandlung der Datenstruktur habe ich eine entsprechende einzeilige Tabellenstruktur erstellt, damit eine CL_SALV_TABLE erzeugt und schließlich einen Feldkatalog mittels CL_SALV_CONTROLLER_METADATA=>GET_LVC_FIELDCATALOG erstellen lassen.

Dann wird der PropertyBox-Handler aufgebaut, dem u.a. der DataHandler mitgegeben wird. Es lassen sich auch vorgefertigte Enums und Properties mitgeben, wobei die Properties nicht vollständig gefüllt werden müssen, sondern beim Aufbauen der PropertyBox-Properties jedes Feld darin einzeln geprüft wird und Vorrang vor der Logik bzgl. der übergebenen Daten und der Auswertung des Feldkatalogs hat. D.h. man kann Types, Suchhilfen, Conversions und sogar Values überklatschen. Vor allem aber kann man hier vorab festlegen, welche Felder überhaupt editierbar sein sollen und auch eigene Buttons mitgeben, die in entsprechenden Spalten neben dem Feld dargestellt werden.

Etwas komplexer gestaltet sich hierbei die Ermittlung des Datentyps, die ich wie folgt umgesetzt habe (LS_PROPERTY ist die zugehörige Zeile der übergebenen Properties, falls vorhanden - die hat Vorrang, wie ersichtlich):

Code: Alles auswählen.

" --- get type ------------------------------------------------
data(lv_is_boolean) = abap_false.
data(lv_is_date)    = abap_false.
data(lv_is_enum)    = abap_false.

if ls_property-type is not initial.
  " do nothing
elseif line_exists(
  mt_enums[
    prop_category = |PROPERTIES|
    prop_name     = <catalogue_entry>-fieldname
  ]
).
  lv_is_enum = abap_true.
elseif <catalogue_entry>-datatype = |DATS|.
  lv_is_date = abap_true.
elseif <catalogue_entry>-datatype = |CHAR| and <catalogue_entry>-outputlen = 1.
  select  *
    into  table @data(lt_domain_values)
    from  dd07l
    where domname  = @<catalogue_entry>-domname
      and as4local = 'A'.
  if sy-dbcnt = 2.
    lv_is_boolean = abap_true.

    loop at lt_domain_values assigning field-symbol(<domain_value>)
      where (     <domain_value>-domvalue_l <> space
              and <domain_value>-domvalue_l <> abap_true )
         or       <domain_value>-domvalue_h is not initial.
      free lv_is_boolean.
      exit.
    endloop.
  endif.
endif.

data(lv_type) = cond #(
  when ls_property-type          is not initial then ls_property-type
  when lv_is_boolean             is not initial then cl_wdy_wb_property_box=>property_type_boolean
  when lv_is_date                is not initial then cl_wdy_wb_property_box=>property_type_date
  when lv_is_enum                is not initial then cl_wdy_wb_property_box=>enum_item
  when <catalogue_entry>-dd_roll is not initial then <catalogue_entry>-dd_roll
  else                                               cl_wdy_wb_property_box=>property_type_string
).
Falls man etwas explizit leeren möchte, bedarf es einer weiteren Struktur mit entsprechenden Boolean-Feldern. Das habe ich aber erstmal nicht mit eingebaut.

Obendrein kann man auch einen eigenen Event-Handler mitgeben, der dynamisch auf vorhandene Eventmethoden zur PropertyBox geprüft wird, die dann auch für die jeweiligen Events gerufen werden, die man bspw. für die etwaig übergebenen Property-Buttons braucht. Dieser Event-Handler benötigt zusätzlich zwingend die folgende vom PropertyBox-Handler aufgerufene Methode, da er die erzeugte PropertyBox zum Hantieren in den eigenen Event-Methoden benötigt:

Code: Alles auswählen.

public section.
  methods:
    set_property_box importing io_property_box type ref to cl_wdy_wb_property_box.
Schließlich wird der Dynpro-Handler erzeugt und ihm der PropertyBox-Handler sowie die Popup- und Entsperr-Info mitgegeben. Er kümmert sich um die ganze GUI-Abwicklung, d.h. er ruft das Dynpro (den SCREEN) und erzeugt dabei im PBO einmalig den Container (Obacht: den Container unbedingt als Property halten, damit man ihn beim Schließen wieder zerstören kann). Diesen gibt er an den PropertyBox-Handler zur Erzeugung der PropertyBox weiter. Ansonsten wird hier noch die Editiersperre samt zugehöriger Buttons umgeschalten und beim Drücken von OK werden (bei mir über den PropertyBox-Handler) etwaig geänderte Daten in die Datenreferenz des Data-Handlers übernommen, die letztlich am Ende des Funktionsbausteins in die ausgehende ANY-Struktur geschrieben werden.

Es gibt noch einige Klärungspunkte:

1. Die Eingabeprüfung bzw. Conversions funktioniert noch nicht richtig. Eingabefehler werden nur sporadisch erkannt, bspw. bleiben Kleinbuchstaben bei Feldern für Großbuchstaben klein. Erst nach dem Schließen wird es in der Ursprungstabelle (ALV/SALV) korrekt dargestellt und Fehleingaben nicht mit übernommen. Schlimmstenfalls, bspw. bei Eingaben von Buchstaben in Zahlenfeldern, dumpt es momentan. Irgendwas scheint da zu fehlen.

2. Es gibt Felder, die im Feldkatalog via REF_... zu einem bestimmten Tabellenfeld referenziert sind, aber keine direkte Suchhilfe beinhalten. Ich weiß momentan noch nicht, wie man das in der PropertyBox umsetzt.

3. Manche Felder werden trotz richtiger Eingabe nach dem Drücken von OK nicht geändert. Mir ist noch unklar, woran das liegt.

4. Mir gefällt die Checkbox bei Boolean-Feldern. Allerdings verschwindet sie, wenn man ein anderes Feld mittels einer Suchhilfe setzt. Dann steht im Boolean-Feld "X" oder nix - wird also wie ein normales Char1-Feld dargestellt. Auch hier ist mir die Ursache unklar.

5. Längere Textfelder (> 128 Zeichen) müssten wohl über einen gesonderten Event und das Property-Feld ADD_TEXT bearbeitet werden, wobei man insgesamt auf 256 Zeichen beschränkt ist. Das habe ich mir noch nicht näher angeschaut.

Weiter habe ich noch nicht umhergetestet.

Folgende Benutzer bedankten sich beim Autor tar für den Beitrag (Insgesamt 3):
rob_abcewxMurdock


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


Re: Modal Dialog: Best Approach?

Beitrag von black_adept (Top Expert / 4089 / 127 / 940 ) »
Ich bin einerseits beeindruckt und würde gerne mal einen Screenshot sehen wie du das gemacht hat, andererseits glaube ich, dass du das Rad gerade ein 2. Mal erfindest ( nochmal der Hinweis auf POPUP_GET_VALUES )
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Modal Dialog: Best Approach?

Beitrag von tar (Specialist / 102 / 22 / 29 ) »
black_adept hat geschrieben:
06.09.2024 13:05
Ich bin einerseits beeindruckt und würde gerne mal einen Screenshot sehen wie du das gemacht hat
Da oben ist doch ein Screenshot oder wovon meinst du?
black_adept hat geschrieben:
06.09.2024 13:05
andererseits glaube ich, dass du das Rad gerade ein 2. Mal erfindest ( nochmal der Hinweis auf POPUP_GET_VALUES )
Mmh... möglich 😄

Re: Modal Dialog: Best Approach?

Beitrag von black_adept (Top Expert / 4089 / 127 / 940 ) »
tar hat geschrieben:
11.09.2024 01:30
black_adept hat geschrieben:
06.09.2024 13:05
Ich bin einerseits beeindruckt und würde gerne mal einen Screenshot sehen wie du das gemacht hat
Da oben ist doch ein Screenshot oder wovon meinst du?
Sorry - übersehen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Vergleichbare Themen

7
Antw.
5600
Views
Modal Dialog Box (Pop Up Screen)
von stony007_de » 21.02.2020 17:36 • Verfasst in Dialogprogrammierung
7
Antw.
4588
Views
Dialog zum Drucken
von Jessy83 » 26.02.2008 11:56 • Verfasst in Dialogprogrammierung
1
Antw.
2423
Views
Reaktion auf /N im Dialog?
von Hellbender » 24.01.2007 10:37 • Verfasst in Dialogprogrammierung
1
Antw.
4762
Views
ALE Verarbeitung im Dialog
von ewx » 18.06.2013 16:36 • Verfasst in Exchange Infrastructure
4
Antw.
1580
Views
Dialog Programmierung in Meldung
von Sava » 02.08.2013 07:44 • Verfasst in ABAP® für Anfänger

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor einer Stunde von black_adept gelöst 21 / 2533
SAP Trial Version für SAP Fiori
vor 2 Tagen von tar 2 / 1669

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.

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor einer Stunde von black_adept gelöst 21 / 2533
SAP Trial Version für SAP Fiori
vor 2 Tagen von tar 2 / 1669

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
vor 2 Tagen von Bright4.5 1 / 729
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2356
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8940