dispatch

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

dispatch

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
Hallo miteinander

ich habe Problem mit dem Verständnis dieser Methode.

Code: Alles auswählen.

CALL METHOD cl_gui_cfw=>dispatch
Das ist, habe irgendwo mal gelesen, gehört zu Anwendungsereignis. Ein Anwendungsreignis ist,
wenn der Inhalt von APPL_EVENT mit den Wert "X" hinterlegt ist. Das Besondere an Anwendungsereignis ist,
es wird an Applikationsserver gesendet und löst den PAI Ablauflogik aus. Dann wird in PAI Methode folgendes aufgerufen.

Code: Alles auswählen.

CALL METHOD cl_gui_cfw=>dispatch
Bitte korrigieren, falls ich etwas falsch intepretiert habe.
Meine Frage, führt dispatch alle registrierte Ereignisse erst in PAI aus?

Ein Beispiel bei ALV Grid. Es wird in PAI Modul dispatch ausgeführt.

Code: Alles auswählen.

MODULE alv_input_0130 INPUT.
  CALL METHOD cl_gui_cfw=>dispatch.
  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.
und in PBO wurde ein Ereigsnisbehandler eingebaut.

Code: Alles auswählen.

MODULE status_0130 OUTPUT.
  SET PF-STATUS 'STATUS_ALL'.
  gs_layout = sy-repid.
  IF c_custom_container IS INITIAL.
    CREATE OBJECT c_custom_container
      EXPORTING
        container_name = c_containername.
    CREATE OBJECT alvgrid
      EXPORTING
        i_parent = c_custom_container.
    ls_construction-cwidth_opt = 'X'. "Spaltenoptimierung
    CALL METHOD alvgrid->set_table_for_first_display
      EXPORTING
        i_structure_name  = 'ZBC_NOT_TRANS'
        is_variant        = gs_layout
        i_save            = 'A'
        is_layout         = ls_construction
        it_special_groups = v_lt_sgrp
      CHANGING
        it_outtab         = zbc_not_trans_tab
        it_fieldcatalog   = v_fcat.
    CREATE OBJECT o_lcl_call_mm03.

    SET HANDLER o_lcl_call_mm03->handle_double_click FOR alvgrid.
  ENDIF.

  CALL METHOD cl_gui_control=>set_focus
    EXPORTING
      control = alvgrid.
ENDMODULE.   
Nach meinem Verständnis, sollte zuerst dispatch ausgelöst werden anstatt SET HANDLER o_lcl_call_mm03->handle_double_click FOR alvgrid, weil
dispatch ja alle registierte Event Handlers in diesem Moment auslöst.

danke kostonstyle

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


Beitrag von uh (Specialist / 158 / 0 / 1 ) »
Dispatch kommt aus dem Englischen und hat in diesem Zusammenhang die Bedeutung "Senden". Und ja, Dispatch sendet und zwar die Applikations-Ereignisse und wohin, an die , die es interessiert nämlich die Ereignis-Behandler (event handler). Daher sollten die Behandler bekannt sein, sonst gehen die Ereignisse (events) ins Nirwana!

Dispatch wird übrigens automatisch am Ende des PAI ausgelöst. Nur wenn du vor deiner PAI - Verarbeitung die Applikations-Ereignisse abarbeiten willst, kannst du das mit dem Dispatch erzwingen.

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
Wenn ich aber mit double_click betätige, in diesem Beispiel ist hier der Fall, dann aber muss zuerst dispatch ausgeführt
werden vor dem Ereignis Behandler. Der CFW muss ja das Ereignis an Applikationsserver senden.
Wenn ich aber das Programm debugge, dann wird zuerst Ereignis Handler ausgeführt, erst wenn ich das Programm verlasse,
und in der Menüleiste auf "Abbrechen" klicke wird dispatch ausgeführt bzw. der PAI Module.

