Skip to main content

Overview

The S4Kit SDK provides a clean, intuitive API for CRUD operations on SAP OData entities. All operations are accessed through the client.sap namespace.
client.EntityName.operation(...)

List Entities

Retrieve multiple entities with optional filtering:
// List all business partners
const partners = await client.A_BusinessPartner.list();

// List with options
const customers = await client.A_BusinessPartner.list({
  top: 10,
  skip: 0,
  select: ['BusinessPartner', 'BusinessPartnerName'],
  filter: "BusinessPartnerCategory eq '1'"
});

List with Count

Get entities along with the total count:
const { data, count } = await client.A_BusinessPartner.listWithCount({
  top: 10
});

console.log(`Showing ${data.length} of ${count} total partners`);

List All (Pagination)

Automatically fetch all pages:
// Get all entities (handles pagination automatically)
const allPartners = await client.A_BusinessPartner.all();

// With filtering
const allCustomers = await client.A_BusinessPartner.all({
  filter: "BusinessPartnerCategory eq '1'"
});
Use all() carefully with large datasets. Consider using pagination or filtering to limit results.

Get Single Entity

Retrieve a single entity by its key:
// Get by string key
const partner = await client.A_BusinessPartner.get('10100001');

// Get by numeric key
const product = await client.A_Product.get(12345);

// With options
const partnerWithDetails = await client.A_BusinessPartner.get('10100001', {
  select: ['BusinessPartner', 'BusinessPartnerName', 'Industry'],
  expand: ['to_BusinessPartnerAddress']
});

Composite Keys

For entities with composite keys, pass an object:
const orderItem = await client.A_SalesOrderItem.get({
  SalesOrder: '1000000',
  SalesOrderItem: '10'
});

Create Entity

Create a new entity:
const newPartner = await client.A_BusinessPartner.create({
  BusinessPartnerCategory: '1',
  BusinessPartnerFullName: 'Acme Corporation',
  Industry: 'TECH'
});

console.log(`Created partner: ${newPartner.BusinessPartner}`);

Deep Create

Create an entity with nested related entities:
const orderWithItems = await client.A_SalesOrder.createDeep({
  SalesOrderType: 'OR',
  SoldToParty: '10100001',
  to_Item: [
    {
      Material: 'TG11',
      RequestedQuantity: 10,
      RequestedQuantityUnit: 'PC'
    },
    {
      Material: 'TG12',
      RequestedQuantity: 5,
      RequestedQuantityUnit: 'PC'
    }
  ]
});

Update Entity

Update an existing entity (PATCH - partial update):
const updated = await client.A_BusinessPartner.update('10100001', {
  BusinessPartnerFullName: 'Acme Corporation Ltd'
});

Replace Entity

Replace an entire entity (PUT - full replacement):
const replaced = await client.A_BusinessPartner.replace('10100001', {
  BusinessPartnerCategory: '1',
  BusinessPartnerFullName: 'Acme Corporation Ltd',
  Industry: 'TECH',
  // All required fields must be provided
});

Delete Entity

Delete an entity by its key:
await client.A_BusinessPartner.delete('10100001');

Delete with Composite Key

await client.A_SalesOrderItem.delete({
  SalesOrder: '1000000',
  SalesOrderItem: '10'
});

Batch Operations

Create Many

Create multiple entities in a single request:
const partners = await client.A_BusinessPartner.createMany([
  { BusinessPartnerCategory: '1', BusinessPartnerFullName: 'Company A' },
  { BusinessPartnerCategory: '1', BusinessPartnerFullName: 'Company B' },
  { BusinessPartnerCategory: '1', BusinessPartnerFullName: 'Company C' }
]);

Update Many

Update multiple entities:
await client.A_BusinessPartner.updateMany([
  { key: '10100001', data: { Industry: 'TECH' } },
  { key: '10100002', data: { Industry: 'RETAIL' } }
]);

Delete Many

Delete multiple entities:
await client.A_BusinessPartner.deleteMany([
  '10100001',
  '10100002',
  '10100003'
]);

Upsert

Create or update an entity based on whether it exists:
const result = await client.A_BusinessPartner.upsert('10100001', {
  BusinessPartnerCategory: '1',
  BusinessPartnerFullName: 'Acme Corporation'
});

Working with Navigation Properties

Access related entities through navigation properties:
// Get addresses for a business partner
const addresses = await client.A_BusinessPartner
  .nav('10100001', 'to_BusinessPartnerAddress')
  .list();

// Get a specific address
const address = await client.A_BusinessPartner
  .nav('10100001', 'to_BusinessPartnerAddress')
  .get('10100001', '1');

// Create a new address
const newAddress = await client.A_BusinessPartner
  .nav('10100001', 'to_BusinessPartnerAddress')
  .create({
    AddressID: '2',
    CityName: 'New York',
    // ...
  });

Override Connection Per-Request

Use a different SAP instance for a specific request:
// Use sandbox for testing
const testPartners = await client.A_BusinessPartner.list({
  connection: 'sandbox',
  top: 10
});

// Use production for real data
const prodPartners = await client.A_BusinessPartner.list({
  connection: 'production',
  top: 10
});