Initial commit
This commit is contained in:
640
references/data-actions-tech-object.md
Normal file
640
references/data-actions-tech-object.md
Normal file
@@ -0,0 +1,640 @@
|
||||
# Data Actions Technical Object (2025.23)
|
||||
|
||||
**Source**: [Analytics Designer API Reference - Data Action](https://help.sap.com/docs/SAP_ANALYTICS_CLOUD/00f68c2e08b941f081002fd3691d86a5/7c52c448e17c4746b6e767b8370f744e.html)
|
||||
|
||||
---
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [Getting Data Action Reference](#getting-data-action-reference)
|
||||
2. [Execution Methods](#execution-methods)
|
||||
3. [Parameter Management](#parameter-management)
|
||||
4. [Event Handlers](#event-handlers)
|
||||
5. [Execution Status Monitoring](#execution-status-monitoring)
|
||||
6. [Error Handling](#error-handling)
|
||||
7. [Best Practices](#best-practices)
|
||||
|
||||
---
|
||||
|
||||
## Getting Data Action Reference
|
||||
|
||||
Data Actions are widgets that can be accessed directly by their assigned ID in scripts.
|
||||
|
||||
```javascript
|
||||
// Direct access to Data Action widget
|
||||
DataAction_1.execute();
|
||||
```
|
||||
|
||||
**Note**: Data Actions must be added to the story canvas before they can be scripted.
|
||||
|
||||
---
|
||||
|
||||
## Execution Methods
|
||||
|
||||
### execute()
|
||||
|
||||
Executes the data action synchronously.
|
||||
|
||||
```javascript
|
||||
// Simple execution
|
||||
DataAction_1.execute();
|
||||
|
||||
// With parameters (set parameters before execution)
|
||||
DataAction_1.setParameterValue("YEAR", "2024");
|
||||
DataAction_1.setParameterValue("VERSION", "Budget");
|
||||
DataAction_1.execute();
|
||||
```
|
||||
|
||||
### executeInBackground()
|
||||
|
||||
Executes the data action asynchronously without blocking the UI.
|
||||
|
||||
```javascript
|
||||
// Execute in background for long-running actions
|
||||
DataAction_1.executeInBackground();
|
||||
|
||||
// Monitor completion with event handler
|
||||
DataAction_1.onExecutionStatusUpdate = function(status) {
|
||||
if (status === ExecutionStatus.Completed) {
|
||||
Table_1.getDataSource().refreshData();
|
||||
Application.showMessage(ApplicationMessageType.Info, "Data action completed");
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Parameter Management
|
||||
|
||||
### setParameterValue(parameterName, value)
|
||||
|
||||
Sets a parameter value for the data action.
|
||||
|
||||
**Parameters**:
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| parameterName | string | Yes | Name of the parameter defined in the data action |
|
||||
| value | string/number | Yes | Value to pass to the parameter |
|
||||
|
||||
```javascript
|
||||
// Set single parameter
|
||||
DataAction_1.setParameterValue("COST_CENTER", "1000");
|
||||
|
||||
// Set multiple parameters
|
||||
var parameters = {
|
||||
"YEAR": "2024",
|
||||
"MONTH": "12",
|
||||
"SCENARIO": "Actual",
|
||||
"AMOUNT": 100000
|
||||
};
|
||||
|
||||
Object.keys(parameters).forEach(function(param) {
|
||||
DataAction_1.setParameterValue(param, parameters[param]);
|
||||
});
|
||||
|
||||
// Execute with all parameters set
|
||||
DataAction_1.execute();
|
||||
```
|
||||
|
||||
### getParameterValue(parameterName)
|
||||
|
||||
Gets the current value of a parameter.
|
||||
|
||||
```javascript
|
||||
var yearValue = DataAction_1.getParameterValue("YEAR");
|
||||
if (yearValue) {
|
||||
console.log("Current year parameter:", yearValue);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Event Handlers
|
||||
|
||||
### onBeforeExecute
|
||||
|
||||
Triggered before the data action executes.
|
||||
|
||||
```javascript
|
||||
DataAction_1.onBeforeExecute = function() {
|
||||
// Show loading indicator
|
||||
Application.showBusyIndicator("Processing data action...");
|
||||
|
||||
// Validate parameters
|
||||
var year = DataAction_1.getParameterValue("YEAR");
|
||||
if (!year) {
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Error,
|
||||
"Year parameter is required"
|
||||
);
|
||||
return false; // Prevent execution
|
||||
}
|
||||
|
||||
// Log execution start
|
||||
console.log("Executing data action at:", new Date());
|
||||
};
|
||||
```
|
||||
|
||||
### onAfterExecute
|
||||
|
||||
Triggered after the data action completes execution.
|
||||
|
||||
```javascript
|
||||
DataAction_1.onAfterExecute = function(result) {
|
||||
// Hide loading indicator
|
||||
Application.hideBusyIndicator();
|
||||
|
||||
// Check execution result
|
||||
if (result.success) {
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Info,
|
||||
"Data action completed successfully"
|
||||
);
|
||||
|
||||
// Refresh affected data
|
||||
Table_1.getDataSource().refreshData();
|
||||
|
||||
// Log success
|
||||
console.log("Data action executed successfully:", result);
|
||||
} else {
|
||||
// Handle errors
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Error,
|
||||
"Data action failed: " + (result.message || "Unknown error")
|
||||
);
|
||||
|
||||
console.error("Data action failed:", result);
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### onExecutionStatusUpdate
|
||||
|
||||
Triggered during background execution when status changes.
|
||||
|
||||
```javascript
|
||||
DataAction_1.onExecutionStatusUpdate = function(status) {
|
||||
switch(status) {
|
||||
case ExecutionStatus.Running:
|
||||
console.log("Data action is running...");
|
||||
break;
|
||||
|
||||
case ExecutionStatus.Completed:
|
||||
console.log("Data action completed successfully");
|
||||
Table_1.getDataSource().refreshData();
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Info,
|
||||
"Data action completed"
|
||||
);
|
||||
break;
|
||||
|
||||
case ExecutionStatus.Failed:
|
||||
console.error("Data action failed");
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Error,
|
||||
"Data action execution failed"
|
||||
);
|
||||
break;
|
||||
|
||||
case ExecutionStatus.Cancelled:
|
||||
console.log("Data action was cancelled");
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Warning,
|
||||
"Data action cancelled by user"
|
||||
);
|
||||
break;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Execution Status Monitoring
|
||||
|
||||
Monitor the execution state for better user experience.
|
||||
|
||||
```javascript
|
||||
// Function to check data action status
|
||||
function checkDataActionStatus() {
|
||||
var isRunning = DataAction_1.isExecuting();
|
||||
|
||||
if (isRunning) {
|
||||
console.log("Data action is currently executing");
|
||||
return true;
|
||||
} else {
|
||||
console.log("Data action is not executing");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Execute with status monitoring
|
||||
function executeWithMonitoring() {
|
||||
if (checkDataActionStatus()) {
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Warning,
|
||||
"Data action is already running"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
DataAction_1.execute();
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Error Handling
|
||||
|
||||
### Try-Catch Pattern
|
||||
|
||||
```javascript
|
||||
function safeExecute() {
|
||||
try {
|
||||
// Validate inputs
|
||||
if (!validateInputs()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Execute data action
|
||||
DataAction_1.execute();
|
||||
|
||||
} catch (error) {
|
||||
console.error("Error executing data action:", error);
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Error,
|
||||
"An error occurred: " + error.message
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function validateInputs() {
|
||||
// Check required parameters
|
||||
var requiredParams = ["YEAR", "VERSION"];
|
||||
var missingParams = [];
|
||||
|
||||
requiredParams.forEach(function(param) {
|
||||
var value = DataAction_1.getParameterValue(param);
|
||||
if (!value) {
|
||||
missingParams.push(param);
|
||||
}
|
||||
});
|
||||
|
||||
if (missingParams.length > 0) {
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Error,
|
||||
"Missing required parameters: " + missingParams.join(", ")
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
### Data Locking Integration
|
||||
|
||||
```javascript
|
||||
// Check data locks before execution
|
||||
function executeWithLockCheck() {
|
||||
var selection = Table_1.getSelections()[0];
|
||||
|
||||
if (selection) {
|
||||
var dataLocking = Table_1.getPlanning().getDataLocking();
|
||||
var lockState = dataLocking.getState(selection);
|
||||
|
||||
if (lockState === DataLockingState.Locked) {
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Warning,
|
||||
"Data is locked by another user. Cannot execute data action."
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Proceed with execution
|
||||
DataAction_1.execute();
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### 1. Parameter Validation
|
||||
|
||||
Always validate parameters before execution:
|
||||
|
||||
```javascript
|
||||
function validateAllParameters() {
|
||||
var params = DataAction_1.getParameters();
|
||||
var isValid = true;
|
||||
|
||||
params.forEach(function(param) {
|
||||
var value = DataAction_1.getParameterValue(param.name);
|
||||
|
||||
if (param.isRequired && !value) {
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Error,
|
||||
"Required parameter '" + param.name + "' is missing"
|
||||
);
|
||||
isValid = false;
|
||||
}
|
||||
});
|
||||
|
||||
return isValid;
|
||||
}
|
||||
```
|
||||
|
||||
### 2. User Feedback
|
||||
|
||||
Provide clear feedback to users:
|
||||
|
||||
```javascript
|
||||
function executeWithFeedback() {
|
||||
// Show start message
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Info,
|
||||
"Starting data action execution..."
|
||||
);
|
||||
|
||||
// Set up event handlers
|
||||
DataAction_1.onBeforeExecute = function() {
|
||||
Application.showBusyIndicator("Executing data action...");
|
||||
};
|
||||
|
||||
DataAction_1.onAfterExecute = function(result) {
|
||||
Application.hideBusyIndicator();
|
||||
|
||||
if (result.success) {
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Success,
|
||||
"Data action completed successfully!"
|
||||
);
|
||||
|
||||
// Refresh data
|
||||
Table_1.getDataSource().refreshData();
|
||||
} else {
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Error,
|
||||
"Data action failed: " + result.message
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
// Execute
|
||||
DataAction_1.execute();
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Batch Execution
|
||||
|
||||
Execute multiple data actions efficiently:
|
||||
|
||||
```javascript
|
||||
function executeBatch() {
|
||||
var dataActions = [DataAction_1, DataAction_2, DataAction_3];
|
||||
var completed = 0;
|
||||
var total = dataActions.length;
|
||||
|
||||
Application.showBusyIndicator("Executing batch actions...");
|
||||
|
||||
dataActions.forEach(function(action, index) {
|
||||
action.onAfterExecute = function(result) {
|
||||
completed++;
|
||||
|
||||
if (result.success) {
|
||||
console.log("Action", index + 1, "completed");
|
||||
} else {
|
||||
console.error("Action", index + 1, "failed:", result);
|
||||
}
|
||||
|
||||
// Check if all actions are complete
|
||||
if (completed === total) {
|
||||
Application.hideBusyIndicator();
|
||||
Table_1.getDataSource().refreshData();
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Info,
|
||||
"All data actions completed"
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
// Execute with slight delay to avoid overwhelming system
|
||||
setTimeout(function() {
|
||||
action.execute();
|
||||
}, index * 100);
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Performance Considerations
|
||||
|
||||
- Use `executeInBackground()` for long-running actions
|
||||
- Avoid executing multiple actions simultaneously on the same data
|
||||
- Refresh data sources only after all related actions complete
|
||||
- Implement proper error handling to prevent UI freezing
|
||||
|
||||
---
|
||||
|
||||
## Complete Example
|
||||
|
||||
```javascript
|
||||
// Complete example of data action management
|
||||
var DataManager = {
|
||||
// Initialize data action
|
||||
init: function() {
|
||||
// Set up event handlers
|
||||
this.setupEventHandlers();
|
||||
|
||||
// Set default parameters
|
||||
this.setDefaultParameters();
|
||||
},
|
||||
|
||||
// Set up event handlers
|
||||
setupEventHandlers: function() {
|
||||
var self = this;
|
||||
|
||||
DataAction_1.onBeforeExecute = function() {
|
||||
return self.validateBeforeExecute();
|
||||
};
|
||||
|
||||
DataAction_1.onAfterExecute = function(result) {
|
||||
self.handleAfterExecute(result);
|
||||
};
|
||||
|
||||
DataAction_1.onExecutionStatusUpdate = function(status) {
|
||||
self.handleStatusUpdate(status);
|
||||
};
|
||||
},
|
||||
|
||||
// Set default parameters
|
||||
setDefaultParameters: function() {
|
||||
var currentDate = new Date();
|
||||
DataAction_1.setParameterValue("YEAR", currentDate.getFullYear().toString());
|
||||
DataAction_1.setParameterValue("MONTH", (currentDate.getMonth() + 1).toString());
|
||||
},
|
||||
|
||||
// Validate before execution
|
||||
validateBeforeExecute: function() {
|
||||
// Check data locks
|
||||
if (this.checkDataLocks()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Validate parameters
|
||||
if (!this.validateParameters()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Show loading
|
||||
Application.showBusyIndicator("Executing data action...");
|
||||
return true;
|
||||
},
|
||||
|
||||
// Check data locks
|
||||
checkDataLocks: function() {
|
||||
var selection = Table_1.getSelections()[0];
|
||||
|
||||
if (selection) {
|
||||
var lockState = Table_1.getPlanning().getDataLocking().getState(selection);
|
||||
|
||||
if (lockState === DataLockingState.Locked) {
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Warning,
|
||||
"Data is locked by another user"
|
||||
);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
// Validate parameters
|
||||
validateParameters: function() {
|
||||
var required = ["YEAR", "SCENARIO"];
|
||||
var missing = [];
|
||||
|
||||
required.forEach(function(param) {
|
||||
var value = DataAction_1.getParameterValue(param);
|
||||
if (!value) {
|
||||
missing.push(param);
|
||||
}
|
||||
});
|
||||
|
||||
if (missing.length > 0) {
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Error,
|
||||
"Missing parameters: " + missing.join(", ")
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
// Handle after execution
|
||||
handleAfterExecute: function(result) {
|
||||
Application.hideBusyIndicator();
|
||||
|
||||
if (result.success) {
|
||||
this.onSuccess(result);
|
||||
} else {
|
||||
this.onError(result);
|
||||
}
|
||||
},
|
||||
|
||||
// Handle success
|
||||
onSuccess: function(result) {
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Success,
|
||||
"Data action completed successfully"
|
||||
);
|
||||
|
||||
// Refresh data
|
||||
Table_1.getDataSource().refreshData();
|
||||
|
||||
// Log success
|
||||
console.log("Data action success:", result);
|
||||
},
|
||||
|
||||
// Handle error
|
||||
onError: function(result) {
|
||||
Application.showMessage(
|
||||
ApplicationMessageType.Error,
|
||||
"Data action failed: " + (result.message || "Unknown error")
|
||||
);
|
||||
|
||||
console.error("Data action error:", result);
|
||||
},
|
||||
|
||||
// Handle status updates
|
||||
handleStatusUpdate: function(status) {
|
||||
console.log("Data action status:", status);
|
||||
|
||||
switch(status) {
|
||||
case ExecutionStatus.Running:
|
||||
console.log("Execution in progress...");
|
||||
break;
|
||||
case ExecutionStatus.Completed:
|
||||
console.log("Execution completed");
|
||||
break;
|
||||
case ExecutionStatus.Failed:
|
||||
console.error("Execution failed");
|
||||
break;
|
||||
case ExecutionStatus.Cancelled:
|
||||
console.log("Execution cancelled");
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
// Execute data action
|
||||
execute: function(parameters) {
|
||||
// Set parameters if provided
|
||||
if (parameters) {
|
||||
Object.keys(parameters).forEach(function(key) {
|
||||
DataAction_1.setParameterValue(key, parameters[key]);
|
||||
});
|
||||
}
|
||||
|
||||
// Execute
|
||||
DataAction_1.execute();
|
||||
},
|
||||
|
||||
// Execute in background
|
||||
executeInBackground: function(parameters) {
|
||||
// Set parameters if provided
|
||||
if (parameters) {
|
||||
Object.keys(parameters).forEach(function(key) {
|
||||
DataAction_1.setParameterValue(key, parameters[key]);
|
||||
});
|
||||
}
|
||||
|
||||
// Execute in background
|
||||
DataAction_1.executeInBackground();
|
||||
}
|
||||
};
|
||||
|
||||
// Usage example:
|
||||
// Initialize on story load
|
||||
DataManager.init();
|
||||
|
||||
// Execute with custom parameters
|
||||
DataManager.execute({
|
||||
"YEAR": "2024",
|
||||
"SCENARIO": "Budget",
|
||||
"AMOUNT": 100000
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Notes
|
||||
|
||||
- Always handle data locks before executing data actions that modify data
|
||||
- Use `executeInBackground()` for long-running actions to avoid UI freezing
|
||||
- Provide clear user feedback through loading indicators and messages
|
||||
- Validate all required parameters before execution
|
||||
- Consider implementing retry logic for failed executions
|
||||
- Refresh affected data sources after successful data action execution
|
||||
|
||||
Reference in New Issue
Block a user