Hirdetés
 

Webdynpro bevezetés

PDF
Nyomtatás

A Web Dynpro a Model View Controller tervezési paradigmát használja, tehát szétválasztja a modellt (Model) és a nézetet (View). A modell felelős az adat létrehozásáért, míg a nézet az előállított adat megjelenítésért. A Model és a View rétegek működését a Controller fogja össze, és ez felelős a köztes műveletek elvégzéséért is.

Minden futtatható Web Dynpro alkalmazás egy-egy Web Dynpro komponens (Component). A Component tartalmazza a program összes egyéb részét, megjeleníthető nézeteket (View), az azokat összefoglaló ablakokat, a forráskódokat, az interface-eket és azalkalmazásokat (Application). A Web Dynpro programok az alkalmazásokon keresztül érhetők el, amik egy URL-hez kapcsolják a program egy lehetséges belépési pontját. Az Interface Controller biztosítja a kommunikációt más Web Dynpro komponensekkel, az Interface View-k ennek megfelelően interface-t biztosítanak a különböző ablakok plugjaihoz (amiknek az interface tulajdonsága be van állítva).

A külvilág számára csak a Component Interface elemei láthatók. A kívülről nem látható elemek az alábbiak: Component Controller, Custom Controller, View és Window (a hozzájuk tartozó View és Window Controllerekkel).

A Web Dynpro programoknál az adat (Business Intelligence), és annak megjelenítése szétválik. A megjelenítésért a View-k és a Window-k felelősek. A View-k tartalmazzák a különböző megjelenített elemeket (UI element), ezek elrendezését a View Layoutban lehet megadni. Egyszerre egy View látható a képernyőn, ugyanakkor léteznek olyan nézetek, amelyek más nézeteket tartalmaznak (View Container), így egyszerre több nézet is megjeleníthető párhuzamosan. Az ablakok határozzák meg, hogy a program futása során mely nézetek kerülnek megjelenítésre, ezek között a navigációt a nézetek in- és outbound plugjai közötti navigációs linkekkel lehet meghatározni. A felhasznált nézeteket az ablakba be kell ágyazni.

A Component Controller tartalmazza a program logikáját, ez tárolja és állítja elő az adatokat, amiket a nézetek megjelenítenek.
A Controllerek tartalmazzák a program és az egyes részek forráskódját, ugyancsak itt van a Context, ami az adott Controller hierarchikus adattára. A Context fa struktúrájú. A gyökér node leszármazottai a további node-ok, egy node-nak lehetnek gyermek node-jai vagy attribútumai, az attribútumok tárolják az adatokat, típusukat az ABAP Dictionaryből vehetik.

Minden Componentnek, View-nak, Window-nak pontosan egy Controllere van, ezen felül a Componenthez tartozik az Interface Controller, ill. létrehozhatók még Custom Controllerek is, amikben további függvényeket definiálhatunk, és ugyanúgy rendelkeznek Contexttel, mint más Controllerek.

A Controllerek felhasználhatják egymás függvényeit és adatait, ha a másik Controller használatát deklarálja. Az így felhasznált Controller függvényeit meg lehet hívni. Ehhez deklarálni kell egy referenciaváltozót az adott Controllerre, és ezen keresztül meghívhatók a tagfüggvények. Két Controller közötti adatátvitelre ugyancsak a használatot kell deklarálni, ekkor a felhasznált Controller Contextjéből a node-okat a Controller saját Contextjéhez lehet kapcsolni (ez a Context Mapping). View Controllereket az MVC paradigma szerint nem lehet „used” -ként deklarálni, mivel a View Controller csak az adat megjelenítésért felelős, nem annak előállításáért.
A nézetek Layoutjában elhelyezett elemek különböző tulajdonságait a View Controller Contextjének különböző elemeihez lehet kapcsolni (Data Binding). Ez a kapcsolat mindkét irányban érvényes, ha a Context változik, akkor frissül az UI element tulajdonságának értéke, ha a felhasználó módosítja az elem valamelyik tulajdonságát, akkor az a Contextben is megváltozik.

A program leírása

A program webes interface-t biztosít adatbázisok eléréséhez, és az adatok táblázatos és grafikus megjelenítéséhez. Egyes adatok módosíthatók, azok visszaíródnak az adatbázisba.
A program két adatbázissal dolgozik, az első - ZOL_VEV - tartalmazza az egyes vásárlók azonosítóját és nevét, a másik - ZOL_FORG - az egyes vevőkhöz tartozó (itt a kapcsolatot a vevő azonosítója jelenti) éves összesített forgalmat az elmúlt három évre.

