Import von Kontodaten mit externer Filterdatei (Referenzen)

Fragen zum Thema Import und Export und Importieren von Kontoauszügen
Antworten
pelle
Interessent
Beiträge: 5
Registriert: Mo, 04 Dez, 2006 15:32

Import von Kontodaten mit externer Filterdatei (Referenzen)

Beitrag von pelle » Di, 05 Dez, 2006 0:05

Hallo,

Zunächst erst mal Glückwunsch zu Eurokass. Es bietet für den Privatanwender eine gelungene Kassenverwaltung !

Als Neuling bei Eurokass musste ich gleich einige Features testen. Am interessantesten fand ich den Import der Kontodaten (CSV oder MTD940)
mit der automatischen Zuordnung der nach Verwendungszweck.

Leider bin ich mit den 'eingebauten' Referenzen nicht ganz zurecht gekommen.
Zum einen funktioniert die Filterung irgendwie nicht so, wie ich sie verstehe. Zum anderen hätte ich gerne eine Übersicht der bisherigen aktiven Referenzen.

Kurzum :
Ich habe mir eine externe Filterliste angelegt, die von einem InterRun Programm auf die eingelesenen Daten angewendet wird.
Die Namengebung und der Ort der Filterliste ist festgelegt:

Datei-Format : Text
Datei-Name: ImportFilter.txt
Datei-Verzeichnis: Eurokass-Programm-Verz\EBanking\Import\Kassenbuch-Name

z.B. Eurokass in : C:\Programme\Eurokass
Kassenbuch ist : Meier_2006
C:\Programme\Eurokass\EBanking\Import\Meier_2006\ImportFilter.txt

Filter Syntax: eigenwillig, nicht schön, aber funktioniert.

- JEDE Zeile endet mit dem Zeichen @
- Führende und dem @ Zeichen folgende Leerzeichen werden ignoriert
- In jeder Zeile steht eine Filterregel
- Jede Filterregel besteht aus beliebig vielen Feldern die voneinander mit # abgetrennt sind.
- Des letzte Feld vor dem @ bezeichnet das Zielkonto
(Voll ausggeschrieben)
- Alle anderen Felder sind Teilstrings die im Verwendungszweck vorkommen müssen.
- Wenn alle Teilstrings gefunden wurden (logisches UND), wird das Zielkonto eingetragen und die Suche für die aktuelle Buchung beendet und zu der nächsten Buchung weitergegangen (Erste positive Filterzeile ist dominant)

Beispiel:

3 Kommentarzeilen:
|--------------------------@
|Meine private Filterliste@
|--------------------------@

1 Filterzeile
Verwendungszweck soll enthalten :
"Gesang" "Schule Düsseldorf" "123222"
Zielkonto : "Kind1.Musikschule"

Gesang#Schule Düsseldorf#123222#Kind1.Musikschule@

Installation:
Filterdatei anlegen (Programm meckert sonst schon :-))
Eurokass starten
Kassenbuch öffnen (falls nicht schon offen)
Programm-Center öffnen (Menü Extras oder Strg+P)
Baum aufklappen:
Kassenbuch-Name
|_ Homebanking
|_Beim Referenzieren einer Bankbewegung (doppelklick)

Die leere Routine auf der rechten Seite durch folgende (s.u.) ersetzen
(Copy & Paste). Speichern und Ausprobieren mit Êxtras->Importieren->Geldinstitut (Strg+I)
Falls ein Filter nicht funktioniert, Filterfile ändern und neu importieren
(rechter Klick auf eine zu importierende Buchung-> Datei laden)

Viel Erfolg,
PS: Falls mal ein Filter nicht fkt. zuerst auf @ am Zeilende prüfen ;-)

-- schnipp --

Procedure OnCheckReferenceAccount(Index : Integer; var aDate : String; var aValue : Double; var aDescription : String; var aReference : String; var aReferenceAccount : String; var IsReady : Boolean)
var des : String
var erg : Integer
var filterliste : String
var filterfile : String
var fzahl : Integer
var f : Integer
var c : Integer
var aktfilter : String
var konto : String
var cmpstring : String
var czahl : Integer
var hit : boolean
var errormsg : string

| Filterfile Verzeichnis + Name
filterfile = ApplicationPath + "\EBanking\Import\" + CashBook.ShortFileName + "\ImportFilter.txt"

| Meckern wenn kein Filterfile gefunden
if FileExists(filterfile)= false
ShowMessage("Kein Filterfile gefunden unter"+CR+filterfile)
stop
endif

