Screen in Repository Klasse erstellen

Getting started ... Alles für einen gelungenen Start.
17 Beiträge • Seite 1 von 2 (current) Nächste
17 Beiträge Seite 1 von 2 (current) Nächste

Screen in Repository Klasse erstellen

Beitrag von Paddy (ForumUser / 21 / 5 / 0 ) »
Hallo zusammen,

ich habe ein Frage, wahrscheinlich wird sie dem einen oder anderen etwas merkwürdig vorkommen :D . Angenommen, ich habe eine Repository Klasse, die bei Instanziierung in einem Programm einen vorher übergebenen Inhalt in einem ALV darstellt. Ist es möglich den Screen zu Laufzeit zu erstellen oder muss dieser Screen als Bestandteil des Programms händisch angelegt werden?

Hierzu ein Beispielcode aus dem guten Tricktresor:

Code: Alles auswählen.

DATA: l_alv      TYPE REF TO   cl_gui_alv_grid,
      lt_sflight TYPE TABLE OF sflight.

SELECT * FROM sflight INTO TABLE lt_sflight.
* automatically use the full screen to display the grid,
* NO CONTAINER DEFINITION IS REQUIRED !

CREATE OBJECT l_alv
  EXPORTING
    i_parent = cl_gui_container=>screen0.

CALL METHOD l_alv->set_table_for_first_display
  EXPORTING
    i_structure_name = 'SFLIGHT'
  CHANGING
    it_outtab        = lt_sflight.

* You have to create an EMPTY screen
CALL SCREEN 100.
Die Möglichkeit den Screen 100 in einer DDIC Klasse aufzurufen, kann ja nicht möglich sein. Gibt es einen Workaround dies zur Laufzeit zu bewerkstelligen?

Vielen Dank für eure Antworten.
Paddy

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


Re: Screen in Repository Klasse erstellen

Beitrag von a-dead-trousers (Top Expert / 4282 / 214 / 1141 ) »
hi!

Da ein Screen (oder besser Dynpro) derzeit (noch) Bestandteil eines Programms sein muss, brauchst du zur Laufzeit auch ein Programm unter dem du den Screen ablegen musst.
Schau dir dazu mal die Befehle

EXPORT DYNPRO
IMPORT DYNPRO
DELETE DYNPRO
SYNTAX-CHECK FOR DYNPRO
GENERATE DYNPRO

bzw.

READ REPORT,
SYNTAX-CHECK
INSERT REPORT
GENERATE REPORT
DELETE REPORT

an.

Die funktionieren alle ohne Berechtigungsprüfung und du kannst damit ein völlig "dynamisches" Programm schreiben. Aber Achtung: Um Sperren, sodass zwei Benutzer nicht ein und dasselbe Dynpro/Programm zur Laufzeit verändern dürfen musst du dich selbst kümmern.

CALL SCREEN bietet leider (noch) keine Möglichkeit den Programmnamen mitzugeben :cry:
Dann wäre es nämlich möglich mit den Befehlen die Dynpros unter dem Klassen-Pool (...===CP) anzulegen und somit endlich das unnötige Programm loszuwerden :evil:

lg ADT.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Screen in Repository Klasse erstellen

Beitrag von Paddy (ForumUser / 21 / 5 / 0 ) »
Hallo,

ich habe die Funktion Generate Dynpro ausprobiert. Widererwartend konnte ich sogar ein CustomControl platzieren. Ich bekomme allerdings ein Problem, wenn ich Generate Dynpro im OO Context nutzen möchte, da die übergebenen Tabellen keine header line besitzen. Ist es möglich hier zu tricksen um die Funktion auch im OO Kontext zu nutzen?

Sollte dies möglich sein, wäre es ganz interessant zu wissen, ob man die Module Pools und den Gui Status ebenfalls at runtime generieren kann.

Hier meine nicht funktionierende Methode:

Code: Alles auswählen.

