dynamische Dialogsteuerung

Benutzeroberflächen in SAP®-Systemen.
8 Beiträge • Seite 1 von 1
8 Beiträge Seite 1 von 1

dynamische Dialogsteuerung

Beitrag von dermannvomberg (ForumUser / 7 / 0 / 0 ) »
Hallo zusammen,

ich programmiere gerade einen Report in dem abhängig von einer bestimmten Radiobuttongroup der weitere Selektionsbildschirm dargestellt werden soll. Ich habe bei google bzw in diesem Forum auch schon einiges gefunden. Allerdings ist mir der grundsätzliche Ablauf noch nicht so ganz klar.

Hier mal mein Quellcode:

* Selektionsbildschirm

selection-screen skip.
selection-screen begin of line.
selection-screen position 1.
parameters se_fast radiobutton group wahl.
selection-screen position 20.
parameters se_short radiobutton group wahl.
selection-screen end of line.

at SELECTION-SCREEN OUTPUT.
if se_fast is NOT INITIAL.
LOOP AT SCREEN.
...
endloop.
elseif se_short is not INITIAL.
...
endif.


Je nachdem ob se_fast oder se_short gewählt wurde soll ein anderer Selectionsbildschirm dargestellt werden. Mit dem Ereignis "at SELECTION-SCREEN OUTPUT" und loop at screen kann ich wohl irgendwie das Aussehen beeinflussen. Allerdings kann ich den Befehl "selection-screen..." im loop nicht verwenden. Meldung: Innerhalb von form-routinen ist selection-screen nicht zulässig.

Außerdem weis ich nicht, wann das Ereignis "at SELECTION-SCREEN OUTPUT." verwendet werden kann/muss/soll. Schon beim Selektionsbildschirm oder erst im Teil "At selection-screen on".

Bin ich da auf dem Holzweg?

Danke

MfG

vomBerg

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


Re: dynamische Dialogsteuerung

Beitrag von black_adept (Top Expert / 4089 / 127 / 940 ) »
Dieser Thread hier hat genau dasselbe Thema inkl. eines Beispielcoldings

http://www.abapforum.com/forum/viewtopi ... 23&p=55291
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: dynamische Dialogsteuerung

Beitrag von weigo (ForumUser / 45 / 0 / 6 ) »
Hi,

du kannst SELECTION-SCREEN nicht in einem Loop benutzen, da es ein Ereignis ist, das nur einmal im Programm vorkommen kann.

Du hast immer nur einen Selection-Screen, du kannst aber die Objekt ein- und ausblenden.

Probiere folgendes:

Code: Alles auswählen.

AT SELECTION-SCREEN OUTPUT.
  IF se_fast = 'X'.
    LOOP AT SCREEN.
      IF screen-name = 'P_USER'.
        screen-input = 0.     
      ENDIF.
      MODIFY SCREEN.
    ENDLOOP.

  ELSEIF se_short = 'X'.
    LOOP AT SCREEN.
      IF screen-name = 'P_USER'.
        screen-input = 1.     
      ENDIF.
      MODIFY SCREEN.
    ENDLOOP.
 ENDIF.
In AT SELECTION-SCREEN OUTPUT machst du also folgendes:
Du prüfst welcher Radio-Button gewählt wurde, indem du die Selection Screen (SS) Variablen se_fast und se_short auf 'X' prüfst (mit IF oder CASE, wie du willst).
Dann musst du ein LOOP AT SCREEN machen und alle Felder ein- oder auszublenden, aktiv setzen oder deaktivieren (je nachdem was du brauchst).
Im Beispiel hättest du einen Parameter P_USER wo man z.B. auf dem SS die User ID eingeben kann.
Wählst du den Radio-Button se_fast, dann wir er augegraut (screen-input = 0), also keine Eingabe ist möglich.
Wählst du se_short, dann ist er eingabebereit (screen-input = 1).
Willst du ein- und ausblenden, dann nutze screen-active = 1 oder 0.
Wichtig: Du musst am Ende ein MODIFY SCREEN machen, sonst werden die Änderungen nicht gemacht.

Ich hoffe, ich konnte dir etwas weiterhelfen.

Viele Grüße
weigo

Re: dynamische Dialogsteuerung

Beitrag von dermannvomberg (ForumUser / 7 / 0 / 0 ) »
Vielen Dank für die Antworten. Bin schon ein bisschen weiter, hab aber immer noch ein grundsätzliches Verständnisproblem. Wenn ich den Report starte, dann werden mir alle Felder, auch die ausgeblendeten angezeigt.

Ich poste nochmal meinen Code.

Code: Alles auswählen.

*-------------------------------------------------------------------*
* Selektionsbildschirm                                              *
*-------------------------------------------------------------------*
selection-screen skip.

selection-screen begin of block choice.
selection-screen begin of line.
selection-screen position 1.
parameters se_fast radiobutton group wahl default 'X' user-command fst.
selection-screen position 20.
parameters se_short radiobutton group wahl.
selection-screen end of line.
selection-screen end of block choice.


