BSP Tutorial

Posten Sie hier Tutorials & Cookbooks.

BSP Tutorial

Postby Walter4536 » Thu Sep 30, 2004 5:59 pm

Dieses Cookbook beschäftigt sich mit dem Erstellen einer einfachen BSP-Applikationen. Es wird kein Anspruch auf Vollständigkeit erhoben, daher sind Ergänzungen, Hinweise, Verbesserungen jederzeit willkommen und erwünscht.

Ziel mit unserer BSP-Applikation ist es, einen Benutzer anzulegen und anzuzeigen. Dafür werden entsprechende Bausteine (BAPIs) der Benutzerverwaltung verwendet (BAPI_USER_CREATE, BAPI_USER_GETDETAIL, ?)

Eine einfach BSP-Applikation läßt sich über die Transaktion SE80 erstellen. Man wählt dort über die Dropdownliste ?BSP-Applikation? und trägt in das Feld darunter den Namen der BSP-Applikation ein, z.B. Z_USERTEST.
Nach Drücken der Eingabetaste erfolgt die Abfrage, ob die BSP-Applikation angelegt werden soll (sofern sie noch nicht verhanden ist), was bestätigt werden muss.

Mit einem ?Rechtsklick? auf unsere ?neue BSP-Applikation? kann man nun weitere Seiten anlegen, z.B. unsere erste Seite, die auch die Einstiegsseite sein soll. Diese können wir z.B. usercreate.htm nennen. Als Seitentyp, nehmen wir in unserem Beispiel ?Seiten mit Ablauflogik?.

Eine Seite mit Ablauflogik ist im Gegensatz zu einer MVC (Model, View, Controller)-Applikation eine Seite, die zusätzlich bestimmte Events besitzt, die zu bestimmten Zeitpunkten ausgelöst werden.

Die Events werden dabei in folgender Reihenfolge ausgelöst:

OnCreate
OnRequest
OnInitialization
OnInputProcessing
OnManipulation
OnDestroy

Am häufigsten benötigt man OnCreate, OnInitialization und OnInputProcessing.

OnCreate wird dann durchlaufen, wenn die Seite das erste mal erzeugt wird. Hier kann man Daten initialisieren oder Objekte erzeugen.

On Initialization benutzt man i.d.R. zur Datenbeschaffung, also um bestimmte Daten (z.B. mittels Funktionsbaustein) von der Datenbank zu lesen. Die Daten, die man hier beschafft, werden in den Seitenattributen abgelegt.

OnInputProcessing wird immer dann durchlaufen, wenn eine Benutzeraktion erfolgt ist, z.B. der Benutzer drückt einen Button (submit). Ein oft und gern gemachter Fehler ist, daß hier Daten beschafft werden. Das ist bei diesem Event i.d.R. unnötig. Stattdessen sollte man hier die Daten (die der Benutzer eingegeben hat), validieren (evtl. eine Fehlermeldung ausgeben) und bei korrekten Daten abspeichern.
Von diesem Event aus, verzweigt man meistens auf andere Seiten (d.h. es findet eine Navigation statt). Man kann hier zwar Daten an die nächste Seite übergeben, allerdings sollte man darauf achten, daß die Daten, die man übergibt, so ?schlank? wie möglich ausfallen. Meistens ist es absolut ausreichend, bestimmte Schlüsselfelder zu übergeben, und dann im OnInitialization (oder ggf. OnCreate) eine erneute Datenbeschaffung durchzuführen.

Zur Lebensdauer von Seitenattributen siehe SAP Dokumentation zu BSP-Applikationen.

Nach diesen Vorüberlegungen, und dem Anlegen unserer Startseite, treffen wir vorerst noch ein paar weitere Einstellungen. Nach einem Doppelklick auf unsere BSP-Applikation, können wir auf der rechten Seite auf dem Reiter ?Eigenschaften? folgende Parameter setzen:

Einstiegs-BSP: Hier tragen wir z.B. default.htm ein.

Die default.htm ist eine BSP-Seite, die wir uns aus der BSP-Basisapplikation SYSTEM kopieren. Es handelt sich dabei quasi um einen ?Wrapper? um unsere BSP-Applikation, die dafür sorgt, daß beim Beender der Applikation die Benutzer-Session wieder ?zerstört? wird und damit einerseits eine korrekte Abmeldung erfolgt und zum anderen der für die Session allokierte Speicher auf dem Applikationsserver wieder freigegeben wird.

Wir erzeugen einen neuen Modus und öffnen wiederum über Aufruf der Transaktion SE80 die BSP-Applikation ?SYSTEM?. Dort kopieren wir die Seite ?session_single_frame.htm? in unsere BSP-Applikation. Die Seite benennen wir für unsere BSP-Applikation um in default.htm.

