Stand: Januar 2012 Für BBj Releases ab 11.11 Einführung in BBj Das Tutorial für Ein- und Umsteiger Tutorial • Einführung in BBj Inhaltsverzeichnis Installation und Konfiguration 9 Überblick4 Architektur4 Die Programmiersprache BBj 5 Die Installation9 Barista - Rapid Application Verfügbare Versionen im Download9 Development (RAD) für Java 6 Java installieren9 Weiterführende Informationen 7 Die BBj-Installation Dokumentation7 Die installierten Module Online-Angebote7 Lizensierung19 Englischsprachige Tutorials und 30 Tage Demo-Lizenz 19 Entwicklerlizenz20 Trainingsunterlagen7 9 19 Video Tutorials 7 Lizenzen für Produktivsysteme 20 Java Breaks 7 Notfalllizenzen20 Häufig gestellte Fragen – FAQ 7 60 Tage Demo-Lizenz 20 Moderierte Newsgroups / Der Lizenzmanager20 Diskussionsforen7 Konfigurationsdateien 21 BBj + Barista Downloads 8 Der Enterprise Manager Training8 Enterprise Manager starten 22 Newsletter8 JVM Settings 23 Technischer Produktsupport8 Das laufende System überwachen 23 22 Log Files 24 BUI- und Webstart Einrichtung 24 2 © BASIS Europe 2012 Software entwickeln mit BBj 25 Ein erstes BBj GUI Programm 42 Die .arc Ressourcendatei - Definition Die BASIS IDE 25 der grafischen Benutzeroberfläche 42 Die BBj API und die Syntax der BBj Programmiersprache 25 Einfache Eventsteuerung Grundsätzliches25 Start der Anwendung im Browser 48 Variablen und Objekte 26 Schneller zum Ziel mit dem Generische Datentypen26 Records / Strukturen als String Templates 26 Eine neue .arc Ressource Benutzerdefinierte Feld-Attribute 27 44 Dialog Wizard 50 als Grundlage 50 Dialog Wizard starten 51 Wiederholende Felder 28 Das Zusammenspiel von Programmen, Zugriff auf die Felder 28 Threads und Klassen 58 Zuweisungen mit Templated Strings28 BBj Anwendungen – Start per Verknüpfung FATTR29 und per Weblink 65 FIELD und NFIELD 29 Weiteres zur Benutzung von Templates 30 Klassen, Objekte und Objektorientierung31 Die BBj-API Klassen in der Dokumentation 32 Code Completion in der IDE 32 Index70 Eigene Klassen 33 Client Side Objects33 Die BBj Syntax – einige wichtige Sprachkonstrukte34 Bedingungen34 Schleifen 35 WHILE….WEND 36 CONTINUE und BREAK 36 Sprünge und Labels36 In der Interpreter-Konsole arbeiten 39 Ein Programm mit Hilfe des Interpreters debuggen 40 3 Tutorial • Einführung in BBj Überblick Architektur Die Entwicklungsumgebung BBj von BASIS verfügt über eine echte 3-Tier Architektur und bietet somit ein hohes Maß an Flexibilität beim Produktivbetrieb Ihrer fertigen Anwendung. • Datenbank, Ausführungsschicht und Benutzeroberfläche können vollständig über verschiedene Hardware-Plattformen und Betriebssysteme im Netzwerk hinweg verteilt und unabhängig voneinander skaliert werden, wenn sich der Bedarf des Anwenders verändert. BBj bietet zwei plattformunabhängige RIA Thin Clients an. • Der erste basiert auf Java Swing und kann mit Java Webstart oder im Browser als Applet verwendet werden. Er benötigt nur eine geringe Bandbreite zur Kommunikation mit dem Server und bietet den Benutzerkomfort und das Look and Feel einer lokal installierten Desktop-Anwendung. • Der zweite RIA Thin Client ist für Javascript-fähige Browser gedacht. Mit diesem Client laufen Ihre Anwendungen auch auf allen iPads, Smartphones usw., ohne Änderungen am Quellcode. Diese Technologie nennt BASIS „Browser User Interface“ (BUI). • Moderne Verschlüsselungsverfahren sichern den Datentransfer über das Netzwerk. • Der integrierte Lizenzmanager (BLM) ist serverbasiert. Während des Betriebs „zählt“ er die gleichzeitigen Nutzer. Er schützt Ihr geistiges Eigentum bei jeder kundenseitigen Installation. 4 © BASIS Europe 2012 Das Lizenzmanagement und der echte BBj Thin Client machen Ihre Anwendung fit für SaaS- und Cloud Computing-Konzepte. • Der BBj Enterprise Manager bildet den zentralen Zugangspunkt des Entwicklers auf alle installierten BBj-Anwendungen. Er bietet auch vollen Zugriff auf die laufende Installation. BBj verfügt über eine eigenständige Programmiersprache, die Ähnlichkeiten sowohl mit Java als auch mit BASIC-Dialekten (Business Basic, Visual Basic) aufweist. Diese Programmiersprache setzt auf der Java Virtual Machine (JVM) auf. Dank der vollständigen Java-Integration laufen BBj-Programme plattformunabhängig – derselbe Quellcode kann auf jedem System gestartet werden, auf dem eine Java VM (Virtual Machine) verfügbar ist. Die Programmiersprache BBj BBj® ist eine objektorientierte Hochsprache für die schnelle Entwicklung und den effizienten Betrieb kaufmännischer Geschäftsanwendungen. Alle Funktionen, die Sie bei der täglichen Arbeit brauchen, sind integriert: • BBj als Programmiersprache bietet zahllose Funktionen im Sprachstandard, deren Realisierung viele andere Sprachen dem Programmierer überlassen. • Eine vollständige Integration in die Java-Umgebung bietet dem Programmierer bei Bedarf flexiblen Zugriff auf Java-Funktionen. • Eine leistungsfähige GUI-API reduziert die Entwicklungszeit für grafische Oberflächen dramatisch. • Die interpretierte, dynamische Sprache bietet vollen Zugriff auf den Zustand der Programme und der Umgebung zur Laufzeit und bietet so Realtime-Debugging, Test und Troubleshooting. • BBj liefert eine integrierte SQL-Datenbank mit allen Standard-Features. Der «Direct Navigational Access» bietet auch ohne SQL den direkten Zugriff auf einzelne Datensätze. Die Verwendung einer Standard- SQL-Datenbank wie mySQL, Oracle, usw., ist allerdings auch möglich. 5 Tutorial • Einführung in BBj Barista - Rapid Application Development (RAD) für Java Barista® ist ein RAD-Framework für BBj, mit dem Sie fast ohne Programmierkenntnisse visuell Java-Anwendungen entwickeln können. Barista ist besonders für kaufmännische Anwendungen geeignet. Mit Barista definieren oder übernehmen Sie aus Ihrer Datenbank Felder, Tabellen und Relationen. Aus diesen Elementen setzt Barista ohne Programmierung eine Anwendung inklusive Formularen, Bildschirmmasken und Lookup-Tabellen und einem Menüsystem zusammen. Das Menüsystem beinhaltet bereits Benutzerverwaltung und rollenbasierter Rechtevergabe. Zahlreiche Funktionen, wie z. B. die Lookup-Anzeigen, können benutzerabhängig konfiguriert werden. Trotz dieser komfortablen Framework-Unterstützung bleibt der Programmierer frei in seiner Arbeit. Java- und BBj-Code können über Callpoints beliebig in die Barista-generierte Applikation eingefügt werden. Barista beschleunigt nicht nur Ihre Entwicklung, da viele Grundfunktionen umfangreicher Softwareprojekte sehr schnell implementiert sind, sondern verbessert auch ganz allgemein die Qualität Ihrer Projekte: Durch das zentrale Repository werden Barista-Projekte selbst dokumentierend, dadurch besser wartbar und leichter erweiterbar. 6 © BASIS Europe 2012 Weiterführende Informationen In diesem Kapitel finden Sie die wichtigsten Informationsquellen, die Ihnen helfen, produktiv mit BASIS Tools zu arbeiten. Dokumentation Bei der täglichen Arbeit wird die Dokumentation wohl Ihr wichtigster Begleiter und Ihre wichtigste Informationsquelle sein. Die Produktdokumentation finden Sie online unter: http://www.basis.com/documentation/ Hinweis: Die Dokumentation befasst sich auch mit älteren Produktversionen der BBjEntwicklungsumgebung wie Visual PRO/5 und andere. Die angegebenen Beispiele und Anleitungen sind zwar auch für die moderne BBj-Version gültig, repräsentieren aber nicht unbedingt den aktuellen Stand der Programmiertechnik. Neueinsteigern empfehlen wir den Weg über die BBj API, die in diesem Tutorial eingeführt wird. Einige Beispielprogramme in der Dokumentation zeigen z. B. ältere Wege zur GUIProgrammierung. Einen guten Überblick über die Unterschiede dieser beiden Wege gibt das folgende Dokument in englischer Sprache: http://www.basis.com/solutions/Guide_to_GUI_Programming.pdf Online-Angebote Über die Dokumentation hinaus bietet BASIS weitere technische Informationen online an. Die Materialien in den Online-Angeboten bieten eine gute Grundlage zum Selbststudium. Darüber hinaus ermutigen wir alle Entwickler, die moderierten Newsgroups zu besuchen und zu nutzen. Hier finden Sie Antworten zu Fragen anderer Teilnehmer, und hier können Sie auf Ihre eigenen Fragen Antworten von anderen Entwicklern oder direkt vom BASIS Entwicklerteam erhalten. Englischsprachige Tutorials und Trainingsunterlagen http://www.basis.com/training Video Tutorials http://www.basis.com/trainingtutorials Java Breaks Java Breaks sind kompakte Webinare zu verschiedenen Aspekten von BBj. http://www.basis.com/java-break-basis Häufig gestellte Fragen – FAQ http://www.basis.com/support Moderierte Newsgroups / Diskussionsforen http://www.basis.com/discussion-forums 7 Tutorial • Einführung in BBj BBj + Barista Downloads https://www.basis.com/bbj-download Sie können jederzeit BASIS Produkte von der BASIS Homepage herunterladen und installieren. Sie können bei der Installation eine persönliche 30 Tage Demolizenz oder eine 7 Tage Notfalllizenz für höhere Benutzerzahlen automatisch ohne persönlichen Kontakt zu BASIS installieren. Training BASIS USA und BASIS Europe bieten regelmäßig Trainings, Informationsveranstaltungen und Konferenzen an. Eine Übersicht über Angebote von BASIS USA finden Sie unter https://www.basis.com/events Eine Übersicht über Veranstaltungen von BASIS Europe finden Sie unter http://www.basis-europe.eu/de/index.php/news/agenda.html Auf beiden Websites finden Sie verschiedene Angebote – Onlineangebote genauso wie Präsenzveranstaltungen. Schauen Sie regelmäßig vorbei! Newsletter Wenn Sie regelmäßig über Schulungstermine u. ä. unterrichtet werden wollen, abonnieren Sie unseren Newsletter unter http://basis-europe.eu/de/index.php/contact-basis-europe.html oder per formloser Mail an [email protected]. Technischer Produktsupport Bei Fragen zur Installation, Benutzung oder auch Programmierung in BBj und Barista steht unser technisches Supportteam zu Ihrer Verfügung: • • E-Mail: [email protected] Telefon: +49 681 968 14-40 Wir bieten telefonische Unterstützung in Deutsch, Englisch, Französisch und Italienisch an. 8 © BASIS Europe 2012 Installation und Konfiguration Die Installation BASIS BBj und Barista werden mit einem Installer für Java auf Ihrem Rechner installiert. Die Installation kann auch auf zeichenorientierten Oberflächen in einer SSH Sitzung oder im UNIX Terminalfenster durchgeführt werden. BBj ist nicht nur geeignet für GUI Programmierung, sondern kann auch auf Webservern oder für die Realisierung zeichenorientierter Benutzeroberflächen verwendet werden. Verfügbare Versionen im Download Im Downloadbereich können Sie zwischen verschiedenen Release-Versionen wählen, dem täglichen Nightly Build (eine Version, die den aktuellen Stand der Arbeit bei BASIS widerspiegelt, ohne eine vollständige Verwendbarkeit zu garantieren) sowie eine gewisse Zeit vor dem Erscheinen einer neuen Produktversion einen Release Candidate, mit dem Sie bereits frühzeitig Ihre Anwendung an die Funktionen der neuen Version anpassen können. BBj wird von einigen nativen Bibliotheken begleitet, die eine nahtlose Integration Ihrer Anwendung in nahezu alle modernen Betriebssysteme ermöglicht. Wählen Sie „BBj + Barista für diese Tutorial. Java installieren Da BBj auf der JVM aufsetzt, müssen Sie zuerst die aktuell unterstützte Java-Version installieren, bevor Sie BBj installieren. Sie erhalten die Java JVM für die meisten gebräuchlichen Betriebssysteme direkt von der Oracle Homepage unter http://java.oracle. com. Einige Hersteller von Betriebssystemen, wie HP oder IBM, bieten eigene JVMs an. Ziel von BASIS ist es, BBj und Barista immer auf allen verfügbaren JVM-Versionen funktionsfähig zu halten. Damit wird Ihnen die Last genommen, Ihre Software an die vielen verschiedenen Java Versionen, die im Laufe der Zeit erscheinen, anzupassen. Dennoch kann es sein, dass eine bestimmte BBj-Version aus verschiedenen Gründen nicht mit allen Java-Versionen funktioniert. Sie finden in den Release Notes eine Liste der Einschränkungen. Einen Überblick über die unterstützten Betriebssystemversionen finden Sie unter http://www.basis.com/availability. Die BBj-Installation Nach dem Download liegt das Produkt in einer selbst entpackenden .jar-Datei („jar“ steht für „Java Archiv“) vor. Sie können die Installation auf den meisten Systemen einfach per Doppelklick auf diese Datei starten. Ansonsten starten Sie die Installation manuell mit folgendem Kommando an der Kommandozeile: <java_bin>java –jar BBjBaristaIDE1111_11-18-2011_0923.jar (Ersetzen Sie <java_bin> durch den Pfad zu Ihrer Java-Installation.) 9 Tutorial • Einführung in BBj Die einzelnen Installationsschritte: 1. Wählen Sie die Sprache der Installation und klicken Sie auf „OK“ 2. Lesen Sie die Einführung und akzeptieren Sie die Lizenzvereinbarungen. 10 © BASIS Europe 2012 3. Wählen Sie den Zielpfad für die Installation. Normalerweise empfiehlt es sich, die Standardvorgabe der Installationsroutine zu übernehmen. Ausnahmen: Unter Windows Vista und Windows 7 mit eingeschalteter Benutzerkontensteuerung (UAC - User Account Control) ist es möglicherweise sinnvoll, BBj außerhalb des Verzeichnisses \Programme zu installieren. Der Grund: Da Windows Vista und Windows 7 den Zugriff auf Dateien in diesen Verzeichnissen virtualisieren bzw. verhindern, vermeiden Sie so unerwartete Probleme bei der Arbeit mit BBj, z. B. den Beispieldaten oder den Konfigurationsdateien. Unter Unix/Linux sind die geeignetsten Installationsorte normalerweise /usr/basis, /usr/ local/basis oder /opt/basis. Die Funktionstüchtigkeit der Installation ist jedoch nicht von einem bestimmten Installationsort abhängig. 4. Überprüfen Sie, welche Java Version der Installer für BBj vorschlägt, und wählen Sie falls gewünscht eine andere. Das Installationsprogramm schlägt normalerweise die Java Version vor, die für seinen eigenen Start verwendet wurde. Klicken Sie auf „Browse“, um eine andere Version auszuwählen. Es wird empfohlen, BBj und Barista mit einer aktuellen Java-Version zu installieren. 11 Tutorial • Einführung in BBj 5. Wählen Sie die Teile des Installationspakets, die Sie installieren möchten. Als Entwickler wählen Sie typischerweise „Standard“, um alle verfügbaren Tools, Democodes und die Dokumentation zu installieren. 6. Wenn Sie die Installation als Webstart zur Verfügung stellen, werden alle Installationsdateien nochmals kopiert. Danach kann die Installation vom diesem Rechner per httpWebstart Link aufgerufen werden. Hinweis: Diese Option belegt etwa doppelt so viel Speicherplatz auf der Festplatte wie eine Standard-Installation ohne Webstart. 7. Die Installation startet nach Bestätigung des Überblicks über den Installationsumfang. 12 © BASIS Europe 2012 8. Einstellungen zur Benutzerkontensteuerung (nur verschiedene Windows Systeme): Legen Sie fest, ob BBj immer mit Standardrechten (= Anwenderrechten) oder Administratorrechten gestartet werden soll. Wenn Sie Administratorrechte wählen, erfolgt je nach Systemeinstellung vor jedem Start von BBj ein Warnhinweis. Die erste Konfiguration nach abgeschlossener Installation Nachdem das Installationsprogramm alle gewählten Produktteile kopiert und installiert hat, startet eine Folge von Dialogen, die eine erste Konfiguration von BBj und Barista erlauben. Alle dabei vorgenommenen Einstellungen können später mit dem „Admin“-Tool im Startmenu (oder im bbj/bin-Verzeichnis) bearbeitet werden. Jede BBj-Lizenz gestattet auch die Nutzung zurückliegender Programmversionen wie PRO/5, BBx usw. (Produktiv- und Entwicklerlizenz). Über Produktivlizenzen für Barista informieren wir Sie gern. Entwicklerlizenzen für BBj und Barista sind kostenlos erhältlich. 9. Wählen Sie die Art der Lizenzierung 9.1 eine Lizenz registrieren Wählen Sie “Für eine Lizenz registrieren” wenn Sie - bereits eine Seriennummer mit Autorisierungscode erhalten haben, z. B. als kostenlose Developer-Lizenz, - eine 30 Tage Demolizenz registrieren möchten: 13 Tutorial • Einführung in BBj Geben Sie zunächst Ihren Namen und Ihre Firmendaten ein, und dann die Seriennummer und den Autorisierungscode. Wenn Sie „30-Tage-Demolizenz anfordern” anklicken, werden Seriennummer und ein Autorisierungscode automatisch erzeugt und eingetragen. Die Demolizenz erlischt nach 30 Tagen, wenn sie nicht verlängert wird. Die Host-ID identifiziert den Rechner, auf dem Sie die BASIS-Produkte installiert haben. Über diese ID wird die Seriennummer aktiviert. 14 © BASIS Europe 2012 Im letzten Dialog wählen Sie die Art der Registrierung – im Normalfall direkt über Internet per „Lizenz automatisch registrieren und installieren“. Wir stellen Ihnen auch gern kostenlose Developer-Lizenzen für Ihren Zweitrechner oder Testsysteme zur Verfügung. Senden Sie einfach eine E-Mail an [email protected]. Mit dem Klick auf “Weiter” lösen Sie die Aktivierung über das Internet aus. 9.2 Eine Lizenz manuell installieren Falls der Rechner, auf dem Sie installieren möchten, nicht über eine Internetverbindung verfügt, notieren Sie bitte die Host-ID in diesem Dialog (Achtung: auf manchen Rechnern müssen Sie im Feld nach rechts scrollen, da die ID nicht vollständig in das Feld passt), und klicken dann auf „Zurück“, um wie unter 9.2 beschrieben eine Lizenzdatei manuell zu installieren. Diese erhalten Sie unter http://www.basis.com/support/licensing/register.html. Geben Sie in dem Webformular die Seriennummer, die Autorisierungsnummer und die Host-ID ein. Die Seite erzeugt eine Lizenzdatei im Textformat, die Sie manuell auf dem Rechner installieren können. Wenn Ihnen bereits eine Lizenzdatei (im Textformat) vorliegt, so können Sie diese mit „eine Lizenz installieren“ auf Ihrem Rechner installieren. Geben Sie einfach den Speicherort der Datei an und klicken Sie auf „Weiter“. 15 Tutorial • Einführung in BBj 9.3 Einen Lizenzmanager wählen Wählen Sie diese Option, wenn Sie bereits auf einem anderen Rechner oder Server einen BBj-Lizenzmanager betreiben, der über eine Lizenz verfügt, die Sie auf diesem Rechner mit verwenden möchten. Geben Sie den gültigen Rechner-Netzwerknamen oder die IPAdresse an (z. B. 192.168.0.33). 10. BASIS Lizenz Manager (BLM) Startkonfiguration 10.1 BLM als Windows Dienst starten (unter Windows) Auf Windows-Rechnern wird der Lizenzmanager typischerweise als Dienst gestartet. Unter Mac, Unix und Linux gibt es eine analoge Auswahl, um den BLM als Dienst (Daemon) zu starten. 16 © BASIS Europe 2012 10.2 BLM nach Anmeldung eines Benutzers starten Der Lizenzmanager wird nach Anmeldung eines Benutzers am System im Vordergrund gestartet. 10.3 Den BLM manuell starten Wenn Sie diese Option auswählen, müssen Sie den BLM jedes Mal mit dem AdminWerkzeug manuell starten, wenn Sie ihn benötigen. 11.Den BASIS Lizenz Manager starten 12. Den Start der BBj Services konfigurieren Der Dienst „BBj Services“ übernimmt in der 3-Tier Architektur von BBj die Aufgaben der Ausführungsschicht und der integrierten Datenbank (sofern Sie diese verwenden). 12.1 BBj Services als Windows Dienst starten In der Standardeinstellung für die Einrichtung eines Serversystems wird BBj Services sofort beim Systemstart als Dienst gestartet. Der Dienst und alle BBj-Prozesse erhalten die Rechte und Gruppenmitgliedschaften des Benutzerkontos, das Sie in diesem Dialog angeben. Das Windows-Benutzerkonto, das Sie hier eingeben, muss auf jeden Fall mit einem Passwort versehen sein. 17 Tutorial • Einführung in BBj Unter Mac, Unix und Linux besteht eine analoge Option, um BBj Services als Hintergrunddienst zu starten. Wenn der Dienst als Benutzer “root” unter UNIX/Linux gestartet wird, erhalten alle laufenden BBj-Prozesse die Rechte derjenigen Benutzerkonten, unter denen sie gestartet werden. 12.2 BBj Services nach Benutzer-Anmeldung starten Wählen Sie diese Option auf Ihrem Entwicklungsrechner, um vollständige Kontrolle über BBj Services im Vordergrund zu haben. Unter Windows wird ein Symbol („Kaffeetasse“) im System Tray neben der Uhr angezeigt, mit dessen Hilfe Sie per Rechtsklick den Dienst starten, stoppen und neu starten können. 12.3 BBj Services manuell starten Wählen Sie diese Option, falls Sie auf diesem Rechner die BBj Services nur gelegentlich benötigen. Wenn Sie diese Variante wählen, können Sie den BBj Service bei Bedarf manuell mit Hilfe des Admin-Werkzeugs, des „BBjServices Wizard“ im Startmenu oder per Kommandozeile starten: <bbj_bin>\bbjservices –noservice Die Installation von BASIS BBj und Barista kann mit Hilfe eines Scripts automatisiert werden. Lesen Sie hierzu documentation.basis.com/advantage/V14-2010/custinstall.pdf 18 © BASIS Europe 2012 Die installierten Module Nach einer vollständigen Installation finden Sie folgende Module im Startmenu Ihres Rechners vor: Die integrierte Entwicklungsumgebung BASIS IDE Ordner “Barista” xx Barista Der Start des Barista Application Development Framework xx ReadMe Web-Link zur Barista ReadMe xx Relnotes Web-Link zu den Barista Release Notes • Ordner “BBj” xx Admin Das Admin-Werkzeug, mit dem Sie die Ersteinrichtung, die nach der Installation durchgeführt wird, verändern können. xx BBj Der BBj-Interpreter selbst xx Configurator Interaktives Tool zum Einstellen der Parameter in der config.bbx Datei xx Enterprise Manager Werkzeug zum Konfigurieren der Einstellungen der BBjServices und zum Überwachen einer laufenden Installation. xx Performance AnalyzerWerkzeug zur Analyse der Ausführungsgeschwindigkeit IhrerProgramme, um mögliches Verbesserungspotenzial aufzuzeigen. Benutzen Sie „SETTRACE“, um eine ASCII Tracefile mit Zeitstempeln der Programmausführung zu erzeugen, sie Sie mit diesem Werkzeug analysieren können. xx ReadMe Web-Link zur BBj ReadMe xx Relnotes Web-Link zu den BBj Release Notes xx Demos Ein Unterordner mit verschiedenen Demoprogrammen Launch Dock Eine zentrale Starteranwendung zum Start der Demos: - Linksklick startet die Demo - Rechtsklick öffnet den Quellcode in der IDE xx BBjServices Wizard Tool zum Starten und Beenden der BBj Services • • Hinweis: Die Module „ResBuilder“, „DDBuilder“ und „GUIBuilder“ werden nur von Entwicklern benötigt, die mit Visual PRO/5 Projekte gestartet hatten. Sie sind für den Neueinsteiger nicht von Belang. Lizensierung Die vollständige Downloadversion von BBj und Barista enthält alles, was Sie zur Installation eines Entwicklungsrechners oder eines Produktivsystems / Servers benötigen. Es gibt verschiedene Arten von Lizenzen zum Betrieb in verschiedenen Umgebungen: 30 Tage Demo-Lizenz Diese Lizenz ist für eine einfache erste Produktevaluierung gedacht. Sie wird durch einfaches Anklicken der entsprechenden Option bei der Installation installiert. Sie kann auf 19 Tutorial • Einführung in BBj demselben System nur begrenzt oft installiert werden – danach wird keine weitere 30 Tage Demolizenz mehr ausgestellt. 30 Tage Demolizenzen sind kostenlos. Entwicklerlizenz Diese Lizenz ist gedacht für die Softwareentwicklung, Tests und weitergehende Produktevaluierung. Sie ist jeweils für ein Jahr gültig und kann verlängert werden. Eine persönliche Entwicklerlizenz (für einen PC oder Laptop) wird kostenlos ausgestellt. Mehrbenutzer-Entwicklerlizenzen können für eine geringe jährliche Support-Gebühr bestellt werden. Bevor Sie eine Entwicklerlizenz erhalten können, müssen Sie diese Bedingungen durch Ausfüllen des DVK/NFR Formulars (www.basis-europe.eu, „Jetzt starten“ / „DVK-Lizenz kostenlos“) akzeptieren. Lizenzen für Produktivsysteme Produktivlizenzen sind Einzel- oder Mehrbenutzerlizenzen zum Einsatz in Produktivumgebungen. Die erforderliche Lizenzgröße bemisst sich bei BASIS Produkten nach der Anzahl der User, die das System gleichzeitig nutzen. Dabei wird jede eindeutige Kombination aus Benutzerkonto und Netzwerkadresse als eine Lizenz gezählt, solange der Nutzer den BBj-Interpreter mit den Laufzeitbibliotheken in Benutzung hat. Die benötigten Lizenzen können gekauft oder gemietet werden. Für Entwickler niedrig gepreister Software in höheren Stückzahlen stehen Volumenlizenzen zur Verfügung. Notfalllizenzen Damit eine BASIS Lizenz neu installiert werden kann, muss die Lizenzaktivierung im Registrierungssystem zurückgesetzt werden. Wird auf diesen Reset verzichtet, wird jede neu installierte Produktivlizenz zur sog. Notfalllizenz, die nur sieben Tage weiter benutzt werden kann. In dieser Zeit kann die permanente Lizenz durch Anfordern des Lizenzreset wieder hergestellt werden. 60 Tage Demo-Lizenz Für Produktvorführungen und Tests stellen wir gerne kostenlos eine Produktivlizenz mit einer Gültigkeit von 60 Tagen aus. Diese Lizenzen können in beliebiger Größe über den BASIS Support oder Vertrieb angefordert werden. Der Lizenzmanager Der BASIS Lizenz Manager (BLM) überwacht die lizensierte Nutzung Ihrer Software in der jeweiligen Installation. Der Lizenzmanager nutzt Registrierungsdaten in Form einer ASCIIDatei, die Host-ID, Seriennummer und Anzahl lizensierter gleichzeitiger Nutzer enthält. Diese Datei wird bei der Registrierung erzeugt. 20 © BASIS Europe 2012 Mit dem Lizenzmanager kann BASIS auch eine die lizenzkonforme Nutzung ihrer gesamten Applikation prüfen, oder nur von einzelnen Bestandteilen. Gern informiert Sie der BASIS Europe Support über diese Möglichkeit, Ihr geistiges Eigentum wirksam zu schützen. Der Lizenzmanager schreibt eine Logdatei „blm.log“ unter bbj\blm\log. Diese Logdatei gibt Aufschluss über mögliche Probleme mit der Lizenz Senden Sie diese Datei an [email protected], wenn Sie Hilfe bei der Lizenzinstallation benötigen. Konfigurationsdateien Verschiedene Dateien dienen zur Konfiguration Ihrer BBj-Installation. Dieser Abschnitt listet die wichtigsten Dateien auf und gibt Ihnen einige grundlegende Informationen zu ihrer Verwendung. Weitere Informationen gibt die BASIS Dokumentation. Sie finden diese Konfigurationsdateien im Unterordner „cfg“ des BBjInstallationsverzeichnisses. config.bbx und config.min In der Datei config.bbx sind verschiedene Parameter der laufenden Interpreter-Sitzung, wie z. B. verfügbare Drucker, TCP Sockets, der Titel des Interpreter-Fensters oder verschiedene Lockingstrategien (bei Verwendung der BBj-Datenbank) gespeichert. Benutzen Sie den Kommandozeilenparameter –c, um den BBj-Interpreter mit einer anderen config.bbx zu starten. Der Dateiname kann völlig frei gewählt werden. Änderungen an dieser Datei werden erst bei einem Neustart des Interpreters gültig. Sie können das Tool „Configurator“ aus dem Startmenü verwenden, um die Optionen komfortabel zu verwalten. Details: Suchen Sie nach “config.bbx” im Index der Dokumentation. Die Datei „config.min“ enthält die minimal erforderlichen Parameter und wird z. B. beim Start von BBj-Programmen aus der IDE verwendet. config.ini Die Datei config.ini listet alle verfügbaren BASIS BBj-Datenbanken im System auf. Sie verweist jeweils auf das Data Dictionary (= die Metadaten, die die Datenbank beschreiben) und das Verzeichnis mit den Daten selbst. Einträge können durch verschiedene Parameter ergänzt werden. Normalerweise ändern Sie die config.ini nicht direkt, sondern verwenden den Enterprise Manager zum Verwalten der BBj Datenbank. Wenn Sie diese Datei auf anderem Wege editieren, kann das Kommando BBjAdmin::reloadDBConfig() der BBjAPI benutzt werden, um die BBj Services die veränderte Config.ini ohne Neustart einlesen zu lassen. 21 Tutorial • Einführung in BBj sql.ini In der Datei sql.ini listen Sie alle erreichbaren JDBC-Datenbanken auf, auf die Sie mit den BBj Befehlen SQLOPEN, SQLPREP, SQLEXEC und SQLFETCH zugreifen möchten. Detaillierte Informationen zu diesen Kommandos finden Sie in der Dokumentation. Suchen Sie nach “SQL.INI File” im Index der Dokumentation. Hinweis: Unter Windows können im System bekannte ODBC-Datenquellen ohne weitere Konfiguration verwendet werden. BBj.properties Die Datei BBj.properties enthält alle Java-spezifischen Einstellungen, u. a. für den BBj Service, wie z. B. Classpath, Java Startoptionen (z.B. Xmx zur Speicherzuweisung, Einstellungen zur Garbage Collection) sowie die JVM. Normalerweise werden Sie den Enterprise Manager zur Verwaltung dieser Einstellungen verwenden. Die meisten Einstellungen in den BBj.properties erfordern bei Änderungen einen Neustart der BBj Services. Der Enterprise Manager Der Enterprise Manager erlaubt die Konfiguration Ihrer BBj Installation sowie die Überwachung eines laufenden Systems. Dabei kann nicht nur die lokale Installation verwaltet werden, sondern auch ein anderes System, das über Netzwerk erreichbar ist. Enterprise Manager starten Beim Start des Enterprise Manager erscheint zunächst ein Login-Dialog, in dem Sie den Rechner, den Sie verwalten möchten (voreingestellt: localhost = Ihr PC), sowie Benutzername und Passwort eingeben müssen. Standard-Benutzername und Passwort für den BBj Administrator lauten: Username: admin Password: admin123 22 © BASIS Europe 2012 Nach dem Login sehen Sie folgenden Dialog: Auf der linken Seite finden Sie die Hauptfunktionen, wie die Konfiguration der Server Einstellungen, sowie einige andere Überwachungs- und Konfigurationseinstellungen. Links unten wird die Konfiguration der BBj Datenbanken eingestellt. JVM Settings Auf dem Tab “JVM“ des Punktes “Server Information” können Sie die Java Einstellungen für die verschiedenen BBj Module überprüfen und ändern. Die Einstellungen sind für die meisten Installationen korrekt eingestellt. Das laufende System überwachen Der Abschnitt “BBj Processes” erlaubt eine Live-Ansicht der laufenden Interpreter-Sessions. Bei einer Serverinstallation können Sie hier sehen, welcher Benutzer gerade welches Programm ausführt, und sogar, welche Codezeile gerade ausgeführt wird. 23 Tutorial • Einführung in BBj Es stehen weitere Funktionen für die Überwachung der JDBC Verbindungen, offener Dateien und der Speichernutzung zur Verfügung. Log Files Der Enterprise Manager enthält unter „System Logs“ eine Anzeigefunktion für die BBj Logdateien, die im Verzeichnis bbj/log gespeichert sind. BUI- und Webstart Einrichtung BBj-Anwendungen können mit Hilfe der Webstart-Funktion automatisch im Web gestartet werden. Webstart erzeugt automatisch eine .jnlp Datei, in der die Beschreibung der Anwendung gespeichert wird, und die für den Start der BBj-Anwendung im Web benötigt wird. Wir werden dies im Verlauf dieses Tutorials noch näher betrachten. 24 © BASIS Europe 2012 Software entwickeln mit BBj BBj ist eine objektorientierte dynamische interpretierte Programmiersprache für die Java JVM. Die Hauptstärke von BBj liegt in der Entwicklung von kaufmännischen Applikationen mit grafischer Benutzeroberfläche. Aber BBj kann ebenso zum Erstellen von Script-Code, von zeichen-orientierten Programmen für Telnet- oder SSH-Anwendungen oder auch von Web-Anwendungen eingesetzt werden. BBj lässt Ihnen die Wahl, ob Sie prozedurale oder objektorientierte Programme schreiben oder beide Techniken gemischt anwenden wollen. Die folgenden Abschnitte zeigen Ihnen zunächst den für den Einstieg leichteren und kürzeren Weg, mit BBj GUI-Programme zu schreiben – nämlich prozedural, unter Verwendung der BBj API. Die BASIS IDE Die BASIS IDE ist die integrierte Entwicklungsumgebung mit Editor, Interpreter, Debugger und diversen anderen Funktionen, die Ihnen die Erstellung von BBj-Programmen erleichtern. Die IDE ist der komfortabelste Weg zur Entwicklung von BBj-Programmen, aber nicht der einzige: Sie können BBj-Programme auch direkt in der Interpreter-Konsole oder mit einem Editor Ihrer Wahl erstellen. Der BBj-Interpreter verarbeitet Programme in Form von ASCII-Dateien. Der BBj-Compiler übersetzt Programme optional in ein Binärformat, das vom Interpreter schneller geladen und gestartet werden kann. BBj-Programme können auch verschlüsselt und mit Passwort versehen gespeichert werden, so dass sie z. B. nicht unbefugt gelistet oder manipuliert werden können. Siehe hierzu „SAVEP Verb – BBJ“ im Index der Dokumentation. Die BBj API und die Syntax der BBj Programmiersprache BBj liefert eine leistungsfähige API zur Erstellung von Businessanwendungen. Diese API stellt eine Art Framework dar z. B. für die Erstellung von Benutzeroberflächen, und übernimmt auch Architektur-Funktionen. Grundsätzliches BBj versucht, zentrale Sprachelemente an BASIC anzulehnen und so den Einstieg in die Programmierung zu erleichtern. Dahingegen sind die Objektorientierung und auch die API stark an Java angelehnt. Folgende Regeln gelten grundsätzlich: • Kein Semikolon am Zeilenende • Variablen können dynamisch verwendet und müssen nicht deklariert werden 25 Tutorial • Einführung in BBj • BBj selbst kennt keinen bool-Datentyp. Boolesche Operationen werden in der Regel wie folgt entschieden: xx Ausdruck ergibt 0 -> FALSE; xx Ausdruck ergibt nicht 0 -> TRUE • Kommentare werden mit dem Schlüsselwort REM eingeleitet. Beispiel: REM ermittle Umsatz UMSATZ=… Variablen und Objekte BBj unterscheidet zwischen generischen Datentypen und Objekten: Generische Datentypen Generische Datentypen sind einfache Zeichenketten oder numerische Variablen: A$ = "Hello World"Stringvariablen (= Zeichenketten) tragen ein “$” als Suffix. PI=3.14Numerische Variablen tragen kein Suffix Hinweis: Das Schlüsselwort PRECISION kann zum Einstellen der Rechengenauigkeit verwendet werden; mit SETOPTS Bit 2 $20$ kann eingestellt werden, ob Zwischenergebnisse gerundet werden oder erst die Endergebnisse zusammengesetzter Rechnungen. AGE%=27 Integer = Ganzzahlvariablen tragen ein Prozentzeichen “%” als Suffix Records / Strukturen als String Templates BBj erlaubt eine Satzbeschreibung, „TEMPLATE“ genannt, die einem String eine Struktur gibt. Ein Template wird einem String mit Hilfe des DIM-Befehls zugewiesen: DIM SATZ$:TEMPLATE$ In diesem Beispiel enthält TEMPLATE$ die Satzbeschreibung für SATZ$. Das Template enthalt eine Liste von Feldern, die mit Kommata voneinander getrennt werden. Jedes Feld in der Template wird in etwa wie folgt beschrieben: "FIRMA:C(6O),ORT:C(40)" Dieses Beispiel definiert zwei Felder, FIRMA mit 60 Stellen Länge, und ORT mit 40 Stellen Länge, beide vom Typ Zeichenkette. 26 © BASIS Europe 2012 Feldnamen können bis zu 32 Zeichen (alphanumerisch, jedoch beginnend mit einem Buchstaben) lang sein. Variabel lange Felder werden mit dem „*“ definiert: "FIRMA:C(6O*),ORT:C(40*)" Folgende Feldtypen werden unterstützt: C einfacher Zeichen-String (alphanumerisch) N numerischer String I U ein binärer Integer-String ohne Vorzeichen F IEEE binäres Fließkomma-Format (8 Bytes) D BCD Fließkomma-Format (8 Bytes) B Business-Fließkomma-Format (8 Bytes) X Float (C) (4 Bytes) V Double (C) (4 Bytes) A ADJN() Business floating point (8 bytes) K Sortiert numerisch (1 to 32767 bytes) O „BLOB“ (4 bytes plus Benutzerdaten) ein vorzeichenbehafteter binärer Integer-String Variabel lange Felder werden per Standard mit $0A$=char(10) abgeschlossen. Das Template kann jedoch ein anderes Zeichen als Abschluß variabel langer Felder definieren, z.B. "FIRMA:C(6O*=09),ORT:C(40*=09)" Dieses Template erzeugt zwei Felder, mit Tab ( char(09) ) separiert. Falls der Abschluss des letzten Feldes das Ende des Strings selbst ist (ohne Abschlusszeichen), kann dies wie folgt angegeben werden: "FIRMA:C(6O*=09),ORT:C(40*=)" Benutzerdefinierte Feld-Attribute Einem Feld kann optional ein vom Benutzer definierter String wie folgt mitgegeben werden: 27 Tutorial • Einführung in BBj "FIRMA:C(6O*=09):label=Firma opt=n:,ORT:C(40*=):label=Firma opt=y:" Der Doppelpunkt im Anschluss an die Lange zeigt den Beginn der benutzerdefinierten Attribute an. Dieser Bereich muss dann von einem weiteren Doppelpunkt abgeschlossen werden. Jeder beliebige Text kann hier erscheinen, muss jedoch immer im Format „BEGRIFF=WERT“ angegeben werden. Wiederholende Felder Man kann sowohl numerische als auch String-Felder als Array definieren: "PREISE[5]:N(l0*)" "KENNZEICHEN[20]:C(5)" Die eckigen Klammern bedeuten z. B., dass PREISE ein numerisches Feld mit 5 Elementen darstellt. Beachten Sie bitte, dass die Felder hier mit 1 beginnend gezählt werden. Lediglich eindimensionale Felder werden hier unterstützt. Zugriff auf die Felder Auf die Felder eines Strings, der per Template zu einer Struktur gemacht wurde, kann nun mit den Feldnamen zugegriffen werden. Beispiel: DIM SATZ$:"FIRMA:C(6O*),ORT:C(40*),KONTOSTAND:N(10)" SATZ.FIRMA$="BASIS" SATZ.KONTOSTAND=500 PRINT SATZ.KONTOSTAND * 2.5 Auch wenn ein String als Template definiert ist, kann man auf ihn wie gewöhnlich als String zugreifen: DIM SATZ$:"FIRMA:C(6O),ORT:C(40),KONTOSTAND:N(10)" SATZ.FIRMA$="BASIS" SATZ.ORT$="SAARBRÜCKEN" PRINT SATZ$(61,40) Zuweisungen mit Templated Strings Bei einer Zuweisung wird immer nur der String selbst kopiert, nicht jedoch sein Template. Der Zielstring kann sein eigenes Template haben, oder auch keines: DIM SATZ$:"FIRMA:C(6O),ORT:C(40),KONTOSTAND:N(10)" SATZ.FIRMA$="BASIS" SATZ.ORT$="SAARBRÜCKEN" SATZ1$=SATZ$ 28 © BASIS Europe 2012 FATTR Informationen über eine Template können mit Hilfe der FATTR()-Funktion abgefragt werden. Diese Funktion hat mehrere Formen. Die erste Form erzeugt eine TemplateBeschreibung, die wiederum in einem DIM-Befehl benutzt werden kann: LET B$=FATTR(AS) Dieses Beispiel kopiert die Template-Beschreibung von A$ als Daten nach B$. Falls A$ keine Template besitzt, wird ein Fehler ausgegeben. Wenn Sie z.B. B$ mit den gleichen Feldern (=gleiche Template) wie A$ definieren wollen, würde es wie folgt aussehen: DIM B$:FATTR(AS) Eine einfache Liste der Feldnamen eines Template kann wie folgt erzeugt werden: LET B$=FATTR(AS,"") Beachten Sie bitte das zweite leere Argument. Dieser Aufruf erstellt eine Liste der Felder von A$ durch Zeilenvorschübe (LF) voneinander getrennt nach B$. Informationen über ein bestimmtes Feld kann man durch Angabe des Feldnamens erzeugen: LET B$=FATTR(A$,"SATZGR") Dieses Beispiel erstellt eine codierte Feldbeschreibung des Feldes SATZGR von A$ in B$. Schließlich können auch noch die benutzerdefinierten Attribute mit FATTR abgefragt werden: DIM SATZ$:"FIRMA:C(6O*=09):label=Firma opt=n: LET LBL$=FATTR(SATZ$,"FIRMA","label") Dieses Beispiel durchsucht den benutzerdefinierten Teil des Feldes FIRMA in SATZ$ nach einem Wert für den Schlüssel "label". Falls dieser nicht existiert, wird ein Fehler erzeugt. FIELD und NFIELD Um erst während der Laufzeit zu bestimmen, welche Felder angesprochen werden sollen können FIELD() und NFIELD() verwendet werden. Beide Funktionen beziehen den Feldnamen aus einer String-Variable, die zur Laufzeit erzeugt und übergeben wird: B$=FIELD(AS,"NAME") X=NFIELD(AS,"PREIS",4) 29 Tutorial • Einführung in BBj Diese beiden Beispiele bewirken das gleiche wie: B$=A.NAME$ X=A.PREISE[4] Ein Spezialfall der FIELD()-Funktion schneidet zusätzliche Daten am Ende ab, z. B. wenn ein Satz aus einer Datei gelesen wurde: DIM A$:TPL$ READ RECORD (1)A$ A$=FIELD(A$) Das Gegenstück zu den FIELD()-Funktionen ist der FIELD-Befehl, der Daten in ein Feld bringt: FIELD A$,"NAME"="LORRAINE" FIELD A$,"PREISE",[4]=22.75 Diese beiden Befehle bewirken dasselbe wie A.NAME$=" LORRAINE" A.PREISE[4]=22.75 Weiteres zur Benutzung von Templates Obwohl die Template-Syntax in BBj Strukturen und Satze abbildet, wie sie in vielen anderen Hochsprachen vorkommen, sollte man sie nicht wie diese betrachten. So, wie BBj eine extrem dynamische Sprache ist, sind es auch die Templates. Einem String kann jederzeit ein neues Template zugewiesen werden, oder er kann jederzeit neue Daten zugewiesen bekommen. Bis zum Zugriff auf ein bestimmtes Feld ist nicht bekannt, wo dieses Feld sich befindet und ob es überhaupt existiert. Das Data Dictionary der BASIS BBj Datenbank baut die Beschreibung der Satzstrukturen auf Templates auf. Hier sei nur folgendes Beispiel aufgeführt, das eine Tabelle in der ChileCompany Demodatenbank durchliest, nachdem das Template der SQL-Abfrage ermittelt wurde: SQLOPEN (1)"ChileCompany" SQLPREP (1)"SELECT * FROM CUSTOMER" DIM SATZ$:SQLTMPL(1) WHILE 1 SATZ$=SQLFETCH(1) PRINT SATZ.CUST_NUM$,"-",SATZ.COMPANY$ WEND PRINT "***FERTIG***" 30 © BASIS Europe 2012 Templates sind auch hilfreich beim Einlesen von CSV-Dateien. Nehmen wir an, Sie haben eine ASCII-Datei „katalog.csv“ mit den zwei Feldern „Katalognummer“ und „Text“, beide mit Tab =char(09) abgeschlossen. Dann kann folgendes Beispiel zum Einlesen genutzt werden: OPEN (1)"katalog.csv" DIM SATZ$:"KATALOGNUMMER:C(10*=09),TEXT:C(10*=09)" WHILE 1 READ (1,END=*break)SATZ$ IF SATZ$="" THEN CONTINUE; REM LEERE ZEILEN ÜBERLESEN PRINT SATZ.KATALOGNUMMER$,": ",SATZ.TEXT$ WEND PRINT "***FERTIG***" Klassen, Objekte und Objektorientierung BBj kennt wie Java und C++ Objektorientierung mit Klassen, Interfaces, Vererbung und Polymorphie. Die BBj API, die dem Programmierer den Zugriff auf die grafische Benutzeroberfläche oder auf Dateisystem, Namespaces und vieles mehr erlaubt, ist dabei bereits vollständig objektorientiert angelegt. Eigene Klassen definiert der Programmierer in BBj Sourcedateien, und kann dabei von BBj Klassen oder Java Klassen ableiten, oder BBjoder Java-Interfaces implementieren. Die BBj API als objektorientierte Klassenbibliothek Objektvariablen werden in BBj durch das Suffix "!" markiert. api!=BBjAPI() erzeugt die Variable api! und weist eine Instanz der BBj API zu. Da BBj eine dynamische Sprache ist, brauchen Objekte (und andere Variablen) nicht formal deklariert zu werden. Es hat allerdings Vorteile, es dennoch zu tun. Es ermöglicht z. B. die Typprüfung beim Kompilieren sowie die Nutzung der komfortablen Code Completion-Funktion in der IDE. declare BBjAPI api! Immer wenn eine Variable deklariert wird, müssen Sie möglicherweise die CAST-Funktion verwenden, wenn Sie Rückgabewerte vom Typ einer abgeleiteten Klasse einer Variable zuweisen möchten, die mit einem Elterntyp deklariert wurde: 31 Tutorial • Einführung in BBj declare BBjButton btn! btn! = cast(BBjButton,window!.getControl("MY_BUTTON")) Der Modifier "auto" zum declare ermöglicht einen komfortablen automatischen CAST: declare auto BBjButton btn! btn! = window!.getControl("MY_BUTTON") Neben den Klassen der BBj API können Sie beliebige Java-Klassen verwenden, die in der Classpath bekannt sind (Konfiguration in der BBj.properties, Einstellung im Enterprise Manager), oder in der Session-abhängigen Classpath (Suchen Sie nach “SSCP” im Index der Dokumentation – Kapitel „Session Specific Classpath“): declare java.util.HashMap hm! hm! = new java.util.HashMap() hm!.put("TEST","Hello World") Die BBj-API Klassen in der Dokumentation In der BASIS-Dokumentation sind alle verfügbaren BBj-Klassen mit den dazugehörigen Methoden aufgeführt. Wenn Sie alle Methoden einer Klasse auflisten möchten, geben Sie den Namen der Klasse ein. Alle BBj API-Klassen beginnen mit „BBj…“ . Die Einleitungsseite zu jeder Klasse gibt Informationen zur Vererbungsstruktur, verfügbaren Methoden und allen passenden Events, die mit dieser Klasse registriert werden können. Code Completion in der IDE Sobald Sie Objektvariablen in der IDE deklarieren, kann die Funktion „Code Completion“ genutzt werden, die Ihnen Tipparbeit erspart. Nachdem Sie den Punkt („ . “) nach dem Namen einer Objektvariablen eingegeben haben, listet Code Completion die verfügbaren Methoden einer Klasse auf. Sie brauchen nur die passende Zeile auszuwählen, um sie in den Quellcode zu übernehmen. Die Code Completion kann auch manuell durch Drücken von <Strg>-<Leertaste> aufgerufen werden. 32 © BASIS Europe 2012 Eigene Klassen Sie können Klassen auch direkt in BBj-Syntax erstellen: class public Car field public BBjString make! field public BBjString color! field public BBjNumber highspeed! method public void drive() print "brumm" methodend classend declare Car mycar! mycar! = new Car() mycar!.setmake("Volkswagen") mycar!.drive() Eine ausführliche Einführung in die Erstellung eigener Klassen mit BBj finden Sie im Tutorial unter http://www.basis.com/solutions/BBj_CustomObjects.pdf . Client Side Objects Sie können in BBj alle Arten von Java-Klassen verwenden. Das macht aus der BBj Sprache ein sehr leistungsfähiges Werkzeug, denn Sie sind nicht an die begrenzten Möglichkeiten einer RAD-Entwicklungsumgebung gebunden, sondern können nahezu beliebig eigene Java-Klassen oder solche von Drittanbietern in BBj einbinden, um zusätzliche Funktionen zu implementieren. In der 3-Tier Architektur von BBj geschieht die Ausführung des Programmcodes auf dem Server. Das ist in vielen Fällen auch bei der Einbindung von Java-Klassen gewünscht, z. B. beim Zugriff auf Datenbanken, dem Aufruf von Web Services oder bei der Verwendung der java.util Klassen. Manchmal ist jedoch die Verwendung einer Java-Klasse am Client nötig – etwa, um eine Grafik darzustellen, oder um die Spracheinstellungen und Zeitzone des Arbeitsplatzrechners zu ermitteln. BBj hilft auch in solchen Fällen. Sie können mit BBj eine Java-Klasse auch im Thin Client instanziieren und mit ihr arbeiten, als befände sie sich auf dem Server. BBj bietet auch Funktionen zum Klonen eines serverseitigen Objekts zum Client und umgekehrt. Das ClientObject Tutorial in der Dokumentation bietet tiefergehende Informationen: http://documentation.basis.com/BASISHelp/WebHelp/bbjobjects/clientobject_tutorial.htm 33 Tutorial • Einführung in BBj Die BBj Syntax – einige wichtige Sprachkonstrukte Bedingungen IF…THEN…ELSE In BBj werden IF Statements meistens mehrzeilig notiert. Dabei muss die Anweisung mit FI oder ENDIF abgeschlossen werden. Beispiel 1 if x=0 then x=1 y=8 endif Beispiel 2 if x=1 then x=0 y=6 else x=9 z=r fi Es sind auch einzeilige IF Statements zulässig, die dann automatisch terminiert werden: Beispiel if X=1 then Y=6 else Y=7 Diese Anweisung würde mehrzeilig wie folgt lauten: if X=1 then Y=6 else Y=7 endif SWITCH…CASE Switch-Case Anweisungen in BBj basieren immer auf dem numerischen Ergebnis eines Ausdrucks: 34 © BASIS Europe 2012 INPUT "WERT ? ",A SWITCH A CASE 1 PRINT "EINS" BREAK CASE 2 PRINT "ZWEI" BREAK CASE DEFAULT PRINT "WEDER EINS NOCH ZWEI" BREAK SWEND Dabei kann ein Vergleich mit einer Zeichenkette direkt im Statement eingebaut werden: INPUT "EINGABE ? ",A$ SWITCH 1 CASE A$="A" PRINT "Eingabe A" BREAK CASE A$="B" PRINT " Eingabe B" BREAK CASE DEFAULT PRINT "WEDER A NOCH B" BREAK SWEND Schleifen FOR…NEXT Die Syntax einer FOR..NEXT Schleife in BBj lautet wie folgt: FOR numname=numA TO numB {STEP numC} … NEXT {numname} Dabei kann auf die Angabe der Zählvariable beim NEXT-Befehl verzichtet werden, da FOR..NEXT Schleifen ohnehin immer sauber geschachtelt sein müssen und sich nicht überlappen dürfen. Beispiel: FOR 99 to 1 STEP -1 PRINT STR(i), " Durchläufe übrig" NEXT i 35 Tutorial • Einführung in BBj WHILE….WEND Die WHILE..WEND Schleife wird durchlaufen, solange die WHILE Bedingung erfüllt ist: WHILE A<B … WEND Ein häufiger Anwendungsfall ist das Einlesen von Datenquellen bis zum Dateiende. Folgendes Beispiel öffnet die Datenbank ChileCompany, liest alle Datensätze ein und gibt Kundennummer und Kundenname aus: SQLOPEN (1)"ChileCompany" SQLPREP (1)"SELECT CUST_NUM, COMPANY FROM CUSTOMER" DIM SATZ$:SQLTMPL(1) WHILE 1 SATZ$=SQLFETCH(1) PRINT SATZ.CUST_NUM$,"-",SATZ.COMPANY$ WEND PRINT "***FERTIG***" CONTINUE und BREAK Diese beiden Schlüsselworte setzen eine Schleife mit dem nächsten Durchlauf fort (CONTINUE) bzw. brechen die Schleifenausführung ab (BREAK). Sprünge und Labels BBj kennt neben den klassischen Schleifen auch Sprünge, darunter auch (eventuell zum Leidwesen mancher) das klassische GOTO. Da BBj jedoch ohne Zeilennummern auskommt, basieren die ersten beiden Sprünge zumeist auf Labels als Sprungadresse. Labels Labels sind Sprungmarken, die eine Sprungadresse per Name vorgeben, gefolgt von einem Doppelpunkt: ERROR_ROUTINE: REM Fehlerbehandlung IF err=0 THEN WAIT 5 RETRY ENDIF 36 © BASIS Europe 2012 Symbolische Labels Eine Sonderform der Labels sind symbolische Labels. Diese verweisen nicht auf eine absolute Sprungmarke, sondern auf eine dynamische Sprungadresse im Kontext. Sie werden zumeist bei der Fehlerbehandlung (siehe auch dort) verwendet: ERR=*PROCEED bei Fehler: nächster Befehl in derselben Zeile oder nächste Zeile ERR=*NEXTbei Fehler: nächste Zeile ERR=*SAME bei Fehler: zum Anfang derselben Zeile zurück ERR=*RETRY bei Fehler: nochmals versuchen ERR=*BREAK bei Fehler: emuliere BREAK ERR=*CONTINUE bei Fehler: emuliere CONTINUE ERR=*ESCAPE bei Fehler: emuliere ESCAPE ERR=*RETURN bei Fehler: emuliere RETURN ERR=*STOP or ERR=*END bei Fehler: emuliere STOP/END ERR=*EXITbei Fehler: emuliere EXIT ERR=*ENDIF bei Fehler: gehe zu Ende des innersten IF..ENDIF -Blocks. GOTO Der GOTO-Befehl verzweigt direkt zu einer Sprungadresse. Dabei wird keine Rücksprungadresse gespeichert, und alle Variablen bleiben erhalten: IF A=5 THEN GOTO Ende … Ende: REM Programmende RELEASE GOSUB…RETURN Der GOSUB Befehl verzweigt wie GOTO zu einer Sprungadresse. Dabei wird jedoch die Rücksprungadresse gespeichert. RETURN kehrt zu dieser Rücksprungadresse (=dem nächsten Statement nach dem GOSUB) zurück. Hinweis: Um aus einer GOSUB – Routine auszuscheren ist das Verb EXITTO erforderlich, damit die Rücksprungadresse gelöscht wird. Beispiel: GOSUB Rechne_Rabatt … Rechne_Rabatt: A=50 B=A*C/2 RETURN 37 Tutorial • Einführung in BBj Overlays mit CALL Der CALL-Befehl ruft ein anderes Programm als Unterprogramm auf. Dabei verwendet das aufgerufene Programm einen eigenen Variablenraum, so dass Seiteneffekte vermieden werden. Die Syntax lautet CALL programm{::label}{,ERR=errlabel}{,expr...} expr… steht für eine Liste von Variablennamen und/oder Ausdrücken, die an das CALL Programm übergeben werden. Variablen werden dabei immer per Call-by-Reference übergeben. Durch Einklammern werden Variablen, genauso wie Ergebnisse von Ausdrücken, zu Call-by-Value Parametern. Die Parameterlisten werden durch das ENTER Statement im CALL Programm definiert. Hinweis: Ein ENTER ohne Variablenliste übernimmt den kompletten Variablenraum des aufrufenden Programms. (!) Beispiel: Programm „multi.bbj“ ENTER A,B,C A=A*B C=A EXIT Programm “test.bbj” A=3 B=5 CALL "multi.bbj",(A),(B),C PRINT "A=",A PRINT "B=",B PRINT "C=",C Weitere Befehle und Funktionen Dies waren lediglich die wichtigsten Sprachelemente, die der Einsteiger benötigt. Die Dokumentation listet alle verfügbaren Schlüsselworte mit Erklärung auf. Siehe: 38 Language - Commands – Alphabetical Listing © BASIS Europe 2012 In der Interpreter-Konsole arbeiten BBj ist eine interpretierte Sprache. Der Interpreter liest den Quellcode Zeile für Zeile ein, analysiert ihn und führt ihn aus. Dieses dynamische Laden und Ausführen gibt Ihnen die Möglichkeit, ein laufendes Programm zu unterbrechen und direkt an beliebiger Stelle mit dem Programm und dem Variablenraum zu interagieren. Bei einer Ausnahme können Sie das laufende Programm auf die Eingabeaufforderung des Interpreters fallen lassen, Variablen oder sogar Programmzeilen abfragen und ändern, und dann mit der Ausführung fortfahren. Sie können Programme auch direkt in den Interpreter eingeben, anstatt die IDE zu verwenden. In diesem Fall benötigen wir Zeilennummern, um die Reihenfolge der Zeilen anzugeben. Starten Sie den Interpreter ("BBj” im Startmenu) und geben Sie diese Zeilen ein: 10 FOR I = 1 TO 20 20 PRINT I 30 NEXT I RUN Betrachten Sie, was passiert. Sie können eine Zeile ändern mit z. B. EDIT 20 In der IDE sind keine Zeilennummern erforderlich. Um ein Programm im Interpreter nachträglich mit Zeilennummern zu versehen, können Sie das Schlüsselwort RENUM verwenden. Um die Zeilennummern wieder loszuwerden verwenden Sie DENUM. Geben Sie diese Zeilen ein: DENUM LIST Was sehen Sie? Jetzt geben Sie ein: RENUM LIST …und die Zeilennummern sind wieder da. 39 Tutorial • Einführung in BBj Ein Programm mit Hilfe des Interpreters debuggen In der BASIS IDE ist ein moderner Debugger mit Breakpoints und Watch-Listen zum Monitoring von Variableninhalten und Objekten eingebaut. Aber Sie können auch den Interpreter selbst einsetzen, um Ihren Programmcode zu debuggen. Mit dem Schlüsselwort ESCAPE setzen Sie einen Breakpoint in Ihrem Programmcode. Geben Sie in unserem kleinen Programmbeispiel von eben ein: 25 IF I=3 THEN ESCAPE LIST Der Befehl wird an der richtigen Stelle zwischen den Zeilen Nr. 20 und 30 eingefügt. Führen Sie das Programm mit RUN aus. Es wird am definierten Breakpoint unterbrochen. Wenn Sie nun einen Punkt "." und <Enter> („dot command“) eingeben, wird das Programm Befehl für Befehl ausgeführt. Mit PRINT können Sie Variableninhalte anzeigen lassen, oder Sie können Variablen neue Werte zuweisen. Ein RUN lässt das Programm weiterlaufen. Das Kapitel „Dot Commands“ in der Dokumentation listet alle Stepping-Kommandos für die Eingabeaufforderung auf. Mit BYE beenden Sie die laufende Interpretersitzung. Lesen Sie unter “User‘s Reference Guide > Fundamentals > Language Concepts > Console Mode/Run Mode” mehr zu diesem Thema. 40 © BASIS Europe 2012 Suchpfade – Steuerung BBj verwendet beim Zugriff auf Dateien einen Suchpfad, wenn die Datei nicht im aktuellen Verzeichnis gefunden werden kann. Das aktuelle Verzeichnis kann mit CHDIR, unter Windows das Laufwerk mit SETDRIVE gesetzt werden. Der Suchpfad wird mit dem Befehl PREFIX bzw. dem Eintrag PREFIX in der config. bbx gesetzt. Die einzelnen Verzeichnisse sind dabei durch Leerzeichen zu trennen, und mit einem Slash abzuschließen. Verzeichnisse mit Leerzeichen im Namen sind in Anführungszeichen (") zu setzen. Bei der Suche nach einer Datei kombiniert BBj immer den angegebenen Dateinamen mit den einzelnen Einträgen im PREFIX. Dabei wird die Datei unter dem ersten passenden Pfad geöffnet und die weiteren Verzeichnisse werden nicht mehr durchsucht. Forward Slashes oder Backslash BBj ist plattformunabhängig, BBj Programme laufen ohne Änderung unter Windows, Linux / UNIX oder auch Mac OS. Windows verwendet im Gegensatz zu den anderen genannten Betriebssystemen den Backslash (\) zur Trennung von Verzeichnishierarchien bei Dateipfaden. Verwenden Sie in allen Ihren Programmen und Konfigurationsdateien immer den Forward Slash, und BBj sorgt automatisch unter Windows für die korrekte Umsetzung. (Umgekehrt geschieht dies nicht.) Laufwerksbuchstaben unter Windows Wenn Sie auf den Laufwerksbuchstaben verzichten, so wird der Suchpfad (PREFIX) auf alle verfügbaren Laufwerke angewendet. Der DSKSYN - Eintrag in der config.bbx kann verwendet werden, um einzelne Laufwerke vom Suchpfad auszunehmen. Standardmäßig ist unter Windows Installationen nur C: bzw. das Installationslaufwerk freigegeben. Index: Laufwerksbuchstabe Slash Backslash PREFIX Suchpfad 41 Tutorial • Einführung in BBj Ein erstes BBj GUI Programm Um Ihnen ein grundlegendes Verständnis für die Erstellung von BBj Programmen zu vermitteln, wollen wir ein erstes, sehr einfaches „Hello World“ Programm erstellen. Öffnen Sie die BASIS IDE und überprüfen Sie, dass Sie links den Tab “Filesystems” sehen können (falls nicht, können Sie ihn mit “Window > Filesystems” anzeigen lassen). Klicken Sie mit der rechten Maustaste auf “Filesystems” und wählen Sie “Mount > Local Directory”, um ein Arbeitsverzeichnis im Baum einzublenden. Es bietet sich an, für unsere ersten Gehversuche ein neues, leeres Verzeichnis anzulegen. Die .arc Ressourcendatei Definition der grafischen Benutzeroberfläche Danach klicken Sie mit der rechten Maustaste auf den leeren Ordner und wählen “New > All Templates -> BBj/BBjResource.arc -> Next”, um eine neue leere BBj Ressourcen-Datei anzulegen. Verwenden Sie „hello“ als Dateinamen. 42 © BASIS Europe 2012 Ressourcendateien enthalten alle Informationen, die das Bildschirmlayout beschreiben. Ressourcendateien können mit dem in die BASIS IDE eingebauten WYSIWYG Editor bearbeitet werden. Nun können Sie die Werkzeugleiste rechts („BBj GUI Palette“) verwenden, um Steuerelemente im Fenster hinzuzufügen und ihre Eigenschaften festzulegen. Da dieser Formulareditor ähnlich funktioniert wie andere bekannte Werkzeuge, verzichtet dieses Tutorial auf eine detaillierte Einführung. Wir verweisen Sie auf die Online-Hilfe der IDE. Fügen Sie für unser kleines Programm ein statisches Textfeld, ein Eingabefeld namens ED_ INPUT und eine Schaltfläche namens BTN_PUSH zum Fenster hinzu. Die Namen geben Sie unter dem Reiter „Properties“ ein, und schließen den Vorgang jeweils mit <Enter> ab, um den neuen Namen zu speichern. Das Ergebnis sollte etwa so aussehen: Speichern Sie die fertige Ressourcendatei „hello.arc“ durch Mausklick auf das Diskettensymbol in der Toolbar. 43 Tutorial • Einführung in BBj Einfache Eventsteuerung Nun wollen wir den Programmcode schreiben. Klicken Sie erneut mit der rechten Maustaste auf den Ordner im Filesystems-Tab und erzeugen Sie ein leeres Programm “hello” mit Hilfe der Vorlage “BBjProgram.bbj”. Im Folgenden diskutieren wir die einzelnen Abschnitte des zugehörenden Programms: Da BBj eine dynamische Sprache ist, ist es nicht unbedingt erforderlich, unsere Variablen zu deklarieren, aber es ist vorteilhaft: declare declare declare declare auto declare auto BBjAPI BBjSysGui BBjWindow BBjEditBox BBjButton api! sysgui! wnd! ed_input! btn_push! Die nächsten Zeilen sind immer nötig, um die BBj API zu initialisieren und das Startfenster der Anwendung aus der Ressourcendatei anzuzeigen: api! sysgui! res wnd! = = = = BBjAPI() api!.openSysGui("X0") sysgui!.resOpen("hello.arc") sysgui!.createTopLevelWindow(res,101) Im nächsten Schritt schaffen wir uns Objektvariablen, die die Steuerelemente auf unserem Dialogfenster repräsentieren: ed_input! = wnd!.getControl("ED_INPUT") btn_push! = wnd!.getControl("BTN_PUSH") Unser BBj Programm soll auf zwei verschiedene Ereignisse reagieren – den Event zum „Fenster schließen“ und den Klick auf die Schaltfläche: 44 © BASIS Europe 2012 wnd!.setCallback(wnd!.ON_CLOSE,"byebye") btn_push!.setCallback(btn_push!.ON_BUTTON_PUSH,"push") Die komplette Eventsteuerung in BBj wird von einem einzigen Schlüsselwort behandelt: process_events Nun fehlen noch die zwei Routinen zur Behandlung der Ereignisse: byebye: bye push: text$ = ed_input!.getText() a = msgbox(text$,0,"Hello World") return Hinweis: Die Prozedur-Labels werden von einem Doppelpunkt “:” abgeschlossen. Diese Prozeduren erben den kompletten Variablenraum und können daher auch als Sprungmarken angesehen werden. Dies ist ein schneller und handlicher Weg zur schnellen Programmierung. In der Praxis, insbesondere in größeren, komplexeren Projekten, setzt man eher objektorientierte Methodenaufrufe ein, um unerwünschte Seiteneffekte zu vermeiden. Drücken Sie F9, um das Programm zu kompilieren und überprüfen Sie, ob Fehler im Ausgabefenster angezeigt werden. 45 Tutorial • Einführung in BBj Das komplette Programm mit Kommentaren („rem“) lautet: rem hello.bbj: ein erstes Hello World-Programm rem Deklaration der Objektvariablen rem “declare auto” erlaubt automatische Typkonvertierung declare declare declare declare auto declare auto BBjAPI BBjSysGui BBjWindow BBjEditBox BBjButton api! sysgui! wnd! ed_input! btn_push! rem Konsolenfenster ausblenden rem Das Fenster kann auch im Alias-Eintrag der config.bbx ausgeblendet werden: rem ALIAS T0 SYSWINDOW "" INVISIBLE print 'HIDE', rem Fenster erzeugen – dieser Programmteil ist fast immer gleich rem API initialisieren api! = BBjAPI() rem sysgui-Objekt erzeugen rem sysgui bietet Funktionen für die GUI-Programmierung an sysgui! = api!.openSysGui("X0") rem Ressourcendatei öffnen res = sysgui!.resOpen("hello.arc") rem Fenster erzeugen wnd! = sysgui!.createTopLevelWindow(res,101) rem Je ein Objekt für die Steuerelemente auf dem Formular erzeugen ed_input! = wnd!.getControl("ED_INPUT") btn_push! = wnd!.getControl("BTN_PUSH") rem Events registrieren rem Den ON_CLOSE-Event zum Schließen des Fensters registrieren wnd!.setCallback(wnd!.ON_CLOSE,"byebye") rem Der Event ON_BUTTON_PUSH dem Prozedurlabel “Push” zuordnen btn_push!.setCallback(btn_push!.ON_BUTTON_PUSH,"push") rem process_events ist das Schlüsselwort für die Event-Behandlungsschleife process_events rem byebye: Programm beenden byebye: bye rem Push: Schaltfläche wurde angeklickt rem Messagebox mit dem Titel "Hello World" und eingegebenem Text anzeigen push: text$ = ed_input!.getText() a = msgbox(text$,0,"Hello World") return 46 © BASIS Europe 2012 Das war’s – Ihr erstes BBj-Programm ist fertig. Mit F5, per Rechtsklick auf das Programm und „Execute“ oder mit dem Toolbutton „Ausführen“ können wir das Programm starten… …und unser Ergebnis testen. 47 Tutorial • Einführung in BBj Start der Anwendung im Browser Mit BBj laufen Ihre Anwendungen nicht nur auf dem Desktop unter Windows, Linux und Mac, sondern auch in jedem aktuellen Javascript-fähigen Browser. Auch unser kleines „Hello World“ Beispiel kann mit einigen wenigen Schritten im Browser gestartet werden. Im Enterprise Manager (Default-Login: admin / admin123) unter „BUI Configuration“ konfigurieren wir eine BBj Anwendung für den Betrieb im Browser: Klicken Sie auf den „Plus“- Button. Im nächsten Dialog genügen drei Einträge – Name der Anwendung (für den Link), Arbeitsverzeichnis und Programm: 48 © BASIS Europe 2012 Ein Klick auf den grünen Haken und das Diskettensymbol (nicht vergessen!) speichert die Einstellungen. Nun können wir die Anwendung testen – der Link wird angezeigt (und kann per Rechtsklick gleich aus dem Enterprise Manager gestartet werden): Es öffnet sich der Browser mit der Anwendung: Hinweis: Der im Link verwendete Hostname sollte dem Namen entsprechen, unter dem der Rechner im Netzwerk gefunden werden kann. Ändern Sie ihn unter: „localhost“ eignet sich für das lokale Testen am eigenen Rechner immer. 49 Tutorial • Einführung in BBj Schneller zum Ziel mit dem Dialog Wizard Das erste, sehr einfache „Hello World“ Beispiel hat uns gezeigt, wie sich BBj als Sprache handhaben lässt. An ihm kann man gut ablesen, wie in BBj die Ereignissteuerung, die Sprache und die BBj API funktionieren. Allerdings will man wahrscheinlich nicht jedes Programm auf einem derart niedrigen Abstraktionsniveau erstellen. BASIS bietet mit Barista ein Rapid Application Development Framework, mit dem für Datenbank-basierende Anwendungsfälle schnell Masken, Abfragen und ganze Anwendungen zusammengestellt werden können. Barista bietet dabei auch die Programmierung von Events (dort: Callpoints) in BBj. Die Steuerungslogik für die Formulare und Abfragen bleibt jedoch vollends der Barista-Runtime überlassen. Der mit dem BBj Dialog Wizard generierte Programmcode kann im Unterschied dazu vom Entwickler eingesehen und sehr flexibel gestaltet werden. Auch Anwendungen, die nichts oder nur wenig mit Sichten auf Datenbanktabellen zu tun haben, sind mit dem Dialog Wizard schnell erstellt. Eine neue .arc Ressource als Grundlage Auch für den Dialog Wizard dient eine .arc Ressourcen Datei als Grundlage. In einem kleinen Programmbeispiel wollen wir zwei Zahlen miteinander multiplizieren. Wir erstellen also wieder eine neue .arc Ressourcendatei „calc.arc“ per Rechtsklick auf den Filesystem-Baum und definieren eine Maske mit drei Feldern – M1, M2 und RESULT sowie zwei Buttons OK und CANCEL. Verwenden Sie für M1, M2 und RESULT den Control-Typ BBjInputN. Bei dem RESULT – Feld schalten wir das Attribut „Editable“ aus. Hinweis: Geben Sie den Buttons OK und CANCEL in BBj die IDs 1 und 2, so werden diese mit Enter bzw. Escape ausgelöst. 50 © BASIS Europe 2012 Unser Formular sieht dann etwa so aus: Dialog Wizard starten Als nächstes starten wir den Dialog Wizard per Rechtsklick auf die Datei calc.arc im Filesystem-Baum. Im ersten Formular können Sie den Namen für das zu erzeugende Programm angeben – wir belassen es bei „calc.bbj“ im selben Verzeichnis und klicken auf „Nächste“: 51 Tutorial • Einführung in BBj Der zweite Schritt zeigt die vorhandenen Controls auf dem Formular an, und bietet eine Möglichkeit, Arbeitsvariablen zu definieren. Diese Variablen könne später z.B. beim Aufruf des Dialogs zum Vorbelegen der Feldinhalte, oder zu deren Abfrage nach dem Schließen des Dialogs mit OK benutzt werden: 52 © BASIS Europe 2012 Im dritten Dialog wählen wir die Events, auf die unser Programm reagieren soll. Im ersten Durchlauf registrieren wir lediglich den „Close“–Event der Form selbst. Der vierte Schritt dient dem Hinzufügen einer Toolbar. In unserem Beispiel wollen wir keine Toolbar verwenden. 53 Tutorial • Einführung in BBj Hinweis: Es stehen verschiedene Toolbars zur Verfügung, wie sie auch Barista verwendet. Wird eine solche Toolbar hinzugefügt und das Programm später innerhalb von Barista ausgeführt, so interagiert diese automatisch mit der Barista Toolbar in der MDI Titelzeile. Eine Toolbar kann aber auch völlig unabhängig von der Verwendung des Programms mit Barista eingestellt werden. Wir klicken auf „Fertig“. Unser Programm erscheint im Filesystem-Tab. 54 © BASIS Europe 2012 Wir öffnen das erzeugte Programm und starten es. Es erscheint ein Auswahlbildschirm: Die ersten beiden Optionen starten das Programm in GUI (Java Swing Desktop- Version) bzw. als BUI-Variante (im Browser). Die dritte Option startet den Wizard erneut, um z.B. weitere Events hinzuzufügen. Nachdem wir beide Testläufe gemacht haben, wollen wir uns an die Fertigstellung machen. Es fehlen noch einige Events: • OK und CANCEL – Buttons • Die Berechnung soll bei jeder Modifikation der Eingabe in einem der beiden Felder automatisch durchgeführt werden. Wir starten also den Wizard erneut und registrieren vier weitere Events: • • Button Push für OK und CANCEL Edit Modify für M1 und M2 55 Tutorial • Einführung in BBj Wir durchlaufen den Wizard bis zum Ende und werfen einen genaueren Blick auf den erzeugten Code: Die Event-Routinen für die beiden Buttons OK und CANCEL sowie der ON_CLOSE Event enthalten automatisch einen Aufruf von #postCancelAnswer() bzw. #postReturnAnswer(). Diese beiden Methoden können auch an anderer Stelle benutzt werden, um den Dialog positiv oder abbrechend zu beenden. Die beiden ON_EDIT_MODIFY Events müssen wir nun mit Leben füllen. Hierzu fügen wir zunächst eine Methode doCalc zu unserer Klasse hinzu, die die Berechnung selbst ausführen soll. Wir schreiben ans Ende, vor classend: method private void doCalc() m1=#C_M1!.getValue() m2=#C_M2!.getValue() #C_RESULT!.setValue(m1*m2) methodend 56 © BASIS Europe 2012 Dann müssen wir nur noch #doCalc()von den beiden Event-Methoden für den ON_EDIT_ MODIFY Event aufrufen, damit bei jeder Eingabe eine Neuberechnung ausgelöst wird. Das Ergebnis des Teils sieht somit folgendermaßen aus (neue Codeteile gelb markiert): Wir sehen: • Auf die Controls kann im generierten Code per #C_<Controlname>! zugegriffen werden. Diese Control-Variablen sind alle im Kopfteil deklariert. • Wir können selbst Methoden zu der entstehenden Klasse hinzufügen. Dieser eigene Code kommt mit dem Wizard bei weiteren Durchläufen nicht in Konflikt. Bitte beachten Sie: • Ändern Sie keinen Code, der von Kommentaren eingeschlossen ist, die mit /** DLGWIZ_... beginnen (es gibt BEGIN und END). Der Wizard orientiert sich an diesen Kommentaren. Manuelle Änderungen können einen weiteren Durchlauf des Wizard unmöglich machen. • Ändern Sie die Ressourcen-Datei nicht, während eines der Wizard Fenster offen ist. Der Wizard liest die Ressource ein, bevor er das erste Fenster anzeigt. Wenn Sie die Resource währenddessen ändern, kann es sein, dass das generierte Programm nicht mehr zur Form passt. 57 Tutorial • Einführung in BBj Wenn wir unser Programm ablaufen lassen, können wir beobachten, wie bei jeder Änderung in einem der Eingabefelder das Ergebnis neu berechnet wird. In der Klasse gibt es zwei Methoden, „onInitDialog“ und „onExitDialog“. Diese sind für Ihren Code zum Start und zum Ende des Dialogaufrufs gedacht, also z.B. um die Datenbank zu öffnen und einige Variablen zu initialisieren, oder auch, um dann am Ende beim Schließen des Fensters eine Datenbankverbindung wieder zu schließen. Das generierte Programm hat außerdem an seinem Ende (nach der Klasse selbst) einige Zeilen Code, die beim Start den Auswahldialog einblenden. Wie man den Dialog in andere BBj Programme einbindet, sehen wir im nächsten Kapitel. Sollen der Dialog allein gestartet und keine Felder von außen vorbelegt werden, so genügen folgende Zeilen: myDialog! = new calc() myDialog!.doModal() Das Zusammenspiel von Programmen, Threads und Klassen Meistens besteht eine Anwendung aus verschiedenen Programmen und Funktionen, die einander gegenseitig aufrufen und miteinander Daten austauschen. In diesem Kapitel stellen wir die beiden wichtigsten Wege vor, wie einzelne BBj Programme zu einer kompletten Anwendung zusammengefasst werden können. Einbinden von eigenen Klassen Zunächst betrachten wir anhand unserer beiden kleinen Beispielprogramme, wie man eine Klasse, die in einer anderen Programmdatei definiert wurde, einbindet und aufruft. Hierzu öffnen wir wieder unser erstes Programm „hello.bbj“ und ändern es so ab, dass beim Klick auf den Button unser kleiner „Rechner“ gestartet wird, und beim Klick auf „OK“ das Ergebnis zurück ins Eingabefeld übernommen wird. Zunächst müssen wir dem Programm „hello.bbj“ die Klasse „calc“ aus „calc.bbj“ bekannt machen. Hierzu dient der use – Befehl, den wir gleich ganz oben, zusammen mit passendem declare, einbauen: 58 © BASIS Europe 2012 Als nächstes ergänzen wir die Zeilen nach dem „Push“ – Label, um den Dialog aufzurufen: Modale Fenster Wenn wir den Dialog in GUI und BUI testen, funktionert alles auf den ersten Blick wie gewünscht. Allerdings fällt eines auf: das zweite Fenster (mit unserem Rechner) ist nicht wirklich modal – man kann noch immer in das andere zurück wechseln und dort Eingaben vornehmen, die jedoch nicht beantwortet werden – klar, das Programm wartet ja auf den geöffneten Dialog. Wir müssen also noch dafür sorgen, dass der geöffnete Dialog wirklich modal ist. Dies geschieht in der Ressource, mit dem Attribut „modal“ für das Formular. 59 Tutorial • Einführung in BBj Nun funktioniert alles wie gewünscht, und in der BUI Variante entsteht ein echter Dialog, der kein Zurückwechseln in das wartende Fenster erlaubt. Echtes Multithreading Im vorigen Beispiel wurden beide Dialoge im selben Thread ausgeführt. Soll ein BBj Programm jedoch unabhängig gestartet werden, müssen wir einen neuen Thread starten. Dies geschieht in BBj mit dem Befehl „SCALL“ oder per BBjAPI mit "newBBjSession()") Beispiel mit SCALL: result=SCALL("bbj programmname.bbj&") Das & gibt an, dass die neue Session asynchron gestartet werden, also der aufrufende Prozess nicht auf die Beendigung des neuen Prozesses warten soll. Ansonsten entsprechen die Kommandozeile und die Aufrufparameter denjenigen Parametern, die auch beim Start über einen Shortcut definiert werden können. Der Rückgabewert „result“ ist 0, wenn der Start erfolgreich war, ansonsten enthält er einen Fehlercode. Hinweis: SCALL kann auch verwendet werden, um Befehle an das Betriebssystem zu senden – z. B. r=SCALL("cmd /c start http://www.basis-europe.eu") Eleganter geht der Start asynchroner Sessions mit der Funktion “newBBjSession” (bzw. „newSynchBBjSession“ für synchronen, blockierenden Aufruf): myAPI! = BBjAPI() myCFG! = myAPI!.getConfig().getCurrentCommandLineObject() myCFG!.setProgramName(„foo“) x = myAPI!.newBBjSession(myCFG!) Das BBjCommandLineObject bietet dabei Zugriff auf alle verfügbaren Aufrufparameter über Methoden. Das Zusammenstellen eines Strings für die Kommandozeile wie beim SCALL entfällt somit. 60 © BASIS Europe 2012 Namespaces - globale Variablenräume und Interprozesskommunikation Nun haben wir gesehen, wie zwei voneinander unabhängige BBj-Prozesse erzeugt werden können. Als nächstes schauen wir uns an, wie diese beiden Prozesse miteinander kommunizieren können. Bereits beim Aufruf können Kommandozeilen-Parameter übergeben und im aufgerufenen Programm mit ARGV übernommen werden. Aber zum Datenaustausch zur Laufzeit brauchen wir andere Mechanismen. BBj bietet mit Namespaces ein Konzept, das die Kommunikation zwischen Prozessen untereinander erlaubt. Ein Namespace ist ein Variablenraum, der Objekte enthält, auf die von verschiedenen Prozessen zugegriffen werden kann. Der globale Namespace und der generische Namespace (= mit einem Namen versehen) können sogar von Prozessen verschiedener Benutzer, die im selben BBj Service laufen, angesprochen werden. Der Group Namespace ist allen Prozessen gemeinsam, die von einem gemeinsamen Prozess aus gestartet wurden. Ein Menüsystem, das verschiedene Programme mit (->) SCALL startet, ist hierfür ein gutes Beispiel – der Group Namespace kann alle Variablen enthalten, die einer Benutzersitzung gemeinsam sind. Mit setCallback können Events für ganze Namespaces oder für einzelne Objekte registriert werden, so dass Namespaces auch sehr gut zur Kommunikation zwischen Prozessen eingesetzt werden können. Mehrere Threads und Namespace-Kommunikation in unserem Beispiel Ergänzen wir nun unseren Kalkulator um ein zweites Fenster, das nur das Ergebnis, das sich bei jeder Eingabe ändert, in einem separaten Prozess anzuzeigen. Wir erzeugen hierzu eine neue Resource „calcwatch.arc“ und mit dem Wizard das zugehörige Programm „calcwatch.bbj“. Zur Anzeige des Wertes verwenden wir diesmal ein Static Text Control mit dem Namen „VALUE“. Im Wizard denken wir daran, den ON_CLOSE Event für die Form zu registrieren, damit wir das Fenster auch wieder schließen können. 61 Tutorial • Einführung in BBj In der erzeugten Klasse fügen wir direkt zu Beginn die folgende Zeile hinzu, um eine Variable für den Namespace zu erhalten: field private BBjNamespace ns! In der Methode onInitDialog initialisieren wir diese – wir verwenden einen Generic Namespace, der über seinen Namen angesprochen wird, und der von allen Threads im BBj Service unter diesem Namen angesprochen werden kann. Wir zeigen den Wert an und registrieren einen Namespace-Event für jede Variablenänderung, der bei jeder Änderung eine neue Methode „updateValue“ aufruft. Der ergänzte Code sieht so aus: Wir können das Programm nun starten – das Feld wird wie erwartet geleert und wartet auf die erste Aktualisierung. 62 © BASIS Europe 2012 Nun ändern wir unseren Kalkulator in „calc.bbj“ so ab, dass bei jedem Aktualisieren des Ergebnisfeldes auch die Variable im Namespace aktualisiert wird. Hierzu fügen wir einfach folgende Zeile in der Methode doCalc ein: BBjAPI().getNamespace("CALC","WATCH",1).setValue("VALUE",str(m1*m2)) Diese Methode sieht nun folgendermaßen aus: Starten wir nun das Programm und beobachten, was bei jeder Änderung des Resultats passiert. Da wir einen Generic Namespace verwendet haben, können wir sogar eines der Programme im Browser und das andere in der Swing GUI laufen lassen, und die Werte werden dennoch übertragen: Die BUI Variante des einen Programmes versteht sich auch prima mit der GUI Variante des anderen… 63 Tutorial • Einführung in BBj Ausnahmebehandlung Ausnahmen können in BBj abgefangen werden mit einer ERR=-Option im jeweiligen Statement, oder mit einem global wirkenden SETERR-Befehl, der eine Sprungadresse für eine Fehlerroutine setzt, die im Falle einer nicht explizit abgefangenen Ausnahme angesprungen wird. Neben der ERR=-Option existiert auch END=, die bei einer Dateiende-Ausnahme (z. B. Ende einer SQL Ergebnismenge) angesprungen wird. Um feste Labels als Sprungmarken vermeiden zu können, existieren folgende symbolische Labels (siehe auch „Symbolic Labels“ in der Dokumentation): ERR=*PROCEEDbei Fehler: nächster Befehl in derselben Zeile oder nächste Zeile ERR=*NEXT bei ERR=*SAME bei ERR=*RETRY bei ERR=*BREAK bei ERR=*CONTINUE bei ERR=*ESCAPE bei ERR=*RETURN bei ERR=*STOP or ERR=*END bei ERR=*EXIT bei ERR=*ENDIF bei Fehler: nächste Zeile Fehler: zum Anfang derselben Zeile zurück Fehler: nochmals versuchen Fehler: emuliere BREAK Fehler: emuliere CONTINUE Fehler: emuliere ESCAPE Fehler: emuliere RETURN Fehler: emuliere STOP/END Fehler: emuliere EXIT Fehler: gehe zum Ende des innersten IF..ENDIF-Blocks. Beispiel: Schleife zum Einlesen eines SQL Abfrageergebnisses. SQLOPEN (1)"ChileCompany" SQLPREP (1)"SELECT * FROM CUSTOMER" SQLEXEC (1) WHILE 1 DIM X$:SQLTMPL(1) X$=SQLFETCH(1,END=*BREAK) PRINT X.CUST_NUM$,"-",X.LAST_NAME$ WEND PRINT "***END OF LIST***" END Bei Aufrufen von Java-Methoden können Sie ebenfalls einfach err= hinzufügen: a!=new java.util.HashMap() PRINT a!.size(err=*next) Lesen Sie “SETERR” und “Error Trapping Rules” in der Dokumentation für weitere Informationen. 64 © BASIS Europe 2012 BBj Anwendungen – Start per Verknüpfung und per Weblink Unsere fertige Anwendung wollen wir nicht immer aus der IDE starten. Es gibt verschiedene Wege, eine BBj Anwendung lokal oder über ein Netzwerk zu starten: Per direkter Verknüpfung, per Java Webstart von einem entfernten Rechner, oder im Browser als BUI Anwendung. Die Konfiguration einer BUI Anwendung für den Start im Browser hatten wir bereits ganz zu Beginn bei unserem ersten Beispiel durchgeführt. Link zu einem lokal installierten BBj Sind BBj, Anwendung und Daten lokal installiert, so genügt eine Verknüpfung, die den BBj Interpreter mit Ihrem Programm startet. Das Schema lautet <Pfad zu BBj-bin>bbj.exe <Optionen> <prog.bbj> - <Argumente> (Auf Nicht-Windows Systemen entsprechend bbj-Binary anstatt .exe) Der Bindestrich und die <Argumente> sind optional, frei wählbar und können im Programm mit der Funktion ARGC gezählt und mit ARGV eingelesen werden. Die häufigsten <Optionen> sind -c<configuration file> Gibt den Pfad zur Konfigurationsdatei an, die an Stelle der cfg/config.bbx verwendet werden soll. -t<terminal alias> Definiert den Terminal Alias in der config.bbx. (Siehe nächsten Abschnitt „SysWindow abschalten“ -CP<classpath name> Definiert eine Session-spezifische Classpath. Diese kann im Enterprise Manager angelegt werden. -WD<Verzeichnis> Definiert das Working Directory, das nach dem Start von BBj eingestellt werden soll. Eine komplette Übersicht der verfügbaren Kommandozeilenoptionen finden Sie in der Dokumentation unter http://documentation.basis.com/BASISHelp/WebHelp/b3odbc/running_from_the_command_line.htm. 65 Tutorial • Einführung in BBj Das SysWindow „abschalten“ Wir haben bei jedem Programmstart aus der IDE das SysWindow bemerkt, das BBj Ausgaben anzeigt und Eingaben für den Interpreter entgegennimmt. Das SysWindow kann im Programm jederzeit mit PRINT 'HIDE' und PRINT 'SHOW' aus- und wieder eingeschaltet werden. Ob es beim Start von BBj sichtbar sein soll wird über die Datei config.bbx und den sogenannten Terminal Alias definiert. Standardmäßig startet BBj mit dem Alias T0. Um kein SysWindow anzuzeigen, können Sie entweder in der Datei config.bbx den Eintrag für T0 so anpassen wir für T2 voreingestellt, oder BBj mit –tT2 starten. Die Einträge für T0 und T2 in der config.bbx sehen per Default so aus: Aufruf per Java Webstart Ist die BBj Anwendung auf einem Server installiert, kann der Java Swing Thin Client per Java Webstart gestartet werden. Dazu ist auf dem Arbeitsplatzrechner lediglich eine Java JVM erforderlich. Der Benutzer startet einen http-Link zu einer Datei mit der Erweiterung .jnlp. In dieser ist der BBj Start definiert, und Java kann zunächst einige BBj Module herunterladen und starten, und sich dann mit dem Server verbinden und die Anwendung selbst ausführen. Die Einrichtung von Webstart geschieht im Enterprise Manager, unter „JNLP Configuration“. Klicken Sie auf „New JNLP Application“, dann im Baum auf den neuen Eintrag „newapp“, um eine neue Anwendung zu konfigurieren. Zunächst füllen wir den Knoten „Application Summary“ aus und Speichern mit Klick auf die Diskette. 66 © BASIS Europe 2012 Danach noch einige Einträge unter „application-desc“, und wir können die Anwendung über Netzwerk aufrufen: Der Parameter „- run“ nach dem Programmnamen soll lediglich verhindern, dass der Abfragedialog des Wizard ausgeführt wird, falls Sie den generierten Code beibehalten haben. Es ist wichtig, dass sowohl in der Server Konfiguration als auch unter „Remote Host“ der echte Netzwerkname (oder die IP Adresse) des Servers eingetragen wird. Ändern Sie den Namen für den BBj Service selbst unter „localhost“ eignet sich für das lokale Testen am eigenen Rechner immer… 67 Tutorial • Einführung in BBj 68 © BASIS Europe 2012 Index 3-Tier Architektur 4, 33 .arc 42, 50 A admin 22 API 25, 31 asynchron 60 Ausführungsschicht 4 Ausnahmebehandlung 64 B Backslash 41 Barista 6, 50, 54 BBj 5 BBj.properties 22 BBj Services 17 BBj Services starten 18 Benutzeroberfläche 4 BLM 4 BLM, Konfiguration 16 Browser 49, 65 Browser User Interface 4 BUI 4, 48, 65 Business Basic 5 C CALL 38 CAST 31 ChileCompany 64 Client 33 Client Side Objects 33 Code Completion 32 config.bbx 21, 66 config.ini 21 D declare 31 Demo-Lizenz 19, 20 Dialog Wizard 50 Dokumentation 7 Download 8 DVK-Lizenz 20 E Enterprise Manager 5, 48, 49 Entwicklerlizenz 20 Event 53 Lizenz registrieren 13 T Login 22 Thin Client 4, 5, 33 Log 24 Template 27 M Threads 58 Events 61 Modale Fenster 59 F Multithreading 60 Eventsteuerung 44 FAQ 7 Module 19 N FATTR 29 Namespaces 61 FOR..NEXT 35 Newsletter 8 FIELD 29 G globale Variablenräume 61 GOTO 36 GUI 42 H Hello World 42 Hostname 49 Netzwerk 65 NFIELD 29 Notfalllizenzen 20 O Objekte 26, 31 Objektorientierung 31 Online-Angebote 7 R IDE 25, 42, 66 Records 26 Installation 9 Ressourcen 42 Interpreter 39, 66 Interprozesskommunikation 61 Schleifen 35 JVM Settings 23 Sprünge 36 Kommandozeile 61, 65 Kommandozeilen-Parameter 61 Konfigurationsdateien 21 Konsole 39 L Labels 36, 37, 45 Lizenzen 19, 20 Lizenzmanager 4 Variablenräume 61 Verknüpfung 65 Video 7 Visual Basic 5 W Weblink 65 Webstart 4, 65, 66 Windows Dienst 17 RIA 4 S Klassen 31, 33, 58 Variablen 26 Ressourcendatei 44 Java-Methoden 64 K V Ressource 50 J Javascript 4 Training 8 Overlays 38 I IF..THEN..ELSE 34 Toolbar 53 Slash 41 sql.ini 22 Start 65 String Templates 26 Strukturen 26 Suchpfade 41 Swing 4 SWITCH..CASE 34 synchron 60 Syntax 34 SysWindow 66 69 Tutorial • Einführung in BBj 70 © BASIS Europe 2012 71 Nell-Breuning-Allee 6 66115 Saarbrücken Germany Tel. +49 681 96814-0 Fax +49 681 96814-33 [email protected] www.basis-europe.eu BBjTutorial_DE_1201_72_P4.indd BASIS Europe Distribution GmbH