* Einrichtung - Pflichtfeld
selection-screen begin of line.
selection-screen comment 1(11) text-s01 for field se_einri.
selection-screen position pos_low.
parameters se_einri like nfal-einri modif id slw
obligatory default '1'.
selection-screen position 42.
selection-screen end of line.

* Datum - Pflichtfeld
SELECTION-SCREEN SKIP.
selection-screen begin of line.
Selection-screen position pos_low.
PARAMETERS se_datum like ndoc-erdat .
SELECTION-SCREEN POSITION 42.
SELECTION-SCREEN end of LINE.

* ---------------------------------------------------------------------*
* At selection-screen on                                               *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
  IF se_fast = 'X'.
    LOOP AT SCREEN.
      IF screen-name = 'se_einri'.
        screen-active = 1.
      ENDIF.
      MODIFY SCREEN.
    ENDLOOP.

  ELSEIF se_short = 'X'.
    LOOP AT SCREEN.
      IF screen-name = 'se_datum'.
        screen-active = 1.
      ENDIF.
      MODIFY SCREEN.
    ENDLOOP.
 ENDIF.
die beiden Felder se_einri bzw. se_datum werden immer angezeigt. Beim debuggen wird aber entweder die if-Bedingung mit se_fast ='X' oder se_short = 'X' durchlaufen.

Bin ein bisschen ratlos.

Re: dynamische Dialogsteuerung

Beitrag von weigo (ForumUser / 45 / 0 / 6 ) »
Hi,

wenn sie nicht eingeblendet werden sollen, dann musst du active = 0 setzen.
Ich nehme an, dass du für einen Status active = 1 und für den anderen active = 0 brauchst, dann hättest du je nach Radio-Button (status) die Felder ein- oder ausgeblendet.

Du musst die Namen auch immer groß schreiben, also nicht 'se_einri', sondern 'SE_EINRI'.

Probiere das Mal aus.

Viele Grüße
weigo

Re: dynamische Dialogsteuerung

Beitrag von dermannvomberg (ForumUser / 7 / 0 / 0 ) »
Hallo,

also irgendwie stehe ich total auf dem Schlauch. Jetzt wird mir zwar ein Feld angezeigt (se_einri) , aber die Radiobuttons werden überhaupt nicht angezeigt. Der Radiobutton ist nie sichtbar, ist aber im angeklickt.

Im zweiten Teil der If-Abfrage habe ich bewusst se_short = 'X' abgefragt und screen-active = 1 gesetzt. Schliesslich soll das Feld ja angezeigt werden, wenn se_short = 'X' ist.

Hier nochmal der Code:

Code: Alles auswählen.

*-------------------------------------------------------------------*
* Selektionsbildschirm                                              *
*-------------------------------------------------------------------*

selection-screen skip.

selection-screen begin of block choice.
selection-screen begin of line.
selection-screen position 1.
parameters se_fast radiobutton group wahl default 'X'." user-command fst
selection-screen position 20.
parameters se_short radiobutton group wahl.
selection-screen end of line.
selection-screen end of block choice.

* Einrichtung - Pflichtfeld
selection-screen begin of line.
selection-screen comment 1(11) text-s01 for field se_einri.
selection-screen position pos_low.
parameters se_einri like nfal-einri modif id slw
obligatory default '1'.
selection-screen position 42.
selection-screen end of line.

* Datum - Pflichtfeld
selection-screen skip.
selection-screen begin of line.
selection-screen position pos_low.
parameters se_datum like ndoc-erdat .
selection-screen position 42.
selection-screen end of line.
Die erste Radiobuttongroup 'wahl' soll immer angezeigt werden.

Code: Alles auswählen.

* ---------------------------------------------------------------------*
* At selection-screen on                                               *
*----------------------------------------------------------------------*
at selection-screen output.
  if se_fast = 'X'.
    loop at screen.
      IF screen-name = 'SE_EINRI'.
        screen-active = 1.
        else.
          screen-active = 0.
      ENDIF.
      modify screen.
    endloop.

  elseif se_short = 'X'.
    loop at screen.
      if screen-name = 'SE_DATUM'.
        screen-active = 1.
      endif.
      modify screen.
    endloop.
  endif.
Hier arbeite ich das ganze ab. Aber auf diese Weise wird nur se_einri angezeigt, das se_fast (ghört zur Radiobuttongroup wahl) standardmäßig 'X' ist. Aber da die gruppe nicht angezeigt wird, kann ich auch nicht se_short 'X' setzen.

Danke...

Re: dynamische Dialogsteuerung

Beitrag von weigo (ForumUser / 45 / 0 / 6 ) »
Hi,

das Problem ist in diesem Coding:

Code: Alles auswählen.

    * ---------------------------------------------------------------------*
    * At selection-screen on                                               *
    *----------------------------------------------------------------------*
    at selection-screen output.
      if se_fast = 'X'.
        loop at screen.
          IF screen-name = 'SE_EINRI'.
            screen-active = 1.
            else.
              screen-active = 0.
          ENDIF.
          modify screen.
        endloop.

      elseif se_short = 'X'.
        loop at screen.
          if screen-name = 'SE_DATUM'.
            screen-active = 1.
          endif.
          modify screen.
        endloop.
      endif.