Az adatbázisok tartalma két külön nézetben (V_SELECT és V_DISPLAY) jelenik meg, mindkettő a program egyetlen ablakába (ZWD_OL) van beágyazva.
Az első nézet megjeleníti az első adatbázis tartalmát, egy táblázatban kiírja az összes vevő azonosítóját és nevét. Itt ki lehet választani egy vevőt, ekkor a program továbblép a következő nézetre, ahol a vevőhöz tartozó forgalmak jelennek meg egy táblázatban, és alatta ugyanezek az adatok egy grafikonon. A táblázatban a forgalmakat át lehet írni, a változásokat a grafikon alatti „Mentés” gombbal lehet véglegesíteni, ekkor az adatok visszaíródnak az adatbázisba. A „Vissza” gombbal lehet visszalépni az előző képernyőre, ahol egy másik vevőt lehet kiválasztani.

Mindkét nézetben az adatokat a Component Controller (CC) függvényei állítják elő, amik az adatokat a CC Contextjébe másolják. A nézetek ezeket a függvényeket hívják meg, és a CC Contextjéből a megfelelő node-okat mappingelik. A CC contextjében szerepel 1-1 node a ZOL_VEV és ZOL_FOR adatbázisoknak, illetve egy külön node a kiválasztott vevő-rekord tárolására.

V_SELECT nézet

Az első nézet – V_SELECT – inicializálásakor (WDOINIT függvényben) meghívja a Component Controller get_zol_vev( ) függvényét, ami kiolvassa a ZOL_VEV adatbázist egy belső táblába, amiből feltölti a ZOL_VEV node-ját.

DATA lo_COMPONENTCONTROLLER TYPE REF TO IG_COMPONENTCONTROLLER .
lo_COMPONENTCONTROLLER = wd_this->get_componentcontroller_ctr( ).
lo_componentcontroller->get_zol_vev( ).

A V_SELECT View Controllere mappeli a CC ZOL_VEV node-ját, és ennek tartalmát egy táblázatban megjeleníti. Mivel az ebben szereplő adatokat itt nem lehet módosítani, ezért a táblázat elemei Text View típusúak.

A vevő kiválasztása a táblázat baloldalán lévő gombsorral (Selection Button) történik. Ez kiváltja a táblázat onLeadSelect eseményét, így a kiválasztás kezelése ennek az eseménynek az event handler metódusában - ONACTIONLEAD_SEL - történik.

lo_componentcontroller->write_lead_select( ).
wd_this->fire_sel_2_disp_plg( ).

A metódus meghívja a CC write_lead_select függvényét, ami lekérdezi a ZOL_VEV context node lead selection által kijelölt sorát, és ezt elmenti a VEV_LEAD_SELECT node-ba. Ez után az Event Handler továbblépteti a programot a következő View-ra a nézet egyetlen outbound plugjának tüzelésével.

V_DISPLAY nézet

A V_DISPLAY nézet WDDOINIT függvényében meghívja a CC get_zol_for függvényét, ami kiolvassa az előző képernyőn elmentett VEV_LEAD_SELECT node-ot, és a ZOL_FOR adatbázistáblából egy belső táblába írja azokat a rekordokat, amiknek a vevőazonosítója (C_ID) megegyezik a VEV_LEAD_SELECT C_ID attribútumával, vagyis a kiválasztott vevőhöz tartozó sorokat. A belső táblát ezek után kiírja a ZOL_FOR context node-ba (amit a V_DISPLAY mappelt saját contextjébe).

lo_componentcontroller->get_zol_for( ).

A fenti node megjelenik táblázatos formában, itt a vevő azonosítója helyett a vevő neve szerepel, amit a controller a VEV_LEAD_SELECT node-ból olvas ki, ill. a három éves összesítés számértéke. A táblázatban csak az összesítéseket lehet átírni, a vevő nevét nem, így az utóbbi mező típusa Text View, az előbbieké Input Field. Az eredmények megjelennek grafikonon, az y tengelyen az érték, az x tengelyen pedig a vevő neve. Minden éves összegzés egy-egy oszlopként szerepel.
A grafikon alatti mentés gombbal vissza lehet írni a táblázatot az adatbázisba. A gomb megnyomásával kiváltott eseményt az onactionb_save függvény kezeli, ami meghívja a CC save_table metódusát.

