SAP Control Framework
Transcription
SAP Control Framework
HELP.BCCIGOF SAP Control Framework Release 4.6C SAP Control Framework SAP AG Copyright © Copyright 2001 SAP AG. Alle Rechte vorbehalten. Weitergabe und Vervielfältigung dieser Publikation oder von Teilen daraus sind, zu welchem Zweck und in welcher Form auch immer, ohne die ausdrückliche schriftliche Genehmigung durch SAP AG nicht gestattet. In dieser Publikation enthaltene Informationen können ohne vorherige Ankündigung geändert werden. Die von SAP AG oder deren Vertriebsfirmen angebotenen Software-Produkte können SoftwareKomponenten auch anderer Software-Hersteller enthalten. ® ® ® ® ® ® ® Microsoft , WINDOWS , NT , EXCEL , Word , PowerPoint und SQL Server sind eingetragene Marken der Microsoft Corporation. ® ® ® ® ® ® ® ® ® IBM , DB2 , OS/2 , DB2/6000 , Parallel Sysplex , MVS/ESA , RS/6000 , AIX , S/390 , ® ® ® AS/400 , OS/390 und OS/400 sind eingetragene Marken der IBM Corporation. ® ORACLE ist eine eingetragene Marke der ORACLE Corporation. ® ® INFORMIX -OnLine for SAP und Informix Dynamic Server Informix Software Incorporated. ® ® ® TM sind eingetragene Marken der ® UNIX , X/Open , OSF/1 und Motif sind eingetragene Marken der Open Group. ® HTML, DHTML, XML, XHTML sind Marken oder eingetragene Marken des W3C , World Wide Web Consortium, Massachusetts Institute of Technology. ® JAVA ist eine eingetragene Marke der Sun Microsystems, Inc. ® JAVASCRIPT ist eine eingetragene Marke der Sun Microsystems, Inc., verwendet unter der Lizenz der von Netscape entwickelten und implementierten Technologie. SAP, SAP Logo, R/2, RIVA, R/3, ABAP, SAP ArchiveLink, SAP Business Workflow, WebFlow, SAP EarlyWatch, BAPI, SAPPHIRE, Management Cockpit, mySAP.com Logo und mySAP.com sind Marken oder eingetragene Marken der SAP AG in Deutschland und vielen anderen Ländern weltweit. Alle anderen Produkte sind Marken oder eingetragene Marken der jeweiligen Firmen. 2 April 2001 SAP AG SAP Control Framework Symbole Symbol Bedeutung Achtung Beispiel Empfehlung Hinweis Syntax Tip April 2001 3 SAP Control Framework SAP AG Inhalt SAP Control Framework................................................................................................ 6 Architektur des Control Frameworks ........................................................................................................ 8 Ereignisbehandlung .................................................................................................................................. 10 Registrieren und Verarbeiten von Ereignissen....................................................................................... 13 Kontextmenü .......................................................................................................................................... 15 Drag&Drop.............................................................................................................................................. 17 Ablauf einer Drag&Drop Operation ................................................................................................... 19 Ereignisse bei Drag&Drop................................................................................................................. 21 Beispiel für Drag&Drop-Programmierung ......................................................................................... 23 Drag&Drop im WAN-Umfeld ............................................................................................................. 28 Lifetime Management ................................................................................................................................ 29 Automation Queue..................................................................................................................................... 31 Synchronisation der Automation Queue................................................................................................. 33 Fehlerbehandlung bei der Synchronisation............................................................................................ 35 Services rund um die Automation Queue............................................................................................... 37 Verwendung von Controls im WAN ......................................................................................................... 42 Anlegen eines Controls am Beispiel des SAP Picture .......................................................................... 44 Methoden der Klasse CL_GUI_CFW ........................................................................................................ 46 dispatch ...................................................................................................................................................... 47 flush ............................................................................................................................................................ 48 get_living_dynpro_controls...................................................................................................................... 49 set_new_ok_code ...................................................................................................................................... 50 update_view ............................................................................................................................................... 51 Methoden der Klasse CL_GUI_OBJECT.................................................................................................. 52 is_valid........................................................................................................................................................ 53 free .............................................................................................................................................................. 54 Methoden der Klasse CL_GUI_CONTROL .............................................................................................. 55 constructor................................................................................................................................................. 56 finalize......................................................................................................................................................... 58 set_registered_events............................................................................................................................... 59 get_registered_events............................................................................................................................... 60 is_alive........................................................................................................................................................ 61 set_alignment............................................................................................................................................. 62 set_position................................................................................................................................................ 63 set_visible................................................................................................................................................... 64 get_focus.................................................................................................................................................... 65 set_focus .................................................................................................................................................... 66 get_height................................................................................................................................................... 67 get_width .................................................................................................................................................... 68 Methoden der Klasse CL_DRAGDROP.................................................................................................... 69 constructor................................................................................................................................................. 70 add............................................................................................................................................................... 71 4 April 2001 SAP AG SAP Control Framework clear............................................................................................................................................................. 73 destroy........................................................................................................................................................ 74 get................................................................................................................................................................ 75 get_handle.................................................................................................................................................. 77 modify ......................................................................................................................................................... 78 remove ........................................................................................................................................................ 80 Methoden der Klasse CL_DRAGDROPOBJECT ..................................................................................... 81 set_flavor.................................................................................................................................................... 82 abort ............................................................................................................................................................ 83 April 2001 5 SAP Control Framework SAP AG SAP Control Framework SAP Control Framework Einsatzmöglichkeiten Das SAP-System erlaubt das Ansteuern von Desktop-Applikationen (Custom Controls) mit Hilfe von ABAP. Die Applikationslogik läuft dabei auf dem R/3-Applikationsserver (Automation Client), welcher die Custom Controls (Automation Server) am Frontend treibt. Sollen am Frontend Custom Controls eingebunden werden, fungiert das SAP GUI (SAPGUI.APPLICATION) als Container für diese. Custom Controls können dabei ActiveX Controls und JavaBeans sein. Das folgende Beispiel zeigt ein SAP Tree Control in Kombination mit einem SAP TextEdit Control: Funktionsumfang Das beschriebene Framework unterstützt Controls (ActiveX und JavaBeans), die innerhalb des SAP GUI dargestellt werden. Aus Sicht des Automation Controllers wird hierbei immer nur mit genau einem Control (SAPGUI.APPLICATION) - dem Automation Controller - kommuniziert, das selbst als Container für die Custom Controls dient. Die Steuerung des Automation Controllers aus ABAP geschieht über die Klassen CL_GUI_CFW, CL_GUI_OBJECT und CL_GUI_CONTROL, die das Erzeugen und Zerstören von Custom 6 April 2001 SAP AG SAP Control Framework SAP Control Framework Controls als auch das Setzen und Lesen von deren Eigenschaften und den Aufruf derer Methoden ermöglichen. Mit Blick auf die Performance in Client-Server-Umgebungen werden Puffermechanismen über die Automation Queue unterstützt, mit der eine Serie von Methodenaufrufen zu unterschiedlichen Instanzen von Custom Controls in einem Kommunikationsschritt zum Frontend geschickt werden kann. Die Interpretation von Ereignissen, die auf einem Custom Control ausgelöst werden, erfolgt in zwei Schritten: • Ausfiltern der nicht relevanten Ereignisse • Weiterreichen der relevanten Ereignisse an den Applikationsserver. Ihr ABAP-Programm erhält dann an definierter Stelle über ein OO-Ereignis die Kontrolle und kann auf das Ereignis reagieren. Die Lebensdauer eines Controls wird über das Lifetime Management geregelt. Es baut Controls automatisch am Frontend ab. Natürlich wird auch ein explizites Abbauen von Controls durch das Applikationsprogramm unterstützt. Einschränkungen Bestimmte Methoden und Ereignisse in einigen Controls werden nicht unter dem SAP GUI for HTML unterstützt. Andere stehen nur in eingeschränkter Form zur Verfügung. Einzelheiten hierzu entnehmen Sie der Dokumentation zum jeweiligen Control. April 2001 7 SAP Control Framework SAP AG Architektur des Control Frameworks Architektur des Control Frameworks Das SAP-System erlaubt das Ansteuern von Desktop-Applikationen (Custom Controls) mit Hilfe von ABAP. Der Applikationsserver ist der Automation Client, welcher die Custom Controls (Automation Server) am Frontend treibt. Das SAP GUI (SAPGUI.APPLICATION) dient als Container für die Custom Controls. In der folgenden Grafik sind die beteiligten Elemente und ihre Kommunikationskanäle dargestellt: SAPGUI Automation Controller Ereignisse Custom Control 1 Instanzen Automation Queue OK_CODE OO Control Framework Custom Control 2 GUI-RFC Automation Queue Ereignisse Applikationsprogramm Instanzen Applikationsserver Automation Controller Der Automation Controller ist die zentrale Instanz auf dem Frontend. Er verwaltet alle Instanzen der Custom Controls. Weiterhin enthält der Automation Controller eine Liste der relevanten Ereignisse, die von einem Custom Control ausgelöst werden können (siehe Ereignisbehandlung [Seite 10]). Die gesamte Kommunikation zwischen den Controls am Frontend und dem Applikationsprogramm am Backend läuft über den Automation Controller. OO Control Framework Analog zum Automation Controller existiert am Backend das OO Control Framework. Alle Methodenaufrufe aus einem Applikationsprogramm an ein Custom Control laufen über das Control Framework. Damit nicht bei jedem Methodenaufruf eine Verbindung zum Frontend aufgebaut werden muß, werden die Methodenaufrufe in der Automation Queue gepuffert. Erst beim Synchronisationspunkt wird dann die Automation Queue mit dem Frontend synchronisiert (Siehe Automation Queue [Seite 31]). 8 April 2001 SAP AG SAP Control Framework Architektur des Control Frameworks Das Control Framework besitzt wie auch der Automation Controller eine Liste der relevanten Control-Ereignisse. In dieser Liste sind zusätzlich die aufzurufenden Behandlermethoden hinterlegt (siehe Ereignisbehandlung [Seite 10]). Auch eine Liste der angelegten Control-Instanzen wird im Control Framework gehalten. Diese Liste dient auch als Grundlage für das Lifetime Management der Controls (siehe Lifetime Management [Seite 29]). April 2001 9 SAP Control Framework SAP AG Ereignisbehandlung Ereignisbehandlung Verwendung Der Benutzer eines Applikationsprogramms kann Ereignisse auf Custom Controls auslösen. Das Applikationsprogramm bekommt dann die Kontrolle und kann auf das Ereignis reagieren. Typische Ereignisse sind z.B. Doppelklick und Drag & Drop. Integration Wie in Architektur des Control Frameworks [Seite 8] angedeutet, besitzt sowohl der Automation Controller als auch das OO Control Framework eine Tabelle aller relevanten Control-Ereignisse. Diese Tabellen müssen vom Applikationsprogramm aufgebaut werden. Die Ereignistabelle am Frontend besteht aus Control-Instanz und Ereignis, am Backend enthält die Ereignistabelle zusätzlich die ABAP-Behandlermethode für die Ereignisse. Der Aufbau der Tabellen erfolgt über eine spezielle Methode des OO Control Frameworks (control->set_registered_events). Bei der Registrierung des Ereignisses muß die Applikation festlegen, ob das Ereignis als Systemereignis oder als Applikationsereignis interpretiert werden soll: • Systemereignis: Dieses Ereignis wird ausgelöst, bevor die automatische Feldprüfung (z.B. Mußeingabe) und der Feldtransport durchgeführt werden. Auch PAI und PBO werden nicht durchlaufen. Daher haben Sie keinerlei Zugriff auf aktuell auf dem Dynpro veränderte Werte. Es findet auch nach dem Ereignis kein Feldtransport mehr zu dem Dynpro statt. Daher werden Werte, die Sie aufgrund des Ereignisses verändert haben, nicht auf dem Dynpro aktualisiert. Die zum Ereignis definierte Behandlermethode wird automatisch vom System aufgerufen. Mit der Methode set_new_ok_code [Seite 50] haben Sie allerdings die Möglichkeit, PAI und PBO auszulösen und einen OK_CODE zu setzen, den Sie dann in einem PAI-Modul interpretieren können. • Applikationsereignis: Das Ereignis wird zum Zeitpunkt PAI verarbeitet. Daher wurden alle Feldprüfungen durchgeführt, und auch der Feldtransport hat stattgefunden. Sofern Sie die Behandlermethode an einer bestimmten Stelle Ihres Applikationsprogramms aufrufen wollen, müssen Sie das Ereignis mit der statischen Methode CL_GUI_CFW=>DISPATCH auswerten. Zum Festlegen der Behandlermethode eines Ereignisses muß das Applikationsprogramm über das ABAP-Sprachelement SET HANDLER eine Behandlermethode registrieren. Die Behandlermethode muß in dem Applikationsprogramm als Methode einer (lokalen) Klasse angelegt werden. Es steht Ihnen frei, die Behandlermethode als Instanzmethode oder statische Methode anzulegen. 10 April 2001 SAP AG SAP Control Framework Ereignisbehandlung SAPGUI Automation Controller Ereignisse: Ereignis Control DoppelKlick Control OO-Control Framework Ereignisse: Ereignis Control DoppelKlick Control Behandler DoppelKlick Control Applikationsprogramm CALL METHOD control->set_registered_events SET HANDLER handler->DoppelKlick FOR control. Applikationsserver Funktionsumfang Wird auf einem Custom Control ein Ereignis ausgelöst, überprüft der Automation Controller, ob dieses Ereignis in seiner Tabelle registriert wurde. Wurde das Ereignis nicht registriert, wird das Ereignis vom Automation Controller ignoriert. Wurde es dagegen registriert, generiert der Automation Controller einen OK_CODE, der an das OO Control Framework weitergeleitet wird. Je nach Art des Ereignisses wird dann entweder direkt (bei einem Systemereignis) oder nach Aufruf der statischen Methode CL_GUI_CFW=>DISPATCH (bei einem Applikationsereignis) die zum Ereignis registrierte Behandlermethode aufgerufen. Dabei wird über den Ereignisparameter sender die Objektreferenz des Controls, welches das Ereignis ausgelöst hat, an die Behandlermethode übergeben. Die statische Methode CL_GUI_CFW=>DISPATCH muß zur Auswertung von Applikationsereignissen innerhalb der PAI-Module aufgerufen werden. Der OK_CODE eines Ereignisses wird durch den Aufruf der Methode CL_GUI_CFW=>DISPATCH "verbraucht". Daher führt ein zweiter Aufruf der Methode nicht zu einem erneuten Anspringen der Behandlermethode. Über den Parameter RC der Methode CL_GUI_CFW=>DISPATCH [Seite 47] erhalten Sie Informationen, ob das Ereignis erfolgreich an eine Behandlermethode weitergeleitet werden konnte. April 2001 11 SAP Control Framework SAP AG Ereignisbehandlung SAPGUI Automation Controller Ereignisse: Ereignis Control DoppelKlick Control Ereignis DoppelKlick des Controls Control Control OO-Control Framework Applikationsprogramm Ereignisse: CLASS lcl_handler IMPLEMENTATION. METHOD DoubleKlick. * DO SOMETHING ENDMETHOD. ENDCLASS. Ereignis Control DoppelKlick Control Behandler DoppelKlick Applikationsserver 12 April 2001 SAP AG SAP Control Framework Registrieren und Verarbeiten von Ereignissen Registrieren und Verarbeiten von Ereignissen Einsatzmöglichkeiten Über den Ereignismechanismus des Control Frameworks können Sie in Ihrem Programm in Behandlermethoden auf Ereignisse reagieren, die auf dem Control ausgelöst wurden (z.B. Doppelklick). Voraussetzungen Der Ablauf wurde allgemeingültig für alle Custom Controls gehalten. Control-spezifische Informationen finden Sie in der jeweiligen Dokumentation zu der Control-Verschalung. Ablauf 1. Es wird davon ausgegangen, daß Sie mit einem Custom Control mit der Verschalung cl_gui_xyz arbeiten: DATA my_control TYPE REF TO cl_gui_xyz. Anmelden von Ereignissen beim Control Framework 2. Definieren Sie eine interne Tabelle (Typ cntl_simple_events) und einen dazugehörenden Arbeitsbereich (Typ cntl_simple_event). DATA events TYPE cntl_simple_events. DATA wa_events TYPE cntl_simple_event. 3. Füllen Sie nun die Ereignistabelle mit den relevanten Ereignissen. Dazu benötigen Sie die Identifikation des Ereignisses (event_id). Diese Information finden Sie wiederum in der Klassenbibliothek in den Attributen der Klasse cl_gui_xyz. Weiterhin müssen Sie sich entscheiden, ob das Ereignis als Systemereignis (appl_event = ' ') oder als Applikationsereignis (appl_event = 'X') definiert werden soll. wa_events-eventid = event_id. wa_events-appl_event = appl_event. APPEND wa_events TO events. 4. Im nächsten Schritt muß die Ereignistabelle an das Frontend geschickt werden, damit die relevanten Ereignisse vom Frontend an das Backend weitergeleitet werden. CALL METHOD my_control->set_registered_events events = events. Um auf ein Ereignis Ihres Custom Controls eingehen zu können, müssen Sie nun noch eine Behandlermethode angeben. Die Behandlermethode kann eine Instanzmethode oder eine statische Methode sein: Behandlung des Ereignisses als Instanzmethode 5. Definieren Sie die (lokale) Klassendefinition für den Ereignisbehandler. Dabei legen Sie den Namen der Ereignisbehandlermethode fest (Event_Handler). Als Information müssen Sie sich in der Klassenbibliothek für die Klasse des Custom Controls cl_gui_xyz den Namen des Ereignisses (event_name) und die zu diesem Ereignis gehörenden Ereignisparameter (event_parameter) besorgen. Der Ereignisparameter sender wird bei jedem Ereignis zur April 2001 13 SAP Control Framework SAP AG Registrieren und Verarbeiten von Ereignissen Verfügung gestellt. Der Parameter enthält die Referenz des Controls, das dieses Ereignis ausgelöst hat. CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. METHODS Event_Handler FOR EVENT event_name OF cl_gui_xyz IMPORTING event_parameter sender. ENDCLASS. 6. Melden Sie jetzt noch für die registrierten Ereignisse Behandlermethoden beim OO Control Framework an. DATA event_receiver TYPE REF TO lcl_event_receiver. CREATE OBJECT event_receiver. SET HANDLER event_receiver->Event_Handler FOR my_control. Registrieren als statische Methode 7. Definieren Sie die (lokale) Klassendefinition für den Ereignisbehandler. Dabei legen Sie den Namen der statischen Ereignisbehandlermethode fest (Event_Handler). Als Information müssen Sie sich in der Klassenbibliothek für die Klasse des Custom Controls cl_gui_xyz den Namen des Ereignisses (event_name) und die zu diesem Ereignis gehörenden Ereignisparameter (event_parameter) besorgen. CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. CLASS-METHODS Event_Handler FOR EVENT event_name OF cl_gui_xyz IMPORTING event_parameter sender. ENDCLASS. 8. Melden Sie jetzt noch für die registrierten Ereignisse Behandlermethoden beim OO Control Framework an. SET HANDLER lcl_event_receiver=>Event_Handler FOR my_control. Verarbeiten von Control-Ereignissen 9. Wie Sie auf ein Ereignis reagieren wollen, legen Sie im Implementierungsteil der Behandlermethode fest. CLASS lcl_event_receiver IMPLEMENTATION. METHOD Event_Handler. * Abarbeitung des Ereignisses ENDMETHOD. ENDCLASS. 10. Je nach Art des Ereignisses (System- oder Applikationsereignis) müssen Sie jetzt noch die Methode CL_GUI_CFW=>DISPATCH aufrufen. Lesen Sie dazu Ereignisbehandlung [Seite 10]. 14 April 2001 SAP AG SAP Control Framework Kontextmenü Kontextmenü Kontextmenüs werden im SAP GUI for HTML nicht unterstützt. Verwendung Das Kontextmenü (Rechte Maustaste, SHIFT F10) ermöglicht das Anzeigen von kontextsensitiven Menüs. Der Kontext wird über den Ort definiert, an dem der Benutzer das Kontextmenü aufgerufen hat Der Benutzer kann über das Kontextmenü Funktionen auswählen, die für den aktuellen Kontext relevant sind. Funktionsumfang Soll auf einem Custom Controls ein Kontextmenü implementiert werden, muß das Ereignis für das Anfordern eines Kontextmenüs (Ereignis context_menu) registriert werden. Das Ereignis für das Auswählen eines Eintrags des Kontextmenüs (Ereignis context_menu_selected) wird entweder von der Control-Verschalung automatisch registriert (z.B. SAP Tree) oder muß explizit registriert werden (z.B. SAP Picture). Fordert der Benutzer auf einem Objekt ein Kontextmenü an, wird über den normalen Ereignismechanismus [Seite 10] das Anwendungsprogramm aufgerufen. In der Ereignisbehandlermethode zum Ereignis context_menu erhält das Programm als Ereignisparameter eine Menüreferenz. Das Programm benutzt diese Menüreferenz, um das anzuzeigende Menü aufzubauen. Dabei können mit dem Menu Painter definierte Menüs oder dynamisch aufgebaute Menüs benutzt werden. Nach Verlassen der Ereignisbehandlermethode wird das Kontextmenü automatisch angezeigt. Das SAP Picture bildet eine Ausnahme. Hier bekommen Sie keine Menüreferenz als Ereignisparameter übergeben. Wird eine Menüfunktion des Kontextmenüs ausgewählt, wird wiederum ein Ereignis ausgelöst, das an das Applikationsprogramm übergeben wird. Auch auf dieses Ereignis muß die Applikation eine Behandlermethode registrieren. In der Behandlermethode wird der übergebene Funktionscode ausgewertet, der über einen Ereignisparameter übergeben wird. Aktivitäten • Die Applikation registriert sich mit der Methode set_registered_events [Seite 59] auf das Ereignis context_menu und auf das Ereignis context_menu_selected. Die Identifikation des Ereignisses ist von der jeweiligen Control-Verschalung abhängig und wird in der dazugehörigen Dokumentation beschrieben. • Weiterhin muß die Applikation Methoden zur Ereignisbehandlung der beiden Ereignisse definieren. April 2001 15 SAP Control Framework SAP AG Kontextmenü Der SAP Tree bildet eine Ausnahme bei der Registrierung der Ereignisse. Hier muß nur das Ereignis context_menu registriert werden. Das Ereignis context_menu_selected wird automatisch von der Control-Verschalung mitregistriert. Aufbau des Kontextmenüs In der Implementierung der Behandlermethode für das Ereignis context_menu muß das Menü dem Control zugeordnet werden. Dabei muß eventuell nachgeprüft werden, in welchem Kontext das Kontextmenü aufgerufen wurde. Der Aufbau des Kontextmenüs erfolgt über die Klasse CL_CTMENU. Bei fast allen ControlVerschalungen bekommen Sie als Ereignisparameter des Ereignisses context_menu ein Objekt auf das anzuzeigende Menü geliefert. Ist dies nicht der Fall (z.B. beim SAP Picture), müssen Sie ein Objekt der Klasse CL_CTMENU erzeugen. Auf das Kontextmenü-Objekt können Sie folgende Methoden anwenden: Methode Bedeutung LOAD_GUI_STATUS Laden eines im Menu Painter vordefinierten Kontextmenüs (siehe unten) ADD_FUNCTION Hinzufügen einer Funktion ADD_MENU Hinzufügen eines im Menu Painter definierten Menüs ADD_SUBMENU Hinzufügen eines im Menu Painter definierten Menüs als Submenü ADD_SEPARATOR Hinzufügen einer Trennlinie RESET Zurücksetzen auf Initialwert HIDE FUNCTIONS Ausblenden einer Funktion SHOW_FUNCTIONS Einblenden einer Funktion DISABLE_FUNCTIONS Deaktivieren einer Funktion ENABLE_FUNCTIONS Aktivieren einer Funktion Nach dem Verlassen der Ereignisbehandlermethode wird das Kontextmenü automatisch angezeigt. Ausnahmen bilden hier das SAP Picture Control und das SAP Toolbar Control. Bei diesen muß das Kontextmenü explizit über die Methode display_context_menu [Extern] zur Anzeige gebracht werden. Auswerten des Funktionscodes Die Interpretation des ausgewählten Menüpunktes erfolgt in der Behandlermethode zum Ereignis context_menu_selected. Über den Funktionscode wird das ausgewählte Menü identifiziert und eine entsprechende Reaktion ausgeführt. 16 April 2001 SAP AG SAP Control Framework Drag&Drop Drag&Drop Verwendung Mit Drag&Drop kann der Anwender Objekte aus einem Bereich eines Custom Controls (Quelle) markieren und auf einen anderen Bereich eines Custom Controls (Ziel) fallen lassen. Je nach Objekt wird dann im zweiten Bereich eine Aktion ausgeführt. Quelle und Ziel können dabei das gleiche Control oder zwei unterschiedliche Controls sein. Voraussetzungen Damit Controls Drag&Drop-fähig sind, muß die Control-Verschalung zusätzliche Drag&DropEreignisse anbieten. Das Anwendungsprogramm muß für diese Ereignisse Behandlerroutinen implementieren. Die Registrierung auf die Ereignisse erfolgt automatisch über die jeweilige Control-Verschalung. Funktionsumfang Für jedes beteiligte Custom Control wird das Drag&Drop-Verhalten festgelegt. Je nach Control wird das Verhalten auf alle Elemente des Controls bezogen (z.B. Editor), oder man kann für jedes Teilobjekt ein eigenes Verhalten definieren (z.B. Tree). Jedes Verhalten besteht aus einer oder mehreren Beschreibungen. Die Beschreibung hat folgende Attribute: • DragSrc: Objekt ist Quelle eines Drag&Drop-Vorgangs • DropTarget: Objekt ist Ziel eines Drag&Drop-Vorgangs • Flavor: Der Flavor beschreibt den Typ einer Drag&Drop-Beschreibung. In einer Drag&DropSituation können Objekte nur in andere fallengelassen werden, wenn sie mindestens eine gemeinsame Beschreibung besitzen. • Effect: Beschreibung, ob die Daten beim Drag&Drop-Vorgang kopiert und/oder verschoben werden können • Effect_In_Ctrl: Mit welchem Drop-Effekt können Daten innerhalb des gleichen Controls verschoben oder kopiert werden. Sobald ein Drag-Ereignis ausgelöst wird, muß die Applikation in der entsprechenden Behandlermethode feststellen, welches Objekt von dem Ereignis betroffen ist. Weiterhin muß für das Drop-Ereignis implementiert werden, welche Aktionen durchgeführt werden sollen. Die Aktionen sind dabei in der Regel abhängig von dem Objekt, das in das Control fallengelassen wurde. Wurden einem Objekt mehrere Flavors zugeordnet, muß zu einem speziellen Ereignis festgelegt werden, welcher Flavor benutzt werden soll. Nachdem das Drop-Ereignis abgeschlossen ist, können in einem zusätzlichen Ereignis weitere Aktionen durchgeführt werden. Dieses Ereignis bietet sich insbesondere beim Verschieben des Quellobjekts an, um dieses aus der Quelle zu löschen. April 2001 17 SAP Control Framework SAP AG Drag&Drop Aktivitäten Wenn die Drag&Drop-Funktionalität benutzt wird, sollte auf jeden Fall auch eine UNDO-Funktion bereitgestellt werden, sofern die Drag&Drop-Funktion zu einem Verschieben des Objekts führt. Diese muß von der Anwendung implementiert werden. 18 April 2001 SAP AG SAP Control Framework Ablauf einer Drag&Drop Operation Ablauf einer Drag&Drop Operation Voraussetzungen Im folgenden wird aufgezeigt, wie die Drag&Drop Operation abläuft. Dabei wird auf die Rolle des Applikationsservers und des Frontends eingegangen. Aus diesem Ablauf leiten sich dann die einzelnen Schritte ab, die in einem Anwendungsprogramm durchgeführt werden müssen, damit Drag&Drop genutzt werden kann. Ablauf Applikationsserver 1. Sie erzeugen die Custom Controls [Seite 44]. 2. Sie registrieren sich auf die Drag&Drop-Ereignisse [Seite 21]. 3. Sie definieren das Drag&Drop-Verhalten für die einzelnen Custom Controls bzw. für deren Teilobjekte. Dazu erzeugen Sie eines Instanz [Seite 70] der Klasse CL_DRAGDROP [Seite 69]. Dieser Instanz weisen Sie einen oder mehrere Flavors zu [Seite 71], die das Drag&DropVerhalten des entsprechenden Custom Controls beschreiben. Sie können diese Flavors während des Programmablaufs auch noch verändern [Seite 78], löschen [Seite 80], abfragen [Seite 75] oder auch die gesamte Instanz initialisieren [Seite 73] oder zerstören [Seite 74]. 4. Die Zuweisung der Flavors an das Custom Control erfolgt über control-spezifische Methoden. Lesen Sie dazu die jeweilige Control-Dokumentation. Frontend Die nachfolgenden Schritte führt das System automatisch durch. Sie dienen nur zum Verständnis des Drag&Drop-Vorgangs. 5. Nachdem der Benutzer mit der linken Maustaste ein Objekt ausgewählt hat, startet der Drag&Drop-Service. 6. Der Drag&Drop-Service überprüft, ob für das Objekt ein Drag&Drop-Verhalten definiert wurde und ob darin die Fähigkeit des Objekts für Drag definiert wurde (Attribut DragSource). 7. Wurde das Attribut DragSource entsprechend gesetzt, wird das Drag&Drop gestartet. Der Mauszeiger verändert sich dann automatisch. 8. Während der Benutzer die linke Maustaste gedrückt hält, wird ständig unter dem Mauszeiger nachgefragt, ob sich dort ein Objekt in einem Custom Control befindet, das Drop-fähig ist (Attribut DropTarget), und ob der Flavor dieses Objekts mit dem Flavor der Quelle übereinstimmt. Ist dies der Fall, wird dem Benutzer dies über eine Veränderung des Mauszeigers signalisiert. 9. Läßt der Benutzer nun das Objekt fallen, wird dies über ein Ereignis an den Applikationsserver gemeldet. Für das Frontend ist damit die Drag&Drop Operation abgeschlossen. Bisher wurden noch keinerlei Veränderungen an den Inhalten der Custom Controls vorgenommen. April 2001 19 SAP Control Framework SAP AG Ablauf einer Drag&Drop Operation Applikationsserver 10. Der Drag&Drop-Service des Applikationsservers erzeugt eine Instanz der Klasse CL_DRAGDROPOBJECT [Seite 81]. Diese Instanz (z.B. drag_drop_object) steht Ihnen in allen Ereignissen des Drag&Drop-Vorgangs als Ereignisparameter zur Verfügung und dient zum Übermitteln des Kontexts zwischen den Ereignissen. 11. Der Drag&Drop-Service prüft nach, ob das Drag-Objekt und das Drop-Objekt mehrere Flavors gemeinsam besitzen. Ist dies der Fall, wird das Ereignis ONGETFLAVOR ausgelöst. In der dazugehörigen Behandlerroutine muß nun die Applikation entscheiden, welcher Flavor verwendet werden soll. Dazu steht die Methode set_flavor [Seite 82] zur Verfügung. 12. Nun wird das Drag&Drop-Ereignis ONDRAG ausgelöst. Über Ereignisparameter erhalten Sie die relevanten Informationen, welches Objekt der Benutzer gezogen hat. Innerhalb der Behandlerroutine müssen Sie jetzt die in 9. angelegte Instanz des Drag&Drop-Datenobjekts mit dem Kontext (Informationen über das Quellobjekt) versorgen: drag_drop_object->object = mydragobject. 13. Als nächstes wird das Ereignis ONDROP ausgelöst. Aufgabe dieser Methode ist das Verarbeiten des Drag&Drop-Datenobjekts. Hier müssen Sie implementieren, welche Änderungen in dem Zielobjekt aufgrund des Drag&Drop-Vorgangs vorgenommen werden sollen. 14. Das letzte Ereignis des Drag&Drop-Vorgangs ist ONDROPCOMPLETE. Hier sollte eventuell eine Nachbearbeitung des Drag&Drop-Datenobjekts erfolgen. Besonders für den Fall einer Verschiebeoperation sollte zu diesem Zeitpunkt das Quellobjekt aus dem DragSource Control und den entsprechenden Datenstrukturen entfernt werden. In Beispiel für Drag&Drop-Programmierung [Seite 23] finden Sie ein Beispiel, das einen Drag&Drop-Vorgang zwischen einem SAP Tree und einem SAP TextEdit beschreibt. 20 April 2001 SAP AG SAP Control Framework Ereignisse bei Drag&Drop Ereignisse bei Drag&Drop Im folgenden Abschnitt werden nur die allgemeingültigen Eigenschaften der Ereignisse bei Drag&Drop beschrieben. Diese können von den einzelnen Control-Verschalungen angereichert werden. Daher sollten Sie auf jeden Fall auch in der Dokumentation zur jeweiligen ControlVerschalung die Besonderheiten des Controls nachlesen. Verwendung Im Umfeld des Drag&Drop gibt es vier Standardereignisse, bei denen Sie die Kontrolle in Ihrem Applikationsprogramm bekommen können. In den Behandlerroutinen zu diesen Ereignissen implementieren Sie, welche Aktionen bei einem Drag&Drop-Vorgang durchgeführt werden. Bestimmte Control-Verschalungen können zusätzliche Drag&Drop-Ereignisse anbieten. Hinweise dazu finden Sie in der jeweiligen Dokumentation. Voraussetzungen Um auf die Ereignisse reagieren zu können, müssen Sie sich auf sie registrieren. Im Gegensatz zu der normalen Ereignisbehandlung werden aber die Ereignisse nicht mit der Methode set_registered_events [Seite 59] am Control Framework angemeldet. Die Registrierung erfolgt automatisch über die Verschalung des eingesetzten Custom Controls. Sie müssen aber weiterhin Behandlermethoden für die Ereignisse angeben: DATA tree TYPE REF TO cl_gui_simple_tree. SET HANDLER dragdrop=>on_drag FOR tree. Die Ereignisse werden immer als Systemereignisse angemeldet. Funktionsumfang Das Control Framework reicht beim Drag&Drop erst zum Drop-Zeitpunkt ein Ereignis an den Applikationsserver weiter. Dieses wird dann am Applikationsserver, wie in Ablauf einer Drag&Drop-Operation [Seite 19] beschrieben, innerhalb eines Drag&Drop-Vorgangs in maximal vier Standardereignisse auseinandergesteuert. Alle Ereignisse haben ein Drag&DropDatenobjekt als Ereignisparameter. Über diesen Parameter müssen Sie den Kontext des Drag&Drop-Vorgangs verwalten. Weiterhin übergibt Ihnen die jeweilige Control-Verschalung weitere Informationen zu dem Drag&Drop-Kontext. Lesen Sie dazu die Dokumentation der Control-Verschalung. • ONGETFLAVOR: Dieses Ereignis wird nur dann ausgelöst, wenn das Quellobjekt und das Zielobjekt über mehrere gemeinsame Flavors verfügen. Sie müssen dann in der Behandlermethode einen der gemeinsamen Flavors auswählen. Wenden Sie dazu die Methode set_flavor [Seite 82] auf das Drag&Drop-Datenobjekt an. Das Ereignis wird von dem Zielobjekt des Drag&Drop-Vorgangs ausgelöst. • ONDRAG: Dieses Ereignis wird immer dann ausgelöst, wenn der Drag&Drop-Vorgang am Frontend beendet ist. In diesem Ereignis müssen Sie den Kontext des Quellobjekts bestimmen. Diesen Kontext übergeben Sie dann an die als Ereignisparameter übergebene Instanz der Klasse CL_DRAGDROPOBJECT. Das Ereignis wird von dem Quellobjekt des Drag&Drop-Vorgangs ausgelöst. April 2001 21 SAP Control Framework SAP AG Ereignisse bei Drag&Drop • ONDROP: Zu diesem Ereignis definieren Sie die Aktionen, die im Zielobjekt durchgeführt werden sollen. Dabei nutzen Sie den Ereignisparameter für den Kontext, den Sie zum Ereignis ONDRAG gefüllt haben. Bei diesem Ereignis ist folgendes zu beachten: − Innerhalb des ONDROP-Ereignisses muß ein dynamischer TypeCast durchgeführt werden. Die mögliche Ausnahme des TypeCast muß auf jeden Fall abgefangen werden. Falls ein nicht passendes Objekt zugewiesen werden sollte, muß in der Ausnahmebehandlung die Drag&Drop-Verarbeitung mit der Methode abort [Seite 83] abgebrochen werden. − Die verwendeten Flavors sollten so gewählt werden, daß eine Zuordnung des Drag&Drop-Objekts zu dem richtigen TypeCast möglich ist. Das Ereignis wird von dem Zielobjekt des Drag&Drop-Vorgangs ausgelöst. • 22 ONDROPCOMPLETE: Sofern Sie zum Abschluß des Drag&Drop-Vorgangs noch weitere Aktionen durchführen wollen, können Sie dies in diesem Ereignis realisieren. Dies ist z.B. im Falle einer Verschiebeoperation sinnvoll. Das Ereignis wird von dem Quellobjekt des Drag&Drop-Vorgangs ausgelöst. April 2001 SAP AG SAP Control Framework Beispiel für Drag&Drop-Programmierung Beispiel für Drag&Drop-Programmierung Das Beispielprogramm geht von einem SAP Simple Tree Control und einem SAP TextEdit Control aus. Von dem Tree Control soll eine Verschiebefunktion von Texten in das TextEdit Control möglich sein. Sie finden das Beispiel unter dem Namen RSDEMO_DRAG_DROP_EDIT_TREE. *&-------------------------------------------------------------------* *& Report RSDEMO_DRAG_DROP_EDIT_TREE *& *--------------------------------------------------------------------* REPORT rsdemo_drag_drop_edit_tree . DATA ok_code TYPE sy-ucomm. DATA node_itab LIKE node_str OCCURS 0. DATA node LIKE node_str. DATA container TYPE REF TO cl_gui_custom_container. DATA splitter TYPE REF TO cl_gui_easy_splitter_container. DATA right TYPE REF TO cl_gui_container. DATA left TYPE REF TO cl_gui_container. DATA editor TYPE REF TO cl_gui_textedit. DATA tree TYPE REF TO cl_gui_simple_tree. DATA behaviour_left TYPE REF TO cl_dragdrop. DATA behaviour_right TYPE REF TO cl_dragdrop. DATA handle_tree TYPE i. *--------------------------------------------------------------------* * CLASS lcl_treeobject DEFINITION * container class for drag object *--------------------------------------------------------------------* CLASS lcl_drag_object DEFINITION. PUBLIC SECTION. DATA text TYPE mtreesnode-text. ENDCLASS. *---------------------------------------------------------------------* * CLASS dragdrop_receiver DEFINITION * event handler class for drag&drop events *---------------------------------------------------------------------* CLASS lcl_dragdrop_receiver DEFINITION. PUBLIC SECTION. METHODS: flavor_select FOR EVENT on_get_flavor OF cl_gui_textedit IMPORTING index line pos flavors dragdrop_object, left_drag FOR EVENT on_drag OF cl_gui_simple_tree IMPORTING node_key drag_drop_object, right_drop FOR EVENT ON_DROP OF cl_gui_textedit IMPORTING index line pos dragdrop_object, drop_complete FOR EVENT on_drop_complete OF cl_gui_simple_tree IMPORTING node_key drag_drop_object. ENDCLASS. START-OF-SELECTION. CALL SCREEN 100. *&-------------------------------------------------------------------* *& Module START OUTPUT *&-------------------------------------------------------------------* April 2001 23 SAP Control Framework SAP AG Beispiel für Drag&Drop-Programmierung MODULE start OUTPUT. SET PF-STATUS 'BASE'. IF container is initial. CREATE OBJECT container EXPORTING container_name = 'CONTAINER'. CREATE OBJECT splitter EXPORTING parent = container orientation = 1. left = splitter->top_left_container. right = splitter->bottom_right_container. CREATE OBJECT editor EXPORTING parent = right. CREATE OBJECT tree EXPORTING parent = left node_selection_mode = tree->node_sel_mode_single. * Definition of drag drop behaviour for tree CREATE OBJECT behaviour_left. CALL METHOD behaviour_left->add EXPORTING flavor = 'Tree_move_to_Edit' dragsrc = 'X' droptarget = ' ' effect = cl_dragdrop=>copy. CALL METHOD behaviour_left->add EXPORTING flavor = 'Tree_copy_to_Edit' dragsrc = 'X' droptarget = ' ' effect = cl_dragdrop=>copy. CALL METHOD behaviour_left->get_handle IMPORTING handle = handle_tree. * Drag Drop behaviour of tree control nodes are defined in the node * structure PERFORM fill_tree. CALL METHOD tree->add_nodes EXPORTING node_table = node_itab table_structure_name = 'NODE_STR'. * Definition of drag drop behaviour for tree CREATE OBJECT behaviour_right. CALL METHOD behaviour_right->add EXPORTING flavor = 'Tree_move_to_Edit' dragsrc = ' ' droptarget = 'X' effect = cl_dragdrop=>copy. CALL METHOD behaviour_right->add EXPORTING flavor = 'Tree_copy_to_Edit' dragsrc = ' ' droptarget = 'X' effect = cl_dragdrop=>copy. CALL METHOD editor->set_dragdrop EXPORTING dragdrop = behaviour_right. 24 April 2001 SAP AG SAP Control Framework Beispiel für Drag&Drop-Programmierung * registration of drag and drop events SET HANDLER dragdrop=>flavor_select FOR editor. SET HANDLER dragdrop=>left_drag FOR tree. SET HANDLER dragdrop=>right_drop FOR editor. SET HANDLER dragdrop=>drop_complete for TREE. ENDIF. ENDMODULE. " START OUTPUT *&-------------------------------------------------------------------* *& Module EXIT INPUT *&-------------------------------------------------------------------* MODULE exit INPUT. LEAVE PROGRAM. ENDMODULE. " EXIT INPUT *&-------------------------------------------------------------------* *& Form fill_tree *&-------------------------------------------------------------------* FORM fill_tree. DATA: node LIKE mtreesnode. CLEAR node. node-node_key = 'Root'. node-isfolder = 'X'. node-text = 'Text'. node-dragdropid = ' '. APPEND node TO node_itab. CLEAR node. node-node_key = 'Child1'. node-relatkey = 'Root'. node-relatship = cl_gui_simple_tree=>relat_last_child. node-text = 'DragDrop Text 1'. node-dragdropid = handle_tree. " handle of behaviour APPEND node TO node_itab. CLEAR node. node-node_key = 'Child2'. node-relatkey = 'Root'. node-relatship = cl_gui_simple_tree=>relat_last_child. node-text = 'DragDrop Text 2'. node-dragdropid = handle_tree. " handle of behaviour APPEND node TO node_itab. ENDFORM. " fill_tree *&-------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT *&-------------------------------------------------------------------* MODULE user_command_0100 INPUT. CALL METHOD cl_gui_cfw=>dispatch. ENDMODULE. " USER_COMMAND_0100 INPUT *--------------------------------------------------------------------* * CLASS DRAGDROP_RECEIVER IMPLEMENTATION *--------------------------------------------------------------------* CLASS lcl_dragdrop_receiver IMPLEMENTATION. METHOD flavor_select. " set the right flavor IF line > 5. SEARCH flavors FOR 'Tree_move_to_Edit'. IF sy-subrc = 0. April 2001 25 SAP Control Framework SAP AG Beispiel für Drag&Drop-Programmierung CALL METHOD dragDROP_OBJECT->SET_FLAVOR EXPORTING newflavor = 'Tree_move_to_Edit'. ELSE. CALL METHOD dragdrop_object->abort. ENDIF. ELSE. SEARCH flavors FOR 'Tree_copy_to_Edit'. IF sy-subrc = 0. CALL METHOD dragdrop_object->set_flavor EXPORTING newflavor = 'Tree_copy_to_Edit'. ELSE. CALL METHOD dragdrop_object->abort. ENDIF. ENDIF. ENDMETHOD. METHOD left_drag. " define drag object DATA drag_object TYPE REF TO lcl_drag_object. READ TABLE node_itab WITH KEY node_key = node_key INTO node. CREATE OBJECT drag_object. drag_object->text = node-text. drag_drop_object->object = drag_object. ENDMETHOD. METHOD right_drop. " action in the drop object DATA textline(256). DATA text_table LIKE STANDARD TABLE OF textline. DATA drag_object TYPE REF TO lcl_drag_object. CATCH SYSTEM-EXCEPTIONS move_cast_error = 1. drag_object ?= dragdrop_object->object. ENDCATCH. IF sy-subrc = 1. " data object has unexpected class " => cancel Drag & Drop operation CALL METHOD dragdrop_object->abort. EXIT. ENDIF. CALL METHOD editor->get_text_as_stream IMPORTING text = text_table. * Synchronize Automation Queue after Get Methods CALL METHOD cl_gui_cfw=>flush. textline = drag_object->text. * Insert text in internal table INSERT textline INTO text_table INDEX 1. * Send modified table to frontend CALL METHOD editor->set_text_as_stream EXPORTING text = text_table EXCEPTIONS error_dp = 1 error_dp_create = 2. ENDMETHOD. METHOD drop_complete. " do something after drop IF drag_drop_object->flavor = 'Tree_move_to_Edit'. CALL METHOD tree->delete_node EXPORTING node_key = node_key. 26 April 2001 SAP AG SAP Control Framework Beispiel für Drag&Drop-Programmierung delete node_itab where node_key = node_key. ENDIF. ENDMETHOD. ENDCLASS. April 2001 27 SAP Control Framework SAP AG Drag&Drop im WAN-Umfeld Drag&Drop im WAN-Umfeld Beim Drag&Drop erzeugt jeder Flavor jeder Instanz der Klasse CL_DRAGDROP einen Kommunikations-Overhead von 20..70 Byte. Solange die Anzahl der Instanzen der Klasse CL_DRAGDROP nicht zu groß wird ( < 100), ist kein Problem zu erwarten. Der KommunikationsOverhead tritt zudem nur einmalig auf. Die einzige Regel, die zu beachten ist: Es darf nicht für jedes Drag&Drop-fähige Objekt eine Instanz der Klasse CL_DRAGDROP angelegt werden, sondern für alle Objekte, die sich gleich verhalten sollen, wird die gleiche Instanz verwendet. 28 April 2001 SAP AG SAP Control Framework Lifetime Management Lifetime Management Verwendung Das Lifetime Management regelt die Lebensdauer eines Custom Controls am Frontend. Wenn die Lebensdauer abgelaufen ist, wird das Custom Control automatisch vom SAP-System am Frontend abgebaut. Dabei wird die Methode free [Seite 54] bzw. finalize [Seite 58] für das Control vom System aufgerufen. Natürlich können Sie ein Control mit diesen Methoden auch programmgesteuert abbauen. Funktionsumfang Es gibt zwei Einstellungen für die Lebensdauer eines Controls, die beim Instanzieren vergeben werden: • my_control->lifetime_imode: Das Control lebt, solange der interne Modus nicht abgebaut wird (leave program. leave transaction.) Die Anweisung set screen 0, leave screen. baut den internen Modus nur dann ab, wenn keine andere Dynproinstanz (erzeugt z.B. durch CALL SCREEN) mehr vorhanden ist. Danach wird die Methode finalize [Seite 58] aufgerufen. • my_control->lifetime_dynpro: Das Control lebt, solange die Instanz des Dynpros existiert, d.h. sich noch im Dynprostapel befindet. Danach wird die Methode free [Seite 54] aufgerufen. Die Benutzung dieses Modus regelt automatisch die Sichtbarkeit von Controls. Controls werden immer nur dann eingeblendet, wenn das Dynpro aktiv ist, auf dem sie erzeugt wurden. Ist ein anderes Dynpro aktiv, werden sie automatisch unsichtbar geschaltet. • my_control->lifetime_default: Wird das Control in einen Container eingebaut, übernimmt es die Lebensdauer des Containers. Wird es nicht in einen Container eingebaut (z.B. weil es selbst ein Container ist), dann wird die Lebensdauer auf my_control>lifetime_imode gesetzt. Die Lebensdauer eines Controls darf nur kürzer, aber niemals länger sein als die seines Containers. Die Instanz eines Dynpros wird wie folgt definiert: Eine Instanz wird erzeugt, wenn ein Dynpro auf den Dynprostapel gestellt wird ist (z.B.: call screen 100 (starting at...); call transaction, ..) oder wenn es in den Dynprostapel gestellt wird, da es der Nachfolger eines anderen Dynpros ist. Eine Instanz wird abgebaut, wenn das Nachfolgedynpro ein anderes als das Dynpro der aktuellen Instanz ist (set screen 200 oder set screen 0). Die Lebensdauer eines Controls wird in dem Attribut my_control->lifetime verwaltet. April 2001 29 SAP Control Framework SAP AG Lifetime Management Mit der Methode is_alive [Seite 61] können Sie abfragen, ob ein instanziertes Control noch am Frontend existiert. Die Methode get_living_dynpro_controls [Seite 49] liefert eine Liste aller existierenden Controls zurück. 30 April 2001 SAP AG SAP Control Framework Automation Queue Automation Queue Verwendung Die Kommunikation zwischen Automation Controller und OO Control Framework wird über GUIRFC-Aufrufe abgewickelt: SAPGUI Automation Controller Custom Control 1 Automation Queue OK_CODE OO Control Framework Custom Control 2 GUI-RFC Automation Queue Applikationsprogramm Applikationsserver Um die Netzlast zwischen dem Backend und dem Frontend gering zu halten, werden Aufrufe vom Backend an das Frontend gepuffert und zu definierten Synchronisationspunkten an das Frontend gesendet. Der Synchronisationspunkt wird durch nicht gepufferte Methodenaufrufe oder durch expliziten Aufruf einer generischen Methode (CALL METHOD cl_gui_cfw=>flush) erreicht (siehe Synchronisation der Automation Queue [Seite 33]). Die Kommunikation basiert auf einem RFC-Aufruf. Der Aufruf erfolgt synchron, was bedeutet, daß bei jedem Synchronisationspunkt ein RFC-Aufruf erfolgt. Aufgrund der Architektur des SAPSystems dürfen diese RFC-Aufrufe eine bestimmte Dauer nicht überschreiten, da sonst die Verbindung zum Präsentationsserver vom Applikationsserver beendet wird. Die Pufferung von Operationen erhöht die Performance erheblich, da jede ungepufferte Operation eine RFC-Kommunikation mit dem Frontend auslöst. Allerdings sind insbesondere gepufferte Lesezugriffe auf ein Control mit größter Vorsicht zu behandeln, da eine falsche Verwendung zu einem Laufzeitfehler führen kann (siehe Fehlerbehandlung [Seite 35])! Performance-Hinweise Bei der Performance ist vor allem die Anzahl der Synchronisationspunkte zu beachten. In der Dynproablauflogik wird auf jeden Fall nach PBO automatisch die Automation Queue synchronisiert. April 2001 31 SAP Control Framework SAP AG Automation Queue Da allerdings eine Fehlerbehandlung von Methoden erst nach dem Synchronisationspunkt möglich ist, ist ein Kompromiß zwischen Performance und Fehlerbehandlung zu schließen. Weiterhin ist bei großen Datenmengen zu beachten, daß die Verbindung zwischen Applikationsund Präsentationsserver wegen Zeitüberschreitung nicht unterbrochen wird. In einem solchen Fall müßten dann zusätzliche Synchronisationspunkte eingefügt werden. Werkzeuge zur Unterstützung bei der Performace-Optimierung finden Sie unter Services rund um die Automation Queue [Seite 37]. Voraussetzungen Es gibt drei Arten von Methoden von Control-Schalen: • Methoden, die immer vor der Rückkehr eine Synchronisation der Automation Queue ausführen • Methoden, bei denen nie eine Synchronisation der Automation Queue ausgeführt wird. Hier ist der Anwender für die Übertragung des Puffers verantwortlich. • Methoden, bei denen die Synchronisation über einen Parameter gesteuert werden kann. Funktionsumfang Gepufferte Operationen werden in der Automation Queue gesammelt. Ein interner Modus verfügt über eine einzige Automation Queue für alle Custom Controls des internen Modus. Durch Synchronisation der Automation Queue wird deren Inhalt zum Frontend gesendet und dort ausgeführt. Das Ergebnis wird dann an das Backend zurückgemeldet: Sie rufen eine Methode des SAP Tree Controls, um den selektierten Knoten zu setzen (ohne Flush). Die Methode stellt zwei Operationen in die Automation Queue: Op_Tree_1 und Op_Tree_2. Dann rufen Sie eine Methode eines TextEdit Controls, um den ausgewählten Text anzuzeigen (ohne Flush). Die Methode stellt die Operation Op_TextEdit_1 in die Queue. Die Queue hat nun folgende Gestalt: Op_Tree_1 Op_Tree_2 Op_TextEdit_1 Wenn Sie jetzt die Automation Queue synchronisieren, wird sie zum Frontend übertragen und auf den Controls ausgeführt. 32 April 2001 SAP AG SAP Control Framework Synchronisation der Automation Queue Synchronisation der Automation Queue Einsatzmöglichkeiten Bei der Kommunikation zwischen dem OO Control Framework und dem Automation Server spielt die Automation Queue eine zentrale Rolle. In ihr werden die Automation-Aufrufe gepuffert und zu speziellen Synchronisationszeitpunkten vom Backend an das Frontend übertragen. Nach Abarbeiten der Automation Queue am Frontend wird dann das Ergebnis an das Backend zurückgeschickt. Die Anzahl der Synchronisationszeitpunkte ist entscheidend für die Performance der Anwendung. Informationen dazu bietet Ihnen der Automation Trace und der PerformanceMonitor. Beide Werkzeuge werden in Services rund um die Automation Queue [Seite 37] vorgestellt. Ablauf Die Synchronisation der Automation Queue wird zu bestimmten Zeitpunkten automatisch vom System durchgeführt: • am Ende jedes PBO-Zeitpunkts: Die Synchronisation durch das System erfolgt erst nach dem Feldtransport zum Dynpro. Daher können Ergebnisse aus Methodenaufrufen, die durch die automatische Synchronisation abgearbeitet werden, nicht auf dem Dynpro angezeigt werden. • nach dem Verlassen der Behandlermethode für Systemereignisse [Seite 10] Weiterhin können Sie die Synchronisation auch explizit anstoßen. Dazu steht Ihnen die Methode flush [Seite 48] der Klasse CL_GUI_CFW zur Verfügung. Durch geeignete Programmierung können Sie die letzte explizite Synchronisation durch das System implizit durchführen lassen. Arbeiten mit gepufferten Operationen zur Performance-Optimierung Die Performance kann anhand eines einfachen Schemas generell optimiert werden. Hierzu sollten hinsichtlich der Ablauflogik am Backend, also pro PBO / PAI-Schritt, die Aufrufe an alle vorhandenen Controls zweigeteilt werden: • Holen von Eigenschaften der Controls − Gepuffertes Holen der benötigten Eigenschaften aller Controls − Synchronisation der Automation Queue • Verarbeitung / Berechnungen • Setzen von Eigenschaften der Controls − Gepuffertes Setzen von Eigenschaften auf den Controls April 2001 33 SAP Control Framework SAP AG Synchronisation der Automation Queue − Synchronisation der Automation Queue Somit werden nur zwei Synchronisationszeitpunkte für alle Controls zusammen benötigt. Es kann allerdings sein, daß es mehrere Abschnitte ”Holen von Eigenschaften der Controls” geben muß. Dies ist dann erforderlich, wenn erst nach dem Besorgen einer Information entschieden werden kann, welche Information noch besorgt werden muß. Gepuffertes Holen von Control-Eigenschaften Beim gepufferten Holen von Control-Eigenschaften ist folgendes zu beachten: Die Adressen der ABAP-Variablen, in welche die zu holenden Werte geschrieben werden sollen, werden in der Automation Queue vermerkt. Die Wertübergabe an die Variablen erfolgt erst beim Synchronisationszeitpunkt. Bis zu diesem Zeitpunkt müssen die Adressen dieser Variablen gültig sein. Ist eine lokale Variable nicht mehr vorhanden (z.B. lokale Variable einer Formroutine), löst die Synchronisation einen Laufzeitfehler aus. Die Tücke eines solchen Fehlers besteht darin, daß im Debugger mit der Einstellung Automation Controller: Aufträge immer synchron verarbeiten kein Fehler auftritt. Die Verwendung globaler Variablen löst das Problem nicht. Zum einen ist es kein guter Programmierstil, zum anderen führt ein zu später Synchronisationszeitpunkt dazu, daß eine Anwendung nicht aktuelle Werte der Variablen benutzt. Sicherheit bringt die Abfrage von Control-Eigenschaften in einer Formroutine, die am Ende und bei jedem EXIT eine Synchronisation durchführt. Beim Auswerten von Ereignissen macht es Sinn, sich die Eigenschaften des auslösenden Controls im Ereignisbehandler zu holen und die Automation Queue danach zu synchronisieren. (Pseudo-Syntax): Der selektierte Knoten eines Tree Controls und der selektierte Text eines TextEdit Controls sollen gelesen werden: FORM GET_CONTROL_PROPERTIES. DATA: tree_selected_node, combobox_selected_node. CALL METHOD tree->GET_SELECTED_NODE IMPORTING NODE_KEY = tree_selected_node <Fehlerbehandlung> CALL METHOD textedit-> GET_SELECTION_POS IMPORTING FROM_LINE = from_line FROM_POS = from_pos TO_LINE = to_line TO_POS = to_pos. <Fehlerbehandlung> CALL METHOD CL_GUI_CFW=>FLUSH <Fehlerbehandlung> ENDFORM. 34 April 2001 SAP AG SAP Control Framework Fehlerbehandlung bei der Synchronisation Fehlerbehandlung bei der Synchronisation Einsatzmöglichkeiten Fehler bei Automation-Aufrufen können erst nach dem Synchronisationszeitpunkt ausgewertet werden. Die dadurch entstehende Problematik soll an folgendem Beispiel verdeutlicht werden: 1. Nacheinander werden die Methoden set_registered_events, add_column, add_nodes_and_items und expand_nodes auf einen SAP Tree aufgerufen. Der Aufruf der Methode add_nodes_and_items beinhaltet einen Fehler. 2. Nun wird mit der Methode cl_gui_cfw=>flush die Automation Queue synchronisiert. Dadurch wird die Automation Queue an das Frontend übertragen und dort abgearbeitet. 3. Die ersten beiden Methoden werden ohne Fehler abgearbeitet. 4. Bei der dritten Methode tritt allerdings ein Fehler auf. Das weitere Abarbeiten der Automation Queue wird dadurch abgebrochen, und es wird ein Fehler an das Backend gemeldet. 5. Es wird die Ausnahme cntl_error der Methode cl_gui_cfw=>flush ausgelöst. Daher ist die fehlerhafte Methode auf Anhieb nicht zu identifizieren. In diesem Fall sollten Sie den Debugger [Seite 37] benutzen und dabei die Option Automation Controller: Aufträge immer synchron verarbeiten setzen. Dann wird der Fehler bei der Methode add_nodes_and_items ausgelöst. Besonders kritisch wirkt sich dieses Verhalten bei der Synchronisation der Automation Queue durch das System aus. Um auch hier eine Fehlerbehandlung durch die Anwendung zu ermöglichen, löst das System in diesem Fall das Systemereignis flush_error aus. Auf dieses sollten Sie sich auf jeden Fall registrieren. Versäumen Sie dies, wird ein Fehlerprotokoll ausgegeben. Ablauf Um sich auf das Ereignis flush_error zu registrieren, müssen Sie folgende Schritte durchführen: 1. Legen Sie eine (lokale) Klasse für die Ereignisbehandlung an. 2. Definieren Sie eine Ereignisbehandlermethode für das Ereignis flush_error der Klasse cl_gui_cfw. Als Ereignisparameter erhalten Sie Informationen über den Kontext, in dem der Fehler aufgetreten ist. Beispiel als statische Methode: *------------------------------------------* * CLASS lcl_event_handler DEFINITION *------------------------------------------* CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. April 2001 35 SAP Control Framework SAP AG Fehlerbehandlung bei der Synchronisation class-METHODS error FOR EVENT flush_error OF cl_gui_cfw IMPORTING DYNPRO_PROGRAM DYNPRO_NUMBER SITUATION. ENDCLASS. Ereignisparameter Parameter Bedeutung DYNPRO_PROGRAM Programmname des Programms, in dem der Fehler aufgetreten ist DYNPRO_NUMBER Dynpronummer, auf der der Fehler aufgetreten ist SITUATION Fehler bei systemgesteuertem Synchronisieren der Automation Queue trat auf bei cl_gui_cfw=>flush_situation_pbo: Synchronisation nach PBO cl_gui_cfw=>flush_situation_system_events: Synchronisation nach einem Systemereignis 3. Implementieren Sie die Ereignisbehandlermethode. Werten Sie dabei die Informationen zum Kontext des Fehlers aus: *------------------------------------------* * CLASS lcl_event_handler IMPLEMENTATION *- ----------------------------------------* CLASS lcl_event_handler IMPLEMENTATION. METHOD error. <do something> ENDMETHOD. ENDCLASS. Registrieren Sie das Ereignis am OO Control Framework: SET HANDLER lcl_event_handler=>error. Nach dem Auslösen des Ereignisses sollte auf keinen Fall weiter mit Controls gearbeitet werden, da dann weitere Fehler auftreten können. Sie sollten daher Ihre Anwendung kontrolliert beenden. 36 April 2001 SAP AG SAP Control Framework Services rund um die Automation Queue Services rund um die Automation Queue Verwendung Zur Unterstützung bei der Verwendung von Controls in Anwendungen werden unterschiedliche Services zur Verfügung gestellt: Debugger: Lokalisieren von Fehlern Performance-Anzeige: Performance-Optimierung Automation Trace: Lokalisieren von Synchronisationszeitpunkten Funktionsumfang Debugger Wenn Sie mit gepufferten Operationen bei der Kommunikation mit Controls arbeiten, werden Fehler bei einem Methodenaufruf erst bei der Synchronisation der Automation Queue sichtbar. Daher ist es sinnvoll, beim Debuggen nach jeder Methode die Automation Queue zu synchronisieren. Dazu können Sie im Debugger die Einstellung Automation Controller: Aufträge immer synchron verarbeiten setzen. Diese ruft dann nach jeder Automation Methode die generische Methode CALL METHOD cl_gui_cfw=>flush auf. Tritt bei direkter Ausführung der Operationen kein Fehler mehr auf, dann wurde die Methode CL_GUI_CFW=>FLUSH zum falschen Zeitpunkt gerufen. Fügen Sie nach jedem Methodenaufruf eine entsprechende Fehlerbehandlung hinzu (Abfrage des SY-SUBRC). Beachten Sie aber, daß diese Fehlerbehandlung in der Regel nur im Debugging durchlaufen wird. April 2001 37 SAP Control Framework SAP AG Services rund um die Automation Queue Performance-Anzeige Wenn Sie die Anzahl der Roundtrips innerhalb Ihres Programms überprüfen wollen, haben Sie zwei Möglichkeiten: • Schalten Sie die Anzeige der Roundtrips in der Statuszeile ein: • Aktivieren Sie die Performance-Anzeige. Wählen Sie dazu System → Hilfsmittel → Performance Anzeige. 38 April 2001 SAP AG SAP Control Framework Services rund um die Automation Queue Automation Trace Sie können einen Trace über die Automation Queue erstellen. Dazu wird in den SAP-GUIEinstellungen in der Gruppe Trace das Ankreuzfeld Automation ausgewählt. Danach werden alle Aufrufe mit ihren Parametern (create object, call method, set/get property, free object) der Automation Queue in einer Tracedatei protokolliert. Tritt ein Fehler auf, wird dieser in der Trace-Datei protokolliert (HRESULT error_code). Zusätzlich kann verfolgt werden, wie viele Flushes von der Applikation pro PBO/PAI benötigt werden. Überflüssige Flushes können dadurch eliminiert werden. April 2001 39 SAP Control Framework SAP AG Services rund um die Automation Queue Bei Mitverfolgung der Methodenaufrufe der Control-Verschalung im Trace ist zu beachten, daß die ABAP-Methodennamen in der Regel nicht mit den Methodennamen im Trace übereinstimmen. Die Methodennamen im Trace entsprechen nämlich den Automation-Aufrufen an das Control. Weiterhin ist zu beachten, daß der Aufruf einer ABAP-Methode den Aufruf mehrerer Automation-Methoden nach sich ziehen kann. Das Laden eines Bildes in das SAP Picture hat im ABAP-Programm folgende Form: CALL METHOD picture->load_picture_from_url EXPORTING url = 'http://www.sap-ag.de/germany/images/sapag.gif' Im Automation Trace entspricht dies folgenden Zeilen: 40 April 2001 SAP AG SAP Control Framework Services rund um die Automation Queue April 2001 41 SAP Control Framework SAP AG Verwendung von Controls im WAN Verwendung von Controls im WAN Die Verwendung von Controls zur Oberflächengestaltung führt in der Regel zu einer Belastung des Kommunikationskanals zwischen Frontend und Backend. Dies kann schon im LAN-, aber insbesondere im WAN-Umfeld ein performance-kritischer Aspekt sein. Puffermechanismen helfen, diese Problematik zu entschärfen (siehe auch Automation Queue [Seite 31]). Die aufgeführten Punkte sollen als Richtlinien bei der Verwendung von Controls im WAN dienen. Control-spezifische Hinweise zur Verwendung im WAN finden Sie in der Dokumentation zu dem jeweiligen Control. Verwendung von CL_GUI_CFW=>FLUSH Der Aufruf CL_GUI_CFW=>FLUSH [Seite 48] dient zum Synchronisieren der Automation Queue und der in der Queue enthaltenen ABAP-Variablen. Dieser Aufruf erzeugt in vielen Fällen einen synchronen RFC vom Applikationsserver zum Frontend. Um optimale Performance zu erreichen, sollten die Aufrufe dieser Methode minimiert werden. Es ist in vielen Fällen zu empfehlen, alle Eigenschaften von allen Controls zentral an einer Stelle (z.B. am Anfang des PAI) in einer Automation Queue zu lesen und dann über einen einmalige Synchronisation zu besorgen. Diese Variante ist auch dann zu bevorzugen, wenn dabei Eigenschaften gelesen werden, die nicht immer für den Ablauf des Ereignisbehandlers bzw. des PAI – PBO Zyklus notwendig sind. Es ist nicht notwendig, einen „Sicherheits-Flush“ am Ende von PBO zu codieren, damit Methodenaufrufe der Controls garantiert an das Frontend transportiert werden. Diese Funktionalität wird systemseitig garantiert, wenn das nächste Dynpro gesendet wird. Damit ist es auch nicht möglich, eine Automation Queue über mehrere Bildwechsel hinweg aufzubauen. Es ist nicht garantiert, daß eine Automation Queue durch den Aufruf CL_GUI_CFW=>FLUSH gesendet wird. Die Queue erkennt, ob Returnwerte enthalten sind. Ist dies nicht der Fall, wird das Senden unterdrückt! Für alle Fälle, in denen auch bei einer Queue ohne Returnwert gewünscht wird, daß die Automation Queue synchron versendet wird, gibt es im Control Framework die Methode CL_GUI_CFW=>UPDATE_VIEW [Seite 51]. Diese Methode darf nur dann verwendet werden, wenn es zwingend notwendig ist, ein Update des GUI zu erreichen. Beispiele hierfür sind sehr lange laufende Anwendungen, die in regelmäßigen Abständen dem Benutzer ein Feedback über den Fortschritt der Aktion anzeigen möchten. Nach dem Lesen von Eigenschaften ist der Inhalt der entsprechenden ABAP-Variablen erst nach dem nächsten FLUSH garantiert. Solange dieser Aufruf nicht erfolgt ist, ist der Inhalt der entsprechenden ABAP-Variablen nicht definiert. In Zukunft wird es Fälle gegeben, in denen dieser FLUSH unnötig sein wird. Diese Fälle werden von der Automation Queue erkannt; der entsprechende FLUSH-Call wird dann ignoriert. Erzeugen von Controls, Datenversorgung Das Erzeugen eines Controls und die Datenversorgung ist in den meisten Fällen ein einmaliger Vorgang und im Vergleich zu Dynproelementen sehr teuer. Deshalb sollten Controls nicht unnötig erzeugt bzw. nicht unnötig mit Daten versorgt werden. Ein typisches Beispiel hierfür sind TabStrips mit mehreren Seiten. Wenn diese Seiten Controls tragen, ist immer abzuwägen, ob man auf lokale Seiten verzichtet und die Controls erst dann 42 April 2001 SAP AG SAP Control Framework Verwendung von Controls im WAN erzeugt, wenn der Benutzer die Seite aktiviert. Das gleiche trifft für die Datenversorgung dieser Controls auf TabStrip-Seiten zu. Muß bei der Datenversorgung eine Unterscheidung zwischen einer WAN- und einer LANAnmeldung vorgenommen werden, steht der Funktionsbaustein SAPGUI_GET_WANFLAG zur Verfügung. In manchen Fällen kann es notwendig werden, daß eine Anwendung andere Datenmengen oder ganze Fallbacks für die WAN-Anmeldung zur Verfügung stellen sollte. Ein Beispiel, wann die WAN- bzw. LAN- Anmeldung einen Einfluß haben kann, ist die Anzahl von Geschwistern in einem Tree Control, die ohne künstliche Zwischenebenen übertragen werden können. Im Gegensatz zu Dynproelementen werden die Controls nur einmalig erzeugt und mit Daten versorgt. Controls werden unter Performance-Aspekten dann immer preiswerter, je länger diese leben. In Anwendungen, die ständig neu aufgerufen und damit neu initialisiert werden, kann dies zu einem erheblichen Performance-Nachteil werden; in Anwendungen, die sehr lange auf den gleichen Bildern arbeiten, kann daraus sogar ein Performance-Vorteil entstehen. Im Einzelfall kann über entsprechende Performance-Werkzeuge [Seite 37] überprüft werden, welche Nachteile oder Vorteile die Verwendung eines Controls unter dem Aspekt der Netzwerkauslastung bringt. Ablegen von Dokumenten, Bildern etc. Zum Release 4.6A wird ein Frontend-Cache für Zugriffe auf Dokumente aus dem BDS (Business Dokument Service) realisiert. Es wird dringend empfohlen, Office-Dokumente, Bilder etc. im BDS und nicht in der R/3-Datenbank abzulegen. Dokumente aus dem BDS können danach im Frontend-Cache abgelegt werden. Sie müssen nur einmalig über das Netz geladen werden. April 2001 43 SAP Control Framework SAP AG Anlegen eines Controls am Beispiel des SAP Picture Anlegen eines Controls am Beispiel des SAP Picture Voraussetzungen Der folgende Ablauf ist für alle von SAP ausgelieferten Custom Controls anwendbar. In den Code-Beispielen wird immer auf das SAP Picture Control eingegangen. Für andere Controls ist aber im Prinzip nur die Klasse des Controls auszutauschen. Weiterhin geht das Beispiel davon aus, daß das Custom Control in einem Custom Container eingebaut wird. Andere Szenarios werden in der Dokumentation zu den Control Containern beschrieben. Ablauf Instanz anlegen 1. Definieren Sie eine Referenzvariable für den Custom Container, in dem das Custom Control angezeigt werden soll (Siehe SAP Container [Extern]) DATA container TYPE REF TO cl_gui_custom_container. 2. Definieren Sie eine Referenzvariable für das Picture Control: DATA picture TYPE REF TO cl_gui_picture. 3. Erzeugen Sie den Custom Container. Den Bereich 'CUSTOM' für den Custom Container müssen Sie vorher im Screen Painter angelegt haben. Beim Erzeugen des Containers legen Sie auch seine Lebensdauer [Seite 29] fest (siehe constructor [Seite 56]). CREATE OBJECT container EXPORTING container_name = 'CUSTOM' lifetime = lifetime. 4. Erzeugen Sie das Picture Control. Für dieses können Sie auch eine Lebensdauer festlegen. Allerdings darf die Lebensdauer nicht größer sein als die seines Containers. CREATE OBJECT picture EXPORTING parent = container lifetime = lifetime. Ereignis anmelden 5. Das Anmelden von Ereignissen gliedert sich in das Registrieren des Ereignisses am Control Framework, das Definieren einer Behandlermethode und das Anmelden der Behandlermethode. Diese Schritte finden Sie in Registrieren und Verarbeiten von Ereignissen [Seite 13]. Arbeiten mit dem Control 6. Diese Schritte sind control-spezifisch und werden hier nicht beschrieben. Abbau der Controls In der Regel übernimmt das Lifetime Management [Seite 29] den Abbau der verwendeten Controls. Wenn Sie die Controls aber in Ihrem Programm selbst abbauen wollen, führen Sie folgende Schritte aus: 44 April 2001 SAP AG SAP Control Framework Anlegen eines Controls am Beispiel des SAP Picture 7. Bauen Sie das Custom Control mit der Methode free [Seite 54] am Frontend ab. Sofern Sie den Control Container nicht mehr benötigen, bauen Sie auch diesen ab: CALL METHOD picture->free EXCEPTIONS cntl_error cntl_system_error CALL METHOD container->free EXCEPTIONS cntl_error cntl_system_error = 1 = 2. = 1 = 2. Beachten Sie die Reihenfolge, in der Sie die Controls am Frontend abbauen. Wenn Sie einen Container abbauen, werden nämlich automatisch alle in dem Container eingebundenen Controls auch abgebaut. Der Versuch, ein bereits abgebautes Control erneut abzubauen, führt zu einem Fehler. Mit der Methode is_alive [Seite 61] kann nachgeprüft werden, ob das Control schon abgebaut wurde. 8. Löschen Sie die Referenzvariablen des Custom Controls und des Control Containers: FREE PICTURE. FREE CONTAINER. April 2001 45 SAP Control Framework SAP AG Methoden der Klasse CL_GUI_CFW Methoden der Klasse CL_GUI_CFW Die Klasse CL_GUI_CFW beinhaltet statische Methoden, die beim Aufruf auf alle instanzierten Custom Controls wirken. 46 April 2001 SAP AG SAP Control Framework dispatch dispatch Die Methode dispatch verteilt Applikationsereignisse (siehe Ereignisbehandlung [Seite 10]) an die für das Ereignis angemeldeten Ereignisbehandler. Wenn diese Methode nicht im Applikationsprogramm innerhalb von PAI aufgerufen wird, dann wird sie automatisch vom System nach dem Abarbeiten von PAI aufgerufen. Die Methode liefert einen Returncode zurück, über den der Erfolg des Aufrufs abzulesen ist. CALL METHOD cl_gui_cfw=>dispatch IMPORTING return_code = return_code. Parameter Bedeutung return_code cl_gui_cfw=>rc_found: Das Ereignis konnte erfolgreich an eine Behandlermethode übergeben werden. cl_gui_cfw=>rc_unknown: Das Ereignis wurde nicht in der Ereignisliste registriert. cl_gui_cfw=>rc_noevent: Es wurde kein Ereignis auf einem Control ausgelöst. Der OK_CODE war daher ein normaler OK_CODE (z.B. von einem Menüeintrag). cl_gui_cfw=>rc_nodispatch: Dem Ereignis konnte keine Behandlermethode zugeordnet werden. Das Ereignis kann nur einmalig verteilt werden. Danach ist das Ereignis verbraucht. Daher wird ein zweiter Aufruf der Methode nicht nochmals zu einem Sprung in den Ereignisbehandler führen. April 2001 47 SAP Control Framework SAP AG flush flush Mit dieser Methode synchronisieren Sie explizit die Automation Queue [Seite 31]. Die gepufferten Operationen werden dann zum Frontend per GUI-RFC geschickt. Dort wird die Automation Queue in der Reihenfolge abgearbeitet, wie Sie sie gefüllt haben. Im Fehlerfall wird eine Ausnahme ausgelöst, die Sie auf jeden Fall abfragen und behandeln sollten. Da eine Zuordnung des Fehlers in der Regel nicht mehr möglich ist, stehen Ihnen sowohl im Debugger als auch im SAP GUI Werkzeuge zur Verfügung, um den Fehler zu lokalisieren: Debugger: Markieren Sie in den Einstellungen das Ankreuzfeld Automation Controller: Aufträge immer synchron verarbeiten. Dies führt dazu, daß nach jeder Methode, die den Automation Controller ruft, die Methode cl_gui_cfw=>flush automatisch aufgerufen wird. SAP GUI: In den Einstellungen zum SAP GUI können Sie auf der Karteikarte Trace das Ankreuzfeld Automation wählen. Dadurch wird die Kommunikation zwischen Applikationsserver und Automation Controller in einer Trace-Datei mitgeschrieben. Diese kann dann ausgewertet werden. CALL METHOD cl_gui_cfw=>flush EXCEPTIONS CNTL_SYSTEM_ERROR = 1 CNTL_ERROR = 2. Führen Sie nur so viele Synchronisationspunkte in Ihr Programm ein, wie wirklich nötig sind. Bei jeder Synchronisation wird nämlich eine RFC-Verbindung zum SAP GUI geöffnet. 48 April 2001 SAP AG SAP Control Framework get_living_dynpro_controls get_living_dynpro_controls Mit dieser Methode können Sie sich eine Liste von Referenzvariablen zu allen noch aktiven Custom Controls besorgen. CALL METHOD cl_gui_cfw=>get_living_dynpro_controls IMPORTING control_list = control_list. Parameter Bedeutung control_list Liste der Referenzvariablen zu aktiven Custom Controls. Liste ist vom Typ CNTO_CONTROL_LIST (in der Klasse CL_GUI_CFW definiert) April 2001 49 SAP Control Framework SAP AG set_new_ok_code set_new_ok_code Diese Methode darf nur in Behandlermethoden zu Systemereignissen eingesetzt werden. Sie setzt einen OK_CODE, der ein Ausführen von PAI nach sich zieht. Dadurch können Sie nach dem Feldtransport nochmals die Kontrolle in Ihren PAI-Modulen bekommen. CALL METHOD cl_gui_cfw=>set_new_ok_code EXPORTING new_code = new_code IMPORTING rc = rc. Parameter Bedeutung new_code Funktionscode, der in das OK_CODE-Feld (SY-UCOMM) gestellt werden soll. return_code cl_gui_cfw=>rc_posted: Der OK_CODE wurde mit Erfolg gesetzt, und die Verarbeitung wird nach Abschluß der Behandlermethode mit PAI fortgesetzt (vorher wird noch die automatische Feldprüfung des Dynpros durchgeführt). cl_gui_cfw=>rc_wrong_state: Die Methode wurde nicht bei einem Systemereignis aufgerufen. cl_gui_cfw=>rc_invalid: Der gesetzte OK_CODE ist kein erlaubter OK_CODE. 50 April 2001 SAP AG SAP Control Framework update_view update_view Die Automation Queue wird durch den Aufruf der Methode flush [Seite 48] nur dann synchronisiert, wenn in der Automation Queue Returnwerte enthalten sind. Für alle Fälle, in denen auch im Fall einer Returnwert-freien Queue gewünscht wird, daß die Automation Queue synchron versendet wird, gibt es im Control Framework die Methode CL_GUI_CFW=>UPDATE_VIEW. Diese Methode darf nur dann verwendet werden, wenn es zwingend notwendig ist, ein Update des SAP GUI zu erreichen. Beispiele hierfür sind sehr lange laufende Anwendungen, die in regelmäßigen Abständen dem Benutzer ein Feedback über den Fortschritt der Aktion anzeigen möchten. CALL METHOD cl_gui_cfw=>update_view EXCEPTIONS CNTL_SYSTEM_ERROR = 1 CNTL_ERROR = 2. April 2001 51 SAP Control Framework SAP AG Methoden der Klasse CL_GUI_OBJECT Methoden der Klasse CL_GUI_OBJECT Die Klasse CL_GUI_OBJECT beinhaltet wichtige Methoden zum Verschalen von Custom Controls. Für Anwendungsprogramme ist einzig die Methode is_valid [Seite 53] relevant. 52 April 2001 SAP AG SAP Control Framework is_valid is_valid Diese Methode liefert als Ergebnis, ob ein Custom Control zu einer Objektreferenz noch am Frontend vorhanden ist. CALL METHOD my_control->is_valid IMPORTING result = result. Parameter Bedeutung result 0: Custom Control ist nicht mehr am Frontend aktiv 1: Custom Control ist noch aktiv April 2001 53 SAP Control Framework SAP AG free free Diese Methode baut ein Custom Control am Frontend ab. Nach Aufruf dieser Methode sollten Sie auch die Objektreferenz initialisieren (FREE my_control). CALL METHOD my_control->free EXCEPTIONS cntl_error = 1 cntl_system_error = 2. 54 April 2001 SAP AG SAP Control Framework Methoden der Klasse CL_GUI_CONTROL Methoden der Klasse CL_GUI_CONTROL Die Klasse CL_GUI_CONTROL beinhaltet Methoden, die zum Setzen von Control-Eigenschaften (z.B. Visualisieren des Controls), Registrieren von Ereignissen und zum Abbau des Controls dienen. April 2001 55 SAP Control Framework SAP AG constructor constructor Diese Methode wird von der Control-Verschalung des verwendeten Controls aufgerufen, um ein Control am Frontend zu instanzieren. Um ein SAP Control zu instanzieren, rufen Sie immer den Konstruktor der dazugehörenden Klasse auf. CREATE OBJECT my_control EXPORTING clsid = clsid lifetime = lifetime shellstyle = shellstyle parent = parent autoalign = autoalign EXCEPTIONS cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4. Parameter Bedeutung clsid ID der Klasse lifetime Parameter für das Lifetime Management. Folgende Werte sind möglich: my_control->lifetime_imode: Das Control lebt, solange der interne Modus nicht abgebaut wird (z.B.: leave program. leave transaction. set screen 0, leave screen.). Danach wird die Methode finalize [Seite 58] aufgerufen. my_control->lifetime_dynpro: Das Control lebt, solange die Instanz des Dynpros existiert, d.h. sich noch im Dynprostapel befindet. Danach wird die Methode free [Seite 54] aufgerufen. Die Benutzung dieses Modus regelt automatisch die Sichtbarkeit von Controls. Controls werden immer nur dann eingeblendet, wenn das Dynpro aktiv ist, auf dem sie erzeugt wurden. Ist ein anderes Dynpro aktiv, werden sie automatisch unsichtbar geschaltet. my_control->lifetime_default: Wird das Control in einen Container eingebaut, übernimmt es die Lebensdauer des Containers. Wird es nicht in einen Container eingebaut (z.B. weil es selbst ein Container ist), dann wird die Lebensdauer auf my_control->lifetime_imode gesetzt. shellstyle Steuerung des Erscheinungsbilds und des Verhaltens des Controls Konstanten aus dem ABAP-Include <CTLDEF>, die mit WS beginnen, können Sie übergeben. Kombinationen von mehreren Styles können Sie durch Addieren der Konstanten erreichen. Der Vorschlagswert führt intern zum Setzen einer ausreichenden Kombination von Style-Konstanten. parent 56 Container, in dem das SAP Picture Control angezeigt werden kann (siehe SAP Container [Extern]) April 2001 SAP AG SAP Control Framework constructor autoalign ' ': kein automatisches Ausrichten des Controls 'X': automatisches Ausrichten des Controls. Dabei wird der maximal verfügbare Platz innerhalb eines Containers verwendet. April 2001 57 SAP Control Framework SAP AG finalize finalize Diese Methode wird von der verwendeten Controlverschalung überdefiniert. In ihr werden control-spezifische Funktionen zum Abbau des Controls aufgerufen. Diese Methode wird automatisch von der Methode free [Seite 54] aufgerufen, bevor das Control am Frontend abgebaut wird. CALL METHOD my_control->finalize. 58 April 2001 SAP AG SAP Control Framework set_registered_events set_registered_events Mit dieser Methode registrieren Sie sich auf Ereignisse des Controls (siehe auch: Ereignisbehandlung [Seite 10]). CALL METHOD my_control->set_registered_events EXPORTING events = events EXCEPTIONS cntl_error = 1 cntl_system_error = 2 illegal_event_combination = 3. Parameter Bedeutung events Tabelle der zu registrierenden Ereignisse für das Custom Control my_control Die Tabelle events ist eine Liste mit Ereignissen, auf die Sie sich registrieren wollen. Die Tabelle wird mit Bezug auf den Tabellentyp CNTL_SIMPLE_EVENTS definiert. Dem Tabellentyp liegt die Struktur CNTL_SIMPLE_EVENT zugrunde. Dieser besteht aus folgenden Feldern: Feld Bedeutung EVENTID Name des Ereignisses APPL_EVENT Unterscheidung, ob es sich um ein Systemereignis (initial) oder ein Applikationsereignis (X) handeln soll. Die Werte, die dem Feld EVENTID zuzuordnen sind, sind control-spezifisch und werden daher bei den entsprechenden Controls beschrieben. April 2001 59 SAP Control Framework SAP AG get_registered_events get_registered_events Diese Methode liefert eine Liste aller für das Custom Control my_control registrierten Ereignisse zurück. CALL METHOD my_control->get_registered_events IMPORTING events = events EXCEPTIONS cntl_error = 1. Parameter Bedeutung events Tabelle der zu registrierenden Ereignisse für das Custom Control my_control Die Tabelle events ist eine Liste mit Ereignissen, auf die Sie sich registriert haben. Die Tabelle wird mit Bezug auf den Tabellentyp CNTL_SIMPLE_EVENTS definiert. Dem Tabellentyp liegt die Struktur CNTL_SIMPLE_EVENT zugrunde. Dieser besteht aus folgenden Feldern: Feld Bedeutung EVENTID Name des Ereignisses APPL_EVENT Unterscheidung, ob es sich um ein Systemereignis (initial) oder ein Applikationsereignis (X) handeln soll. Die Werte, die dem Feld EVENTID zuzuordnen sind, sind control-spezifisch und werden daher bei den entsprechenden Controls beschrieben. Allgemeine Informationen zur Ereignisbehandlung finden Sie in der Dokumentation des SAP Control Frameworks unter Ereignisbehandlung [Seite 10]. 60 April 2001 SAP AG SAP Control Framework is_alive is_alive Diese Methode liefert als Ergebnis, ob ein Custom Control zu einer Objektreferenz noch am Frontend vorhanden ist. CALL METHOD my_control->is_alive RETURNING state = state. Parameter Bedeutung state my_control->state_dead: Custom Control ist nicht mehr am Frontend aktiv my_control->state_alive: Custom Control ist auf aktuellem Dynpro aktiv my_control->state_alive_on_other_dynpro: Custom Control ist auf dem aktuellen Dynpro nicht aktiv, aber am Frontend noch aktiv (d.h. unsichtbar) April 2001 61 SAP Control Framework SAP AG set_alignment set_alignment Diese Methode richtet das Custom Control innerhalb seines Containers aus: CALL METHOD my_control->set_alignment EXPORTING alignment = alignment EXCEPTIONS cntl_error = 1 cntl_system_error = 2. Parameter Bedeutung alignment Ausrichtung des Controls Der Parameter alignment kann aus Kombinationen folgender Ausrichtungen bestehen: Name Bedeutung my_control->align_at_left Ausrichtung am linken Rand my_control->align_at_right Ausrichtung am rechten Rand my_control->align_at_top Ausrichtung am oberen Rand my_control->align_at_bottom Ausrichtung am unteren Rand Kombinationen erhält man durch Aufaddieren der Komponenten: alignment = my_control->alingn_at_left + my_control->alingn_at_top. 62 April 2001 SAP AG SAP Control Framework set_position set_position Diese Methode plaziert das Control an eine bestimmte Stelle des Dynpros. In der Regel wird die Position des Controls über seinen Container geregelt. CALL METHOD my_control->set_position EXPORTING height = height left = left top = top width = width EXCEPTIONS cntl_error = 1 cntl_system_error = 2. Parameter Bedeutung height Höhe des Controls left Linker Rand des Controls top Oberer Rand des Controls width Breite des Controls April 2001 63 SAP Control Framework SAP AG set_visible set_visible Mit dieser Methode können Sie die Sichtbarkeit eines Custom Controls verändern. CALL METHOD my_control->set_visible EXPORTING visible = visible EXCEPTIONS cntl_error = 1 cntl_system_error = 2. Parameter Bedeutung visible X: Custom Control ist sichtbar ' ': Custom Control ist nicht sichtbar 64 April 2001 SAP AG SAP Control Framework get_focus get_focus Diese statische Methode liefert die Objektreferenz des Custom Controls zurück, welches den Fokus hat. CALL METHOD cl_gui_control=>get_focus IMPORTING control = control EXCEPTIONS cntl_error = 1 cntl_system_error = 2. Parameter Bedeutung control Objektreferenz (TYPE REF TO cl_gui_control) auf das Control, das den Fokus hat April 2001 65 SAP Control Framework SAP AG set_focus set_focus Mit dieser statischen Methode können Sie den Fokus auf ein Custom Control setzen. CALL METHOD cl_gui_control=>set_focus EXPORTING control = control EXCEPTIONS cntl_error = 1 cntl_system_error = 2. Parameter Bedeutung control Objektreferenz (TYPE REF TO cl_gui_control) auf das Control, das den Fokus bekommen soll 66 April 2001 SAP AG SAP Control Framework get_height get_height Diese Methode liefert die Höhe des Controls zurück. CALL METHOD control->get_height IMPORTING height EXCEPTIONS cntl_error Parameter Bedeutung height Aktuelle Höhe des Controls April 2001 = height = 1. 67 SAP Control Framework SAP AG get_width get_width Diese Methode liefert die Breite des Controls zurück. CALL METHOD control->get_width IMPORTING width EXCEPTIONS cntl_error Parameter Bedeutung width Aktuelle Breite des Controls 68 = width = 1. April 2001 SAP AG SAP Control Framework Methoden der Klasse CL_DRAGDROP Methoden der Klasse CL_DRAGDROP Die Klasse CL_DRAGDROP beinhaltet Methoden, über die das Drag&Drop-Verhalten [Seite 17] eines Custom Controls beschrieben wird. April 2001 69 SAP Control Framework SAP AG constructor constructor Der Konstruktor erzeugt eine Instanz für die Beschreibung des Drag&Drop-Verhaltens eines Controls. CREATE OBJECT dragdrop. 70 April 2001 SAP AG SAP Control Framework add add Diese Methode fügt eine weitere Beschreibung zu dem Drag&Drop-Verhalten hinzu. Es können beliebig viele Beschreibungen hinterlegt werden. Allerdings darf die gleiche Beschreibung nicht mehrmals hinzugefügt werden. CALL METHOD dragdrop->add EXPORTING flavor = flavor dragsrc = dragsrc droptarget = droptarget effect = effect effect_in_ctrl = effect_in_ctrl EXCEPTIONS allready_defined = 1 obj_invalid = 2. Parameter Bedeutung flavor Bezeichnung des neuen Flavors dragsrc 'X': Beschreibung ist eine Drag-Quelle droptarget 'X': Beschreibung ist ein Drop-Ziel effect Drop-Effekt der Beschreibung zwischen verschiedenen Custom Controls. Folgende Effekte werden unterstützt: dragdrop->copy: Darstellung der Maus beim Drag&Drop als Kopiervorgang dragdrop->move: Darstellung der Maus beim Drag&Drop als Verschiebevorgang dragdrop->none: Es ist kein Drag&Drop möglich effect_in_ctrl Drop-Effekt der Beschreibung im gleichen Custom Controls. Folgende Effekte werden unterstützt: dragdrop->copy: Darstellung der Maus beim Drag&Drop als Kopiervorgang dragdrop->move: Darstellung der Maus beim Drag&Drop als Verschiebevorgang dragdrop->none: Es ist kein Drag&Drop möglich dragdrop->use_default_effect: Es wird der gleiche Effekt benutzt, der durch den Parmeter effect spezifiziert wurde Ausnahmen Bedeutung allready_defined Der angegebene Flavor wurde bereits definiert. obj_invalid Das Objekt wurde bereits mit der Methode destroy [Seite 74] zerstört April 2001 71 SAP Control Framework SAP AG add Wird bei der Definition des Flavors sowohl der Effekt copy als auch move benutzt, werden beim Drag&Drop-Vorgang bei normalem Drag die Flavors mit Effekt Move und beim Drag in Verbindung mit Drücken der Steuerungstaste die Flavors mit Effekt Copy verwendet. 72 April 2001 SAP AG SAP Control Framework clear clear Der Inhalt der Instanz wird gelöscht. Nach Aufruf dieser Methode können keine Drag&DropVorgänge mehr auf dem betroffenen Custom Control durchgeführt werden. CALL METHOD dragdrop->clear EXCEPTIONS obj_invalid = 1. Ausnahmen Bedeutung obj_invalid Das Objekt wurde bereits mit der Methode destroy [Seite 74] zerstört April 2001 73 SAP Control Framework SAP AG destroy destroy Der Inhalt der Instanz wird gelöscht. Weiterhin wird die Instanz zerstört. Nach Aufruf der Methode sind keine Drag&Drop-Vorgänge mehr auf dem betroffenen Custom Control möglich. CALL METHOD dragdrop->destroy. 74 April 2001 SAP AG SAP Control Framework get get Diese Methode liefert die komplette Beschreibung zu einem Flavor zurück. CALL METHOD dragdrop->get EXPORTING IMPORTING flavor = isdragsrc = isdroptarget = effect = effect_in_ctrl = EXCEPTIONS not_found = 1 obj_invalid = 2. flavor isdragsrc isdroptarget effect effect_in_ctrl Parameter Bedeutung flavor Bezeichnung des Flavors dragsrc 'X': Beschreibung ist eine Drag-Quelle droptarget 'X': Beschreibung ist ein Drop-Ziel effect Drop-Effekt der Beschreibung zwischen verschiedenen Custom Controls. Folgende Effekte werden unterstützt: dragdrop->copy: Darstellung der Maus beim Drag&Drop als Kopiervorgang dragdrop->move: Darstellung der Maus beim Drag&Drop als Verschiebevorgang dragdrop->none: Es ist kein Drag&Drop möglich effect_in_ctrl Drop-Effekt der Beschreibung im gleichen Custom Controls. Folgende Effekte werden unterstützt: dragdrop->copy: Darstellung der Maus beim Drag&Drop als Kopiervorgang dragdrop->move: Darstellung der Maus beim Drag&Drop als Verschiebevorgang dragdrop->none: Es ist kein Drag&Drop möglich dragdrop->use_default_effect: Es wird der gleiche Effekt benutzt, der durch den Parmeter effect spezifiziert wurde Ausnahmen Bedeutung allready_defined Der angegebene Flavor wurde bereits definiert. Wird bei der Definition des Flavors sowohl der Effekt copy als auch move benutzt, wird beim Drag&Drop-Vorgang bei normalem Drag die Flavors mit Effekt Move und beim Drag in Verbindung mit Drücken der Steuerungstaste die Flavors mit Effekt Copy verwendet. April 2001 75 SAP Control Framework SAP AG get 76 April 2001 SAP AG SAP Control Framework get_handle get_handle Die Methode liefert das Handle auf die Drag&Drop-Beschreibung. In den meisten Fällen ist ein Aufruf dieser Methode nicht nötig. Für tabellarische Massendatenschnittstellen (z.B. SAP Tree Control) muß dieses Handle aber vom Verwender des Controls in die Schnittstellentabelle kopiert werden. CALL METHOD dragdrop->get_handle IMPORTING handle = handle EXCEPTIONS obj_invalid = 1. Parameter Bedeutung handle Handle auf die Drag&Drop-Beschreibung Ausnahmen Bedeutung obj_invalid Das Objekt wurde bereits mit der Methode destroy [Seite 74] zerstört April 2001 77 SAP Control Framework SAP AG modify modify Mit dieser Methode können Sie einen bestehenden Flavor verändern. CALL METHOD dragdrop->modify EXPORTING flavor = dragsrc = droptarget = effect = effect_in_ctrl = EXCEPTIONS not_found = 1 obj_invalid = 2. flavor dragsrc droptarget effect effect_in_ctrl Parameter Bedeutung flavor Bezeichnung des Flavors dragsrc 'X': Beschreibung ist eine Drag-Quelle droptarget 'X': Beschreibung ist ein Drop-Ziel effect Drop-Effekt der Beschreibung zwischen verschiedenen Custom Controls. Folgende Effekte werden unterstützt: dragdrop->copy: Darstellung der Maus beim Drag&Drop als Kopiervorgang dragdrop->move: Darstellung der Maus beim Drag&Drop als Verschiebevorgang dragdrop->none: Es ist kein Drag&Drop möglich effect_in_ctrl Drop-Effekt der Beschreibung im gleichen Custom Controls. Folgende Effekte werden unterstützt: dragdrop->copy: Darstellung der Maus beim Drag&Drop als Kopiervorgang dragdrop->move: Darstellung der Maus beim Drag&Drop als Verschiebevorgang dragdrop->none: Es ist kein Drag&Drop möglich dragdrop->use_default_effect: Es wird der gleiche Effekt benutzt, der durch den Parmeter effect spezifiziert wurde Ausnahmen Bedeutung not_found Der angegebene Flavor existiert nicht obj_invalid Das Objekt wurde bereits mit der Methode destroy [Seite 74] zerstört Wird bei der Definition des Flavors sowohl der Effekt copy als auch move benutzt, wird beim Drag&Drop-Vorgang bei normalem Drag die Flavors mit Effekt Move und beim Drag in Verbindung mit Drücken der Steuerungstaste die Flavors mit Effekt Copy verwendet. 78 April 2001 SAP AG SAP Control Framework modify April 2001 79 SAP Control Framework SAP AG remove remove Mit dieser Methode löschen Sie einen bestimmten Flavor. CALL METHOD dragdrop->remove EXPORTING flavor = flavor EXCEPTIONS not_found = 1 obj_invalid = 2. Parameter Bedeutung flavor Bezeichnung des Flavors Ausnahmen Bedeutung not_found Der angegebene Flavor existiert nicht obj_invalid Das Objekt wurde bereits mit der Methode destroy [Seite 74] zerstört 80 April 2001 SAP AG SAP Control Framework Methoden der Klasse CL_DRAGDROPOBJECT Methoden der Klasse CL_DRAGDROPOBJECT Die Klasse CL_DRAGDROPOBJECT dient zur Beschreibung des Kontextes eines Drag&DropVorgangs [Seite 17]. Er beinhaltet in der Regel Informationen zu dem Quellobjekt, den Flavor des Drag&Drop-Vorgangs und Informationen zu Quelle und Ziel. April 2001 81 SAP Control Framework SAP AG set_flavor set_flavor Diese Methode verwenden Sie nur innerhalb der Ereignisbehandlung zu ONGETFLAVOR. Über den Parameter newflavor bestimmen Sie, welcher Flavor innerhalb des Drag&Drop-Vorgangs verwendet werden soll. Eine Liste der verfügbaren Flavors wird Ihnen als Ereignisparameter übergeben. CALL METHOD dragdropobject->set_flavor EXPORTING newflavor = newflavor EXCEPTIONS illegal_state = 1 illegal_flavor = 2. Parameter Bedeutung newflavor Bezeichnung des Flavors Ausnahmen Bedeutung invalid_state Die Methode wurde nicht innerhalb der Ereignisbehandlung ONGETFLAVOR aufgerufen. obj_invalid Es wurde ein Flavor verwendet, der nicht von der aktuellen Drag&DropSituation unterstützt wird. 82 April 2001 SAP AG SAP Control Framework abort abort Der Drag&Drop-Vorgang wird sofort abgebrochen. Es werden keine weiteren Ereignisse ausgelöst. CALL METHOD dragdropobject->abort. April 2001 83