Rätsel mit Radiobuttons

Hinweise, Tips und Tricks, FAQs - keine Anfragen!!
14 Beiträge • Seite 1 von 1
14 Beiträge Seite 1 von 1

Rätsel mit Radiobuttons

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
Hallo,

ich habe mal einen Selektionsbildschirm von meinem System hier dargestellt.
Bild

Der sieht relativ harmlos aus - das Interessante sind jedoch die beiden nicht ausgewählten Radiobuttons!

Ein paar weitere Informationen.
- Sobald einer der beiden Radiobuttons angeklickt wird, ist er auch markiert.

- Das Anklicken eines der beiden Radiobuttons löst keine ABAP-Aktion aus ( auch Systemdebugging wird nicht angestoßen - alles normale Dynproverarbeitung des Frontend! )

- Die Radiobuttons verhalten sich wie gewohnt ( Anklicken von RB1 entmarkiert RB2 (falls markiert ) und umgekehrt )

Viel Spaß beim Knobeln...
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

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


Beitrag von Gast ( / / 0 / 3 ) »
Ich hab's.
Ich vermute mal, wenn Du die Reihenfolge der Parameters-Anweisungen für RB1 und RB2 vertauschst und das Programm neu generierst, funktioniert Dein Trick erst mal nicht mehr, sondern erfordert wieder zusätzliche Arbeit.
Und nach Transport Deines Reports in ein anderes System ist dort auch erst mal eine zusätzliche Manipulation nötig, damit der Trick funktioniert, oder?

Beitrag von Gast ( / / 0 / 3 ) »
Man kann die Manipulation, die ich "von außen" vorgenommen habe, auch ins Programm integrieren.
Dann klappt der Trick auch nach Neu-Generierung bzw. Transport.

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
:shock: Manipulationen!!!! Das hört sich sehr interessant an.

Schreib doch mal was du da so getan hast ( mir kommt da nur spontan der Befehl "EXPORT DYNPRO" in den Sinn ) um auch so einen Effekt zu erzielen.

Meine Methode bedient sich jedenfalls nur "normaler" SAP-Standardbefehle (wenn auch evtl. in etwas unsinniger Kombination).
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von Gast ( / / 0 / 3 ) »
Und klappen folgende Punkte bei Dir:
-wenn Du statt direkt auf die Radiobuttons auf Parameternamen klickst, wird auch der entsprechende Radiobutton markiert (und bei Bedarf die Markierung des anderen entfernt), und es gibt keine sonstigen Auffälligkeiten (ich will erst mal nicht zu viel verraten).

-wenn Du eine Liste ausgibst mit den Werten von RB1 und RB2, werden die erwarteten Werte ausgegeben.

-wenn Du aus der Liste ins Selektionsbild zurückkehrst, ist die Markierung so wie bei START-OF-SELECTION (also entweder der richtige Radiobutton markiert, oder keiner der beiden, falls vor START-OF-SELECTION kein Radiobutton markiert war)?

-Du kannst 3 Report-Varianten anlegen:
TEST0: keiner der Buttons ist markiert
TEST1: der 1. Button ist markiert
TEST2: der 2. Button ist markiert

Egal, welcher der Buttons markiert ist, bei Auswahl einer Variante wird die in der Variante gespeicherte Belegung übernommen?


Ich habe alle o.g. Dinge hinbekommen.

Beitrag von Gast ( / / 0 / 3 ) »
black_adept hat geschrieben::shock: Manipulationen!!!! Das hört sich sehr interessant an.

Schreib doch mal was du da so getan hast
Na gut.
Wenn es offenbar noch andere Möglichkeiten gibt,
kann ich meine Lösung ja verraten.
( mir kommt da nur spontan der Befehl "EXPORT DYNPRO" in den Sinn )
Nahe dran:

Code: Alles auswählen.