------------------------------------------------------------------------------------------
Also ich möchte mal mein wissen über cfw prüfen. Bitte korrigiere, wenn das Behauptete nicht stimmen.
Es gibt zwei Servereigenschaften, den Applikationsserver und Präsentationsserver. Applikationsserver ist backend
und Präsentationsserver ist frotend. Das CFW Framework führt die GUI's auf Präsentationsserver.
Wenn man die Daten in der Datenbank ändern möchte und diese wurde in CFW Framework eingegeben, zum Beispiel im Textfeld(cc_dd_document), dann muss
doch am Schluss der Präsentationserver die Daten an Applikationsserver schicken, damit Datenbank die Daten übernimmt.
Schickt man mit dispatch die Daten an Applikationsserver?

Gruss kostonstyle

Beitrag von uh (Specialist / 158 / 0 / 1 ) »
kostonstyle hat geschrieben:Schickt man mit dispatch die Daten an Applikationsserver?
Nein. Hier im Forum gbt es eine Reihe von Threads, in denen z.B. die Frage gestellt wurde, wie man die aktuellen Daten vom ALV-Grid holt.

Aber zu deinem Programm. Schmeiss einmal dein Dispatch aus dem PAI raus und setze einen Breakpoint auf dein CASE im PAI. Dann starte dein Programm und mache einen Doppelklick und danach sagst du mir, wie oft du durch den PAI gelaufen bist. Da ich nicht das komplette Programm habe, könnten wir uns ja auf "BCALV_GRID_03" einigen. Bei mir wird der PAI beim Doppelklick _nicht_ durchlaufen aber die Mehtode des Event-Handlers. Du siehst, der Doppeklick führt den Dispatch (Das Auftreten des Events Doppelkick an Appl-Server mit dem Aufruf der Handler Mehtode im Appl-Server) schon aus!

Außerdem sollte dir klar sein, dass der Debugger die Situation komplett verändert! Zumindest, wenn du Break-Points setzt. Wenn du bei so etwas z.B. die Reihenfolge haben willst, schreibst du besser ein Protokoll oder machst dir eine interne Tabelle, die du an den entspr. Stellen mit neuen Einträgen versiehst und schaust dir am Ende an, wie was wann und wo angesprungen wurde.

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
(Das Auftreten des Events Doppelkick an Appl-Server mit dem Aufruf der Handler Mehtode im Appl-Server)
kannst du das bitte verständlicher erklären.

dispatch wird also in pbo auch ausgeführt, stimmt das?
was macht den der dispatch in pai?

Beitrag von uh (Specialist / 158 / 0 / 1 ) »
Der Dispatch ist komplett von der PBO - PAI - Logik abgelöst!! Wenn dud die Änderungen gemacht hast, sollte der Ablauf so aussehen:

Das Dynpro wird gerufen und dadurch wird der PBO ausgeführt. Da generierst und registrierst du alles. Das hättest du aber auch an einer ganz anderen Stelle machen können. Wichtig ist nur, dass es passiert, bevor das Dynpro auf dem Präs. Server erscheint.

Du machst Doppelklick und das Event wird vom Präs- an den Appl-Server geschickt. Das Event wird von dem registrierten Ereignisbehandler abgearbeitet. Wenn du in diesem Behandler nichts mit der Oberfläche machst (Calls screen .. o.ä.) wird die Routine einfach abgearbeitet, OHNE das weitere PBOs / PAIs durchlaufen werden. Das Event ist komplett unabhängig von dieser PBO/PAI Logik.
Da ist der Automatismus, dass das Event an den Appl-Server übertragen wird aktiv (EDIT: Hierbei handelt es sich um ein Systemereignis! und das wird immer autom. transportiert). Jetzt gibt es aber Events (EDIT: Applikations-Ereignisse), die gehen nicht autom. rüber. Daher wird zusätzlich autom. am Ende des PAI ein dispatch aufgerufen, um diese offenen Events abzuarbeiten.

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
Daher wird zusätzlich autom. am Ende des PAI ein dispatch aufgerufen, um diese offenen Events abzuarbeiten.
verstehe ich es richtig, manche Events wurde auf Präsentationsserver ausgeführt aber noch nicht an Applikationsserver geschickt. erst mit dispatch schickt man an applikationsserver?
Noch eine Frage, was sind Control Ereignisse? Es gibt Unterscheidung zwischen Systemereignis und Anwendungsereignis.

Danke kostonstyle

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »

Code: Alles auswählen.

