# Anhang Download als Zip

Diese Dokumentation bietet umfassende Anleitung für externe AL-Entwickler zur effektiven Nutzung der DXP Freeze Anhang-Download-Funktionalität in ihren Business Central Erweiterungen.

## Überblick

Die DXP Freeze Result Management Codeunit bietet zwei Hauptmethoden zum Herunterladen archivierter Anhänge als ZIP-Dateien:

<div id="bkmrk-downloadattachmentsa"><div><div><div><div><div><div></div><div>1. **`DownloadAttachmentsAsZipWithPagination`** - Lädt Anhänge aus Suchanfrage-Ergebnissen mit Paginierung herunter
2. **`DownloadAttachmentsAsZipFromRecord`** - Lädt Anhänge von spezifischen Business Central Datensätzen herunter

</div><div></div></div></div></div></div></div></div>Beide Methoden organisieren Anhänge in strukturierte ZIP-Archive mit umfassenden Metadaten für Audit- und Nachverfolgungszwecke.

## Methode 1: DownloadAttachmentsAsZipWithPagination

### Zweck

Lädt alle Anhänge aus einem Suchanfrage-Ergebnissatz herunter und verarbeitet Ergebnisse seitenweise, um große Datensätze effizient zu handhaben. Die Anhänge jedes Datensatzes werden in individuelle ZIP-Dateien innerhalb eines Haupt-ZIP-Archivs organisiert.

### Verfügbare Überladungen

#### 1. Grundlegende Verwendung

<div id="bkmrk-procedure-downloadat"><div><div><div><div><div><div></div><div>```al
procedure DownloadAttachmentsAsZipWithPagination(SearchQuery: Text; var ZipArchive: Codeunit "Data Compression"; var AttachmentCount: Integer): Boolean

```

</div><div></div></div></div></div></div></div></div>#### 2. Mit Filtern

<div id="bkmrk-procedure-downloadat-0"><div><div><div><div><div><div></div><div>```al
procedure DownloadAttachmentsAsZipWithPagination(SearchQuery: Text; var ZipArchive: Codeunit "Data Compression"; var AttachmentCount: Integer; FilenameFilter: Text; FileExtensionFilter: Text): Boolean

```

</div><div></div></div></div></div></div></div></div>#### 3. Vollständige Kontrolle

<div id="bkmrk-procedure-downloadat-1"><div><div><div><div><div><div></div><div>```al
procedure DownloadAttachmentsAsZipWithPagination(SearchQuery: Text; var ZipArchive: Codeunit "Data Compression"; var AttachmentCount: Integer; FilenameFilter: Text; FileExtensionFilter: Text; StoreApiLink: Text; RecordsPerPage: Integer; SuppressDialog: Boolean): Boolean

```

</div><div></div></div></div></div></div></div></div>#### 4. Vorab gefüllte Datensätze (Erweitert)

<div id="bkmrk-procedure-downloadat-2"><div><div><div><div><div><div></div><div>```al
procedure DownloadAttachmentsAsZipWithPagination(var TempFrzResultQueryHeader: Record "DXP FRZ Query Result Header" temporary; var TempFrzResultRecordHeader: Record "DXP FRZ Record Result Header" temporary; var TempFrzResultRecordField: Record "DXP FRZ Result Record-Field" temporary; var TempFrzAttachmentResult: Record "DXP FRZ Attachment Result" temporary; SearchQuery: Text; var ZipArchive: Codeunit "Data Compression"; var AttachmentCount: Integer; FilenameFilter: Text; FileExtensionFilter: Text; SuppressDialog: Boolean): Boolean

```

</div><div></div></div></div></div></div></div></div>### Parameter

