# Attachment Download

<div id="bkmrk-overview"><nav class="navigation-bar"><div><div><span style="color: #222222; font-size: 2.8275em; font-weight: 400;">Overview</span></div></div></nav></div>The DXP Freeze Result Management codeunit provides two primary methods for downloading archived attachments as ZIP files:

<div id="bkmrk-downloadattachmentsa"><div><div><div><div><div><div></div><div>1. **`DownloadAttachmentsAsZipWithPagination`** - Downloads attachments from search query results with pagination support
2. **`DownloadAttachmentsAsZipFromRecord`** - Downloads attachments from specific Business Central records

</div><div></div></div></div></div></div></div></div>Both methods organize attachments into structured ZIP archives with comprehensive metadata for audit and tracking purposes.

## Method 1: DownloadAttachmentsAsZipWithPagination

### Purpose

Downloads all attachments from a search query result set, processing results page by page to handle large datasets efficiently. Each record’s attachments are organized into individual ZIP files within a main ZIP archive.

Overloads Available

#### 1. Basic Usage

<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. With Filters

<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. Full Control

<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. Pre-populated Records (Advanced)

<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>### Parameters

<div id="bkmrk-parameter-type-descr"><div><div><div><div><div><div></div><div><div><table><thead><tr><th style="width: 173px;">Parameter</th><th style="width: 119px;">Type</th><th style="width: 517px;">Description</th></tr></thead><tbody><tr><td style="width: 173px;">`SearchQuery`</td><td style="width: 119px;">Text</td><td style="width: 517px;">Freeze search query string. If empty in pre-populated overload, uses existing query or re-executes search</td></tr><tr><td style="width: 173px;">`ZipArchive`</td><td style="width: 119px;">Codeunit “Data Compression”</td><td style="width: 517px;">ZIP archive object that will contain the downloaded files</td></tr><tr><td style="width: 173px;">`AttachmentCount`</td><td style="width: 119px;">Integer (var)</td><td style="width: 517px;">Returns the total number of attachments downloaded</td></tr><tr><td style="width: 173px;">`FilenameFilter`</td><td style="width: 119px;">Text</td><td style="width: 517px;">Filter for attachment filenames (e.g., ‘*.pdf’, 'invoice*’)</td></tr><tr><td style="width: 173px;">`FileExtensionFilter`</td><td style="width: 119px;">Text</td><td style="width: 517px;">Filter for file extensions (e.g., ‘pdf’, ‘docx’)</td></tr><tr><td style="width: 173px;">`StoreApiLink`</td><td style="width: 119px;">Text</td><td style="width: 517px;">Optional specific store API link</td></tr><tr><td style="width: 173px;">`RecordsPerPage`</td><td style="width: 119px;">Integer</td><td style="width: 517px;">Number of records per page (default: 100)</td></tr><tr><td style="width: 173px;">`SuppressDialog`</td><td style="width: 119px;">Boolean</td><td style="width: 517px;">Whether to suppress progress dialog</td></tr></tbody></table>

</div></div><div></div></div></div></div></div></div></div>### Return Value

<div id="bkmrk-boolean%3A%C2%A0true%C2%A0if-att"><div><div><div><div><div><div></div><div>- `Boolean`: `true` if attachments were found and downloaded; `false` otherwise

</div><div></div></div></div></div></div></div></div>### Example Usage

#### Basic 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 := 'invoice AND 2024';
    
    if ResultMgt.DownloadAttachmentsAsZipWithPagination(SearchQuery, ZipArchive, AttachmentCount) then begin
        // Save ZIP to file
        TempBlob.CreateOutStream(OutStr);
        ZipArchive.SaveZipArchive(OutStr);
        TempBlob.CreateInStream(InStr);
        
        FileMgt.DownloadFromStreamHandler(InStr, '', '', '', 'SearchResults.zip');
        Message('Downloaded %1 attachments successfully.', AttachmentCount);
    end else
        Message('No attachments found for the search query.');
end;

```

</div><div></div></div></div></div></div></div></div>#### With Filters

<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 := 'type:invoice';
    
    if ResultMgt.DownloadAttachmentsAsZipWithPagination(
        SearchQuery, 
        ZipArchive, 
        AttachmentCount, 
        '*.pdf', // Only PDF files
        'pdf'    // File extension filter
    ) then begin
        // Process the ZIP archive
        ProcessDownloadedFiles(ZipArchive, AttachmentCount);
    end;
end;

```

</div><div></div></div></div></div></div></div></div>#### Using Pre-populated Records

<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
    // Assume these records are already populated from a previous search
    PopulateSearchResults(TempFrzResultQueryHeader, TempFrzResultRecordHeader, TempFrzResultRecordField, TempFrzAttachmentResult);
    
    // Download using existing results without re-executing search
    if ResultMgt.DownloadAttachmentsAsZipWithPagination(
        TempFrzResultQueryHeader,
        TempFrzResultRecordHeader,
        TempFrzResultRecordField,
        TempFrzAttachmentResult,
        'invoice search', // SearchQuery - if empty, will re-execute search
        ZipArchive,
        AttachmentCount,
        '',     // No filename filter
        '',     // No extension filter
        true    // Suppress dialog
    ) then begin
        ProcessDownloadedFiles(ZipArchive, AttachmentCount);
    end;
end;

```

</div><div></div></div></div></div></div></div></div>### ZIP Structure (Pagination)

<div id="bkmrk-searchresults.zip-%E2%94%9C%E2%94%80"><div><div><div><div><div><div></div><div>```
SearchResults.zip
├── export-metadata.json
├── Invoice_001_V1_20241201_1430.zip
│   ├── {GUID}_invoice.pdf
│   └── {GUID}_supporting_doc.docx
├── PurchaseOrder_002_V2_20241202_0900.zip
│   └── {GUID}_po_document.pdf
└── Contract_003_V1_20241203_1200.zip
    ├── {GUID}_contract.pdf
    └── {GUID}_amendment.pdf

```

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

### Purpose

Downloads attachments from specific Business Central records. Each selected record’s attachments are organized into individual ZIP files within a main ZIP archive.

### Overloads Available

#### 1. Basic Usage

<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. With Filters

<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>### Parameters

<div id="bkmrk-parameter-type-descr-0"><div><div><div><div><div><div></div><div><div><table><thead><tr><th>Parameter</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>`SelectedRecord`</td><td>RecordRef (var)</td><td>RecordRef containing the selected Business Central records</td></tr><tr><td>`ZipArchive`</td><td>Codeunit “Data Compression”</td><td>ZIP archive object that will contain the downloaded files</td></tr><tr><td>`FilenameFilter`</td><td>Text</td><td>Filter for attachment filenames</td></tr><tr><td>`FileExtensionFilter`</td><td>Text</td><td>Filter for file extensions</td></tr></tbody></table>

</div></div><div></div></div></div></div></div></div></div>### Return Value

<div id="bkmrk-boolean%3A%C2%A0true%C2%A0if-att-0"><div><div><div><div><div><div></div><div>- `Boolean`: `true` if attachments were found and downloaded; `false` otherwise

</div><div></div></div></div></div></div></div></div>### Example Usage

#### Download from Sales Invoices

<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
    // Select specific invoices
    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, 'InvoiceAttachments.zip')
        else
            Message('No attachments found for the selected invoices.');
    end;
end;

```

</div><div></div></div></div></div></div></div></div>#### Download with Filters from Page

<div id="bkmrk-%2F%2F-in-a-page-extensi"><div><div><div><div><div><div></div><div>```al
// In a page extension
action(DownloadAttachmentsFiltered)
{
    Caption = 'Download Filtered Attachments';
    Image = ExportFile;
    
    trigger OnAction()
    var
        ResultMgt: Codeunit "DXP FRZ Result Mgt.";
        ZipArchive: Codeunit "Data Compression";
        RecordRef: RecordRef;
        FilenameFilter: Text;
        FileExtensionFilter: Text;
    begin
        // Show filter dialog
        if ShowFilterDialog(FilenameFilter, FileExtensionFilter) then begin
            CurrPage.SetSelectionFilter(Rec);
            RecordRef.GetTable(Rec);
            
            if ResultMgt.DownloadAttachmentsAsZipFromRecord(
                RecordRef, 
                ZipArchive, 
                FilenameFilter, 
                FileExtensionFilter
            ) then
                DownloadZipFile(ZipArchive, 'FilteredAttachments.zip');
        end;
    end;
}

```

</div><div></div></div></div></div></div></div></div>### ZIP Structure (Records)

<div id="bkmrk-recordattachments.zi"><div><div><div><div><div><div></div><div>```
RecordAttachments.zip
├── export-metadata.json
├── Sales_Invoice_Header_Company_SI-001.zip
│   ├── {GUID}_invoice.pdf
│   └── {GUID}_terms.pdf
├── Sales_Invoice_Header_Company_SI-002.zip
│   └── {GUID}_invoice.pdf
└── Sales_Invoice_Header_Company_SI-003.zip
    ├── {GUID}_invoice.pdf
    ├── {GUID}_delivery_note.pdf
    └── {GUID}_receipt.jpg

```

</div><div></div></div></div></div></div></div></div>## Metadata Structure

Both methods generate comprehensive metadata in `export-metadata.json`:

### Pagination Export Metadata

<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">"type:invoice AND year: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 Search Query 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">"Invoice INV-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">"Sales Invoice"</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">"Invoice_INV-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>### Record Export Metadata

<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 Attachments 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">"Posted Sales Invoice"</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: Company, 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">"No."</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_Company_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>## Performance Considerations

### Pagination Method

<div id="bkmrk-large-result-sets%3A-a"><div><div><div><div><div><div></div><div>- **Large Result Sets**: Automatically handles pagination to process large datasets efficiently
- **Memory Management**: Processes one page at a time, clearing memory between pages
- **Progress Tracking**: Shows real-time progress for long-running operations
- **Recommended For**: Search queries that may return hundreds or thousands of records

</div><div></div></div></div></div></div></div></div>### Record Method

<div id="bkmrk-selected-records%3A-pr"><div><div><div><div><div><div></div><div>- **Selected Records**: Processes only the records you specifically select
- **Direct Processing**: No pagination overhead for smaller datasets
- **Batch Processing**: Efficient for processing specific record sets
- **Recommended For**: Targeted downloads from specific Business Central records

</div><div></div></div></div></div></div></div></div>## Error Handling

Both methods include comprehensive error handling:

### Common Scenarios

<div id="bkmrk-no-results-found%3A-re"><div><div><div><div><div><div></div><div>- **No Results Found**: Returns `false` when no records or attachments are found
- **Permission Issues**: Automatically excludes records the user cannot access
- **API Failures**: Gracefully handles API communication errors
- **Empty Filters**: Handles empty or invalid filter parameters

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

<div id="bkmrk-%2F%2F-always-check-retu"><div><div><div><div><div><div></div><div>```al
// Always check return value
if not ResultMgt.DownloadAttachmentsAsZipWithPagination(SearchQuery, ZipArchive, AttachmentCount) then begin
    Message('No attachments found or download failed.');
    exit;
end;

// Validate attachment count
if AttachmentCount = 0 then begin
    Message('Search completed but no attachments matched the criteria.');
    exit;
end;

// Handle large downloads
if AttachmentCount > 1000 then
    if not Confirm('This will download %1 attachments. Continue?', false, AttachmentCount) then
        exit;

```

</div><div></div></div></div></div></div></div></div>## Integration Events

Both methods support integration events for customization:

### Available Events

<div id="bkmrk-onbeforedownloadatta"><div><div><div><div><div><div></div><div>- `OnBeforeDownloadAttachmentsAsZip`: Modify behavior before download starts
- `OnBeforeProcessAttachmentForZip`: Skip or modify individual attachments
- `OnAfterGetAttachmentBase64`: Modify attachment content after retrieval
- `OnAfterAddAttachmentToZip`: Perform actions after adding to ZIP
- `OnNoAttachmentsFound`: Handle no attachments scenario

</div><div></div></div></div></div></div></div></div>### Example Integration

<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
    // Skip attachments larger than 10MB
    if TempFrzAttachmentResult.Filesize > 10485760 then
        IsHandled := true;
end;

```

</div><div></div></div></div></div></div></div></div>## File Naming Conventions

### Automatic Sanitization

All filenames are automatically sanitized using the `SanitizeFileName` method:

<div id="bkmrk-invalid-characters-%28"><div><div><div><div><div><div></div><div>- Invalid characters (`< > : " / \ | ? *`) are replaced with underscores
- Spaces are replaced with underscores
- Maximum filename lengths are enforced

</div><div></div></div></div></div></div></div></div>### Unique Naming

<div id="bkmrk-individual-files%3A-in"><div><div><div><div><div></div><div>- **Individual Files**: Include attachment GUID prefix to ensure uniqueness
- **ZIP Files**: Include record information and timestamps
- **No Conflicts**: Guaranteed unique names within each ZIP archive

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