REPORT.
PARAMETERS rb1 RADIOBUTTON GROUP r .
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION POS_LOW.
PARAMETERS rb3 RADIOBUTTON GROUP r  DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.
PARAMETERS rb2 RADIOBUTTON GROUP r.
SELECT-OPTIONS s_datum FOR syst-datum.
DATA: BEGIN OF id, prog(40), dnum(4), END OF id,
      h TYPE d020s, f TYPE TABLE OF d021s WITH HEADER LINE,
      e TYPE TABLE OF d022s, m TYPE TABLE OF d023s,
      a, b, c, x TYPE x VALUE '03'.
DEFINE _w. write: / 'RB&1 =', rb&1 color &1. END-OF-DEFINITION.

LOAD-OF-PROGRAM.
  id-prog = sy-repid. id-dnum = '1000'.
  IMPORT DYNPRO h f e m ID id.
  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.
  FREE: f, e, m.
  CALL FUNCTION 'DB_COMMIT'.

AT SELECTION-SCREEN.
  CASE 'X'.
    WHEN rb3.
      IF sy-datar EQ 'X'. " geht schief, wenn nur S_DATUM geändert wurde
        CLEAR rb3.
        rb2 = 'X'.
      ENDIF.
  ENDCASE.

START-OF-SELECTION.
*  SET BLANK LINES ON.
  _w:1,2,3.

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
Hallo Gast ( dem mit dem GENERATE DYNPRO ).

Deine Idee geht natürlich grundsätzlich in die richtige Richtung *lach* aber bei mir gibt es folgenden Screen
Bild
und auf dem sind DREI Radiobuttons zu sehen. Aber die grundsätzliche Idee gefällt mir - auch wenn ich noch nicht so genau sehe, ob du das Problem damit lösen kannst. Ich hab da zwar ein paar Ideen, aber der Befehl ist mir zu gefährlich *schauder* um da groß rumzuspielen. :oops:



Hallo Gast ( der mit der Lösung und den Fragen ).

aaaaalso. Als ich die Frage gepostet habe, hätt ich nicht alle Fragen bejahen können, aber mit ein paar Zeilen Extracode geht das (jetzt) auch.

Also alle Fragen lassen sich bejahen.
Ein paar Auffälligkeiten sind higegen schon da.

Eine wäre z.B., dass beim Speichern der Variante die Feldeigenschaft "Feld ohne Wert abspeichern" ("V") aktiv ist!.

Ich werde meine Lösung allerdings jetzt noch nicht verraten - mach ich Donnerstag Nacht, damit noch ein paar Stündchen Zeit bleiben um bei Interesse die grauen Zellen ein wenig in Schwung zu halten.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
black_adept hat geschrieben:bei mir gibt es folgenden Screen
Bild
und auf dem sind DREI Radiobuttons zu sehen.
Was mich hier wundert, sind die 2 Radiobuttons RB1 und RB2.
Die sollten doch je nach Release entweder ganz links liegen (mit Text rechts daneben) oder eben auf POS_LOW (da wo das LOW-Feld der Select-Option beginnt).

Mit welchem Release hast Du den merkwürdigen Effekt erzielt, dass die Radiobuttons an einer Position < POS_LOW angezeigt werden?

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
Programm von Gast ( der mit dem Demoprogramm )

Bild


Obiges wurde erzeugt auf einem IDES-System 4.6C ( Release 99 ). Auf dem System werden aber alle Radiobuttons ein klein wenig nach links verrückt dargestellt (warum auch immer???)




Bild

Obiges wurde erzeugt auf einem 4.6C mit relativ neuem Patchstand.
Man beachte genauer den Button2!
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von Gast ( / / 0 / 3 ) »
Die Darstellung liegt aber eher an unterschiedlichen GUI-Versionen

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
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

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
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: Alles auswählen.

LOAD-OF-PROGRAM. 
  id-prog = sy-repid. id-dnum = '1000'. 
  IMPORT DYNPRO h f e m ID id. 
  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. 
  FREE: f, e, m. 
  CALL FUNCTION 'DB_COMMIT'. 

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: Alles auswählen.

REPORT.

DATA: rb1_d TYPE as4flag,
      rb2_d TYPE as4flag,
      rb3_d TYPE as4flag.

TABLES: sscrfields.

