Synactive S10: Zielsetzung und Funktionsumfang Synactive S10 ist ein innovatives Framework zur schnellen Entwicklung robuster und performanter Web Anwendungen. Es verbindet HTML Komponenten und Visual Basic Anwendungslogik durch eine eigene Modell-Ebene (MVC-Konzept) . Für welche Web-Anwendungen ist das S10-System geeignet? Dialogorientierte Web-Anwendungen, die eine hohe Interaktivität bieten sollen Datenbankbasierte Web-Anwendungen Web-Anwendungen mit Schnittstellen zu einem SAP-System Systemvoraussetzungen: Windows Webserver mit IIS und .Net Framework Vorzüge: Einfache Konzepte, die eine rasche Einarbeitung ermöglichen Vorhandene Fertigkeiten (HTML, Visual Basic) können sofort und ohne Einschränkungen eingesetzt werden. Klare Trennung von Oberfläche und Anwendungslogik Lokale Entwicklung mit allem Komfort (MS Visual Studio oder andere VB.Net Entwicklungsumgebungen, MS FrontPage o.ä. für die HTML-Views) Einfache Datenbankschnittstelle zu SQL-Datenbanken mit eigenem Cache für Customizing-Tabellen Unterstützung der gängigen Browser Viele Standardfunktionen (Wertehilfe, Menüs, Modularer Aufruf von Dialogen, Baumdarstellung, Eingabehistorie, ...) Keine Verwendung von Java-PlugIns oder ActiveX Komponenten erforderlich Optimale Nutzung des Browser-Cache, minimale Netzbelastung (nur Nettodaten) Spezielle Schnittstellen zu SAP-Systemen Sehr gute Skalierung durch parallele Anwendungsserver Beispiel einer S10 Oberfläche Bei der Gestaltung der Oberfläche einer S10-Anwendung können bei Bedarf alle HTML-Möglichkeiten (z.B. CSS Stylesheets) genutzt werden. Aber auch bei Beschränkung auf die S10-Standardelemente sind attraktive Oberflächen schnell realisierbar: Beispiel aus dem S10 Demo-System Aufbau des Synactive S10 Systems Die S10-Anwendung ist in drei Ebenen strukturiert nach dem MVC-Prinzip: ● ● ● "Modell" Hier werden zu den verwendeten Anwendungsobjekten ("product", "order", "customer",...) Metainformationen abgelegt über die Datenstrukturen, die Verbindung zur Datenbank, die Validierung der Daten und ähnliches. "View" Die View-Ebene ist reines HTML unter Verwendung einer S10 JavaScript-Bibliothek. Alle HTML-Möglichkeiten können genutzt werden sowie ein frei gewählter HTML-Editor. "Controller" Die Anwendungslogik ist in Form von .Net-Klassen abgelegt. Jedem Anwendungsobjekt des Modells ist eine .Net-Klasse zugeordnet. Ein typisches Beispiel (Validierung von Eingabewerten): Modell integer UnitsInStock // Lagermenge decimal UnitPrice // Preis ... method validate_value validate=(UnitsInStock,UnitPrice) // Wert prüfen View <input type="text" name="prod.UnitsInStock" size="5" class="inputreq"> <input type="text" name="prod.UnitPrice" size="5" class="inputreq"> Controller Public Sub validate_value() If UnitsInStock * UnitPrice > 1000000 Then ic.errormessage("LARGEVALUE") End If End Sub Für eine S10 Anwendung benötigen Sie folgende Systemkomponenten: ● ● ● Webserver (Windows mit IIS) Optional weitere S10-Server (Windows) SQL-Datenbank (beliebig mit OLE DB Schnittstelle) Das S10-Demosystem läuft zur Zeit auf einem einzelnen PC (Konfiguration: Windows 2003 Server, AMD Opteron Prozessor, 1GB RAM). Je nach zu erwartender Auslastung können aber die einzelnen Komponenten auch auf mehrere Maschinen verteilt werden (multi-tier), wie es im folgenden Diagramm dargestellt ist: Typische S10 Anwendungsfunktionen im Überblick 1. Eingabefelder mit Hilfe und Suchfunktion ● ● ● ● ● Werteingabe und -Anzeige mit automatischem Transport zum/vom Anwendungsobjekt Standardprüfungen (z.B. numerisch oder Datum, obligatorische Eingabe) Standardkonvertierungen (z.B. Grossbuchstaben) Hilfe- und Suchfunktion Automatische EIngabehistorie mit Texten Implementierung Modell integer UnitsInStock validation="validate_UnitsInStock" View <input type="text" name="UnitsInStock" size="5" class="inputreq"> Controller Public Sub validate_UnitsInStock() If UnitsInStock > 1000 Then ic.errormessage("UNITS1000") End If End Sub Historie der Eingabewerte mit Texten ● ● Automatische Speicherung der Eingabewerte auf dem Server (verschlüsselt) Anzeige der Historie mit Texten möglich, z.B. der Artikelbezeichnung Implementierung Modell integer prid link="Product" historyid="ProductID" historytext="prid.ProductName" View <input type="text" name="prid" size="5"> Controller (kein Anwendungscoding nötig) 2. Drop-Down Felder mit Datenbankwerten Die Werte für ein Auswahlfeld können dynamisch aus der Datenbank besorgt werden ● ● Einlesen der möglichen Werte für ein drop-down Feld aus der Datenbank Automatische Pufferung der Wertemenge innerhalb einer Session Implementierung Modell menu EmployeeID folder="empall" ... folder empall class="dropdownitem" method="read_empall" View <input type="text" name="label_employeeid" size="24" class="label" value="Ansprechpartner Vertrieb"> <select size="1" name="ord.EmployeeID" class="inputselect" style="width: 225"> </select> Controller Public Sub read_empall() empall.dbselect("SELECT EmployeeID as keyfield, TitleOfCourtesy + ' ' + FirstName + ' ' + LastName as textfield FROM Employees ORDER BY LastName") End Sub 3. Feldprüfungen mit Fehlermeldungen Automatische Prüfung der obligatorischen Eingabefelder Anwendungsspezifische Prüfungen ● ● ● ● Standardprüfungen (Format, obligatorische Eingabefelder) Anwendungsspezifische Prüfungen Automatisches Kennzeichnen der fehlerhaften Eingabefelder Sprachabhängige Fehlertexte mit Variablen Implementierung Modell method validate_value validate=(UnitsInStock,UnitPrice) View <input <input <br> <input <input type="text" name="label_prod.UnitsInStock" size="20" class="label" value="Lagermenge"> type="text" name="prod.UnitsInStock" size="5" class="inputreq"> type="text" name="label_prod.UnitsPrice" size="20" class="label" value="Preis"> type="text" name="prod.UnitPrice" size="5" class="inputreq"> Controller Public Sub validate_value() If UnitsInStock * UnitPrice > 1000000 Then ic.errormessage("LARGEVALUE") End If End Sub 4. Tabellenanzeige Die Tabelle kann pro Spalte umsortiert werden ● ● ● ● Tabellarische Anzeige von Daten Sortierung lokal möglich Über das -Symbol kann jede Tabelle auch separat angezeigt/gedruckt werden Auswahl von Tabellenzeilen zum Beispiel zur Detailanzeige Implementierung Modell folder prtab class="product" View <form class="table" name="prod"> <input type="text" name="ProductID" class="outputcellactive" style="width:60;"> <input type="text" name="ProductName" class="outputcellactive" style="width:200"> <input type="text" name="CategoryID.CategoryName" class="outputcell" style="width:100;"> <input type="text" name="UnitsInStock" class="outputcellright" style="width:100;" > </form> Controller ' class product, select a product in list display Public Sub on_doubleclick() ... End Sub 5. Baumdarstellung ● ● ● ● Darstellung von Baumstrukturen Dynamische oder statische Datenbeschaffung Unterschiedliche Ikonen pro Knoten möglich Freie Anwendungsaktion bei Klick auf Knoten Implementierung Modell class tree02 integer nodestatus string nodelabel boolean nodeactive string nodeicon integer objtype string Country integer SupplierID link="Supplier" integer CategoryID link="Category" integer ProductID link="Product" // subtree folder nodetree class="tree02" method="build_subtree" endclass View <form class="tree" name="demotree02"> </form> Controller Public Sub build_subtree() Select Case objtype Case 1 'country-> supplier nodetree.dbselect("SELECT SupplierID FROM Suppliers WHERE Country = '" + Country + "' ORDER BY CompanyName") Case 2 'supplier->categories nodetree.dbselect("SELECT CategoryID FROM Products WHERE SupplierID =" + SupplierID.ToString() + " GROUP BY CategoryID") ... End Select ... End Sub 6. Splitscreen ● Variable Aufteilung des Bildschirms in zwei oder mehrere Teile, die der Benutzer in der Grösse verändern kann Implementierung Modell Das Modell ist unabhängig von der Splitscreen-Darstellung View <FRAMESET cols="280,*" framespacing="5"> <FRAME src="demo.lesson0215.frame.tree.html" > <FRAME src="demo.lesson0215.frame.product.html"> </FRAMESET> Controller Der Controller ist unabhängig von der Splitscreen-Darstellung 7. Menüfunktionen ● Anzeige eines Funktionsmenüs mit Aufruf der entsprechenden Anwendungsfunktionen Implementierung Modell string menu_report menu item item item menu_report menu_report_month menu_report_region menu_report_category View <input type="text" name="menu_report" size="16" class="labelmenu" value="Statistiken"> Controller Public Sub menu_report_month() call display_sales_by_month() End Sub 8. Reiter Auswahl eines einzelnen Reiters Über Strg-Taste+Klick auf weiteren Reiter kann der Benutzer mehrere Reiter simultan anzeigen. Bei Wechsel der Artikelnummer bleibt die gewählte Reiter-Kombination erhalten. ● ● Anzeige einzelner Reiter, oder synchrone Anzeige mehrerer Reiter Automatische Datenbeschaffung genau für die angezeigten Reiter Implementierung Modell Das Modell ist unabhängig von der Darstellung über Reiter View <input type="text" title="Artikelinformationen,I1,G1" value="Artikel" class="tabimage" id="tab1"> <input type="text" title="Lieferant,I2,G1" value="Lieferant" class="tabimage" id="tab2"> ... <iframe name="I1" width="595" height="313" src="demo.prodinfo01.html" marginwidth="1" marginheight="1" border="0" frameborder="0" scrolling="no"></iframe> <iframe name="I2" width="565" height="389" src="demo.prodinfo02.html" marginwidth="1" marginheight="1" border="0" frameborder="0" scrolling="no"></iframe> Controller Der Controller ist unabhängig von der Darstellung über Reiter 9. Eingabe in Tabellen mit Suchhilfe ● Suchhilfe bei Eingabe in Tabellenzellen (Eingabehistorie, Suchen, Hilfe) Implementierung Modell integer ProductID historyid="ProductID" historytext="ProductName" View <input type="text" name="ProductID" class="inputcell" style="width:50"> Controller Für die Standardfunktionen ist kein Anwendungscoding nötig 10. Tabellenzeilen vorschlagen/löschen Die vorherige Bestellung des Kunden wird als Vorschlag übernommen ● Eingabetabellen durch Anwendungslogik verändern (Werte vorbesetzen, Zeilen einfügen oder löschen) Implementierung Modell folder items class="orderitem" View <td align="center" height="20" onclick="apply('read_previous_order')" title="Vorherige Bestellung des Kunden vorschlagen" style="border:1px solid; border-color: #ffffff #606060 #606060 #ffffff; cursor:pointer; fontfamily: Tahoma; font-size:9pt; color:#606080; background-Image:url(../../../icons/toolbarbackground.jpg);"> <img src="../../../icons/copy.gif" hspace="0" border="0" width="16" height="16" /> </td> Controller Public Sub read_previous_order() ic.db_select("SELECT MAX(OrderID) as OrderID FROM Orders WHERE CustomerID = '" + CustomerID + "'") If OrderID = 0 Then ic.errormessage("CUSTOMERNOORDERS") Return End If ic.db_read() items.dbselect("WHERE OrderID =" + OrderID.ToString) init_items() End Sub 11. Logisches Sperren von Objekten ● ● ● Sperren von Anwendungsobjekten bei Änderungen Automatisches Entsperren bei Freigabe des Anwendungsobjekts und bei Sessionende Bei Einsatz mehrerer S10-Server erfolgt das Sperren Server-unabhängig Implementierung Modell integer ProductID View <input type="text" name="label_productid" size="14" class="label" value="Artikelnummer"> <input type="text" name="productid" size="4" class="input"> Controller Public Function lock() As Boolean Dim lockuser As String = "" If Not ic.lockobject(lockuser) Then ic.errormessage("PRODUCTLOCKED", lockuser) Return False End If Return True End Function 12. Upload und Speicherung von Dokumenten ● ● Übertragen von Dokumenten (Bildern, Texten,..) vom Frontend-PC in die Benutzersession auf dem Server Weitere Verarbeitung im Applikationsprogramm Implementierung Modell string extphotopath View <form action="" method="POST" name="formupload" enctype="multipart/form-data"> <input TYPE="file" accept="image/jpeg" class="input" name="prod.extphotopath" </form> Controller Public Sub on_save_product() ... Dim intphotopath As String = "" 'product photo provided? If prod.extphotopath <> "" Then intphotopath = ic.uploadfilename(prod.extphotopath) 'upload already done? If intphotopath = "" Then ic.errormessage("UPLOADNOTYETDONE", prod.extphotopath) Return End If ... End if End sub size="51"> Die S10 Entwicklungsumgebung (Modellebene) ● ● ● ● ● Verwaltung von Projekten, Klassen und Benutzern Generieren von Klassen aus SQL Tabellen oder dem SAP Data Dictionary Generieren von RFC Schnittstellen Generieren von Views und Standarddialogen Anzeige von Trace und Performancedaten Interface zu SAP-System ● ● ● ● Generieren von Klassen aus dem SAP Data Dictionary Generieren von RFC-Zugriffsklassen Lesender Zugriff über SQL Lesen/Schreiben über SAP-BAPIs oder eigene RFC-Schnittstellen Verfügbarkeit, Lizenzen und Preis Das System ist ab 1.6.2008 für die produktive Nutzung verfügbar. Für Entwicklungsprojekte ist das System ab 1.3.2008 erhältlich. Eine 30-Tage Testversion ist kostenlos verfügbar. Der Kaufpreis für ein Paket bestehend aus 2 Entwicklerarbeitsplätzen sowie der produktiven Nutzung durch 50 'concurrent user' beträgt EUR 5.600,- + MWSt . Er schliesst 1 Jahr Wartung und Support ein. Copyright (C) 2007 Synactive GmbH