Files
gh-secondsky-sap-skills-ski…/SKILL.md.backup
2025-11-30 08:55:33 +08:00

839 lines
29 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: sap-sac-scripting
description: |
Comprehensive SAC scripting skill for Analytics Designer and Optimized Story Experience. Use when building analytic applications, planning models, or enhanced stories. Covers DataSource API, Chart/Table manipulation, Planning operations, Calendar integration, Bookmarks, Timer API, Container widgets, Layout API, R Visualizations, Custom Widgets, Navigation, variables, event handlers, debugging, performance optimization, and 2025.23 features: comments APIs, Search to Insight, smart grouping, time-series forecast, geo map quick menus, Explorer/Smart Insights, composites scripting. Includes 40 code templates.
license: GPL-3.0
metadata:
version: 1.7.0
last_verified: 2025-11-27
sac_version: "2025.23"
api_reference_version: "2025.14"
documentation_source: https://help.sap.com/docs/SAP_ANALYTICS_CLOUD
reference_files: 52
template_patterns: 40
status: production
---
# SAP Analytics Cloud Scripting Skill
Comprehensive skill for scripting in SAP Analytics Cloud (SAC) Analytics Designer and Optimized Story Experience.
---
## Whats New (2025.23)
- Time series forecast API for time-series/line charts (`references/time-series-forecast.md`).
- Search to Insight technical object with dialog/apply-to-chart APIs (`references/search-to-insight.md`).
- Widget/table comments APIs (`references/comments.md`).
- Smart grouping for bubble/scatter charts (`references/smart-grouping.md`).
- Explorer & Smart Insights launch/apply patterns (`references/explorer-smart-insights.md`).
- Geo map quick menus and scripting hooks (`references/geomap.md`).
- Composite scripting and composite feature restrictions (`references/composites-scripting.md`, `references/composites-restrictions.md`).
- Blending limitations and Analytics Designer known restrictions (`references/blending-limitations.md`, `references/analytics-designer-restrictions.md`).
- Authentication-required Help Portal page logged for awareness (`references/auth-required.md`).
---
## When to Use This Skill
Use this skill when working on tasks involving:
**Analytics Designer Development**:
- Creating analytic applications with interactive dashboards
- Building planning applications for data entry and forecasting
- Writing event handler scripts (onInitialization, onSelect, onResultChanged)
- Implementing widget interactions (charts, tables, input controls)
- Managing data sources and applying filters programmatically
**Optimized Story Experience**:
- Enhancing stories with scripting capabilities
- Adding interactivity to existing stories
- Implementing custom business logic
- Creating dynamic visualizations
**Data Operations**:
- Filtering and manipulating data sources
- Reading dimension members and measure values
- Working with hierarchies and selections
- Implementing data actions and multi-actions
**Planning Operations**:
- Managing planning versions (public/private)
- Publishing and copying versions
- Handling data locking
- Implementing data entry workflows
**UI/UX Enhancements**:
- Creating popups and dialogs
- Managing widget visibility
- Implementing dynamic navigation
- Building responsive applications
- Using container widgets (Panel, TabStrip, PageBook, Flow Layout)
- Implementing Layout API for dynamic sizing/positioning
- Adding/exposing comments on widgets and table cells (`references/comments.md`)
- Applying dynamic text via script variables (`references/text-widget.md`)
- Using geo maps with quick menu control and scripted layers (`references/geomap.md`)
- Binding widget values to variables (`references/bind-widget-values.md`)
- Using input fields/text areas and sliders/range sliders (`references/input-fields.md`, `references/sliders.md`)
- Bookmark settings, APIs, and bookmark sets (`references/bookmark-settings.md`, `references/bookmark-set-tech-object.md`)
**Calendar & Workflow Integration**:
- Creating and managing calendar tasks and processes
- Implementing approval workflows (submit, approve, reject)
- Adding reminders and notifications
- Integrating with planning calendar events
**Bookmarks & State Management**:
- Saving and restoring application state
- Creating global and personal bookmarks
- URL parameter integration
- Linked Analysis for cross-widget filtering
**Advanced Features**:
- Timer-based operations and animations
- R Visualizations for specialized charts
- Custom Widget development
- Cross-application navigation
- Search to Insight technical object, dialog control, apply-to-chart (`references/search-to-insight.md`)
- Time-series forecast enablement on charts (`references/time-series-forecast.md`)
- Smart grouping for correlation charts (`references/smart-grouping.md`)
- Explorer & Smart Insights launch and application patterns (`references/explorer-smart-insights.md`)
- Scripting inside composites (`references/composites-scripting.md`)
- Pattern-based functions for ML-driven text pattern detection (`references/pattern-functions.md`)
**Technical Objects & Actions**:
- Data actions, multi actions, and planning model technical objects (`references/data-actions-tech-object.md`, `references/multi-actions-tech-object.md`, `references/planning-model-tech-object.md`)
- Calendar integration, data change insights, timer, text pool (`references/calendar-integration-tech-object.md`, `references/data-change-insights-tech-object.md`, `references/timer-tech-object.md`, `references/text-pool-tech-object.md`)
- Export technical objects for PDF/PowerPoint (`references/export-pdf-tech-object.md`, `references/export-ppt-tech-object.md`)
- OData service integration (`references/odata-service.md`)
- Bookmark set technical object (`references/bookmark-set-tech-object.md`)
- onAfterDataEntryProcess event handling for tables (`references/on-after-data-entry-process.md`)
- MemberInfo performance guidance (`references/memberinfo-performance.md`)
**Debugging & Optimization**:
- Debugging scripts with console.log and debugger statement
- Optimizing application performance
- Troubleshooting runtime errors
- Script editor basics (`references/script-editor.md`) and value help (`references/value-help.md`)
- Optimize type libraries and automatic refactoring tools (`references/optimize-type-libraries.md`, `references/automatic-refactoring.md`)
- Check errors/references and debug mode with breakpoints (`references/check-errors.md`, `references/check-references.md`, `references/debug-scripts.md`)
- Script performance popup for runtime profiling (`references/script-performance-popup.md`)
---
## Quick Start
### Script Editor Access
1. **Analytics Designer**: Open application in edit mode → Select widget → Click Scripts tab
2. **Optimized Story Experience**: Enable Advanced Mode → Select widget → Add script
### Basic Script Structure
```javascript
// Event handler script (e.g., onSelect of a chart)
var selections = Chart_1.getSelections();
if (selections.length > 0) {
var selectedMember = selections[0]["Location"];
Table_1.getDataSource().setDimensionFilter("Location", selectedMember);
}
```
### Script Types
1. **Event Handlers**: Triggered by widget events (onSelect, onClick, onResultChanged)
2. **Application Events**: onInitialization, onResize, onOrientationChange
3. **Script Objects**: Reusable functions callable from any event handler
---
## Core Concepts
### 1. Variables
**Local Variables** (within event handler):
```javascript
var myString = "Hello";
var myNumber = 42;
var myBoolean = true;
var myArray = ["a", "b", "c"];
```
**Global Variables** (across entire application):
- Create via Outline panel → Global Variables → (+)
- Types: String, Integer, Number, Boolean (can be arrays)
- Access from any script: `GlobalVariable_1 = "value";`
**URL Parameters**:
- Prefix global variable name with `p_` to pass via URL
- URL format: `?p_myVariable=value`
### 2. DataSource API
Central API for data access. Get reference via widgets:
```javascript
var ds = Chart_1.getDataSource();
var ds = Table_1.getDataSource();
```
**Key Methods**:
| Method | Description |
|--------|-------------|
| `getDimensions()` | Returns all dimensions |
| `getMeasures()` | Returns all measures |
| `getMembers(dimensionId, options)` | Returns dimension members |
| `getData(selection)` | Returns data values |
| `getResultSet()` | Returns current result set (no backend trip) |
| `setDimensionFilter(dimension, value)` | Sets filter on dimension |
| `removeDimensionFilter(dimension)` | Removes filter |
| `getDimensionFilters(dimension)` | Gets current filters |
| `refreshData()` | Refreshes data from backend |
| `getVariables()` | Returns model variables |
| `setVariableValue(variable, value)` | Sets variable value |
**Reference**: See `references/api-datasource.md` for complete DataSource API.
### 3. Widget APIs
**Chart**:
```javascript
Chart_1.addDimension(Feed.CategoryAxis, "Location");
Chart_1.addMeasure(Feed.ValueAxis, "[Account].[parentId].&[Revenue]");
Chart_1.removeMember(Feed.ValueAxis, measureId);
var selections = Chart_1.getSelections();
Chart_1.setVisible(true);
```
**Table**:
```javascript
Table_1.addDimensionToRows("Product");
Table_1.addDimensionToColumns("Date");
Table_1.setZeroSuppressionEnabled(true);
var selections = Table_1.getSelections();
```
**Reference**: See `references/api-widgets.md` for complete widget APIs.
### 4. Planning API
Access via table widget:
```javascript
var planning = Table_1.getPlanning();
```
**Version Management**:
```javascript
// Get public version
var publicVersion = planning.getPublicVersion("Budget2024");
// Get private version
var privateVersion = planning.getPrivateVersion("myDraft");
// Check for unsaved changes
if (publicVersion.isDirty()) {
publicVersion.publish();
}
// Copy version
sourceVersion.copy("NewVersion", PlanningCopyOption.AllData, PlanningCategory.Budget);
```
**Data Locking**:
```javascript
var selection = Table_1.getSelections()[0];
var lockState = planning.getDataLocking().getState(selection);
```
**Reference**: See `references/api-planning.md` for complete Planning API.
### 5. Application API
Global Application object:
```javascript
// User feedback
Application.showBusyIndicator();
Application.hideBusyIndicator();
// Messages
Application.showMessage(ApplicationMessageType.Info, "Operation completed");
// Application info
var appInfo = Application.getInfo();
var userInfo = Application.getUserInfo();
// Theme
var theme = Application.getTheme();
```
### 6. Events
**Application Events**:
- `onInitialization`: Runs once when application loads
- `onPostMessageReceived`: Fires when host app sends PostMessage (iFrame scenarios)
- `onResize`: Fires when application is resized
- `onOrientationChange`: Mobile orientation change
**Widget Events**:
- `onSelect`: User selects data point (Chart, Table)
- `onResultChanged`: Data in widget changes
- `onClick`: Button click, etc.
**Best Practice**: Keep `onInitialization` empty for performance. Use static filters instead.
**iFrame Embedding**: See `references/iframe-embedding-lumira-migration.md` for PostMessage integration.
---
## Common Patterns
### Filter Data Based on Selection
```javascript
// onSelect event of Chart_1
var selections = Chart_1.getSelections();
if (selections.length > 0) {
var selectedLocation = selections[0]["Location"];
Table_1.getDataSource().setDimensionFilter("Location", selectedLocation);
}
```
### Find Active Version from Attribute
```javascript
var allVersions = PlanningModel_1.getMembers("Version");
var activeVersion = "";
for (var i = 0; i < allVersions.length; i++) {
if (allVersions[i].properties.Active === "X") {
activeVersion = allVersions[i].id;
break;
}
}
console.log("Active Version: " + activeVersion);
```
### Dynamic Measure Swap
```javascript
// Get current measure
var currentMeasure = Chart_1.getMembers(Feed.ValueAxis);
// Remove current measure
Chart_1.removeMember(Feed.ValueAxis, currentMeasure[0]);
// Add new measure
Chart_1.addMember(Feed.ValueAxis, "[Account].[parentId].&[NewMeasure]");
```
### Switch Between Chart and Table
```javascript
// Show chart, hide table
Chart_1.setVisible(true);
Table_1.setVisible(false);
Button_ShowTable.setVisible(true);
Button_ShowChart.setVisible(false);
```
### Pause and Resume Refresh
```javascript
// Pause before multiple operations
Chart_1.getDataSource().setRefreshPaused(true);
Table_1.getDataSource().setRefreshPaused(true);
// Apply multiple filters
Chart_1.getDataSource().setDimensionFilter("Year", "2024");
Chart_1.getDataSource().setDimensionFilter("Region", "EMEA");
// Resume refresh (single backend call)
Chart_1.getDataSource().setRefreshPaused(false);
Table_1.getDataSource().setRefreshPaused(false);
```
### Get Booked Values Only
```javascript
var members = Table_1.getDataSource()
.getMembers("Dimension", {accessMode: MemberAccessMode.BookedValues});
```
**Reference**: See `templates/common-patterns.js` for more patterns.
---
## Debugging
### Console Logging
```javascript
console.log("Variable value:", myVariable);
console.log("Selections:", Chart_1.getSelections());
```
**Access Console**:
1. Run application
2. Press F12 or Ctrl+Shift+J
3. Go to Console tab
4. Filter by "Info" type
5. Expand "sandbox.worker.main.*.js" for your logs
### Debugger Statement
```javascript
debugger; // Execution pauses here
var value = getData();
```
**Enable Debug Mode**:
1. Add `;debug=true` to application URL
2. Open Developer Tools (F12)
3. Go to Sources tab
4. Find code in "sandbox worker main" file
### Performance Logging
Add URL parameter: `?APP_PERFORMANCE_LOGGING=true`
```javascript
// In console
window.sap.raptr.getEntriesByMarker("(Application)")
.filter(e => e.entryType === 'measure')
.sort((a,b) => (a.startTime + a.duration) - (b.startTime + b.duration));
```
### Error Handling
```javascript
try {
var data = Table_1.getDataSource().getData(selection);
// Process data
} catch (error) {
console.log("Error:", error);
Application.showMessage(ApplicationMessageType.Error, "Operation failed");
}
```
---
## Performance Best Practices
### 1. Minimize Backend Trips
```javascript
// GOOD: getResultSet() - no backend trip
var resultSet = Chart_1.getDataSource().getResultSet();
// AVOID: getMembers() - always hits backend
var members = Chart_1.getDataSource().getMembers("Dimension");
```
### 2. Batch Filter Operations
```javascript
// GOOD: Pause refresh, apply multiple filters, resume
ds.setRefreshPaused(true);
ds.setDimensionFilter("Dim1", value1);
ds.setDimensionFilter("Dim2", value2);
ds.setDimensionFilter("Dim3", value3);
ds.setRefreshPaused(false);
// AVOID: Each filter triggers refresh
ds.setDimensionFilter("Dim1", value1); // Refresh
ds.setDimensionFilter("Dim2", value2); // Refresh
ds.setDimensionFilter("Dim3", value3); // Refresh
```
### 3. Copy Filters Efficiently
```javascript
// GOOD: Copy all filters at once
Table_1.getDataSource().copyDimensionFilterFrom(Chart_1.getDataSource());
// AVOID: Set each filter individually
var filters = Chart_1.getDataSource().getDimensionFilters("Dim1");
Table_1.getDataSource().setDimensionFilter("Dim1", filters[0].value);
```
### 4. Empty onInitialization
```javascript
// AVOID: Heavy operations in onInitialization
// This blocks application startup
// GOOD: Use URL parameters for initial values
// Use static widget filters instead of script filters
// Load invisible widgets in background
```
### 5. Cache DataSource References
```javascript
// GOOD: Cache reference outside loop
var ds = Table_1.getDataSource();
for (var i = 0; i < items.length; i++) {
ds.setDimensionFilter("Dim", items[i]);
}
// AVOID: Get reference inside loop
for (var i = 0; i < items.length; i++) {
Table_1.getDataSource().setDimensionFilter("Dim", items[i]);
}
```
---
## Developer Best Practices
Maintainable SAC stories require consistent conventions. Key principles:
### 1. Naming Conventions
Use prefixes to identify widget types at a glance:
| Widget Type | Prefix | Example |
|-------------|--------|---------|
| Bar Chart | `chartB_` | `chartB_revenue_by_state` |
| Line Chart | `chartL_` | `chartL_margin_by_product` |
| Table | `tbl_` | `tbl_invoices_by_month` |
| Panel | `pnl_` | `pnl_header` |
| Button | `btn_` | `btn_export_pdf` |
| Dropdown | `ddl_` | `ddl_product` |
| KPI/Numeric | `kpi_` | `kpi_actuals_vs_budget` |
### 2. Layout Organization
- Group related widgets in panels
- Order widgets in Outline view: top→bottom, left→right
- Use panel visibility for show/hide sections:
```javascript
// Hide entire section instead of individual widgets
pnl_details.setVisible(false);
```
### 3. Script Annotation
Add summary + line-level comments to all scripts:
```javascript
/*
* Script: onSelect - chartB_revenue_by_region
* Purpose: Filter detail table when user selects a region
* Dependencies: chartB_revenue_by_region, tbl_transactions
*/
// Get user's selection from the chart
var selections = chartB_revenue_by_region.getSelections();
```
### 4. Design Tips
- **Disable Panel Auto Scroll**: Prevents unwanted scroll bars
- **Avoid Flow Panels**: Fixed layouts are easier to maintain
- **Use % for Left/Right**: Change from px to % after layout is finalized for responsive sizing
**Full Reference**: See `references/best-practices-developer.md` for complete naming table and patterns.
**Source**: [SAP Community - Building Stories That Other Developers Actually Want to Inherit](https://community.sap.com/t5/technology-blog-posts-by-members/building-stories-that-other-developers-actually-want-to-inherit/ba-p/14168133)
---
## Planning Story Architecture
For complex planning processes, use multi-story architecture with a central entry point.
### Key Principles
1. **Entry Point Design**: Create overview page with KPI tiles and organized navigation sections
2. **Multi-Story Separation**: One story per planning phase, stored in folder structure
3. **Script-Based Navigation**: Use `NavigationUtils.openStory()` instead of hyperlinks
4. **User Assistance**: Consistent sidebar with filters, step-by-step instructions, external links
5. **Guided Process**: "Guide Me!" popup for focused step-by-step workflow
6. **Button Color Coding**: Green (positive), Red (negative), Blue (neutral)
### Navigation Script Pattern
```javascript
// Navigate to target story with page and mode parameters
var urlParameters = ArrayUtils.create(Type.UrlParameter);
urlParameters.push(UrlParameter.create("mode", "view"));
urlParameters.push(UrlParameter.create("page", "0"));
NavigationUtils.openStory(storyId, "", urlParameters, false);
```
### Folder Organization
```
Planning_Application/
├── 00_Entry_Point.story
├── 01_Configuration.story
├── 02_Plan_FTE.story
├── 03_Plan_Costs.story
└── 04_Reports.story
```
**Full Reference**: See `references/best-practices-planning-stories.md` for complete patterns including sidebar design, guided process popup implementation, and button guidelines.
**Source**: [SAP PRESS - Best Practices for Planning Stories](https://blog.sap-press.com/best-practices-for-planning-stories-in-sap-analytics-cloud)
---
## Popups and Dialogs
### Create Popup
1. Outline panel → Popups → (+)
2. Add widgets to popup (tables, charts, buttons)
3. Optionally enable header/footer for dialog style
### Show/Hide Popup
```javascript
// Show popup
Popup_1.open();
// Hide popup
Popup_1.close();
```
### Busy Indicator
```javascript
Application.showBusyIndicator();
// Perform operations
Table_1.getDataSource().refreshData();
Application.hideBusyIndicator();
```
---
## Utility Functions
### Type Conversion
```javascript
// String to Integer
var num = ConvertUtils.stringToInteger("42");
// Number to String
var str = ConvertUtils.numberToString(42);
```
### Array Operations
```javascript
// ArrayUtils available for common operations
var arr = [1, 2, 3];
```
### Date Formatting
```javascript
// DateFormat utility
var formatted = DateFormat.format(dateValue, "yyyy-MM-dd");
```
---
## Script Objects (Reusable Functions)
Create reusable functions not tied to specific events:
1. Outline panel → Script Objects → (+)
2. Add functions to script object
3. Call from any event: `ScriptObject_1.myFunction(param);`
```javascript
// In ScriptObject_1
function applyStandardFilters(dataSource, year, region) {
dataSource.setDimensionFilter("Year", year);
dataSource.setDimensionFilter("Region", region);
}
// In event handler
ScriptObject_1.applyStandardFilters(Table_1.getDataSource(), "2024", "EMEA");
```
---
## Export Capabilities
### PDF Export
```javascript
var exportSettings = {
scope: ExportScope.All,
header: "Report Title",
footer: "Page {page}",
orientation: "landscape"
};
Application.export(ExportType.PDF, exportSettings);
```
### Excel Export
```javascript
Application.export(ExportType.Excel, {
scope: ExportScope.All,
includeHierarchy: true
});
```
### CSV Export
```javascript
Table_1.export(ExportType.CSV);
```
---
## Restrictions & Unsupported (2025.23)
- **Composites**: many editor/runtime gaps; export/bookmark only at composite level; limited linked analysis; no `onInitialization` event (`references/composites-restrictions.md`).
- **Analytics Designer**: popup sizing/theme issues, planning/version API limits, DataSource filter/variable constraints, chart feed/event limits, export quirks, Safari R-vis cookie issue, embedding not supported, input-control constraints (`references/analytics-designer-restrictions.md`).
- **Blending**: primary-model-only API support; several filter/table/planning/comment APIs unsupported; IDs include modelId; value help differences (`references/blending-limitations.md`).
- **Authentication-required page**: one Help Portal article needs SAP login (`references/auth-required.md`).
---
## Official Documentation Links
### API References (Always Current)
- **Analytics Designer API Reference 2025.23**: https://help.sap.com/doc/958d4c11261f42e992e8d01a4c0dde25/release/en-US/index.html
- **Optimized Story Experience API Reference 2025.23**: https://help.sap.com/doc/1639cb9ccaa54b2592224df577abe822/release/en-US/index.html
### SAP Help Portal
- **Scripting Documentation**: https://help.sap.com/docs/SAP_ANALYTICS_CLOUD/00f68c2e08b941f081002fd3691d86a7/6a4db9a9c8634bcb86cecbf1f1dbbf8e.html
- **Performance Best Practices**: https://help.sap.com/docs/SAP_ANALYTICS_CLOUD/00f68c2e08b941f081002fd3691d86a7/fbe339efda1241b5a3f46cf17f54cdff.html
### Learning Resources
- **SAP Learning Journey**: https://learning.sap.com/learning-journeys/acquiring-basic-scripting-skills-to-extend-stories-in-sap-analytics-cloud
- **SAP Developer Tutorials**: https://developers.sap.com/tutorials/sac-analytics-designer-create-1-create.html
### Community Resources
- **SAP Community - SAC**: https://community.sap.com/topics/cloud-analytics
- **Code Snippets**: https://www.denisreis.com/sap-analytics-cloud-javascript-api-code-snippets/
---
## Bundled Reference Files
This skill includes detailed reference documentation (52 files):
**Core APIs**:
1. **references/api-datasource.md**: Complete DataSource API (36+ methods)
2. **references/api-widgets.md**: Chart, Table, Input Controls, GeoMap APIs
3. **references/api-planning.md**: Planning API, version management, data locking
4. **references/api-application.md**: Application object, utilities, events
**Advanced APIs**:
5. **references/api-calendar-bookmarks.md**: Calendar integration, Bookmarks, Linked Analysis, Timer API
6. **references/api-advanced-widgets.md**: Container widgets, Layout API, R Visualization, Custom Widgets, Navigation
7. **references/api-data-operations.md**: Range/exclude filters, dimension properties, hierarchies, members, DataSource info
**Scripting Fundamentals**:
8. **references/scripting-language-fundamentals.md**: Type system, variables, control flow, loops, operators, built-in objects, arrays, method chaining, security
9. **references/debugging-browser-tools.md**: Console logging, browser debugging, debug mode, breakpoints, R visualization debugging, performance logging
**Best Practices**:
10. **references/best-practices-developer.md**: Naming conventions, layout organization, script annotation, responsive design
11. **references/best-practices-planning-stories.md**: Multi-story architecture, entry point design, navigation scripting, user assistance patterns
**Embedding & Migration**:
12. **references/iframe-embedding-lumira-migration.md**: iFrame PostMessage communication, Lumira Designer migration guidance
**2025.23 Addenda (Help Portal extracts)**:
13. **references/comments.md** Comments APIs for widgets/table cells
14. **references/search-to-insight.md** Search to Insight technical object
15. **references/time-series-forecast.md** Forecast enablement on charts
16. **references/composites-scripting.md** Add scripts to composites
17. **references/composites-restrictions.md** Composite restrictions
18. **references/blending-limitations.md** Blending unsupported APIs and notes
19. **references/analytics-designer-restrictions.md** Known restrictions
20. **references/geomap.md** Geo map quick menus and scripting
21. **references/text-widget.md** Dynamic text & text widget APIs
22. **references/smart-grouping.md** Smart grouping APIs
23. **references/explorer-smart-insights.md** Explorer and Smart Insights
24. **references/auth-required.md** Auth-required Help Portal page
25. **references/script-editor.md** Script editor basics
26. **references/value-help.md** Value help/auto-complete in editor
27. **references/script-variables.md** Global/script variables & URL params
28. **references/script-objects.md** Reusable script objects
29. **references/pattern-functions.md** Pattern-based functions (ML)
30. **references/optimize-type-libraries.md** Optimize type libraries
31. **references/automatic-refactoring.md** Automatic refactoring tools
32. **references/debug-scripts.md** Debug mode & breakpoints
33. **references/check-errors.md** Errors panel usage
34. **references/check-references.md** Reference checking
35. **references/script-performance-popup.md** Script performance analysis
36. **references/input-fields.md** Input fields/text areas
37. **references/sliders.md** Sliders and range sliders
38. **references/bind-widget-values.md** Bind widget values to variables
39. **references/bookmark-settings.md** Bookmark settings/APIs
40. **references/bookmark-set-tech-object.md** Bookmark set technical object
41. **references/calendar-integration-tech-object.md** Calendar integration tech object
42. **references/data-change-insights-tech-object.md** Data change insights tech object
43. **references/export-pdf-tech-object.md** Export to PDF tech object
44. **references/export-ppt-tech-object.md** Export to PowerPoint tech object
45. **references/text-pool-tech-object.md** Text pool tech object
46. **references/timer-tech-object.md** Timer tech object
47. **references/planning-model-tech-object.md** Planning model tech object
48. **references/data-actions-tech-object.md** Data actions tech object
49. **references/multi-actions-tech-object.md** Multi actions tech object
50. **references/odata-service.md** OData service technical object
51. **references/on-after-data-entry-process.md** Table onAfterDataEntryProcess event
52. **references/memberinfo-performance.md** MemberInfo performance guidance
**Templates** (40 ready-to-use patterns):
1. **templates/common-patterns.js**: 40 patterns - filtering, data access, loops, arrays, R visualization, type conversion, etc.
2. **templates/planning-operations.js**: Version management, workflows, data actions
---
## Version Compatibility
- **Minimum SAC Version**: 2025.23
- **API Reference Version**: 2025.23
- **Analytics Designer**: Fully supported
- **Optimized Story Experience**: Fully supported (Advanced Mode)
**Note**: Analytics Designer is being strategically replaced by Advanced Mode in Optimized Story Experience. Both share similar scripting APIs.
---
## Instructions for Claude
When assisting with SAC scripting:
1. **Use correct API syntax**: Reference official API documentation
2. **Prefer getResultSet()**: Over getMembers() for performance
3. **Batch operations**: Use pause/resume refresh pattern
4. **Include error handling**: Use try-catch for robust code
5. **Follow naming conventions**: CamelCase for variables, descriptive names
6. **Test incrementally**: Suggest testing every 5-10 lines
7. **Link to documentation**: Provide relevant SAP Help links
8. **Consider performance**: Avoid heavy operations in onInitialization
When writing scripts:
- Start with variable declarations
- Use console.log() for debugging
- Cache DataSource references
- Handle empty selections gracefully
- Use Application.showBusyIndicator() for long operations
For troubleshooting:
- Check browser console (F12)
- Verify widget names in Outline
- Confirm DataSource is connected
- Test with simple console.log first
- Use `;debug=true` URL parameter
---
**License**: MIT
**Version**: 1.6.0
**Maintained by**: SAP Skills Maintainers
**Repository**: https://github.com/secondsky/sap-skills