Zum Inhalt

Drucken und Import/Export

Die microtech Software bietet über die COM-Schnittstelle zwei zentrale Mechanismen für die Datenausgabe: den layoutbasierten Import/Export für den Datenaustausch mit externen Systemen und das Drucken für die Erzeugung von Belegen, Listen und Auswertungen. Beide Wege nutzen ein Layout-Konzept, das in der Oberfläche der microtech Software konfiguriert und dann per COM angesteuert wird.

Ergänzend stehen mit der Dokumentenverwaltung und dem Ausgabeverzeichnis zwei SpecialObjects zur Verfügung, die den Zugriff auf gespeicherte Dokumente und erzeugte Druckausgaben ermöglichen.

Import und Export über Layouts

Layout-Konzept

Import und Export über COM basieren auf sogenannten Layout-Dateien (.bpl). Diese Layouts definieren, welche Felder in welchem Format importiert oder exportiert werden. Sie werden vorab in der microtech Software erstellt:

  1. Navigieren Sie zu DATEI → SCHNITTSTELLEN → EXPORT (oder IMPORT).
  2. Wählen Sie den gewünschten Bereich (z. B. Buchhaltung → Stammdaten → Kontenplan).
  3. Gestalten bzw. konfigurieren Sie das Layout so, dass beim Abarbeiten kein manuelles Eingreifen erforderlich ist.
  4. Ziehen Sie das fertige Layout per Drag & Drop auf den Desktop oder in den Explorer.

Die so erzeugte .bpl-Datei wird anschließend in Ihrem COM-Projekt verwendet. Jede Solution-Partner-Applikation besitzt einen eigenen Namespace für Layouts - Namenskollisionen mit anderen Partnern sind daher ausgeschlossen.

Der Zugriff erfolgt über drei zusammenspielende Interfaces:

IAutoLayoutGroup verwaltet die Sammlung importierter Layouts. Sie erhalten eine Instanz über OpenLayoutGroup am Application-Objekt und importieren darüber .bpl-Dateien aus dem Dateisystem oder aus einem Stream.

IAutoLayout repräsentiert ein einzelnes Layout innerhalb der Gruppe. Von hier aus starten Sie den Import- oder Export-Vorgang, der ein IAutoPreparedLayout zurückgibt.

IAutoPreparedLayout (und die Erweiterungen IAutoPreparedLayout2 / IAutoPreparedLayout3) ist das ausführbare Layout-Objekt. Hier konfigurieren Sie optional die Ausgabedatei, modifizieren die Exportdaten und führen den Vorgang schließlich mit Execute aus.

LayoutGroup ermitteln

Um ein Layout korrekt zu öffnen, benötigen Sie zwei Parameter für OpenLayoutGroup: das Modulkürzel und den Gruppenbezeichner. Diese können Sie mit der Methode PossibleLayoutGroup ermitteln:

LayoutGroup ermitteln (Delphi-Pseudocode)
BpApp.SelectMand('mein Mandant');
BpTbl := BpApp.DataSetInfos('OffenePosten').CreateDataSet;
ShowMessage(BpApp.PossibleLayoutGroup('Au', BpTbl.Name));

Der Rückgabewert ist eine kommaseparierte Liste möglicher Gruppenbezeichner. Diese setzen sich wie folgt zusammen: Die ersten zwei Buchstaben bezeichnen das Modul (z. B. Au für Auftrag, Fi für FiBu, Lo für Lohn, Su für Support), gefolgt von drei Buchstaben für das Einsatzgebiet (z. B. Adr für Adressen), dann Exp oder Imp für Export oder Import, und schließlich Liste (normales Layout) oder Grp (Gruppenlayout - nicht empfohlen).