method GENERATE_DYNPRO.
 data: h type table of d020s with header line,
      f type table of d021s with header line,
      e type table of d022s with header line,
      m type table of d023s with header line.


  data:         wa_h type d020s,
                 wa_f type d021s,
                 wa_e type d022s,
                 wa_m type d023s.
data: mess(50) type c,
      line(50) type c,
      word(50) type c.
data: dynproid(44).

dynproid = sy-repid.
dynproid+40(4) = '0001'.
*
*
wa_h-prog = sy-repid.
wa_h-dnum = '0001'.
append wa_h to h.
*
*
wa_f-fnam = 'GD_OK_CODE'.
wa_f-didx = '0000'.
wa_f-flg1 = '80'.
wa_f-flg2 = '10'.
wa_f-flg3 = '00'.
wa_f-leng = '14'.
wa_f-line = 'FF'.
wa_f-type = 'CHAR'.
wa_f-coln = '01'.

wa_f-stxt = '____________________'.

append wa_f to f.

wa_f-fnam = 'ALV'.
wa_f-didx = '001B'.
wa_f-flg1 = '00'.
wa_f-flg2 = '00'.
wa_f-flg3 = '00'.
wa_f-fill = 'U'.
wa_f-fmb1 = '30'.
wa_f-fmb2 = '00'.

wa_f-leng = '78'.
wa_f-line = '01'.
wa_f-coln = '02'.
wa_f-lanf = '00'.
wa_f-lblk = '00'.
wa_f-lrep = '00'.
wa_f-auth = '101'.
wa_f-aglt = '01'.
wa_f-adez = '01'.

append wa_f to f.

*
*
wa_e-line = 'PROCESS BEFORE OUTPUT.'.
append wa_e to e.
wa_e-line = 'MODULE STATUS_0001.'.
append wa_e to e.

wa_e-line = 'PROCESS AFTER INPUT.'.
append wa_e to e.

wa_e-line = 'MODULE PAI.'.
append wa_e to e.

generate dynpro h f e m id dynproid
         message mess
         line    line
         word    word.

endmethod.
Vielen Dank im Voraus
Paddy

Re: Screen in Repository Klasse erstellen

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Wenn ich dich richtig verstanden habe, benötigst du gar kein Dynpro, sondern einen Container?!
Vielleicht hilft dir SCREEN0 weiter?!

Re: Screen in Repository Klasse erstellen

Beitrag von a-dead-trousers (Top Expert / 4282 / 214 / 1141 ) »
Paddy hat geschrieben:Sollte dies möglich sein, wäre es ganz interessant zu wissen, ob man die Module Pools und den Gui Status ebenfalls at runtime generieren kann.
Module-Pools sind nix anderes wir Reports --> INSERT REPORT
Gui-Status und Titlebar gehören zur sog. CUA --> FuBa RS_CUA_INTERNAL_WRITE bzw RS_CUA_INTERNAL_FETCH.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Screen in Repository Klasse erstellen

Beitrag von Paddy (ForumUser / 21 / 5 / 0 ) »
ewx hat geschrieben:Wenn ich dich richtig verstanden habe, benötigst du gar kein Dynpro, sondern einen Container?!
Vielleicht hilft dir SCREEN0 weiter?!
Danke für die Info.

Ich wollte aber genau dies vermeiden
* You have to create an EMPTY screen
CALL SCREEN 100.

Re: Screen in Repository Klasse erstellen

Beitrag von Paddy (ForumUser / 21 / 5 / 0 ) »
Ich konnte mit Generate Dynpro einen Screen in meiner Klasse zur Laufzeit erstellen, allerdings kann ich diese auf Grund der beschränkten Sichtbarkeit nicht im Report erreichen. Mir bleibt wohl nichts anderes übrig, als den Screen in einem FB zu erstellen und diesen dann im Report aufzurufen.