Damit nun aber unsere usercreate.htm aufgerufen wird, wenn unsere BSP-Applikation gestartet wird, muss in unserer kopierten default.htm an folgender Stelle das Coding geändert werden:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. <% " Copy this page into your BSP application, and change line below.
  2.    " This page should always used be as entry point into application.
  3.  
  4.    DATA: target_page               TYPE STRING VALUE 'session_test.htm'.
  5.  
GeSHi ©


wird abgeändert (für unser Beispiel) in:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. <% " Copy this page into your BSP application, and change line below.
  2.    " This page should always used be as entry point into application.
  3.  
  4.    DATA: target_page               TYPE STRING VALUE 'usercreate.htm'.
  5.  
  6.  
GeSHi ©


Damit kommen wir wieder zurück zu den weiteren Parametern unter ?Eigenschaften? unserer BSP-Applikation.
Der nächste Parameter ist Applikationsklasse.
Dort tragen wir eine Klasse für unsere Applikation ein, die wir über die SE24 anlegen. Die Klasse kann dabei beliebig aussehen. Einzige Einschränkung ist die, daß die Klasse einen Default-Konstruktor besitzen muß. Der Name der Applikationsklasse ist in das betreffende Feld einzutragen, wie die Klasse benannt wird, spielt dabei keine Rolle, z.B.: Z_MY_APPLCLASS.

Warum Applikationsklasse? Mithilfe einer Applikationsklasse lassen sich sehr leicht Daten von einer Seite zur nächsten (Navigation) transportieren. Der Mechanismus ist dabei folgender: Wenn die BSP-Applikation aufgerufen wird, wird eine Instanz unserer Applikationsklasse erzeugt (deshalb der Default-Konstruktor). In den Events kann man nun über die Instanz ?application? auf die eigene Klasse zugreifen.

z.B. im Event ?OnInputProcessing?:

application->set_userid( myuserid );

auf der Folgeseite wieder aus der Applikationsklasse lesen (OnInputProcessing):

myuserid = application->get_userid( ).

Dafür benötigt unsere Applikationsklasse zumindest die obigen Methoden. In der Regel stellt man für jedes Datenobjekt (Parameter, Struktur, Tabelle) jeweils eine set-Methode zum ?Speichern? der Werte und eine get-Methode zum ?Lesen? der Werte.
Wer beispielsweise schon Webanwendungen mit Java (JSP) entwickelt hat, dem dürfte die Architektur solcher Klassen als ?Beans? geläufig sein.

Diese Klasse kann nun über die gesamte Lebensdauer unserer BSP-Applikation (bzw. einer Benutzer-Session) ?erhalten bleiben?, womit wir zum nächsten Parameter unserer BSP-Applikation kommen:

Das Flag ?Zustandsbehaftet?. Dieses Flag schalten wir an, dadurch wird erreicht, daß die Applikationsklasse wie erwähnt über die Dauer der Benutzer-Session erhalten bleibt.

Damit haben wir soweit alles vorbereitet und können mit dem ?Design? unserer Page Usercreate.htm fortfahren.

Unsere Startpage soll, wie anfangs erwähnt, die Daten aufnehmen, um einen Benutzer anzulegen. Der Baustein, um einen Benutzer anzulegen heißt BAPI_USER_CREATE.

Um einen Benutzer anzulegen, werden folgende Daten benötigt:
- Benuterzname
- Passwort
- Adressdaten (z.B.: Vorname, Nachname, Abteilung, e-mail, Telefon, ?)
- Rollen (um entsprechende Berechtigungen zuweisen zu können)

Das repräsentiert quasi die Schnittstellendaten des BAPI_USER_CREATE.
Diese Schnittstellendaten werden nun als Seitenattribute definiert. Dafür können nun eigene Felder definiert werden vom Typ String.

z.B. userid type String,
pw type String,
forename type String,
lastname type String, etc.

