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`);
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
});