Inhaltsverzeichnis | 7 |
Einleitung | 19 |
Wer hat das Buch geschrieben? | 19 |
Dank | 19 |
Worum geht es in diesem Buch? | 20 |
An wen richtet sich das Buch? | 21 |
Hinweise zu den einzelnen Kapiteln | 22 |
Kapitel 1 – SAP Business Workflow im Überblick | 22 |
Kapitel 2 – Workflow – Entwicklung Tools | 22 |
Kapitel 3 – ABAP Objects – Grundlagen | 23 |
Kapitel 4 – Durchgängiges Beispiel des Buches: Kreditverträge | 23 |
Kapitel 5 – Die neue Welt: ABAP Objects im Workflow | 23 |
Kapitel 6 – Workflow-Container und Workflow-Ereignisse | 23 |
Kapitel 7 – Organisationsmanagement und Regeln | 24 |
Kapitel 8 – Standardaufgaben anlegen und verwenden | 24 |
Kapitel 9 – Workflow-Muster anlegen und verwenden | 24 |
Kapitel 10 – Klassenbasierte Techniken im Workflow | 25 |
Kapitel 11 – Klassenbasierte Eigenentwicklungen im Workflow | 25 |
Kapitel 12 – Business Workplace als Userinterface | 25 |
Kapitel 13 – Webservices im Workflow | 25 |
Kapitel 14 – Das Workflow-Laufzeitsystem | 26 |
Kapitel 15 – Tests und Fehlersuche | 26 |
Kapitel 16 – Workflow-Administration | 26 |
Anhang – Die alte Welt: BOR-Objekte im Workflow | 27 |
1 SAP Business Workflow im Überblick | 29 |
Workflow für komplex strukturierte, arbeitsteilige Prozesse | 29 |
Keine zusätzlichen Lizenzkosten für SAP Business Workflow | 29 |
Workitem, Business Workplace | 30 |
Workflow-Definition | 30 |
Terminüberschreitung | 30 |
Aufbauorganisation | 30 |
1.1 Die Architektur des SAP Business Workflow | 31 |
Abb. 1–1 Architektur des SAP Business Workflows mit allen Komponenten | 31 |
1.1.1 Definitionszeit | 31 |
Einzelschrittaufgabe | 31 |
Tab. 1–1 Zwei wesentliche Aspekte der Einzelschrittaufgabe | 32 |
Mehrschrittaufgabe = Workflow-Definition = Workflow-Muster | 32 |
Schritttypen | 32 |
Business Object Repository | 33 |
Tab. 1–2 Übersicht über die Schritttypen in einer Workflow-Definition | 33 |
Objekttyp, Objektmethode, Objektattribut | 33 |
1.1.2 Workflows und Workitems zur Ausführungszeit | 34 |
Workflow als Ausführung einer Workflow-Definition | 34 |
Workitem als Schritt eines Workflows | 34 |
1.1.3 Bearbeiterfindung | 34 |
Organisatorische Zuordnung | 34 |
Regel | 34 |
1.1.4 Workflow als Reaktion auf Anwendungssignale | 35 |
Ereignis | 35 |
1.1.5 Vorkonfigurierte Workflow-Definitionen | 35 |
Workflow-Muster | 35 |
1.1.6 Der typische Workflow-Benutzer | 36 |
Sachbearbeiter | 36 |
Prozessmodellierer | 36 |
Programmierer | 36 |
Verantwortlicher für Aufbauorganisation | 37 |
Workflow-Administrator | 37 |
1.2 Ein typisches Workflow-Szenario | 37 |
Genehmigungs- und Freigabeverfahren | 37 |
1.3 Dokumentation und Tutorial | 38 |
1.4 Business Workplace | 38 |
1.4.1 Mails im Business Workplace | 39 |
Abb. 1–2 Business Workplace | 39 |
Dokumente | 39 |
1.4.2 Workitems mit Benutzerdialog in der Worklist | 39 |
Worklist | 39 |
2 Workflow-Entwicklung – Tools | 41 |
2.1 Workflow aus Entwicklersicht | 41 |
2.1.1 Workflow als Framework | 41 |
2.1.2 Schichtenmodell einer Workflow-Anwendung | 41 |
2.1.3 Paketorientierte Workflow-Entwicklung in der SE80 | 42 |
Abb. 2–1 Schichtenmodell einer Workflow-Anwendung | 42 |
Abb. 2–2 Alle Entwicklungsobjekte einer Workflow- Anwendung in der SE80 | 42 |
Aufgabengruppen nicht über SE80 | 43 |
2.1.4 Das Workflow-Bereichsmenü SWLD | 43 |
Bereichsmenü SWLD | 43 |
Empfehlenswert: eigenes Favoritenmenü für Workflow | 43 |
PFTC = allgemeine Aufgabenpflege PFAC = allgemeine Regelpflege | 43 |
2.2 Workflow-Beispiellösungen der SAP | 44 |
Abb. 2–3 Favoriten mit speziellem Ordner für Workflow | 44 |
2.2.1 Tutorials | 44 |
2.2.2 Workflow-Anwendung »Urlaubsantrag« | 45 |
Workflow-Muster Urlaubsantrag = WS30000015 | 45 |
2.2.3 Workflows der Aufgabengruppe WFUNIT | 45 |
80 Workflow-Muster in TG WFUNIT | 45 |
2.2.4 Workflows der Aufgabengruppe WF_Verify | 46 |
Abb. 2–4 Workflow-Muster der Aufgabengruppe WFUNIT | 46 |
Abb. 2–5 Workflow-Muster der Aufgabengruppe WF_Verify | 46 |
2.3 SAP Service Marketplace | 47 |
Abb. 2–6 Startseite des SAP Service Marketplace | 47 |
2.3.1 SAP Support Portal mit Hinweissystem | 47 |
Zugriff auf das SAP-Hinweissystem unbedingt erforderlich | 47 |
Abb. 2–7 Suchmaske für Hinweissystem | 48 |
Abb. 2–8 Application Area in der Suchmaske des Hinweissystems | 49 |
Abb. 2–9 Zusätzliche Suchkriterien bei der Hinweissuche | 49 |
Abb. 2–10 Suchergebnis des Hinweissystems | 50 |
2.3.2 SDN-Community | 50 |
SDN-Teilnahme wertvoll für Entwickler | 50 |
Abb. 2–11 Suche im SDN-Forum »SAP Business Workflow« | 50 |
2.3.3 SAP Help online und offline | 51 |
3 ABAP Objects – Grundlagen | 53 |
3.1 Objektorientierung als Abbild der realen Welt | 53 |
Tab. 3–1 Analogie Handy-Bau – Objektorientierung | 53 |
3.2 Klassen und ihre Komponenten | 54 |
Attribute speichern Objektdaten. | 54 |
Methoden kapseln ABAP-Code. | 54 |
3.2.1 PUBLIC-, PROTECTED- und PRIVATE-Komponenten | 54 |
Stufenweise Kapselung von Komponenten mit PUBLIC, PROTECTED und PRIVATE | 55 |
3.2.2 Statische und Instanzkomponenten | 55 |
Statisches Attribut = Klassenattribut = einmal pro Klasse Statische Methode = Klassenmethode = sieht nur Klassenattribute | 55 |
3.2.3 Abstrakte und finale Methoden und Klassen | 55 |
Abstrakte Klassen sind nicht instanziierbar. | 55 |
Abstrakte Methoden müssen bei Vererbung redefiniert werden. | 56 |
Finale Klassen sind nicht ableitbar. | 56 |
3.2.4 Lokale und globale Klassen | 56 |
Listing 3–1 Programmstruktur einer lokalen Klasse | 56 |
SE24 ist in SE80 integriert. | 57 |
Abb. 3–1 Bearbeitung eine globalen Klasse mit der SE24 innerhalb der SE80 | 58 |
3.2.5 Objekte und Referenzen | 58 |
Objektreferenzen sind Zeiger auf Objektinstanzen. | 59 |
Listing 3–2 Test, ob Referenz gebunden ist. | 59 |
CREATE OBJECT = Neuanlage Objekt + Zuweisung Referenz | 59 |
Listing 3–3 Anlegen einer Objektinstanz und zuweisen einer Referenz | 59 |
Regeln für Referenzen | 60 |
3.2.6 Zugriff auf Klassen- und Instanzkomponenten | 60 |
Klassenattribute | 61 |
Zugriff auf Klassen- komponenten ohne Objektinstanz mit => | 61 |
Klassenmethoden | 61 |
Instanzattribute | 61 |
Zugriff auf Instanzkomponenten mit Objektinstanz mit -> | 61 |
Instanzmethoden | 61 |
Objektreferenz ME zeigt auf das eigene Objekt. | 61 |
Listing 3–4 Zugriff auf Klassen- und Instanzmethoden | 62 |
Anwendungsdaten auf der DB, Objektdaten im Hauptspeicher | 62 |
3.3 Vererbung und Casting von Referenzen | 62 |
Vererbungsbaum durch mehrstufige Vererbung | 62 |
Vererbung auf Klassenebene, nicht auf Instanzebene | 63 |
Abb. 3–2 Vererbung und Referenzen | 63 |
Vater-Referenz darf auf Sohn- und Enkel- Instanzen zeigen. | 64 |
Statischer und dynamischer Typ von Referenzen | 64 |
3.3.1 Klasse CL_VATER | 64 |
Listing 3–5 Lokale Klassendefinition CL_VATER | 65 |
3.3.2 Klasse CL_SOHN | 66 |
Listing 3–6 Lokale Klassendefinition CL_SOHN | 66 |
3.3.3 Klasse CL_ENKEL | 67 |
Pseudoreferenz SUPER | 67 |
Listing 3–7 Lokale Klassendefinition CL_ENKEL | 68 |
3.3.4 Beispielprogramm zur Vererbung | 68 |
Vererbung besteht zwischen Klassen, nicht zwischen Objekten. | 68 |
Listing 3–8 Diverse Methodenaufrufe via Referenz | 69 |
3.3.5 Upcasting und Downcasting von Referenzen | 70 |
Up- und Downcasting im natürlichen Vererbungsbaum | 70 |
Upcasting ist uneingeschränkt möglich. | 71 |
Downcasting nur, wenn Source-Referenz spezieller als Target-Referenz | 71 |
Listing 3–9 Erlaubte und verbotene Castings | 71 |
Abb. 3–3 Programmausgaben | 72 |
3.4 Events | 73 |
3.4.1 Prinzip Publish and Subscribe | 73 |
Beispiel aus dem Bereich der Stellensuche | 73 |
Pull-Prinzip | 73 |
Push-Prinzip | 73 |
Publish and Subscribe | 73 |
Ereignisse haben nur EXPORTING-Parameter. | 73 |
Tab. 3–2 Statischer und dynamischer Teil von Publish and Subscribe | 74 |
3.4.2 Event Handling | 74 |
Aufruf Eventhandler | 74 |
Workflow verwendet kein Shared Memory. | 75 |
3.4.3 Events im Workflow-Kontext | 75 |
Systemweite Workflow- Events | 75 |
3.5 Interfaces | 75 |
IF_WORLFLOW | 76 |
IF_WORKITEM_EXIT | 76 |
Abb. 3–4 Einbindung eines Interface über mehrere Vererbungsbäume hinweg | 76 |
3.5.1 Definition von Interfaces | 77 |
Listing 3–10 Muster für die Definition eines Interface | 77 |
3.5.2 Interfaceimplementierung und -referenzen | 77 |
ALIAS-Namen für Interfacekomponenten | 78 |
Listing 3–11 Definition und Implementierung eines Interface | 78 |
3.6 Polymorphie | 79 |
3.6.1 Allgemeines | 79 |
Polymorphie = Vererbung + Redefinition | 79 |
Abb. 3–5 Vererbungsbaum Java AWT | 80 |
Polymorphie im Workflow = IF_WORKFLOW | 80 |
3.6.2 Polymorphie durch Vererbung | 81 |
Listing 3–12 Polymorphie in einer Liste unterschiedlicher Männer | 81 |
3.6.3 Polymorphie über Interfaces | 82 |
3.7 Ausnahmen und Ausnahmeklassen | 82 |
3.7.1 Klassische Ausnahmen ohne Ausnahmeklassen | 82 |
Abb. 3–6 Klassische Exceptions an einer Methode | 82 |
Listing 3–13 Methode mit klassischer Exception | 83 |
Listing 3–14 Aufruf einer Methode mit klassischer Exception | 83 |
3.7.2 Ausnahmeklassen | 84 |
Abb. 3–7 Nachricht ausgeben nach einer klassischen Exception | 84 |
3 Basisausnahmeklassen von SAP | 84 |
Abb. 3–8 Teil des Vererbungs- baumes von CX_DYNAMIC_CHECK | 85 |
Abb. 3–9 Nachrichtenklasse für Ausnahmeklasse | 85 |
Abb. 3–10 Eigenschaften der Ausnahmeklasse | 86 |
Abb. 3–11 Texte der Ausnahmeklasse | 86 |
Abb. 3–12 Nachrichten- und Parameterzuordnung | 87 |
Abb. 3–13 Attribute der Ausnahmeklasse | 87 |
Listing 3–15 Generierte Konstante vom Typ T100 | 87 |
Abb. 3–14 Eigenschaften der geerbten bzw. generierten Methoden der Ausnahmeklasse | 88 |
Generierter CONSTRUCTOR | 88 |
Abb. 3–15 Generierter CONSTRUCTOR der Ausnahmeklasse | 89 |
Abb. 3–16 Ausnahmeklasse in der Methode angeben | 89 |
Listing 3–16 Methode mit klassen- basierter Exception | 90 |
Listing 3–17 Aufruf einer Methode mit klassenbasierter Exception | 91 |
Abb. 3–17 Nachricht aus GET_TEXT | 91 |
Abb. 3–18 Laufzeitfehler bei fehlendem TRY-CATCH-Block | 92 |
CONSTRUCTOR nachgenerieren | 92 |
Vorteile von Ausnahmeklassen | 93 |
Exceptions und Exportparameter | 93 |
Exceptions und Exportparameter | 93 |
3.7.3 Ausnahmetexte aus dem OTR | 93 |
3.8 Zugriff auf die Klassendefinition im Repository | 94 |
Tabellen SEO_* enthalten Klassendefinitionen. | 94 |
Abb. 3–19 Repository-Informationen zu einer Klasse | 94 |
Listing 3–18 Zugriff auf die Klassendefinition im Repository | 95 |
3.9 Dynamischer Aufruf von Klassenmethoden | 96 |
Abb. 3–20 Dynamischer Methodenaufruf – Parameterliste | 96 |
Listing 3–19 Definition von Parametertabellen für dynamischen Aufruf | 97 |
Listing 3–20 Vollständig dynamischer Aufruf einer Instanzmethode | 97 |
3.9.1 Parameter vom Typ REF TO dynamisch übergeben | 100 |
Listing 3–21 Methode mit Ref To-Parameter | 101 |
Listing 3–22 Objektreferenz als Parameter in einem dynamischen Aufruf | 101 |
Objektreferenzen dynamisch erzeugen | 103 |
Abb. 3–21 Parametertabelle mit Referenzparameter | 103 |
Abb. 3–22 Statischen Typ über Feldsymbol dynamisch zuweisen | 104 |
3.10 Run Time Type Services | 104 |
3.10.1 Run Time Type Identification (RTTI) | 104 |
Listing 3–23 Makros für die Typermittlung von Referenzen | 104 |
Listing 3–24 Statischen und dynamischen Typ ermitteln | 105 |
Abb. 3–23 Ausgabe des Programms Z_TEST_TYPEDEF | 106 |
3.10.2 Run Time Type Creation (RTTC) | 107 |
Abb. 3–24 Klassenhierarchie des RTTI | 107 |
Listing 3–25 Dynamischer Typaufbau via RTTC | 107 |
3.11 Übernehmen lokaler Klassen in das Repository | 109 |
Abb. 3–25 Dynamisch mit RTTC erzeugte interne Tabelle im Debugger | 109 |
Abb. 3–26 Lokale Klassen importieren aus Programm | 109 |
Abb. 3–27 Importierte lokale Klasse CL_ENKEL | 110 |
4 Durchgängiges Beispiel des Buches: Kreditverträge | 111 |
4.1 Aufgabenstellung | 111 |
Dieses Beispiel wird durchgehend verwendet. | 111 |
4.2 Tabelle ZVERTRAG | 111 |
4.3 Vertragstransaktion | 112 |
Abb. 4–1 Tabelle ZVERTRAG | 112 |
4.4 Statusdiagramm | 112 |
4.5 Implementierung (DB und ABAP) | 113 |
Abb. 4–2 Statusdiagramm der Beispieltransaktion | 113 |
Listing 4–1 Interface FBS Z_VERTRAG (Vertragsbearbeitung) | 113 |
Formeln für Monatsrate und Laufzeit | 114 |
Abb. 4–3 FBS Z_VERTRAG – Aktion ANLEGEN | 114 |
Abb. 4–4 FBS Z_VERTRAG – Aktion AENDERN | 114 |
Abb. 4–5 FBS Z_VERTRAG – Aktion GENEHMIGEN | 115 |
Abb. 4–6 Ratenplan eines Kreditvertrages (nur letzter Teil) | 115 |
4.6 Quelltext der Vertragstransaktion | 116 |
Listing 4–2 Quelltext Vertragstransaktion | 116 |
4.7 Quelltext zur Berechnung des Ratenplans | 120 |
Listing 4–3 Quelltext zur Berechnung des Ratenplans | 121 |
5 Die neue Welt: ABAP Objects im Workflow | 125 |
5.1 Problemstellung | 125 |
5.2 IF_WORKFLOW | 126 |
Beispiel einer Vertragsbearbeitung im Workflow | 126 |
Abb. 5–1 Struktur SIBFLPOR für persistente Klassenreferenzen | 127 |
Abb. 5–2 Struktur SIBFLPORB für persistente BOR-Referenzen | 127 |
Abb. 5–3 Interface IF_WORKFLOW im Class Builder (SE24) | 128 |
Listing 5–1 Komponenten von BI_OBJECT | 128 |
Listing 5–2 Komponenten von BI_PERSISTENT | 128 |
Listing 5–3 Komponenten von IF_WORKFLOW | 129 |
BI_PERSISTANT~FIND_BY_LPOR | 129 |
Konvertierung Referenz DB à Hauptspeicher | 129 |
BI_PERSISTANT~LPOR | 129 |
Konvertierung Referenz Hauptspeicher à DB | 129 |
BI_PERSISTENT~REFRESH | 129 |
BI_OBJECT~DEFAULT_ATTRIBUTE_VALUE | 130 |
BI_OBJECT~EXECUTE_DEFAULT_METHOD | 130 |
BI_OBJECT~RELEASE | 130 |
5.3 Vertragsbearbeitung im Workflow – Klasse ZCL_VERTRAG | 130 |
Listing 5–4 CONSTRUCTOR der Klasse ZCL_VERTRAG | 130 |
5.3.1 Attribute MV_VERNR und MS_VERTRAG | 130 |
Abb. 5–4 Keine Schlüsselattribute vor IF_WORKFLOW | 131 |
5.3.2 Methoden ANZEIGEN, AENDERN, GENEHMIGEN | 131 |
Listing 5–5 Instanzmethode ZCL_VERTRAG.ANZEIGEN | 131 |
Listing 5–6 Instanzmethode ZCL_VERTRAG.AENDERN | 132 |
Listing 5–7 Instanzmethode ZCL_VERTRAG.GENEHMIGEN | 132 |
5.3.3 Ereignisse CREATED, CHANGED und CANCELLED | 133 |
Abb. 5–5 Ereignisse der Klasse ZCL_VERTRAG | 133 |
5.3.4 Erste Tests der Klasse ohne Interface IF_WORKFLOW | 134 |
5.4 Einfachste Ausprägung von IF_WORKFLOW | 134 |
Abb. 5–6 Methodenliste von ZCL_VERTRAG nach Einbindung von IF_WORKFLOW | 134 |
Listing 5–8 Methode BI_PERSISTENT~REFRESH | 134 |
Listing 5–9 CONSTRUCTOR mit Aufruf auf BI_PERSISTENT~REFRESH | 135 |
Abb. 5–7 Key-Flag an der Vertragsnummer | 135 |
Listing 5–10 Methode BI_PERSISTENT~ FIND_BY_LPOR | 135 |
Listing 5–11 Methode BI_PERSISTANT~LPOR | 136 |
Listing 5–12 Methode BI_OBJECT~DEFAULT_ATT RIBUTE_VALUE | 136 |
Listing 5–13 Methode BI_OBJECT~EXECUTE_DE FAULT_METHOD ruft die Anzeigemethode auf. | 137 |
Listing 5–14 Methode BI_OBJECT~RELEASE ist leer. | 137 |
5.5 Erweiterte Ausprägung IF_WORKFLOW | 137 |
Listing 5–15 CONSTRUCTOR bei erweitertem Interface | 137 |
Listing 5–16 Typen und Klassendaten für Instanzverwaltung | 138 |
Listing 5–17 Methode FIND_BY_LPOR mit Instanzpufferung | 138 |
Listing 5–18 Methode LPOR liefert Instanzdatum GS_POR. | 139 |
Listing 5–19 Methode REFRESH liest Vertragsdaten von der DB | 139 |
Listing 5–20 Wert des Defaultattributes ist Vertragsnummer. | 140 |
Listing 5–21 Defaultmethode ruft parameterlose Anzeigemethode auf. | 140 |
Listing 5–22 Methode RELEASE bleibt leer. | 140 |
Instanzpufferung: Performance vs. Datensicherheit | 140 |
Redundanz zwischen Objekt- und DB-Daten | 140 |
Listing 5–23 Statische Methode zur Instanzerzeugung | 141 |
Abb. 5–8 PRIVATE- Instanzerzeugung bei Instanzverwaltung | 141 |
6 Workflow-Container und Workflow-Ereignisse | 143 |
6.1 Konzept | 143 |
Tab. 6–1 Workflow-Teilobjekte mit eigenen Containern | 143 |
CL-Methoden haben keine Methodencontainer. | 144 |
Publish-Subscribe-Prinzip | 144 |
Event-Condition-Action- Paradigma | 144 |
6.2 Workflow-Container | 145 |
6.2.1 Die Klasse CL_SWF_CNT_CONTAINER | 145 |
Tab. 6–2 Interface der Klasse CL_SWF_CNT_CONTAINER | 145 |
Tab. 6–3 Befreundete Klassen von CL_SWF_CNT_CONTAINER | 146 |
Listing 6–1 Arbeiten mit Containern und Elementen | 147 |
Abb. 6–1 Editieren eines Containerinhalts | 148 |
Listing 6–2 Arbeiten mit Containerelementen | 149 |
Abb. 6–2 Editieren der Elementdefinition außerhalb des Containers | 150 |
Abb. 6–3 Container nach Einstellen des Elements | 150 |
6.2.2 Datenflüsse zwischen Containern | 151 |
Listing 6–3 Arbeiten mit Datenflüssen | 151 |
Abb. 6–4 Editieren einer Datenflussdefinition | 153 |
6.2.3 Containerpersistenz auf der Datenbank | 154 |
Abb. 6–5 Target-Container vor und nach Datenfluss | 154 |
Containerpersistenz einer Workflow-Definition einstellen | 154 |
Abb. 6–6 Datenstruktur zur Untersuchung der Containerpersistenz | 154 |
Containerspeicherung bei Strukturpersistenz | 155 |
Listing 6–4 NICHT SINNVOLL: Direkter Zugriff auf Containertabellen | 155 |
Abb. 6–7 Datenstruktur DATASTRU in der Tabelle SWW_CONT | 155 |
Containerspeicherung bei XML-Persistenz | 156 |
Abb. 6–8 Abbruch bei Containeranzeige | 156 |
Abb. 6–9 Inhalt der Tabelle SWWCNTP0 | 156 |
Listing 6–5 XML-Daten eines Containers anzeigen | 157 |
Container eines Workitems im Programm ändern | 158 |
Abb. 6–10 XML-Anzeige der Containerdaten eines WI | 158 |
Listing 6–6 Container eines Workitems per FBS ändern | 158 |
6.3 Ereigniserzeugung | 159 |
6.3.1 Universelle Ereigniserzeugung in ABAP-Programmen | 159 |
Abb. 6–11 Ereignis ZCL_VERTRAG ->CANCELLED mit zwei Parametern | 159 |
Listing 6–7 Event mit Eventcontainer auslösen | 159 |
Abb. 6–12 MAMETAB-Tabelle im Eventcontainer | 161 |
Listing 6–8 Verbraucher zu einem ausgelösten Event ermitteln | 162 |
Abb. 6–13 Ereignis mit Parametern | 162 |
6.3.2 Erzeugung von BOR-Events mit SWE_EVENT_CREATE | 163 |
6.3.3 Ereigniserzeugung über Änderungsbelege | 163 |
Änderungsbelegobjekt ZVERTRAG anlegen | 164 |
Abb. 6–14 Änderungsbelegobjekt ZVERTRAG | 164 |
Abb. 6–15 Tabellen im Generierungsobjekt eintragen | 165 |
Abb. 6–16 Verbucher generieren | 165 |
Änderungsbelege – Workflow-Eigenschaften | 166 |
Abb. 6–17 Änderungsbelege Workflow-Eigenschaften | 166 |
Änderungsbelege – Ereigniskopplung | 166 |
Abb. 6–18 Änderungsbelege – Ereigniskopplung (Übersicht) | 166 |
Abb. 6–19 Änderungsbelege – Ereigniskopplung (Details) | 166 |
Abb. 6–20 Änderungsbelege – Ereigniskopplung Feldrestriktionen | 167 |
Änderungsbelege anzeigen | 167 |
Abb. 6–21 Anzeige von Änderungsbelegen mit RSSCD100 | 167 |
Abb. 6–22 Änderungsbelege – Ereignis-Trace anzeigen | 167 |
6.3.4 Weitere Methoden der Ereigniserzeugung | 168 |
Ereigniserzeugung über Statusverwaltung | 168 |
Ereigniserzeugung über Nachrichtensteuerung | 168 |
6.4 Ereignis-Verbraucher-Kopplungen | 168 |
6.4.1 Typkopplung mit Funktionsbaustein oder Methode | 169 |
Abb. 6–23 Übersicht Typkopplung | 169 |
Abb. 6–24 Details Typkopplung, Aufrufart Funktionsbaustein | 170 |
Abb. 6–25 Details Typkopplung, Aufrufart Methode | 170 |
6.4.2 Verbrauchertyp | 171 |
Workflow-Muster steht im Verbrauchertyp | 171 |
6.4.3 Verbraucher-Funktionsbaustein | 171 |
6.4.4 Check-Funktionsbaustein | 171 |
Check-FBS prüft Startbedingungen. | 171 |
Listing 6–9 Beispiel für Check-FBS | 172 |
6.4.5 Verbrauchertyp-Funktionsbaustein | 172 |
Listing 6–10 Beispiel für Verbrauchertyp-FBS | 173 |
6.4.6 Typkopplung aktiv, Ereignis-Queue zulassen | 173 |
6.4.7 Instanzkopplung | 173 |
Instanzkopplung setzt Typkopplung voraus. | 174 |
Abb. 6–26 Instanzkopplungen für verschiedene Objekttypen (Übersicht) | 174 |
Abb. 6–27 Instanzkopplung für einen Objekttyp (Objektdaten) | 174 |
6.4.8 Einträge in den Koppeltabellen durch Workflow | 174 |
Startereignis Workflow über Typkopplung | 175 |
Endeereignis für Workitem über Instanzkopplung | 175 |
6.4.9 Workflow-Startbedingungen | 175 |
Start- oder Abbruchbedingung | 176 |
Abb. 6–28 Workflow- Startbedingungen | 176 |
De Morgan’sche Regeln für Negation komplexer logischer Ausdrücke | 176 |
Listing 6–11 Abbruchbedingungen im Check-FBS | 176 |
Listing 6–12 Startbedingungen in TA SWB_COND | 176 |
6.5 Ereignisverarbeitung | 177 |
6.5.1 Ablauf der Ereignisverarbeitung | 177 |
Ereignismanager | 177 |
6.5.2 Erzeuger- und Verbraucherkontext | 177 |
Abb. 6–29 Erzeuger- und Verbraucherkontext bei der Ereignisverarbeitung | 178 |
6.5.3 Ereignisfluss bei Vererbung | 178 |
Abb. 6–30 Ereigniskopplung für Super- und Subklasse | 179 |
Abb. 6–31 Ereignis-Trace für Ereignis CREATED der Subklasse | 179 |
6.6 Laufzeitwerkzeuge für Ereignisse | 179 |
6.6.1 Ereignis auslösen | 179 |
6.6.2 Ereignis simulieren | 180 |
Abb. 6–32 Ereigniserzeugung | 180 |
Ereignissimulation = Was würde bei Auslösung passieren. | 180 |
Abb. 6–33 Anzeige der Simulationsergebnisse einer Ereignissimulation | 180 |
6.6.3 Ereignis-Trace | 181 |
Abb. 6–34 Ereignis-Trace, Selektionsbild | 181 |
Abb. 6–35 Ereignis-Trace, Listanzeige | 182 |
6.6.4 Ereignis-Queue | 182 |
Abb. 6–36 Administration der Ereignis-Queue | 183 |
Abb. 6–37 Ereignis-Queue-Browser | 184 |
Abb. 6–38 Ereignis-Queue für Ereigniskopplung aktivieren | 184 |
7 Organisationsmanagement und Regeln | 185 |
7.1 Konzept | 185 |
Tab. 7–1 Statische vs. dynamische Bearbeiterzuordnung | 185 |
7.2 Bestandteile des Organisationsmanagements | 186 |
7.2.1 Organisationseinheiten | 186 |
Organisationsstruktur | 186 |
7.2.2 Besetzungsplan | 186 |
Abb. 7–1 Aufbauorganisation | 187 |
7.2.3 Aufgabenprofil | 187 |
7.3 Einfache Pflege der Aufbauorganisation | 188 |
Abb. 7–2 Pflege der Aufbauorganisation | 189 |
7.4 Infotypen | 189 |
7.4.1 OM-Typebene und OM-Objektebene | 189 |
OM-Typebene | 189 |
Abb. 7–3 Pflege des Organisations- managements | 190 |
OM-Objektebene | 190 |
7.4.2 OM-Objekttypen (Infotyp 1000) | 191 |
OM-Objekttypen sind keine BOR-Objekttypen und keine Klassen. | 191 |
Tab. 7–2 Wichtige OM-Objekttypen | 191 |
7.4.3 Verknüpfungen zwischen Objekttypen (Infotyp 1001) | 191 |
Abb. 7–4 Verknüpfungen pflegen | 192 |
7.4.4 Weitere Infotypen | 193 |
7.4.5 Zuständigkeiten | 193 |
Zuständigkeiten sind OM-Objekte vom Typ RY. | 193 |
7.5 Regeln und Regelauflösung | 194 |
7.5.1 Konzept | 194 |
7.5.2 Regeldefinition | 195 |
7.5.3 Regeln mit Funktionsbausteinen | 196 |
Listing 7–1 Beispiel für Regel-FBS | 196 |
Spezialfall: Regel mit Auswertungswegen: RH_GET_STRUCTURE | 196 |
7.5.4 Regeln mit Zuständigkeiten | 197 |
Abb. 7–5 Regel mit Auswertungsweg | 197 |
Abb. 7–6 Definition des Auswertungsweges WF_ORGUN mit TA OOAW | 197 |
Tab. 7–3 Zuständigkeiten nach Name und Kredithöhe | 198 |
Abb. 7–7 Anlegen von Zuständigkeiten innerhalb der Regelpflege (Tabellensicht) | 198 |
Abb. 7–8 Bearbeiterzuordnung bei Zuständigkeiten | 199 |
Abb. 7–9 Test der Regelauflösung für hohe Beträge | 199 |
Abb. 7–10 Datenfluss vom Workflow-Container (Vertragsreferenz) in den Regelcontainer | 200 |
7.6 Dynamische Eingangskörbe | 200 |
7.6.1 Aufgabenstellung | 200 |
7.6.2 Das Prinzip der dynamischen Eingangskörbe | 201 |
Abb. 7–11 Aufbau und Funktion eines dynamischen Eingangskorbes | 202 |
7.6.3 Pflege der Bestandteile dynamischer Eingangskörbe | 203 |
Abb. 7–12 Eingangskörbe als Org-Einheit mit Planstelle und Aufgabengruppe | 203 |
Abb. 7–13 Zuordnung von Benutzern zu Planstelle über TA PPSM | 203 |
Abb. 7–14 Dynamische Zuordnung Benutzer zu Planstelle | 204 |
Abb. 7–15 Benutzer, die die Vertretung für die Planstelle übernehmen dürfen | 204 |
Abb. 7–16 Vertretung für einen/mehrere Eingangskörbe übernehmen | 205 |
8 Standardaufgaben anlegen und verwenden | 207 |
8.1 Konzept Standardaufgaben | 207 |
Abb. 8–1 Standardaufgaben mit ihren Bestandteilen | 207 |
8.2 Standardaufgaben anlegen | 208 |
Abb. 8–2 Anlegen einer Standardaufgabe zvertr_aend | 208 |
8.2.1 Objekttyp und Methode | 208 |
Standardaufgaben sind atomare Bestandteile des Workflows. | 209 |
Synchrone Standardaufgaben rufen synchrone Methoden | 209 |
Synchrone Aufgaben entsprechen FBS-Aufrufen. | 209 |
Asynchrone Standardaufgaben rufen asynchrone Methoden | 209 |
8.2.2 Hintergrundaufgabe und Dialogaufgabe | 210 |
8.2.3 Verarbeitungsende bestätigen | 211 |
Listing 8–1 Genehmigungsmethode für Verträge | 212 |
8.2.4 Container und Initialwerte | 212 |
Abb. 8–3 Anlegen der Container- elemente auf Anfrage | 213 |
Abb. 8–4 Aufgabencontainer | 213 |
Abb. 8–5 Leerer (= automatischer) Datenfluss zwischen Methode und Aufgabe | 214 |
8.2.5 Aufgabe mit Rückgabewert | 214 |
Abb. 8–6 Grunddaten der Aufgabe zvertr_gene | 215 |
Abb. 8–7 Container der Aufgabe zvert_gene | 216 |
Abb. 8–8 Statusfestwerte als aktivierbare Ausgänge am Genehmigungsschritt | 216 |
Abb. 8–9 Anlegen von _WI_RESULT | 217 |
Abb. 8–10 Container mit Rückgabeelement _WI_RESULT | 217 |
8.2.6 Workitem-Text | 217 |
Abb. 8–11 Workitem-Text mit Parametern | 218 |
Abb. 8–12 Auswahl eines Ausdruckes aus dem Aufgabencontainer | 218 |
8.2.7 Beschreibung | 218 |
Langtext zur Beschreibung | 219 |
Langtext zur Beschreibung | 219 |
Langtext bei Terminüberschreitung | 219 |
Langtext bei Terminüberschreitung | 219 |
Langtext zur Endebenachrichtigung | 219 |
Langtext zur Endebenachrichtigung | 219 |
8.2.8 Auslösende Ereignisse | 219 |
8.2.9 Beendende Ereignisse | 220 |
Abb. 8–13 Auslösende Ereignisse einer Aufgabe | 220 |
Abb. 8–14 Beendende Ereignisse einer Aufgabe | 221 |
8.2.10 Mögliche Bearbeiter | 221 |
Abb. 8–15 Eigenschaften einer Standardaufgabe | 223 |
Tab. 8–1 Unterschiedliche Arten des Weiterleitens | 223 |
8.2.11 Zuständige Bearbeiter – Defaultregeln | 223 |
Abb. 8–16 Defaultregeln | 223 |
8.3 Standardaufgaben starten | 224 |
8.3.1 Start aus Workflow (Standardfall) | 224 |
8.3.2 Start über Ereignis | 224 |
8.3.3 Start aus Programm | 224 |
Listing 8–2 BOR-Standardaufgabe aus Programm starten | 224 |
Listing 8–3 CL-Standardaufgabe aus Programm starten | 226 |
9 Workflow-Muster anlegen und verwenden | 227 |
9.1 Konzept Workflow-Muster | 227 |
Workflow-Muster bilden Geschäftsprozesse ab. | 227 |
Grafische Workflow- Definition | 228 |
9.2 Workflow-Interface | 228 |
Abb. 9–1 Anlegen eines Workflow- Musters – Grunddaten | 228 |
9.2.1 Workflow-Container | 229 |
Führende Objektreferenz bestimmt die Art des Workflows. | 229 |
Abb. 9–2 Anlegen eines Workflow- Musters – Container | 230 |
Abb. 9–3 Führendes Objekt als CL-Referenz anlegen | 230 |
9.2.2 Initialwerte | 231 |
Abb. 9–4 Initialwert zur Vetragsreferenz angeben | 231 |
9.2.3 Aufgabentext | 231 |
9.2.4 Aufgabenbeschreibung | 231 |
Beschreibungen für Workflow | 231 |
9.2.5 Auslösende Ereignisse | 232 |
Datenfluss Startereignis à Workflow | 232 |
Abb. 9–5 Auslösende Ereignisse eines Workflow-Musters | 232 |
9.3 Workflow-Definition | 233 |
9.3.1 Die Arbeit mit dem grafischen Editor | 233 |
Teilfenster des grafischen Workflow-Editors | 233 |
Abb. 9–6 Grafischer Workflow- Editor | 234 |
9.3.2 Der Bedingungseditor | 235 |
Abb. 9–7 Bedingungseditor wird an verschiedenen Verzweigungsstellen eingesetzt. | 235 |
9.3.3 Übersicht Schritttypen | 236 |
Tab. 9–1 Schritttypen der Workflow-Definition | 236 |
9.3.4 Schritttyp Aktivität | 238 |
Reiter »Steuerung« | 238 |
Reiter »Details« | 239 |
Abb. 9–8 Schritttyp »Aktivität« – Reiter »Steuerung« | 239 |
Abb. 9–9 Schritttyp »Aktivität« – Reiter »Details« | 239 |
Reiter »Ausgänge« | 240 |
Folgeereignisse bilden Verzweigungen im Workflow. | 240 |
Abb. 9–10 Schritttyp »Aktivität« – Reiter »Ausgänge« | 240 |
9.3.5 Schritttyp Webaktivität | 241 |
9.3.6 Schritttyp Mailversand | 241 |
9.3.7 Schritttyp Formular | 242 |
Abb. 9–11 Formularangaben im Schritttyp »Formular« | 242 |
Listing 9–1 Generierte Forms bei Formularen | 242 |
9.3.8 Schritttyp Benutzerentscheidung | 243 |
Nie generische Entscheidungsaufgabe verwenden | 243 |
Abb. 9–12 Schritttyp »Benutzerentscheidung« | 243 |
Abb. 9–13 Schritttyp »Benutzer- entscheidung« in der Workflow-Definition | 244 |
9.3.9 Schritttyp Warten auf Ereignis | 244 |
Abb. 9–14 Schritttyp »Warten auf Ereignis« | 244 |
9.3.10 Schritttyp Bedingung | 245 |
Listing 9–2 Pseudocode Schritttyp »Bedingung« | 245 |
Abb. 9–15 Schritttyp »Bedingung« | 245 |
9.3.11 Schritttyp Mehrfachbedingung | 246 |
Abb. 9–16 Schritttyp »Bedingung« in der Workflow-Definition | 246 |
Listing 9–3 Pseudocode Schritttyp »Mehrfachbedingnung« | 246 |
Abb. 9–17 Schritttyp »Mehrfachbedingung« | 246 |
Abb. 9–18 Schritttyp »Mehrfachbedingung« in der Workflow-Definition | 247 |
9.3.12 Schritttyp Paralleler Abschnitt | 247 |
Listing 9–4 Pseudocode Schritttyp »Paralleler Abschnitt« | 247 |
Abb. 9–19 Schritttyp »Paralleler Abschnitt« | 248 |
Abb. 9–20 Schritttyp »Paralleler Abschnitt« (1 aus 2) in der Workflow-Definition | 248 |
9.3.13 Schritttyp UNTIL-Schleife | 248 |
Listing 9–5 Pseudocode Schritttyp »UNTIL-Schleife« | 248 |
Abb. 9–21 UNTIL-Schleife | 249 |
Abb. 9–22 UNTIL-Schleife in der Workflow-Definition | 249 |
9.3.14 Schritttyp WHILE-Schleife | 250 |
Listing 9–6 Pseudocode Schritttyp »WHILE-Schleife« | 250 |
Abb. 9–23 Schritttyp »WHILE-Schleife« | 250 |
Abb. 9–24 WHILE-Schleife in der Workflow-Definition | 251 |
9.3.15 Schritttyp Ablaufsteuerung | 251 |
Abb. 9–25 Schritttyp »Ablaufsteuerung« – Funktion »Workflow beenden« | 252 |
9.3.16 Schritttyp Containeroperation | 252 |
Abb. 9–26 Schritttyp »Containeroperation« | 252 |
9.3.17 Schritttyp Ereigniserzeuger | 253 |
Abb. 9–27 Schritttyp »Ereigniserzeuger« | 253 |
9.3.18 Schritttyp Ad-hoc-Anker | 253 |
9.3.19 Schritttyp Block | 253 |
9.3.20 Schritttyp Lokaler Workflow | 254 |
9.4 Container in der Workflow-Definition | 254 |
Abb. 9–28 Datenflüsse im Workflow | 254 |
9.5 Workflow-Grunddaten | 255 |
Abb. 9–29 Workflow-Grunddaten: versionsunabhängig | 255 |
9.5.1 Versionsunabhängig (Aufgabe) | 256 |
Reiter »Grunddaten« | 256 |
Abb. 9–30 Versionsunabhängig: Grunddaten | 256 |
Reiter »Beschreibung« | 256 |
Abb. 9–31 Versionsunabhängig: Beschreibung | 256 |
Reiter »Startereignisse« | 256 |
Abb. 9–32 Versionsunabhängig: Startereignisse | 257 |
Abb. 9–33 Versionsunabhängig: Startereignisse, Bedingung | 257 |
Reiter »Versionsübersicht« | 257 |
Abb. 9–34 Versionsunabhängig: Versionsübersicht | 257 |
Reiter »Funktionsgruppe« | 258 |
9.5.2 Versionsabhängig (aktuelle Workflow-Version) | 258 |
Abb. 9–35 Versionsabhängig: Steuerung: Persistenzprofil | 258 |
Reiter »Steuerung« | 258 |
Reiter »Workfloweinstellungen« | 259 |
Reiter »Bearbeiter« | 259 |
Reiter »Reviewer« | 259 |
Reiter »Benachrichtigung« | 259 |
Reiter »WebFlow« | 259 |
Reiter »Ereignisse« | 259 |
Abb. 9–36 Versionsabhängig: Ereignisse | 260 |
Reiter »Lokale Ereignisse« | 260 |
Reiter »Programmier-Exits« | 260 |
Reiter »Eigenschaften« | 261 |
Reiter »Aufgaben« | 261 |
Reiter »Technische Informationen« | 261 |
Reiter »Änderungsdaten« | 261 |
9.6 Einfacher Vertrags-Workflow | 261 |
9.6.1 Technische Workflow-Beschreibung und Pseudocode | 261 |
Listing 9–7 Pseudocode Vertrags-Workflow | 262 |
9.6.2 Workflow-Muster zao_main | 262 |
Start des Builders mit leerem Workflow | 262 |
Abb. 9–37 Anlegen zao_main: Start mit leerem Workflow | 262 |
Einfügen der UNTIL-Schleife | 263 |
Abb. 9–38 Anlegen zao_main: UNTIL-Schleife mit Bedingung | 263 |
Abb. 9–39 Anlegen zao_main: UNTIL-Schleife: Bedingung | 263 |
Schritt einfügen für Aufgabe zao_gene | 264 |
Abb. 9–40 Workflow zao_main: Schritt Vertrag genehmigen: Steuerung | 264 |
Abb. 9–41 Workflow zao_main: Schritt Vertrag genehmigen: Ausgänge | 264 |
Schritt einfügen für Aufgabe zao_aend | 265 |
Abb. 9–42 Anlegen zao_main: nach Einfügen des Genehmigungsschrittes | 265 |
Abb. 9–43 Workflow zao_main: Schritt Vertrag ändern nach Ablehnung: Steuerung | 265 |
Abb. 9–44 Anlegen zao_main: fertiger Workflow mit Blockstruktur | 266 |
9.7 Bearbeiterfindung im Workflow | 267 |
9.7.1 Allgemeines | 267 |
9.7.2 Definition der möglichen Bearbeiter | 267 |
Abb. 9–45 Bearbeiterzuordnung pflegen | 268 |
9.7.3 Zuständige und ausgeschlossene Bearbeiter | 268 |
Sonderfälle | 269 |
Abb. 9–46 Definition der zuständigen und der ausgeschlossenen Bearbeiter | 269 |
9.7.4 Ermittlung der Empfänger | 269 |
Abb. 9–47 Ermittlung der Empfänger eines Workitems | 270 |
9.8 Arbeiten mit dem Business Workflow Explorer | 270 |
9.8.1 Zweck des Business Workflow Explorer | 270 |
9.8.2 Auswahl des Suchbereiches | 271 |
Abb. 9–48 Angabe der Objekttypen im Business Workflow Explorer | 271 |
9.8.3 Anzeige und Bearbeitung von Objekten | 272 |
Abb. 9–49 Anzeige von Objekttypen im Business Workflow Explorer | 272 |
9.9 Lesen der Workflow-Definitionen | 272 |
Workflow-Definitionen in ABAP auswerten | 272 |
Listing 9–8 Workflow-Muster mit Aufgaben auflisten | 273 |
Abb. 9–50 Liste von Workflow- Mustern mit Aufgaben und ABAP-Methoden | 274 |
9.10 Starten von Workflows | 275 |
9.10.1 Start von Workflows über ABAP OO | 275 |
Listing 9–9 Workflow aus Programm direkt starten | 275 |
9.10.2 Start von Workflows über Ereignisse | 276 |
10 Klassenbasierte Techniken im Workflow | 277 |
10.1 SAP-Klassen im Workflow-Umfeld | 277 |
Tab. 10–1 Klassengruppen für SAP-Klassen im Workflow-Kontext | 277 |
10.2 Iterator-Klassen, Factory-Klassen und Utility-Klassen | 278 |
10.2.1 Iterator-Klassen | 278 |
Abb. 10–1 Attribute der BasisIterator-Klasse CL_SWF_UTL_ITERATOR | 278 |
Abb. 10–2 Tabellentyp der BasisIterator-Klasse CL_SWF_UTL_ITERATOR | 278 |
Abb. 10–3 Methoden der BasisIterator-Klasse CL_SWF_UTL_ITERATOR | 279 |
Listing 10–1 Beispielprogramm Iterator | 279 |
Listing 10–2 Iteration über Containerelemente | 281 |
10.2.2 Factory-Klassen und Factory-Methoden | 281 |
Tab. 10–2 Factory-Klassen im Workflow-Kontext | 281 |
Abb. 10–4 Singletonklasse | 282 |
Listing 10–3 Methode get_container der Klasse cl_swf_tst_ container_singleton | 283 |
Listing 10–4 Drei Containerreferenzen zeigen auf dasselbe Objekt. | 283 |
Abb. 10–5 Drei Containerreferenzen auf dasselbe Containerobjekt | 283 |
10.2.3 Utility-Klassen | 283 |
Tab. 10–3 Utility-Klassen im Workflow-Kontext | 284 |
10.3 Terminüberwachung | 284 |
10.3.1 Problem und Lösungsprinzip | 284 |
10.3.2 Standardfall mit Deadline-Workitems | 284 |
Deadline-Workitem | 285 |
Abb. 10–6 Spätester Start (Standardfall) | 285 |
10.3.3 Berechnete Termine mit Deadline-Workitem | 286 |
Abb. 10–7 Eingangskorb mit Deadline-Workitem zur Erinnerung (Release 4.0) | 286 |
10.3.4 Obsolet setzen eines Workitems | 287 |
Abb. 10–8 Berechnete Termine für den spätesten Start | 287 |
Kalenderfunktionen zur Berechnung von Terminen | 287 |
Abb. 10–9 Workflow mit modellierter Fristüberschreitung und Obsoletausnahme | 288 |
10.4 Nebenmethoden | 288 |
10.4.1 Problem und Lösungsprinzip | 288 |
10.4.2 Methode zur Vertragsanzeige | 289 |
Funktionsbaustein REUSE_ALV_LIST_DISPLAY | 289 |
Listing 10–5 Nebenmethode zur Anzeige aller Verträge eines Kunden | 289 |
10.4.3 Eintrag als Nebenmethode in die Aktivität | 289 |
Abb. 10–10 Eintrag einer Methode als Nebenmethode | 289 |
10.4.4 Amodaler Aufruf der Nebenmethode | 290 |
Abb. 10–11 Aufruf einer Vertragsliste als amodale Nebenmethode | 290 |
10.5 Objektreferenzen in die Workitem-Vorschau einstellen | 291 |
10.5.1 Referenzen auf bestehende Workflow-Klassen | 291 |
Abb. 10–12 Objektliste _Adhoc_Objects nur für BOR-Referenzen | 291 |
Abb. 10–13 Versorgen einer Referenz für die Workitem-Vorschau | 291 |
Abb. 10–14 Workitem-Vorschau für Ratenplananzeige | 292 |
10.5.2 Referenzen auf spezielle Anzeigeklassen | 292 |
Überspringen von Dynpros mit Batch-Input | 292 |
Abb. 10–15 Zieldarstellung für Einsprung in das CIC | 293 |
Listing 10–6 Generierter FBS mit Batch-Input | 294 |
Abb. 10–16 Klasse ZCL_CICLINK für CIC-Link | 295 |
Listing 10–7 Quelltext der Klasse ZCL_CICLINK | 296 |
10.6 Programmier-Exits für Workitems | 297 |
10.6.1 Das Interface IF_SWF_IFS_WORKITEM_EXIT | 297 |
Abb. 10–17 Workitem-Exit | 297 |
10.6.2 Logging mit CHECK-POINT-Gruppe | 297 |
Abb. 10–18 CHECK-POINT-Gruppe ZVERTRAG mit Aktivierungen | 298 |
Abb. 10–19 Parameter im Workitem-Exit | 298 |
Abb. 10–20 Mögliche Events für den Aufruf des Workitem-Exits | 298 |
Abb. 10–21 Interface IF_WAPI_WORKITEM_ CONTEXT | 299 |
Listing 10–8 Workitem-Exit mit Logging | 299 |
Abb. 10–22 Anzeige der Log-Einträge zum Userexit | 300 |
10.6.3 Automatisches Zurücklegen eines Workitems | 300 |
Listing 10–9 Workitem-Exit für das Zurücklegen eines Workitems | 301 |
Listing 10–10 Bacht-Report zum Zurücklegen eines Workitems | 301 |
10.7 Fortgeschrittene Workflow-Definition | 302 |
10.7.1 Lokale Ereignisse und Ausnahmen | 302 |
Abb. 10–23 Workflow-Grunddaten: Versionsabhängig: Lokale Ereignisse | 303 |
Tab. 10–4 Schritttypen für lokale Ereignisse und Ausnahmen | 303 |
10.7.2 Lokale Ereignisse und komplexe Bedingungen | 303 |
Abb. 10–24 Komplexe Bedingung modelliert über lokales Ereignis | 304 |
Abb. 10–25 Schritt D wartet auf Schritt A im anderen Parallelzweig | 304 |
10.7.3 TRY/CATCH im Workflow: Blöcke und Ausnahmen | 305 |
10.7.4 Lokale Workflows und lokale Ereignisse | 305 |
10.8 Dynamische Blöcke | 306 |
10.8.1 Dynamisch sequenzieller Block = Workflow-Iterator | 307 |
Abb. 10–26 Dynamisch sequenzieller Block als eingebetteter Subworkflow | 307 |
10.8.2 Dynamisch paralleler Block | 307 |
Abb. 10–27 Dynamisch paralleler Block als eingebetteter Subworkflow | 307 |
10.8.3 Beispiel: Bewertungs-Workflow für Vertrag | 308 |
Abb. 10–28 Dynamisch-sequenzielle Bearbeitung der UserListe | 308 |
Abb. 10–29 Datenfluss zum dynamisch-sequenziellen Block | 309 |
Abb. 10–30 Dynamisch-paralleler Block zur Vertragsbewertung | 309 |
Abb. 10–31 Datenfluss zwischen Workflow-Container und Blockcontainer | 310 |
Abb. 10–32 Abbruchbedingung für dynamisch-parallelen Block | 310 |
Abb. 10–33 SBE zur Vertrags- bewertung mit Link zum Vertrag | 311 |
Abb. 10–34 Protokoll eines Workflows mit Blöcken | 311 |
10.9 Ad-hoc-Funktionen im Workflow | 312 |
10.9.1 Ad-hoc-Aufgabenauswahl | 312 |
Abb. 10–35 Maschinelle Aufgabenbestimmung | 312 |
Listing 10–11 Statische, funktionale Methode zur Bestimmung des Workflow-Musters | 313 |
Abb. 10–36 Ausdruck für Aufgabe ist funktionale Methode. | 313 |
Manuelle Ad-hoc-Aufgabenauswahl | 314 |
Abb. 10–37 Aufgabenauswahl aus einer passenden Aufgabengruppe | 314 |
Abb. 10–38 Ausdruck für Ad-hoc- Aufgabe ist Containervariable | 314 |
10.9.2 Ad-hoc-Bearbeiterauswahl | 314 |
Abb. 10–39 Datenfluss von/zum Dialog für Ad-hoc- Bearbeiterauswahl. | 315 |
10.9.3 Ad-hoc-Workflow einbinden | 316 |
Abb. 10–40 Dialog zur Ad-hoc- Bearbeiterauswahl | 316 |
Abb. 10–41 Liste der Ad-hoc- Workflows in einem Schritt »Ad-hoc-Anker« | 316 |
Abb. 10–42 Grafisches Workflow- Protokoll vor der Ersetzung | 317 |
10.10 Reaktion eines Workflows auf externe Ereignisse | 318 |
Abb. 10–43 Ersetzter Ad-hoc-Anker im Workflow-Protokoll | 318 |
10.10.1 Standardreaktionen über Grunddaten des Workflows | 319 |
Abb. 10–44 Workflow abbrechen bei Ereignis ZCL_VERTRAG->CANCELLED | 319 |
Abb. 10–45 Instanzkopplung für Ereignisempfang | 320 |
10.10.2 Modellierte Reaktionen über Ereignisempfänger | 320 |
Abb. 10–46 Warten auf Ereignis ZCL_VERTRAG->ACTIVATED | 321 |
Abb. 10–47 Frist für Warteschritt auswerten (modelliert) | 321 |
Abb. 10–48 Ereignisempfänger mit Fristüberwachung | 322 |
10.11 Klassenverwendung im Workflow ohne Standardaufgaben | 322 |
10.11.1 Konzept | 322 |
Tab. 10–5 Klassenaufrufe im Workflow ohne Standardaufgaben | 323 |
10.11.2 %-%-Zugriff ohne IF_WORKFLOW | 323 |
Abb. 10–49 Ausdruck mit funktionaler Methode in Containerzuweisung | 324 |
Abb. 10–50 Funktionale Methode mit Parametervariablen im Datenfluss | 324 |
10.11.3 &-&-Zugriff über ungebundene Containerreferenzen | 324 |
10.11.4 &-&-Zugriff über gebundene Containerreferenzen | 325 |
Abb. 10–51 Ungebundene Klassenreferenz im Container | 325 |
Listing 10–12 Pseudoinstanziierung | 325 |
Abb. 10–52 Instanziierung (= Initiali- sierung) der Pseudo- referenz der Utility-Klasse | 326 |
Abb. 10–53 Kompletter (ergänzter) Ausdruck | 326 |
Abb. 10–54 Ausdruck mit funktionaler Methode via Referenz im Datenfluss | 327 |
10.11.5 Geschachtelter Zugriff mit %-% und &-& | 327 |
Abb. 10–55 Geschachtelter Ausdruck in einer Bedingung | 327 |
10.11.6 Methoden mit mehreren Exportparametern | 328 |
Listing 10–13 Nicht funktionale Methode mit zwei alternativen Exportparametern | 328 |
Leider nicht möglich! | 328 |
10.11.7 Objektreferenzen on-the-Flight | 329 |
Abb. 10–56 Aufruf der Methode ZCL_CALC.POWER in einem Datenfluss | 329 |
Abb. 10–57 Objekt on-the-Flight im Datenfluss | 329 |
11 Klassenbasierte Eigenentwicklungen im Workflow | 331 |
11.1 Utility-Klasse ZCL_DATE: Datumsberechnung auf Kalendern | 331 |
11.1.1 Verwendung von Datumsberechnungen | 331 |
11.1.2 Implementierung von ZCL_DATE | 331 |
Listing 11–1 Klasse ZCL_DATE, Methode DATE | 331 |
Listing 11–2 Klasse ZCL_DATE, Methode TIME | 333 |
Abb. 11–1 Zeitkonstanten der Klasse ZCL_DATE | 334 |
11.1.3 Verwendung von ZCL_DATE in Ausdrücken | 334 |
Abb. 11–2 Verwendung von ZCL_DATE im Vorlagetermin | 334 |
Abb. 11–3 Datumsberechnung in die Vergangenheit | 335 |
Klassenausdrücke mit % ohne IF_WORKFLOW | 335 |
11.2 Utility-Klasse ZCL_COND: komplexe Bedingungen | 335 |
11.2.1 Konzept komplexer Bedingungen im Workflow | 335 |
Abbildung beliebiger Bedingungen | 335 |
11.2.2 Tabelle ZCONDITION | 336 |
Abb. 11–4 Workitems: Tabelle für Startbedingungen | 336 |
11.2.3 Implementierung von ZCL_COND | 336 |
Listing 11–3 Klasse ZCL_COND, Setzen einer Bedingung mit SET | 336 |
Listing 11–4 Klasse ZCL_COND, Prüfen einer Bedingung mit CHECK | 337 |
11.2.4 Verwendung von ZCL_COND in ZCL_VERTRAG | 337 |
Listing 11–5 Methode SETCOND der Klasse ZCL_COND | 337 |
Listing 11–6 Methode CHECKCOND der Klasse ZCL_COND | 338 |
11.2.5 Setzen und Prüfen von Vertragsbedingungen | 338 |
Abb. 11–5 Workflow mit Setzen einer Bedingung via Containeroperation | 339 |
Abb. 11–6 Zuweisung zum Setzen einer Bedingung | 339 |
Abb. 11–7 Startbedingung am Schritt D | 340 |
Abb. 11–8 Nach Start des Workflows | 340 |
Abb. 11–9 Nach Beenden des Schrittes A, vor dem nächsten Lauf von SWWCOND | 341 |
Abb. 11–10 Bedingung »A_FERTIG« wurde in die Tabelle geschrieben. | 341 |
Abb. 11–11 Nach dem nächstem Lauf des Reports SWWCOND | 342 |
11.2.6 Aufruf von ZCL_COND in Ausdrücken | 343 |
Abb. 11–12 Direkter Aufruf der Klasse ZCL_COND | 343 |
11.3 Utility-Klasse ZCL_CONST: Datenbankkonstanten | 343 |
11.3.1 Konzept »variabler« Konstanten | 343 |
11.3.2 Tabelle der Konstanten ZCONST | 344 |
Abb. 11–13 DB-Tabelle für Konstanten | 344 |
Abb. 11–14 Werte in der Konstantentabelle | 344 |
11.3.3 Aufruf der Konstanten über ZCL_CONST | 344 |
Listing 11–7 Aufruf einer Datums- konstanten über Klasse ZCL_CONST | 345 |
11.3.4 Implementierung von ZCL_CONST | 345 |
Abb. 11–15 Konstanten als statische Read-only-Attribute mit Defaultwert | 345 |
Abb. 11–16 Methoden der Konstantenklasse | 345 |
Listing 11–8 Lesen der DB-Konstanten in Klasse ZCL_CONST | 346 |
Listing 11–9 CONSTRUCTOR ruft Methode REFRESH | 346 |
11.3.5 Einführen neuer Konstanten | 347 |
Abb. 11–17 Testen der statischen Konstantenklasse | 347 |
11.3.6 Verwendung der Konstanten im Workflow | 347 |
Abb. 11–18 Statischer Aufruf von Konstanten | 348 |
Listing 11–10 Pseudoinstanziierung der Klasse ZCL_CONST | 348 |
Abb. 11–19 Abstrakte Konstantenklasse im Workflow-Container zur Definitionszeit | 348 |
Abb. 11–20 Verwendung der Konstantenklasse in einer Containeroperation | 349 |
11.4 Utility-Klasse ZCL_SYSTEM: generische Systemmethoden | 349 |
11.4.1 Inhalt von ZCL_SYSTEM | 349 |
11.4.2 Erzeugen von Klassenreferenzen im Workflow | 350 |
Import via Datenfluss aus dem Ereigniscontainer | 350 |
Import aus Instanziierungsmethode einer Klasse | 350 |
Listing 11–11 Methode zur Instanziierung von Vertragsobjekten | 351 |
Abb. 11–21 Setzen einer Vertragsreferenz mit ZCL_VERTRAG=>GET_REF | 351 |
Import aus spezieller CREATE-Methode der Klasse | 351 |
Listing 11–12 Klassenmethode zum Neuanlegen eines Vertrages | 352 |
11.4.3 GENERICINSTANTIATE von CL- und BOR-Referenzen | 352 |
Listing 11–13 Methode zum Anlegen von BOR- und CL-Referenzen im Workflow | 352 |
11.4.4 MAKE_CL_REF für den Aufruf in Ausdrücken | 353 |
Listing 11–14 Funktionale Methode ZCL_SYSTEM.MAKE_ CL_REF | 354 |
Listing 11–15 Aufruf von MAKE_CL_REF in einer Zuweisung | 354 |
11.5 Kommunikation zwischen parallelen Subworkflows | 354 |
11.5.1 Kommunikation über Ereignisse | 355 |
Abb. 11–22 Parameter am Ereignis ANSWER_FOR_EVENT_ FLAGS | 355 |
Abb. 11–23 Mainworkflow mit zwei kommunizierenden parallelen Subworkflows | 355 |
Abb. 11–24 Kommunikation zwischen zwei parallelen Subworkflows über Ereignisse | 356 |
11.5.2 ZCL_SYSTEM: Lesen fremder Workflow-Container | 356 |
Listing 11–16 Lesen eines anderen Workflow-Containers | 357 |
Abb. 11–25 Binding Workflow à Auf- gabe für Leseschritt aus fremdem WF-Container | 359 |
11.6 Mails im Workflow-Umfeld | 359 |
11.6.1 Mail senden mit Schritttyp Mailversand | 359 |
Abb. 11–26 Mailinhalt mit Platzhaltern im Schritt Mail versenden | 360 |
Abb. 11–27 Erzeugte Mail in SAPconnect (TA SOST) | 360 |
11.6.2 ZCL_SYSTEM: Mail mit eigenem Absender | 360 |
Listing 11–17 Mail aus Workflow mit Absender <> WF-BATCH | 361 |
Abb. 11–28 Versendete Mail mit Absender <> WF-BATCH | 362 |
11.6.3 ZCL_SYSTEM: Mail mit SAP – Text und Containerbezug | 362 |
Listing 11–18 Mail aus SAP- Standardtext mit Platzhaltern | 363 |
Abb. 11–29 SAPScript-Text ZVERTRAG_GENEHMIGT für Mail bei Vertragsgenehmigung | 365 |
Abb. 11–30 Datenfluss zur Aufgabe für Mailversand | 365 |
Abb. 11–31 Gesendete Mail in der TA SOST | 366 |
Abb. 11–32 Mail mit ersetzten Werten aus dem Workflow-Container | 366 |
11.6.4 HTML-Mails mit Rückantwort | 367 |
Senden einer HTML-Mail | 367 |
Listing 11–19 Anlegen und versenden einer HTML-Mail | 367 |
Abb. 11–33 HTML-Mail mit Tasten für Rückantwort | 369 |
Abb. 11–34 Antwortmail des Genehmigers | 369 |
Verarbeitung der Antwortmails | 369 |
Listing 11–20 Implementierung des Interface IF_INBOUND_EXIT BCS | 369 |
Abb. 11–35 Eintragen der Klasse ZCL_VERTRAG_ MAILREPLY für Eingangsverarbeitung | 370 |
Reaktion auf Ereignisse aus der Mailverarbeitung im Workflow | 371 |
Abb. 11–36 Beendende Ereignisse an der Genehmigungs- aufgabe | 371 |
Abb. 11–37 Ausgänge am Genehmigungsschritt | 372 |
Abb. 11–38 Ablehnung/Genehmigung per Mail/GUI | 372 |
12 Business Workplace als Userinterface | 373 |
12.1 Allgemeines zum Business Workplace | 373 |
Abb. 12–1 Outlook-Arbeitsplatz mit dreigeteiltem Fenster | 373 |
Abb. 12–2 SAP Business Workplace mit Dreifelderaufteilung | 374 |
12.2 Fenster im Business Workplace | 375 |
Abb. 12–3 SAP Business Workplace, Workitems nicht gruppiert | 375 |
Abb. 12–4 SAP Business Workplace, Ansicht Workflow, gruppiert nach Aufgaben | 375 |
12.2.1 Das Mappenfenster (1) | 375 |
Tab. 12–1 Inhalt und Bedeutung des Mappenfensters | 376 |
Gruppierungen im Workplace | 377 |
12.2.2 Das Inboxfenster (2) | 378 |
Abb. 12–5 Inbox im Inboxfenster des Business Workplace | 378 |
Abb. 12–6 Drucktasten für Inbox | 378 |
12.2.3 Das Vorschaufenster (3) | 379 |
Anwenderspezifisches Vorschaufenster | 379 |
Abb. 12–7 Anwenderspezifische Vorschau | 379 |
12.3 Funktionen im Workplace | 380 |
Abb. 12–8 Funktionsbaustein für anwenderspezifische Vorschau | 380 |
12.3.1 Funktionen der Workflow-Inbox | 380 |
Statuswerte von Dialog-Workitems | 380 |
Refresh | 381 |
Abb. 12–9 Statusdiagramm für Dialog-Workitems | 381 |
Ausführen | 381 |
Anzeigen | 382 |
Annehmen | 382 |
Automatik: Weiterschalten mit Dialog | 382 |
Zurücklegen | 382 |
Weiterleiten | 382 |
Wiedervorlegen | 383 |
Workflow-Protokoll anzeigen | 383 |
Anlagen anlegen, ändern, löschen | 383 |
Anlagen per Upload am Frontend | 383 |
Weitere Funktionen | 383 |
Sortieren aufsteigend und absteigend | 384 |
Suchen | 384 |
Layout | 384 |
12.3.2 Persönliche Workflow-Einstellungen | 385 |
Abb. 12–10 Persönliche Workflow-Einstellungen | 385 |
Organisatorisches Umfeld auffrischen | 385 |
12.3.3 Workflow-Vertretungen | 385 |
Vertreterregelungen werden unterschätzt. | 386 |
Pflege von Vertretern | 386 |
Potenzielle Vertreter vorausschauend pflegen | 386 |
Aktivierung einer Vertretung durch den Vertretenen | 386 |
Aktivierung von Vertretern durch den Vertreter selbst | 387 |
Abb. 12–11 Vertretungen pflegen und übernehmen | 387 |
Probleme der Vertreterregelung in SAP Business Workflow | 387 |
Keine Kettenvertretung möglich | 387 |
12.3.4 Vertretungen in Tabelle HRUS_D2 | 388 |
Abb. 12–12 Tabelle HRUS_D2 der Workflow-Vertretungen | 388 |
12.4 Die Anpassung der Inbox | 388 |
12.4.1 Layoutfunktionen des ALV-Grids | 388 |
Spaltenauswahl | 389 |
Abb. 12–13 Spaltenauswahl und Spaltenreihenfolge festlegen | 389 |
Sortierung | 389 |
Filterung | 390 |
Abb. 12–14 Sortiereinstellungen im Layout | 390 |
Abb. 12–15 Filtereinstellungen im Layout | 390 |
12.4.2 Verwendung dynamischer Anwenderspalten | 391 |
Abb. 12–16 Definition dynamischer Spalten für eine Standardaufgabe | 391 |
Abb. 12–17 Dynamische Spalten ins Layout einfügen | 392 |
Abb. 12–18 Sichern des Layouts als Voreinstellung | 392 |
Abb. 12–19 Layout der Workflow- Inbox für Vertragsgenehmigungen | 393 |
13 Webservices im Workflow | 395 |
13.1 Webservices im Workflow | 395 |
Transaktionen WF_EXTSRV und WFWS sind veraltet. | 395 |
13.2 Das Webservice-Framework | 396 |
Abb. 13–1 Architektur des Webservice-Frameworks | 396 |
13.2.1 Erstellen eigener Webservices | 397 |
13.2.2 Einbinden fremder Webservices | 398 |
Abb. 13–2 SAP-System als Webservice-Provider | 398 |
Abb. 13–3 Seite mit freien Webservices für Wetterdienste | 398 |
13.3 Beispiel: Einbinden eines Webservice | 399 |
Abb. 13–4 SAP-System als Webservice-Consumer | 399 |
13.3.1 SOAP-Webservice für Wetterdienste | 399 |
Abb. 13–5 Wetterdienst | 399 |
Abb. 13–6 WSDL-File des Webservice für Wetterdienste | 400 |
13.3.2 Einbinden eines Webservice in SAP | 400 |
Abb. 13–7 Auswahl des Objekttypen: Service-Consumer | 400 |
Abb. 13–8 Quelle des Service: Lokale Datei | 401 |
Abb. 13–9 WSDL-Datei vom Frontend verwenden | 401 |
Abb. 13–10 Paket und Präfix vergeben | 401 |
Abb. 13–11 Fertigstellen des Service | 402 |
Abb. 13–12 Übersicht über den neuen Webservice GlobalWeatherSoap | 402 |
Abb. 13–13 Methoden mit Parametern | 403 |
Abb. 13–14 Objekte des Webservice | 403 |
13.3.3 Generierte Klasse ZCO_GLOBAL_WEATHER_SOAP | 403 |
Abb. 13–15 Generierte Klasse zum GlobalWeather-Service | 404 |
Listing 13–1 Generierte Methode GET_CITIES_BY_COUNTRY | 404 |
13.3.4 Anlegen logischer Ports | 405 |
Abb. 13–16 Logischer Port: Laufzeit | 406 |
Abb. 13–17 Logischer Port: Aufrufparameter | 406 |
Abb. 13–18 Logischer Port: Operationen | 406 |
13.4 Aufruf des Webservice | 407 |
13.4.1 Aufruf des Service GlobalWeather in einem Programm | 407 |
Listing 13–2 Aufruf des Webservice GlobalWeather | 407 |
Abb. 13–19 XML-Resultatstring des Webservice GlobalWeather (gekürzt) | 408 |
Listing 13–3 Simple Transformation zur Deserialisierung des XML-Ergebnisses | 408 |
13.4.2 Einbinden des Webservice in den Workflow | 409 |
Abb. 13–20 Ausgabe Testprogramm Webservice GlobalWeather (gekürzt) | 409 |
Abb. 13–21 Aufruf Webservice in statischer Methode bei Containerzuweisung | 409 |
Abb. 13–22 Containerinhalt nach Datenfluss: Wetterstationen in Frankreich | 410 |
14 Das Workflow-Laufzeitsystem | 411 |
14.1 Konzept | 411 |
14.2 Die Tabellen des Laufzeitsystems | 411 |
Tab. 14–1 Einige wichtige Tabellen des Workflow- Laufzeitsystems | 412 |
14.2.1 Die Tabelle SWWWIHEAD der Workitem-Köpfe | 412 |
Workitem ist zentraler Begriff des Laufzeitsystems. | 412 |
Tab. 14–2 Wichtige Felder der Tabelle SWWWIHEAD | 412 |
Tab. 14–3 Typen von Workitems | 413 |
Tab. 14–4 Statuswerte der Workitems | 413 |
Abb. 14–1 Hierarchie von Workitems | 414 |
14.2.2 Die Tabelle SWW_WI2OBJ für Objektreferenzen | 414 |
14.2.3 Die Tabelle SWWORGTASK | 415 |
14.2.4 Die Tabelle SWWUSERWI der Benutzerzuordnung | 415 |
14.2.5 Views | 415 |
14.2.6 Programmierter Zugriff auf die Laufzeittabellen | 415 |
Lesender Zugriff auf Laufzeittabellen kann sinnvoll sein. | 415 |
Listing 14–1 Lesender Zugriff auf Laufzeittabellen | 416 |
Listing 14–2 FBS zum Prüfen einer Vertretung zwischen zwei Benutzern | 417 |
14.3 Wichtige Funktionsbausteine und Klassen | 418 |
14.3.1 SAP_WAPI-Bausteine | 418 |
Tab. 14–5 WAPI-Funktionsbausteine | 418 |
14.3.2 Klassen des Laufzeitsystems | 419 |
Tab. 14–6 Wichtige SAP-Klassen des Laufzeitsystems | 419 |
14.4 Die Arbeitsweise des Laufzeitsystems | 420 |
Abb. 14–2 Prinzipielle Arbeitsweise des Workflow- Laufzeitsystems | 421 |
Abb. 14–3 Aufrufhierarchie beim Ausführen eines Dialog-Workitems | 423 |
Abb. 14–4 Aufrufhierarchie beim Ausführen der Callback- Funktion des Dialog- Workitems | 424 |
14.4.1 Datenfluss über Container | 424 |
14.4.2 Aktionen auf Workitems | 424 |
14.4.3 Termin- und Fehlerüberwachung | 425 |
Report zur Terminüberwachung RSWWDHEX | 425 |
Report zur Fehlerüberwachung RSWWERRE | 425 |
14.4.4 Business Workplace als Sicht auf die Laufzeittabellen | 425 |
15 Tests und Fehlersuche | 427 |
15.1 Workflow-Instanzen suchen | 427 |
15.1.1 Workitem-Selektion mit ihren Anzeigemöglichkeiten | 427 |
SWI1 nicht geeignet für P-Systeme | 427 |
Abb. 15–1 Selektionsbild der Workitem-Selektion | 428 |
Abb. 15–2 Liste mit Workitems der Transaktion SWI1 (Entwicklungssystem) | 428 |
15.1.2 Workflow-Instanzen zu Objekttyp | 429 |
Abb. 15–3 Selektionsbild SWI14: Workflows zu Objekttyp | 429 |
Abb. 15–4 Ergebnisanzeige SWI14: Workflows zu Objekttyp | 429 |
15.1.3 Workflow-Instanzen zu Objektinstanz | 430 |
Abb. 15–5 Selektionsbild SWI6: Workflows zu Objektinstanz | 430 |
Abb. 15–6 SWI6: Eingabe des Schlüssels der Objektinstanz | 430 |
Abb. 15–7 Ergebnisanzeige SWI6: Workflows zu Objektinstanz | 431 |
15.2 Workflow-Protokoll mit seinen diversen Sichten | 431 |
15.2.1 ActiveX-Protokoll und seine Sichten | 432 |
Abb. 15–8 Auswahl der Einstiegssicht des Workflow-Protokolls | 432 |
Abb. 15–9 ActiveX-Workflow- Protokoll: Sicht Workflow-Chronik | 432 |
Abb. 15–10 Grafisches Workflow- Protokoll: Wahl der Hierarchieebene | 433 |
Abb. 15–11 ActiveX-Workflow- Protokoll: Sicht Workflow-Bearbeiter | 433 |
15.2.2 Technisches Workflow-Protokoll und seine Sichten | 434 |
Abb. 15–12 Technisches Workflow-Protokoll, Chronologische Sicht | 434 |
15.2.3 Grafisches Workflow-Protokoll | 435 |
Abb. 15–13 Grafisches Workflow-Protokoll | 435 |
15.2.4 Anzeigen, Ändern und Beenden von Workitems | 435 |
Abb. 15–14 Technische Workitem-Anzeige | 436 |
15.2.5 Testen der Fristverletzung an Ereignisempfängern | 436 |
Abb. 15–15 Ereignisempfänger mit Frist | 437 |
Abb. 15–16 Ereignisempfänger ändern | 437 |
Abb. 15–17 Ändern: Frist (LED = Latest End Date) | 438 |
15.3 Debug-Report für Batch-Workitems | 438 |
15.3.1 Notwendigkeit | 438 |
Fehlersuche in Batch- Workitems ist kompliziert. | 438 |
15.3.2 Anwendung | 439 |
Abb. 15–18 Debug-Report: Parametereingabe beim Starten | 439 |
Abb. 15–19 Debug-Report: Anzeigen bzw. Ändern von Containerwerten | 439 |
Abb. 15–20 Debug-Report: Breakpunkt in einer Hintergrundmethode | 440 |
15.3.3 Quelltext des Reports ZAO_DEBUGWI | 440 |
Listing 15–1 Report zum Debuggen eines Batch-Workitems | 441 |
15.4 Hintergrundschritte im Status STARTED | 442 |
15.4.1 Dump-Analyse | 442 |
Abb. 15–21 ST22: ABAP-Laufzeitfehler: Einstiegsbild | 442 |
Abb. 15–22 ST22: ABAP-Laufzeitfehler: Liste | 443 |
Abb. 15–23 ST22: ABAP-Laufzeitfehler: Langtext zu einem Laufzeitfehler | 443 |
Abb. 15–24 Ermitteln des verursachenden Workitems | 443 |
Abb. 15–25 Workitem in den ausgewählten Variablen | 444 |
15.4.2 Wiederanstarten nach Fehlerkorrektur | 444 |
15.5 Nützliche Hilfsprogramme | 444 |
15.5.1 Container-Update | 444 |
Listing 15–2 Programm zum Ändern des Containers eines Workitems | 444 |
15.5.2 SBE fortsetzen mit Simulation der Auswahl | 445 |
Listing 15–3 Beenden eines Dialog- Workitems mit Ergebniswert | 446 |
15.5.3 Benutzer an Dialog-Workitems ändern | 446 |
Listing 15–4 Ersetzen eines alten durch einen neuen Benutzer an einem Workitem | 447 |
15.5.4 Ultima Ratio nach 22 Uhr | 448 |
Listing 15–5 Programmieren auf geschlossenen Systemen | 449 |
Abb. 15–26 Dynamisches Programm erzeugen | 451 |
Abb. 15–27 Dynamisch erzeugtes Programm – Syntaxcheck | 451 |
Abb. 15–28 Dynamisch erzeugtes Programm liefert Output. | 452 |
Listing 15–6 Programm ändern mit dynamischem Programm | 452 |
15.6 Up- und Download von Workflow-Mustern | 452 |
15.6.1 Problematik | 452 |
Vollständiger XML-Download für Workflows fehlt. | 452 |
15.6.2 Noch kein SAPlink-Plug-in für Workflows | 453 |
Abb. 15–29 SAPlink-Seite im SAP Community Network | 453 |
15.6.3 Up- und Download von Klassen im XML-Format | 454 |
XML-Upload und Download für Klassen | 454 |
15.6.4 Up- und Download von Workflow-Mustern als XML | 454 |
Abb. 15–30 Ausschnitt aus einer XML-Datei für ein Workflow-Muster | 455 |
15.7 Workflow-Transporte | 456 |
Abb. 15–31 Fehler beim Workflow-Transport | 456 |
16 Workflow-Administration | 457 |
16.1 Aufgabe und Festlegung der Administratoren | 457 |
16.1.1 Allgemeine Aufgaben des Workflow-Administrators | 457 |
16.1.2 Customizing verifizieren | 458 |
Abb. 16–1 Workflow-Customizing | 458 |
16.1.3 Workflow-Administrator global einstellen | 459 |
Abb. 16–2 Globalen Workflow- Administrator pflegen | 459 |
16.1.4 Workflow-Administrator pro Workflow-Definition | 459 |
16.2 Batchjobs konfigurieren und einplanen | 460 |
Abb. 16–3 Workflow-Administrator pro Workflow pflegen | 460 |
16.2.1 Terminüberwachung | 460 |
Abb. 16–4 Hintergrundjob für Terminüberwachung konfigurieren und einplanen | 460 |
16.2.2 Workitem-Fehlerüberwachung | 461 |
Abb. 16–5 Hintergrundjob zum Anstarten fehlerhafter Workitems konfigurieren | 461 |
16.2.3 Bedingungsauswertung | 461 |
16.3 E-Mail-Notification für SAP-Gelegenheitsbenutzer | 462 |
16.3.1 Pflege der E-Mail-Adresse für das Weiterleiten | 462 |
Abb. 16–6 E-Mail-Adresse zum Weiterleiten einstellen | 462 |
16.3.2 Pflege der persönlichen E-Mail-Adresse in den Benutzerdaten | 462 |
16.3.3 Erzeugen von E-Mails zu neuen Workitems | 463 |
Abb. 16–7 Pflege der E-Mail-Adresse in den Benutzerstammdaten | 463 |
RSWUWFML für E-Mail-Notification | 463 |
16.3.4 Versenden der Internetmails über SAPconnect | 465 |
Mailversand mit SAPconnect | 465 |
Abb. 16–8 SAPconnect- Administration (TA SCOT) | 465 |
Abb. 16–9 Sendevorgänge SAPconnect (TA SOST) | 466 |
16.4 Reaktion auf Fehlermeldungen des Laufzeitsystems | 466 |
Abb. 16–10 Mail an den Administrator über einen Workflow-Fehler | 466 |
Abb. 16–11 Workflow-Protokoll zur Fehlermeldung | 467 |
16.5 Typische Workflow-Fehler und ihre Behebung | 467 |
16.5.1 Workitems ohne Bearbeiter | 467 |
16.5.2 Workitems mit Terminüberschreitungen | 468 |
16.5.3 Diagnose fehlerhafter Workitems | 468 |
Abb. 16–12 Diagnose fehlerhafter Workitems | 468 |
Abb. 16–13 Fehlermeldung zu einer Zeile des Diagnosereports | 469 |
16.5.4 Laufzeitpuffer synchronisieren | 469 |
WICHTIG: TA SWU_OBUF | 469 |
16.6 Restarten unterbrochener Workflows | 470 |
16.6.1 Restart fehlerhafter Workflows | 470 |
16.6.2 Restart nach Systemabsturz oder Schrittdump | 470 |
Abb. 16–14 Workflows fortsetzen nach Systemabsturz/ Kurzdump, Selektionsbild | 470 |
16.7 Analysen | 471 |
Abb. 16–15 Workflows fortsetzen nach Systemabsturz/ Kurzdump, Ergebnis | 471 |
16.7.1 Workitems pro Aufgabe | 471 |
Abb. 16–16 Aufgabenanalyse | 471 |
16.7.2 Workitems nach Bearbeitungsdauer | 472 |
Sicht Schwellenwerte | 472 |
Abb. 16–17 Bearbeitungsdauern von Aufgaben, Sicht Schwellenwerte | 472 |
Sicht Mittelwerte | 472 |
16.7.3 Workload-Analyse | 473 |
Abb. 16–18 Bearbeitungsdauern von Aufgaben, Sicht Mittelwerte | 473 |
Abb. 16–19 Workload-Analyse für einen Bearbeiter | 473 |
Workload für vergangene Arbeitsbelastung | 474 |
Abb. 16–20 Workload-Analyse: Arbeitsbelastung in der Vergangenheit (Übersicht über alle Aufgaben) | 474 |
Workload für zukünftige Arbeitsbelastung | 474 |
Abb. 16–21 Workload-Analyse: Arbeitsbelastung in der Zukunft | 474 |
16.8 Reorganisation der Laufzeitdaten | 475 |
16.8.1 Allgemeines | 475 |
Workitems werden selten archiviert. | 475 |
16.8.2 Auslastung der Workflow-Laufzeittabellen | 475 |
Tab. 16–1 Speicherplatzintensive Laufzeittabellen des Workflow-Systems | 475 |
XML ist extrem speicherintensiv. | 475 |
16.8.3 Gezieltes Löschen von einzelnen Workflows | 476 |
16.8.4 Löschen von Workflows im Batch | 476 |
Abb. 16–22 RSWWWIDE, gestartet am 13.01.2003, mit dynamischer Selektions- option für die Erzeugungs- zeit im Intervall (Heute -100 d, Heute -30 d) | 477 |
Abb. 16–23 Anlegen der Variante V_100_30 | 478 |
Abb. 16–24 Variantenvariablen V_100_30 | 479 |
Abb. 16–25 Berechnungsalgorithmus wählen | 479 |
Abb. 16–26 Eingabe der Offsetwerte für SY-DATUM | 480 |
16.8.5 Archivieren von Workflows im Batch | 480 |
Abb. 16–27 Einstiegsbild der Transaktion SWW_SARA | 480 |
Abb. 16–28 Variante für Archivierungslauf festlegen | 481 |
Abb. 16–29 Jobübersicht WORKITEM- Archivierung | 482 |
16.9 Transportieren von Workflows | 483 |
A Die alte Welt – BOR-Objekte im Workflow | 485 |
A.1 Historisches | 485 |
A.2 Anlegen eines neuen Objekttyps | 486 |
Abb. A–1 Grunddaten des neuen Objekttyps | 486 |
A.2.1 Die Objektliste mit ihren Bestandteilen | 487 |
Abb. A–2 Liste des Objekttyps ZVERTRAG mit seinen Bestandteilen | 488 |
Tab. A–1 Liste des Objekttyps ZVERTRAG mit seinen Bestandteilen | 488 |
A.2.2 Programm des Objekttyps als Subroutinenpool | 489 |
Listing A–1 Generierter Programmkopf des BOR-OT ZVERTRAG | 489 |
A.2.3 Interface | 490 |
Abb. A–3 Interface IFSAP mit SubInterface IFEXIST und IFDISPL | 490 |
Listing A–2 Methode EXISTENCECHECK des BOR-OT ZVERTRAG | 491 |
A.2.4 Freigeben von Objekttyp und Komponenten | 491 |
A.3 Attribute | 492 |
A.3.1 Datenbankattribute mit GET_TABLE_PROPERTY | 492 |
Datenbankattribute entsprechen Tabellenspalten. | 492 |
Abb. A–4 Anlegen des Datenbankattributes STATUS | 492 |
Abb. A–5 Einmaliges Generieren des Codes für alle DB-Attribute (Tabellenzugriff) | 493 |
Listing A–3 Programm des BOR-OT ZVERTRAG mit Zugriffsroutinen für Tabelleneigenschaften | 493 |
A.3.2 Objektreferenzen und Makros für den Objektzugriff | 495 |
Abb. A–6 Zweites DB-Attribut im Status modelliert | 495 |
Tab. A–2 Struktur für Laufzeitobjektreferenz SWC_OBJECT | 495 |
Makros für Objektzugriff | 496 |
SELF-Referenz | 497 |
Persistente Objektreferenzen | 497 |
Tab. A–3 Struktur für persistente Objektreferenz SWOTOBJID | 497 |
A.3.3 Implementierung und Aufruf virtueller Attribute | 497 |
Virtuelle Attribute enthalten Code. | 497 |
Listing A–4 Coderahmen für virtuelles Attribut | 498 |
Virtuelles Defaultattribut | 498 |
Abb. A–7 Virtuelles Defaultattribut | 498 |
Listing A–5 Generierte Defaultvariable im Programmcode | 499 |
Listing A–6 Defaultattribut mit SELF-Zugriff | 499 |
Liste von Vertragsreferenzen als virtuelles Attribut | 499 |
Abb. A–8 Virtuelles Attribut liefert Liste von Objektreferenzen. | 499 |
Listing A–7 Generierte Variable für mehrzeiliges, virtuelles Attribut | 500 |
Listing A–8 Generierter Code des virtuellen Attributes VERTRAGSLISTEPERSON | 500 |
Listing A–9 Makro GET_PROPERTY | 500 |
Listing A–10 Programmcode für mehrzeiliges, virtuelles Attribut | 501 |
Abb. A–9 Virtuelles Attribut VertragsListePerson | 501 |
A.4 Implementierung und Aufruf von Methoden | 502 |
Anwendungsfunktionen sind nur über Methoden aufrufbar. | 502 |
Abb. A–10 Definition einer neuen Methode | 502 |
Tab. A–4 Klassifizierung unterschiedlicher Methodentypen | 504 |
Listing A–11 Coderahmen für Methoden | 504 |
Generierung einer Methode | 504 |
A.4.1 Synchrone Anzeigemethode als Defaultmethode | 505 |
Listing A–12 Anzeigemethode für Verträge | 505 |
Abb. A–11 Grunddaten/Defaults des OT Z_VERTRAG | 506 |
A.4.2 Synchrone Dialogmethode mit Ergebnisparameter | 506 |
Festwerte am Ergebnisparameter steuern den Workflow. | 506 |
Abb. A–12 Methode GENEHMIGEN mit Rückgabewert STATUS | 507 |
Abb. A–13 Domänenfestwerte des Ergebnistyps ZVERTRAG-STATUS | 507 |
Listing A–13 Genehmigungsmethode mit Ergebnisparameter | 508 |
Abb. A–14 EXIT_CANCELLED löst Ausnahme 8017 aus | 508 |
A.4.3 Synchrone Hintergrundmethode mit Parametern | 509 |
Abb. A–15 Definition eines mehrzeiligen Importparameters | 509 |
Abb. A–16 Hintergrundmethode mit Import- und Exportparametern | 509 |
Hintergrundmethode mit Import- und Exportparametern | 509 |
Listing A–14 Methode mit mehreren Parametern | 510 |
A.4.4 Asynchrone Dialogmethode ohne alles | 510 |
Asynchrone Methoden müssen Endeereignisse haben. | 511 |
A.4.5 Methoden mit Ausnahmen | 511 |
Abb. A–17 Definition einer Ausnahme an einer Methode | 511 |
Listing A–15 Ausnahmen auslösen mit Makro EXIT_RETURN | 512 |
Abb. A–18 Pop-up zur Anzeige einer aufgetretenen Ausnahme im Methodentest | 512 |
Tab. A–5 Vordefinierte Ausnahmen | 512 |
Ausnahmen und Exportparameter | 512 |
A.4.6 Überdefinieren von Methoden | 513 |
A.5 Ereignisse | 513 |
Abb. A–19 Anlegen eines Ereignisses am Objekttyp | 513 |
A.6 Prüfen und Testen einer Objektimplementierung | 514 |
Abb. A–20 Testen eines Objekttyps | 515 |
Abb. A–21 Eingabe der Importparameter beim Test einer Dialogmethode | 515 |
Abb. A–22 Testergebnisse der Methode RP_PRO_INTERVALL | 516 |
A.7 Vererbung und Delegation | 516 |
A.7.1 Vererbung und Delegation im BOR | 516 |
Abb. A–23 Von ISUSWITCHD abgeleiteter Sub-OT ZVMKSWITCH | 518 |
Abb. A–24 Delegation von ISUSWITCHD nach ZVMKSWITCH | 518 |
A.7.2 Vererbung und keine Delegation für ABAP-Klassen | 519 |
A.7.3 Ereignisbehandlung bei Vererbung und Delegation | 519 |
A.8 Standardisierte Schnittstellen – Container | 520 |
A.8.1 Container in Programmen – Include | 521 |
Containerstruktur SWCONT | 521 |
Tab. A–6 Struktur der internen Containertabelle | 521 |
Makros für Containerzugriff anlegen und freigeben | 521 |
Anlegen und Löschen von Elementen | 521 |
Setzen von Werten | 522 |
Setzen von Tabellen | 522 |
Lesen von Werten | 522 |
Lesen von Tabellen | 522 |
Listing A–16 Arbeiten mit BOR-Containern | 523 |
A.8.2 Persistente Instanzen von Containern | 525 |
Abb. A–25 Output des Programms ZAO_BOR_CONTAINER | 525 |
A.8.3 Container im Workflow | 526 |
A.9 Spezielle Objekttypen | 527 |
Tab. A–7 Spezielle Objekttypen | 527 |
Literatur | 529 |
Ginger Gatling et al. Workflow Management mit SAP (2. Auflage) Galileo Press, Bonn, 2010 | 529 |
Ulrich Mende Workflow und Archive-Link mit SAP dpunkt.verlag, Heidelberg, 2004 | 529 |
Ilja-Daniel Werner Workflow-Entwicklung mit ABAP Galileo Press, Bonn, 2011 | 529 |
Horst Keller, Sascha Krüger ABAP Objects (3. Auflage) Galileo Press, Bonn, 2006 | 529 |
Inhalt des Downloadbereiches | 531 |
Abkürzungsverzeichnis | 535 |
Index | 537 |