> ## Documentation Index
> Fetch the complete documentation index at: https://docs.superoffice.com/llms.txt
> Use this file to discover all available pages before exploring further.

# How to use ActivityArchive filters

> How to use ActivityArchive filters

The following example shows the use of ActivityArchive filters. Unlike other archives, the `ActivityArchive` allows us to take columns from multiple archives.

```csharp theme={null}
using SuperOffice;
using SuperOffice.CRM.Services;
using SuperOffice.CRM.ArchiveLists;
using SuperOffice.CRM.Archives;

using (SoSession newSession = SoSession.Authenticate("sam", "sam"))
{
  //Initializing the Archive Agent
  using(ArchiveAgent newArcAgt = new ArchiveAgent())
  {
    //Setting the Parameters that needs to be passed to Agent method
    //Parameter - providerName - The name of the archive provider to use
    string archiveProviderName = ContactActivityArchiveProvider.ProviderName;

    //Parameter - columns - An array of the names of the columns wanted.
    string[] archiveColumns = new string[] { "contact/name", "associate/fullName", "person/fullName", "saleId", "currency" };

    //Parameter - sortOrder - Sort order for the archive
    ArchiveOrderByInfo[] archiveSrtOrd = new ArchiveOrderByInfo[1];
    archiveSrtOrd[0] = new ArchiveOrderByInfo("saleId", SuperOffice.Util.OrderBySortType.DESC);

    //Parameter - restriction - Archive restrictions
    ArchiveRestrictionInfo[] archiveRest = new ArchiveRestrictionInfo[1];
    archiveRest[0] = new ArchiveRestrictionInfo("contact/contactId", "=", 68);

    //Parameter - entities - Which entities to include
    string[] desiredEntities = { "contact", "sale", "document", "person", "appointment" };

    //Parameter - page - Page number, page 0 is the first page
    int page = 1;

    //Parameter - pageSize - Page size
    int pageSize = 10;

    // Get a page of results for an archive list,
    // explicitly specifying the restrictions, orderby and chosen columns
    ArchiveListItem[] arcLstItm = newArcAgt.GetArchiveListByColumns(
      archiveProviderName, archiveColumns, archiveSrtOrd, archiveRest, desiredEntities, page, pageSize);

    int rowNo = 1;
    foreach (ArchiveListItem archiveRow in arcLstItm)
    {
      if (rowNo == 1)
      {
        foreach (KeyValuePair<string, ArchiveColumnData> column in archiveRow.ColumnData)
        {
          Console.Write(column.Key + "\t");
        }
        Console.WriteLine();
      }

      // extract and display the displayValue of each cell
      // (you need to parse culturally sensitive values such as dates
      // to get the correct client display format)
      foreach (ArchiveColumnData archiveCell in archiveRow.ColumnData.Values)
      {
        Console.Write(archiveCell.DisplayValue + "\t");
      }
      Console.WriteLine();
      ++rowNo;
    }
  }
}
```

As we can see, `GetArchiveListByColumns()` requires 7 parameters to be passed into it. These are explained in detail on the [IArchiveProvider][1] page. Below we touch on what's different.

## archiveProviderName

`ContactActivityArchiveProvider.ProviderName`

## archiveColumns

`{ "contact/name", "associate/fullName", "person/fullName", "saleId", "currency" }`

<Note>
  The ActivityArchive allows us to take columns from multiple archives. Here we retrieve the name of the contact from the `Contact` entity, the full name of the associate from the `Associate` entity, the full name of the person from the `Person` entity, and `SaleId` and `Currency` from the `Sale` entity. These retrieves would be impossible if we were to have an Appointment column or a Document column.
</Note>

## archiveSrtOrd

Here we are sporting by the `saleId` with the highest ID first in the list. Any row that doesn't have a `saleId` will be sorted as value 0 and would be shown at the end of the list.

## archiveRest

What we have done here is set the restriction, as ContactID, which is obtained from the `Contact` entity, should equal to the specified value (68). This means that we are retrieving all the Appointments, Documents, and Sales records that have the `contactId` as "68".

## desiredEntities

The entities correspond to checkboxes in the Archive GUI. If we remove "document" from this list, the `Document` records are never fetched from the database and the `Documents` rows will disappear from the results.

Once all parameters have been created, we may use them with the `GetArchiveListByColumns` method, which returns an array of `ArchiveListItem`.

The next step we need to do is to loop through the above array just like we did in the [first example][1].

## Output

```text theme={null}
person/fullName  contact/name    associate/fullName   currency    saleId
0-Feil           Software AS     Brede Bredesen       SEK         [I:19]
0-Feil           Software AS     Arne Arnesen         SEK         [I:10]0-Feil           Software AS     Arne Arnesen         NOK         [I:9]
0-Feil           Software AS     Arne Arnesen         NOK         [I:8]
0-Feil           Software AS     Arne Arnesen         SEK         [I:7]
```

[1]: ./iarchiveagent


## Related topics

- [Filter the section tabs](/en/learn/section-tabs/filter.md)
- [Set Activity Filter](/en/api/reference/restful/agent/archive_agent/set-activity-filter.md)
- [Archive agents](/en/api/search/iarchiveagent/index.md)
- [Get Activity Filter](/en/api/reference/restful/agent/archive_agent/get-activity-filter.md)
- [Activities tab](/en/learn/section-tabs/activities-tab.md)
- [Grouping lists](/en/learn/section-tabs/group.md)