lo_componentcontroller->save_table( ).

Ez a függvény kimásolja a teljes ZOL_FORG context node-ot egy belső táblába, amit az UPDATE függvény segítségével visszaír a táblába. Az update csak a már létező rekordokat módosítja, ha azok megváltoztak, új sorokat nem ad hozzá.
A „Vissza” gombbal vissza lehet lépni a V_SELECT nézetre, ahol új vevő adatait lehet lekérdezni.

wd_this->fire_disp_2_sel_plg( ).

Component Controller

A Component Controller felelős az adatbázisok tartalmának beolvasásáért, a beolvasott adatok tárolásáért, és a context mapping segítségével ez látja el a View controllereket a képernyőn megjelenített adatokkal. A CC-ben négy implementált függvény van, GET_ZOL_VEV, WRITE_LEAD_SELECT, GET_ZOL_FOR és SAVE_TABLE.
A get_zol_vev függvény tölti fel a ZOL_VEV context node-ot az azonos nevű adatbázis tartalmával. Ezt a függvényt a V_SELECT view controllere hívja meg, inicializálásakor.

data node_vev type ref to if_wd_context_node.
data elem_vev type ref to if_wd_context_element.
data str_vev type wd_this- >element_zol_vev.
DATA it_vev TYPE TABLE OF ZOL_VEV.
node_vev = wd_context- >get_child_node( name = 'ZOL_VEV' ).
SELECT * FROM ZOL_VEV INTO TABLE it_vev.
node_vev- >bind_table( new_items = it_vev set_initial_elements = abap_true ).

A write_lead_select függvény kimenti a VEV_LEAD_SELECT context node-ba az első képernyőn kiválasztott vásárló rekordját.

data node_ls_vev TYPE REF TO if_wd_context_node.
data elem_ls_vev TYPE REF TO if_wd_context_element.
data lead_select_vev type ref to if_wd_context_element.
node_ls_vev = wd_context->get_child_node( name = 'VEV_LEAD_SELECT' ).
elem_ls_vev = node_ls_vev->get_element( ).
elem_vev = node_vev->get_lead_selection( ).
elem_vev->get_static_attributes(
IMPORTING
static_attributes = str_vev ).
elem_ls_vev->set_static_attributes(
EXPORTING
static_attributes = str_vev ).

A get_zol_for függvény a get_zol_vev-hez hasonlóan feltölti a ZOL_FOR context node-ot, viszont ez nem a teljes adatbázist másolja ki, hanem a write_lead_select függvény által kimentett rekord C_ID mezője alapján a kiválasztott vevőhöz tartozó rekordokat olvassa be és tárolja el.

data node_for TYPE REF TO if_wd_context_node.
data elem_for TYPE REF TO if_wd_context_element.
data wa_for TYPE ZOL_FOR.
data it_for TYPE TABLE OF ZOL_FOR.
node_ls_vev = wd_context->get_child_node( name = 'VEV_LEAD_SELECT' ).
elem_ls_vev = node_ls_vev->get_element( ).
elem_ls_vev->get_static_attributes(
IMPORTING
static_attributes = str_vev ).
SELECT * FROM ZOL_FOR INTO TABLE it_for WHERE C_ID = str_vev-C_ID.
node_for = wd_context->get_child_node( name = 'ZOL_FOR' ).
node_for->bind_table( new_items = it_for set_initial_elements = abap_true ).
A save_table kimásolja a ZOL_FOR context node teljes tartalmát, és ezt visszaírja a ZOL_FOR adatbázisba.
node_for = wd_context->get_child_node( name = 'ZOL_FOR' ).
node_for->get_static_attributes_table(
IMPORTING
table = it_for ).
LOOP AT it_for INTO wa_for.
UPDATE ZOL_FOR FROM wa_for.
ENDLOOP.

Adatkezelés