| Verwendungszweck in Grossbuchstaben wandeln
des = UpperCase(aDescription)

| filterliste parsen und suchen
filterliste = LoadTextFromFile(filterfile)

| Anzahl gefundener Filterzeilen
fzahl = TokenCount( filterliste,"@") - 1

| Alle Filter durchgehen
for f = 1 to fzahl

|Führende + folgende Leerzeichen enfernen
aktfilter= Trim(Token(filterliste,"@",f))
cmpstring = Copy(aktfilter,1,1)

| Ist erstes Zeichen der Zeile '|' und letztes Zeichen '@'
| => Kommentarzeile
if cmpstring = "|"
break
endif

|Anzahl Keys für diesen Filter ermitteln
czahl = TokenCount(aktfilter,"#") - 1

|Zielkontobezeichnung lesen
konto = Token(aktfilter,"#",czahl+1)


| alle keys vergleichen (UND)
hit = true
for c = 1 to czahl
| Key Nummer c extrahieren
cmpstring = UpperCase(Token(aktfilter,"#",c))

| Key ist Teil des Verwendungszwecks ?
erg = Pos(cmpstring,des)
if erg = 0
hit = false
endif
next

| gefundene Kontozuordnung eintragen
If hit = true
| Wenn das Konto nicht existiert, meckern
if Accounts.Exists(konto) = false
errormsg = "Fehler in "+CR+filterfile+CR+"Zeile "+IntToSTr(f) + CR + "Konto unbekannt: " + konto
ShowMessage(errormsg)
break;
endif
| Zielkonto eintragen
aReferenceAccount = konto
IsReady = True
| Nach erstem Treffer die Suche abbrechen
break;
endif
next

EndProcedure

Benutzeravatar
Team Schauries
Site Admin
Beiträge: 1058
Registriert: Mo, 17 Jan, 2005 20:25
Wohnort: Essen

Beitrag von Team Schauries » Di, 05 Dez, 2006 23:00

Ich fall vom Stuhl... wie hast Du das denn hinbekommen?

CashBook.ShortFileName, ApplicationPath, LoadTextFromFile, TokenCount, IntToStr … Du hast ja den gesamten Sprachschatz von EuroKass und InterRun durchforstet, Respekt!

Ich habe Deine Routine nicht getestet aber sage auf Anhieb, sie funktioniert und ist erstaunlich gut durchdacht.

Als Vollblutprogrammierer muss ich aber – ich tu es nur sehr, sehr ungern - darauf hinweisen, dass die Fehlermeldung „If FileExists...“ bei 300 Bankbuchungen auch 300 mal erscheint, ohne, dass der Anwender sich dagegen wehren kann. Hier wäre ein global deklariertes Flag im Modul besser platziert.

Alles Weitere morgen, ok?

Gruß und Hochachtung,
Dirk Schauries
Zuletzt geändert von Team Schauries am Mi, 06 Dez, 2006 21:00, insgesamt 1-mal geändert.
Team Schauries

pelle
Interessent
Beiträge: 5
Registriert: Mo, 04 Dez, 2006 15:32

Re:

Beitrag von pelle » Mi, 06 Dez, 2006 10:16

Hallo Dirk,

Danke für das Lob.
Mit den 300 meldungen hast Du recht, aber eine globale Variable
gehört in den Modul Bereich (?). Da die Installation per Copy&Paste
erfolgt wollt ich das nicht weiter verkomplizieren.

Gibt es eine Möglichkeit, ein Interrun program extern als textfile zu schreiben bzw. zu verwalten ?

Mit dem Fileparsing war ich auf eines echten delimiter Zeichen (@) angewiesen, da ich es sonst nicht geschafft habe, das Zeilenende einer Zeile zu finden ... ?!?

So long ...
Pelle

Benutzeravatar
Team Schauries
Site Admin
Beiträge: 1058
Registriert: Mo, 17 Jan, 2005 20:25
Wohnort: Essen

Beitrag von Team Schauries » Mi, 06 Dez, 2006 21:00

Hallo Pelle,

einen externen InterRun-Editor (IDE) gibt es nicht, da InterRun immer nur als Include-Modul eingesetzt wird. Um mal eben etwas auszuprobieren, würde ich mir einen eigenen Toolbutton erstellen (Programm-Center) und den Source laufend ändern und über den Toolbutton starten.

Das Zeilenende ist #13#10 aber statt eines Strings hätte ich eine Stringlist verwendet:

var File : Object
var I : Integer
var S : String

File.FillObject(“TextFileSource”,”C:\Text.txt”)
for i = 0 to File.Count – 1
s = File.GetString(i)
//…
Next

