--- 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. --- ## What’s 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