Einführende Bemerkungen zur Architektur der Plugin-Schnittstelle
Der Zugriff auf die EC&T-Daten geschieht vermittels dreier ActiveX Steuerelemente in EasyCTX.ocx, die über die bisherige Plugin-Schnittstelle (ECTFace.dll) Daten des EC&T-Hauptprogramms zur Verfügung stellen.
Der Ablauf erfolgt so, dass das ActiveX-Plugin nach der Aktivierung zunächst mit dem Aufruf dessen Init()-Methode ein Handle für das Dokument-Steuerelement bekommt, mit dem dieses wiederum auf die Dokumentdaten zugreift (intern entspricht das Handle einem Zeiger auf das aktuelle CDocument des Programms, das in ECTIFace.dll verankert ist). Bei HTML-Plugins wird das Handle in der URL mitgegeben.
Das Dokument Objekt entspricht, wie gesagt, dem geöffneten Dokument des Hauptprogramms. Über dieses Objekt können die einzelnen Buchungen über das Buchung-Objekt zugegriffen werden. Mit dem Objekt Einstellungen kann auf die Einträge der Einstellungsdatei (EasyCT.ini) im Programmverzeichnis zugegriffen werden. (Eintragungen in der Finanzamt-Sektion müssen mit einem vorangestellten 'f' im Schlüsselnamen zugegriffen werden, um einen Namenskonflikt mit den pers. Einstellungen zu vermeiden, z.B. 'fname' statt 'name'.)
Da es sich bei EasyCT.ocx um einen sog. In-Process-Server handelt, sollte das Threading-Model des zu erstellenden Plugins entsprechend eingestellt sein (z.B. 'single-threaded').
Init-Event im Plugin
Das 'Init'-Event muss als Aufruf ohne Rückgabewert mit einem einzelnen 32-bit-Parameter implementiert werden. Für die einzelnen Programmiersprachen sieht das in etwa so aus:
Visual Basic: Sub Init(ByVal dokID)
C++: void Init(long dokID)
Delphi: procedure Init(dokID: Integer); safecall;
Damit das entwickelte Plugin von EC&T auch erkannt wird, müssen einige Registrierungs-Einträge unter folgendem Schlüssel angelegt werden:
HKEY_LOCAL_MACHINE\Software\Tools\EasyCash\Plugins\{MeinPluginName}
Wert-Name | Beschreibung | |
Aufruf | Hier steht entweder der Name des Steuerelements oder eine URL. Beispiele: 'Project1.UserControl1', 'file:///C:/Programme/EasyCash&Tax/Plugins/JavaScriptJournal.htm?$$ID$$'. $$ID$$ ist dabei der Platzhalter für das übergebene Dokument-Handle, da man in HTML-Seiten keine Init-Methode einrichten kann, die von außen agesprochen werden kann. Das Handle befindet sich nach dem Aufruf im Browser-Objekt window.location.search, aus dem man nur noch das vorangestellte '?' ausfiltern muss. |
Beschreibung | Eine Beschreibung des Plugins. Wird in einem zukünftig vorgesehenen Plugin-Manager gebraucht. |
Bitmap | Pfad zu einem 32x32-Pixel GIF-Bild für die Plugin-Symbolleiste. Es ist darauf zu achten, dass das GIF-Bild lediglich eine Palette hat, die die 16 Windows-Systemfarben enthält. Ansonsten kommt es zu Verfälschungen oder wird bei mehr Farben garnicht mehr dargestellt. |
Name | Der Name des Plugins. Wird in einem zukünftig vorgesehenen Plugin-Manager gebraucht. |
Typ (optional) | Beeinflusst das Verhalten des Plugins. Bisher ist nur der Wert 'noscroll' möglich, der den Aufbau von Scrollbars für das Plugin-Fenster verhindert.
|
Destroy-Event im Plugin
Das 'Destroy'-Event kann optional implementiert werden und wird von EC&T ab v1.60 unterstützt. Destroy wird direkt vor dem Deaktivieren des Plugins gefeuert. Hier können Aktionen ausgeführt werden wie das Schließen von Datenbanken oder das Freigeben von anderen Ressourcen. Bei JavaScript/HTML-Plugins gibt es leider keine Möglichkeit, einen Destroy-Event abzufangen. Wie das Init-Event wird das Destroy-Event ohne Rückgabewert mit einem einzelnen 32-bit-Parameter deklariert. Für die einzelnen Programmiersprachen sieht das in etwa so aus:
Visual Basic: Sub Destroy(ByVal dokID)
C++: void Destroy(long dokID)
Delphi: procedure Destroy(dokID: Integer); safecall;
Dokument-Objekt
Eigenschaften:
long ID; | Bekommt das in der Init()-Methode übergebene Dokument-Handle |
short Jahr; | 16-bit Wert, der das Buchungsjahr enthält |
long LaufendeBuchungsnummerEinnahmen; | selbsterklärend |
long LaufendeBuchungsnummerAusgaben; | selbsterklärend |
BSTR Waehrung; | Enthält die Währung als 3-stelliges Kürzel, z.B. 'EUR' oder 'SFR' |
long AbschreibungGenauigkeit; | 0 = Jahres-AfA, 1 = Halbjahres-AfA, 2 = monatsgenaue AfA |
long LaufendeBuchungsnummerBank; | selbsterklärend |
long LaufendeBuchungsnummerKasse; | selbsterklärend |
Methoden:
long FindeErsteEinnahmenBuchung(); | gibt die ID der ersten Einnahmen-Buchung zurück, die dann in die ID-Eigenschaft des Buchung-Objekts gegeben werden kann, um auf die Buchungsdaten zugreifen zu können |
long FindeErsteAusgabenBuchung(); | dasselbe mit Ausgaben |
long FindeNaechsteBuchung(long BuchungID); | Holt die nächste Buchung in der Liste. BuchungID muss mit dem Ergebnis des Aufrufs einer der beiden oberen Methoden versehen werden -- oder mit eingem vorhergehenden Aufruf dieser Methode. |
long NeueEinnahmenbuchungEinfuegen(); | Erzeugt eine neuen Einnahmen-Buchung, die mit den Eigenschaften und Methoden des Buchung-Objekts gefüllt werden muss. Die Default-Werte bei der Erzeugung des Datensatzes sind: Betrag = 0;
MWSt = 0;
AbschreibungNr = 1;
AbschreibungJahre = 1;
Beschreibung = "";
Datum = 1.1.2000;
Konto= "";
Belegnummer= "";
AbschreibungRestwert = 0;
AbschreibungDegressiv = 0;
AbschreibungSatz = 0; |
long NeueAusgabenbuchungEinfuegen(); | dito für Ausgaben |
void Sortieren(); | Insbesondere nach dem Einfügen neuer Buchungen oder dem Ändern des Datums von bestehenden Buchungen sollte diese Methode aufgerufen werden. |
void LoescheBuchung(long BuchungID); | Nimmt eine Buchung aus einer der beiden Listen. |
CURRENCY HoleEinnahmenSumme(); | Berechnet die gesamten Einnahmen. |
CURRENCY HoleAusgabenSumme(); | Berechnet die gesamten Ausgaben. |
long HoleDokumentVersion(); | Die Dokument-Version, wie sie benutzt wird, um .eca-Dateien korrekt zu updaten und Kompatibilität zu sichern. Da das Dokument beim Laden immer auf die Version geupdated wird, mit der EC&T was anfanfen kann entspricht die Dokument-Version immer der Version, mit der EC&T gerade läuft. Die Dokumentversion von EC&T v1.21 ist 8. |
BSTR HoleBenutzerdefWert(BSTR PluginName, BSTR SchluesselName); | Hiermit kann auf benutzerdefinierte Daten, die von Plugins angelegt wurden, zugegriffen werden. Am Besten greift jedes Plugin nur auf die eigenen Daten zu. |
void SpeichereBenutzerdefWert(BSTR PluginName, BSTR SchluesselName, BSTR Wert); | Speichert Daten, die das Plugin für dieses Dokument benötigt. Die Daten werden in der .eca Datei gespeichert und sind auch nach dem nächsten Programmstart wieder verfügbar. Für PluginName sollte ein möglichst differenzierter Name benutzt werden, damit Konflikte zwischen Plugins vermieden werden können. Also nicht 'MeinECTPlugin', sondern am besten etwas, was sich aus Autorennamen und Funktion zusammensetzt, z.B. 'TMsFahrtenbuch'. '|'- und '='-Zeichen dürfen im Schlüsselnamen nicht verwendet werden. |
Buchung-Objekt
Hinweis: Die Eigenschaften AbschreibungGenauigkeit, Betrieb und Bestandskonto sind erst ab v1.49 verfügbar. Um zu prüfen, ob das aktuelle EC&T installiert ist und die Methoden auch zur Verfügung stehen kann die Methode HoleDokumentVersion() benutzt werden. Wenn diese 10 oder höher zurück gibt, sind die Eigenschaften verfügbar.
Eigenschaften:
long ID; | Erhält den Rückgabewert einer der drei ersten Dokument-Methoden. Erst nach Setzen diese Werts kann auf die Buchung mithilfe der anderen Eigenschaften und Methoden von Buchung zugegriffen werden. Alle weiteren Eigenschaften und Methoden beziehen sich in der Folge auf die mit der ID spezifizierte Buchung. |
CURRENCY Betrag; | brutto |
double MWSt; | selbsterklärend |
short AbschreibungNr; | Aktuelles Jahr der Abschreibung. Kann um ein Jahr größer werden als die Abschreibungsdauer, wenn nicht-jahresgenaue AfA eingestellt wurde. Siehe Dokument.AbschreibungGenauigkeit. |
short AbschreibungJahre; | Abschreibungsdauer |
BSTR Beschreibung; | Der Beschreibungstext der Buchung |
DATE Datum; | Buchungsdatum |
BSTR Konto; | virtuelles Konto in Reintext |
BSTR Belegnummer; | selbsterklärend |
CURRENCY AbschreibungRestwert; | Restbuchwert des Anlagegegenstands |
boolean AbschreibungDegressiv; | TRUE wenn Abschreibungsmodus degressiv ist -- zur Zeit wird dieser Wert vom Programm noch nicht berücksichtigt |
double AbschreibungSatz; | Prozentsatz der jährlichen degressiven Abschreibung -- zur Zeit wird dieser Wert vom Programm noch nicht berücksichtigt |
long AbschreibungGenauigkeit; | Analog zum gleichnamigen Dokument-Property -- 0 = Jahres-AfA, 1 = Halbjahres-AfA, 2 = monatsgenaue AfA, 3 entsp. den aktuellen Einstellungen im Dokument. Wird in der GetNetto Methode verarbeitet. (Verfügbar ab v1.49 bzw. wenn HoleDokumentVersion() >= 10) |
BSTR Betrieb; | Name des Betriebs in Reintext, wie in der easyct.ini in der Sektion Betriebe unter BetriebXXName gespeichert. (Verfügbar ab v1.49 bzw. wenn HoleDokumentVersion() >= 10) |
BSTR Bestandskonto; | Name des Bestandskontos in Reintext, wie in der easyct.ini in der Sektion Bestandskonten unter BestandskontoXXName gespeichert. (Verfügbar ab v1.49 bzw. wenn HoleDokumentVersion() >= 10) |
|
Methoden:
CURRENCY HoleNetto(); | Berechnet den Netto-Wert aus Betrag und MWSt. Diese Eigenschaft kann gefahrlos bei Einnahmen-Buchungen benutzt werden. Bei Ausgaben-Buchungen sollte aber HoleBuchungsjahrNetto benutzt werden, welche die tatsächliche Abschreibung bei AfAs berücksichtigt. |
CURRENCY HoleBuchungsjahrNetto(long dokID); | Bechnet bei Ausgaben die tatsächliche Abschreibung bei AfAs unter berücksichtigung der AfA-Genauigkeit, weshalb auch die Dokument.ID übergeben werden muss. |
BSTR HoleBenutzerdefWert(BSTR PluginName, BSTR SchluesselName); | Holt einen bestimmten vorher vom Plugin im Dokument gespeicherten wert, der mit dieser Buchung assoziiert ist. Siehe auf die entspr. Dokument-Methode. |
void SpeichereBenutzerdefWert(BSTR PluginName, BSTR SchluesselName, BSTR Wert); | Speichert ein mit der Buchung assoziierten Text-Wert. Siehe auf die entspr. Dokument-Methode. |
Einstellung-Objekt
Methoden:
BSTR HoleEinstellung(BSTR ID); | Holt einen Wert aus der EC&T-Einstellungsdatei (EasyCT.ini). |
void SpeichereEinstellung(BSTR ID, BSTR Wert); | Speichert einen Wert in der EC&T-Einstellungsdatei (EasyCT.ini). |
Im Folgenden sind die möglichen Schlüssel-IDs aufgelistet, mit denen auf Einstellungen zugegriffen werden kann:
'Allgemein'-Sektion:
- monatliche_voranmeldung
- taeglich_buchen
- BuchungsdatumBelassen
- ErzeugeLaufendeBuchungsnummernFuerEinnahmen
- ErzeugeLaufendeBuchungsnummernFuerAusgaben
- JahresfeldAktiviert
- tausender_mwst_saetze
- AbschreibungGenauigkeit
- JahreswechselAbfrage
'Druck'Sektion:
- umstvoranmeldung_h
- umstvoranmeldung_h2
- umstvoranmeldung_v
- formular_nicht_mitdrucken
- Bildschirmschrift
- Bildschirmschriftgroesse
- Druckerschrift
- Druckerschriftgroesse
'Buchungsposten'-Sektion
- ##Text
- ##Ausg
- ##MWSt
- ##AfAJ
- ##Rech
('##' entspricht der zweistelligen Nummer (führende '0') des Buchungspresets)
'Persoenliche_Daten'-Sektion:
- name
- vorname
- unternehmensart1
- unternehmensart2
- strasse
- plz
- ort
- land
- vat1
- vat2
- vat3
'Finanzamt'-Sektion:
- fname
- fname2
- fstrasse
- fplz
- fort
- fsteuernummer
Die virtuellen Konten in den Ini-Datei-Sektionen 'EinnahmenRechnungsposten' und 'AusgabenRechnungsposten' können jeweils mit einer zweistelligen Nummer mit vorangestelltem 'e' oder 'a' angesprochen werden.
Ab v1.35 besteht die Möglichkeit, auf die einzelnen Sektionen der easyct.ini direkt zu zu greifen, indem man die Sektion in eckigen Klammern im Schlüsselnamen voranstellt, z.B. "[sektion]key".
Formular-Objekt
Methoden:
void SetzeDokumentID(long ID); | Erhält die in der Init-Methode bekommene dokument-ID, um auf die Daten in EC&T zugreifen zu können. |
BSTR HoleFormularnamen(long Index, LPCTSTR Filter); | Holt den Namen des durch den Index angegebenen Formulars, wie er im CML-Attribut 'anzeigename' der .ecf Datei steht. Index ist von 0 bis HoleFormularanzahl()-1. Die Funktion gibt einen Leerstring zurück, wenn der Indexbereich überschritten wird. |
BSTR HoleFormularpfad(long Index); | Wie HoleFormularnamen, nur dass der Dateipfad der .ecf-Datei zurückgegeben wird. |
long HoleFormularanzahl(); | Die Anzahl der vorhandenen Formulare, die über obige Funktionen angesprochen werden können. |
void WaehleFormular(LPCTSTR Formular); | Das Parameter gibt den voll qualifizierten Pfad an, unter dem die .ecf-Formulardatei zu finden ist. Dieser kann mit HoleFormularpfad herausbekommen werden. |
long HoleFeldanzahl(); | Git die Anzahl der im zuvor mit WaehleFormular eingestellten Formular zurück. |
long HoleFeldIDUeberIndex(long Index); | Gibt die ID wie sie im gleichnamigen Attribut des mit Index spezifizierten XML-Node in der .ecf-Datei zurück. Die ID ist auch unter Einstellungen->E/Ü-Konten angegeben und weicht manchmal von den Kennziffern des Finanzamts ab. Einen Überblick über die Feld-IDs bekommt man auch, wenn man im Formular unter EC&T rechte Maustaste->'Felder anzeigen' wählt. |
BSTR HoleFeldwertUeberIndex(long Index); | Holt den Inhalt eines Feldes über den Index. |
BSTR HoleFeldwertUeberID(long FeldID); | Alternative Methode, um den Inhalt eines Feldes zu erhalten, wenn man die ID statt einen Index verwenden will. |
BSTR HoleFeldbeschreibungUeberID(long FeldID); | Gibt das im entspr. Attribut des Feld-Nodes der .ecf-Formulardatei wieder. Für weitere Attribute habe ich noch keine Funktionen vorgesehen, weil die anderen eher für die interne Verarbeitung in EC&T verwendung finden und in den Feldwert schon mit einfließen. Wer darauf zugreifen muss und zu faul ist die Formulardatei sebst einzulesen (wofür ich Verständnis hätte :) ), für den baue ich gern weitere HoleAttribut-Funktionen ein. |
long HoleVoranmeldungszeitraum(); | Gibt beim UStVA-Formular den Voranmeldungszeitraum zurück. Der Wert kann sein: 1-12 für die monatlichen Zeiträume, 13-16 für die Quartale. |
Hinweis für MFC-Programmierer: Um die ActiveX-Objekte im Plugin nutzen zu können, muss AfxEnableControlContainer() in der InitInstance() aufgerufen werden. Ich empfehle für das client window einen CDialog zu kreieren und Gebrauch von der ResizableLib auf codeproject.com zu machen (auch wenn Microsoft Dialoge in ActiveXen nicht empfiehlt). Ein Beispiel eines mit der MFC programmierten Plugins kann man in diesem Suversion-Repository finden: svn://easyct.no-ip.org/ECTImportx (Benötigt wird ein Subversion client,
z.B. den von http://tortoisesvn.net/downloads)
Es wurden noch keine Kommentare verfasst.
|
|
Bitte logge dich ein, um einen Kommentar zu verfassen.
|
|
Bitte logge dich ein, um eine Bewertung abzugeben.
Es wurden noch keine Bewertungen abgegeben.
|
|
Du musst dich einloggen um eine Nachricht zu senden.
|
|
(c) 2025 Thomas Mielke
Powered by PHP-Fusion copyright © 2002 - 2025 by Nick Jones.
Released as free software without warranties under GNU Affero GPL v3.
|
|