Erstmal Gratulation an alle, die hier eine Lösung oder einen Lösungshinweis gepostet haben.
Wie man ( mal wieder ) sieht, gibt es mehrere Wege die nach Rom führen.
Ganz allgemein kann man sagen, dass die Lösung darauf beruht einen weiteren (anfangs aktiven) Radiobutton "RB3" mit anzulegen und diesen danach so zu verstecken, dass der User diesen nicht mehr zu sehen bekommt.
Wer das selber probiert hat wird feststellen, dass SAP da ziemlich geschickt vorgeht um die am Anfang dieses Threads dargestellte Kombination
eigentlich nicht zuzulassen - die simplen Methoden wie "no-display" oder "LOOP AT SCREEN + SCREEN-INVISIBLE = 1" führen entweder zu Syntaxfehlern oder dazu, dass einer der sichtbaren Buttons als aktiv gekennzeichnet wird.
Somit gibt es also mindestens 2 Möglichkeiten dies zu bewerkstelligen.
Methode A)
Diese Methode ( wohl die elegantere ) versucht grob gesagt den 3. Radiobutton "unter" den 2. Radiobutton zu legen. Dies ist mit "normalen" Mitteln nicht möglich - aber die nur für den internen Gebrauch bestimmten Befehle
IMPORT DYNPRO und
GENERATE DYNPRO lassen dies zu.
Das Beispielcoding von Gast macht das im folgenden Block (vor dem Senden des Selektionsbildes)
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
id-prog = sy-repid. id-dnum = '1000'.
f-line = '02'.
MODIFY f
TRANSPORTING LINE where LINE eq x
. GENERATE DYNPRO h f e m
ID id MESSAGE a
LINE b
WORD c
. CALL FUNCTION 'DB_COMMIT'.
- GeSHi ©
Methode B
Auch hier wird der 3. Button versteckt - jedoch ein wenig anders.
Zunächst wird ein "normales" Dynpro auf den Selektionsbildschirm gebunden via " SELECTION-SCREEN BEGIN OF TABBED BLOCK "
Dieser Screen wird angelegt (als Subscreen natürlich) mit der Größe 3 Zeilen x 40 Spalten, damit keine Scrollbalken entstehen.
Leider reicht dies noch nicht aus. Auf diesen 1. Subscreen wird ein den ganzen Bereich ausfüllender 2. Subscreen gelegt.
Der Dynpro, den man nun in diesen 2. Subscreenbereich legt, definiert man größer als die 3x40 Ausmaße ( etwa einfach die Standardmaße beibehalten). Dieser 2. Subscreen wird dann nachher beim Ausführen des Programms nach der 3. Zeile abgeschnitten dargestellt - aber alle Inhalte desselben sind aktiv auf der Seite vorhanden
Theoretisch reicht dies aus, um dem Betrachter obiges Phänomen vorzutäuschen, wenn nicht der andere Gast noch nach Variantenspeichermöglichkeiten gefragt hätte.
In diesem Fall nun muss man (nicht FI hören lassen) doppelte Buchführung betreiben.
RB1 - RB3 werden als normale Felder unsichtbar auf den Selektionsbildschirm gelegt und die sichtbaren Buttons auf dem inkludierten Dynpro werden RB1_D bis RB3_D angelegt aber mit RB1 - RB3 beschriftet.
Danach noch dafür sorgen, dass die "eigentlichen" Parameter RB1 - RB3 sich genauso verhalten wie die sichtbaren Parameter RB1_D - RB3_D ( ein wenig tricky wg. des Feldtransports bei Radiobuttons )
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
DATA: rb1_d
TYPE as4flag
, rb2_d TYPE as4flag,
rb3_d TYPE as4flag.
SELECT-OPTIONS: s_datum FOR sy-datum.
rb2 TYPE as4flag NO-DISPLAY,
rb3 TYPE as4flag NO-DISPLAY.
bl1-prog = sy-repid.
bl1-dynnr = '8000'.
rb3 = 'X'.
AT SELECTION-SCREEN OUTPUT. rb1_d = rb1.
rb2_d = rb2.
rb3_d = rb3.
* call screen 8000.
* call screen 8001.
/ 'RB2=',rb2,
/ 'RB3=',rb3.
*&---------------------------------------------------------------------*
*& Form get_buttons
*&---------------------------------------------------------------------*
DATA: repid
TYPE syrepid
, dynnr TYPE sydynnr,
dynpfields TYPE STANDARD TABLE OF dynpread,
wa_df LIKE LINE OF dynpfields,
zeilen TYPE i.
dynnr = '8001'.
repid = sy-repid.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = repid
dynumb = dynnr
request = 'A'
dynpfields = dynpfields
EXCEPTIONS
invalid_abapworkarea = 1
invalid_dynprofield = 2
invalid_dynproname = 3
invalid_dynpronummer = 4
invalid_request = 5
no_fielddescription = 6
invalid_parameter = 7
undefind_error = 8
double_conversion = 9
stepl_not_found = 10
OTHERS = 11.
WHEN rb1
. DELETE dynpfields
WHERE fieldname
= 'RB1_D'. WHEN rb2
. DELETE dynpfields
WHERE fieldname
= 'RB2_D'. WHEN rb3
. DELETE dynpfields
WHERE fieldname
= 'RB3_D'. DELETE dynpfields
WHERE fieldvalue
= space AND ( fieldname = 'RB1_D' OR
fieldname = 'RB2_D' OR
fieldname = 'RB3_D' ).
CHECK NOT dynpfields
IS INITIAL.
rb1 = rb2 = rb3 = space.
LOOP AT dynpfields
INTO wa_df
WHERE fieldvalue
= 'X'.
- GeSHi ©
Dynproablauflogik von Subscreen 8000 ( Ausmaße 3 Zeilen x 40 Spalten )
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
PROCESS BEFORE OUTPUT.
CALL SUBSCREEN sub2 INCLUDING sy-repid '8001'.
* MODULE STATUS_8000.
*
PROCESS AFTER INPUT.
CALL SUBSCREEN sub2.
* MODULE USER_COMMAND_8000.
- GeSHi ©
Dynproablauflogik von Subscreen 8001 ( Ausmaße 28 Zeilen x 240 Spalten )
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
- GeSHi ©