Skip to main content

Query Options

The SDK supports all standard OData query options for filtering, sorting, and paginating data.
const results = await client.A_BusinessPartner.list({
  select: ['BusinessPartner', 'BusinessPartnerName'],
  filter: "BusinessPartnerCategory eq '1'",
  orderBy: 'BusinessPartnerName asc',
  top: 10,
  skip: 0,
  expand: ['to_BusinessPartnerAddress']
});

Select Fields

Limit which fields are returned to reduce payload size:
// Select specific fields
const partners = await client.A_BusinessPartner.list({
  select: ['BusinessPartner', 'BusinessPartnerName', 'Industry']
});

Filtering

Filter results using OData filter syntax.

Basic Filters

// Equality
const customers = await client.A_BusinessPartner.list({
  filter: "BusinessPartnerCategory eq '1'"
});

// Not equal
const nonCustomers = await client.A_BusinessPartner.list({
  filter: "BusinessPartnerCategory ne '1'"
});

// Numeric comparison
const largeOrders = await client.A_SalesOrder.list({
  filter: "TotalNetAmount gt 10000"
});

// Date comparison
const recentOrders = await client.A_SalesOrder.list({
  filter: "CreationDate ge 2024-01-01"
});

Filter Operators

OperatorDescriptionExample
eqEqual"Status eq 'A'"
neNot equal"Status ne 'X'"
gtGreater than"Amount gt 100"
geGreater than or equal"Amount ge 100"
ltLess than"Amount lt 1000"
leLess than or equal"Amount le 1000"

String Functions

// Contains
const searchResults = await client.A_BusinessPartner.list({
  filter: "substringof('Corp', BusinessPartnerName)"
});

// Starts with
const aPartners = await client.A_BusinessPartner.list({
  filter: "startswith(BusinessPartnerName, 'A')"
});

// Ends with
const ltdCompanies = await client.A_BusinessPartner.list({
  filter: "endswith(BusinessPartnerName, 'Ltd')"
});

Logical Operators

// AND
const activeCustomers = await client.A_BusinessPartner.list({
  filter: "BusinessPartnerCategory eq '1' and IsActiveEntity eq true"
});

// OR
const customersOrSuppliers = await client.A_BusinessPartner.list({
  filter: "BusinessPartnerCategory eq '1' or BusinessPartnerCategory eq '2'"
});

// NOT
const notDeleted = await client.A_BusinessPartner.list({
  filter: "not(IsMarkedForDeletion)"
});

// Complex combinations
const complexFilter = await client.A_BusinessPartner.list({
  filter: "(BusinessPartnerCategory eq '1' and Industry eq 'TECH') or TotalNetAmount gt 100000"
});

Null Checks

// Check for null
const withoutIndustry = await client.A_BusinessPartner.list({
  filter: "Industry eq null"
});

// Check not null
const withIndustry = await client.A_BusinessPartner.list({
  filter: "Industry ne null"
});

Sorting

Order results by one or more fields:
// Single field, ascending
const sorted = await client.A_BusinessPartner.list({
  orderBy: 'BusinessPartnerName'
});

// Single field, descending
const sortedDesc = await client.A_BusinessPartner.list({
  orderBy: 'BusinessPartnerName desc'
});

// Multiple fields
const multiSorted = await client.A_SalesOrder.list({
  orderBy: 'SoldToParty asc, CreationDate desc'
});

Pagination

Basic Pagination

const pageSize = 10;

// First page
const page1 = await client.A_BusinessPartner.list({
  top: pageSize,
  skip: 0
});

// Second page
const page2 = await client.A_BusinessPartner.list({
  top: pageSize,
  skip: pageSize
});

With Total Count

const pageSize = 10;
const page = 1;

const { data, count } = await client.A_BusinessPartner.listWithCount({
  top: pageSize,
  skip: (page - 1) * pageSize
});

const totalPages = Math.ceil(count / pageSize);
console.log(`Page ${page} of ${totalPages}`);

Async Iterator

For processing large datasets efficiently:
// Iterate over all pages
for await (const partners of client.A_BusinessPartner.paginate({ pageSize: 100 })) {
  for (const partner of partners) {
    console.log(partner.BusinessPartnerName);
  }
}

Expanding Relations

Fetch related entities in a single request:
// Single expand
const partnersWithAddresses = await client.A_BusinessPartner.list({
  expand: ['to_BusinessPartnerAddress']
});

// Multiple expands
const ordersWithDetails = await client.A_SalesOrder.list({
  expand: ['to_Item', 'to_Partner']
});

// Nested expand (OData v4)
const deepExpand = await client.A_SalesOrder.list({
  expand: ['to_Item/to_Material']
});

Expand with Select

const partners = await client.A_BusinessPartner.list({
  select: ['BusinessPartner', 'BusinessPartnerName'],
  expand: [
    {
      property: 'to_BusinessPartnerAddress',
      select: ['AddressID', 'CityName', 'Country']
    }
  ]
});
Search across multiple fields (if supported by the service):
const searchResults = await client.A_BusinessPartner.list({
  search: 'Acme'
});

Query Builder

For complex queries, use the fluent query builder:
const results = await client.A_BusinessPartner
  .query()
  .select('BusinessPartner', 'BusinessPartnerName', 'Industry')
  .filter('BusinessPartnerCategory', 'eq', '1')
  .filter('Industry', 'in', ['TECH', 'RETAIL'])
  .orderBy('BusinessPartnerName', 'asc')
  .top(10)
  .expand('to_BusinessPartnerAddress')
  .execute();

Common Patterns

Date Range Filter

const startDate = '2024-01-01';
const endDate = '2024-12-31';

const ordersInRange = await client.A_SalesOrder.list({
  filter: `CreationDate ge datetime'${startDate}' and CreationDate le datetime'${endDate}'`
});

In List Filter

const specificPartners = await client.A_BusinessPartner.list({
  filter: "BusinessPartner eq '10100001' or BusinessPartner eq '10100002' or BusinessPartner eq '10100003'"
});
const results = await client.A_BusinessPartner.list({
  filter: "tolower(BusinessPartnerName) eq 'acme'"
});