Ahhoz, hogy egy context node több ugyanolyan struktúrájú elemet tudjon tárolni, mint például egy adatbázis tábla, vagy információt tudjon szolgáltatni egy táblázatnak a node cardinality tulajdonságát 0…n vagy 1…n-esre kell állítani. A kardinalitás adja meg, hogy egy node collectionnek hány eleme lehet (min…max). Ilyen tulajdonságú node-okat adatokkal többféle képpen is fel lehet tölteni. A tagokat fel lehet tölteni attribútumonként, egyesével, egyes node-oknak értéket lehet adni egy, a node-al megegyező típusú struktúrából, illetve az egész collectiont fel lehet tölteni egy belső táblából. Mivel a fenti függvényeknél adatbázisokból kiolvasott adatokkal dolgozunk, amiket ideiglenesen egy belső táblában tárolunk, ezért az utóbbi megoldás a legegyszerűbb. A node bind_table függvényét kell használni, aminek paramétere a belső tábla, ahonnan az adatokat kapja, illetve megadhatjuk, hogy az éppen aktuális tartalmat felülírja a táblával, vagy hozzáfűzze azokat. A node eléréséhez létre kell hoznunk egy node típusú (if_wd_context_node) változót, amibe a context get_child_node függvényével, a node nevének megadásával tudjuk bemásolni a kívánt node-ot. Az így kapott referenciának meghívhatjuk a függvényeit, így feltölthetjük adatokkal.

Egy táblázat lead select tulajdonsága megadja, hogy a táblázat melyik sora van kijelölve. Ehhez meg lehet adni alapértelmezett értéket is, de a felhasználó is meg tudja változtatni a táblázat bal első oszlopában lévő selection buttonokra kattintva. A lead select megváltozása kiváltja az onLeadSelect eseményt. A táblázat lead selection érékének módosulása megváltoztatja a hozzá tartozó context node lead selectionjét is. A context gyökérelemének (wd_context) get_child_node függvénye visszaadja annak a node-nak a lead selection által kijelölt tagját, aminek a nevét paraméterként megkapja (node neveket paraméter megadásnál nagy betűvel kell írni).

Így megkaphatjuk a felhasználó által kijelölt vevő rekordját a ZOL_VEVO context node-ból. Egy node attribútumait egy megfelelő típusú struktúrába lehet lekérdezni, és egy másik node attribútumait ugyancsak egy ilyen struktúrából lehet feltölteni. Az ezeket a műveleteket elvégző függvények a get_static_attributes és a set_static_attributes, mindkettő paramétere a struktúra, amibe az adatokat írják, ill. amiből azokat kapják.
A get_zol_for függvény annyiban különbözik a get_zol_vev függvénytől – azon túl, hogy másik táblával dolgozik -, hogy a SELECT hívásakor szerepel benne a WHERE C_ID = str_vev-C_ID feltétel, így csak az adott vevőhöz tartozó rekordokat olvassa ki.

Context node-ból a feltöltéshez hasonlóan adatokat kinyerhetünk egy belső táblába a get_static_attributes_table függvény segítségével, aminek paramétere a belső tábla, ahova az adatokat írja. Belső táblából adatbázis táblát feltölteni többféleképpen lehet, a program az UPDATE metódust használja, ami csak az adatbázisban már létező rekordokat módosítja, ha azok változtak, új sort nem hoz létre (és nem is töröl).

Más Controllerek felhasználása

Ahhoz, hogy egy controller függvényeit meg lehessen hívni és a contextjében tárolt adatokat el lehessen érni, a controller használatát deklarálni kell. Így a used controller contextje felhasználható a controller saját contextjében, context mappinggel, illetve a controller függvényeiből a used controller egy referencián keresztül elérhető, így meg lehet hívni a függvényeit is. A Component controller az egyetlen controller, amit minden más controller elér, annak használatát nem kell külön deklarálni.

Minden controller tartalmaz referenciát a saját contextjének gyökér elemére – wd_context – illetve ugyancsak referenciát a saját interfészére – wd_this -.
Forráskódból a controllereket referenciáikon keresztül lehet elérni, ehhez a megfelelő típusú változóba saját interfészének függvényével be kell másolni a megfelelő controller referenciáját.

lo_COMPONENTCONTROLLER = wd_this->get_componentcontroller_ctr( ).

Az így kapott referencián keresztül a függvények elérhetők pl.:

lo_componentcontroller->save_table( ).

Outbound plugok tüzelése a wd_this fire__plg( ). függvénnyel történik. Ez egy eseményt dob, amit az esemény kezelők (Inbound Plug) megkapnak, ezzel a következő nézetre vált a program.


Nincs hozzászólása.
A téma megvitatása a fórumon. (0 hozzászólás)