Best Practice Leitfaden Development
Transcription
Best Practice Leitfaden Development
Best Practice Leitfaden Development Praxistipps rund um das Thema ABAP Development Deutschsprachige SAP-Anwendergruppe e.V. DSAG-Arbeitskreis SAP NetWeaver Development Stand 31. Januar 2013 2 Best Practice Leitfaden Development Praxistipps rund um das Thema ABAP Development Version 0.11 Stand 31. Januar 2013 DSAG e. V. Deutschsprachige SAP-Anwendergruppe Autoren > Peter Lintner, Senior Consultant, Allgemeines Rechenzentrum GmbH Steffen Pietsch, Vice President, IBSolution GmbH > > Markus Theilen, IT-Koordinator, EWE AG > Jürgen Wachter, Process Coordinator Development, comgroup GmbH > Michael Werner, SAP Anwendungsberater (Inhouse), LTS AG Andernach >Andreas Wiegenstein, Managing Director und Chief Technology Officer (CTO), Virtual Forge GmbH Weitere Informationen zu den Autoren finden Sie auf Seite 57. © Copyright 2013 DSAG e.V. HINWEIS: Die vorliegende Publikation ist urheberrechtlich geschützt (Copyright). Alle Rechte liegen, soweit nicht ausdrücklich anders gekennzeichnet bei: DEUTSCHSPRACHIGE SAP® ANWENDERGRUPPE E.V. Altrottstraße 34 a 69190 Walldorf Deutschland Tel.:06227 - 35809 58 Fax:06227 - 35809 59 E-Mail: info@dsag.de Internet: www.dsag.de Jedwede unerlaubte Verwendung ist nicht gestattet. Dies gilt insbesondere für die Vervielfältigung, Bearbeitung, Verbreitung, Übersetzung oder die Verwendung in elektronischen Systemen / digitalen Medien. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 3 4 Inhaltsverzeichnis 1Einleitung 7 1.1Motivation 7 1.2Positionierung 7 2Programmierrichtlinien 8 2.1Namenskonvention 8 2.2Namensraum 8 2.3Einheitlicher und lesbarer Quellcode: Pretty Printer 2.4Obsolete Anweisungen 12 9 2.5Syntax-Check und Code Inspector 12 2.6 Feste Codierung: Keine „magic numbers“ 13 2.7Tipps beim Arbeiten mit Transporten 13 2.8 Berechtigungsprüfung im Quellcode 14 2.9 Programmiermodell: objektorientiert vs. prozedural 14 2.10 Weitere Quellen (Programmierrichtlinien/ABAP) 14 3Performance 15 3.1Vermeidungsprinzip 15 3.2 Vorhandene Werkzeuge nutzen 15 3.3 Performance-Optimierungen nur an kritischen und relevanten Stellen 16 3.4Datenmodell und Datenzugriff 16 3.4.1Datenmodell und Indizes 16 3.4.2Rahmenbedingungen bei Datenbankzugriffen 17 3.4.3Datenbankzugriffe 18 3.5Interne Tabellen und Referenzen 19 3.5.1Feldsymbole 21 3.5.2Parameterübergabe 21 3.6 Weiterführende Quellen 21 4Robustheit 22 4.1Fehlerbehandlung 22 4.1.1SY(ST)-SUBRC-Prüfungen 22 4.1.2MESSAGE-Anweisung 23 4.1.3Klassenbasierte Ausnahmen 23 4.1.4Nicht behandelbare Ausnahmen 24 4.2 Korrekte Implementierung von Datenbank-Änderungen 24 4.2.1Sperrobjekte 24 4.2.2Verbuchungskonzept 24 4.3Protokollierung 26 4.4Praxisbeispiele 26 4.4.1Unvollständige Fallunterscheidungen 26 4.4.2Wichtige sonstige SY(ST)-SUBRC-Prüfungen 27 4.5 Weiterführende Quellen 27 5ABAP-Sicherheit und Compliance 28 28 5.1 Prüfungsrelevante Sicherheitsmechanismen im SAP-Standard 5.1.1Berechtigungsprüfung (A) 28 5.1.2Mandantentrennung (B) 28 5.1.3Nachvollziehbarkeit (C) 29 5.1.4Dreisystemlandschaft (D) 29 5.1.5Kontrollierte Ausführung von Betriebssystemkommandos (E) 29 5.1.6Kontrollierte Ausführung von SQL-Befehlen (F) 29 5.2Sicherheitsschwachstellen 30 31 5.3 Compliance-Probleme durch ABAP 5.4Testwerkzeuge 32 33 5.5 Weiterführende Quellen 6Dokumentation 34 6.1Dokumentation unabhängig von Entwicklungsobjekten 34 6.2Dokumentation von Entwicklungsobjekten 35 6.3Dokumentation im Quelltext 35 6.3.1Dokumentation und Kommentierung von Anweisungen/Anweisungsblöcken 35 6.3.2Dokumentation von Änderungen 36 6.3.3Programmkopf 36 7Umsetzbarkeit und Durchsetzbarkeit 38 7.1Umsetzbarkeit 38 7.1.1Motivation für einen Prozess 38 7.1.2Erstellung und Pflege des Prozesses 39 7.2Durchsetzbarkeit 40 7.2.1Manuelle Prüfungen 40 7.2.2Automatische Prüfungen 41 7.2.3Werkzeuge 42 7.3Erfahrungen und Tipps aus der Praxis 42 7.3.1Qualitätssicherung des Quellcodes 42 7.3.2Zeit und Budget QA 43 7.3.3Probleme 43 7.3.4Entscheidungsfindung bei Modifikationen 44 7.3.5Erfahrungsbericht aus der Praxis: Comgroup GmbH 44 Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 5 6 Inhaltsverzeichnis 8Infrastruktur und Lifecycle Management 46 8.1Infrastruktur 46 8.1.1Sandbox 46 8.1.2Entwicklungssystem 46 8.1.3Qualitätssicherungssystem 46 8.1.4Produktion 47 8.1.5Transportwesen 47 8.1.6Rückbau von Neuentwicklungen 48 8.1.7Sicherstellung der Konsistenz von Neuentwicklungen/Erweiterungen 48 8.2 Change Management 49 8.3Softwarewartbarkeit 52 8.4Anpassungen der SAP-Funktionalität 52 8.5Testbarkeit von Anwendungen 55 9Die Autoren 57 10Anhang: Namenskonventionen 58 10.1Allgemeine Namenskonventionen 58 10.2Attribute 59 10.3Methoden 60 10.4Signatur von Methoden 60 10.5Funktionsgruppen und -bausteine 60 10.6Enhancements 61 10.7Formulare 61 10.8Jobs 61 10.9Datenelemente 62 7 SAP-Software zeichnet sich als Standardsoftware durch ein hohes Maß an Flexibilität und Erweiterbarkeit aus. In nahezu allen Unternehmen, die SAP-Software einsetzen, finden sich kundenspezifische Anpassungen und Ergänzungen. Die SAP-Software unterliegt damit sowohl auf Herstellerals auch auf Kundenseite der kontinuierlichen Anpassung und Erweiterung an sich wandelnde Kundenbedürfnisse. Das hohe Maß an Flexibilität und Erweiterbarkeit von SAP-Software bringt Vor- und Nachteile mit sich: Die Software kann optimal an kundenspezifische Anforderungen angepasst und damit die Wertschöpfung durch den Einsatz deutlich gesteigert werden. Zeitgleich birgt die Erweiterbarkeit das Risiko kundenspezifischer Entwicklungen, die komplex, aufwendig wartbar und fehleranfällig sind. Das Ziel dieses Dokuments ist es, Praxistipps und Denkanstöße zu liefern, um kundenspezifische Entwicklungen wartbar und effizient zu gestalten. 1.1Motivation Die Arbeit der Deutschsprachigen SAP-Anwendergruppe e.V. (DSAG) fußt auf drei Säulen – Wissensvorsprung, Einflussnahme und Netzwerk. Das vorliegende Dokument wurde von Mitgliedern des DSAG-Arbeitskreises SAP NetWeaver Development initiiert und adressiert die erste Säule und damit den Wissensvorsprung für Anwender und Partner. Als Autorenteam ist es unser Anliegen, das in den Unternehmen verteilt und implizit vorliegende Wissen zum Thema Entwicklung in einem kompakten Dokument anderen DSAG-Mitgliedern zur Verfügung zu stellen. Unser Wunsch ist, dass dieses Dokument „lebt“ und mit Ihrem Erfahrungsschatz einer kontinuierlichen Verbesserung unterliegt. Wir freuen uns auf Ihr Feedback (am besten per E-Mail an handlungsempfehlung@dsag.de)! 1.2Positionierung Es existieren bereits von der SAP und einer ganzen Reihe von Fachverlagen sehr gute Publikationen zu Anwendungsentwicklung und Erweiterung der SAP-Plattform. Insbesondere haben auch Autoren der SAP mit dem Buch „ABAP-Programmierrichtlinien“, SAP Press 2009 bereits einen Vorstoß in Richtung von Empfehlungen unternommen, die über reine Beschreibungen der Sprache ABAP und der zugehörigen Werkzeuge hinausgehen. Der Mehrwert dieses Dokuments liegt in der Zusammenfassung bewährter Vorgehensweisen, Praxistipps und erprobter Regelwerke aus den Anwenderunternehmen. Diese Guideline soll Ihnen als Anwender, Entwickler, Entwicklungs-, Projekt- oder IT-Leiter Anregungen und Hilfestellung geben, um „das Rad nicht immer wieder neu erfinden zu müssen“, sondern auf die Erfahrungen anderer aufbauen zu können. Dabei erheben die in dieser Guideline vorgestellten Empfehlungen nicht den Anspruch auf Vollständigkeit oder absolute Verallgemeinerung, sondern stellen eine Auswahl von Praxistipps dar. Als Autorenteam haben wir uns darum bemüht, im Spannungsfeld zwischen Überblickswissen und Detailtiefe den richtigen Mix zu finden. Daher verweisen wir an entsprechenden Stellen auf weiterführende Quellen, um nicht ausführlich diskutierte Themen redundant wiederzugeben. Die erste Auflage dieser Guideline ist auf den Bereich ABAP-Entwicklung fokussiert. Bei entsprechendem Feedback und Ihrer aktiven Unterstützung kann der Fokus auf die JAVA-Entwicklung und weitere Themen ausgeweitet werden. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 1einleitung 8 2Programmierrichtlinien Dieses Kapitel beschreibt erprobte und empfohlene Programmierrichtlinien für Anwendungen, die mit Hilfe der Programmiersprache ABAP erstellt werden. Es wird beschrieben, wie mit StandardSAP-Mitteln und Disziplin sauber lesbarer und verständlicher ABAP Code entwickelt werden kann. Dies erleichtert die Wartung des Codes bzw. ermöglicht, dass verschiedene interne und externe Personen effizient an der (Weiter-) Entwicklung und Wartung eines Programms zusammenarbeiten. 2.1Namenskonvention Namenskonventionen beschreiben die einheitliche und verbindliche Vorgabe zur Benennung von Softwareobjekten (z.B. Klassen, Funktionsbausteinen) bzw. zur Benennung von Objekten im Quellcode (z.B. Variablen). Wir empfehlen ausdrücklich eine Namenskonvention als Richtlinie für Entwicklungen im SAPSystem vorzugeben. Das Ziel der Verwendung einer einheitlichen Namenskonvention ist die deutliche Steigerung der Wartbarkeit kundenspezifischer Anpassungen und Erweiterungen. In der Konsequenz führt dies zu geringeren Wartungsaufwänden bzw. -kosten und einer schnelleren Problemlösung im Fehlerfall. Die explizit formulierte Namenskonvention sollte Bestandteil der internen Ausbildung sein, um neue Mitarbeiter mit den Grundregeln und Unternehmensspezifika vertraut zu machen. Zudem hat es sich bewährt, diese Namenskonvention zum Vertragsgegenstand für externe Entwickler und Partnerunternehmen zu machen. Automatisierte Überprüfungen stellen die Einhaltung sicher (vgl. Kapitel 7). BEST PRACTICE: Eine exemplarische Namenskonvention als Vorlage finden Sie im Anhang. 2.2Namensraum Die Trennung von Kundenobjekten und SAP-Objekten kann über die Präfixe Y oder Z sowie über einen eigenen Namensraum erfolgen. Die Syntax lautet wie folgt: Z… Y… /<kundeneigener Namensraum>/… Der kundeneigene Namensraum kann bei SAP registriert werden und ist nach Bestätigung weltweit eindeutig und für das jeweilige Unternehmen zur Verwendung registriert. Dieses Vorgehen unterstützt bei der konfliktfreien Vergabe von Namen für Softwareobjekte. Der Vorteil des kundeneigenen Namensraums liegt in der garantierten Überschneidungsfreiheit beim Import fremder Objekte in das eigene SAP-System (z.B. beim Einsatz von Fremdanwendungen, die per Transportauftrag eingespielt werden) und bei Zusammenführungen von SAP Systemen im Rahmen einer Post-Merger Integration. Durch die Reservierung des Namensraums ist sichergestellt, dass auf keinem fremden, d.h. nicht registrierten System ein Softwareobjekt mit dem gleichen Präfix erstellt werden kann. Der Nachteil bei der Verwendung des kundeneigenen Namensraums liegt darin, dass durch die durchgängige Verwendung des Präfixes bereits mehrere Zeichen „verbraucht“ werden. Dies kann insbesondere bei Objekten, die nur wenige Zeichen zur Benennung bieten, zu Schwierigkeiten führen. Darüber hinaus unterstützen nicht alle Objekttypen, z.B. Berechtigungsobjekte, die Verwendung von Namensräumen. BEST PRACTICE: Wir empfehlen ausdrücklich die Verwendung eines kundeneigenen Namensraums. WEITERE QUELLEN: 1. http://help.sap.com (Namensraum einrichten) 2. Best-Built Applications: http://scn.sap.com/community/best-built-applications 2.3Einheitlicher und lesbarer Quellcode: Pretty Printer Übersichtlicher, leserlicher Code erleichtert jedem Entwickler die (erneute) Einarbeitung in Quellcode. Als einfachste und schnellste Möglichkeit, um Code gut lesbar zu machen und zu halten, kann der Pretty Printer aus der ABAP-Entwicklungsumgebung genutzt werden. Mit einem einzigen Knopfdruck wird der ausgewählte Quelltext einheitlich formatiert. Er bietet verschiedene Möglichkeiten, die über die Einstellungen der Workbench konfigurierbar sind. Bereits eine eingerückte Darstellung macht Source Code deutlich lesbarer. Es wird empfohlen, Schlüsselwörter groß darzustellen. Denn dadurch kann man Quelltext auch in ausgedruckter Form und ohne Syntaxeinfärbung noch leicht verstehen. Der Pretty Printer ermöglicht auf einfachem Weg die Erstellung von einheitlichem Quellcode trotz unterschiedlicher Entwickler. Um die Lesbarkeit des Quelltextes zu erhöhen, empfehlen wir, auf mehrere Anweisungen in einer Codezeile zu verzichten. Wir empfehlen, die Option „Standardkommentare einfügen“ zu deaktivieren, da die erzeugten Kommentare bei Änderungen nicht automatisch angepasst werden und redundante Informationen enthalten. BEST PRACTICE: Wir empfehlen, den Pretty Printer zu verwenden und die Einstellungen als einheitliche Vorgabe zu definieren. Modularisierung Programme, in denen logische Verarbeitungseinheiten nicht aufgeteilt werden, sind in weiterer Folge schwer lesbar und damit schwer wart- und erweiterbar. Eine Modularisierungseinheit (Form-Routine, Methode, Funktionsbaustein) soll logisch zusammengehörende Anweisungen zusammenfassen, dabei ist jedoch zu beachten, dass die einzelnen Einheiten nicht triviale Funktionalitäten abdecken. Modularisierungseinheiten mit sehr wenigen Anweisungen sind jedoch zu vermeiden. Die Modularisierung dient dazu, trotz Komplexität in der Aufgabenstellung, den Programmcode übersichtlich zu gestalten. Zudem sind Programmabschnitte mit derselben Logik zu vermeiden. Für die praktische Umsetzung kann es hilfreich sein, vor Beginn des Programmierens die ersten Codezeilen mittels Kommentaren in logische Blöcke aufzuteilen und erst anschließend auszuprogrammieren. Wo es möglich und sinnvoll ist, ist es ratsam, vom prozeduralen Programmiermodell auf objektorientierte Programmierung überzugehen, um zukunftssicher zu entwickeln und Objekte zu kapseln. Insbesondere bei neuen Projekten sollte nur noch objektorientiert entwickelt werden. Im Rahmen der Einführung von ABAP Objects fand eine Bereinigung der Sprache und Vereinheitlichung der Konstrukte statt. Die Verwendung von ABAP Objects führt damit zu einer Steigerung der Wartbarkeit. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 9 10 2Programmierrichtlinien Trennung von Präsentations- und Anwendungslogik In allen Programmen sollte stets eine Trennung von Präsentations- und Anwendungslogik erfolgen. Dies erlaubt es, Ergebnisse und Funktionen der Anwendungslogik durch verschiedene UIs (User Interfaces) dem Benutzer anzuzeigen sowie über eine einheitliche Schnittstelle anderen Systemen bereitzustellen. Diese Aussage ist für alle gängigen UI-Technologien gültig, wobei der Grad der Unterstützung bzw. Einhaltung dieser logischen Trennung unterschiedlich ist. In einer WebDynpro ABAP-Realisierung ist schon vom Framework eine Trennung zwischen Modell- und UI-Logik vorgesehen. Bei klassischen Dynpros und BSPs wird die Trennung nicht in gleicher Weise forciert, aber grundsätzlich kann und sollte die Trennung auch in diesen Umgebungen umgesetzt werden. Allerdings gibt es hierfür keine technische Prüfung im Gegensatz zu WebDynpro, wo entsprechende Prüfungen im Code Inspector realisiert sind. Ein typisches Beispiel für eine klare Trennung von Anwendungslogik und UI sind Plausibilisierungsregeln. Wenn die Plausibilisierung von Eingaben in einer bestimmten UI-Technologie entwickelt wird, müssen diese Prüfungen bei einem Wechsel auf eine andere UI-Technologie neu entwickelt werden. Um dies zu vermeiden, müssen die Funktionen zur Prüfung von Eingaben oder Parametern unabhängig von der verwendeten UI erstellt und gepflegt werden. Internationalisierung Sprachabhängige Texte in Programmen dürfen nicht „hart codiert“ werden, sondern müssen in Textelementen (Programmtexte, Klassentexte, Online-Text-Repository [OTR]), Standardtexten oder Nachrichtenklassen hinterlegt werden. Da alle Eigenentwicklungen den Anspruch haben sollten, weltweit eingesetzt zu werden, sollten die wichtigsten Sprachen übersetzt werden. Zudem müssen sprachabhängige (customizebare) Texte in eigenen Texttabellen abgelegt werden. Diese Texttabelle besitzt dieselben Schlüsselattribute wie die eigentliche Customizing-Tabelle. Zusätzlich muss das erste Schlüsselattribut nach dem Mandantenfeld das Sprachenattribut sein (Datenelement SPRSL oder SPRAS). Zudem muss die Fremdschlüsselbeziehung als jene der Texttabelle gekennzeichnet werden. BEST PRACTICE: Wir empfehlen, den Code Inspector für die Suche nach nicht übersetzbaren Texten zu verwenden. BEST PRACTICE: Um spätere Übersetzungen einfach zu gestalten, sollte die Länge der Feldbezeichner und Textelemente möglichst lang gewählt werden. Als Faustregel für die Länge von Textelementen hat sich bewährt, die 1,5-fache Länge der nativen Beschreibung vorzusehen. Dynamische Programmierung In der „klassischen“, statischen Entwicklung werden Entwicklungsobjekte und der Quellcode zur Designzeit definiert und im SAP-System statisch hinterlegt. Zur Laufzeit wird der vorgegebene Programmcode ausgeführt. Im Gegensatz dazu ermöglicht die dynamische Programmierung die Flexibilisierung des Quellcodes. Folgendes Beispiel verdeutlicht die dynamische Programmierung: Im Programmcode wird der Name einer aufzurufenden ABAP-Klasse nicht statisch hinterlegt, sondern es wird zur Laufzeit die Klasseninstanz aufgerufen, deren Name durch den Inhalt einer Variablen definiert ist. Dieser Name kann z.B. aufgrund von Benutzereingaben variieren. Der Vorteil dieser Methodik liegt in der gesteigerten Flexibilität. Der Nachteil liegt in der signifikant steigenden Komplexität und insbesondere in den damit einhergehenden Sicherheitsrisiken. Vorteil: >Deutliche Steigerung der Flexibilität > Beispiel 1: Eigener Aufbau von User Exits Durch die statische Definition einer abstrakten Klasse inkl. Methodensignatur wird das Grund gerüst für einen „User Exit“ vorgegeben. Anschließend können mehrere konkrete Impleme tierungen dieser abstrakten Klasse angelegt werden. Innerhalb Quellcodes wird z.B. a us einer Customizing-Tabelle der Name der zu verwendenden konkreten Klassenimplementierung gelesen und diese aufgerufen. Somit können unterschiedliche Implementierungsvarianten per Customizing aktiviert/deaktiviert werden. > Beispiel 2: Dynamische WHERE-Bedingung Zur Laufzeit wird die WHERE-Bedingung für eine Datenbankoperation, z.B. SELECT, in einer String-Variablen erstellt. Dadurch können komplizierte CASE-Abfragen vermieden werden, die abhängig von den Eingaben verschiedene OSQL-Befehle ausführen. Nachteil: >Durch die Nutzung von dynamischen Aufrufen geht der Verwendungsnachweis innerhalb der ABAP- Entwicklungsumgebung verloren. Problematisch sind dann Änderungen an den Aufrufzielen. Ein Entwickler, der beispielsweise die Übergabeparameter eines Funktionsbausteins ändert, der von einem Programm dynamisch aufgerufen wird, bemerkt diese Verwendung über den Verwendungs- nachweis nicht. > Bei der dynamischen Programmierung ist i.d.R. zur Designzeit keine syntaktische Prüfung möglich; bei fehlerhafter Belegung der variablen Inhalte (z.B. fehlerhafte Klammerung innerhalb einer dynamischen WHERE-Klausel, fehlerhafter Name einer Klasse) kommt es zu einem ungeplanten Abbruch des Programms (Kurzdump). >Dynamische Programmierung birgt hohe Sicherheitsrisiken, insbesondere dann, wenn die dynamischen Inhalte durch ungeschützten Zugriff beeinflussbar sind (z.B. wenn der Name einer a ufzurufenden Klasse /eines Funktionsbausteins oder einer WHERE-Bedingung durch Benutzereingaben beein flusst werden kann, Stichwort: Code Injection). BEST PRACTICE: Dynamische Programmierung sollte nur sehr dosiert und kontrolliert zum Einsatz kommen. Programmcode, der dynamische Anteile enthält, sollte nach dem Vier-Augen-Prinzip kontrolliert und dokumentiert werden, denn er stellt ein potenzielles Sicherheitsrisiko dar. Im Kapitel 5.2 wird das Thema dynamische Programmierung auch im Kontext Sicherheit behandelt. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 11 12 2Programmierrichtlinien Auditierbarkeit von ABAP Code Es muss jederzeit möglich sein, durch manuelle Untersuchungen oder statische CodeanalyseTools den selbst geschriebenen ABAP Code auf Mängel zu untersuchen. Alle Methoden, ABAPCoding unsichtbar zu machen, sind daher unzulässig, da sie solche Untersuchungen behindern oder gar gezielt dafür verwendet werden könnten, Hintertüren in ein System zu schleusen. Verschleierter Code kann auch mit dem Debugger nicht mehr untersucht werden. Es wird an dieser Stelle explizit darauf verzichtet, die Techniken zu erläutern, mit denen Code versteckt werden kann. BEST PRACTICE: Verwenden Sie insbesondere in der Entwicklung im eigenen Unternehmen keine Techniken, um Ihren Quellcode zu verstecken. 2.4Obsolete Anweisungen Obwohl SAP eine strikte Abwärtskompatibilität vertritt, muss bei der Verwendung von obsoleten Anweisungen, wie z.B. Kopfzeilen in internen Tabellen, berücksichtigt werden, dass hierbei Probleme auftreten, wenn der Code in Klassen übernommen werden soll. Hier ist zu beachten, dass es für obsolete Sprachelemente immer modernere Alternativen gibt. Es gibt also eigentlich außer Gewohnheit wenige Gründe für deren Verwendung, deshalb sollten sie vermieden werden. BEST PRACTICE: Wir empfehlen den regelmäßigen Einsatz eines statischen Codeanalyse-Tools, um obsolete Anweisungen zu entdecken. Aus den SAP-Bordmitteln eignet sich hierzu der Code Inspector bzw. die Durchführung des Syntax-Checks. Darüber hinaus existieren sehr gute Analysewerkzeuge von Drittanbietern. 2.5Syntax-Check und Code Inspector Der Syntax-Check und der Code Inspector ermöglichen die Überprüfung des Programmcodes während der Designzeit. Bei der Freigabe von Transporten kann der Code Inspector über die SE03 global angeschaltet werden, um Fehler zu erkennen. Hierdurch kann auch die Anzahl der Transporte verringert werden, da beim Erkennen von Fehlern die Freigabe noch abgebrochen werden kann. Die Behebung kann dann in den bestehenden Auftrag aufgenommen werden und es muss kein neuer Transport erzeugt werden. BEST PRACTICE: Der Code Inspector wird im SAP-Standard nur bei Freigabe des Transportauftrags ausgeführt. Empfehlenswert ist jedenfalls die Prüfung durch den Code Inspector bereits bei der Freigabe der jeweiligen Transportaufgabe. WEITERE QUELLEN: Die Vorgehensweise der Implementierung des dafür notwendigen BAdIs ist im Buch „Praxishandbuch SAP Code Inspector“ (SAP Press) beschrieben. 2.6 Feste Codierung: Keine „Magic Numbers“ Die feste (harte) Codierung von Texten, Zahlen, User-Namen, Organisationseinheiten, Datum etc. sollte im Quelltext ausdrücklich vermieden werden. Während der Entwicklung kann die direkte Verwendung von hart codierten Werten vermeintlich als schnelle Vorgehensweise erscheinen. Auf den Gesamtlebenszyklus der Anwendung bezogen, führt sie jedoch zu deutlich erhöhten Kosten. Die Wartbarkeit und Testbarkeit der Anwendung werden langfristig deutlich erschwert. BEST PRACTICE: Wir empfehlen die Verwendung von Konstanten, die an zentraler Stelle definiert werden. Für die Konstantendefinition eignen sich z.B. die Attribute globaler Klassen bzw. Interfaces. BEST PRACTICE: Alternativ zu harten Codierungen im Quelltext können kundeneigene Customizing-Tabellen verwendet werden. In diesen Tabellen werden die Werte, z.B. Zahlen, Organisationseinheiten etc. als Konfiguration hinterlegt und bei Programmstart in eine Variable gelesen. Anschließend wird ausschließlich mit dieser Variablen gearbeitet. Die o.g. Vorgehensweisen steigern bei Mehrfachgebrauch die Konsistenz und Effizienz der Analyse im Fehlerfall bzw. bei regulären Wartungstätigkeiten. Wir empfehlen ausdrücklich die Kommentierung der Konstanten und die Bedeutung der Werte an zentraler Stelle. Um neue Mitarbeiter bei der Ermittlung von Konstanten zu unterstützen, bietet es sich an, diese entweder außerhalb des Systems durchsuchbar zu dokumentieren oder ein Suchtool (s. „Weitere Quellen“) zur Verfügung zu stellen, mit dem innerhalb des Systems nach Konstanten gesucht werden kann. 2.7Tipps beim Arbeiten mit Transporten Wenn mehrere Entwickler an einem Entwicklungsobjekt Änderungen vornehmen, kann dies unter Umständen zu Problemen führen, wenn die Transportaufträge nicht in der richtigen Reihenfolge in die produktiven Systeme transportiert werden oder andere Objekte aus anderen Transportaufträgen fehlen. BEST PRACTICE: Um dies zu vermeiden, sollte mit Transport von Kopien gearbeitet werden. Dabei werden die geänderten Entwicklungsobjekte durch den eigentlichen Transportauftrag im Entwicklungssystem gesperrt und über Transport von Kopien werden nur Kopien der Objekte in das Qualitätssicherungssystem transportiert. Ein Entwickler bemerkt sofort, dass ein anderer Entwickler ggf. das Objekt bereits bearbeitet, und kann sich mit dem anderen Entwickler abstimmen. Nach Abschluss des „Projektes“ wird nur der Original-Sperrtransport ins Produktivsystem transportiert. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 13 14 2Programmierrichtlinien 2.8 Berechtigungsprüfung im Quellcode Bei Zugriff auf Daten und auch deren Präsentation sind die dafür notwendigen Berechtigungsobjekte zu prüfen. Bei der Verwendung von Standardobjekten soll jedenfalls die Prüfung auf die entsprechenden SAP-Standard-Berechtigungsobjekte erfolgen (vereinfacht die Wartung der notwendigen Rollen). Für kundeneigene Datenobjekte können in der Regel keine SAP-StandardBerechtigungsobjekte zur Prüfung verwendet werden. Zu diesem Zweck können kundeneigene Berechtigungsobjekte implementiert und geprüft werden. Weitere Informationen finden sich im Kapitel 5.1.1 2.9 Programmiermodell: Objektorientiert vs. Prozedural Die prozedurale Entwicklung in ABAP ist inzwischen von SAP als obsolet eingestuft worden. Insbesondere die Befehle FORM…ENDFORM und PERFORM sind als obsolete Anweisungen eingestuft. Prozedurale Entwicklung hat sich im Laufe der Jahre auch im Hinblick auf globale Variablen und Includes als sehr unübersichtlich, komplex und fehleranfällig erwiesen. Objektorientierte Entwicklung wurde so konzipiert, dass logisch zusammenhängende Aufgaben einheitlich in Objekten zusammengefasst werden können. Dadurch wird unter anderem auch die Wiederverwendbarkeit von Code erhöht. Insbesondere können solche Objekte auch von anderen Entwicklern für ihre Zwecke leicht erweitert oder verändert werden, ohne dass die grundlegenden Funktionen beeinträchtigt werden (Open-Close-Prinzip). Andererseits können zentrale Funktionalitäten oder einzelne Variablen auch gezielt vor ungewünschtem Lese- oder Schreibzugriff durch aufrufende Programme geschützt werden. BEST PRACTICE: Wir empfehlen bei Neuentwicklungen möglichst nur noch mit Klassen und Methoden zu arbeiten und keine FORMs mehr zu verwenden. WEITERE QUELLEN: 1. Horst Keller und Gerd Kluger, Not Yet Using ABAP Objects? Eight Reasons Why Every ABAP Developer Should Give It a Second Look, Sap Professional Journal 2. Horst Keller and Gerd Kluger, NetWeaver Development Tools ABAP, SAP AG 3. Bertrand Meyer, Objektorientierte Softwareentwicklung, Hanser 1990, ISBN 3-446-15773-5 4. ConSea-Projekt für Suche nach Konstanten auf SAP Code Exchange: https://cw.sdn.sap.com/cw/groups/consea 2.10 Weitere Quellen (Programmierrichtlinien / ABAP) 1.SAP Dokumentation SAP NetWeaver AS ABAP Release 731 http://help.sap.com/abapdocu_731/de/index.htm In dieser Dokumentation ist dem Thema Programmierrichtlinien ein eigenes Kapitel gewidmet. 15 In den folgenden Abschnitten empfehlen wir einige Regeln, die bei der täglichen Arbeit in der ABAP-Entwicklung beachtet werden sollten, um von vorneherein Performance-Engpässe zu vermeiden. Wie an viele anderen Stellen der Softwareentwicklung hilft es auch im Hinblick auf eine ausreichende Performance zu wissen, was gemacht werden soll. Solange der Sinn und Zweck eines Code-Stückes nicht klar ist, sollte dies zuerst geklärt werden. 3.1Vermeidungsprinzip „Die sichersten, schnellsten, präzisesten, billigsten, wartbarsten, zuverlässigsten und am leichtesten zu dokumentierenden Teile eines Computersystems sind die, die man weggelassen hat.“ (Gorden Bell) BEST PRACTICE: Vermeiden Sie jegliches unnötige Coding. Frei nach diesem Motto sollten Sie auch genau prüfen, welcher Code wirklich für die Produktion gedacht ist, und sämtliche Test- und Demo-Programme spätestens auf den Q-Systemen löschen. Aber auch innerhalb von produktivem Coding sollte immer der Ansatz verfolgt werden, nicht mehr zu tun, als für die Aufgabe wirklich benötigt wird. Ein einleuchtendes Beispiel dafür ist die Regel zur Vermeidung von *-SELECTs, bei denen der Einfachheit halber alle Spalten einer Tabelle selektiert werden, obwohl für die folgende Verarbeitung im Prozess nur wenige Spalten benötigt werden. Anmerkung: Diese Vorgehensweise steigert gleichzeitig die Robustheit von Programmen. Das Lesen mit Hilfe von *-SELECT in eine kundeneigene Datenstruktur kann zu Fehlern nach einem Upgrade führen,wenn die Standardtabelle durch SAP erweitert wurde. Das explizite Lesen benötigter Spalten schützt vor dieser Unschärfe. 3.2 Vorhandene Werkzeuge nutzen Die im SAP-System bereits vorhandenen Werkzeuge bieten gute Unterstützung bei der Erstellung von performanten Anwendungen bzw. bei der Analyse von Performance-Engpässen. Diese Werkzeuge sollten frühzeitig und in allen Lebensphasen der Software angewendet werden. Die nachfolgende Tabelle bietet einen Überblick zu den zentralen Werkzeugen: Entwicklung Beschreibung Code Inspector Statische Code-Analyse und -Prüfungen SE30 / SAT Laufzeit-Traces ST05 Traces für SQL, RFC und Enqueues DB05 Wertverteilungs-Analyse für Index-Design Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 3Performance 16 3Performance Laufzeit Beschreibung SM50/SM66 Übersicht Workprozesse/Applikationsserver Debugger Schrittweises Ausführen von Coding Memory Inspector Vergleich und Analyse von Speicherabzügen zur Ermittlung von nicht Speicherverbrauch und nicht freigegebenen Heap-Objekten ST10 Tabellenaufruf-Statistiken zur Prüfung von Tabellenpufferung Post Mortem Beschreibung ST22 Analyse von Laufzeitfehlern (z.B. bei Speichermangel) STAD Workload-Analyse ST04 DB-Performance-Übersicht BEST PRACTICE: Starten Sie die Performance-Untersuchung mit einem Trace in der SE30/SAT und konzentrieren Sie sich auf den größeren Zeittreiber. Wenn die meiste Zeit im ABAP-Teil verbraucht wird, analysieren Sie weiter mit der SE30/SAT. Liegt die meiste Zeit bei den DB-Aufrufen, starten Sie einen SQL-Trace mit der ST05. 3.3 Performance-Optimierungen nur an kritischen und relevanten Stellen Auch wenn man nicht performante Konstrukte bei der Softwareentwicklung immer vermeiden sollte, sollte man sich gleichzeitig bei der Notwendigkeit von umfangreicheren Performance-Optimierungen auf die Teile der Software beschränken, die durch Messung nachgewiesenermaßen die Ursache von langer Laufzeit oder erhöhtem Speicherverbrauch sind. Auch für Performance-Aspekte trifft die 80/20-Regel zu und es gilt daher, die meistens raren Ressourcen für eine umfangreiche Verbesserung auf die 20 % des Systems zu konzentrieren, die für 80 % der Laufzeit/des Speicherverbrauchs verantwortlich sind. Um an diese Stellen zu gelangen, ist der sinnvolle Einsatz der genannten Werkzeuge essenziell. BEST PRACTICE: Wir empfehlen, die Suche nach Performance-Engpässen mit dem Einsatz der Laufzeitanalyse SE30/SAT mit voller Aggregation zu beginnen. Dadurch sollte deutlich werden, ob die Laufzeit aus der Interaktion mit der Datenbank oder der Verarbeitung der geladenen Daten im Hauptspeicher resultiert. Wichtig ist dabei, dass ein repräsentativer, praxisnaher Datenbestand verarbeitet wird, um nicht durch seltene Verarbeitungsmuster einer falschen Spur zu folgen. Wird mehr als die Hälfte der Laufzeit im DB-Teil verbraucht, sollte eine genauere Analyse der SQLKommandos mit der Transaktion ST05 erfolgen. Wird mehr Laufzeit im ABAP-Teil verbraucht, erfolgen tiefergehende Analysen mit Hilfe der SE30/SAT, wobei die Aggregationsstufen schrittweise verringert werden, um genauere Aussagen über die kritischen Programmstellen zu bekommen. Nach jedem Optimierungsschritt sollten die Ergebnisse verglichen und dokumentiert werden. 3.4Datenmodell und Datenzugriff 3.4.1Datenmodell und Indizes Der Aufbau des Datenmodells bildet die Basis performanter Anwendungen. Ein mit Augenmaß normalisiertes Datenmodell kann effizienter mit Daten und Indizes arbeiten. Hierzu finden – unabhängig von der Programmiersprache ABAP – die Normalisierungsregeln Anwendung. Beim Einsatz von Indizes für Tabellen empfehlen wir folgende Punkte: >Es sollten max. fünf Indizes pro Tabelle existieren, wenn häufig ändernd auf diese Tabellen zugegriffen wird. Mit jedem Index steigen die Verwaltungskosten, die bei Datenänderungen anfallen. > Fünf Felder pro Index sollten als Obergrenze eingehalten werden. >In einem Index sollten nur selektive Felder aufgenommen und in der Reihenfolge nach absteigender Selektivität sortiert werden. >Auf Feldebene sollten zwischen zwei Indizes einer Tabelle keine Überlappungen auftreten. > Bei mandantenabhängigen Tabellen sollte das Feld „Mandant“ als erstes Feld aufgenommen werden, insbesondere bei großen Tabellen (>1000 Einträge). Auch wenn dieses Feld nicht sonderlich selektiv ist und damit der dritten Regel widerspricht, wird bei jeder Abfrage dieses Feld in der Selektion vom SAP-System mit übergeben und ausgewertet. Gerade bei Tabellen mit stark unterschiedlichen Eintragszahlen pro Mandant kann sich ein Fehlen des Feldes im Index negativ auswirken. 3.4.2Rahmenbedingungen bei Datenbankzugriffen Folgende Fragen sollten bei DB-Zugriffen gestellt und beantwortet werden: >Sind Indizes in geeigneten Rahmen angelegt? > s. vorheriges Kapitel (3.4.1) > Lesen Anweisungen am Tabellenpuffer vorbei? Hierbei kann die Transaktion ST10 verwendet werden, um die Zugriffshäufigkeiten auf gepuffer- ten Tabellen zu überprüfen. Mit der Transaktion ST05 können mit dem kombinierten SQL- und Puffer-Trace Zugriffe ermittelt werden, die wider Erwarten den Tabellenpuffer nicht verwenden. Und mit Hilfe des Code Inspectors lassen sich viele dieser Statements bereits im Vorfeld statisch ermitteln. > Kann ein DB-Index zur Sortierung auf der DB mit ORDER BY genutzt werden? Im einfachsten Fall kann dafür der Zusatz PRIMARY KEY verwendet werden, wenn die Sortierung nach dessen Feldern erfolgen soll. Sind andere Sortierungen erforderlich, kann es helfen, einen Index anzulegen, der die gewünschten Felder in der korrekten Reihenfolge enthält. Allerdings sollten dabei die Hinweise zur Anzahl von Indizes pro Tabelle beachtet werden. Erfolgt der Zugriff mit ORDER BY nur selten, lohnt es sich in der Regel nicht, dafür einen eigenen Index anzulegen. In diesem Fall sollte die Sortierung im ABAP erfolgen, sofern dies die zu sortierende Datenmenge zulässt. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 17 18 3Performance Beispiel: Die Tabelle enthält ein Belegdatum und es sollen die letzten n Belege sortiert nach diesem Datum ermittelt werden. In diesem Fall würde sich ein Index über dieses Feld wahr- scheinlich rentieren, weil zum einen dieses Feld in der WHERE-Bedingung enthalten ist und gleichzeitig der Zusatz ORDER BY Belegdatum vom vorhandenen Index profitiert. 3.4.3Datenbankzugriffe Die auf der Datenbank selektierte und an die Anwendungsschicht zu übergebende Datenmenge sollte grundsätzlich so gering wie möglich gehalten werden. Nachfolgend finden Sie Hinweise, wie Sie dies im konkreten Fall umsetzen können. BEST PRACTICE: >Spaltenreduzierung: Vermeiden Sie *-Selektionen und benennen Sie stattdessen die benötigen Spaltennamen in der Selektion. Insbesondere das unnötige Laden von Spalten des Typs String ist teuer. Die Ergebnistabelle sollte mit der Selektionsstruktur übereinstimmen, um optimale Ergebnisse zu erzielen. Sollten in der Ergebnistabelle noch mehr Felder enthalten sein, aber die gewünschten Felder namensgleich angelegt sein, ist auch der Zusatz CORRESPONDING FIELDS möglich und führt nicht zu zusätzlicher Laufzeit. Gleichzeitig wird die Robustheit der Software erhöht. >Optimale Suchabfrage Versuchen Sie für die Selektion von Daten möglichst nur Abfragen zu verwenden, die einen der vorhandenen Indizes vollständig nutzen. Sollte das nicht möglich sein, achten Sie möglichst darauf, zumindest die ersten Elemente des Index zu verwenden, damit die zeilenweise Suche auf eine möglichst kleine Menge von Datensätzen reduziert werden kann. >Zeilenreduzierung Nutzen Sie die WHERE-Bedingungen, indem Sie die Selektion beschreiben und die an das ABAP-System zu übermittelnden Daten minimieren. Verwenden Sie SELECT SINGLE / UP TO n ROWS, wenn Sie nur einzelne Zeilen benötigen. >Existenzchecks Die Prüfung, ob Datensätze, die einem bestimmten Selektionskriterium genügen, existieren, sollten nicht mit der Anweisung COUNT(*), sondern mit SELECT SINGLE <Feldname> erfolgen, wobei das genannte Feld aus dem zur Selektion verwendeten Index stammen sollte. Dies vermeidet unnötige Zugriffe auf die Tabellendaten. >Aggregate Aggregate (MIN, MAX, …) werden immer auf dem Datenbankserver ausgewertet. Dadurch wird die Tabellenpufferung umgangen. Wegen der daraus potenziell entstehenden Last auf dem DB-System, das in vielen Installationen von sehr vielen Applikationsservern angesprochen wird, sollten Entwickler prüfen, welche Datenmenge für das Aggregat verwendet werden muss und ob es sich lohnen kann (sofern diese nicht groß ist), die Daten in eine interne Tabelle zu laden und das Aggregat dort durchzuführen. Allerdings weisen wir schon jetzt darauf hin, dass nach aktuellem Kenntnisstand insbesondere HANA-basierte Datenbankabfragen gerade bei Aggregaten ihre Stärken haben und damit deren Einsatz für HANA explizit sinnvoll ist. Beispiel: Um den durchschnittlichen Wert über eine große Anzahl (>100000) von Bestellungen zu ermitteln, ist es sinnvoll, dieses Aggregat auf dem DB-System ermitteln zu lassen, um nur einen oder wenige Werte statt hunderttausender an die Applikationsserver übermitteln zu lassen, um dort den Durchschnittswert im ABAP zu berechnen. Dies gilt insbesondere, wenn diese Auswertung nur selten (z.B. einmal pro Tag) erfolgt. Soll hingegen die Summe der Bestellpositionen eines einzelnen Auftrags sehr häufig und von allen vorhandenen Applikationsservern ermittelt werden, ist die Ermittlung im ABAP wahrscheinlich die für die Gesamtsituation günstigere Variante. >Updates Die Anweisung UPDATE SET ermöglicht das Übertragen von einzelnen zu ändernden Feldern (statt des gesamten Datensatzes). Wenn möglich, sollte diese Anweisung bevorzugt verwendet werden. >Ausführungshäufigkeit bei DB-Zugriffen Jede Ausführung eines Open SQL-Statements ist mit einem gewissen Overhead (Parsen, Abgleich gegen Statement-Puffer im DBMS usw.) verbunden. Daher sollten pro Statement möglichst viele der benötigten Daten auf einmal übertragen werden. Werden beispielsweise die Daten von 50 Aufträgen benötigt, sollten diese nicht durch 50 Einzelaufrufe ermittelt werden, sondern durch ein einzelnes Statement, das die sog. Array-Zugriffe unterstützt. Diese sind durch die Zusätze INTO TABLE bei SELECTS bzw. FROM TABLE bei schreibenden Zugriffen zu erkennen. Vermeiden Sie auf jeden Fall Open SQL-Statements innerhalb von Schleifen! Bei einem solchen Konstrukt fällt der Overhead für diese Statements bei jedem Schleifendurchlauf an. Setzen Sie MODIFY <DB-Tabelle> nicht ein! Erstens sollte innerhalb einer Applikation klar sein, ob Datensätze neu erstellt wurden oder vorhandene angepasst werden müssen. Zweitens ist dieses Statement aus Performance-Gesichtspunkten sehr kritisch: Selbst mit dem Zusatz FROM TABLE werden einzelne Zugriffe pro Zeile der internen Tabelle ausgeführt und dabei wird jeweils zuerst ein UPDATE versucht und im Fehlerfall ein INSERT nachgelegt. D.h., bei vielen neu zu erstellenden Datensätzen erfolgen nicht n Einzelzugriffe, sondern 2n mit n=Anzahl neue Datensätze in der internen Tabelle. >VIEWS/JOINS Geschachtelte SELECT-Anweisungen und SELECT-Anweisungen in Schleifen sollten vermieden werden. Stattdessen bieten sich VIEWS, JOINS oder der Zusatz FOR ALL ENTRIES an. Bei FOR ALL ENTRIES sollte man jedoch auf Folgendes achten: a. Ist die interne Tabelle leer, auf der FOR ALL ENTRIES basiert, dann werden alle Einträge geladen. b. Sind in der internen Tabelle Einträge doppelt vorhanden, kann dies dazu führen, dass die zugehörigen Datensätze auch doppelt von der Datenbank geladen werden. Es empfiehlt sich daher, zuvor ein DELETE ADJACENT DUPLICATES aufzurufen. 3.5Interne Tabellen und Referenzen Interne Tabellen stellen ein zentrales Konstrukt bei der Entwicklung von Anwendungen mit ABAP dar. Neben Datenbankzugriffen sind sie aber auch gleichzeitig eine prominente Quelle von Performance-Problemen. Bei kleinen Datenmengen stellen Dinge wie die Wahl der passenden Tabellenart und eines passenden Schlüssels noch kein Problem dar. Werden aber größere Datenmengen verarbeitet, wie es z. B. nach einem Wechsel auf ein Konsolidierungssystemgeschieht, können vorher aus Performance-Sicht unkritische Stellen zu erheblichen Laufzeitverlängerungen führen. BEST PRACTICE: Wir empfehlen die Beachtung der nachfolgenden Hinweise zur Steigerung der Performance von Anwendungen: Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 19 20 3Performance > Wählen Sie die Tabellenart passend zur späteren Verwendung: >Standard-Tabellen eignen sich für Daten, die nur selten oder gar nicht nach bestimmten Kriterien durchsucht werden müssen. Wenn keine Suche erfolgen muss, lohnt es sich nicht, die Kosten für die Erstellung und Aktualisierung der zusätzlichen Schlüsselstrukturen der anderen Tabellenarten zu zahlen. Bei sehr kleinen Datenmengen (<100 Zeilen) kann je nach Häufigkeit der Suchanfragen und Breite der Tabelle ein Verzicht auf einen expliziten Schlüssel geeignet sein. >Sorted-Tabellen bieten sich an, wenn die Daten häufig nach (Teil-)Schlüsseln durchsucht werden müssen, aber keine Eindeutigkeit der Schlüsselfelder garantiert werden kann. Gerade Zugriffe, die nur mit einem ersten Teil der Schlüsselfelder stattfinden, können nur von dieser Tabellenart unterstützt werden. > Hashed-Tabellen sind perfekt dafür geeignet, in Dictionary-artigen Konstrukten nach ein deutigen Schlüsseln zu suchen. Wenn die Eindeutigkeit der Einträge im Hinblick auf die Schlüsselfelder garantiert werden kann und die Suchzugriffe immer mit dem vollständigen Schlüssel (=alle Felder des Schlüssels werden auf Äquivalenz gegen einen jeweiligen Wert geprüft) erfolgen, ist diese Tabellenart in der Regel optimal. > Wenn für eine Tabelle vom Typ Sorted oder Hashed Zugriffe erfolgen, sollten diese immer mit dem passenden (Teil-)Schlüssel stattfinden. Dies bedeutet, bei READ TABLE den Zusatz WITH TABLE KEY zu verwenden und bei LOOP AT WHERE möglichst viele aufeinander folgende Felder des Schlüssels mit „=“ zu vergleichen. Dann werden die intern aufgebauten Schlüsselstrukturen verwendet, um die passenden Einträge schneller zu ermitteln. >Ab AS ABAP 7.02 können Sie bei internen Tabellen, die selten geändert werden, aber mit mehr als einem Zugriffmuster gelesen werden, neben dem primären Schlüssel, der wie gehabt definiert und verwendet wird, auch weitere sekundäre Schlüssel definieren, die auch einen vom Primärschlüssel abweichenden Typ (Sorted, Hashed) haben. Als Beispiel können Sie damit für eine als Hashed definierte Tabelle mit eindeutigem Primär- schlüssel einen weiteren Schlüssel vom Typ Sorted definieren, der es ermöglicht, performant auf die Daten der Tabelle aus einem anderen Blickwinkel (nicht eindeutig, Teilschlüssel möglich) zuzugreifen, ohne die eigentlichen Daten zweimal im Hauptspeicher anzulegen und bei Änderungen manuell für die Konsistenz zwischen beiden Tabellen zu sorgen. > Ähnlich wie bei den DB-Zugriffen existieren für interne Tabellen Einzelsatzzugriffe und Massenzugriffe. Wenn möglich, sollten immer die Varianten mit Massenzugriffen gewählt werden, die perfor- manter arbeiten als mehrere Einzelzugriffe. Als Beispiel sollten Sie beim Anhängen von Zeilen einer Teilergebnistabelle zur Gesamtergebnistabelle das Anweisungsmuster APPEND LINES OF TO verwenden, anstatt die gleiche Funktion über eine Schleife LOOP AT mit einzelnen APPEND TO zu realisieren. > Bei der Verwendung der Anweisung SORT sollten Sie immer die gewünschten Sortierfelder angeben. Erstens erhöht dies die Lesbarkeit des Codings und zweitens ist bei den wenigsten Standard- Tabellentypen ein Tabellenschlüssel definiert. Fehlt ein solcher Schlüssel, wird die gesamte Zeile der Tabelle als Schlüssel verwendet und damit bei der Sortierung alle Felder der Tabelle geprüft, was zu erheblichen Performance-Einbußen führt. Soll also z. B. ein Tabelle nach den Feldern Benutzer und Datum sortiert werden, verwenden Sie die Anweisung SORT table BY Benutzer Datum, auch wenn die Tabellenstruktur mit diesen Feldern beginnt und die Reihen- folge des Ergebnisses hinsichtlich der geforderten Felder gleich ist. > Vor dem Einsatz der Anweisung DELETE ADJACENT DUPLICATES sollte immer sichergestellt sein, dass die Tabelle nach den gleichen Feldern sortiert ist, damit doppelte Einträge auch wirklich eliminiert werden. Wie die Anweisung aussagt, werden nur benachbarte Tabellenzeilen verglichen. Wie bei der SORT-Anweisung auch sollten immer die Felder angegeben werden, die betrachtet werden müssen. Ansonsten wird auch hier die gesamte Zeile feldweise verglichen, auch wenn nur zwei Felder aus fachlicher Sicht dafür ausreichend sind. >Reine Existenzprüfungen auf internen Tabellen sollten immer mit READ TABLE TRANSPORTING NO FIELDS durchgeführt werden, wenn auf den Daten der ermittelten Zeile keine weiteren Operationen stattfinden. 3.5.1Feldsymbole Feldsymbole bieten die Möglichkeit, auf existierende Daten, z.B. Zeilen von internen Tabellen, zu referenzieren. Das Arbeiten mit Referenzen ist deutlich performanter als das Kopieren der Daten. Daher sollten, wo möglich, Feldsymbole verwendet werden. Nur bei sehr kleinen Tabellen gibt es einen minimalen Vorteil in der Laufzeit zwischen den Kopierkosten bei INTO <WA> und Feldsymbolen. Ansonsten sind Feldsymbole immer schneller, insbesondere dann, wenn die Tabelleninhalte geändert werden sollen. Bedenken Sie beim Einsatz von Feldsymbolen jedoch, dass eine Änderung des Wertes eines Feldsymbols auch den Wert im referenzierten Datenelement überschreibt. BEST PRACTICE: Verwenden Sie standardmäßig Feldsymbole für die Zugriffe auf interne Tabellen. 3.5.2Parameterübergabe Die Wertübergabe von Parametern sollte nur dort eingesetzt werden, wo es aus technischen Gründen vorgeschrieben ist (z.B. RFC-Funktionsbausteine, Returning-Parameter bei funktionalen Methoden). So werden unnötige Kopierkosten bei der Parameterübergabe gespart. Dies gilt in besonderem Maße bei Parametern mit tiefen Datentypen wie internen Tabellen oder Strings. Wenn es keine technischen Erfordernisse gibt, sollten Parameter immer per Referenz übergeben werden. Weiterhin sollten so wenig Parameter wie möglich definiert werden. Optionale Parameter sollten komplett vermieden werden. BEST PRACTICE: Verwenden Sie so wenig Parameter wie möglich, die per Referenz übergeben werden. Nutzen Sie die Wertübergabe nur an den technisch notwendigen Stellen. 3.6 Weiterführende Quellen >Einen guten Einstieg in die Performance-Optimierung im ABAP bietet der SAP-Kurs BC490. >Siegfried Boes, „Performance-Optimierung von ABAP-Programmen“, dpunkt Verlag 2009, ISBN 3898646157 Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 21 22 4Robustheit Dieses Kapitel erläutert, worauf Entwickler achten müssen, um robuste ABAP-Programme zu schreiben. Dazu ist es zunächst erforderlich zu definieren, was ein robustes ABAP-Programm ausmacht. Unter Robustheit verstehen wir die Fähigkeit eines Programms, auch unter ungünstigen Umständen weiterzulaufen und korrekte Ergebnisse zu liefern. Das bedeutet insbesondere, dass Programme Fehlersituationen erkennen und in einer Weise darauf reagieren, dass die gewünschte Funktionalität nicht gefährdet wird. 4.1 Fehlerbehandlung Die ABAP-Laufzeit hat verschiedene Möglichkeiten, eine Anwendung auf Fehlersituationen hinzuweisen. Diese sind hier aufgeführt und die Best Practices jeweils erläutert. 4.1.1SY(ST)-SUBRC-Prüfungen Bei einer ganze Reihe von ABAP-Befehlen setzt der SAP-Kernel nach deren Ausführung die globale Variable SY(ST)-SUBRC. In der Regel wird eine erfolgreiche Ausführung durch den Wert 0 angezeigt. Bei den Befehlen CALL FUNCTION und CALL METHOD wird SY(ST)-SUBRC nicht automatisch gesetzt, wenn es zu Fehlern in dem aufgerufenen Code kommt. Sofern die gerufenen Module sogenannte nicht-klassenbasierte Ausnahmen (non-class-based Exceptions) verwenden, muss das aufrufende Programm diese in der EXCEPTIONS-Sektion beim Aufruf korrekt deklarieren und ihnen einen Wert ungleich 0 zuweisen, damit SY(ST)-SUBRC gesetzt wird. BEST PRACTICE: Setzen Sie explizit den speziellen Wert OTHERS, da sich die Liste der Ausnahmen systembedingt ändern könnte, nachdem das rufende Programm fertiggestellt wurde. Der spezielle Wert OTHERS sollte insbesondere beim Aufruf von RFC-fähigen Funktionsbausteinen verwendet werden, da es hier zu verschiedenen speziellen RFC-Ausnahmen kommen kann. Die Prüfung von SY(ST)-SUBRC muss immer unmittelbar nach dem Befehl erfolgen, der diese globale Variable setzt. Wird die Prüfung erst später durchgeführt, kann der Wert bereits durch einen anderen ABAP-Befehl überschrieben worden sein. 4.1.2MESSAGE-Anweisung Mit der MESSAGE-Anweisung können Status- oder Fehlermeldungen ausgegeben werden. Dabei unterscheidet sich das Verhalten der MESSAGE-Anweisung je nach Meldungsart (Status, Information, Fehler, Abbruch) und ob der auslösende Programmteil im Dialog- oder Batchmodus ausgeführt wird. BEST PRACTICE: Vermeiden Sie MESSAGE-Anweisungen außerhalb von Modulen, die direkt mit dem Anwender kommunizieren bzw. die in einer definierten Dialogschicht liegen. MESSAGE-Anweisungen können in bestimmten Konstellationen von Meldungsart und Betriebsmodus implizite COMMITs aufgrund eines Bildschimwechsels in klassischen Dynpros auslösen und führen bei einem Aufruf innerhalb eines RFC-Aufrufs zu Verbindungsabbrüchen. Verwenden Sie innerhalb des eigentlichen Anwendungskerns klassenbasierte Ausnahmen, um auf Fehlersituationen hinzuweisen. 4.1.3 Klassenbasierte Ausnahmen Seit Einführung von ABAP OO können auch klassenbasierte Ausnahmen verwendet werden. Diese arbeiten nach dem Prinzip des „Werfens“ von Ausnahmen: Ein Programm erkennt einen Fehler und „wirft“ eine Ausnahme in den Call Stack. Fängt der Aufrufer diese Ausnahme nicht, wird sie so lange weiter im Call Stack nach oben propagiert, bis sie an anderer Stelle gefangen wird oder zu einem Dump führt. Es ist wichtig, alle Ausnahmen zu fangen, auf die in der jeweiligen Stelle angemessen reagiert werden kann, oder Ausnahmen in der Methode oder dem Funktionsbaustein zu deklarieren, sodass für den Aufrufer klar ersichtlich ist, dass die Methode bzw. der Funktionsbaustein eine solche Ausnahme aufwerfen könnte. Wichtig ist hierbei die einheitliche Verwendung: Für dieselbe Fehlersituation sollten einheitliche Fehlerbehandlungen/Ausnahmen verwendet werden. Zum Fangen von Ausnahmen ist der ABAP-Befehl TRY…CATCH…ENDTRY gedacht. Entsprechend müssen alle Ausnahmen aller Module, die klassenbasierte Ausnahmen erzeugen können, von einem TRY…CATCH behandelt werden, um einen robusten Ablauf zu gewährleisten. BEST PRACTICE: Erlauben Sie keine leeren Ausnahmebehandlungen. Dadurch wird es aufrufenden Stellen unmöglich gemacht, auf Ausnahmesituationen angemessen zu reagieren. Propagieren der Ausnahme ist in diesen Fällen die richtige Reaktion. BEST PRACTICE: Vermeiden Sie beim Fangen von Ausnahmen die globale Basisklassen CX_ROOT. Im CATCH-Block wird die Angabe der Exception-Klasse die zu fangende Ausnahme spezifiziert, z.B. CX_SY_ZERODIVIDE zum Abfangen eines Fehlers aufgrund der Division durch Null. Hierbei gilt es konkrete Ausnahmen abzufangen, um diese spezifisch zu behandeln. Das Fangen der allgemeinsten Ausnahme CX_ROOT sollte nur erfolgen, wenn die Ausnahmebehandlung tatsächlich in der Lage ist, mit unbekannten Fehlersituationen umzugehen. BEST PRACTICE: Wählen Sie die grundlegende Art von eigenen Ausnahmeklassen durch die Vererbung von vordefinierten Basisklassen (STATIC_CHECK, DYNAMIC_CHECK, NO_CHECK) mit Bedacht. Beim Einsatz von STATIC_CHECK wird jeder Verwender durch Syntaxfehler gezwungen, für jede dieser Ausnahme zu entscheiden, ob er sie direkt behandeln kann, weiterreicht und damit in seine Deklaration aufnehmen muss oder über das Verketten mit eigenen Ausnahmeklassen verpackt. Alle diese Möglichkeiten sind mit Aufwand und Änderungen verbunden, die den Vorteil der klassenbasierten Ausnahmen (Propagieren von Ausnahmen, die nicht direkt behandelt werden können) zunichtemachen. Verwenden Sie bei der nachträglichen Einführung von Ausnahmeklassen daher bevorzugt DYNAMIC_CHECK, um nicht allen Ausnahmen die o.g. Anpassungen aufzuzwingen. Setzen Sie STATIC_CHECK bewusst ein, um Aufrufer dazu zu zwingen, sich mit der Ausnahmesituation auseinanderzusetzen. Die Ausnahmenklasse NO_CHECK bietet sich für solche Fehlersituationen an, auf die kaum eine aufrufende Stelle angemessen reagieren kann. Beispiele dafür sind das Wegbrechen von sekundären Datenbankverbindungen oder andere Dinge, die durch das Coding nicht korrigiert werden können. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 23 24 4Robustheit 4.1.4Nicht behandelbare Ausnahmen Es gibt Ausnahmen, die vom ABAP Code aus nicht behandelt werden können und dadurch zwangsläufig zu einem Abbruch der Anwendung und einem Dump führen. In einigen Fällen ist es möglich, pro aktiv vor der Ausführung eines Statements, das eine nicht behandelbare Ausnahme auslöst, die Rahmenbedingungen zu prüfen. Beispiel: Das Statement OPEN DATASET löst einen Shortdump aus, wenn der Benutzer keine ausreichenden Berechtigungen zum Öffnen der Datei hat. Um dies zu vermeiden, muss die Berechtigung pro aktiv vom ABAP geprüft werden (FuBa AUTHORITY_CHECK_DATASET), damit OPEN DATASET nicht zu einem Dump führt. 4.2 Korrekte Implementierung von Datenbank-Änderungen 4.2.1Sperrobjekte Um Dateninkonsistenzen zu vermeiden, müssen die entsprechenden Objekte vor Veränderung auf der Datenbank gesperrt werden. Zusammenhängende Objekte dürfen erst verändert werden, wenn alle zugehörigen Entitäten erfolgreich gesperrt werden. Damit ist keine parallele Datenänderung möglich. Die SAP-Sperre besteht über mehrere Datenbank-LUWs (Logical Unit of Work) hinweg, sodass konsistent Änderungen auf der Datenbank für das gesamte zu ändernde Businessobjekt geschrieben werden können. Die Sperren sind so genau wie möglich abzusetzen, um nur die relevanten Objekte innerhalb der LUW zu sperren. Zudem sind die Sperren so lange wie nötig und so kurz wie möglich zu halten. Für die Änderung von SAP-Standard-Datenobjekten direkt auf der Datenbank sind die entsprechenden SAP-Standard-Sperrfunktionen zu verwenden, da diese auch von den Standard-Transaktionen verwendet werden und so ein konsistentes Verhalten sicherstellen. Für kundeneigene Entwicklungen sind entsprechende Sperrobjekte mit den zugehörigen Sperrfunktionen zu implementieren. Die Sperren sind nach Abschluss des Updates auf das Objekt aufzuheben. Dies erfolgt mittels Aufruf des Dequeue-Funktionsbausteins. Beachten Sie dabei den wichtigen Scope-Parameter, wenn in diesem Zusammenhang auch Verbuchungsbausteine verwendet werden. WEITERE QUELLEN: 1. http://help.sap.com/saphelp_NW70/helpdata/de/7b/f9813712f7434be10000009b38f8cf/frameset.htm 4.2.2Verbuchungskonzept Die Verbuchung ist die zentrale Technik zur Bündelung von Datenbankänderungen in einer einzigen Datenbank-LUW und damit zur Definition von SAP-LUWs in SAP-Transaktionen. Datenänderungen sollen nicht mit DML-Kommandos (DataManipulati-onLanguage-Kommandos Insert, Update, Delete, Modify) aus der Applikation, sondern über den Verbucher durchgeführt werden. Dabei stehen folgende Möglichkeiten zur Verfügung: >Asynchrone Verbuchung >Asynchrone Verbuchung in Abschnitten >Synchrone Verbuchung Die Verbuchung wird mit eigenen Verbuchungsfunktionsbausteinen durchgeführt. Diese sind bei der Anlage entsprechend in den Eigenschaften zu kennzeichnen. Diese Funktionsbausteine werden mit dem Zusatz „IN UPDATE TASK“ aufgerufen und unterliegen bei der Entwicklung einigen Restriktionen. Alle bis zu einem „COMMIT WORK“ gerufenen Verbuchungsfunktionen werden in einer LUW auf die Datenbank geschrieben. Beim Aufruf der Sperrfunktionsbausteine ist auf die korrekte Parametrierung (insbesondere SCOPE-Parameter) zu achten! Fehlerhafte Verbuchungssätze müssen in der Transaktion Verbuchungsaufträge (SM13) administriert und nachbehandelt werden. Aus Revisionsgründen ist es empfehlenswert, die Nachbearbeitung der fehlerhaften Verbuchungssätze zu dokumentieren. WEITERE QUELLEN: 1.SAP Dokumentation „Techniken der Verbuchung“: http://help.sap.com/saphelp_nw70/helpdata/de/41/7af4cba79e11d1950f0000e82de14a/content.htm 4.2.2.1Asynchrone Verbuchung Die Funktionsbausteine werden in den Eigenschaften mit „Start sofort“ oder in Ausnahmefällen mit „Start sofort – nicht nachverbuchbar“ angelegt. Die Verbuchung wird sofort nach Abschluss der LUW gestartet, jedoch asynchron durchgeführt. 4.2.2.2Asynchrone Verbuchung in Abschnitten Die Funktionsbausteine werden in den Eigenschaften mit „Start verzögert“ angelegt. Die Verbuchung wird sofort nach Abschluss der LUW gestartet, wird jedoch asynchron in eigenen Prozessen mit niedriger Priorität durchgeführt. Diese Art der Verbuchung ist für das Schreiben von großen Datenmengen geeignet, wenn die Verbuchung nicht zeitkritisch erfolgen muss (z.B. Ladeprogramme, Protokollierung ...). 4.2.2.3Synchrone Verbuchung Die Funktionalität und die notwendigen Einstellungen sind analog zu jenen im Punkt 4.2.2.1 Asynchrone Verbuchung. Die LUW muss jedoch mit „COMMIT WORK AND WAIT“ abgeschlossen werden. Diese Art der Verbuchung wird dann gewählt, wenn die geänderten Daten sofort benötigt werden, z.B. wenn man LUWs koppeln will und eine LUW vom Ergebnis der vorherigen LUW abhängt. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 25 26 4Robustheit 4.3Protokollierung Generell sollten Fehler, Ausnahmen und Meldungen ins Business Application Log gespeichert werden, um diese an zentraler Stelle (Transaktion SLG1) prüfen zu können. Mit der Transaktion SLG0 können darüber hinaus eigene Objekte zur Protokollierung definiert werden. Der Vorteil bei der Verwendung des Business Application Logs liegt in folgenden Aspekten begründet: 1.Zentrale Ablage: Im Business Application Log können Meldungen an zentraler Stelle verwaltet werden; dies erleichtert den Überblick und die Administration der Anwendungen 2. Wiederverwendbarkeit: Das Business Application Log bzw. die zugehörigen Bausteine/Klassen bieten einen guten Funktionsumfang für das Thema Logging – dieser muss nicht „neu erfunden“ werden. Zu diesen Möglichkeiten zählen u.a. a.Integration zusätzlicher Felder in die Protokollierungsobjekte b. Hierarchiedarstellung von Meldungen (Zusammenfassung zu Problemklassen möglich) c.Interaktivität (Nachlesen von Informationen bei Aufruf einer Meldung und Anreichern von Informationen) d. Persistenz: Speicherung von Meldungen im Log möglich e.Integration der Protokollanzeige in eigene Anwendungen/UIs (Sub-screen/Control/Popup) BEST PRACTICE: Für die Protokollierung sollten die von SAP vorgesehenen Funktionsbausteine in der Funktionsgruppe SBAL verwendet werden. Die Beispielprogramme „SBAL_DEMO*“ bieten einen guten Einstieg und Überblick. Bitte beachten Sie bei der Implementierung die SAP-Standardhilfe bzgl. der Verwendung der Funktionsbausteine im jeweiligen Release. WEITERE QUELLEN: 1.SAP Application Log – Leitfaden für Anwender http://help.sap.com/saphelp_nw70ehp2/helpdata/de/3a/c8263712c79958e10000009b38f936/ frameset.htm 2. Beispiele zur Verwendung der BAL Funktionen in: Thorsten Franz, Tobias Trapp, „Anwendungsentwicklung mit ABAP Objects, SAP Press, ISBN-10: 3836210630 4.4Praxisbeispiele In diesem Abschnitt finden sich noch einige Robustness-Probleme, die in Audits immer wieder auftauchen. 4.4.1Unvollständige Fallunterscheidungen Für CASE Statements wird empfohlen, alle vorhandenen WHEN-Blöcke auszuprogrammieren. Außerdem sollte immer ein WHEN OTHERS-Block vorhanden sein, um Fälle zu behandeln, die zur Zeit der Entwicklung noch nicht abzusehen waren bzw. unterwartet sind. Bei IF-Abfragen ist darauf zu achten, dass auch die ELSE/ELSEIF-Zweige ausprogrammiert werden, sofern diese im jeweiligen Kontext Sinn machen. 4.4.2 Wichtige sonstige SY(ST)-SUBRC-Prüfungen SY-SUBRC-Prüfungen sollten möglichst immer stattfinden, wenn ABAP-Befehle Rückgabewerte liefern. Das ist wichtig, um die Integrität des Systems auch im Fehlerfall zu gewährleisten. Es wird daher empfohlen, zumindest im Umgang mit Dateien und Datenbanktabellen Prüfungen auf SY(ST)-SUBRC durchzuführen. Im Folgenden sind die relevanten ABAP-Befehle gelistet, für die SY(ST)-SUBRC aus Sicht der Robustheit immer geprüft werden sollte und die in diesem Kapitel noch nicht erwähnt wurden: >OPEN DATASET >READ DATASET >DELETE DATASET >SELECT SINGLE >DELETE dbtab > MODIFY dbtab >INSERT dbtab >UPDATE dbtab 4.5 Weiterführende Quellen 1. Liste einiger Befehle, die SY-SUBRC setzen: http://wiki.sdn.sap.com/wiki/display/ABAP/Sy-Subrc Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 27 28 5ABAP-Sicherheit und Compliance Dieses Kapitel beschreibt, in welcher Weise sich Programmierfehler im ABAP negativ auf die Sicherheit eines Unternehmens auswirken können. Da dieses Thema sehr komplex ist, können wir im Rahmen dieses Dokuments nur ein paar ausgewählte, zentrale Themen behandeln. Für weitergehende Fragen verweisen wir auf die Literaturhinweise am Ende dieses Kapitels. Zunächst müssen wir die Begriffe Sicherheit und Compliance in diesem Kontext erklären: Wir sprechen von einer Sicherheitsschwachstelle, wenn ein Programmierfehler einen ungewollten Nebeneffekt verursacht, durch den ein Angreifer unbefugt schadhafte Aktionen ausführen kann. Wir sprechen von einem Compliance-Verstoß, wenn ein Anwender aufgrund eines Programmierfehlers einen prüfungsrelevanten Sicherheitsmechanismus des SAP-Standards umgehen kann. Ein wichtiger Unterschied ist, dass Sicherheitsfehler im Code Angriffe durch Hacker (z.B. Industriespionage) ermöglichen, wohingegen Compliance-Verstöße im Code potenziell gesetzliche Auflagen verletzen (z.B. SOX) und/oder bei einer Wirtschaftsprüfung moniert werden. 5.1 Prüfungsrelevante Sicherheitsmechanismen im SAP Standard Bevor wir näher auf Schwachstellen eingehen, ist es wichtig, sich noch einmal ein paar zentrale Schutzmechanismen des SAP-Standards vor Augen zu führen. Diese sind Grundvoraussetzung für den sicheren Betrieb von SAP-Systemen. 5.1.1 Berechtigungsprüfung (A) Rollen und Berechtigungen sind ein zentrales Sicherheitsthema im SAP-Umfeld. Es ist daher wichtig zu verstehen, dass ABAP ein sogenanntes explizites Berechtigungsmodell verwendet. Das bedeutet, dass Berechtigungsprüfungen explizit im Code programmiert werden müssen, damit sie auch ausgeführt werden. Das beste Berechtigungskonzept nützt nichts, wenn selbstgeschriebener Code die erforderlichen Berechtigungen nicht (richtig) prüft. Sicherheitsprobleme ergeben sich z.B. in folgenden Fällen: >Der Entwickler vergisst, die Berechtigungsprüfung zu programmieren. >Der Entwickler verwendet das falsche Berechtigungsobjekt. >Der Entwickler verwendet eine proprietäre Berechtigungsprüfung. >Der Entwickler behandelt den Rückgabewert der Prüfung nicht. 5.1.2 Mandantentrennung (B) Der SAP-Standard trennt automatisch alle Datenbankzugriffe nach Mandanten auf. Ein ABAPProgramm darf immer nur die Daten des Mandanten verarbeiten, an dem sich der Anwender angemeldet hat. Sicherheitsprobleme ergeben sich in folgenden Fällen: >Der Entwickler umgeht die Mandantentrennung (vorsätzlich) durch technische Optionen im Open SQL (CLIENT SPECIFIED). >Der Entwickler verwendet natives SQL, das generell keine implizite Mandantentrennung durchführt. 5.1.3Nachvollziehbarkeit (C) Die meisten Geschäftstransaktionen müssen nachvollziehbar sein, insbesondere in der Finanzbuchhaltung. Selbstgeschriebener ABAP Code darf Anwendern nicht ermöglichen, relevante Aktionen zu verschleiern. Sicherheitsprobleme ergeben sich in folgenden Fällen: >Der Entwickler vergisst, für wichtige Tabellen Änderungsbelege zu schreiben. >Der Entwickler ermöglicht (unbeabsichtigt) einen sogenannten Identitätsdiebstahl. >Der Entwickler verändert direkt Tabelleninhalte, ohne Standardfunktionsbausteine zu verwenden (und damit implizit die Protokollierung zu verwenden). 5.1.4Dreisystemlandschaft (D) Der SAP-Standard sieht vor, für Entwicklung, Qualitätssicherung und Produktion getrennte Systeme (D, Q, P) zu verwenden. Dies dient in erster Linie dazu, die Produktivdaten vor unzureichend getesteten Programmen zu schützen und die umfangreichen Rechte der Entwickler auf das Entwicklungssystem zu beschränken. Sicherheitsprobleme ergeben sich in folgenden Fällen: >Der Code kann nicht (vollständig) auf dem Q-System getestet werden. >Der Entwickler verwendet Befehle, die es Anwendern möglich machen, auf dem Produktivsystem Code zu entwickeln. 5.1.5 Kontrollierte Ausführung von Betriebssystemkommandos (E) ABAP hat die Möglichkeit, auch Betriebssystemkommandos auszuführen. Da das potenziell sehr gefährlich ist, stellt der Standard Transaktionen (SM49/SM69) zur Verfügung, mit denen man eine Liste erlaubter Befehle definieren und die erlaubten Befehle auch noch durch spezielle Berechtigungen zusätzlich schützen kann. Sicherheitsprobleme ergeben sich in folgenden Fällen: >Der Entwickler verwendet einen alternativen Weg, um Betriebssystemkommandos auszuführen. D.h., er umgeht die Liste der erlaubten Befehle und die daran gekoppelten Berechtigungen. 5.1.6 Kontrollierte Ausführung von SQL-Befehlen (F) Der Open-SQL-Standard ermöglicht den Zugriff auf die Datenbank von ABAP aus nur mit einem sehr limitierten Satz an Befehlen, die zusätzlich alle statisch deklariert werden müssen. Dadurch können gefährliche SQL-Befehle in der Datenbank abgeschirmt werden. Sicherheitsprobleme ergeben sich in folgenden Fällen: >Der Entwickler verwendet native SQL-Befehle, um mit der Datenbank zu kommunizieren. Dadurch können beliebige Befehle ausgeführt werden, die die Datenbank beschädigen. >Der Entwickler verwendet dynamische Optionen von Open-SQL-Befehlen und ermöglicht dadurch Injection-Angriffe. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 29 30 5ABAP-Sicherheit und Compliance 5.2Sicherheitsschwachstellen Applikationssicherheit ist in vielen Programmiersprachen schon seit Jahren ein wichtiges Thema. In ABAP wurde dieses Thema jedoch häufig nicht erkannt bzw. falsch eingeschätzt. Ein wesentlicher Grund dafür ist der falsche Glaube, dass man SAP-Systeme durch Rollen und Berechtigungen absichern kann. Dies mag für den SAP-Standard zutreffen, aber definitiv nicht für selbstentwickelten Code. Wie bereits weiter oben erläutert, werden z.B. Berechtigungen nur geprüft, wenn der ABAP Code eine Prüfung auch explizit durchführt. Folgende Arten von Schwachstellen sind im ABAP besonders häufig zu beobachten: > Fehlende bzw. falsche Berechtigungsprüfungen Der ABAP Code führt Operationen aus, für die ein Berechtigungsprüfung erforderlich ist, überprüft aber die Berechtigung des Benutzers nicht bzw. nicht richtig. >Injection-Probleme Der ABAP Code verwendet dynamische Befehle, die aus Benutzereingaben zusammengefügt werden. Wenn hier nicht durch Input-Validierung bzw. Output-Encoding verhindert wird, dass Steuerzeichen in den Eingaben die Semantik des dynamischen Befehls verändern können, dann kann der dynamische Befehl zur Laufzeit schadhaft verändert werden. >Aushebelung von Sicherheitsmechanismen des Standards ABAP Code darf einen bestehenden Sicherheitsmechanismus nicht gezielt umgehen. Beispiele sind proprietäre Berechtigungsprüfungen (basierend auf SY-UNAME), mandantenübergreifende Datenbankzugriffe, Ausführung von Betriebssystemkommandos über Kernelfunktionen. Folgende Schwachstellen sind im ABAP besonders häufig zu beobachten. Die Spalte „Std“ zeigt dabei an, welcher Sicherheitsmechanismus des SAP-Standard dabei beeinträchtigt wird. ID Schwachstelle Beschreibung Std APP-01 ABAP Command Injection Ausführung von beliebigem ABAP Code D APP-02 OS Command Injection Ausführung beliebiger Betriebssystem-Kommandos E APP-03 Native SQL Injection Ausführung beliebiger nativer SQL-Kommandos F APP-04 Improper Authorization (Missing, Broken, Proprietary, Generic) Fehlende oder fehlerhafte Berechtigungsprüfung A APP-05 Directory Traversal Unerlaubter Schreib-/ Lesezugriff auf Dateien (SAP Server) APP-06 Direct Database Modifications Unberechtigter Schreibzugriff auf Tabellen C ID Schwachstelle Beschreibung Std APP-07 Cross-Client Database Access Mandantenübergreifender Zugriff auf Geschäftsdaten B APP-08 Open SQL Injection Schadhafte Manipulation von Datenbankbefehlen F APP-09 Generic Module Execution Unerlaubte Ausführung von Modulen (Reports, FuBas etc.) A APP-10 Cross-Site Scripting Manipulation des Browser UI, Diebstahl von Berechtigungen C APP-11 Obscure ABAP Code Einschränkte Auditierbarkeit durch Verschleierung von Code D Abbildung 1: BIZEC APP/11 – Die derzeit verbreitetsten Sicherheitsprobleme in ABAP-Code QUELLE: http://www.bizec.org/wiki/BIZEC_APP11 Dieses Kapitel kann bei Weitem nicht die notwendigen Details liefern, um sicheren ABAP-Code zu programmieren. Wir verweisen hier auf die Literaturempfehlung #1 am Ende des Kapitels. Die folgende Liste enthält eine Übersicht über SAP-Meldungen, die Gegenmaßnahmen zu einigen der oben beschriebenen Probleme beschreiben. SAP Note Schwachstelle 1520356 SQL Injection 887168, 944279, 822881 Cross-Site Scripting 1497003 Directory Traversal Abbildung 2: SAP OSS Notes, die Gegenmaßnahmen beschreiben Selbstverständlich empfiehlt es sich, SAP-Sicherheitshinweise zeitnah zu prüfen und einzuspielen. Diese lösen allerdings nur Sicherheitsdefekte im SAP-Standardcode. Eine regelmäßige Prüfung der Eigenentwicklungen ist daher zwingend erforderlich. 5.3 Compliance-Probleme durch ABAP Das Thema Applikationssicherheit wurde in der Vergangenheit selten mit Compliance in Verbindung gebracht, ist aber für Wirtschaftsprüfungen durchaus relevant (siehe Literaturempfehlung #2). Die meisten Unternehmen verfügen über ein internes Kontrollsystem (IKS), das ComplianceRisiken entgegenwirkt. Dies ist beispielsweise in den international anerkannten Referenzmodellen COSO & COBIT beschrieben. In einer typischen IKS-Struktur sind die „Generellen IT-Kontrollen“ (ITGC-IT General Controls) Voraussetzung für das Erreichen aller IKS-Ziele im IT-dominierten Umfeld. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 31 32 5ABAP-Sicherheit und Compliance Ein elementarer Baustein der ITGC ist das Änderungswesen (Change Management), zu dem wiederum Eigenentwicklungen zählen. Sicherheitsdefekte im selbstgeschriebenen ABAP-Code stellen eine Verletzung der generellen IT-Kontrollen dar und erschüttern damit die Grundmauern jedes internen Kontrollsystems. Abbildung 3: IKS-Risiken durch unsicheren ABAP-Code Dies bedeutet insbesondere, dass Sicherheitsdefekte im ABAP-Code potenziell nicht nur Auswirkungen auf Compliance-Standards haben, sondern auch gesetzliche Anforderungen verletzen können. Alle in Abbildung 1 dargestellten Sicherheitsdefekte sind daher auch Compliance-relevant. 5.4Testwerkzeuge Für ABAP-Sicherheitstests eigenen sich insbesondere sogenannte statische Codeanalyse-Tools. Es gibt hier verschiedene kommerzielle Anbieter, die in wesentlichen Bereichen die Möglichkeiten des Code Inspectors erweitern: >Analyse des SAP-Standard-Codings, insbesondere von API-Aufrufen >Sehr hohe Scan-Geschwindigkeiten für Continuous Monitoring > Globale Daten- und Kontrollflussanalysen, da diese für die meisten Sicherheitstests elementar sind. >Umfangreiche Beschreibungen des Problems mit Lösungsvorschlägen > Hinreichende Testabdeckung (OWASP Top 10 und SANS 25 reichen nicht, da überwiegend Web-spezifisch und auf ABAP kaum anwendbar) > 4-Augen-Prinzip bei Ausnahmen Natürlich muss so ein Tool hinreichend in SE80, TMS und ChaRM integriert sein, damit die Entwickler damit arbeiten können und wollen. 5.5 Weiterführende Quellen: 1.Andreas Wiegenstein, Markus Schumacher, Sebastian Schinzel, Frederik Weidemann, Sichere ABAP Programmierung, SAP Press 2009 2. Maxim Chuprunov , Handbuch SAP-Revision, SAP Press 2011 3. BIZEC - The Business Application Initiative (http://bizec.org) Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 33 34 6Dokumentation Die Dokumentation von Software ist in vielen Fällen genauso wichtig wie die Entwicklung selbst. Fehlt die Dokumentation oder ist diese nicht in ausreichendem Maß vorhanden, führt dies spätestens bei der Weiterentwicklung oder dem Wechsel von Entwicklern zu erhöhten Aufwänden. In diesem Kapitel werden unterschiedliche Möglichkeiten zur Dokumentation von Entwicklungsobjekten im SAP System dargestellt. 6.1Dokumentation unabhängig von Entwicklungsobjekten Neben der Beschreibung der vielen Entwicklungsobjekte, die einzelne, sehr spezielle Funktionen im ABAP-System übernehmen, gibt es auch den Bedarf, die größeren Zusammenhänge innerhalb und zwischen Modulen darzustellen. Dazu gehören z.B. Antworten auf Fragen wie: > Welche Abhängigkeiten gibt es zwischen n Modulen? > Wie werden Prozesse auf Reports abgebildet? > Welche Läufe finden wann am Tag / im Monat / Jahr statt und welche Entwicklungsobjekte sind davon betroffen? Für die Beantwortung dieser Fragen findet sich unserer Meinung nach kein geeignetes Ablagemedium innerhalb des SAP-Entwicklungssystems, das insbesondere Grafiken gut integriert. Wir empfehlen daher, für die Dokumentation dieser übergreifenden Zusammenhänge auf andere Medien außerhalb des SAP-Systems zurückzugreifen. Beispiele dafür sind: >Interne (Produkt-)Wikis >Dokumente in gepflegten öffentlichen Verzeichnissen (Portalablage, Sharepoint, Fileshare …) Die Erfahrung zeigt, dass die Herausforderung in diesem Bereich primär in der Frage der Disziplin liegt. Diese Herausforderung kann kein Tool lösen, sondern nur das Entwicklungsteam und die zugehörige -leitung. Darüber hinaus sei angemerkt, dass veraltete Dokumentation irreführend sein kann. Insofern sollte in Dokumenten der Stand und eine Versionierung enthalten sein, um die Aktualität bewerten zu können. Innerhalb einer SAP-Systemlandschaft bietet der SAP Solution Manager Möglichkeiten zur Projektdokumentation. Die nachfolgenden Links bieten weitere Informationen dazu. WEITERE QUELLEN: 1. Help.sap.com Dokumentation SAP Solution Manager 7.1: http://help.sap.com/saphelp_sm71_sp05/helpdata/en/3d/d05893e6ba4dfab7c0d66de8d52420/ frameset.htm 2.SCN Blog: „Business process documentation with SAP Solution Manager 7.1” http://scn.sap.com/blogs/ben.schneider/2011/11/04/business-process-documentation-with- sap-solution-manager-71 6.2Dokumentation von Entwicklungsobjekten Neben Methoden, Funktionsbausteinen und Reports, die Dokumentation im Quelltext enthalten können, existieren weitere Entwicklungsobjekte im ABAP-System, die keinen Quelltext beinhalten und daher auf anderem Weg dokumentiert werden müssen. Beispiele dafür sind: >Interfaces >DDIC-Objekte >Transaktionen BEST PRACTICE: Wir empfehlen, für alle Entwicklungsobjekte, unabhängig von Quelltexten, die Möglichkeiten zur Dokumentation der ABAP Workbench zu nutzen und die Aufgaben und Bedeutungen dieser Objekte im SAP-System zu dokumentieren. Im Vergleich zur Dokumentation im Quelltext ist hier der Änderungsverlauf nicht im Vordergrund, sondern der IST-Stand sollte hier dargelegt werden. Da die Dokumentation auch an das Transportwesen angeschlossen ist, steht diese Dokumentation in allen Stages einer Systemlandschaft zur Verfügung. Weiterhin kann die Dokumentation von allen Benutzern eingesehen werden und wird in einigen Fällen (Reports) vom ABAP-System automatisch in die Benutzungsoberfläche eingebunden. Ein weiterer Vorteil besteht darin, dass diese Dokumentation übersetzbar ist. 6.3Dokumentation im Quelltext 6.3.1Dokumentation und Kommentierung von Anweisungen/Anweisungsblöcken Generell sollten Anweisungsblöcke im Quelltext (kurz) kommentiert werden, damit ein schnelles Zurechtfinden in fremden Programmen ermöglicht wird. Dabei soll in einer Kommentarzeile kurz beschrieben werden, welche Aufgabe der nächste Anweisungsblock hat. Dokumentieren Sie insbesondere, warum Sie etwas machen, nicht wie. Dabei gilt der Grundsatz: So wenig Kommentar wie möglich, so viel Kommentar wie nötig. Vermeiden Sie daher redundante Informationen (wie Name des dokumentierten Moduls, den letzten Änderer etc). BEST PRACTICE: Als Kommentierungssprache sollte Englisch verwendet werden. Entwicklungsteams arbeiten heutzutage überwiegend international zusammen. Auch wenn Sie derzeit rein deutschsprachig entwickeln, kann Ihr Projekt im Laufe der Zeit internationalisiert werden. Der Aufwand, der dann durch Koordinationsprobleme oder sogar nachträgliches Übersetzen entsteht, steht in keinem Verhältnis zu dem vielleicht größeren Aufwand durch englische Dokumentation. Es hat sich außerdem gezeigt, dass die Lesbarkeit von Code und Kommentaren besser ist, wenn die Kommentare englisch sind. Denn die ABAP-Befehle selbst sind englisch und im Stil von Sätzen aufgebaut. Der Leser muss bei englischer Dokumentation also nicht ständig beim Lesen des Quelltextes die Sprache wechseln. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 35 36 6Dokumentation 6.3.2Dokumentation von Änderungen Ab dem Zeitpunkt der Produktivsetzung eines Programms müssen Änderungen in Programmen dokumentiert werden. 6.3.3Programmkopf Änderungen in Programmen werden mit einem Namenskürzel (z.B. Vorname + Nachname), dem Tagesdatum und dem Change Document der Änderung im Programmkopf dokumentiert. Dabei soll zumindest im Programmkopf auch die Erläuterung des Namenskürzels stehen, hilfreich ist es jedoch auch, die Beschreibung direkt bei der Änderung einzufügen. Hierdurch kann auf einen Blick der Grund der Änderung im Code erfasst werden. Beispiel: */ Change Log */ VN/Date ChangeDoc Description */ MZ/2012-08-06 CD4712 Add MMSTA in Output, Max Mustermann */ MZ/2012-02-01 CD4711 Import Material number, Max Mustermann */ MM/2009-01-01 CD0815 Added Field ABC in method signature and source code in order to support quick search, Max Mustermann In der Beschreibung der Änderung sollte die Frage „Wer hat Was, Warum und Wie geändert“ beantwortet werden. Werden für die Koordination der Weiterentwicklung Change-Management- oder Bug-trackingSysteme eingesetzt, sollten in diesem Kommentar Verweise auf die Vorgänge/Issues enthalten sein. Damit lässt sich später auch im Quelltext nachvollziehen, welche Erweiterung/Fehlerbehebung Auslöser für eine Änderung war. BEST PRACTICE: Der Kommentar ist nicht für den Verfasser, sondern für andere Entwickler gedacht. Führen Sie sich das bei der Erstellung von Kommentaren bzw. deren Review immer wieder vor Augen. Programmzeilen – optional Die geänderten Programmzeilen können mit der Kombination Namenskürzel und Tagesdatum der Änderung dokumentiert werden. Hinter dem Datum kann ein Punkt gesetzt werden, sodass der Pretty Printer die Kommentierung automatisch nach rechts ausrichtet. Alte Dokumentationen von Änderungen, die nicht mehr benötigt werden, sollten aus Gründen der Lesbarkeit wieder entfernt werden. Oberstes Ziel sollte stets die gute Lesbarkeit von Quelltexten sein. Einfache Änderung *WRITE: lw_mara-matnr. „ MZ/2012-08-06 CD4712 CD4711 Add MMSTA in Output WRITE: lw_mara-matnr, lw_mara-mssta. Blockänderung – Löschen von Anweisungen „--> MZ/2012-02-01 CD4711 Import Material number *CONCATENATE wa_import-aufnr wa_import-vornr * INTO str SEPARATED BY ‚ ‚. „--> MZ-2012-02-01. DELETE Blockänderung – Einfügen von Anweisungen „--> MZ/2012-02-01 CD4711 Import Material number CONCATENATE wa_import-aufnr wa_import-vornr wa_import-matnr INTO str SEPARATED BY ‚ ‚. „--> MZ/2012-02-01. INSERT Verweis auf Stern bzw. Anführungszeichen als Kommentar Stern-Kommentare sollten nur im Programmkopf oder für das Auskommentieren von altem Code verwendet werden. Für alle anderen Kommentare empfiehlt die SAP Inline-Kommentare zu verwenden. Diese sollten jeweils vor dem Code stehen, den sie dokumentieren, und auch so eingerückt sein wie dieser Code. WEITERE QUELLEN: Keller, Thümmel, ABAP-Programmierrichtlinien, SAP Press 2009 Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 37 38 7Umsetzbarkeit und Durchsetzbarkeit Dieses Kapitel beschreibt, wie sich die Best Practices aus dieser Guideline in der Praxis verwirklichen lassen. Wir unterscheiden hierbei Umsetzbarkeit und Durchsetzbarkeit der Richtlinien. Im Abschnitt „Umsetzbarkeit“ erklären wir, worauf ein Unternehmen achten sollte, das Programmierrichtlinien einführen möchte. Wir erklären, wie ein Prozess dafür aussehen könnte, wie man diesen ins Leben ruft und vor allem, wie man ihn am Leben erhält. Im Abschnitt „Durchsetzbarkeit“ legen wir dar, wie ein Unternehmen die Vorgaben aus dem Prozess prüfen kann. Hierzu gehören organisatorische Aspekte genauso wie Prüfmethoden und Werkzeuge. Wir gehen aber auch auf Grenzen der Durchsetzbarkeit ein. Abschließend stellen wir Tipps aus der Praxis vor, die die Autoren bei verschiedenen Projekten im Umfeld der SAP-Entwicklung gesammelt haben. 7.1Umsetzbarkeit Wer erfolgreich Programmierrichtlinien in einem Unternehmen einführen möchte, muss zunächst das Management dafür gewinnen. Denn die Verbesserung der Codequalität bedeutet zunächst eine Investition in Prozesse und Werkzeuge sowie in die Fortbildung der involvierten Mitarbeiter. Insbesondere muss das Management überzeugt sein, dass das Unternehmen durch diese Prozesse langfristig Kosten spart. 7.1.1 Motivation für einen Prozess Nachfolgend finden Sie Anhaltspunkte, welche Qualitätsaspekte bei der Einführung eines Prozesses zur Qualitätssicherung adressiert werden und welche Vorteile dies für Unternehmen hat: Sicherheit Vorteil: Das Unternehmen verhindert, dass Anwender unbefugt an kritische Daten gelangen bzw. unbefugt kritische Daten verändern können. Risiken bei Qualitätsmängeln: Sabotage, Industriespionage, unerwünschte Pressemeldungen hervorgerufen durch Datenlecks, Stillstand der Produktivsysteme. Compliance Vorteil: Das Unternehmen kann jederzeit nachweisen, dass die entwickelte Software den Anforderungen relevanter Compliance-Standards und gesetzlichen Regelungen genügt. Risiken bei Qualitätsmängeln: Die Wirtschaftsprüfung scheitert, Verstoß gegen Compliance-Anforderungen oder gesetzliche Regelungen (z.B. Datenschutz). Performance Vorteil: Das Unternehmen stellt sicher, dass die vorhandene Hardware optimal genutzt werden kann, und schützt damit die bisherige Investition in Hardware. Außerdem steigt die Zufriedenheit der Mitarbeiter, da die Nutzung der Anwendung produktiver wird. Risiken bei Qualitätsmängeln: Die Akzeptanz der Anwender sinkt bzw. es entstehen Kosten für schnellere Hardware, um die Softwaremängel auszugleichen. Robustheit Vorteil: Das Unternehmen stellt den kontinuierlichen Betrieb der Geschäftsanwendungen sicher und vermeidet Unproduktivität auf Grund von Systemausfällen. Risiken bei Qualitätsmängeln: Die Akzeptanz der Anwender sinkt und die Betriebskosten steigen wegen Unproduktivität der Anwender sowie durch Fehleranalysen und Wartungsarbeiten durch Techniker. Wartbarkeit Vorteil: Das Unternehmen erreicht, dass die Applikation nachhaltig und kosteneffizient gewartet werden kann, weil die Programmstruktur leicht verständlich und gut dokumentiert ist. Risiken bei Qualitätsmängeln: Hohe Wartungskosten und generell erhöhte Fehleranfälligkeit der Applikation. 7.1.2Erstellung und Pflege des Prozesses Für die Umsetzung dieser Verfahren in der Praxis hat sich die formalisierte Beschreibung eines Prozesses bewährt. Dazu zählen klare Verfahrensanweisungen und Verantwortlichkeiten. Die genaue Ausprägung des Prozesses ist unternehmensspezifisch und kann in dieser Guideline nicht abgebildet werden; der Verweis auf die Notwendigkeit ist jedoch allgemeingültig. BEST PRACTICE: Definieren Sie den einzuhaltenden Prozess und dokumentieren Sie ihn in einer für alle zugänglichen Form. Definieren Sie, wie Änderungen und Verbesserungen am Prozess stattfinden sollen und wie Anmerkungen und Kritik eingebracht werden können. Dokumentieren Sie alle geprüften Regeln ausführlich mit den Kapiteln Hintergrund/Motivation, schlechte Beispiele, gute Beispiele, Hinweise zum Vorgehen zur Beseitigung und Literatur bzw. Ansprechpartner im Unternehmen. Motivation Ein Prozess für Best Practices bei der Entwicklung hilft, die Qualität von Software pro aktiv und effizient zu verbessern und damit Kosten im Unternehmen langfristig zu senken. Je früher ein Fehler bei der Entwicklung erkannt wird, desto einfacher und kostensparender kann er behoben werden. Je weniger Fehler eine Anwendung enthält, desto mehr entspricht ihre Nutzung den Erwartungen des Unternehmens. Insbesondere läuft sie ohne Nebeneffekte, die das Business negativ beeinflussen. Welche Aspekte sind für den Prozess relevant? Interne Entwicklung Für die interne Entwicklung werden Richtlinien als Nachschlagewerk für die tägliche Arbeit und regelmäßige Trainings für aktuelle Risiken benötigt. Externe Entwicklung Bei externer Entwicklung sind klare Qualitätsvorgaben für Ausschreibungen nötig. Vor der Abnahme müssen die Anforderungen auch überprüft werden. Übergreifend Die Vorgaben aus dem Prozess müssen möglichst weitgehend mit geeigneten Tools überprüft werden. Eine manuelle Prüfung ist nur in seltenen Fällen flächendeckend möglich. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 39 40 7Umsetzbarkeit und Durchsetzbarkeit BEST PRACTICE: Vorgaben ohne werkzeuggestützte Überprüfungsmöglichkeit sind nicht umsetzbar und sollten daher nicht definiert und vorgegeben werden. Bei jeder Regel, die zur nachträglichen QS herangezogen werden soll, muss festgelegt werden, wie diese werkzeuggestützt überprüft werden kann. Wenn keine mechanische Überprüfung durch ein Werkzeug möglich ist, wird es in der Praxis nahezu unmöglich werden, auf die konsequente Einhaltung der Regel zu achten. Die Konzentration auf maschinell überprüfbare Regeln erspart denjenigen, die Qualitätssicherung betreiben sollen, eine Vielzahl an Frustrationsquellen. Nichtsdestotrotz gibt es etliche Aspekte, die sich einer maschinellen Prüfung entziehen. Diese Aspekte können sinnvollerweise nur mit regelmäßig durchgeführten Code Reviews abgedeckt werden. Da gut durchgeführte Code Reviews erhebliche Aufwände in der Durchführung, aber auch der Vor- und Nachbereitung bzw. Kontrolle von Korrekturen erfordern, müssen diese sich auf wenige, aber unter den nicht maschinell prüfbaren Aspekten kritischen Entwicklungsobjekten beschränken. Wenn z.B. die Einhaltung von Performance-Vorgaben eine hohe Priorität besitzt, sollten in entsprechenden Code Reviews nur Entwicklungsobjekte mit Zugriffen auf Datenbanken oder umfangreichen Berechnungen beschränkt werden. Der Prozess muss daher eine Qualitätskontrolle vorsehen, durch die sämtliche Entwicklungen geprüft werden, bevor sie in den Produktivbetrieb gehen. Es muss auch definiert sein, wie mit Fehlern verfahren werden soll. Der Prozess muss selbstverständlich regelmäßig aktualisiert werden, um neue Aspekte berücksichtigen zu können. 7.2Durchsetzbarkeit 7.2.1 Manuelle Prüfungen Viele der Prüfungen lassen sich automatisieren. Es gibt jedoch Bereiche, die sich für eine automatische Prüfung nicht eignen, wie beispielsweise Dokumentation, Architektur oder viele funktionale Anforderungen. Die menschliche Sprache ist sehr komplex, daher muss z.B. der Inhalt von Dokumenten und Dokumentationen manuell geprüft werden. Nur der menschliche Leser kann beurteilen, ob ein Text sinnvoll, vollständig, verständlich und korrekt ist. Eine automatische Prüfung kann dabei maximal die Existenz in den vorgegebenen Sprachen prüfen. Es empfiehlt sich dennoch ein automatischer Test auf nicht-funktionale Aspekte. Für die manuelle Prüfung ist es wünschenswert, eine vollständige Prüfung anhand der Auswertung von Transportstücklisten vorzunehmen. Dabei ist zu berücksichtigen, welche unternehmensinternen Richtlinien existieren. Abhängig von der Anzahl der Objekte muss eine vollständige oder zumindest stichprobenartige Prüfung erfolgen. Das Prüfergebnis wird dem Entwickler/Zuständigen zur Verbesserung/Vervollständigung der Dokumente/Dokumentationen übermittelt. Ob ein Prozess alle Vorgaben erfüllt, kann nur mittels einer manuellen periodischen Prüfung ermittelt werden. Falls sich Vorgaben ändern bzw. Mängel im Prozess aufgedeckt werden, ist der Prozess entsprechend anzupassen oder ggfs. neu zu definieren. In der Praxis hat sich ein fest eingeplanter zyklischer Review des Prozesses bewährt. Wann und wie sollte geprüft werden? Die den Prüfungen zugrunde liegenden Konzepte müssen regelmäßig auf Aktualität und Konformität bzgl. der Vorgaben geprüft werden. Die Aktualität ist jedenfalls mit einem Upgrade auf ein neues Release (Enhancement Package) zu prüfen. Bzgl. der Vorgaben ist es durchaus sinnvoll, das Wirtschaftsprüfungsunternehmen, welches das Unternehmen prüft, hinzuzuziehen. Für extern entwickelten Code gilt, dass eine Prüfung vor Abnahme stattfinden muss. Für die Akzeptanz der Prüfungen bzw. der Beanstandung im Zuge der manuellen Prüfungen ist es sinnvoll, im Rahmen der Entwickler- und QA-Tests (4-Augen-Prinzip) die manuell notwendigen Prüfungen durch andere Entwickler durchführen zu lassen. Dasselbe gilt für Penetrationstests und Belastungstests. Da es sich bei Penetrationstests auch um ein kritisches Sicherheitsthema handelt, kann es notwendig sein, hierfür in regelmäßigen Abständen auch externe Partner hinzuzuziehen. 7.2.2Automatische Prüfungen Automatische Tests decken schnell einen Großteil der notwendigen Tests und Prüfungen ab. Als Hintergrundjob eingeplant, ist eine regelmäßige Wiederholung ohne zusätzlichen Aufwand möglich. Diese regelmäßig mit gleicher Qualität durchgeführten Tests ermöglichen so den Entwicklern, ihren Programmierstil zu verbessern. Wann und wie sollte geprüft werden? Die Entwickler sollen ein möglichst zeitnahes Feedback bzgl. der Konformität der Entwicklungen mit den Richtlinien erhalten. Dazu dienen täglich eingeplante Prüfungen im Entwicklungssystem, deren Ergebnis dem Entwickler zur Verfügung gestellt wird. Wichtig ist, dass dieselben Tests und Metriken bei der Prüfung durch jeden einzelnen Entwickler und bei der Prüfung durch zentrale QS-Instanzen bzw. bei einer Transportfreigabe verwendet werden. Sollten für diese Prüfungen unterschiedliche Werkzeuge oder unterschiedliche Einstellungen verwendet werden, sinkt die Akzeptanz in Entwicklerkreisen ganz erheblich. Als zentrale Schutzinstanz müssen die Prüfungen in das TMS und da spätestens mit der Freigabe des Transportauftrags (besser der einzelnen Transportaufgaben) implementiert sein. Damit wird sichergestellt, dass keine ungeprüften bzw. nicht den Richtlinien entsprechenden Entwicklungen in die Folgesysteme und dann auch in das Produktivsystem transportiert werden. Als „letztes Sicherheitsnetz“ ist ein regelmäßiger Prüflauf (Fullscan) im Produktivsystem vorzusehen. Dieser sollte in einer lastarmen Zeit mittels Hintergrundjob eingeplant werden. Das Ergebnis wird dem QA-Zuständigen zur Verfügung gestellt, der dann die weiteren Schritte (ggfs. Korrektur) mit hoher Priorität veranlasst. Bei allen automatischen Prüfungen ist im Vorfeld zu definieren, wie mit altem Code umgegangen wird. Sinnvoll scheint es hierfür auch, einen Fahrplan zu erstellen, wann und wie die neuen Regeln auf alten Code angewendet werden. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 41 42 7Umsetzbarkeit und Durchsetzbarkeit 7.2.3Werkzeuge Nachstehend werden einige Tools aufgelistet, mit welchen die automatisierten Prüfungen durchgeführt werden können. SAP Code Inspector Der SAP-Code Inspector wird seitens SAP im Standard ausgeliefert und ist entsprechend in die Entwicklungsumgebung hoch integriert. SAP sieht ein Erweiterungskonzept vor, welches ermöglicht, kundenspezifische Prüfungen selbst zu implementieren. Hierfür sind ggfs. Programmierarbeiten notwendig. Die seitens SAP ausgelieferten Prüfungen können teilweise weitgehend parametrisiert werden. Inspektionen auch von großen Objektmengen können sowohl online als auch im Batchbetrieb erfolgen und Ergebnismengen von vorangegangenen Inspektionen können wieder als Objektmenge verwendet werden, um die Kontrolle von Korrekturen auf die vorher fehlerbehafteten Objekte zu beschränken. Weiterhin können Ergebnisse auch automatisch per E-Mail an die verantwortlichen Entwickler verteilt werden. Werkzeuge von Drittherstellern Neben dem SAP Code Inspector gibt es am Markt sehr gute kommerzielle Tools, die Prüfungen auf Code-Ebene vornehmen. Eine Beschreibung dieser Tools soll aus Neutralitätsgründen an dieser Stelle unterbleiben. 7.3Erfahrungen und Tipps aus der Praxis 7.3.1 Qualitätssicherung des Quellcodes Um eine erfolgreiche Einführung zu gewährleisten, ist es wichtig, Qualitätssicherung schrittweise und behutsam einzuführen. Hierbei empfiehlt es sich, einen zweigeteilten Ansatz zu fahren. Zunächst sollte neuer Code „fehlerfrei“ erstellt und dies geprüft werden. Erst wenn sich dieser Prozess stabilisiert hat, sollte nach und nach Bestandscode mit in die Checks aufgenommen werden, sonst wird der zu bewältigende Berg für den Entwickler zu groß und die Motivation sinkt rapide. Wenn nicht auf der „grünen Wiese“ mit einer neuen Entwicklung begonnen wird, wenn automatische Codeprüfungen eingeführt werden, ist es wichtig, vorher den Umgang mit „Altlasten“ zu klären. Auch bei neuen Entwicklungen lassen sich Änderungen an schon bestehenden Objekten nicht vermeiden, die dann bei einer eingerichteten Transportprüfung zu Problemen führen. Hilfreich ist in solchen Fällen eine Klärung der Verantwortlichkeit für Entwicklungsobjekte, die z.B. durch das entsprechende Feld in Paketdefinitionen dokumentiert werden kann. Diese Verantwortlichen müssen entscheiden, ob Fehler im Bestandscoding sofort korrigiert werden müssen oder eine Ausnahmeregelung möglich ist. In vielen Fällen ist es schon ausreichend, mit Standard-Bordmitteln, wie z.B. Code Inspector, zu arbeiten, der sich auch um eigene Checks erweitern und somit an eigene Bedürfnisse anpassen lässt. Im NetWeaver 7.02 sind einige neue Prüfungen in der Auslieferung enthalten wie Suche nach bestimmten kritischen Anweisungen, Verwendung der ADBC-Schnittstelle, mandenatenabhängige Shared-Objects-Methoden, Robuste Programmierung und ABAP-WebDynpro-Metrik. 7.3.2Zeit und Budget QA Um die Zeit und den Aufwand für die QA-Tätigkeiten möglichst gering zu halten, muss der Entwickler die Möglichkeit haben, den Code während seiner Entwicklertätigkeit selbstständig auf Fehler hin untersuchen zu können. Tut er dies nicht, muss er automatisiert auf Fehler oder Verbesserungsmöglichkeiten hingewiesen werden. Tägliche Inspektionen mit einem entsprechenden Werkzeug und Verteilung der Ergebnisse stellen sicher, dass Fehler frühzeitig erkannt werden und die Entwickler sich noch an ihre Tätigkeiten vom Vortrag erinnern, was die Fehlerbehebung deutlich vereinfacht. So wird gewährleistet, dass auch Entwickler, die den manuellen Aufwand scheuen oder unter Zeitdruck stehen, trotzdem die Möglichkeit erhalten, ihre Fehler im Code zu beheben. Hier ist zu bemerken, je später die QA einsetzt, desto höher ist der Aufwand für die Fehlerbehebung. Dieser zusätzliche Aufwand entsteht z.B. durch zusätzliche Transporte, wenn der Originaltransport bereits freigegeben wurde. Deshalb ist es wichtig, bei Planung und Schätzung eines Projektes die Qualitätssicherung zu berücksichtigen, und zwar nicht nur am Ende, sondern projektbegleitend und anschließend im kompletten Software-Lifecycle. Nicht zu unterschätzen ist auch der Schulungsaufwand, der benötigt wird, um bei den Entwicklern um Verständnis für den Prozess zu werben. Bei einem Einsatz von externen Entwicklern müssen die Programmierrichtlinien und Namenskonventionen Bestandteil des Vertrages sein. 7.3.3Probleme Bei der Einführung einer Code QA treten eine Reihe von Problemen auf, auf die hier kurz eingegangen wird. Ein Reibungspunkt ergibt sich durch die Frage, wer für die QA zuständig ist, Ersteller oder Änderer. Bei neuen Sourcen ist dies kein Problem, bei Bestandscode aber wird die Frage immer wieder aufgeworfen: „Warum soll ich Code überprüfen, in dem ich nur eine Zeile geändert haben?“ vs. „Warum soll ich Code überprüfen, den ich schon Jahre nicht mehr angefasst habe?“ Beide Positionen sind natürlich verständlich, deswegen muss eine klare Entscheidung bezüglich Handhabung von kopiertem Code, der auf anderen/keinen Konventionen beruht, getroffen und durchgesetzt werden. BEST PRACTICE: Um bei auftretenden Problemen die Fragen der Entwickler zu beantworten, ist es wichtig, dafür eine zentrale Stelle zu schaffen. Außerdem muss es einen Prozess geben, um in Notfällen auch fehlerbehaftete Transporte freizugeben. Gibt es diese Möglichkeit nicht, sinkt das Verständnis für die durchgeführten Maßnahmen. Eine Möglichkeit ist es hierbei, einen Genehmigungsprozess zu installieren, mit dessen Hilfe auch fehlerbehafteter Code freigegeben oder transportiert werden kann. Die meisten Tools am Markt bieten diese Möglichkeit standardmäßig an. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 43 44 7Umsetzbarkeit und Durchsetzbarkeit 7.3.4Entscheidungsfindung bei Modifikationen Wichtig ist es, die Hürde für Modifikationen so hoch wie möglich zu legen. Dies ist besonders wichtig, wenn man sich dazu entscheidet, zeitnah Enhancement Packages der SAP einzuspielen (SPAUProblematik). Ansatzpunkt hierzu ist der Modifikationsschlüssel. Die Anzahl der Entwickler, die die Berechtigung haben, Modifikationsschlüssel zu generieren, muss möglichst gering sein. So ist es möglich, steuernd einzugreifen und diese über Change Requests und einen zugehörigen Prozess abzuhandeln. Die Frage, wodurch sich eine Modifikation rechtfertigt, ist unternehmensindividuell zu beantworten und konsequent umzusetzen. Eine Pauschalantwort auf diese Frage gibt es nicht. In jedem Fall sollte die Entscheidung jedoch auf gleichartigen, im Vorfeld definierten und kommunizierten Kriterien basieren. 7.3.5Erfahrungsbericht aus der Praxis: Comgroup GmbH Das nachfolgende Beispiel der Comgroup GmbH, dem IT-Dienstleister der Würth Gruppe, zeigt wie Programmierrichtlinien und Namenskonventionen in einer Softwareentwicklung ein- und durchgesetzt werden können. Die Comgroup GmbH startete mit der Code QA im globalen Entwicklungssystem einer mehrstufigen Entwicklungslandschaft. Zur automatisierten Unterstützung wurde der Code Inspector eingesetzt. Da die Code-QA-Einführung mit der Einführung eines neuen Namensraumes zusammenfiel, wurden zu Beginn des Projekts nur Objekte aus dem neuen Namensraum geprüft und Bestandscode nicht berücksichtigt. Dies erleichterte die Selektion im Code Inspector, da dieser keine Änderungs- oder Erstellungsdaten bei der Selektion berücksichtigt. Außerdem wurden Performance- und Security-Checks aus dem Code Inspector vorerst nicht aktiviert, um den Aufwand in einem überschaubaren Rahmen zu halten. Hierdurch hat der Entwickler die Möglichkeit, seinen Code während seiner Entwicklertätigkeit selbstständig zu checken. Zusätzlich wurde ein Nachtlauf eingeplant, der den kompletten zu scannenden Code analysiert und bei gefundenen Fehlern Mails an den jeweiligen Entwickler sendet. Probleme bereitete hierbei, dass es viele User im System gab, die keine zugeordnete Mailadresse hatten, was dazu führte, dass zu Beginn Mails ihren Empfänger nicht erreichten. Mails an Entwickler ohne Mailadresse werden an eine zentrale Adresse versendet und somit können die unvollständigen Datensätze mit einem geringen Aufwand identifiziert werden. Deshalb werden nun keine Entwicklungs-User mehr im System ohne Mailadresse angelegt. Die Mails wurden nicht von einem anonymen Batch-User sondern von der Mailadresse des QA-Verantwortlichen gesendet, um dem Entwickler einfach die Möglichkeit zu geben, Fragen zu stellen. Zu Beginn entstand hierdurch ein hoher Aufwand, die Anzahl der Fragen verringerte sich aber mit der Laufzeit des Projekts. Dies konnte erreicht werden, da Schulungen durchgeführt wurden und so die Entwickler effizienter die Fehler korrigieren konnten oder diese schon bei der Entwicklung vermieden. Die Entwicklungssprache in der Entwicklungslandschaft ist Englisch. Dies wird durch einen weiteren Job geprüft und bei Fehlern dem Entwickler gemeldet. SAP bietet keine Möglichkeit im Standard, bei der Anlage die richtige Sprache zu setzen. Deshalb bot sich nur die Möglichkeit, an passender Stelle eine entsprechende Prüflogik per Modifikation einzubauen oder damit zu leben, dass Objekte in falscher Sprache angelegt werden und danach umgezogen werden mussten. Bei Anlage von Objekten wurden Namenskonventionen für die Objekte gecheckt, sodass diese nur nach Konventionen benannt werden konnten (ebenfalls per Modifikation). Um eigene Checks bei der Transportfreigabe durchzuführen (z.B. eigene Namenskonventionen/ mind. deutsche und englische Übersetzung) wurde eine Implementierung für das Business Add In CTS_REQUEST_CHECK angelegt und die Methode CHECK_BEFORE_RELEASE genutzt. Nachdem der Prozess sich im globalen Entwicklungssystem stabilisiert hatte, wurde dieser an die nachfolgenden Entwicklungssysteme und Namensräume ausgerollt. Bestandscode wird bisher noch nicht gecheckt. Zusätzlich ist geplant, ein externes Tool einzusetzen, das die Qualitätssicherung vereinfacht. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 45 46 8Infrastruktur und Lifecycle Management Neben methodischen Empfehlungen und Werkzeugen zur Unterstützung bei der Softwareentwicklung im SAP-System stellen die Infrastruktur und die Betrachtung des Lebenszyklus einer Softwarekomponente eine wichtige Rahmenbedingung für erfolgreiches Arbeiten dar. In diesem Kapitel liegt auf diesen beiden Aspekten der Fokus. 8.1Infrastruktur Eine SAP-Systemlandschaft ist i.d.R. mehrstufig aufgebaut. Nachfolgend werden die einzelnen Systeme und ihre Bedeutung dargestellt: 8.1.1Sandbox Die Sandbox ist ein reines Test- und „Spielsystem“. In der Sandbox gelten keine Einschränkungen in Bezug auf Berechtigungen, das gilt gleichermaßen für Customizing- und Workbench-Entwicklungen. Aus der Sandbox sind keine Transporte in andere Systeme erlaubt. Änderungen können ausprobiert werden, bevor sie im Entwicklungssystem durchgeführt werden. Damit kann der Rückbau komplexer Entwicklungen in der Entwicklungsumgebung vermieden werden, wenn z.B. eine Neuentwicklung nicht weiter verfolgt werden soll. 8.1.2Entwicklungssystem Ein kombiniertes Entwicklungs-/Testsystem (z.B. Entwicklungsmandant 010, Testmandant 110) bietet sich als einfache und praktikable Lösung an. Es ist beispielsweise kein Transport von Workbench-Objekten erforderlich, um Neuentwicklungen zu testen. Im Testmandanten herrscht dabei absolutes Customizing-Verbot. Customizing dieses Mandanten wird ausschließlich durch Mandantenkopie aktualisiert (SCC1). Entwickler/Modulbetreuer haben im Testsystem sehr weitreichende Berechtigungen. Einschränkungen müssen individuell festgelegt werden, z.B. für besonders sensible Daten (HR etc.). Berechtigungen/Rollen werden grundsätzlich im Entwicklungssystem erstellt und transportiert. Generell werden alle zu transportierenden Änderungen in einem Mandanten im E-System vorgenommen. 8.1.3Qualitätssicherungssystem Im QA-System herrscht absolutes Customizing- und Entwicklungsverbot. Customizing- und Workbench-Objekte werden ausschließlich per TA importiert. Importe nach Produktion erfolgen grundsätzlich über das QA-System. Damit wird die Übereinstimmung einer mit Produktion übereinstimmenden Systemumgebung sichergestellt. Das QA-System wird bei Bedarf z.B. für umfangreichere Validierungsaktivitäten aus dem Produktionssystem kopiert. Damit wird auch die Übereinstimmung mit der operativen (Daten-) Umgebung sichergestellt. Im QA-System erfolgt die Durchführung von Testplänen nach Änderungen und Neuentwicklungen. Entwickler/Modulbetreuer haben im QA-System sehr weitreichende Berechtigungen. Einschränkungen müssen individuell festgelegt werden, z.B. für besonders sensible Daten (HR etc.). Es empfiehlt sich aber auch, Testbenutzer mit produktionsnahen Berechtigungen zu verwenden. 8.1.4Produktion Im Produktionssystem herrscht absolutes Customizing- und Entwicklungsverbot. Customizingund Workbench-Objekte werden ausschließlich per Transportauftrag in dieses System importiert. Entwickler/Modulbetreuer haben im Produktionssystem nur eingeschränkte Berechtigungen; Emergency-Tabellenänderungen (&SAP_EDIT) sind zu dokumentieren mit Datum/Uhrzeit und Begründung. Hierzu empfiehlt sich die Verwendung eines Tools, um die Meldungen zu standardisieren. Der Umgang mit Notfall-Usern muss technisch und organisatorisch festgelegt werden. 8.1.5Transportwesen Wir empfehlen, die technische Freigabe von Transporten grundsätzlich durch interne, verantwortliche Bearbeiter durchführen zu lassen, nicht von externen Beratern. Hierbei ist generell die formale Freigabe vorausgesetzt (siehe Change-Verfahren). Importe werden generell zentral von der SAP-Basis durchgeführt, ausgenommen die Mandantenkopie innerhalb des Test-/Entwicklungssystems. Der Transportweg ist wie folgt festgelegt: Entwicklung -> QA -> Produktion Die Sandbox sollte aus dem Transportweg ausgeschlossen werden. Importe in die Sandbox erfolgen nur auf individuelle Anforderung. Dabei ist der Transportweg immer Entwicklung -> Sandbox, nicht umgekehrt! Die Importe in das QA-System müssen in Abhängigkeit der Systemlandschaft organisiert werden. Falls möglich, können Importe in QA zyklisch und automatisiert durchgeführt werden, um die Mitarbeiter der Basisabteilung zu entlasten. Importe in das Produktivsystem sind explizit unter Angabe der TA-Nr. freizugeben. Hierfür wird ebenfalls die Verwendung eines geeigneten Tools (z.B. Solution Manager) zur Standardisierung/ Formalisierung empfohlen. BEST PRACTICE: Checkliste vor Ausführung eines Workbench-Transports: 1. Tests erfolgt? Sämtliche Funktionen wurden erfolgreich getestet und (kundenseitig) abgenommen 2. Code geprüft? Der Code Inspector/Erweiterte Programmprüfung wurde für alle Programme des Transportauftrags durchgeführt: Die Ergebnisliste darf dabei keine Fehler oder Warnungen enthalten, Informationsmeldungen sind zulässig 3. Drittanbietertools? Sofern weitere Testtools für Themenbereiche wie Security, Performance, … vorhanden sind, wurden diese eingeplant 4. Manuelle Vor-/Nacharbeiten? Es ist zu prüfen, ob eine vollständige Checkliste für manuelle Vor-/Nacharbeiten zum Transport vorliegt 5. Mehrsprachigkeit? Sofern mehrsprachige Objekte im Transportauftrag enthalten sind, ist zu prüfen, ob die Übersetzungen vorhanden sind Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 47 48 8Infrastruktur und Lifecycle Management 6. Abhängigkeiten in den Transporten? Falls ein Vorabtransport durchgeführt wurde, muss auf Abhängigkeiten in den Transporten geprüft werden 7. Namenskonventionen? Erstellen einer Liste der Transportobjekte und Prüfung der Einhaltung der Namenskonvention anhand der Objektliste 8. Dokumentation (systemintern)? a.Systemintern: Prüfung aller Objekte hinsichtlich erstellter/aktualisierter SAP-Dokumenta tion, z.B. - Reportdokumentation (Beschreibung und in ABAP-Coding) - FuBa-Dokumentation komplett (Parameter, Ausnahmen etc.) - Datenelemente, Strukturen, Tabellen (Beschreibung, Überschriften etc.) Vorgehensweise: Erstellen einer Liste der Transportobjekte und Prüfung anhand der Objektliste b.Außerhalb des Systems: Dokumentation vorhanden/vollständig/abgenommen? 8.1.6Rückbau von Neuentwicklungen Wenn Entwicklungen im Entwicklungssystem erstellt, aber nicht weitertransportiert worden sind bzw. nur ins QS-System importiert wurden, sind die Änderungen im Entwicklungssystem zurückzubauen. Im Falle der Nutzung von Quality Assurance (QA) als Genehmigungsworkflow gilt: >Die Ablehnung verhindert lediglich den Weitertransport ins Produktionssystem. Die abgelehnte Entwicklung/Customizing ist aber im Entwicklungs- und im Qualitätssicherungssystem noch vorhanden. Daraus ergibt sich ein „Schiefstand“ zwischen den Einstellungen einerseits des Entwicklungs-/Qualitätssicherungssystems sowie andererseits des Produktionssystems. >Um den Schiefstand zu beseitigen, muss die abgelehnte Entwicklung im Entwicklungssystem zurückgenommen, dort in einen Transportauftrag aufgenommen und ins Qualitätssystem transportiert werden. >Der Transportauftrag, der die Rücknahme enthält, soll im Qualitätssystem ebenfalls abgelehnt werden. Damit wird die Übereinstimmung der Einstellungen zwischen den Systemen wiederhergestellt. >Die zuständigen Entwickler müssen von abgelehnten Transporten erfahren. Die Pflicht zur Informationsweitergabe soll bei den für die QA-Genehmigungen zuständigen Personen liegen. 8.1.7Sicherstellung der Konsistenz von Neuentwicklungen/Erweiterungen Bei parallel laufenden Projekten besteht die Gefahr von Überschneidungen. Es kann zur überschneidenden Verwendung von Objekten kommen, die es im Zielsystem (noch) nicht gibt. Dies führt zum Fehler beim Import. Hieraus ergibt sich die Pflicht zur Prüfung der von Dritten (Non-SAP) erstellten Objekte bei deren Verwendung. Neuentwicklungen/Erweiterungen müssen in geeigneten Paketen bzw. Transportaufträgen gekapselt werden. Es wird empfohlen, die Transportaufträge für ein Projekt auf je 1 TA für Workbench, Customizing und Berechtigungsrollen einzuschränken. ‚Vorabtransporte’ sollten nur mit Hilfe von „Kopientransporten“ erlaubt sein. Die endgültige Freigabe und der Transport erfolgt erst zum Projektabschluss. Alle Projektmitarbeiter verwenden innerhalb eines Projekts nur Aufgaben zu einem jeweils vorgegebenen TA. Es gibt keine ‚persönlichen’ Transportaufträge für Projektmitarbeiter. Generell erfolgt ein Import nur nach formeller Freigabe (siehe Change-Verfahren) durch einen Process Owner, QS o.ä. Instanzen. Die Abfolge sowie die beteiligten Bereiche müssen unternehmensspezifisch festgelegt werden. 8.2 Change Management Um eine SAP-Systemlandschaft wartbar und beherrschbar zu gestalten, ist ein formales ChangeVerfahren die Voraussetzung für jede Systemänderung. Dabei ist das grundsätzliche Verfahren unabhängig davon, ob es sich um Änderungen am SAP-Standard oder an Kundenentwicklungen handelt. Das Basiswerk zur Einführung eines Change- und Releasemanagements ist die Information Technology Infrastructure Library (ITIL). In diesem Referenzleitfaden sind umfangreiche und allgemeingültige Best Practices beschrieben. In diesem Kapitel stellen wir einen konkret realisierten Praxisfall aus der Entwicklung dar, der firmen- bzw. branchenspezifisch adaptiert werden kann. Wir empfehlen grundsätzlich, die folgenden Aspekte bei der Einführung eines Change-Control(auch: Change-Request-)Verfahrens zu berücksichtigen: > Fachliche Anforderung >Begründung > Bewertung (Aufwandschätzung) >Genehmigung > Freigabe der Änderung für das Produktionssystem Der Genehmiger-/Freigeberkreis (Process Owner, QS …) ist abhängig vom Gegenstand der Änderung (betroffener Bereich, betroffene Anwendung, gegebenenfalls auch Aufwand). Die Verwendung eines geeigneten Tools (z.B. Solution Manager) wird dringend empfohlen. Dabei gilt jedoch: Eine papierbasierte Lösung ist besser als keine! Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 49 50 8Infrastruktur und Lifecycle Management Beispiel für ein Change-Control-Formular (CC): Abbildung 4: Change-Control-Formular Das abgebildete CC-Formular enthält beispielhaft die wesentlichen Daten, die begleitend zur Abwicklung einer Systemänderung erforderlich sind. Basisprozess und Rollen: > der Anforderer füllt den Teil ‚Anfordernde Abteilung’ aus und sorgt für die Unterschrift des Process Owners/des Process Owners fremd > der Process Owner ist in der Regel ein Vorgesetzter des Anforderers, er ist verantwortlich für einen bestimmten Teil der Daten bzw. für die Nutzung bestimmter Teile der SAP-Software, z.B. der Einkaufsleiter für die SAP-Einkaufsdaten und -programme > der Process Owner fremd ist immer dann einzubeziehen, wenn eine Änderung auch Teile betrifft, die außerhalb der eigentlichen Zuständigkeit des Process Owners liegen Beispiel: Der Einkäufer benötigt Berechtigungen aus dem Bereich der Anlagenbuchhaltung; hier muss der Process Owner zustimmen, der diesen Teil des Systems verantwortet (z.B. der Leiter der Anlagenbuchhaltung). >Eine ausführliche Beschreibung der Änderung ist in jedem Fall dem CC als Anlage anzufügen; CCs ohne eine ausführliche Beschreibung werden zurückgewiesen. >Der Anforderer gibt das CC an die IT weiter. >Der SAP-Koordinator ist derjenige, der die anfallenden Aktivitäten für SAP oder einen Teil von SAP koordiniert und den einzelnen Modulbetreuern die Aufgaben zuweist. Diese Aufgabe kann – in Abhängigkeit der Größe der Organisation – auch von einem Gruppen- oder Abteilungsleiter innerhalb der IT übernommen werden. Die betreffende Person trägt die Applikation/das Modul im Formular ein und weist das CC einem Bearbeiter zu; sie kann das CC auch aufgrund formaler Fehler (fehlende/unzureichende Beschreibung oder fehlende Unter- schrift des Process Owners/Process Owner fremd) zurückweisen. Der SAP-Koordinator vergibt eine eindeutige CC-Nummer und den CC-Titel; die Nummer kann z.B. auch von einem Projektverfolgungs-/-dokumentationstool übernommen werden. >Der IT-Leiter/Leiter SAP genehmigt / lehnt ab / stellt zurück (mit entsprechender Begründung), nachdem der Koordinator genehmigt hat. >Im Falle der Genehmigung erhält der Bearbeiter das CC zur weiteren Bearbeitung; eine Änderung zwecks Weitertransport darf von einem Bearbeiter nicht ohne ein vollständig genehmigtes CC durchgeführt werden. >Nach Fertigstellung lässt der Bearbeiter die Änderung durch den Anforderer prüfen. >Entspricht die Umsetzung den Anforderungen, gibt der Anforderer die Änderung zum Transport frei; der Anforderer bestätigt mit seiner Unterschrift die ordnungsgemäße Umsetzung; ein Transport darf nicht ohne vorangegangene Freigabe durch den Anforderer durchgeführt werden. >SAP-Koordinator und IT-Leitung bestätigen die ordnungsgemäße Umsetzung; ein Transport darf nicht ohne vorangegangene Freigabe durch die SAP-Koordination und die IT-Leitung durchge- führt werden. >Der Bearbeiter übergibt den Transport in das Produktionssystem und leitet das CC an die SAP Koordination und die IT-Leitung weiter. Der Genehmigungs- und Freigabeprozess und damit auch der Inhalt des Formulars kann branchenspezifisch stark variieren. In pharmazeutischen Unternehmen ist beispielsweise grundsätzlich die QA in das CC-Verfahren eingebunden. Darüber hinaus ist es in allen Unternehmen üblich, dass bei Überschreiten bestimmter (geschätzter) Projektkostenlimits weitere Genehmiger der Umsetzung einer Änderungsanforderung zustimmen müssen. Die Genehmigungsstruktur hängt also im Wesentlichen von der jeweiligen Unternehmensorganisation ab. Das Formular enthält daher lediglich die Minimalanforderungen an ein CC ohne Berücksichtigung branchen- oder organisationsspezifischer Anforderungen. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 51 52 8Infrastruktur und Lifecycle Management Weitere Genehmigungs- oder Freigabeschritte, aber auch zusätzliche Felder mit Bezug zu anderen Dokumenten (z.B. Validierungsdokumente) sind bei Bedarf individuell zu ergänzen und der Prozess entsprechend zu erweitern. WEITERE QUELLEN: 1. Mathias Friedrich, Torsten Sternberg, Change Request Management mit dem SAP Solution Manager, SAP Press, 2009 2.Information Technology Infrastructure Library (ITIL) 8.3Softwarewartbarkeit Die Wartbarkeit von Software ist ein Kriterium bei der Entwicklung von Software und zeigt an, mit welcher Energie und mit welchem Aufwand Änderungen in einem Systemzusammenhang von Applikationen durchgeführt werden können. (Quelle: Wikipedia) Technisch ist ein modularer Aufbau von Objekten entsprechend SAP-Praxis, d.h. Include-Struktur in allen Programmen erforderlich. Dies umfasst auch die Verwendung von Funktionsbibliotheken, die auch anderen Entwicklern zugänglich sein müssen und von ihnen leicht aufgefunden werden können. In Systemumgebungen mit verschiedenen Entwicklungs- und Produktionssystemen (Transportstrecken) muss der Grundsatz gelten: gleicher Objektname (T-Code, Programm, Include, Tabelle etc.) bedeutet auch identische Funktionalität. Unterschiedliche Funktionalität bedingt entweder ein eigenes Objekt oder – falls möglich – eine entsprechende Customizing-Funktion. Alle Entwicklungen/Änderungen/Korrekturen sind sauber zu dokumentieren. 8.4Anpassungen der SAP-Funktionalität Um die Funktionalität eines SAP-Systems an eigene Bedürfnisse anzupassen, gibt es verschiedene Möglichkeiten, die jeweils Vor- und Nachteile mit sich bringen: >Modifikation >Z-Kopie, Kopie in Kundennamensraum >Erweiterungen (User-Exit, Customer-Exit, BAdI, Enhancement, BTE) Zu den problemlos nutzbaren Techniken zählen User-Exits, Customer-Exits, BTEs und BAdIs. Deshalb ist es zu empfehlen, diese zu verwenden, sofern diese vorhanden sind und ihre Schnittstelle alle nötigen Daten zur Verfügung stellt. Hier eine kurze Beschreibung dieser Techniken: User-Exit User-Exits sind Unterprogramme, die sich in Includes im SAP-Namensraum befinden, aber nur einmalig von SAP ausgeliefert werden und deshalb ohne Probleme „modifiziert“ werden können. Customer-Exit Customer-Exits sind Funktionsbausteine, die zu- und abschaltbar sind und vom Kunden implementiert werden können, um Standardfunktionalität zu erweitern. Business Transaction Events (BTE) Im FI-Umfeld stellen BTEs eine zusätzliche Möglichkeit der Erweiterung dar. BTEs sind vergleichbar mit Customer-Exits, beschränken sich jedoch auf das FI Modul und stellen eine vordefinierte Schnittstelle zur Verfügung an die der Entwickler Erweiterungen anhängen kann. Weitere Informationen finden sich in der SAP-Standarddokumentation. BAdI Mit BAdIs versuchte SAP die Nachteile anderer/bisheriger Erweiterungstechniken zu umgehen: > nur einfach verwendbar (Customer-Exits) > keine Dynpro-Erweiterungen (BTEs) > keine Menü-Erweiterungen (BTEs) > keine Verwaltungsebene (BTEs) Deshalb sind BAdIs mehrfach verwendbar, stellen alle Erweiterungsarten (Programm- / Menü- / Dynpro-Exit) zur Verfügung und sind objektorientiert ausgeführt. Kann mit den bereits genannten Erweiterungen das gewünschte Ergebnis nicht erreicht werden, gibt es weitere Möglichkeiten, deren Verwendung aber von Fall zu Fall abgewogen werden muss. Enhancement Point / Enhancement Section Enhancement Point: Bietet die Möglichkeit, an festgelegten Stellen (implizit oder explizit) Code einzufügen. > mehrere aktive Implementierungen > alle aktiven Implementierungen werden ausgeführt Enhancement Section: > mehrere aktive Implementierungen möglich > nur eine aktive Implementierung wird ausgeführt > nicht klar, welche aktive Implementierung ausgeführt wird Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 53 54 8Infrastruktur und Lifecycle Management Hinweis: Implementierungen von Enhancement Sections können durch das Einspielen von SAP Enhancement Packages oder das Aktivieren von Business Functions durch neue aktive Implementierungen oder neu aktivierte Implementierungen ersetzt werden. Es ist hierbei sehr schwierig, ersetzte und nicht mehr ausgeführte Implementierungen zu identifizieren. Somit kann sich durch Änderungen im SAP Standard das Verhalten der Erweiterung ändern. Dies erhöht den notwendigen Testaufwand (TCO!) massiv und führt leicht zu Disruption bei einem SAP Releaseupgrade und EHP. Die Verwendung von Enhancement Sections ist daher sehr sorgfältig zu prüfen. Bei der Verwendung von Enhancements ist die SPAU_ENH zu abarbeiten, da die Enhancements in der regulären SPAU-Transaktion nicht angezeigt werden. Die Entscheidung, ob Enhancements als Erweiterungskonzept genutzt werden sollen, ist also nicht nur abhängig vom Realisierungsaufwand, sondern auch von einem möglichen Folgeaufwand. Modifikation Grundsätzlich sollte nur dann modifiziert, wenn: > Customizing oder Personalisierung Ihre Anforderung nicht umsetzen können > geeignete Erweiterungen oder User-Exits nicht vorgedacht sind > das Kopieren des SAP-Objekts in den Kundennamensraum nicht sinnvoll ist Für Modifikation/Exits/BADIs wird – zusätzlich zum Change Verfahren – ein separates Genehmigungsverfahren empfohlen. Hierzu gehören Antrag -> Begründung -> Genehmigung. Die Entscheidung muss von dem/den jeweiligen Systemverantwortlichen (IT-Leitung) getroffen werden. Vorteil hierbei ist, dass der Entwickler einen Modifikationsschlüssel eingeben und dieser zentral vergeben werden kann. Es kann also relativ einfach verhindert werden, dass ungewollte Modifikationen ins System eingebaut werden. Kopien in eigenen Namensraum/Z-Namensraum Kopien von SAP-Standardcode in den Kundennamensraum sind sehr pflegeaufwändig. Bislang gibt es kein automatisiertes Verfahren und keine manuelle Regelung, wie ein späterer Abgleich (bspw. nach Support-Packages oder Hinweiseinbau) zwischen Original und Z-Kopie erfolgen kann. Eine allgemeine Empfehlung kann an dieser Stelle nicht gegeben werden, da Vor- oder Nachteile jeweils im unterschiedlichen Kontext abgewogen werden müssen. BEST PRACTICE für die Durchführung von Modifikationen: > Grundsätzlich sind Workbench-Modifikationen nur unter Verwendung des Modifikations assistenten erlaubt! >Eine Z-Kopie ist nicht immer die erste Wahl, da dies u. U. mit sehr hohem Realisierungsauf- wand verbunden ist. Darüber hinaus gehen Weiterentwicklungen im Standard unberücksichtigt an der Z-Kopie vorbei, d.h., es resultiert ebenfalls ein Aufwand für die Anpassung bzw. Erstellung einer neuen Z-Kopie. Nach dem Einspielen von Enhancement Packages können verwendete Standard-Includes zu Problemen führen. >Die Entscheidung Modifikation vs. Z-Kopie vs. Enhancement ist also nicht nur abhängig vom Realisierungsaufwand, sondern auch von einem möglichen Folgeaufwand. > Keine der Möglichkeiten Modifikation/Z-Kopie/Enhancement hat nur Vor- oder nur Nachteile, es ist hier von Fall zu Fall zu prüfen, welche Technik die wenigsten Nachteile im speziellen Fall mit sich bringt. >Es wird empfohlen, eine zentrale, formalisierte, technische Dokumentation aller Modifikationen einzurichten. Für Kopien und Erweiterungen sollten geeignete Templates bereitgestellt und es sollte eine Pflicht zu deren Verwendung bestehen. WEITERE QUELLEN: SAP Schulungen BC425 und BC427 8.5Testbarkeit von Anwendungen Um die Testbarkeit von Anwendungen zu gewährleisten, müssen die Testanforderungen zu einem sehr frühen Zeitpunkt in der Entwicklung festgelegt werden. Gewachsenes Coding nachträglich testbar zu machen, ist meistens mit sehr hohem Aufwand verbunden, der keine neue Funktionalität bietet und daher in der Praxis sehr niedrig priorisiert wird. Um wirtschaftlich sinnvoll mit Tests umzugehen, müssen Tests automatisiert werden. Dazu ist es notwendig, die Durchführung von Tests wiederholbar zu machen. Versuchen Sie, den Code so zu schreiben, dass er von einem statischen Codeanalyse-Werkzeug weitestgehend untersucht werden kann. Das bedeutet, insbesondere auf dynamische Anweisungen zu verzichten, da deren semantische Bedeutung erst zur Laufzeit bekannt ist und von einem statischen Tool nicht hinreichend analysiert werden kann. BEST PRACTICE: Verwenden Sie von Anfang an automatisierte Tests (ABAP Unit, eCATT), um die Automatisierung von Tests zu einem „normalen“ Bestandteil der Entwicklung zu machen. BEST PRACTICE: SAP unterstützt mit der Test-Workbench testgetriebene Entwicklungen durch Modultests. Testklassen werden als lokale Klassen angelegt und durch den Zusatz „FOR TESTING“ als solche kenntlich gemacht. Der dort implementierte Programmcode wird lediglich ausgeführt, wenn die Anwendung über den Menüpunkt „Modultest“ in der ABAP-Workbench aufgerufen wird. Sogenannte Risk-Levels geben die Kritikalität eines Tests im Falle des Scheiterns an und Systemeinstellungen verhindern gegebenenfalls, dass ein Systemtest einer höheren Risikostufe ausgeführt wird. Im ABAP-Umfeld ist in vielen Fällen die gelungene Integration der Datenbank ein Hindernis, wenn es um die Erstellung von wiederholbaren, automatisierten Tests geht. Im Vorfeld des Tests müssen die betroffenen Einträge auf der DB in die Form gebracht werden, die für die jeweilige Testausführung erwartet wird, und Änderungen an der DB durch die Testausführung müssen wieder beseitigt werden, um andere Tests nicht zu behindern. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 55 56 8Infrastruktur und Lifecycle Management BEST PRACTICE: Trennen Sie in Ihren Anwendungen die direkte Interaktion mit der DB und entfernten Systemen, deren Laufzeitverhalten nicht kontrolliert werden kann, von dem eigentlichen Anwendungskern. Wenn dieser Anwendungskern nicht mehr direkt mit der DB und den entfernten Systeme kommuniziert, bieten die dafür benötigten Schnittstellen die Möglichkeit, für die Durchführung von automatisierten Tests die Datenkonstellationen zu simulieren. Werden z.B. alle DB-Zugriffe (SELECT, INSERT, UPDATE, DELETE) in einer DB-Schicht gekapselt, bietet diese Kapselung den Ansatzpunkt, um bei der Testausführung mit simulierten Daten zu arbeiten, die bei jeder Testausführung in einem konsistenten und bekannten Zustand sind. WEITERE LINKS: www.testbarkeit.de http://de.wikipedia.org/wiki/Testbarkeit http://www.testbarkeit.de/Publikationen/TAE05_Artikel_jungmayr.pdf 57 Die folgenden Autoren waren maßgeblich an der Erstellung der vorliegenden Fassung des Leitfadens beteiligt: Peter Lintner, Senior Consultant, Allgemeines Rechenzentrum GmbH Herr Lintner ist zertifizierter Projektmanager (IPMA-Level C) und seit 1998 im Bereich SAP ABAP Entwicklung tätig. Seine Schwerpunkte liegen in den Bereichen Applikations- und WorkFlow-Entwicklung, Change- und Requestmanagement. Steffen Pietsch, Vice President, IBSolution GmbH Herr Pietsch ist seit 2003 im entwicklungsnahen Umfeld tätig und konnte Erfahrungen als Entwickler sowie in verschiedenen leitenden Positionen im Entwicklungsumfeld sammeln. Seit 2009 setzt er sich als Sprecher des DSAG-Arbeitskreises SAP NetWeaver Development für die Interessen der Kunden und Partner in Zusammenarbeit mit der SAP ein. Markus Theilen, IT-Koordinator, EWE AG Herr Theilen ist seit 2001 als Entwickler, Software- und Unternehmensarchitekt tätig und konnte in diesen Rollen tiefgreifende Erfahrungen in komplexen SAP-ERP-Implementierungen sammeln. Seit 2012 steuert er als IT-Koordinator im EWE-Konzern die Entwicklungstätigkeiten ausgewählter Anwendungen. Daneben arbeitet er als stellvertretender Sprecher des DSAG-Arbeitskreises SAP NetWeaver Development in der DSAG e.V. mit. Jürgen Wachter, Process Coordinator Development, comgroup GmbH Herr Wachter arbeitet seit 2002 im Bereich SAP Entwicklung. Sein fachlicher Schwerpunkt liegt im Bereich Core Development/Enhancements. Michael Werner, SAP Anwendungsberater (Inhouse), LTS AG Andernach Herr Werner sammelte von 1988 bis 1999 Erfahrungen im Bereich SAP R/2 mit den Schwerpunkten SAP Basis, Logistik und Programmierung (ABAP und Assembler). Seit 1999 ist er als SAP R/3 Anwendungsberater für die Module MM, WM und PM tätig und führt ABAP-Entwicklung von ADD ONs, Schnittstellen und Erweiterungen durch. Andreas Wiegenstein, Managing Director und Chief Technology Officer (CTO), Virtual Forge GmbH Herr Wiegenstein arbeitet seit 2002 im Bereich SAP Security. Er ist Co-Autor des Buches „Sichere ABAP-Programmierung“ (SAP Press) und hält regelmäßig Vorträge zum Thema SAP/ABAP Sicherheit und Compliance auf internationalen Konferenzen, wie z.B. RSA, Black-Hat, Hack In The Box, Troopers, SAP TechEd und auf DSAG-Veranstaltungen. Darüber hinaus haben folgende Personen durch die Bereitstellung von Unterlagen, Reviewtätigkeiten und zahlreiche Diskussionen maßgeblich zum aktuellen Stand beigetragen: Michael Cendon, Thorsten Franz, Pascal Mannherz, Thomas Prang, Markus Tradt, Tobias Trapp, Peter Weigel, Marc Zimmek Besonderer Dank gilt der SAP, insb. Horst Keller und Dr. Wolfgang Weiss, die mit konstruktiven Vorschlägen und Reviews die Arbeit an diesem Dokument unterstützt haben. Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 9Die Autoren 58 10Anhang: Namenskonventionen Im Folgenden finden Sie ein Beispiel, wie Namenskonventionen im Bereich der ABAP-Entwicklung aufgebaut werden können. Dieses Beispiel kann als Anhaltspunkt für den Aufbau einer eigenen Namenskonvention verwendet werden und ist dahingehend branchen- und unternehmensspezifisch anzupassen. Allgemeiner Hinweis: Objekte im ABAP Dictionary haben unterschiedliche Begrenzungen in der Anzahl zur Verfügung stehender Zeichen. Bei der Benennung der Objekte ist dies zu berücksichtigen. Nachfolgend wird der Kundennamensraum Y… verwendet. Stattdessen kann, wie in Kapitel 2 beschrieben, alternativ der Namensraum Z… oder ein kundeneigener Namensraum /…/ verwendet werden. Abkürzungen Abkürzungen Bedeutung Mm Modul bzw. Projekt Die Abkürzung mm repräsentiert ein SAP-Modul (z.B. PP MM) oder ein kundenspezifisches Projekt. Uu Arbeitsgebiet Ein Arbeitsgebiet erlaubt optional eine feinere Unterteilung eines Moduls oder eines Projekts. Das Arbeitsgebiet wird vom Projektleiter definiert und kommuniziert. K Konstante C Alphanumerisches Zeichen N Numerisches Zeichen … Beliebige Länge 10.1Allgemeine Namenskonventionen Strukturierende Elemente Typ Konvention Beispiel Entwicklungspakete Ymmuu… YPPRUECK Reports Ymmuu… Ymmuu… Modulpools SAPMYuu SAPMYCAUB Includes TYmmuuccc..._(A)* MYCAUB_TOP Transaktionen Ymm.. YMM01 Nachrichtenklasse Ymm.. YPPRUECK WebDynpro ABAP Ymm…** YPKS_ADMIN_1 Anmerkungen: *Das Include beginnt mit dem Namen des Modulpools ohne den Präfix „SAP“. Zum Schluss wird die Art(A) des Includes angegeben: >TOP > PBO > PAI > FORMS > CLASS Top Include Process Before Output Include Process After Input Include Include für Unterprogramme Include für lokale Klassen ** Die Verwendung des WebDynpro Editors (z.B. in der se80) führt zur automatischen Erzeugung von Quellcode. Dies macht die Umsetzbarkeit eigener Namenkonventionen im Einzelfall schwer. Data-Dictionary-Objekte Typ Konvention Beispiel Tabellen Ymmuu…(t) YPPORDER Views Ymmuu…_V YPPORDER_V Tabellentypen Ymmuu…_TT YCADOCUMENT_TT Struktur Ymmuu…_S YCADOCUMENT_S Datenelement und Ymmuu… YCAFTDATUV Domäne Suchhilfe Ymmuu…. YPPPROJE Sperrobjekte EY_<Tabelle> EY_YSDMINFO Typgruppen Ymmcc YCA02 Typ Konvention Beispiel Klassen YCL_mm_... YCL_SD_FAKTURA Interfaces YIF_mm.. YIF_SD_BOOKING Klassen & Interfaces 10.2Attribute Lokale Variablen und Attribute einer Klasse sollten im Normalfall als private deklariert werden. Der Zugriff auf die Attribute sollte über get- und set-Methoden erfolgen. LV_...Attribut Variable (local value …) LS_...Attribut Struktur (local structure …) LT_... Attribut Tabelle (local table…) Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 59 60 10Anhang: Namenskonventionen 10.3Methoden Methoden sollten einen kurzen, sprechenden, englischen Namen besitzen. Folgende Präfixe deuten auf die Aufgabe der Methode: set_...Setzen von Werten get_... send_... Senden von Informationen save_...Sichern der Daten auf die Datenbank Laden von Werten etc. Die genaue Funktion sollte in der Beschreibung der Methode stehen. Reicht der Platz (60 Zeichen) nicht aus, so sollte die ausführliche Dokumentation der Methode in der Klassendokumentation erfolgen. 10.4Signatur von Methoden Die Parameter einer Methode werden wie folgt bezeichnet. Nr. Parameterart Präfix 0 Importing I_... 1 Exporting E_... 2 Changing C_... 3 Returning R_... 10.5 Funktionsgruppen und -bausteine Typ Konvention Beispiel Funktionsgruppen Ymm_ccc_… YCA_KONFIGURATION Funktionsbausteine Ymm_... YSD_FAKTURA_ZU_WE Die Schnittstellen von Funktionsbausteinen orientieren sich an denen der objektorientierten Programmierung (vgl. 10.4). BEST PRACTICE: Tabellen können auch als Import, Export oder Changing Parameter übergeben werden, sodass stets Klarheit herrscht, welche Tabellen im Funktionsbaustein geändert werden und welche nicht. Des Weiteren stellt der Syntax-Check im ABAP sicher, dass Importparameter nicht verändert werden dürfen. 10.6Enhancements Typ Konvention Beispiel Enhancement YES_... YES_MV45A YED_... YED_ MV45A YEI_... YEI_ MV45A Spot Enhancement Definition Enhancement Implementation 10.7Formulare Typ Konvention Beispiel Adobe Forms – Formular Ymm.. YPP_VBK1 Adobe Forms – Schnittstelle Ymm.._IF YPP_VKB_IF Smart Forms / SapScript – Formular Ymm.. YPP_VBK1 Smart Forms / SapScript – Stil Ymm.. YPP_VBK1 Smart Forms / SapScript – Textbaustein Ymm.. YPP_VBK1 Suchhilfe Ymmuu…. YPPPROJE Sperrobjekte EY_<Tabelle> EY_YSDMINFO Typgruppen Ymmcc YCA02 10.8Jobs Typ Konvention Beispiel Jobs YMM_<Prio>_<BUKRS>_<DESC> YSD_1_1000_ <Prio> = Priorität, einstellige Zahl, <BUKRS> = Buchungskreis Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 61 62 10Anhang: Namenskonventionen 10.9Datenelemente Datentyp Präfixbestandteil Elementare Typen / Variablen v Strukturen s Tabellen t Datenreferenz r Klassenreferenz o Interfacereferenz i BADI-Referenz b Ausnahmeklasse-Referenz x Diese Präfixbestandteile bilden die typenabhängigen Anteile der im Folgenden aufgeführten, kontextabhängigen Präfixe. [t] ist hierbei jeweils durch den passenden typenabhängigen Präfixbestandteil zu ersetzen. Art der Deklaration Namenskonvention Lokale Variable l[t]_* Globale Variable g[t]_* Statische Variable s[t]_* Lokales Feldsymbol <l[t]_*> Globales Feldsymbol <g[t]_*> Lokale Konstante lc[t]_* Globale Konstante gc[t]_* Select-Option s_* Parameter p_ Funktionsbausteinparameter i[t]_* für Importing e[t]_* für Exporting s[t]_* c[t]_* für Changing <l[t]_*> t[t]_* für Tables <g[t]_*> FORM Parameter p[t]_* für Using c[t]_* für Changing l[t]_* t[t]_* für Tables g[t]_* Tabellentyp tt_* Strukturtyp t_* Objektorientierte Programmierung: Entität Namenskonvention Lokale Klasse lcl_* Globale Klasse cl_* Lokales Interface lif_* Globales Interface if_* Instanzattribut m[t]_* Statisches Attribut g[t]_* Konstanten c[t]_* Methodenparameter i[t]_* für Importing e[t]_* für Exporting p_ c[t]_* für Changing i[t]_* für Importing r[t]_* für Returning s[t]_* Ereignisparameter i[t]_* Best Practice Leitfaden Development, 31. Januar 2013, © DSAG e. V. 63 © DSAG e. V.