Moin allerseits,
Vatertag ist vorbei und damit auch diese Challenge. Leider hat sich nur einer getraut eine Lösung einzuschicken. Wahrscheinlich ist das "rumfrickeln" an der UI nicht die Lieblingsaufgabe der Meisten hier. Und ich kann das durchaus nachvollziehen.
Die einzige Lösung, die ich erhalten habe ist die von a-d-t, welche vom Grundgerüst meiner eigenen Idee entspricht aber einfach um Längen besser ist als das, was ich im Sinn hatte.
Auf was hatte ich es in dieser Challenge abgesehen?
1.)
Die Selektionsbildgestaltung mit "BEGIN OF LINE und END OF LINE" ist einfach eine m.E. nervige Angelegenheit und je mehr solche selbst zusammengefrickelten Zeilen auf dem Selektionsbild auftauchen desto unübersichtlicher wird der Code, auch wenn man 10x mal das Gleiche machen will.
Der für mich sauberste Ansatz ist in diesem Fall der Einsatz von
Makros, einfach weil der Ansatz "gleichartiges Coding in Unterroutinen" hier nicht funktioniert, da das ABAP-System schon zur Compile-/Generierungszeit das Coding auswertet um das Selektionsbild zu erstellen und nicht erst zur Laufzeit.
Hierdurch wird man dem generellen Konzept "gleiches Coding nicht mehrfach schreiben" beim Lesen des Codes wieder gerecht, auch wenn intern die Makros aufgelöst werden und de facto dann halt doch 10x der gleiche Code vom Compiler ausgewertet wird.
Und ich stehe dazu, auch wenn ich fürchte, dass mein Hauptantagonist das anders sehen und mich dafür tadeln könnte. 😉
2.)
Pflegbarkeit der Beschriftung: Da die Felder alle mittels Makro erstellt werden und einfach Radiobuttons sind fehlt die Möglichkeit hier auf ein DDIC-Element zu referenzieren und sich der Standardmöglichkeiten des Editors zu bedienen.
Der Ansatz hier ist folgender: Man erstellt das Feld, welches die korrekte Beschriftung im DDIC vorweist einfach auch auf dem Selektionsbild,blendet es dann aus und verwendet dann die Beschreibung dieses Elements als Beschriftung für die Makrozeile.
Und das ist auch das, was man aus diesem Teil mitnehmen sollte. "Hilfsvariablen" können auch an überraschenden Stellen hilfreich sein - insbesondere wenn man dadurch Effekte geschenkt bekommt, die der SAP Standard bietet, die aber direkt scheinbar nicht zur Verfügung stehen.
Anmerkung: Dies ist auch der Grund, warum a-d-t die Variablenbezeichunungen ausgeblendet hatte. "There's more to it than meets the eye"
Andere Verwendung von unsichtbaren Elementen: Kennt jemand eine Situation, wo man mit unsichtbaren Rahmen auf einem Dynpro ein besonderes Verhalten erzeugen kann, welches mit anderen Dynproelementen nicht machbar ist ?
3.)
Wo ist so etwas in freier Wildbahn verwendbar?
Das Beispiel war schon recht weit hergeholt. Aber ich habe häufiger mit Objekten zu tun, für die eine Statusverwaltung aktiv ist ( Tabelle JEST ). Und es passiert halt von Zeit zu Zeit, dass die Anwender nach Objekten suchen wollen, welche eine spezielle Statuskombination aufweisen, so dass ich in diesen Fällen gerne diese Art der Auswahl anbiete, da alleine die Stellung der Radiobuttons den Anwendern beim groben Drüberschauen anzeigt, wonach sie gerade suchen.
Hier jetzt die wirklich schöne Lösung von a-d-t, an der alle obigen Kommentare nachvollzogen werden können:
a-d-t hat geschrieben:Code: Alles auswählen.
REPORT z_test_dd03l.
TABLES:
dd03l, sscrfields.
DEFINE create_field.
SELECT-OPTIONS so_&1 FOR dd03l-&2 MODIF ID hid.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (31) FOR FIELD so_&1.
PARAMETERS ry_&1 TYPE abap_bool RADIOBUTTON GROUP &3 USER-COMMAND choosen_&1.
SELECTION-SCREEN POSITION 46.
PARAMETERS rn_&1 TYPE abap_bool RADIOBUTTON GROUP &3.
SELECTION-SCREEN POSITION 59.
PARAMETERS rw_&1 TYPE abap_bool RADIOBUTTON GROUP &3 DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.
end-OF-DEFINITION.
DEFINE modify_field.
WHEN 'CHOOSEN_&1'.
CLEAR so_&1[].
CASE abap_true.
WHEN ry_&1.
APPEND VALUE #( sign = 'E' option = 'EQ' ) TO so_&1.
WHEN rn_&1.
APPEND VALUE #( sign = 'I' option = 'EQ' ) TO so_&1.
ENDCASE.
end-OF-DEFINITION.
SELECT-OPTIONS so_tabna FOR dd03l-tabname.
SELECTION-SCREEN BEGIN OF BLOCK bl_field WITH FRAME.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (31) tx_field MODIF ID tf1.
SELECTION-SCREEN COMMENT (12) tx_optye MODIF ID tf2.
SELECTION-SCREEN COMMENT (12) tx_optno MODIF ID tf3.
SELECTION-SCREEN COMMENT (12) tx_optwt MODIF ID tf3.
SELECTION-SCREEN END OF LINE.
create_field keyfl keyflag 1.
create_field manda mandatory 2.
create_field rolln rollname 3.
create_field check checktable 4.
create_field admin adminfield 5.
create_field intty inttype 6.
create_field intle intlen 7.
create_field refta reftable 8.
create_field precf precfield 9.
create_field reffi reffield 10.
SELECTION-SCREEN END OF BLOCK bl_field.
INITIALIZATION.
tx_field = 'DD03L: Feld nicht initial'(tf1).
tx_optye = 'Yes'(tf2).
tx_optno = 'No'(tf3).
tx_optwt = 'Wtf'(tf4).
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
CASE screen-group1.
WHEN 'TF1'.
screen-intensified = 1.
MODIFY SCREEN.
WHEN 'HID'.
screen-invisible = 1.
screen-output = 0.
screen-input = 0.
MODIFY SCREEN.
ENDCASE.
ENDLOOP.
AT SELECTION-SCREEN.
CASE sscrfields.
modify_field keyfl.
modify_field manda.
modify_field rolln.
modify_field check.
modify_field admin.
modify_field intty.
modify_field intle.
modify_field refta.
modify_field precf.
modify_field reffi.
ENDCASE.