Wenn du IF screen-name = 'SE_EINRI' nutzt um dieses Feld aktiv zu setzen und dann bei ELSE alles andere deaktivierst, dann werden natürlich alle anderen Screenelemente damit ausgeschaltet.
Lösung:

Code: Alles auswählen.

* ---------------------------------------------------------------------*
* at selection-screen on                                               *
*----------------------------------------------------------------------*
 at selection-screen output.
IF se_fast = 'X'.
  LOOP AT SCREEN.
    IF screen-name = 'SE_EINRI'.
      screen-active = 1.
    ELSEIF screen-name = 'SE_DATUM'.
      screen-active = 0.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

ELSEIF se_short = 'X'.
  LOOP AT SCREEN.
    IF screen-name = 'SE_DATUM'.
      screen-active = 1.
    ELSEIF screen-name = 'SE_EINRI'.
      screen-active = 0.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.
ENDIF.
Außerdem musst du bei den Radio-Buttons den USER-COMMAND wieder aktivieren, sonst wird beim drücken der Buttons kein Event ausgelöst.

Noch als Tipp: Wenn du viele Screen Elemente hast, dann ist dieser Weg mühsam.
Du kannst aber Screen Elemente in Gruppen zusammenfassen und diese gemeinsam aktivieren und deaktivieren.
Zum Beispiel:

Code: Alles auswählen.

*-------------------------------------------------------------------*
* Selektionsbildschirm                                              *
*-------------------------------------------------------------------*

SELECTION-SCREEN SKIP.

SELECTION-SCREEN BEGIN OF BLOCK choice.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
PARAMETERS se_fast RADIOBUTTON GROUP wahl DEFAULT 'X' user-command fst.
SELECTION-SCREEN POSITION 20.
PARAMETERS se_short RADIOBUTTON GROUP wahl.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK choice.

* Einrichtung - Pflichtfeld
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(11) text-s01 FOR FIELD se_einri.
SELECTION-SCREEN POSITION POS_LOW.
PARAMETERS se_einri LIKE nfal-einri MODIF ID slw
OBLIGATORY DEFAULT '1'.
SELECTION-SCREEN POSITION 42.
SELECTION-SCREEN END OF LINE.

* Datum - Pflichtfeld
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION POS_LOW.
PARAMETERS se_datum LIKE ndoc-erdat MODIF ID slw.
SELECTION-SCREEN POSITION 42.
SELECTION-SCREEN END OF LINE.

* ---------------------------------------------------------------------*
* at selection-screen on                                               *
*----------------------------------------------------------------------*
 at selection-screen output.
IF se_fast = 'X'.
  LOOP AT SCREEN.
    IF screen-group1 = 'SLW'.
      screen-active = 1.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

ELSEIF se_short = 'X'.
  LOOP AT SCREEN.
    IF screen-group1 = 'SLW'.
      screen-active = 0.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.
ENDIF.
Die Gruppe ist hier SLW. In dem Beispiel aktivierst oder deaktiverst du beide Elemente zusammen.
Für dein Programm ist das nicht geeignet, da du beide Elemente getrennt behandeln willst.
Hast du aber irgendwann mehrere, die zusammengehören, dann nutze die Gruppen.
Es gibt bis zu 4 Gruppen (SCREEN-GROUP1 bis SCREEN-GROUP4).

Hoffe, du kommst jetzt weiter.

Viele Grüße
weigo

Re: dynamische Dialogsteuerung

Beitrag von dermannvomberg (ForumUser / 7 / 0 / 0 ) »
OK, jetzt gehts. War aber eine schwere Geburt. Vielen Dank für die Unterstützung!!

thx

Seite 1 von 1

Vergleichbare Themen

1
Antw.
2706
Views
Dialogsteuerung Liste->Dynpro->Liste sy-ucomm
von cut1 » 08.12.2006 14:28 • Verfasst in Dialogprogrammierung
3
Antw.
2168
Views
Dynamische SQL
von Gabriel99 » 22.06.2015 17:59 • Verfasst in ABAP® für Anfänger
6
Antw.
4094
Views
Dynamische Spalten
von hmaxi96 » 16.11.2015 10:03 • Verfasst in ABAP® für Anfänger
0
Antw.
1115
Views
Dynamische Variablennamen?
von mbecker » 23.03.2009 12:16 • Verfasst in ABAP® für Anfänger
2
Antw.
1971
Views
Dynamische DB Selektion
von Paret » 13.06.2014 11:40 • Verfasst in SAP - Allgemeines

Über diesen Beitrag


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

Aktuelle Forenbeiträge

Daten an Tabelle binden
vor 47 Minuten von Lukas Sanders 2 / 785
Dialog-Container mit Toolbar/Status
vor 14 Stunden von black_adept gelöst 21 / 2614

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

Daten an Tabelle binden
vor 47 Minuten von Lukas Sanders 2 / 785
Dialog-Container mit Toolbar/Status
vor 14 Stunden von black_adept gelöst 21 / 2614

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2401
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 8985