Kaufmännische Software für Handel, Handwerk und Produktionsbetriebe
Zurück |Â
TECHBASE enthält Information zur DOS-Linie EUROnet, die Windows-Linie finden Sie unter Inside.
Â
AssignFilter
Filter: function AssignFilter ( INIPath :
PChar; BufPtr : pPointer; TmpPtr : pTmpDat ) : tFilterHandle;
Euro: function AssignFilter ( DLLPath :
String; INIPath : String; BufPtr : pPointer; TmpPtr : pTmpDat; var Status : Integer; var
Msg : String ) : tFilterHandle;
Mit AssignFilter wird die Filter-DLL geöffnet, und die Filterfunktionen werden
initialisiert.
Übergeben werden die Pfade zur DLL und zur INI-Datei, eine Zeiger-Variable, die einen vom
Filter initialisierten Zeiger auf den Datensatzpuffer übernimmt, sowie einen Zeiger auf
einen Bereich für temporäre Daten. Dieser wurde für den Datanorm-Filter eingeführt, um
nicht nur Daten aus dem Filter lesen zu können, sondern auch Zwischendaten aus der EURO
zurückgeben zu können.
Als Ergebnis liefert diese Funktion ein Handle auf den initialisierten Filter, das in
folgenden Funktionsaufrufen immer mit übergeben werden muss. Dieses Handle ist eigentlich
ein LongInt, das filterintern durch Typenkonvertierung des Pointers auf das Filterobjekt
erzeugt wird. Wird Null zurückgegeben, ist dementsprechend die Filterinitialisierung
fehlgeschlagen.
Über Status und Msg erhält man im Fehlerfalle einen Fehlercode und
eine Fehlermeldung.
Zum besseren Verständnis folgt eine kurze Einführung in
die prinzipielle Funktionsweise, die für alle Filter gleich ist. Wird diese geändert,
bedeutet das eigentlich eine Neuentwicklung, und man kann sich den Aufwand sparen, unter
großen Mühen die vorhandenen Filter anzupassen. Es geht dann mit Sicherheit schneller,
das Konzept neu aufzubauen und sämtliche Filter nach den neuen Richtlinien neu zu
programmieren.
Einen einzelnen Import-Vorgang kann man grob in vier Phasen einteilen:
Der komplette Ablauf befindet sich in der Unit DLF.PAS im Verzeichnis P:\LIB\CNLIB:
Die Hauptroutine ExecDLLFilter wird aus der EURO-Unit EXECS.PAS immer
dann statt dem älteren CNExec (dieses führt die EXE-Filter aus) aufgerufen,
wenn die INI-Datei des Filters die Zeile DLL=Ja enthält. ExecDLLFilter
wiederum ruft entsprechend den vier genannten Phasen die Funktionen InitDLF (Initialisierung), DLFImport (Einlesen und Nachbearbeitung)
und CloseDLF (Freigabe) auf, alle ebenfalls in DLF.PAS
zu finden.
procedure ExecDLLFilter ( DLLPath : String;
INIPath : String );
begin
   if InitDLF(DLFPara,DLLPath,INIPath) then
   begin
       DLFImport(DLFPara);
       if ErrorAbort(DLFPara) then;
       CloseDLF(DLFPara);
   end else
       if DLFPara<>nil then
       begin
           if ErrorAbort(DLFPara)
then;
           CloseDLF(DLFPara);
       end;