Re: Screen in Repository Klasse erstellen

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Bin ich blöd... Das ist ja genau der Link, den du auch schon erwähnt hast... Sorry!! :x
Du könntest dann versuchen, einen Dialog-BOx-Container zu verwenden (Klasse CL_GUI_DIALOGBOX_CONTAINER).
Wobei ich immer noch nicht verstanden habe, wo genau dein Problem liegt. Denn du bist ja anscheinend in einer Anwendung, rufst dann deine Klassenmethode auf und möchtest aus dieser Klasse heraus den ALV anzeigen. Das müsste eigentlich mit SCREEN0 gehen, du musst dafür keinen CALL SCREEN machen (meine ich) aber du brauchst natürlich ein aktuelles "Trägerdynpro".
Alternativ2 könnte ich dir auch noch den DockingContainer anbieten...

Re: Screen in Repository Klasse erstellen

Beitrag von Paddy (ForumUser / 21 / 5 / 0 ) »
ewx hat geschrieben:) aber du brauchst natürlich ein aktuelles "Trägerdynpro".
Genau das ist mein Problem. So wie ich es verstanden habe, rufe ich mit screen0 einen bestehenden screen mit custom container auf. Ich will aber nicht, dass im Report ein Screen erstellt werden muss, sondern dieser soll at Runtime generiert werden. Deshalb versuche ich mit Generate Dynpro einen Screen zu erstellen und dort einen custom container zu platzieren. Als nächstes instantiiere ich in meiner Klasse einen Customon Contrainer und lege als letztes einen ALV als Anwendungs-Control drüber. Soweit die Theorie ;-) Ich hoffe, dass das einigermaßen verständlich ist und ich nicht komplett auf dem Holzweg bin.


Image6.gif

Re: Screen in Repository Klasse erstellen

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Ich glaube, du denkst da zu kompliziert... Versuch das mit dem Screen0 mal. Da muss ja auch nix erstellt oder generiert werden; der ist ja da...

Re: Screen in Repository Klasse erstellen

Beitrag von Paddy (ForumUser / 21 / 5 / 0 ) »
ewx hat geschrieben:Ich glaube, du denkst da zu kompliziert.
Das kann durchaus sein.

Wenn ich bei der Instantiierung des ALV screen0 als parent angebe passiert leider nichts. Ich nehme an, dass der Grund dafür der Parameter-Screen zu Beginn meiner Anwendung ist.

Parameters -> Klasse mi ALV Initiierung wird angestoßen.

Re: Screen in Repository Klasse erstellen

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Du musst den ALV halt schon irgendwo "andocken". Du kannst also nicht dein Programm starten, die Ausgabe vorbereiten und dann den ersten Bildschirm aufrufen. Die "Verknüpfung" muss in dem Fall im PBO erfolgen.
Man schleppt ja aber auch nicht gleich zu Beginn "einen Screen mit sich rum", den man vielleicht gar nie benötigt. Von daher ist das auch schon in Ordnung, dass die Anzeige selbst erst dann passiert, wenn auch der Screen da ist.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
Paddy


Re: Screen in Repository Klasse erstellen

Beitrag von Paddy (ForumUser / 21 / 5 / 0 ) »
ok, nur zur Bestätigung, dass ich dir noch folgen kann ;-) Dein letzter Post war bezgl. der Screenerstellung mit Generate Dynpro und hat nichts mehr mit der screen0 Angabe zu tun?!? Wenn du von "andocken" sprichts meinst du "call screen"?!?

Der Ablauf in der Klasse ist folgender:

1. Ich rufe in der Klasse einen Funktionbaustein auf, der mit einen Screen erstellt (generate dynpro).
2. Ich erstelle einen CContainer mit Referenz auf das CCTRL im generierten Dynpro (Klassenmethode).
3. Ich setze als letze Schicht das ALV auf (Klassenmethode).
4. Ich rufe in der PBO den generierten Screen auf (Modul im Report)