event-eventid = cl_gui_simple_tree=>eventid_node_double_click.
event-appl_event = ' '.
APPEND event TO event_tab.
tree->set_registered_events( events = event_tab ).
SET HANDLER me->handle_node_double_click FOR tree.
Wird in diesem Beispiel das Systemereignis registiert, damit handle_node_double_click auf Ereignis überhaupt reagiert? Würde sonst der Event Handler ins leere laufen?

danke kostonstyle

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
kostonstyle hat geschrieben:

Code: Alles auswählen.

event-eventid = cl_gui_simple_tree=>eventid_node_double_click.
event-appl_event = ' '.
APPEND event TO event_tab.
tree->set_registered_events( events = event_tab ).
SET HANDLER me->handle_node_double_click FOR tree.
Wird in diesem Beispiel das Systemereignis registiert, damit handle_node_double_click auf Ereignis überhaupt reagiert? Würde sonst der Event Handler ins leere laufen?

danke kostonstyle
Achtung,
hier kommt eine Besonderheit des ALV-Tree zum Tragen, der intern einen ColumnTree (aber nicht per Vererbung!!!) zur eigentlichen Darstellung benutzt.
Damit der ALV-Tree weiß, welche Ereignisse an den Column-Tree durchgereicht werden müssen, ist die Verwendung der SET_REGISTERED_EVENTS-Methode zwingend erforderlich. Macht man es nicht, werden Ereignisse wie Node_Double_Click etc. nicht an den ALV-Tree weitergereicht und somit funktionieren die eigenen Event-Handler nicht.

Das hat nichts mit Dispatch zu tun und fuinktioniert ohne ihn.

PS:
Sicherheitshalber sollten zuvor die bereits registrierten Events per GET_REGISTERED_EVENTS geholt werden und für jede EventID kontrolliert werden, ob sie bereits in der Tabelle vorhanden ist.
Doppeleinträge führen zum Laufzeitfehler, sofern nicht abgefangen.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
also die set_registered_events nicht gesetzt wird, dann führt Behandlermethode nichts aus? stimmt diese vermutung?

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
kostonstyle hat geschrieben:also die set_registered_events nicht gesetzt wird, dann führt Behandlermethode nichts aus? stimmt diese vermutung?
wenn es z.B. um NODE_DOUBLE_CLICK geht, ja...

SET HANDLER registriert nur die eigenen Handler-Methoden bis zum ALV-Tree. Der muss aber auch seine Handler beim intern verwendeten Column-Tree registrieren, damit das Durchreichen funktionieren kann. Dazu dient die Methode SET_REGISTERED_EVENTS.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
ha...jetzt verstehe ich gar nicht, kannst du bitte einfacher formulieren, oder genauer erklären.
ich bin leider schwer von begriff :cry:

noch eine andere frage, was ist der unterschied zwischen append to und append lines of ....from ... to ... to...

danke kostonstyle

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
kostonstyle hat geschrieben:ha...jetzt verstehe ich gar nicht, kannst du bitte einfacher formulieren, oder genauer erklären.
ich bin leider schwer von begriff :cry:
stell Dir vor, jemand sagt zu Dir: "mache eine Tabelle in Excel". Da du es nicht kannst, bittest Du einen Freund, es für dich zu machen. (Du bist der ALV-Tree, dein Freund der Column-Tree)
Nun will jemand von Dir wissen, was im Feld xy steht. Dazu musst Du deinen Freund fragen, dem hast Du aber vergessen zu sagen, dass Du ihn fragen können willst. Deshalb bekommst Du keine Antwort und kannst sie eben auch nicht an den Fragenden weitergeben...

Fazit: benutze beim ALV-Tree immer die GET-/SET_REGISTERED_EVENTS-Methode...
kostonstyle hat geschrieben:noch eine andere frage, was ist der unterschied zwischen append to und append lines of ....from ... to ... to...

danke kostonstyle
schau Dir dazu mal die Hilfe zum APPEND an. Ist eigentlich recht gut erklärt.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
das ist dann wie eine indirekte frage, habe das richtig verstanden?

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
kostonstyle hat geschrieben:das ist dann wie eine indirekte frage, habe das richtig verstanden?
ja, hast du...
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .


Über diesen Beitrag


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

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.