Rätsel mit Radiobuttons

Hinweise, Tips und Tricks, FAQs - keine Anfragen!!

Postby Ilja583 » Thu Oct 07, 2004 1:41 pm

Anonymous hat geschrieben:Die Darstellung liegt aber eher an unterschiedlichen GUI-Versionen


Mag sein - aber die Screenshots aus dem IDES und dem "normalen" 4.6er System wurden mit derselben GUI (6.40, Patchlvl 1 )gemacht und ein Kollege einen Stuhl weiter hat denselben Effekt mit einer 6.20, Patch 32 Gui
Ilja583
.....
.....
 
Posts: 1372
Joined: Wed Jan 08, 2003 3:00 pm

Postby Ilja583 » Thu Oct 07, 2004 10:58 pm

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)
  1.   id-prog = sy-repid. id-dnum = '1000'.
  2.   IMPORT DYNPRO h f e m ID id.
  3.   f-line = '02'.
  4.   MODIFY f TRANSPORTING LINE where LINE eq x.
  5.   GENERATE DYNPRO h f e m ID id MESSAGE a LINE b WORD c.
  6.   FREE: f, e, m.
  7.   CALL FUNCTION 'DB_COMMIT'.
  8.  
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)
  1.  
  2. DATA: rb1_d TYPE as4flag,
  3.       rb2_d TYPE as4flag,
  4.       rb3_d TYPE as4flag.
  5.  
  6. TABLES: sscrfields.
  7.  
  8. SELECTION-SCREEN BEGIN OF BLOCK bl0 WITH FRAME.
  9. SELECTION-SCREEN BEGIN OF TABBED BLOCK bl1 FOR 3 LINES.
  10. SELECTION-SCREEN END OF BLOCK bl1.
  11. SELECT-OPTIONS: s_datum FOR sy-datum.
  12. SELECTION-SCREEN END OF BLOCK bl0.
  13.  
  14. PARAMETERS: rb1 TYPE as4flag NO-DISPLAY,
  15.             rb2 TYPE as4flag NO-DISPLAY,
  16.             rb3 TYPE as4flag NO-DISPLAY.
  17.  
  18.  
  19.  
  20.   bl1-prog  = sy-repid.
  21.   bl1-dynnr = '8000'.
  22.   rb3 = 'X'.
  23.  
  24. AT SELECTION-SCREEN OUTPUT.
  25.   rb1_d = rb1.
  26.   rb2_d = rb2.
  27.   rb3_d = rb3.
  28.  
  29. AT SELECTION-SCREEN.
  30.   PERFORM get_buttons.
  31. * call screen 8000.
  32. * call screen 8001.
  33.  
  34.   WRITE:/ 'RB1=',rb1,
  35.         / 'RB2=',rb2,
  36.         / 'RB3=',rb3.
  37.  
  38.  
  39.  
  40. *&---------------------------------------------------------------------*
  41. *&      Form  get_buttons
  42. *&---------------------------------------------------------------------*
  43. FORM get_buttons.
  44.   DATA: repid TYPE syrepid,
  45.         dynnr TYPE sydynnr,
  46.         dynpfields TYPE STANDARD TABLE OF dynpread,
  47.         wa_df      LIKE LINE OF dynpfields,
  48.         zeilen     TYPE i.
  49.  
  50.   dynnr = '8001'.
  51.   repid = sy-repid.
  52.  
  53.   CALL FUNCTION 'DYNP_VALUES_READ'
  54.        EXPORTING
  55.             dyname               = repid
  56.             dynumb               = dynnr
  57.             request              = 'A'
  58.        TABLES
  59.             dynpfields           = dynpfields
  60.        EXCEPTIONS
  61.             invalid_abapworkarea = 1
  62.             invalid_dynprofield  = 2
  63.             invalid_dynproname   = 3
  64.             invalid_dynpronummer = 4
  65.             invalid_request      = 5
  66.             no_fielddescription  = 6
  67.             invalid_parameter    = 7
  68.             undefind_error       = 8
  69.             double_conversion    = 9
  70.             stepl_not_found      = 10
  71.             OTHERS               = 11.
  72.  
  73.   CASE 'X'.
  74.     WHEN rb1.  DELETE dynpfields WHERE fieldname = 'RB1_D'.
  75.     WHEN rb2.  DELETE dynpfields WHERE fieldname = 'RB2_D'.
  76.     WHEN rb3.  DELETE dynpfields WHERE fieldname = 'RB3_D'.
  77.   DELETE dynpfields WHERE fieldvalue = space
  78.                       AND ( fieldname = 'RB1_D' OR
  79.                             fieldname = 'RB2_D' OR
  80.                             fieldname = 'RB3_D' ).
  81.   CHECK NOT dynpfields IS INITIAL.
  82.  
  83.   rb1 = rb2 = rb3 = space.
  84.   LOOP AT dynpfields INTO wa_df WHERE fieldvalue = 'X'.
  85.     CASE wa_df-fieldname.
  86.       WHEN 'RB1_D'.rb1 = 'X'.
  87.       WHEN 'RB2_D'.rb2 = 'X'.
  88.       WHEN 'RB3_D'.rb3 = 'X'.
  89.     ENDCASE.
  90.  
  91. ENDFORM.                               " get_buttons