Ist das soweit richtig? Es wird leider nichts angezeigt ;-( Sorry, falls ich grad nur dumme Dinger rauslasse aber wirklich durchschaut habe ich die ganze Dynpro Sache noch nicht.

Re: Screen in Repository Klasse erstellen

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Paddy hat geschrieben:Ist das soweit richtig?
Ich fürchte nicht...
Paddy hat geschrieben:1. Ich rufe in der Klasse einen Funktionbaustein auf, der mit einen Screen erstellt (generate dynpro).
Das ist quatsch.
Paddy hat geschrieben:2. Ich erstelle einen CContainer mit Referenz auf das CCTRL im generierten Dynpro (Klassenmethode).
ansich ok.
Paddy hat geschrieben:3. Ich setze als letze Schicht das ALV auf (Klassenmethode).
Was immer das heißt...
Paddy hat geschrieben:4. Ich rufe in der PBO den generierten Screen auf (Modul im Report)
Da bist du ja aber bereits in einem Dynpro.

Du willst ja gar kein Dynpro generieren! Du willst eins haben, in dem du den ALV anzeigen kannst.
Wenn du die Methode aufrufst und SCREEN0 verwendest, dann funktioniert es wahrscheinlich nicht, weil vorher noch kein CALL SCREEN erfolgt ist.
Die Bindung muss aber im PBO erfolgen. SCREEN0 ist im Grunde ein CustomContainer von der Größe des Dynpros. Der CustomContainer muss dann also nicht extra im Dynpro definiert werden. Das musst du machen, wenn du nur EIN TEIL des Dynpros mit dem Container (Also Grid) benutzen möchtest.
Letztendlich ist es egal WIE du die Bindung "Control - Container" vornimmst (Also Programm oder Methode oder Fuba) aber sie MUSS im PBO des Dynpros erfolgen. (Zumindest, wenn du nicht Screen0 verwendest...).

Das Minieinfachprogramm ist BCALV_GRID_DEMO...

Vielleicht schickst du mal einen ABGESPECKTEN aber LAUFFÄHIGEN QUELLCODE mit den WESENTLICHEN Programmteilen von deinem Programm?! Dann müssen wir nicht "drumherum" schreiben...

Re: Screen in Repository Klasse erstellen

Beitrag von black_adept (Top Expert / 3946 / 105 / 886 ) »
ewx hat geschrieben: Letztendlich ist es egal WIE du die Bindung "Control - Container" vornimmst (Also Programm oder Methode oder Fuba) aber sie MUSS im PBO des Dynpros erfolgen. (Zumindest, wenn du nicht Screen0 verwendest...).

Huch - seit wann ist das denn so? Ich versuche in meinen Reports immer die Bindung schon zum Zeitpunkt Initialization ( also schon vor PBO ) einzuleiten und hatte bisher keine Probleme damit.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Vergleichbare Themen

3
Antw.
1208
Views
Repository erstellen
von BasisGuy » 05.06.2018 09:38 • Verfasst in ABAP® für Anfänger
6
Antw.
3454
Views
RANGES in Klasse erstellen
von anam.jabrane » 07.02.2014 11:07 • Verfasst in ABAP Objects®
2
Antw.
2318
Views
n Objekte einer Klasse erstellen
von Johannes » 19.09.2007 12:42 • Verfasst in ABAP Objects®
2
Antw.
3861
Views
CALL SCREEN aus der Klasse
von annaarnst » 29.07.2008 17:33 • Verfasst in ABAP Objects®
2
Antw.
5869
Views
Selection-Screen in Klasse definieren
von eddi892 » 18.01.2012 10:39 • Verfasst in ABAP Objects®

Über diesen Beitrag


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

Aktuelle Forenbeiträge

SELECT CHAR16 in CHAR12-Feld
vor 18 Minuten von rob_abc 4 / 45
alv_grid aktualisieren
vor 4 Stunden von Egzon gelöst 4 / 81

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

SELECT CHAR16 in CHAR12-Feld
vor 18 Minuten von rob_abc 4 / 45
alv_grid aktualisieren
vor 4 Stunden von Egzon gelöst 4 / 81

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Wochen von Lucyalison 1 / 134
Group Items auf einer Filterbar
vor 5 Wochen von Bright4.5 1 / 170