Files
gh-secondsky-sap-skills-ski…/references/api-reference.md
2025-11-30 08:55:30 +08:00

1055 lines
31 KiB
Markdown

# SAP Analytics Cloud - Analytics Designer API Reference for Planning
**Source**: [https://help.sap.com/doc/958d4c11261f42e992e8d01a4c0dde25/2025.23/en-US/index.html](https://help.sap.com/doc/958d4c11261f42e992e8d01a4c0dde25/2025.23/en-US/index.html)
**Version**: 2025.23
**Last Updated**: 2025-11-22
---
## Table of Contents
1. [Application Class](#application-class)
2. [DataSource API](#datasource-api)
3. [Planning API (getPlanning)](#planning-api)
4. [PlanningModel API](#planningmodel-api)
5. [Data Actions API](#data-actions-api)
6. [Multi Actions API](#multi-actions-api)
7. [Calendar Integration API](#calendar-integration-api)
8. [BPC Planning Sequence API](#bpc-planning-sequence-api)
9. [Widget APIs](#widget-apis)
10. [Advanced Analytics APIs](#advanced-analytics-apis)
11. [Export APIs](#export-apis)
12. [Utility Classes](#utility-classes)
13. [Data Types and Structures](#data-types-and-structures)
14. [Enumerations](#enumerations)
---
## Application Class
The Application object provides access to global application functionality.
### Properties & Methods
| Method | Description | Return Type |
|--------|-------------|-------------|
| `getInfo()` | Get application information | ApplicationInfo |
| `getMode()` | Get current mode (View, Present, Embed) | ApplicationMode |
| `getTheme()` | Get current theme | Theme |
| `setTheme(theme)` | Set application theme | void |
| `getWidgets()` | Get all widgets in application | Widget[] |
| `getUserInfo()` | Get current user information | UserInfo |
| `getTeamsInfo()` | Get user's team information | TeamInfo[] |
| `getRolesInfo()` | Get user's role information | RoleInfo[] |
| `showBusyIndicator()` | Show loading indicator | void |
| `hideBusyIndicator()` | Hide loading indicator | void |
| `setAutomaticBusyIndicatorEnabled(enabled)` | Auto busy indicator | void |
| `refreshData()` | Refresh all data sources | void |
| `showMessage(text, type)` | Show toast message | void |
| `sendNotification(options)` | Send notification to users | void |
| `postMessage(message)` | Post message for embedding | void |
| `setCssClass(className)` | Set CSS class on application | void |
| `setCommentModeEnabled(enabled)` | Enable/disable comment mode | void |
### Event Handlers
| Event | Trigger Condition |
|-------|-------------------|
| `onInitialization` | Application loads |
| `onResize` | Browser window resizes |
| `onOrientationChange` | Device orientation changes |
| `onTimeout` | Session timeout warning |
| `onBeforeExecute` | Before data action executes |
| `onPostMessageReceived` | Message received from parent frame |
| `onShake` | Device shake detected (mobile) |
### NotificationOptions Object
```javascript
{
title: string,
content: string,
receivers: string[], // User IDs
isSendEmail: boolean,
isSendMobileNotification: boolean,
parameters: object
}
```
### Example: Application Initialization
```javascript
// onInitialization event
Application.showBusyIndicator();
// Get user and team info
var userInfo = Application.getUserInfo();
var teams = Application.getTeamsInfo();
console.log("User: " + userInfo.displayName);
console.log("Teams: " + teams.length);
// Initialize default filters
var currentYear = new Date().getFullYear().toString();
Table_1.getDataSource().setDimensionFilter("Year", currentYear);
Application.hideBusyIndicator();
```
---
## DataSource API
Access data source functionality for querying and filtering.
### Core Methods
| Method | Description | Parameters |
|--------|-------------|------------|
| `getDimensions()` | Get all dimensions | none |
| `getHierarchies(dimId)` | Get dimension hierarchies | dimId: string |
| `getMeasures()` | Get all measures | none |
| `getMembers(dimId, options)` | Get dimension members | dimId: string, options: MemberOptions |
| `getMember(dimId, memberId)` | Get single member | dimId: string, memberId: string |
| `getData()` | Get data from source | none |
| `getResultSet()` | Get result set | none |
| `getDataSelections()` | Get current data selections | none |
| `isResultEmpty()` | Check if result is empty | none |
| `setDimensionFilter(dimId, filter)` | Set filter on dimension | dimId: string, filter: string/MemberInfo[] |
| `removeDimensionFilter(dimId)` | Remove dimension filter | dimId: string |
| `getDimensionFilters(dimId)` | Get active filters | dimId: string |
| `setVariableValue(varId, value)` | Set variable value | varId: string, value: string |
| `getVariables()` | Get all variables | none |
| `getVariableValues(varId)` | Get variable values | varId: string |
| `removeVariableValue(varId)` | Remove variable value | varId: string |
| `setHierarchy(dimId, hierarchyId)` | Set dimension hierarchy | dimId: string, hierarchyId: string |
| `getHierarchyLevel(dimId)` | Get current hierarchy level | dimId: string |
| `expandNode(node)` | Expand hierarchy node | node: MemberInfo |
| `collapseNode(node)` | Collapse hierarchy node | node: MemberInfo |
| `refreshData()` | Refresh data source | none |
| `setRefreshPaused(paused)` | Pause/resume auto refresh | paused: boolean |
| `getRefreshPaused()` | Check if refresh paused | none |
### MemberOptions Object
```javascript
{
limit: number, // Max members to return
offset: number, // Skip first N members
accessMode: MemberAccessMode, // MasterData, BookedValues
search: string, // Search string
hierarchyId: string // Specific hierarchy
}
```
### Filter Syntax (MDX)
```javascript
// Single member
"[Version].[parentId].&[public.Actual]"
// Multiple members using array
var members = ["2024", "2025"];
Table_1.getDataSource().setDimensionFilter("Year", members);
// Using MemberInfo objects
var memberInfos = [
{id: "2024", description: "Year 2024"},
{id: "2025", description: "Year 2025"}
];
Table_1.getDataSource().setDimensionFilter("Year", memberInfos);
```
---
## Planning API
Access planning functionality on tables via `getPlanning()`.
### Methods
| Method | Description | Return Type |
|--------|-------------|-------------|
| `isEnabled()` | Check if planning enabled | boolean |
| `setEnabled(enabled)` | Enable/disable planning at runtime | void |
| `getPublicVersions()` | Get all public versions | PlanningPublicVersion[] |
| `getPublicVersion(versionId)` | Get specific public version | PlanningPublicVersion |
| `getPrivateVersion()` | Get current private version | PlanningPrivateVersion |
| `getPrivateVersions()` | Get all user's private versions | PlanningPrivateVersion[] |
| `getPlanningAreaInfo()` | Get planning area information | PlanningAreaInfo |
| `setUserInput(selection, value)` | Set cell value (max 17 chars, use "*" prefix for scaling) | boolean |
| `submitData()` | Submit pending changes | boolean |
| `getDataLocking()` | Get data locking object | DataLocking |
### setUserInput Value Formatting
| Format | Example | Description |
|--------|---------|-------------|
| Raw value | `"1234.567"` | Direct value using user formatting |
| Scale factor | `"*0.5"` | Multiply existing value by 0.5 |
| Scale factor | `"*2"` | Double the existing value |
**Constraints**: Max 17 characters; scaled values max 7 digits.
### PlanningPublicVersion Object
| Property/Method | Description |
|----------------|-------------|
| `id` | Version identifier |
| `description` | Version description |
| `getId()` | Get internal ID (for getData() calls) |
| `getDisplayId()` | Get display ID (for UI dropdowns/texts) |
| `isDirty()` | Check for unsaved changes |
| `startEditMode()` | Start editing (creates private copy) |
| `revert()` | Revert unpublished changes (returns boolean) |
| `publish()` | Publish changes to public (returns boolean) |
| `deleteVersion()` | Delete version (returns boolean, all except 'Actual') |
| `copy(name, option, category?)` | Create private copy of version |
### PlanningPrivateVersion Object
| Property/Method | Description |
|----------------|-------------|
| `id` | Version identifier |
| `description` | Version description |
| `getId()` | Get internal ID |
| `getDisplayId()` | Get display ID |
| `getOwnerID()` | Get user ID of version creator |
| `isDirty()` | Check for unsaved changes |
| `publish()` | Publish to source public version (returns boolean) |
| `publishAs(newName, category)` | Publish as new public version (returns boolean) |
| `revert()` | Discard private version (returns boolean) |
### Version Copy Method
```javascript
copy(newVersionName: string, planningCopyOption: PlanningCopyOption,
versionCategory?: PlanningCategory): boolean
```
### PlanningCopyOptions Enumeration
| Value | Description |
|-------|-------------|
| `PlanningCopyOptions.NoData` | Create new empty version |
| `PlanningCopyOptions.AllData` | Copy all data from source |
| `PlanningCopyOptions.PlanningArea` | Copy only planning area data |
### PlanningCategory Enumeration
| Value | Description |
|-------|-------------|
| `PlanningCategory.Actual` | Historical/actual data (auto-created) |
| `PlanningCategory.Planning` | General planning version |
| `PlanningCategory.Budget` | Budget version |
| `PlanningCategory.Forecast` | Forecast version |
| `PlanningCategory.RollingForecast` | Rolling forecast version |
### DataLocking Object
| Method | Description |
|--------|-------------|
| `getState(selection)` | Get lock state for cells (returns DataLockingState or undefined) |
| `setState(selection, state)` | Set lock state on public versions only (returns boolean) |
| `getOwners(selection)` | Get lock owners |
**getState() Returns undefined when**:
- Selection is invalid
- Cell referenced by selection isn't found
- Cell is in unknown state
- Cell was created using "Add Calculation" at runtime
**setState() Restrictions**:
- Cannot set on private versions
- Cannot set `DataLockingState.Mixed`
- Multiple selections: applies to first selection only
### DataLockingState Enumeration
| Value | Description |
|-------|-------------|
| `DataLockingState.Open` | Data can be edited by anyone |
| `DataLockingState.Restricted` | Only owner can edit |
| `DataLockingState.Locked` | No edits allowed |
| `DataLockingState.Mixed` | Mixed states in selection (read-only, cannot set) |
### Example: Version Management
```javascript
// Get all public versions
var versions = Table_1.getPlanning().getPublicVersions();
for (var i = 0; i < versions.length; i++) {
console.log(versions[i].id + ": " + versions[i].description);
}
// Start edit mode on public version
var budget = Table_1.getPlanning().getPublicVersion("Budget_2025");
budget.startEditMode();
// Work with private version
var privateVer = Table_1.getPlanning().getPrivateVersion();
if (privateVer && privateVer.isDirty()) {
privateVer.publish();
Application.showMessage("Changes published successfully");
}
```
### Example: Data Entry with Lock Check
```javascript
// Get current selection
var selection = Table_1.getSelections()[0];
// Check if locked
var dataLocking = Table_1.getPlanning().getDataLocking();
var lockState = dataLocking.getState(selection);
if (lockState === DataLockingState.Open) {
// Set value (use "*" prefix for factor multiplication)
Table_1.getPlanning().setUserInput(selection, "1000");
Table_1.getPlanning().submitData();
} else if (lockState === DataLockingState.Mixed) {
Application.showMessage("Selection contains mixed lock states");
} else {
Application.showMessage("Data is locked or restricted");
}
```
---
## PlanningModel API
Access planning model for master data operations.
### Methods
| Method | Description | Parameters |
|--------|-------------|------------|
| `getMembers(dimId, options)` | Get dimension members | dimId: string, options: object |
| `getMember(dimId, memberId)` | Get single member | dimId: string, memberId: string |
| `createMembers(dimId, members)` | Create new members | dimId: string, members: MemberData[] |
| `updateMembers(dimId, members)` | Update existing members | dimId: string, members: MemberData[] |
| `deleteMembers(dimId, memberIds)` | Delete members | dimId: string, memberIds: string[] |
### PlanningModelMember Object
```javascript
{
id: string, // Member ID (required)
description: string, // Display text
parentId: string, // Parent in hierarchy
hierarchies: object, // Hierarchy assignments
properties: object, // Custom properties
responsible: string[], // Responsible users
readers: string[], // Read access users
writers: string[], // Write access users
dataLockingOwners: string[] // Data locking owners
}
```
### getMembers() Options
```javascript
var members = PlanningModel_1.getMembers("LOCATION", {
offset: "4", // 0-indexed (4 = 5th member)
limit: "8" // Return 8 members
});
```
### Important Notes for Members on the Fly
**Dimension Type Restriction**: Members can only be added to dimensions of type **"Generic"**. NOT supported for:
- Account
- Version
- Time
- Organization
**Refresh Required**: After creating/updating/deleting members, call refresh for changes to appear in widgets:
```javascript
DataSource.refreshData();
// or
Application.refreshData();
```
**Large Models**: After adding members to very large models (millions of members), repeat refresh after a short delay as operations run asynchronously.
**Custom Property Naming**: Use a prefix for custom properties to avoid conflicts (e.g., `"CUSTOM_Region"`).
**Property Access Rights**:
| Property | Required Right/Access |
|----------|----------------------|
| `dataLockingOwner` | Data Locking Ownership |
| `responsible` | Responsible |
| `readers` | Data Access Control |
| `writers` | Data Access Control |
### Example: Master Data Management
```javascript
// Get all cost centers with properties
var costCenters = PlanningModel_1.getMembers("CostCenter", {
limit: 5000
});
// Create new cost center with security
PlanningModel_1.createMembers("CostCenter", [{
id: "CC_NEW_001",
description: "New Cost Center",
parentId: "CC_PARENT",
properties: {
"CUSTOM_Status": "Active",
"CUSTOM_Region": "EMEA"
},
responsible: ["USER1"],
writers: ["USER1", "USER2"],
dataLockingOwners: [{
id: "USER1",
type: UserType.User
}]
}]);
// Refresh to see new member
Application.refreshData();
```
### UserType Enumeration
| Value | Description |
|-------|-------------|
| `UserType.User` | Individual user |
---
## Data Actions API
Execute data actions programmatically.
### Methods
| Method | Description |
|--------|-------------|
| `execute()` | Execute synchronously |
| `executeInBackground()` | Execute asynchronously |
| `setParameterValue(paramId, value)` | Set parameter value |
| `getParameterValue(paramId)` | Get parameter value |
| `isAllMembersSelected(paramId)` | Check if all members selected |
| `setAllMembersSelected(paramId, selected)` | Select/deselect all members |
### Events
| Event | Description |
|-------|-------------|
| `onExecutionStatusUpdate` | Status changed during execution |
| `onExecutionComplete` | Execution finished |
### DataActionTrigger Widget Events
| Event | Description |
|-------|-------------|
| `onBeforeExecute` | Called when user clicks trigger. Return `true` to execute, `false` to cancel |
```javascript
// DataActionTrigger onBeforeExecute event
onBeforeExecute(): boolean {
// Check data locks before execution
var selection = Table_1.getSelections()[0];
var lockState = Table_1.getPlanning().getDataLocking().getState(selection);
if (lockState === DataLockingState.Locked) {
Application.showMessage("Cannot execute - data is locked");
return false; // Cancel execution
}
return true; // Allow execution
}
```
---
## Multi Actions API
Execute multi actions for orchestrated operations.
### Methods
| Method | Description |
|--------|-------------|
| `execute()` | Execute multi action |
| `executeInBackground()` | Execute asynchronously |
| `setParameterValue(paramId, value)` | Set cross-step parameter |
| `getParameterValue(paramId)` | Get parameter value |
| `isAllMembersSelected(paramId)` | Check if all members selected |
| `setAllMembersSelected(paramId, selected)` | Select/deselect all members |
---
## Calendar Integration API
Manage planning calendar tasks and processes programmatically.
### CalendarIntegration
Main entry point for calendar operations.
| Method | Description |
|--------|-------------|
| `getProcess(processId)` | Get calendar process |
| `getTask(taskId)` | Get calendar task |
| `createGeneralTask(config)` | Create general task |
| `createReviewTask(config)` | Create review task |
| `createCompositeTask(config)` | Create composite task |
### CalendarProcess
| Method | Description |
|--------|-------------|
| `getId()` | Get process ID |
| `getName()` | Get process name |
| `getDescription()` | Get process description |
| `getStatus()` | Get process status |
| `getTasks()` | Get all tasks in process |
| `activate()` | Activate process |
| `complete()` | Mark process complete |
### CalendarEvent (Base for Tasks)
| Method | Description |
|--------|-------------|
| `getId()` | Get event ID |
| `getDescription()` | Get description |
| `getStatus()` | Get current status |
| `setProgress(progress)` | Set completion progress |
| `getProgress()` | Get completion progress |
| `getAssignees()` | Get assigned users |
| `getDueDate()` | Get due date |
### CalendarCompositeTask
Supports multi-reviewer approval workflows.
| Method | Description |
|--------|-------------|
| `getReviewers()` | Get all reviewers |
| `addReviewer(userId)` | Add reviewer |
| `removeReviewer(userId)` | Remove reviewer |
| `submit()` | Submit for review |
| `approve()` | Approve task |
| `reject(comment)` | Reject with comment |
### CalendarReviewTask
| Method | Description |
|--------|-------------|
| `approve()` | Approve submission |
| `reject(comment)` | Reject with comment |
| `getReviewStatus()` | Get review status |
---
## BPC Planning Sequence API
Integrate with SAP BPC planning sequences.
### BpcPlanningSequence
| Method | Description |
|--------|-------------|
| `execute()` | Execute planning sequence |
| `openPromptDialog()` | Open variable prompt dialog |
| `getBpcPlanningSequenceDataSource()` | Get associated data source |
| `setParameterValue(paramId, value)` | Set parameter value |
| `getParameterValue(paramId)` | Get parameter value |
### BpcPlanningSequence Events
| Event | Description |
|-------|-------------|
| `onBeforeExecute` | Called when user clicks trigger. Return `true` to execute, `false` to cancel |
```javascript
// onBeforeExecute event handler
onBeforeExecute(): boolean {
// Validate before execution
if (!isUserAuthorized()) {
Application.showMessage("Not authorized");
return false; // Cancel execution
}
return true; // Allow execution
}
```
---
## Widget APIs
### Table Widget
| Method | Description |
|--------|-------------|
| `getPlanning()` | Get planning object |
| `getDataSource()` | Get data source |
| `getSelections()` | Get selected cells |
| `addDimensionToRows(dimId)` | Add dimension to rows |
| `addDimensionToColumns(dimId)` | Add dimension to columns |
| `removeDimension(dimId)` | Remove dimension |
| `setVisible(visible)` | Show/hide table |
| `setCompactDisplayEnabled(enabled)` | Enable compact display |
| `setZeroSuppressionEnabled(enabled)` | Enable zero suppression |
| `getNumberFormat()` | Get number format settings |
| `rankBy(measure, order, count)` | Apply ranking |
| `sortByValue(measure, order)` | Sort by measure |
| `sortByMember(dimId, order)` | Sort by member |
| `openNavigationPanel()` | Open navigation panel |
| `closeNavigationPanel()` | Close navigation panel |
| `getActiveDimensionProperties()` | Get active dimension properties |
### Chart Widget
| Method | Description |
|--------|-------------|
| `getDataSource()` | Get data source |
| `addDimension(dimId)` | Add dimension |
| `removeDimension(dimId)` | Remove dimension |
| `addMeasure(measureId)` | Add measure |
| `removeMeasure(measureId)` | Remove measure |
| `addMember(dimId, memberId)` | Add member to dimension |
| `removeMember(dimId, memberId)` | Remove member |
| `setVisible(visible)` | Show/hide chart |
| `getNumberFormat()` | Get number format |
| `setAxisScale(axis, scale)` | Set axis scale |
| `getEffectiveAxisScale(axis)` | Get effective axis scale |
| `getForecast()` | Get forecast data |
| `getDataChangeInsights()` | Get variance insights |
| `setQuickActionsVisibility(visible)` | Show/hide quick actions |
| `setContextMenuVisible(visible)` | Show/hide context menu |
| `openInNewStory()` | Open in new story |
### GeoMap Widget
| Method | Description |
|--------|-------------|
| `getLayer(layerId)` | Get map layer |
| `setContextMenuVisible(visible)` | Show/hide context menu |
| `setQuickActionsVisibility(visible)` | Show/hide quick actions |
| `openInNewStory()` | Open in new story |
### Input Controls
**Dropdown**:
| Method | Description |
|--------|-------------|
| `getSelectedKey()` | Get selected value |
| `setSelectedKey(key)` | Set selected value |
| `getSelectedText()` | Get selected text |
| `addItem(key, text)` | Add item |
| `removeItem(key)` | Remove item |
| `removeAllItems()` | Clear all items |
**ListBox** (Multi-select):
| Method | Description |
|--------|-------------|
| `getSelectedKeys()` | Get selected values |
| `setSelectedKeys(keys)` | Set selected values |
| `getSelectedTexts()` | Get selected texts |
**CheckboxGroup**:
| Method | Description |
|--------|-------------|
| `getSelectedKeys()` | Get checked items |
| `setSelectedKeys(keys)` | Set checked items |
**RadioButtonGroup**:
| Method | Description |
|--------|-------------|
| `getSelectedKey()` | Get selected option |
| `setSelectedKey(key)` | Set selected option |
**Slider/RangeSlider**:
| Method | Description |
|--------|-------------|
| `getValue()` / `getRange()` | Get current value |
| `setValue(val)` / `setRange(range)` | Set value |
**Switch**:
| Method | Description |
|--------|-------------|
| `isOn()` | Check if switch is on |
| `setOn(on)` | Set switch state |
### Container Widgets
**Panel/FlowPanel**:
| Method | Description |
|--------|-------------|
| `showBusyIndicator()` | Show busy indicator |
| `hideBusyIndicator()` | Hide busy indicator |
| `moveWidget(widget, position)` | Move widget |
**PageBook**:
| Method | Description |
|--------|-------------|
| `getPage(pageId)` | Get specific page |
| `setSelectedKey(pageId)` | Switch to page |
| `getSelectedKey()` | Get current page |
**TabStrip**:
| Method | Description |
|--------|-------------|
| `getTab(tabId)` | Get specific tab |
| `setSelectedKey(tabId)` | Switch to tab |
| `getSelectedKey()` | Get current tab |
**Popup**:
| Method | Description |
|--------|-------------|
| `open()` | Open popup |
| `close()` | Close popup |
| `setTitle(title)` | Set popup title |
---
## Advanced Analytics APIs
### DataChangeInsights
Change detection and trend analysis.
| Method | Description |
|--------|-------------|
| `compareApplicationStateWithSnapshot(date)` | Compare current with snapshot |
| `compareSnapshots(date1, date2)` | Compare two snapshots |
| `saveSnapshot()` | Save current state as snapshot |
| `listRecentSnapshotDates()` | List available snapshots |
| `openSubscriptionDialog()` | Open subscription dialog |
| `isRunBySnapshotGeneration()` | Check if run by snapshot |
### SearchToInsight
Natural language analytics.
| Method | Description |
|--------|-------------|
| `openDialog()` | Open search dialog |
| `closeDialog()` | Close search dialog |
| `applySearchToChart(query, chart)` | Apply search to chart |
**SearchToInsightMode**: `Simple`, `Advanced`
### SmartDiscovery
Automated insight generation.
| Method | Description |
|--------|-------------|
| `setDimensionSettings(settings)` | Configure dimensions |
| `setMeasureSettings(settings)` | Configure measures |
| `setFilterSettings(settings)` | Configure filters |
| `setPanelVisible(visible)` | Show/hide panel |
### Bookmarks
**BookmarkSet**:
| Method | Description |
|--------|-------------|
| `save(name)` | Save new bookmark |
| `apply(bookmarkId)` | Apply bookmark |
| `getAll()` | Get all bookmarks |
| `deleteBookmark(bookmarkId)` | Delete bookmark |
| `getAppliedBookmark()` | Get currently applied |
| `isSameAsApplicationState(bookmarkId)` | Compare with current |
---
## Export APIs
### ExportPdf
| Method | Description |
|--------|-------------|
| `setFileName(name)` | Set output file name |
| `setPageSize(size)` | Set page size (A4, A3, Letter, etc.) |
| `setPageOrientation(orientation)` | Portrait or Landscape |
| `setHeaderText(text)` | Set header text |
| `setFooterText(text)` | Set footer text |
| `exportReport()` | Export as PDF |
| `exportView()` | Export current view |
### ExportExcel
| Method | Description |
|--------|-------------|
| `setFileName(name)` | Set output file name |
| `isExportFormattedValues()` | Check if exporting formatted |
| `setIndentedHierarchy(enabled)` | Enable indented hierarchy |
| `exportReport()` | Export as Excel |
### ExportCsv
| Method | Description |
|--------|-------------|
| `setFileName(name)` | Set output file name |
| `setScope(scope)` | Set export scope |
| `isHierarchyLevelsInIndividualCells()` | Check hierarchy export |
| `exportReport()` | Export as CSV |
### ExportPptx
| Method | Description |
|--------|-------------|
| `setFileName(name)` | Set output file name |
| `setPageRange(range)` | Set pages to export |
| `isAppendixVisible()` | Check appendix setting |
| `exportView()` | Export as PowerPoint |
---
## Utility Classes
### ConvertUtils
| Method | Description |
|--------|-------------|
| `stringToInteger(str)` | Convert string to integer |
| `stringToNumber(str)` | Convert string to float |
| `numberToString(num)` | Convert number to string |
### ArrayUtils
| Method | Description |
|--------|-------------|
| `create(type, size)` | Create typed array |
### StringUtils
| Method | Description |
|--------|-------------|
| `replaceAll(str, search, replace)` | Replace all occurrences |
### NavigationUtils
| Method | Description |
|--------|-------------|
| `openStory(storyId)` | Open another story |
| `createStoryUrl(storyId)` | Create story URL |
| `openApplication(appId)` | Open another application |
| `createApplicationUrl(appId)` | Create application URL |
| `openDataAnalyzer(config)` | Open Data Analyzer |
| `openUrl(url)` | Open external URL |
### DateFormat
```javascript
// Format date
var formatted = DateFormat.format(new Date(), "yyyy-MM-dd");
```
### NumberFormat
| Property | Values |
|----------|--------|
| `scaleUnit` | Thousand, Million, Billion, AutoFormatted, Unformatted |
| `scaleFormat` | Short, Long, Default |
| `signDisplay` | Default, MinusAsPrefix, MinusAsParentheses, PlusMinusAsPrefix |
### TimeRange
| Method | Description |
|--------|-------------|
| `create(start, end, granularity)` | Create time range |
| `createMonthRange(year, month)` | Create month range |
| `createWeekRange(year, week)` | Create week range |
| `createYearRange(year)` | Create year range |
**Granularity**: Day, Month, Year, Hour, Minute, Second, Quarter, HalfYear, Millisecond
---
## Data Types and Structures
### DimensionInfo
```javascript
{
id: string,
description: string,
modelId: string
}
```
### MemberInfo
```javascript
{
id: string,
displayId: string,
description: string,
dimensionId: string,
properties: object
}
```
### ResultMemberInfo
```javascript
{
id: string,
parentId: string,
description: string,
properties: object
}
```
### DataCell
```javascript
{
rawValue: number,
formattedValue: string
}
```
### Filter Values
**SingleFilterValue**:
```javascript
{ value: string, description: string, exclude: boolean }
```
**MultipleFilterValue**:
```javascript
{ values: string[], descriptions: string[], exclude: boolean }
```
**RangeFilterValue**:
```javascript
{
from: any, to: any,
greater: boolean, greaterOrEqual: boolean,
less: boolean, lessOrEqual: boolean
}
```
---
## Enumerations
### ApplicationMode
`View`, `Present`, `Embed`
### ApplicationMessageType
`Info`, `Success`, `Warning`, `Error`
### MemberAccessMode
`MasterData`, `BookedValues`
### DataLockingState
`Open`, `Restricted`, `Locked`, `Mixed`
### SortOrder
`Ascending`, `Descending`, `Default`
### RankOrder
`Top`, `Bottom`
### ForecastType
`Auto`, `None`, `TripleExponentialSmoothing`
### ExportScope
`PointOfView`, `All`
### PageOrientation
`Portrait`, `Landscape`
### PageSize
`A4`, `A3`, `A5`, `Letter`, `Legal`, `Auto`
### MemberDisplayMode
`DisplayId`, `Description`, `DisplayIdAndDescription`
### Direction
`Horizontal`, `Vertical`
### DeviceOrientation
`Angle0`, `Angle90Clockwise`, `Angle180`, `Angle90Counterclockwise`
### LayoutUnit
`Pixel`, `Percent`, `Grid`, `Auto`
---
## Quick Reference Cheat Sheet
```javascript
// === APPLICATION ===
Application.showBusyIndicator();
Application.hideBusyIndicator();
Application.showMessage("text", ApplicationMessageType.Success);
Application.getUserInfo();
Application.getTeamsInfo();
Application.sendNotification({title: "Alert", receivers: ["USER1"]});
// === DATA SOURCE ===
Table_1.getDataSource().getDimensions();
Table_1.getDataSource().getHierarchies("CostCenter");
Table_1.getDataSource().getMembers("Dim", {accessMode: MemberAccessMode.BookedValues});
Table_1.getDataSource().setDimensionFilter("Dim", "value");
Table_1.getDataSource().removeDimensionFilter("Dim");
Table_1.getDataSource().setRefreshPaused(true);
// === PLANNING ===
Table_1.getPlanning().isEnabled();
Table_1.getPlanning().getPublicVersions();
Table_1.getPlanning().getPrivateVersion();
Table_1.getPlanning().getPlanningAreaInfo();
Table_1.getPlanning().setUserInput(selection, "value");
Table_1.getPlanning().submitData();
// === VERSION MANAGEMENT ===
var publicVer = Table_1.getPlanning().getPublicVersion("Budget");
publicVer.startEditMode();
publicVer.isDirty();
publicVer.publish();
var privateVer = Table_1.getPlanning().getPrivateVersion();
privateVer.publish();
privateVer.publishAs("Budget_v2", "Revised Budget");
// === DATA LOCKING ===
var dataLocking = Table_1.getPlanning().getDataLocking();
var state = dataLocking.getState(selection);
// States: Open, Restricted, Locked, Mixed
dataLocking.setState(selection, DataLockingState.Locked);
// === PLANNING MODEL ===
PlanningModel_1.getMembers("Dim");
PlanningModel_1.createMembers("Dim", [{id: "X", description: "Y"}]);
PlanningModel_1.updateMembers("Dim", [{id: "X", description: "Z"}]);
PlanningModel_1.deleteMembers("Dim", ["X"]);
// === DATA ACTIONS ===
DataAction_1.setParameterValue("Param", "Value");
DataAction_1.execute();
DataAction_1.executeInBackground();
// === MULTI ACTIONS ===
MultiAction_1.setParameterValue("Param", "Value");
MultiAction_1.execute();
// === EXPORTS ===
ExportPdf.setFileName("report");
ExportPdf.setPageOrientation(PageOrientation.Landscape);
ExportPdf.exportReport();
// === CONVERSIONS ===
ConvertUtils.stringToInteger("123");
ConvertUtils.numberToString(123);
```
---
**Documentation Links**:
- Full API Reference (2025.23): [https://help.sap.com/doc/958d4c11261f42e992e8d01a4c0dde25/2025.23/en-US/index.html](https://help.sap.com/doc/958d4c11261f42e992e8d01a4c0dde25/2025.23/en-US/index.html)
- SAP Analytics Cloud Help: [https://help.sap.com/docs/SAP_ANALYTICS_CLOUD](https://help.sap.com/docs/SAP_ANALYTICS_CLOUD)
- SAP Community: [https://community.sap.com/topics/sap-analytics-cloud](https://community.sap.com/topics/sap-analytics-cloud)