Ein mögliche Seite könnte bspw. wie folgt aussehen (Layoutmäßig läßt sich hier noch einiges verbessern, das kann dann jeder für sich selbst tun ;-) )

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. <%@page language="abap"%>
  2. <%@extension name="htmlb" prefix="htmlb"%>
  3.  
  4. <htmlb:content design="design2003">
  5.   <htmlb:page title = "Einstiegsseite ">
  6.     <htmlb:form id="createuser">
  7.  
  8.                     <htmlb:label text = "Benutzer"
  9.                                  for  = "userid" />
  10.                     <htmlb:inputField id            = "userid"
  11.                                       type          = "string"
  12.                                       size          = "8"
  13.                                       value         = "<%=userid%>"
  14.                                       design        = "STANDARD" />
  15.                     </br>
  16.  
  17.                     <htmlb:label text = "Passwort"
  18.                                  for  = "pw" />
  19.                     <htmlb:inputField id            = "pw"
  20.                                       type          = "string"
  21.                                       size          = "8"
  22.                                       value         = "<%=pw%>"
  23.                                       design        = "STANDARD" />
  24.                     </br>
  25.  
  26.                     <htmlb:label text = "Vorname"
  27.                                  for  = "forename" />
  28.                     <htmlb:inputField id            = "forename"
  29.                                       type          = "string"
  30.                                       size          = "30"
  31.                                       value         = "<%=forename%>"
  32.                                       design        = "STANDARD" />
  33.                     </br>
  34.  
  35.                     <htmlb:label text = "Nachname"
  36.                                  for  = "lastname" />
  37.                     <htmlb:inputField id            = "lastname"
  38.                                       type          = "string"
  39.                                       size          = "30"
  40.                                       value         = "<%=lastname%>"
  41.                                       design        = "STANDARD" />
  42.  
  43.                         </br>
  44.  
  45.  
  46.       <htmlb:button       id            = "createbutton"
  47.                           text          = "Submit"
  48.                           onClick       = "createuser" />
  49.  
  50.     </htmlb:form>
  51.   </htmlb:page>
  52. </htmlb:content>
  53.  
  54.  
GeSHi ©


entgegenzunehmen und auf den Event zu reagieren.
Der Event um auf Benutzereingaben zu reagieren ist i.d.R. ?OnInputProcessing?. In unserer Seite ?usercreate.htm? wecheln wir in den Tabreitern von ?Layout? auf ?Events?. Dort wird über die Dropdownliste der Event ?OnInputProcessing? ausgewählt.
Um auf das Drücken des Buttons reagieren zu können, wird folgendes Coding hinterlegt.

Event: OnInputProcessing:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. DATA: event_data  TYPE REF TO cl_htmlb_event,
  2.       var_action TYPE string,
  3.       lv_username    TYPE username,
  4.       lv_password    TYPE bapipwd,
  5.       ls_address     TYPE bapiaddr3,
  6.       lt_return      TYPE  STANDARD TABLE OF bapiret2,
  7.       lt_bapiagr     TYPE  STANDARD TABLE OF bapiagr,
  8.       ls_bapiagr     TYPE  bapiagr,
  9.       ls_logondata   TYPE  bapilogond.
  10.  
  11.  
  12. *     Seitenattribute in lokale Variablen
  13. lv_username           = userid.
  14. ls_address-firstname  = forename.
  15. ls_address-lastname   = lastname.
  16. lv_password           = pw.
  17.  
  18.  
  19. *   Event auswerten
  20. CLASS cl_htmlb_manager DEFINITION LOAD.
  21. IF cl_htmlb_manager=>event_id EQ 'htmlb'. "equals htmlb
  22.   event_data = cl_htmlb_manager=>get_event&#40; request &#41;.
  23.  
  24.   IF event_data->event_type EQ 'click'.
  25.  
  26.     var_action = event_data->server_event.
  27.  
  28.     IF var_action EQ 'createuser'.
  29. * Anlegen Benutzer &#40;SU01&#41;
  30.       CALL FUNCTION 'BAPI_USER_CREATE'
  31.         EXPORTING
  32.           username  = lv_username
  33.           logondata = ls_logondata
  34.           password  = lv_password
  35.           address   = ls_address
  36.         TABLES
  37.           return    = lt_return.
  38.  
  39.  
  40. * Zuordnung Rolle
  41.       ls_bapiagr-agr_name = 'SAP_BC_DWB_ABAPDEVELOPER'.
  42.       append ls_bapiagr to lt_bapiagr.
  43.  
  44.       CALL FUNCTION 'BAPI_USER_ACTGROUPS_ASSIGN'
  45.         EXPORTING
  46.           username       = lv_username
  47.         TABLES
  48.           activitygroups = lt_bapiagr
  49.           return         = lt_return.
  50.  
  51.         COMMIT WORK.
  52.  
  53.     ENDIF.
  54.  
  55.   ENDIF.
  56.  
  57.  
GeSHi ©


Damit kann nun ein auf einfache Weise ein Benutzer anlegt werden. In dem Beispiel fehlt natürlich noch einiges, z.B. Fehlerhandling, Abmelden, etc.
Das wird in den nächsten Teilen zu diesem Tutorial sukzessive ausgebaut.

Wobei natürlich jeder der Lust und Interesse hat, hier gerne seine Vorschläge, Verbesserungen, Erweiterungen, etc. posten kann.
Bis bald, zum nächsten Teil des BSP-Tutorials :-)
Walter4536
...
...
 