GeSHi ©


Dynproablauflogik von Subscreen 8000 ( Ausmaße 3 Zeilen x 40 Spalten )

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. PROCESS BEFORE OUTPUT.
  2.   CALL SUBSCREEN sub2 INCLUDING sy-repid '8001'.
  3. * MODULE STATUS_8000.
  4. *
  5. PROCESS AFTER INPUT.
  6.   CALL SUBSCREEN sub2.
  7. * MODULE USER_COMMAND_8000.
GeSHi ©


Dynproablauflogik von Subscreen 8001 ( Ausmaße 28 Zeilen x 240 Spalten )

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. keine
GeSHi ©
Ilja583
.....
.....
 
Posts: 1372
Joined: Wed Jan 08, 2003 3:00 pm

Postby Willy1492 » Fri Oct 08, 2004 8:49 am

black_adept hat geschrieben: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.

Also wenn man hier überhaupt von "elegant" reden kann (ich würde erst mal versuchen, dem Anwender eine solche Anforderung auszureden), dann hat Deine Methode doch einige Vorteile:
-sie funktioniert scheinbar ab Release 4.6 unabhängig von Frontend-Einstellungen, -Version und SAP-Release
-sie nutzt nur von SAP auch freigegebene Anweisungen

Bei GENERATE DYNPRO sieht das Ergebnis ja offenbar bei jedem Anwender anders aus, viel Spaß beim Support.
Und SAP wird sich auch weigern, eine Lösung für evtl. später auftretende Probleme zu liefern (z.B. wenn zukünftig bei sich überschneidenden Feldern einfach ein Laufzeitfehler erzeugt wird).

Und wenn man wirklich GENERATE DYNPRO nimmt, sollte man erstens auch den Fall beachten, dass das Selektionsdynpro noch gar nicht existiert (z.B. nach dem ersten Transport des Programms in ein neues System):

Dazu muss nach
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   IMPORT DYNPRO h f e m ID id.
GeSHi ©

zum Beispiel folgender Code ergänzt werden:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   IF sy-subrc NE 0.
  2.     SUBMIT rsdbgena
  3.             WITH repname EQ id-prog
  4.             EXPORTING LIST TO MEMORY
  5.             AND RETURN.
  6.     IMPORT DYNPRO h f e m ID id.
  7.   ENDIF.
  8.  
GeSHi ©

Damit wird, falls das Dynpro nicht existiert, das Dynpro generiert und dann noch mal importiert.

Und zweitens kann man sich das GENERATE DYNPRO ... sparen, wenn nach MODIFY f ... SY-SUBRC nicht 0 ist, denn dann gab es offenbar nichts mehr zu ändern.
Willy1492
....
....
 
Posts: 581
Joined: Tue Dec 03, 2002 4:44 pm

Postby Willy1492 » Fri Oct 08, 2004 10:21 am

Mit
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. PARAMETERS rb1 RADIOBUTTON GROUP r.
  2. PARAMETERS rb2 RADIOBUTTON GROUP r.
  3. SELECTION-SCREEN BEGIN OF LINE.
  4. PARAMETERS rb3 RADIOBUTTON GROUP r DEFAULT 'X'.
  5. SELECTION-SCREEN END OF LINE.
GeSHi ©

und
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.     LOOP AT f WHERE LINE EQ 3.
  2.       add 1 to f-line.
  3.       MODIFY f TRANSPORTING line.
  4.     ENDLOOP.
GeSHi ©

kann man den 3. Radiobutton übrigens unter dem LOW-Feld der SELECT-OPTION verstecken und hat ein wenig mehr Spielraum, was die Positionierung betrifft 8)
Willy1492
....
....
 
Posts: 581
Joined: Tue Dec 03, 2002 4:44 pm

Previous

Return to Tips + Tricks & FAQs

Who is online

Users browsing this forum: Google [Bot] and 11 guests

cron