SELECTION-SCREEN BEGIN OF BLOCK bl0 WITH FRAME.
SELECTION-SCREEN BEGIN OF TABBED BLOCK bl1 FOR 3 LINES.
SELECTION-SCREEN END OF BLOCK bl1.
SELECT-OPTIONS: s_datum FOR sy-datum.
SELECTION-SCREEN END OF BLOCK bl0.

PARAMETERS: rb1 TYPE as4flag NO-DISPLAY,
            rb2 TYPE as4flag NO-DISPLAY,
            rb3 TYPE as4flag NO-DISPLAY.



INITIALIZATION.
  bl1-prog  = sy-repid.
  bl1-dynnr = '8000'.
  rb3 = 'X'.

AT SELECTION-SCREEN OUTPUT.
  rb1_d = rb1.
  rb2_d = rb2.
  rb3_d = rb3.

AT SELECTION-SCREEN.
  PERFORM get_buttons.
* call screen 8000.
* call screen 8001.

END-OF-SELECTION.
  WRITE:/ 'RB1=',rb1,
        / 'RB2=',rb2,
        / 'RB3=',rb3.



*&---------------------------------------------------------------------*
*&      Form  get_buttons
*&---------------------------------------------------------------------*
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'
       TABLES
            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.

  CASE 'X'.
    WHEN rb1.  DELETE dynpfields WHERE fieldname = 'RB1_D'.
    WHEN rb2.  DELETE dynpfields WHERE fieldname = 'RB2_D'.
    WHEN rb3.  DELETE dynpfields WHERE fieldname = 'RB3_D'.
  ENDCASE.
  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'.
    CASE wa_df-fieldname.
      WHEN 'RB1_D'.rb1 = 'X'.
      WHEN 'RB2_D'.rb2 = 'X'.
      WHEN 'RB3_D'.rb3 = 'X'.
    ENDCASE.
  ENDLOOP.

ENDFORM.                               " get_buttons
Dynproablauflogik von Subscreen 8000 ( Ausmaße 3 Zeilen x 40 Spalten )

Code: Alles auswählen.

PROCESS BEFORE OUTPUT.
  CALL SUBSCREEN sub2 INCLUDING sy-repid '8001'.
* MODULE STATUS_8000.
*
PROCESS AFTER INPUT.
  CALL SUBSCREEN sub2.
* MODULE USER_COMMAND_8000.
Dynproablauflogik von Subscreen 8001 ( Ausmaße 28 Zeilen x 240 Spalten )
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
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: Alles auswählen.

  IMPORT DYNPRO h f e m ID id.
zum Beispiel folgender Code ergänzt werden:

Code: Alles auswählen.

  IF sy-subrc NE 0.
    SUBMIT rsdbgena
            WITH repname EQ id-prog
            EXPORTING LIST TO MEMORY
            AND RETURN.
    IMPORT DYNPRO h f e m ID id.
  ENDIF.

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.

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
Mit

Code: Alles auswählen.

PARAMETERS rb1 RADIOBUTTON GROUP r.
PARAMETERS rb2 RADIOBUTTON GROUP r.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 38.
PARAMETERS rb3 RADIOBUTTON GROUP r DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.
und

Code: Alles auswählen.

    LOOP AT f WHERE LINE EQ 3. 
      add 1 to f-line.
      MODIFY f TRANSPORTING line.
    ENDLOOP.
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)

Seite 1 von 1

Vergleichbare Themen

1
Antw.
787
Views
Radiobuttons speichern
von HansPeter » 07.05.2019 14:04 • Verfasst in ABAP® für Anfänger
1
Antw.
1476
Views
ALV Radiobuttons und SY-UNAME
von Besi » 27.04.2005 12:24 • Verfasst in ABAP® Core
4
Antw.
4798
Views
Pop Up FuBa mit Radiobuttons
von cali » 01.08.2006 13:12 • Verfasst in Dialogprogrammierung
4
Antw.
2136
Views
Radiobuttons Beschriftung dynamisch
von Bugfix13 » 19.12.2013 08:58 • Verfasst in ABAP® für Anfänger
1
Antw.
368
Views
Radiobuttons switcht nicht im Modul On Value Request
von JohnLocklay » 27.11.2019 11:03 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


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.