Posts: 315
Joined: Mon Dec 02, 2002 12:09 pm

Auf zum Teil 2 - Fehlerhandling

Postby Walter4536 » Mon Oct 18, 2004 5:41 pm

Fehlerhandling:

Für das Fehlerhandling kann man wie folgt vorgehen.
Include Anlegen (Rechte Maustaste -> Anlegen Seite -> Seitenfragment). Das Seitenfragment kann man z.B. error.htm nennen.
Aussehen kann das Seitenfragment so:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. <%@page language="ABAP"%>
  2. <!-- Start Error Msg-->
  3. <table align="center" cellpadding="0" cellspacing="0" width="99%" border="0">
  4.   <tr>
  5.         <td width="100%" class="TX_ERROR_XSB">
  6.         <img src="layout/error.gif" border="0" /><%=otr&#40;Z_TESTAPP/ERRORS_OCCURED_MSG&#41;%>:
  7.         </td>
  8.   </tr>
  9. <%
  10.     data: condition type string,
  11.     message type string,
  12.     severity type i,
  13.     ind type i.
  14.     ind = page->messages->num_messages&#40; &#41;.
  15.         do ind times.
  16.             call method page->messages->Get_message
  17.             exporting index = sy-index
  18.             importing condition = condition
  19.             message = message
  20.             severity = severity. %>
  21. <tr>
  22.     <td class="TX_ERROR_XSB">- <%= message %> </td>
  23. </tr>
  24.         <% enddo. %>
  25.  
  26. </table>
  27. <!-- End Error Msg -->
  28.  
GeSHi ©



Dieses ?Fehlerseitenfragment? wird in die bestehende Seite inkludiert:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.     <% if page->messages->num_messages&#40; &#41; > 0. %>
  2.     <%@ include file="error.htm"%>
  3.     <% endif.
  4.  
GeSHi ©


Nun kann man in unserer Page (siehe coding weiter oben) nach dem BAPI zum Anlegen eines Users, die Rückgabetabelle auswerten (um entsprechende Meldungen auszugeben). Siehe oben, Ergänzung zum Event 'OnInputProcessing' unserer Page. Diess Coding wird unmittelbar nach dem BAPI_USER_CREATE eingefügt.

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. *       check for messages
  2.         DATA: lv_lines TYPE i.
  3.         DESCRIBE TABLE lt_return LINES lv_lines.
  4.  
  5.         IF lv_lines > 0.
  6.           READ TABLE lt_return INDEX 1 INTO ls_return.
  7.           IF ls_return-type = 'S' AND ls_return-id     = '01'
  8.                                   AND ls_return-number = '102'.
  9.  
  10.           ELSE.
  11.             LOOP AT lt_return INTO ls_return.
  12.               CALL METHOD page->messages->add_message_from_t100
  13.                 EXPORTING
  14.                   condition = errormessage
  15.                   msgid     = ls_return-id
  16.                   msgno     = ls_return-number
  17.                   msgty     = ls_return-type.
  18.             ENDLOOP.
  19.             EXIT.
  20.           ENDIF.
  21.         ENDIF.
  22.  
  23.  
GeSHi ©


Die Funktionsweise ist folgende: Dem Page-Objekt, kann man Fehlermeldungen mitgeben. Diese Fehlermeldungen werden dann in der Seite dadurch ausgewertet, daß das Include (Seitenfragment) eingeblendet wird, wenn die message-Tabelle des Pageobjektes Einträge enthält.
Im Seitenfragment selbst, wird dann einfach die Tabelle ausgewertet und die entsprechenden Fehlermeldungen werden ausgegeben über das Tag <%= message %>.

Bis zum nächsten Teil dieses Tutorials ? Wie immer gilt: Kommentare und Verbesserungsvorschläge erwünscht.
Walter4536
...
...
 
Posts: 315
Joined: Mon Dec 02, 2002 12:09 pm

Super !

Postby Alva1590 » Tue Oct 19, 2004 9:09 am

Echt Klasse Tutorial, ich freue mich schon auf Teil 2
Alva1590
.....
.....
 
Posts: 4387
Joined: Mon Dec 02, 2002 3:01 pm

Postby Kimberley3834 » Mon Dec 20, 2010 4:56 pm

So, ich mach hier der vollständigkeit-halber auch noch einen Link rein, damit wir alles beisammen haben^^

BSP+HTMLB->F4-Wertehilfe
Kimberley3834
..
..
 
Posts: 96
Joined: Wed Nov 17, 2010 8:38 am


Return to Tutorials & Cookbooks

Who is online

Users browsing this forum: No registered users and 4 guests

cron