end;
Â
Â
- durch einfache Felddefinitionen
Die einfachste Möglichkeit, um einen neuen Filter zu definieren, besteht darin, den Sourcecode eines vorhandenen Filter zu verwenden und dort die Datei- und Felddefinitionen anzupassen. Soweit man über den Aufbau der einzulesenden Daten genau informiert ist, es sich um eine einzeilige Import-Datenstruktur handelt und vor allem keine Felder zu berechnen sind, führt diese Methode für den Eingeweihten sogar schneller zum Erfolg, als den Universalfilter zu verwenden.
- durch Ableiten von Filtermethoden
function CheckSerialNo(CallerSN,FilterSN:PChar):Boolean; virtual;
function GetInfo(Name,Info:PChar):Boolean; virtual;
procedure PutInfo(Name,Info:PChar); virtual;
function ShakeHands(Handshake:tHandshake):tHandshake; virtual;
function GetFieldInfo(Name:PChar;Typ:Char):Boolean; virtual;
function GetField(Name,Data:PChar):Boolean; virtual;
function PutField(Name,Data:PChar):Boolean; virtual;
function GetFilterError(Msg:PChar):Integer; virtual;
procedure SetFilterError(Err:Integer;Msg:PChar); virtual;
procedure ClearFilterError; virtual;
function InitProfile:Boolean; virtual;
function InitData:Boolean; virtual;
procedure ClearData; virtual;
function ReadData:tHandshake; virtual;
function PrepareData(HS:tHandshake):tHandshake; virtual;
procedure Protocol(ProtoLevel:Word;ProtoHead:PChar;ProtoMsg:PChar); virtual;
Â
Hier die möglichen Werte für die Funktionen GetInfo und PutInfo.
Über die Pascal-Konstante ("inf...") kann der Parameter Name im
Sourcecode angesprochen werden. Alle Definitionen befinden sich in der Unit DLFTYPES.PAS
im Verzeichnis T:\Lib\DOSWin. Die in der Spalte R/W eingetragenen Werte sagen
aus, welche Informationen ausschließlich aus der DLL gelesen (R) und welche auch vom
aufrufenden Programm aus gesetzt werden können (W).
| Pascal-Konstante | Name | abgefragte Info | R/W |
|---|---|---|---|
| infProductCode | PRODUCTCODE |
PC für Seriennummer |
R |
| infName | NAME | Filtername: beliebig lang, darf Blanks enthalten | R |
| infDLLName | DLLNAME | Name der DLL: DOS, 8 Zeichen | R |
| infVersion | VERSION | Versionsnummer | R |
| infDate | DATE | Versionsdatum | R |
| infDirection | DIRECTION | Datenrichtung: Import/Export | R |
| infDatabase | DATABASE | EURO-Datenbank: z.Zt. nur Artikel | R |
| infFilemask | FILEMASK | Dateimaske, z.B. "DAT*.*" | RW |
| infFilePath | FILEPATH | Dateipfad | RW |
| infDataType | DATATYPE | Datentyp: Fixed/CSV | R |
| infSeperator | SEPERATOR | Feldtrenner: z.B. ";" | R |
| infQuote | QUOTE | Anführungszeichen f. Strings: z.B.: " | R |
| infRecSize | RECSIZE | größte Satzlänge, incl. |
R |
| infElements | ELEMENTS | Anzahl Datensätze | R |
| infShowTitle | SHOWTITLE | Titel in der Fortschrittsanzeige | R |
Â
| Pascal-Konstante | Bedeutung |
|---|---|
| fhOK | Bestätigung, dass die vorherige Anforderung erledigt wurde, z.B. InitData oder RequestData. Dies ist der Standard-Rückgabecode des DLL-Filters und bedeutet nach InitData, dass jetzt Datensätze angefordert werden können, und nach RequestData, dass Daten zur Übernahme zur Verfügung stehen, die nach Maßgabe des Filters ohne Einschränkung übernommen werden können. |
| fhError | Die Anforderung führte zu einem schweren Fehler. Die Fehlerursache kann anschließend mit GetError ausgelesen werden. |
| fhAbort | Die Verarbeitung der aktuellen Import-Datei wird abgebrochen. |
| fhShowBar | Fortschrittsanzeige ohne zusätzliche Aktion weiterzählen. |
| fhNoBar | Überhaupt keine Aktion, auch keine Fortschrittsanzeige. Hier lässt sich, falls nötig, Application.ProcessMessages aufrufen |
| fhInitData | Aufforderung des Hauptprogramms an die Filter-DLL, die Daten zu
initialisieren: Datei öffnen und Anzahl der Datensätze ermitteln. Die Satzanzahl kann
anschließend mit Hilfe von GetInfo ausgelesen werden und steht dann als
Endwert für die Fortschrittsanzeige zur Verfügung. Dies ist einer der beiden Standard-Handshakes, die vom Hauptprogramm an die Filter-DLL gerichtet werden. |
| fhEndOfData | Das Ende der Import-Datei wurde erreicht. |
| fhResetData | Aufforderung des Hauptprogramms an die Filter-DLL, die Daten zurückzusetzen, d.h. wieder auf den ersten Datensatz zu positionieren. |
| fhCloseData | Aufforderung des Hauptprogramms an die Filter-DLL, die Import-Datei zu schließen. |
| fhRequestData | Aufforderung des Hauptprogramms an die Filter-DLL, den nächsten Datensatz
zur Verfügung zu stellen. Dies ist der zweite Standard-Handshake, der vom Hauptprogramm an die Filter-DLL gerichtet wird. |
| fhUpdateData | Antwort-Code auf RequestData: Daten stehen zur Verfügung und können ohne Einschränkung übernommen werden, d.h. vorhandene Daten werden mit neuen Werten überschrieben und nicht vorhandene Datensätze werden angelegt. In diesem Kontext gleiche Bedeutung wie fhOK. |
| fhCreateData | Antwort-Code auf RequestData: wie fhUpdateData, allerdings werden vorhandene Daten nicht überschrieben (kein Refresh). |
| fhRefreshData | Antwort-Code auf RequestData: wie fhUpdateData, allerdings werden vorher nicht vorhandene Daten auch nicht neu angelegt (kein Create). |
| fhRemoveData | Antwort-Code auf RequestData: In den Daten wird nur der Schlüssel zur Verfügung gestellt. Der zugehörige Datensatz ist aus der EURO zu löschen. |
| fhGetTempData | Anforderung der Filter-DLL an das Hauptprogramm, zuvor abgespeicherte Zwischendaten auszulesen und zur Verfügung zu stellen. Wird z.Zt. nur für Datanorm genutzt. |
| fhPutTempData | Aufforderung der Filter-DLL an das Hauptprogramm, die mit TmpDataPtr übergebenen Daten für spätere Verwendung zwischenzuspeichern. Wird z.Zt. nur für Datanorm genutzt. |
Â
Â