PossibleLayoutGroup für alle Module auslesen (C#)
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Anmeldename:");
        string Anmeldename = Console.ReadLine();
        Console.WriteLine("Passwort:");
        string Password = Console.ReadLine();
        Console.WriteLine("Firmenname/ConnectionString:");
        string ConnectionString = Console.ReadLine();

        BpNT.IAutoApplication17 app = new BpNT.ApplicationClass();
        try
        {
            app.Init(ConnectionString, "", Anmeldename, Password);
            Console.WriteLine("Mandant:");
            string Mandant = Console.ReadLine();
            app.SelectMand(Mandant);

            Console.WriteLine("Tabelle:");
            string Table = Console.ReadLine();
            IAutoDataSet14 dataSet = app.DataSetInfos[Table].CreateDataSet();

            Console.WriteLine("Lets go!");
            try
            {
                try
                {
                    Console.WriteLine("Auftrag: " + app.PossibleLayoutGroup["Au", dataSet.Name]);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Auftrag error: " + ex.Message);
                }

                try
                {
                    Console.WriteLine("Fibu: " + app.PossibleLayoutGroup["Fi", dataSet.Name]);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Fibu error: " + ex.Message);
                }

                try
                {
                    Console.WriteLine("Lohn: " + app.PossibleLayoutGroup["Lo", dataSet.Name]);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Lohn error: " + ex.Message);
                }

                try
                {
                    Console.WriteLine("Support: " + app.PossibleLayoutGroup["Su", dataSet.Name]);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Support error: " + ex.Message);
                }

                try
                {
                    Console.WriteLine("Global: " + app.PossibleLayoutGroup["Gl", dataSet.Name]);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Global error: " + ex.Message);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }
            finally
            {
                Marshal.ReleaseComObject(dataSet);
                dataSet = null;
                app.LogOff();
                app.DeInit();
                Marshal.ReleaseComObject(app);
                app = null;
                GC.Collect();
            }
        }
        finally
        {
            Console.WriteLine("LogOff erfolgreich!");
            Console.ReadKey();
        }
    }
}

Dieses Konsolenprogramm fragt interaktiv die Anmeldedaten und einen Tabellennamen ab und gibt dann für jedes Modul (Au, Fi, Lo, Su, Gl) die verfügbaren Layout-Gruppen aus. Nicht jede Tabelle ist in jedem Modul verfügbar - die Fehlerbehandlung per try/catch fängt diese Fälle ab.

Startparameter -ComPrintProp

Sie können die microtech Software mit dem Startparameter -ComPrintProp starten, um die Bezeichner für Import/Export-Layouts direkt in den Eigenschaften der Druck-/Export-Layouts anzuzeigen.

Layout importieren

Ein Layout wird aus einer .bpl-Datei oder einem Stream in die LayoutGroup geladen:

Layout aus Datei importieren (WSH)
Dim BpNT
Dim LayoutGroup
Dim Layout
Dim ExecLayout

Set BpNT = WScript.CreateObject("BpNT.Application")
Call BpNT.Init("Firmenname", "", "Anmeldename", "Password")
Call BpNT.SelectMand("1")

Set LayoutGroup = BpNT.OpenLayoutGroup("Au", "AdrExpListe")
Set Layout = LayoutGroup.ImportLayoutFromFile("C:\testlayout.bpl", "Mein neuer interner Name", True)

Set ExecLayout = Layout.doExport
Call ExecLayout.Execute

Set BpNT = Nothing

ImportLayoutFromFile erwartet den vollständigen Dateipfad, einen internen Namen für das Layout und einen Boolean, der angibt, ob ein vorhandenes Layout gleichen Namens überschrieben werden soll. Wird aOverwrite auf False gesetzt und der Name existiert bereits, wird ein neuer Name vergeben und über den aLayoutName-Parameter (in/out) zurückgegeben.

ImportLayoutFromStream funktioniert analog, erwartet aber statt eines Dateipfads ein IUnknown-Interface, das IStream implementiert. Die Leseoperation startet an der aktuellen Position des Streams.

Export durchführen

Um einen Export auszuführen, rufen Sie doExport auf dem IAutoLayout-Objekt auf. Das zurückgegebene IAutoPreparedLayout können Sie vor der Ausführung optional modifizieren:

Export mit Dateipfad-Anpassung (VBA)
Public Sub LayoutPfad()
    Dim BpNT As BpNT.Application
    Dim LayoutGroup As AutoLayoutGroup
    Dim Layout As AutoLayout
    Dim ExecLayout As AutoPreparedLayout
    Dim ReturnName As String

    Set BpNT = CreateObject("BpNT.Application")
    Call BpNT.Init("Firmenname", "", "Anmeldename", "Password")
    Call BpNT.SelectMand("1")

    Set LayoutGroup = BpNT.OpenLayoutGroup("Au", "ArtExpListe")
    ReturnName = "Test eines Exports"
    Set Layout = LayoutGroup.ImportLayoutFromFile("C:\Artikel Export.BPL", ReturnName, True)

    Set ExecLayout = Layout.doExport
    Call ExecLayout.StartModify

    ' Dateiextension ermitteln und Exportpfad setzen
    ExecLayout.LayoutFile = "C:\ExportDatei" & ExecLayout.GetLayoutFileExt

    Call ExecLayout.EndModify
    Call ExecLayout.Execute

    Set LayoutGroup = Nothing
    Set ExecLayout = Nothing
    Set Layout = Nothing
    Set BpNT = Nothing
End Sub

LayoutFile (ab IAutoPreparedLayout2) gibt den vollständigen Dateipfad inklusive Name und Extension zurück bzw. erlaubt, diesen zu setzen. GetLayoutFileExt liefert nur die Dateiextension. Bei einem ADO-Export enthält LayoutFile den ADO Connection String.

StartModify / EndModify

Wenn Sie StartModify aufgerufen, aber die Änderungen nicht übernehmen möchten, müssen Sie das AutoPreparedLayout erneut erstellen. EndModify finalisiert die Modifikation.

Import durchführen

Für einen Import rufen Sie doImport statt doExport auf. Der restliche Ablauf ist identisch - Execute führt den Import aus.

DataTable modifizieren (Ranges/Filter auf Exportdaten)

Zwischen StartModify und EndModify haben Sie über die Eigenschaft DataTable Zugriff auf ein AutoDataSet, mit dem Sie die Ergebnismenge des Exports einschränken können. Verwenden Sie dafür Ranges und Indizes.

Vorsicht bei Exportdaten

Über DataTable beim Export schreiben Sie direkt in die Originaldaten. Verwenden Sie das DataSet ausschließlich mit Range oder Filter. Änderungen wie Delete, Append oder Edit wirken sich sofort aus - auch wenn EndModify nicht aufgerufen wird. Bei Importen steht DataTable nicht zur Verfügung.

Export mit Range-Einschränkung (VBA)
Public Sub Layout()
    Dim BpNT As BpNT.Application
    Dim LayoutGroup As AutoLayoutGroup
    Dim Layout As AutoLayout
    Dim ExecLayout As AutoPreparedLayout
    Dim ReturnName As String
    Dim Table As AutoDataSet

    Set BpNT = CreateObject("BpNT.Application")
    Call BpNT.Init("Firmenname", "", "Anmeldename", "Password")
    Call BpNT.SelectMand("1")

    Set LayoutGroup = BpNT.OpenLayoutGroup("Au", "ArtExpListe")
    ReturnName = "Test eines Exports"
    Set Layout = LayoutGroup.ImportLayoutFromFile("C:\Artikel Export.BPL", ReturnName, True)

    Set ExecLayout = Layout.doExport
    Call ExecLayout.StartModify

    Set Table = ExecLayout.DataTable
    Table.Indices("WgrNr").Select

    ' Ergebnismenge eingrenzen
    Table.SetRangeStart
    Table.Fields("WgrNr").AsString = "4"
    Table.Fields("ArtNr").AsString = "1"
    Table.SetRangeEnd
    Table.Fields("WgrNr").AsString = "4"
    Table.Fields("ArtNr").AsString = "1000"
    Table.ApplyRange

    ExecLayout.DataTable = Table
    Call ExecLayout.EndModify
    Call ExecLayout.Execute

    Set LayoutGroup = Nothing
    Set Table = Nothing
    Set ExecLayout = Nothing
    Set BpNT = Nothing
End Sub

Kodierung der Import-Datei

Ab IAutoPreparedLayout3 (Build 5144) kann über die Eigenschaft LayoutFileEncoding das Encoding der Eingabedatei für einen Import festgelegt werden. Ohne explizite Angabe versucht die microtech Software, das Encoding automatisch zu erkennen - dies kann unter Umständen eine Rückfragemeldung auslösen.

Die möglichen Werte der Aufzählung EncodingType sind:

Wert Konstante Bedeutung
0 encNone Unbestimmt - automatische Erkennung (kann Meldung auslösen)
1 encAscii ASCII
2 encAnsi ANSI
3 encUtf8 UTF-8
4 encUnicodeLE Unicode Little-Endian
5 encUnicodeBE Unicode Big-Endian

Automatische Erkennung ab Build 5184

Ab Build 5184 hat die Eigenschaft LayoutFileEncoding keine Wirkung mehr. Das Encoding wird ab dieser Version automatisch bestimmt.

Drucken über COM

Voraussetzungen

Lizenzierung erforderlich

Das Drucken über COM erfordert zusätzliche Lizenzen und Verträge:

  • COM-Aktiv-Developer-Vertrag mit microtech
  • List & Label-Lizenz der combit GmbH (www.combit.net) in der passenden Ausbaustufe und Menge
  • Zusätzlicher Nutzungsvertrag zur Regelung der Lizenzbedingungen zwischen microtech, combit und Ihnen als Endverbraucher
  • RDU-Lizenz (Remote Desktop) für jede automatisierte Druckausgabe ohne Benutzerinteraktion

Ablauf der Freischaltung:

  1. Fordern Sie den zusätzlichen Vertrag bei microtech an.
  2. Erwerben Sie die benötigten Lizenzen bei combit.
  3. Teilen Sie microtech Ihre Registrierungsinformationen mit (Firmenname, Adresse, Ausbaustufe, Seriennummer).
  4. microtech prüft bei combit die Berechtigung.
  5. Nach erfolgreicher Prüfung ist der Zugriff auf das Druck-Objekt für die Dauer Ihrer combit-Lizenz freigeschaltet.

Sobald Sie das Drucken-Objekt erstellen, wird eine Remote-Desktop-Lizenz für Ihre Verbindung verwendet. Ist keine Lizenz vorhanden oder sind alle belegt, wird das Objekt nicht erstellt. Solange die Instanz besteht, bleibt die Anmeldung als Remote-Zugriff registriert.

Druck-Objekt erstellen

Das Druck-SpecialObject wird über GetSpecialObject mit dem Wert soDrucken (= 10) erzeugt:

Druck-Objekt erstellen (Delphi)
Drucken := (BpApp.GetSpecialObject(soDrucken) as AutoSpecialDrucken);

Druckgruppen und Drucklayouts öffnen

Analog zum Import/Export-Bereich öffnen Sie über OpenLayoutGroup am Druck-Objekt eine Gruppe von Drucklayouts. Innerhalb dieser Gruppe greifen Sie per Item auf einzelne IAutoDruckLayout-Objekte zu.

Die Methode PossibleLayoutGroup am IAutoDrucken-Interface liefert die möglichen Druckgruppen für eine bestimmte Tabelle.

Lizenzprüfung bei OpenLayoutGroup

Beim Aufruf von OpenLayoutGroup findet eine Prüfung auf eine Remote-Desktop-Lizenz statt. Ist kein namensgebundener Schlüssel vorhanden oder sind alle Verbindungen belegt, wird eine Exception ausgelöst.

Druck ausführen

Der eigentliche Druck wird über doPrintDirect am IAutoDruckLayout-Objekt angestoßen:

Rechnung drucken (Delphi)
function TVorgangDruck.DoExecute(aDirect: Boolean): Boolean;
var
  Drucken: AutoSpecialDrucken;
  Group: AutoDruckenLayoutGroup;
  Layout: AutoDruckLayout;
  tbl: AutoDataSet;
begin
  Result := False;
  Drucken := (BpApp.GetSpecialObject(soDrucken) as AutoSpecialDrucken);
  try
    Group := Drucken.OpenLayoutGroup('Au', 'VogDrVorgang');
    Layout := Group.Item['(Rechnung I)'];

    tbl := BpApp.DataSetInfos['Vorgang'].CreateDataSet;
    tbl.First;
    // Hier den entsprechenden Rechnungsdatensatz positionieren
    // WICHTIG: Stimmen Datensatzart und Druck nicht überein,
    // kann es zu Fehlern oder verfälschten Ausdrucken kommen.

    Layout.doPrintDirect(tbl, aDirect);
  finally
    tbl := nil;
    Layout := nil;
    Group := nil;
    Drucken := nil;
  end;
  Result := True;
end;

doPrintDirect erwartet ein AutoDataSet mit dem zu druckenden Datensatz und einen Boolean aDirect. Ist aDirect auf True gesetzt, wird der Druck ohne Benutzerinteraktion ausgeführt. Stehen keine Daten zur Verfügung, wird eine Exception ausgelöst.

Ausnahme: Bei Chefauswertungen, die fest definiert sind und keine Sortier- oder Range-Möglichkeiten haben, genügt die Übergabe einer beliebigen Tabelle.

Faxausgabe ist ab IAutoDruckLayout3 über doFaxDirect verfügbar. Die Parameter sind identisch zu doPrintDirect.

Serialisierung bei gleichzeitigen Druckaufträgen

Ab Build 5034 ist für doPrintDirect und doFaxDirect eine interne Serialisierung eingebaut. Pro Computer kann nur ein Thread gleichzeitig in doPrintDirect oder doFaxDirect sein. Weitere Aufrufe werden in eine Warteschlange eingereiht und versuchen, innerhalb der durch RequestRetryCount und RequestTimeOut definierten Parameter einen Druckslot zu erhalten.

Gelingt dies nicht, wird eine OleException ausgelöst. Sie können diese Exception nutzen, um den Druckvorgang erneut einzuleiten.

Druckername festlegen

Ab IAutoDruckLayout3 kann über die Eigenschaft PrinterName ein bestimmter Drucker als Vorauswahl gesetzt werden. Dieser Wert wird nur beachtet, wenn der Druck direkt (ohne Druckauswahl-Dialog) ausgeführt wird. Bei einer Faxausgabe über doFaxDirect wird PrinterName ignoriert.

Druckernamen vorab prüfen

Es findet keine Gültigkeitsprüfung statt, ob der angegebene Drucker existiert. Fragen Sie die gültigen Druckernamen vorab über das Betriebssystem ab.

PDF-Export und Exportformate

Anstelle eines physischen Drucks können Sie über das IAutoSpecialDruckOptions-Interface (erreichbar ab IAutoDruckLayout4 über die Eigenschaft Printer) einen Dateiexport konfigurieren:

Export als PDF (Delphi)
// Druck-Objekte erzeugen
DataSet := BpApp.DataSetInfos['Vorgang'].CreateDataSet;
DataSet.First;
Drucken := BpApp.GetSpecialObject(soDrucken);
Gruppe := Drucken.OpenLayoutGroup('Au', 'VogDrVorgang');
Layout := Gruppe.Item('(Rechnung I)');

// Export konfigurieren
Layout.Printer.FileExport := True;
Layout.Printer.FileOverwrite := True;
Layout.Printer.FileFormat := 2;  // PDF
Layout.Printer.FileName := 'C:\Tmp\Rechnung.pdf';
Layout.Printer.Save;

Layout.doPrintDirect(DataSet, True);

Die folgende Tabelle zeigt die verfügbaren Exportformate (Stand: 26.08.2016). Je nach Ausbaustufe, Programmversion und Benutzerrechten können einzelne Formate abweichen.

Wert Format Beschreibung
0 LL List & Label Format
1 XLS Excel
2 PDF Adobe Portable Document Format
3 RTF Rich Text Format
4 HTML Hypertext Markup Language
5 MHTML Mimetype HTML
6 XML Extendable Markup Language
7 JPG JPG (kann mehrere Dateien erzeugen)
8 BMP BMP (kann mehrere Dateien erzeugen)
9 EMF EMF (kann mehrere Dateien erzeugen)
10 TIFF TIFF (kann mehrere Dateien erzeugen)
11 MultiTIFF Multipage TIFF
12 TXT Textbasierter Export
13 XPS XML Paper Specification
14 JPG JPG (über microtech Software)
15 EMF EMF (über microtech Software)
16 PDF PDF (über microtech Software)
19 XLSX Excel im neuen Format
20 Word Word-Dokument
21 PowerPoint PowerPoint-Präsentation
22 SVG Scalable Vector Graphics
Verfügbare Exportformate auslesen (Delphi)
Buffer := '';
try
  for I := 0 to 100 do
  begin
    Layout.Printer.FileFormat := I;
    Buffer := Buffer + ' - ' + Layout.Printer.FileFormatName + ' (' + IntToStr(I) + ')';
  end;
except
  // Fehler bei Überschreitung der Formatanzahl abfangen
end;
ShowMessage(Buffer);

Druckoptionen (IAutoSpecialDruckOptions)

Das IAutoSpecialDruckOptions-Interface bietet folgende zentrale Eigenschaften:

Eigenschaft Typ Beschreibung
PrintKind enum PrintKind Bestimmt die Druckart: pkEineSeite (0), pkErsteFolgeSeiten (1), pkBeliebigeSeiten (2)
FileName BSTR Zielname der Exportdatei. Bei manchen Formaten nur der Basisname.
FileOverwrite VARIANT_BOOL Vorhandene Datei beim Export überschreiben
FileFormat long Exportformat (siehe Tabelle oben)
FileFormatName BSTR Name des aktuellen Exportformats (nur lesend)
FileExport VARIANT_BOOL True = Export, False = Druck
Save Methode Speichert die Druckereinstellungen persistent
AreaCount Methode Gibt die Anzahl der Druckbereiche zurück
AreaEntrys Methode Gibt das IAutoSpecialPrinterArea-Interface für einen bestimmten Druckbereich zurück

Druckbereiche konfigurieren (IAutoSpecialPrinterArea)

Über AreaEntrys am IAutoSpecialDruckOptions-Interface erhalten Sie Zugriff auf die einzelnen Druckbereiche. Viele der Eigenschaften entsprechen den Steuerungsoptionen der Windows-DEVMODE-Struktur.

Die wichtigsten Eigenschaften:

Eigenschaft Beschreibung
Name Name des Druckbereichs
DeviceName Name des Druckers
Condition Formel, die bestimmt, welche Druckebene verwendet wird
Copies Anzahl der Kopien (ganzzahlig)
Duplex Duplexdruck aktivieren (0 oder 1)
Collate Sortierreihenfolge beim Druck (0 oder 1)
FitPage Ausdruck auf Druckbereich einpassen
ForcePaperFormat Ausgabeformat erzwingen
PaperFormat Papierformat
PaperOrientation Papierausrichtung
SourceTray Papierschacht
ShowInPrintDialog Im Druckdialog anzeigen
DeviceDevMode Windows DEVMODE-Daten
DeviceExtraData Zusätzliche Gerätedaten

Für Label-Drucke stehen zusätzlich die Eigenschaften LayoutXCount, LayoutXDistance, LayoutXOffset, LayoutXSize, LayoutYCount, LayoutYDistance, LayoutYOffset und LayoutYSize zur Verfügung.

Dokumentenverwaltung (IAutoDokument)

Das SpecialObject IAutoDokument ermöglicht den Zugriff auf die integrierte Dokumentenverwaltung der microtech Software. Es wird über GetSpecialObject mit dem Wert soDokumente (= 2) erstellt.

Dokumentenerweiterung

Dieses Objekt funktioniert standardmäßig nur in microtech-Versionen mit Dokumentenerweiterung (NE-1046). Bei einer Lizenzierung Ihrer Schnittstelle kann das Objekt jedoch auch ohne diese Erweiterung eingesetzt werden.

Ablauf

  1. InitDB - Positioniert die Dokumentenverwaltung auf einen Masterdatensatz. Die übergebene Tabelle bestimmt, welchem Datensatz Dokumente zugeordnet werden. Wird die Tabelle nicht unterstützt, wird der Bereich auf „(Allgemein)" gesetzt. Den Bereich „(Allgemein)" können Sie gezielt über die Mandanten-Tabelle erreichen.
  2. Append - Legt einen neuen Eintrag in der Dokumententabelle an.
  3. SetDokData - Importiert eine Datei in den aktuellen Dokumenten-Datensatz. Der Parameter ImportArt bestimmt die Art des Imports:
Wert Konstante Beschreibung
0 doiDatei Als Datei einfügen
1 doiOLE Als OLE-Container einfügen (falls die Dateiendung OLE-fähig ist)
2 doiLink Als Verknüpfung einfügen
3 doiFileLink Als Verknüpfung auf die zentrale Server-Freigabe speichern
  1. Post - Speichert den Datensatz.

Über Edit kann ein vorhandener Datensatz geändert werden. Die Eigenschaft DataSet gibt das zugehörige AutoDataSet mit allen Feldern der Dokumententabelle zurück, über das Sie z. B. Name und Wichtigkeit setzen können.

Dokument zur Adresse 10000 hinzufügen (Delphi Script)
Dokument := BpApp.GetSpecialObject(soDokumente);
MasterDb := BpApp.DataSetInfos('Adressen').CreateDataSet;
MasterDb.Indices.Item('NrNum').Select;
MasterDb.SetKey;
MasterDb.Fields('AdrNr').AsString := '10000';
MasterDb.GotoNearest;

Dokument.InitDB(MasterDb);
Dokument.Append;
Dokument.SetDokData(doiOLE, 'C:\Dokumente\Bild.jpg');
Dokument.DataSet.Fields['Na'].AsString := 'ComApp1';
Dokument.DataSet.Fields['Wichtig'].AsInteger := 1;
Dokument.Post;

MasterDb := nil;
Dokument := nil;

Dokumente auslesen

Ab IAutoDokument2 stehen Methoden zum Auslesen vorhandener Dokumente zur Verfügung:

GetDokData(FileName) speichert das Dokument des aktuellen Datensatzes unter dem angegebenen Dateipfad.

GetDokDataStream(OutputStream) schreibt das Dokument in einen übergebenen Stream. Der Parameter muss das IStream-Interface implementieren.

Ab IAutoDokument3 (Build 4002) existieren die erweiterten Varianten GetDokDataEx und GetDokDataStreamEx, die Fehlermeldungen im Rückgabewert statt in einem Dialogfenster liefern. Ein leerer Rückgabestring bedeutet, dass kein Fehler aufgetreten ist.

SetDokDataStream (ab IAutoDokument2) importiert ein Dokument aus einem Stream. Der Stream muss IStream implementieren und auf der Anfangsposition des Dokuments stehen. Die Parameter Name und Ext bestimmen den Anzeigenamen und die Dateiextension (z. B. .pdf).

Ausgabeverzeichnis (IAutoSpecialAusgabeVerzeichnis)

Das SpecialObject IAutoSpecialAusgabeVerzeichnis (ab Build 5000) ermöglicht den Zugriff auf das Ausgabeverzeichnis der microtech Software, in dem erzeugte Drucke, Faxe und E-Mails abgelegt werden.

Drucke und Faxe werden als List & Label-Dateien (.ll) gespeichert. E-Mails werden in einem proprietären Format auf Basis von Microsoft Compound Documents (Structured Storage) abgelegt.

Methoden

InitDB(MasterData) - Positioniert das SpecialObject auf einen Datensatz. Gültige Tabellen sind AusgabeVerzeichnis und AusgabeVerzeichnisHis.

SaveToFile(FileName) / SaveToStream(Stream) - Speichert die Datei des aktuellen Datensatzes als Datei oder in einen Stream. Vorhandene Dateien werden überschrieben.

LoadFromFile(FileName) / LoadFromStream(Stream) - Lädt eine Datei in den aktuellen Datensatz. Die Tabelle muss sich im Editiermodus befinden (Append oder Edit).

Druckdesigner-Version beachten

Beim Import von List & Label-Dateien muss die Druckdesigner-Version der Datei zur Version in der microtech Software passen. Eine .ll-Datei, die mit Version 19 erstellt wurde, wird in einer Installation mit Druckdesigner 13 nicht vollständig angezeigt.

Ausgabeverzeichnis: Speichern und Laden (Delphi)
function SoAusgabeVerzeichnis;
const
  TypDruck = 0;
  TypFax   = 1;
  TypEmail = 2;
var
  Buffer: string;
begin
  SpecialObj := BpApp.GetSpecialObject(16); // soAusgabeVerzeichnis
  Tbl := BpApp.DataSetInfos('Ausgabeverzeichnis').CreateDataSet;
  Tbl.First; // Hier die Positionierung vornehmen

  SpecialObj.InitDb(Tbl);
  Buffer := 'C:\temp\test.';
  case Tbl.Fields('Typ').AsInteger of
    TypDruck: Buffer := Buffer + 'll';
    TypFax:   Buffer := Buffer + 'll';
    TypEmail: Buffer := Buffer + 'CompDoc';
  end;

  SpecialObj.SaveToFile(Buffer);

  Tbl.Edit;
  SpecialObj.LoadFromFile('C:\temp\preview.ll');
  Tbl.Post;
end;