<div id="bkmrk-parameter-typ-beschr"><div><div><div><div><div><div></div><div><div><table><thead><tr><th>Parameter</th><th>Typ</th><th>Beschreibung</th></tr></thead><tbody><tr><td>`SearchQuery`</td><td>Text</td><td>Freeze-Suchanfrage-String. Wenn leer in vorab gefüllter Überladung, verwendet vorhandene Anfrage oder führt Suche erneut aus</td></tr><tr><td>`ZipArchive`</td><td>Codeunit “Data Compression”</td><td>ZIP-Archiv-Objekt, das die heruntergeladenen Dateien enthalten wird</td></tr><tr><td>`AttachmentCount`</td><td>Integer (var)</td><td>Gibt die Gesamtanzahl der heruntergeladenen Anhänge zurück</td></tr><tr><td>`FilenameFilter`</td><td>Text</td><td>Filter für Anhangsdateinamen (z.B. ‘*.pdf’, 'rechnung*’)</td></tr><tr><td>`FileExtensionFilter`</td><td>Text</td><td>Filter für Dateierweiterungen (z.B. ‘pdf’, ‘docx’)</td></tr><tr><td>`StoreApiLink`</td><td>Text</td><td>Optional spezifischer Store-API-Link</td></tr><tr><td>`RecordsPerPage`</td><td>Integer</td><td>Anzahl Datensätze pro Seite (Standard: 100)</td></tr><tr><td>`SuppressDialog`</td><td>Boolean</td><td>Ob Fortschrittsdialog unterdrückt werden soll</td></tr></tbody></table>

</div></div><div></div></div></div></div></div></div></div>### Rückgabewert

<div id="bkmrk-boolean%3A%C2%A0true%C2%A0wenn-a"><div><div><div><div><div><div></div><div>- `Boolean`: `true` wenn Anhänge gefunden und heruntergeladen wurden; `false` andernfalls

</div><div></div></div></div></div></div></div></div>### Verwendungsbeispiele

#### Grundlegender Download

<div id="bkmrk-procedure-downloadse"><div><div><div><div><div><div></div><div>```al
procedure DownloadSearchResults()
var
    ResultMgt: Codeunit "DXP FRZ Result Mgt.";
    ZipArchive: Codeunit "Data Compression";
    FileMgt: Codeunit "File Management";
    TempBlob: Codeunit "Temp Blob";
    AttachmentCount: Integer;
    InStr: InStream;
    OutStr: OutStream;
    SearchQuery: Text;
begin
    SearchQuery := 'rechnung AND 2024';
    
    if ResultMgt.DownloadAttachmentsAsZipWithPagination(SearchQuery, ZipArchive, AttachmentCount) then begin
        // ZIP in Datei speichern
        TempBlob.CreateOutStream(OutStr);
        ZipArchive.SaveZipArchive(OutStr);
        TempBlob.CreateInStream(InStr);
        
        FileMgt.DownloadFromStreamHandler(InStr, '', '', '', 'Suchergebnisse.zip');
        Message('Erfolgreich %1 Anhänge heruntergeladen.', AttachmentCount);
    end else
        Message('Keine Anhänge für die Suchanfrage gefunden.');
end;

```

</div><div></div></div></div></div></div></div></div>#### Mit Filtern

<div id="bkmrk-procedure-downloadpd"><div><div><div><div><div><div></div><div>```al
procedure DownloadPDFInvoices()
var
    ResultMgt: Codeunit "DXP FRZ Result Mgt.";
    ZipArchive: Codeunit "Data Compression";
    AttachmentCount: Integer;
    SearchQuery: Text;
begin
    SearchQuery := 'typ:rechnung';
    
    if ResultMgt.DownloadAttachmentsAsZipWithPagination(
        SearchQuery, 
        ZipArchive, 
        AttachmentCount, 
        '*.pdf', // Nur PDF-Dateien
        'pdf'    // Dateierweiterungsfilter
    ) then begin
        // ZIP-Archiv verarbeiten
        ProcessDownloadedFiles(ZipArchive, AttachmentCount);
    end;
end;

```

</div><div></div></div></div></div></div></div></div>#### Verwendung vorab gefüllter Datensätze

<div id="bkmrk-procedure-downloadfr"><div><div><div><div><div><div></div><div>```al
procedure DownloadFromExistingResults()
var
    ResultMgt: Codeunit "DXP FRZ Result Mgt.";
    TempFrzResultQueryHeader: Record "DXP FRZ Query Result Header" temporary;
    TempFrzResultRecordHeader: Record "DXP FRZ Record Result Header" temporary;
    TempFrzResultRecordField: Record "DXP FRZ Result Record-Field" temporary;
    TempFrzAttachmentResult: Record "DXP FRZ Attachment Result" temporary;
    ZipArchive: Codeunit "Data Compression";
    AttachmentCount: Integer;
begin
    // Angenommen, diese Datensätze sind bereits aus einer vorherigen Suche gefüllt
    PopulateSearchResults(TempFrzResultQueryHeader, TempFrzResultRecordHeader, TempFrzResultRecordField, TempFrzAttachmentResult);
    
    // Download mit vorhandenen Ergebnissen ohne erneute Suchausführung
    if ResultMgt.DownloadAttachmentsAsZipWithPagination(
        TempFrzResultQueryHeader,
        TempFrzResultRecordHeader,
        TempFrzResultRecordField,
        TempFrzAttachmentResult,
        'rechnungssuche', // SearchQuery - wenn leer, wird Suche erneut ausgeführt
        ZipArchive,
        AttachmentCount,
        '',     // Kein Dateinamenfilter
        '',     // Kein Erweiterungsfilter
        true    // Dialog unterdrücken
    ) then begin
        ProcessDownloadedFiles(ZipArchive, AttachmentCount);
    end;
end;

```

</div><div></div></div></div></div></div></div></div>### ZIP-Struktur (Paginierung)

<div id="bkmrk-suchergebnisse.zip-%E2%94%9C"><div><div><div><div><div><div></div><div>```
Suchergebnisse.zip
├── export-metadata.json
├── Rechnung_001_V1_20241201_1430.zip
│   ├── {GUID}_rechnung.pdf
│   └── {GUID}_begleitdokument.docx
├── Bestellung_002_V2_20241202_0900.zip
│   └── {GUID}_bestelldokument.pdf
└── Vertrag_003_V1_20241203_1200.zip
    ├── {GUID}_vertrag.pdf
    └── {GUID}_nachtrag.pdf

```

</div><div></div></div></div></div></div></div></div>## Methode 2: DownloadAttachmentsAsZipFromRecord

### Zweck

Lädt Anhänge von spezifischen Business Central Datensätzen herunter. Die Anhänge jedes ausgewählten Datensatzes werden in individuelle ZIP-Dateien innerhalb eines Haupt-ZIP-Archivs organisiert.

### Verfügbare Überladungen

#### 1. Grundlegende Verwendung

<div id="bkmrk-procedure-downloadat-3"><div><div><div><div><div><div></div><div>```al
procedure DownloadAttachmentsAsZipFromRecord(var SelectedRecord: RecordRef; var ZipArchive: Codeunit "Data Compression"): Boolean

```

</div><div></div></div></div></div></div></div></div>#### 2. Mit Filtern

<div id="bkmrk-procedure-downloadat-4"><div><div><div><div><div><div></div><div>```al
procedure DownloadAttachmentsAsZipFromRecord(var SelectedRecord: RecordRef; var ZipArchive: Codeunit "Data Compression"; FilenameFilter: Text; FileExtensionFilter: Text): Boolean

```

</div><div></div></div></div></div></div></div></div>### Parameter

<div id="bkmrk-parameter-typ-beschr-0"><div><div><div><div><div><div></div><div><div><table><thead><tr><th>Parameter</th><th>Typ</th><th>Beschreibung</th></tr></thead><tbody><tr><td>`SelectedRecord`</td><td>RecordRef (var)</td><td>RecordRef mit den ausgewählten Business Central Datensätzen</td></tr><tr><td>`ZipArchive`</td><td>Codeunit “Data Compression”</td><td>ZIP-Archiv-Objekt, das die heruntergeladenen Dateien enthalten wird</td></tr><tr><td>`FilenameFilter`</td><td>Text</td><td>Filter für Anhangsdateinamen</td></tr><tr><td>`FileExtensionFilter`</td><td>Text</td><td>Filter für Dateierweiterungen</td></tr></tbody></table>

</div></div><div></div></div></div></div></div></div></div>### Rückgabewert

<div id="bkmrk-boolean%3A%C2%A0true%C2%A0wenn-a-0"><div><div><div><div><div><div></div><div>- `Boolean`: `true` wenn Anhänge gefunden und heruntergeladen wurden; `false` andernfalls

</div><div></div></div></div></div></div></div></div>### Verwendungsbeispiele

#### Download von Verkaufsrechnungen

<div id="bkmrk-procedure-downloadin"><div><div><div><div><div><div></div><div>```al
procedure DownloadInvoiceAttachments()
var
    SalesInvoiceHeader: Record "Sales Invoice Header";
    ResultMgt: Codeunit "DXP FRZ Result Mgt.";
    ZipArchive: Codeunit "Data Compression";
    RecordRef: RecordRef;
    HasAttachments: Boolean;
begin
    // Spezifische Rechnungen auswählen
    SalesInvoiceHeader.SetRange("Posting Date", DMY2Date(1, 1, 2024), DMY2Date(31, 12, 2024));
    SalesInvoiceHeader.SetFilter("Sell-to Customer No.", '10000|20000');
    
    if SalesInvoiceHeader.FindSet() then begin
        RecordRef.GetTable(SalesInvoiceHeader);
        
        HasAttachments := ResultMgt.DownloadAttachmentsAsZipFromRecord(RecordRef, ZipArchive);
        
        if HasAttachments then
            SaveZipFile(ZipArchive, 'Rechnungsanhänge.zip')
        else
            Message('Keine Anhänge für die ausgewählten Rechnungen gefunden.');
    end;
end;

```

</div><div></div></div></div></div></div></div></div>#### Download mit Filtern von Seite

<div id="bkmrk-%2F%2F-in-einer-seitener"><div><div><div><div><div><div></div><div>```al
// In einer Seitenerweiterung
action(DownloadAttachmentsFiltered)
{
    Caption = 'Gefilterte Anhänge herunterladen';
    Image = ExportFile;
    
    trigger OnAction()
    var
        ResultMgt: Codeunit "DXP FRZ Result Mgt.";
        ZipArchive: Codeunit "Data Compression";
        RecordRef: RecordRef;
        FilenameFilter: Text;
        FileExtensionFilter: Text;
    begin
        // Filterdialog anzeigen
        if ShowFilterDialog(FilenameFilter, FileExtensionFilter) then begin
            CurrPage.SetSelectionFilter(Rec);
            RecordRef.GetTable(Rec);
            
            if ResultMgt.DownloadAttachmentsAsZipFromRecord(
                RecordRef, 
                ZipArchive, 
                FilenameFilter, 
                FileExtensionFilter
            ) then
                DownloadZipFile(ZipArchive, 'GefilterteAnhänge.zip');
        end;
    end;
}

```

</div><div></div></div></div></div></div></div></div>### ZIP-Struktur (Datensätze)

<div id="bkmrk-datensatzanh%C3%A4nge.zip"><div><div><div><div><div><div></div><div>```
Datensatzanhänge.zip
├── export-metadata.json
├── Sales_Invoice_Header_Unternehmen_SI-001.zip
│   ├── {GUID}_rechnung.pdf
│   └── {GUID}_bedingungen.pdf
├── Sales_Invoice_Header_Unternehmen_SI-002.zip
│   └── {GUID}_rechnung.pdf
└── Sales_Invoice_Header_Unternehmen_SI-003.zip
    ├── {GUID}_rechnung.pdf
    ├── {GUID}_lieferschein.pdf
    └── {GUID}_quittung.jpg

```

</div><div></div></div></div></div></div></div></div>## Metadaten-Struktur

Beide Methoden generieren umfassende Metadaten in `export-metadata.json`:

### Paginierungs-Export-Metadaten

<div id="bkmrk-%7B-%22exportinfo%22%3A-%7B-%22e"><div><div><div><div><div><div></div><div>```json
<span class="token punctuation">{</span>
  <span class="token string">"exportInfo"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
    <span class="token string">"exportTimestamp"</span><span class="token punctuation">:</span> <span class="token string">"2024-12-19T10:13:52.248Z"</span><span class="token punctuation">,</span>
    <span class="token string">"exportedBy"</span><span class="token punctuation">:</span> <span class="token string">"USER001"</span><span class="token punctuation">,</span>
    <span class="token string">"searchQuery"</span><span class="token punctuation">:</span> <span class="token string">"typ:rechnung AND jahr:2024"</span><span class="token punctuation">,</span>
    <span class="token string">"totalRecordsFound"</span><span class="token punctuation">:</span> <span class="token number">150</span><span class="token punctuation">,</span>
    <span class="token string">"totalPages"</span><span class="token punctuation">:</span> <span class="token number">15</span><span class="token punctuation">,</span>
    <span class="token string">"exportType"</span><span class="token punctuation">:</span> <span class="token string">"paginated-search"</span><span class="token punctuation">,</span>
    <span class="token string">"description"</span><span class="token punctuation">:</span> <span class="token string">"Freeze Suchanfrage Export"</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token string">"appliedFilters"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
    <span class="token string">"filenameFilter"</span><span class="token punctuation">:</span> <span class="token string">"*.pdf"</span><span class="token punctuation">,</span>
    <span class="token string">"fileExtensionFilter"</span><span class="token punctuation">:</span> <span class="token string">"pdf"</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token string">"statistics"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
    <span class="token string">"pagesProcessed"</span><span class="token punctuation">:</span> <span class="token number">15</span><span class="token punctuation">,</span>
    <span class="token string">"totalRecordsProcessed"</span><span class="token punctuation">:</span> <span class="token number">150</span><span class="token punctuation">,</span>
    <span class="token string">"recordsWithAttachments"</span><span class="token punctuation">:</span> <span class="token number">120</span><span class="token punctuation">,</span>
    <span class="token string">"recordsWithoutAttachments"</span><span class="token punctuation">:</span> <span class="token number">30</span><span class="token punctuation">,</span>
    <span class="token string">"totalAttachments"</span><span class="token punctuation">:</span> <span class="token number">245</span><span class="token punctuation">,</span>
    <span class="token string">"exportCompletedAt"</span><span class="token punctuation">:</span> <span class="token string">"2024-12-19T10:15:33.021Z"</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token string">"records"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>
    <span class="token punctuation">{</span>
      <span class="token string">"recordId"</span><span class="token punctuation">:</span> <span class="token string">"{GUID}"</span><span class="token punctuation">,</span>
      <span class="token string">"title"</span><span class="token punctuation">:</span> <span class="token string">"Rechnung REG-2024-001"</span><span class="token punctuation">,</span>
      <span class="token string">"version"</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">,</span>
      <span class="token string">"archivedAt"</span><span class="token punctuation">:</span> <span class="token string">"2024-12-01T09:30:00Z"</span><span class="token punctuation">,</span>
      <span class="token string">"archivedBy"</span><span class="token punctuation">:</span> <span class="token string">"SYSTEM"</span><span class="token punctuation">,</span>
      <span class="token string">"type"</span><span class="token punctuation">:</span> <span class="token string">"Verkaufsrechnung"</span><span class="token punctuation">,</span>
      <span class="token string">"masterId"</span><span class="token punctuation">:</span> <span class="token string">"{GUID}"</span><span class="token punctuation">,</span>
      <span class="token string">"attachmentCount"</span><span class="token punctuation">:</span> <span class="token number">3</span><span class="token punctuation">,</span>
      <span class="token string">"hasAttachments"</span><span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
      <span class="token string">"zipFile"</span><span class="token punctuation">:</span> <span class="token string">"Rechnung_REG-2024-001_V1_20241201_0930.zip"</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">]</span>
<span class="token punctuation">}</span>

```

</div><div></div></div></div></div></div></div></div>### Datensatz-Export-Metadaten

<div id="bkmrk-%7B-%22exporttimestamp%22%3A"><div><div><div><div><div><div></div><div>```json
<span class="token punctuation">{</span>
  <span class="token string">"exportTimestamp"</span><span class="token punctuation">:</span> <span class="token string">"2024-12-19T14:30:00Z"</span><span class="token punctuation">,</span>
  <span class="token string">"exportedBy"</span><span class="token punctuation">:</span> <span class="token string">"USER001"</span><span class="token punctuation">,</span>
  <span class="token string">"totalRecordsProcessed"</span><span class="token punctuation">:</span> <span class="token number">25</span><span class="token punctuation">,</span>
  <span class="token string">"description"</span><span class="token punctuation">:</span> <span class="token string">"DXP Freeze Anhänge Export"</span><span class="token punctuation">,</span>
  <span class="token string">"sourceTable"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
    <span class="token string">"tableNumber"</span><span class="token punctuation">:</span> <span class="token number">112</span><span class="token punctuation">,</span>
    <span class="token string">"tableName"</span><span class="token punctuation">:</span> <span class="token string">"Sales Invoice Header"</span><span class="token punctuation">,</span>
    <span class="token string">"tableCaption"</span><span class="token punctuation">:</span> <span class="token string">"Geb. Verkaufsrechnung"</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token string">"appliedFilters"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
    <span class="token string">"filenameFilter"</span><span class="token punctuation">:</span> <span class="token string">"*.pdf"</span><span class="token punctuation">,</span>
    <span class="token string">"fileExtensionFilter"</span><span class="token punctuation">:</span> <span class="token string">"pdf"</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token string">"statistics"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
    <span class="token string">"totalAttachments"</span><span class="token punctuation">:</span> <span class="token number">45</span><span class="token punctuation">,</span>
    <span class="token string">"recordsWithAttachments"</span><span class="token punctuation">:</span> <span class="token number">20</span><span class="token punctuation">,</span>
    <span class="token string">"recordsWithoutAttachments"</span><span class="token punctuation">:</span> <span class="token number">5</span><span class="token punctuation">,</span>
    <span class="token string">"totalZipFiles"</span><span class="token punctuation">:</span> <span class="token number">20</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token string">"records"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>
    <span class="token punctuation">{</span>
      <span class="token string">"recordId"</span><span class="token punctuation">:</span> <span class="token string">"Sales Invoice Header: Unternehmen, SI-001"</span><span class="token punctuation">,</span>
      <span class="token string">"systemId"</span><span class="token punctuation">:</span> <span class="token string">"{GUID}"</span><span class="token punctuation">,</span>
      <span class="token string">"primaryKey"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
        <span class="token string">"fields"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>
          <span class="token punctuation">{</span>
            <span class="token string">"fieldName"</span><span class="token punctuation">:</span> <span class="token string">"Nr."</span><span class="token punctuation">,</span>
            <span class="token string">"fieldValue"</span><span class="token punctuation">:</span> <span class="token string">"SI-001"</span><span class="token punctuation">,</span>
            <span class="token string">"fieldType"</span><span class="token punctuation">:</span> <span class="token string">"Code"</span>
          <span class="token punctuation">}</span>
        <span class="token punctuation">]</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token string">"hasAttachments"</span><span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
      <span class="token string">"attachmentCount"</span><span class="token punctuation">:</span> <span class="token number">2</span><span class="token punctuation">,</span>
      <span class="token string">"zipFile"</span><span class="token punctuation">:</span> <span class="token string">"Sales_Invoice_Header_Unternehmen_SI-001.zip"</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">]</span>
<span class="token punctuation">}</span>

```

</div><div></div></div></div></div></div></div></div>## Leistungsüberlegungen

### Paginierungsmethode

<div id="bkmrk-gro%C3%9Fe-ergebnismengen"><div><div><div><div><div><div></div><div>- **Große Ergebnismengen**: Automatische Handhabung der Paginierung zur effizienten Verarbeitung großer Datensätze
- **Speicherverwaltung**: Verarbeitet eine Seite nach der anderen, bereinigt Speicher zwischen Seiten
- **Fortschrittsverfolgung**: Zeigt Echtzeit-Fortschritt für länger dauernde Operationen
- **Empfohlen für**: Suchanfragen, die Hunderte oder Tausende von Datensätzen zurückgeben können

</div><div></div></div></div></div></div></div></div>### Datensatzmethode

<div id="bkmrk-ausgew%C3%A4hlte-datens%C3%A4t"><div><div><div><div><div><div></div><div>- **Ausgewählte Datensätze**: Verarbeitet nur die spezifisch ausgewählten Datensätze
- **Direkte Verarbeitung**: Kein Paginierungs-Overhead für kleinere Datensätze
- **Stapelverarbeitung**: Effizient für die Verarbeitung spezifischer Datensatzmengen
- **Empfohlen für**: Gezielte Downloads von spezifischen Business Central Datensätzen

</div><div></div></div></div></div></div></div></div>## Fehlerbehandlung

Beide Methoden beinhalten umfassende Fehlerbehandlung:

### Häufige Szenarien

<div id="bkmrk-keine-ergebnisse-gef"><div><div><div><div><div><div></div><div>- **Keine Ergebnisse gefunden**: Gibt `false` zurück, wenn keine Datensätze oder Anhänge gefunden werden
- **Berechtigungsprobleme**: Schließt automatisch Datensätze aus, auf die der Benutzer nicht zugreifen kann
- **API-Fehler**: Zuverlässiger Umgang mit API-Kommunikationsfehlern
- **Leere Filter**: Behandelt leere oder ungültige Filterparameter

</div><div></div></div></div></div></div></div></div>### Best Practices

<div id="bkmrk-%2F%2F-r%C3%BCckgabewert-imme"><div><div><div><div><div><div></div><div>```al
// Rückgabewert immer prüfen
if not ResultMgt.DownloadAttachmentsAsZipWithPagination(SearchQuery, ZipArchive, AttachmentCount) then begin
    Message('Keine Anhänge gefunden oder Download fehlgeschlagen.');
    exit;
end;

// Anhanganzahl validieren
if AttachmentCount = 0 then begin
    Message('Suche abgeschlossen, aber keine Anhänge entsprechen den Kriterien.');
    exit;
end;

// Große Downloads handhaben
if AttachmentCount > 1000 then
    if not Confirm('Dies wird %1 Anhänge herunterladen. Fortfahren?', false, AttachmentCount) then
        exit;

```

</div><div></div></div></div></div></div></div></div>## Integrationsereignisse

Beide Methoden unterstützen Integrationsereignisse zur Anpassung:

### Verfügbare Ereignisse

<div id="bkmrk-onbeforedownloadatta"><div><div><div><div><div><div></div><div>- `OnBeforeDownloadAttachmentsAsZip`: Verhalten vor Download-Start modifizieren
- `OnBeforeProcessAttachmentForZip`: Einzelne Anhänge überspringen oder modifizieren
- `OnAfterGetAttachmentBase64`: Anhanginhalt nach Abruf modifizieren
- `OnAfterAddAttachmentToZip`: Aktionen nach Hinzufügung zum ZIP durchführen
- `OnNoAttachmentsFound`: Szenario ohne Anhänge behandeln

</div><div></div></div></div></div></div></div></div>### Integrationsbeispiel

<div id="bkmrk-%5Beventsubscriber%28obj"><div><div><div><div><div><div></div><div>```al
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP FRZ Result Mgt.", 'OnBeforeProcessAttachmentForZip', '', false, false)]
local procedure OnBeforeProcessAttachmentForZip(var TempFrzAttachmentResult: Record "DXP FRZ Attachment Result" temporary; var IsHandled: Boolean)
begin
    // Anhänge größer als 10MB überspringen
    if TempFrzAttachmentResult.Filesize > 10485760 then
        IsHandled := true;
end;

```

</div><div></div></div></div></div></div></div></div>## Dateinamen-Konventionen

### Automatische Bereinigung

Alle Dateinamen werden automatisch mit der `SanitizeFileName`-Methode bereinigt:

<div id="bkmrk-ung%C3%BCltige-zeichen-%28%3C"><div><div><div><div><div><div></div><div>- Ungültige Zeichen (`< > : " / \ | ? *`) werden durch Unterstriche ersetzt
- Leerzeichen werden durch Unterstriche ersetzt
- Maximale Dateinamenlängen werden erzwungen

</div><div></div></div></div></div></div></div></div>### Eindeutige Benennung

<div id="bkmrk-einzelne-dateien%3A-en"><div><div><div><div><div></div><div>- **Einzelne Dateien**: Enthalten Anhang-GUID-Präfix zur Eindeutigkeit
- **ZIP-Dateien**: Enthalten Datensatzinformationen und Zeitstempel
- **Keine Konflikte**: Garantiert eindeutige Namen innerhalb jedes ZIP-Archivs

</div></div></div></div></div></div>