Tipp:
Die Properties, Methoden und Funktionen eines Objekts erhält man über ShowObject(File)

(ich bin immer noch so was von beeindruckt...)
Gruß,
Dirk Schauries
Team Schauries

pelle
Interessent
Beiträge: 5
Registriert: Mo, 04 Dez, 2006 15:32

Beitrag von pelle » Sa, 09 Dez, 2006 19:50

Hallo Dirk,

Die Filterdatei in eine Stringliste einzulesen, hört sich gut an.
Irgendwie läuft dein Beispiel aber bei mir nicht.

Der Aufruf der Methode Count liefert
"Objekt oder Variable erwartet! (COUNT)"

Der Aufruf der Methode GetString(i) mit i = konstante
geht aber => das Obj existiert und hat die Datei gelesen !?

Showobject hört sich interessant an, um etwas mehr über die Möglichkeiten zu des Objektes zu erfahren.
Ich habe mir das Beispiel von ShowObject
mal angesehen. Aber weder der Aufrufsyntax ShowObject(File)
noch File.ShowObject funktioniert.

Im ersten Fall : "Unbekannter Befehl in... [SHOWOBJECT]"
Im 2. Fall: "Klasse TEActionList nicht gefunden"

Igrendwas stimmt hier nicht. Kann es sein das Eurokass Probleme hat wenn es nicht in C:\Programme\Eurokass zu Hause ist ?

Gruss
Pelle

PS:
Ist in interrun auch // als Kommentar erlaubt ?
Ist Interrun in C++ geschrieben ?

Benutzeravatar
Team Schauries
Site Admin
Beiträge: 1058
Registriert: Mo, 17 Jan, 2005 20:25
Wohnort: Essen

Beitrag von Team Schauries » Sa, 09 Dez, 2006 21:24

Hallo Pelle,

Du hast natürlich Recht: es heißt nicht Count sondern StringCount (hab mal wieder nicht getestet, sorry).

GetString(n) liefert die Zeile n einer Textdatei. Diese muss vorher eingelesen worden sein.

ShowObject hat anscheinend Probleme bei einer Anwenderinstallation. Habe „Altlasten“ entfernt und im nächsten Update geht’s dann auch wieder. Vielen Dank für den Tipp!
Der korrekte Aufruf lautet:
Object.ShowObject

In InterRun ist nur das Pipe-Symbol | möglich, leider auch nur für eine Zeile. Ein ganzer Block lässt sich also nicht auskommentieren. Eine Schwäche, wie ich finde.

InterRun ist nicht in C++ sondern in Delphi geschrieben – wie EuroKass auch - und ist Bestandteil eines sogenannten Packages.

Hier ein Beispiel zum Einlesen einer Textdatei mit Zugriff auf einzelne Zeilen:

Procedure Schalter1_OnClick
var O : Object
var I : Integer

O.FillObject("TextFileSource","C:\Test.txt")
|O.ShowObject
for i = 0 to O.StringCount - 1
OkBox(O.GetString(i))
Next
EndProcedure

Weitere Methoden einer Stringliste...
O.SaveStringsToFile(FileName)
O.LoadStringsFromFile(FileName)
O.StringsText
O.AddString(Text)
O.DeleteString(Index)
O.InsertString(Index,Text)
O.StringCount
O.SortStrings
O.IndexOfString(Text)
O.ClearStrings

Gruß,
Dirk Schauries
Team Schauries

pelle
Interessent
Beiträge: 5
Registriert: Mo, 04 Dez, 2006 15:32

Beitrag von pelle » Sa, 09 Dez, 2006 21:35

Danke für die Antwort !

Ich werde es ausprobieren,
aber nicht mehr heute ...

Tschüss, Pelle

pelle
Interessent
Beiträge: 5
Registriert: Mo, 04 Dez, 2006 15:32

Beitrag von pelle » Mi, 13 Dez, 2006 13:23

Mittlerweile habe den Importfilter auf die neueun Stringlist
basierten routinen umgestellt.

Neuerungen:
- @ am Zeilenende (hinter Kontobezeichnung) nicht mehr benötigt
- Legacy support für @ (wird ignoriert)
- Inline Kommentare am Zeilenende mit | unterstützt
- Leerzeilen werden ignoriert
- Kommentarzeilen mit | als erstem 'echtem' Zeichen werden ignoriert

Insgesammt also nicht besser, sondern besser lesbar

Flass jemand den Code benötigt, bitte kurze email an mich
mailto: pelle@abwesend.de

Gruss pelle

Antworten