Christoph Menken „Gesammelte Werke“ PowerBuilder Tipps und Tricks und sonstiges aus der „normalen“ Client-Server Entwicklung Ludwin Feiten, Christoph Menken.

Slides:



Advertisements
Ähnliche Präsentationen
Objektrelationales Mapping mit JPA Advanced Topics Jonas Bandi Simon Martinelli.
Advertisements

C Sharp (C#) Martin Saternus Senior Student Partner
programmiert April-Juni 2003 von Knut Riechmann
der Universität Oldenburg
Klassen - Verkettete Liste -
DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
Ein Beispiel in Java.
Programmierung II Prof. Dr. Michael Löwe
Kurt Rosenberg. C# für.NET oder.NET für C# is(C# == C++ && Java)? true : false ; reines C# Ausblick Überblick.
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Ausnahmen HS Merseburg (FH) WS 06/07.
Daten Anzeigen und Ausdrucken Zu Zeigende Daten (z.B. Studentenplan) Daten in XML müssen geparst und in PDF- Format umgewandelt werden. Dazu iTEXT Bibliothek.
Sortieren mit Binären Bäumen
Java: Dynamische Datentypen
Listen Richard Göbel.
FH-Hof Fehlerbehandlung Richard Göbel. FH-Hof Konzept Fehler können mit dem Operator throw einer übergeordneten Funktion signalisiert werden. Parameter.
Ein Beispiel in Java.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 7 User Interfaces in Java Sommersemester 2003 Lars Bernard.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Projektplan: Fachgebiet Software Engineering Übersicht © Albert Zündorf, Kassel University.
Modulare Programmierung
1DVG3 - Paint Paint ein Zeichenprogramm. DVG3 - Paint 2 Paint – ein Zeichenprogramm.
1DVG3 - anonyme Klassen Anonyme Klassen. DVG3 - anonyme Klassen 2 Syntax new BasisKlasse(Parameterliste) { Modifikationen und Erweiterungen der Basisklasse.
Einführung in die Programmierung Datensammlung
VFP Class Browser. © 1999 TMN-Systemberatung GmbH Einsatz des Class Browser n Managen von Klassen inklusive, ändern, umbenennen, löschen und umdefinieren.
Uwe Habermann Venelina Jordanova VFP Code in Silverlight Anwendungen ausführen.
Presenter: Daniel Walzenbach Technologieberater
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Sommersemester 2004 Jan Drewnak Entwicklung und Einsatz von Geosoftware I Praktikum Sitzung 7 Sitzung 7: User Interfaces in Java.
Einfach verkettete Listen (OOP)
Objektorientierte Modellierung
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Rekursive Funktionen (Fakultät)
Erste Schritte mit Eclipse Neues Projekt erstellen (1)
AWT und JFC Abstract Windowing Toolkit
Socket-Programmierung
Entwicklung verteilter Anwendungen I, WS 13/14 Prof. Dr. Herrad Schmidt WS 13/14 Kapitel 12 Folie 2 Web Services (1)
1 Sg 3 – JSP - Java Server Pages Softwareengineering Praktikum Java Server Pages Nicole Brandstätter Josef Sturm Karl Streicher.
Übungen zum Vortrag „Backtracking mit Heuristiken“
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Uwe Habermann Venelina Jordanova Schreiben von Visual FoxPro Code in der Oberfläche.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Vortrag: Visual Basic Neuerungen Autor : Dennis Hoyer
CuP - Java Neunte Vorlesung Entspricht Kapitel 4.2 und 5 des Skriptums
Das Command Muster Deimbacher, Gölles.
Seminar aus Softwareentwicklung
Programmiervorkurs WS 2014/15 Instanzmethoden
Voyager Eigenschaften/Vorzüge Universalität: –ROI-Modelle: CORBA, RMI, DCOM –verschiedene Namens-, Verzeichnisdienste Nachrichtentypen: synchron, oneway,
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Übung Informatik I exercise01. 2 Inhaltsübersicht Nachbesprechung Übung 1 Individuelle Fragen/Bemerkungen.
Java-Kurs Übung Benutzeroberflächen und Graphik Frames (Fenster)
© 2004 Pohlig Informatik Kurse © 2004 Pohlig Informatik Kurse Der Tramp tanzt die Rekursion zünderUntersuchen(…) Basisfall Rückmeldung:
Institut für Kartographie und Geoinformation Prof. Dr. L. Plümer, Dipl.-Ing. D. Dörschlag, Dr. G. Gröger Einführung in die Programmierung mit Java 13.
Wieland Schwinger Softwareentwicklung 2 Assertions.
Abteilung für Telekooperation Softwareentwicklung 2 UE WS 2008/09 SE2UE_ Ausnahmen (Exceptions)
Oracle IFS Die Brücke zwischen Content Management System und einer Produktpräsentation im Internet.
Tutorium Software-Engineering SS14 Florian Manghofer.
C++ FÜR cOMPUTERSPIELENTWICKLER
Tutorium Software-Engineering SS14 Florian Manghofer.
Workshop 1 Getting Started 2016 Boris Wylutzki
Objektorientierung Gliederung von Daten und Funktionen zu Objekten
Java-Kurs Übung Grafik in Java - das Abstract Windowing Toolkit
Felder in Java.
 Präsentation transkript:

Christoph Menken „Gesammelte Werke“ PowerBuilder Tipps und Tricks und sonstiges aus der „normalen“ Client-Server Entwicklung Ludwin Feiten, Christoph Menken Power People Teil 2

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 2/36 Fahrplan Tipps & Tricks im Web.net Komponente via ComWrapper Powerbuilder in SAP Business One

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 3/36 Tipps & Tricks im Web (Auszug) powerbuilder.codexchange.sybase.com/ pbdj.sys-con.com/ members.cox.net/bdick/PbStuff.htm s.webring.com/hub?ring=pbring

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 4/36.net Komponente via ComWrapper Neue Klassenbibliothek (Class Library) erzeugen

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 5/36.net Komponente via ComWrapper Klasse und alle zugehörigen Referenzen umbenennen

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 6/36.net Komponente via ComWrapper

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 7/36.net Komponente via ComWrapper

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 8/36.net Komponente via ComWrapper

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 9/36.net Komponente via ComWrapper

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 10/36.net Komponente via ComWrapper set dnf=C:\WINDOWS\Microsoft.NET\Framework\v set sdk=D:\Programme\Microsoft Visual Studio 8\SDK\v2.0\Bin %dnf%\regasm $(TargetFileName) /regfile:$(TargetName).reg %sdk%\gacutil /i "$(TargetPath)"

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 11/36.net Komponente via ComWrapper using System; using System.Collections.Generic; using System.Text; using System.Net.Mail; namespace DotNetSMTP { public class DotNetSMTP { private String senderName; public String SenderName { get { return senderName; } set { senderName = value; } } private String sender ; private String smtpServer; private String recipient ; private String subject; private String cc = ""; private String bcc = ""; private bool isHTML = false; private String messageText;

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 12/36.net Komponente via ComWrapper public void sendMail() { SmtpClient smtpClient = new SmtpClient(); MailMessage message = new MailMessage(); MailAddress fromAddress = new MailAddress(sender , senderName); smtpClient.Host = smtpServer; smtpClient.Port = 25; message.From = fromAddress; message.To.Add(recipient ); message.Subject = subject; if (!cc .Equals("")) { message.CC.Add(cc ); } if (!bcc .Equals("")) { message.Bcc.Add(cc ); } message.IsBodyHtml = isHTML; message.Body = messageText; smtpClient.Send(message); }

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 13/36.net Komponente via ComWrapper DLL erstellen Registryeintrag hinzufügen REGEDIT4 "ThreadingModel"="Both" "Class"="DotNetSMTP.DotNetSMTP" "Assembly"="DotNetSMTP, Version= , Culture=neutral, PublicKeyToken=7090f4c6a1c37793" "RuntimeVersion"="v " [HKEY_CLASSES_ROOT\CLSID\{43C9C58D-A6F4-3D41-A65D- 6E0D23EE4249}\InprocServer32\ ] "Class"="DotNetSMTP.DotNetSMTP" "Assembly"="DotNetSMTP, Version= , Culture=neutral, PublicKeyToken=7090f4c6a1c37793" "RuntimeVersion"="v " [HKEY_CLASSES_ROOT\CLSID\{43C9C58D-A6F4-3D41-A65D-6E0D23EE4249}\Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 14/36.net Komponente via ComWrapper Testprogramm in C# erstellen

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 15/36.net Komponente via ComWrapper Die DotNetSMTP.dll als Referenz hinzufügen

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 16/36.net Komponente via ComWrapper Einen Button hinzufügen Im clicked-Event folgenden Code hinzufügen: DotNetSMTP.DotNetSMTP smtpclient = new DotNetSMTP.DotNetSMTP(); smtpclient.SenderName = "Christoph Menken"; smtpclient.Sender = smtpclient.SmtpServer = "smtp.gmx.de"; smtpclient.Recipient = smtpclient.MessageText = "This is a test, this is only a test."; smtpclient.Subject = "Dot Net via COM is cool"; smtpclient.sendMail();

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 17/36.net Komponente via ComWrapper Im Powerbuilder: integer li_rc oleobject lole_smtp lole_smtp = CREATE oleobject li_rc = lole_smtp.ConnectToNewObject ( "DotNetSMTP.DotNetSMTP" ) if li_rc = 0 then lole_smtp.SenderName = "Christoph Menken" lole_smtp.Sender = lole_smtp.Recipient = lole_smtp.SmtpServer = "smtp.gmx.de" lole_smtp.MessageText = "This is a test, this is only a test." lole_smtp.Subject = "Dot Net via COM is cool" else MessageBox( parent.title, & "Error calling DotNetSMTP via COM: " + string(li_rc) ) end if

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 18/36 PB als Add-On Kundenauftrag der Be.as GmbH Be.as ist eine Erweiterung des SAP Business One (SBO) Vorteile: –Look&Feel wie SBO –Verwendung derselben Datenbank und der SBO DI-API –Leichte Erweiterungsmöglichkeit durch eigene PSR-basierte Skriptsprache Problem: Extra Programm

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 19/36 PB als Add-On Lösung: SBO UI-API –COM+Objekt –Add-On in SBO –Integration in die SBO Eventsteuerug Problem: Powerbuilder unterstüzt keine Implementation der Events, wie z.B. VisualBasics „with events“

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 20/36 PB als Add-On Lösung: PBNI Erstellen eines PBNI COM- Objekt, welches das SBO-UI- COM-Objekt verwendet und die Events in PB zur Verfügung stellt SAP Business One PB SBO UI API PBNI-COM- Objekt Registrierung Triggert Events

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 21/36 PB als Add-On Beispiel: PBNIOLEObject –Einfaches exemplarisches Beispiel –Integration eines PB- Programms in MS Word –von Bruce Armstrong

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 22/36 PB als Add-On PBXEXPORT LPCTSTR PBXCALL PBX_GetDescription() { static const TCHAR desc[] = { "class n_cpp_oleobject from oleobject\n" "function integer CaptureEvents() \n" "function integer ReleaseEvents() \n" "event startup pbm_custom01 \n" "event quit pbm_custom02 \n" "event documentchange pbm_custom03 \n" "end class \n" }; return desc ; }

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 23/36 PB als Add-On PBXEXPORT PBXRESULT PBXCALL PBX_CreateNonVisualObject( IPB_Session*pbsession, pbobjectpbobj, LPCSTRclassName, IPBX_NonVisualObject**obj ) { if ( strcmp( className, "n_cpp_oleobject" ) == 0 ) { *obj = new COLEObject() ; return PBX_OK ; } ; *obj = NULL ; return PBX_E_NO_SUCH_CLASS ; }

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 24/36 PB als Add-On BEGIN_DISPATCH_MAP(CEventSink, CCmdTarget) DISP_FUNCTION(CEventSink, "Startup", Startup, VT_EMPTY, VTS_NONE) DISP_FUNCTION(CEventSink, "Quit", Quit, VT_EMPTY, VTS_NONE) DISP_FUNCTION(CEventSink, "DocumentChange", DocumentChange, VT_EMPTY, VTS_NONE) END_DISPATCH_MAP() static const GUID IID_ICEventSink = {0x000209f7,0x000,0x0000,{0xc0,0x00,0x0,0x00,0x00,0x00,0x00,0x46 } }; BEGIN_INTERFACE_MAP(CEventSink, CCmdTarget) INTERFACE_PART(CEventSink, IID_ICEventSink, Dispatch) END_INTERFACE_MAP()

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 25/36 PB als Add-On void CEventSink::Startup() { //We'll never get this one, it happens before we capture the events #ifdef _DEBUG MessageBox( NULL, "Startup", "Message", MB_ICONEXCLAMATION | MB_OK ); #endif pbclass clz = m_userdata->session->GetClass(m_userdata->object); pbmethodID mid = m_userdata->session->GetMethodID(clz, "startup", PBRT_EVENT, "LUL" ); PBCallInfo ci; m_userdata->session->InitCallInfo(clz, mid, &ci); m_userdata->session->TriggerEvent(m_userdata->object, mid, &ci); m_userdata->session->FreeCallInfo(&ci); }

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 26/36 PB als Add-On void CEventSink::Quit() { #ifdef _DEBUG MessageBox( NULL, "Quit", "Message", MB_ICONEXCLAMATION | MB_OK ); #endif pbclass clz = m_userdata->session->GetClass(m_userdata->object); pbmethodID mid = m_userdata->session->GetMethodID(clz, "quit", PBRT_EVENT, "LUL" ); PBCallInfo ci; m_userdata->session->InitCallInfo(clz, mid, &ci); m_userdata->session->TriggerEvent(m_userdata->object, mid, &ci); m_userdata->session->FreeCallInfo(&ci); }

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 27/36 PB als Add-On void CEventSink::DocumentChange() { #ifdef _DEBUG MessageBox( NULL, "DocumentChange", "Message", MB_ICONEXCLAMATION | MB_OK ); #endif pbclass clz = m_userdata->session->GetClass(m_userdata->object); pbmethodID mid = m_userdata->session->GetMethodID(clz, "documentchange", PBRT_EVENT, "LUL" ); PBCallInfo ci; m_userdata->session->InitCallInfo(clz, mid, &ci); m_userdata->session->TriggerEvent(m_userdata->object, mid, &ci); m_userdata->session->FreeCallInfo(&ci); }

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 28/36 PB als Add-On Erzeugen der PBD erase pbnioleobject.pbx copy release\pbnioleobject.dll pbnioleobject.pbx "D:\Programme\Sybase\PowerBuilder 10.5\SDK\PBNI\pbx2pbd105.exe" pbnioleobject.pbd pbnioleobject.pbx pause

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 29/36 PB als Add-On Verbindung herstellen Integerli_rc SetPointer ( HourGlass! ) try inv_word = CREATE n_cpp_oleobject_word_application IF IsNull ( inv_word ) THEN Return li_rc = inv_word.ConnectToNewObject ( "Word.Application.8" ) IF li_rc <> 0 THEN Return li_rc inv_word.Visible = TRUE li_rc = inv_word.CaptureEvents() catch (Throwable MyError ) Return -1 end try CHOOSE CASE li_rc CASE 1 Return 1 CASE ELSE Return li_rc END CHOOSE

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 30/36 PB als Add-On

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 31/36 PB als Add-On

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 32/36 PB als Add-On

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 33/36 PB als Add-On Möglichkeiten der SBO- UI-API: –Reaktion auf SBO-Events –Erzeugen von SBO-Objekten, wie z.B. Form, Menü, Button, Datenfelder Problem: –Keine Verwendung von PB- Objekte möglich –Somit auch keine Datawindows, bzw. PSRs

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 34/36 PB als Add-On Lösung: –Erzeugen einer SBO-Form –Erzeugen eines Childwindow in PB –Ermittlung der Handle beider Fenster –PB-Child als Child der SBO- Form setzen

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 35/36 PB als Add-On // Zunächst eine Form in SAP öffnen ls_uid = 'beas_' + string(now(),"hhmmssffff") ls_title = aw_window.title li_top = UnitsToPixels(aw_window.y, YUnitsToPixels! ) li_left = UnitsToPixels(aw_window.x, XUnitsToPixels! ) li_width = UnitsToPixels(aw_window.width, XUnitsToPixels! ) li_height = UnitsToPixels(aw_window.height, YUnitsToPixels! ) ll_rc = this.of_sboform_add( ls_uid, "", this.ft_sizable, this.fbs_sizable, "", lole_form, ls_title, li_left, li_width, li_top, li_height ) if not isvalid(lole_form) then return FAILURE // Dann das Handle das SBO Fensters holen (Klasse: TMMDIChildClass) SetNull( ls_WindowName ) setnull( ll_hStartingChild ) ll_hFrameWindow = FindWindowA( SBOFRAME_CLASS, ls_WindowName) // erst den Frame … ll_hClientWindow = FindWindowExA( ll_hFrameWindow, ll_hStartingChild, SBOCLIENT_CLASS, ls_WindowName)// dann den Client … ll_hChildWindow = FindWindowExA( ll_hClientWindow, ll_hStartingChild, SBOCHILD_CLASS, ls_WindowName) // und dann das Child … // Fenster positionieren aw_window.x = 0// ganz nach links aw_window.y = 0// ganz nach oben // Das Handle des Childs bilden ll_hPBWindow = handle(aw_window) if isnull(ll_hPBWindow) then return FAILURE // das Handle des SBO-Parents an das PB-Child übergeben ll_hParentWindow = ll_hChildWindow ll_rc = SetParent( ll_hPBWindow, ll_hParentWindow)

Christoph Menken PBUGG Frankfurt Tipps & Tricks 2 Folie 36/36 Kontakt Sind noch Fragen offen? Bei Rückfragen oder Anregungen bitte an: Ludwin Feiten Power People Inh. Ludwin Feiten Am Borsigturm 50 D Berlin fon +49 (0) fax +49 (0)