Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
jleonard
Product and Topic Expert
Product and Topic Expert
416
This documentation explain that you can reuse and combine two different desktop packages with process. But for now, there is a limitation, you can pass only primitive parameters from a desktop package scenario to another.

In this blog post I will explain how to surpass this limitation.

Actually, there is a way to pass complex parameters if you serialize your object before sending it in output and unserialize your input parameters. Let’s see how to do this.

1 - Create your desktop packages


For this blog post I have created two simple projects. The first one sends a mathematical operation in output parameters and the second received this operation and execute it.

SendOperation project


As mentioned, this project will only send some parameters.

Context creation


The first thing to do is to define the data context of the workflow.

In this context there is:

  • outputData : we will put the serilization of our object in this attribute and it will be the output of the workflow.

  • OperationData : A complex object that contain 3 attributes

    • FirstNumber

    • Operator

    • secondNumber






Workflow creation and configuration


Now you can create your workflow, but before adding any activity you have to configure the context like this:


Here the Input Data Manager is the context created and the output is the field outputData.

Workflow content


This workflow is very simple, only two custom steps are enough:


The first one is to initialize the data and the second serialize OperationData and put it into outputData.

Here is the code :
// ----------------------------------------------------------------
// Step: Init_Operation_Data
// ----------------------------------------------------------------
GLOBAL.step({ Init_Operation_Data: function(ev, sc, st) {
var rootData_SendOperationData = sc.data;
ctx.workflow('scSendOperation', 'f1d90ff3-e30f-49a9-85f6-1392c1e08411') ;
// Describe functionality to be implemented in JavaScript later in the project.
rootData_SendOperationData.OperationData.firstNumber = 21;
rootData_SendOperationData.OperationData.operator = "x";
rootData_SendOperationData.OperationData.secondNumber = 2;
sc.endStep(); // Serialize_parameters
return;
}});

// ----------------------------------------------------------------
// Step: Serialize_parameters
// ----------------------------------------------------------------
GLOBAL.step({ Serialize_parameters: function(ev, sc, st) {
var rootData_SendOperationData = sc.data;
ctx.workflow('scSendOperation', '0a684bc2-4c65-4f5f-a20f-bca6c0a929dd') ;
// Describe functionality to be implemented in JavaScript later in the project.
rootData_SendOperationData.outputData = ctx.json.stringify(rootData_SendOperationData.OperationData);
sc.endStep(); // end Scenario
return;
}});

The interesting part is the second step, we use a SDK function to serialize the objet. Thanks to this we have a string that we can send in output.

Calculator project


The second workflow will deserialize the input parameter and execute the operation, the result will put the output of the workflow.

Context creation


We have to define the context for this workflow before doing anything:

  • Input : the input data of the workflow, it will contain the output of the SendOperation workflow

  • Output : we will set the result of the operation in this attribute

  • CalculationData : The complex type that contain the 3 attribute of the operation

    • firstNumber

    • operator

    • secondNumber






Workflow creation and configuration


Now you can create your workflow, but before adding any activity you have to configure the context like this:


Here the Input Data Manager is the context created and the output is the field output and the input of the workflow is the input attribute.

 Workflow content


In this workflow also we have only two simple custom steps:


The first one is to unserialize the parameters and the second one to execute the operation.

Here is the code of the steps:
// ----------------------------------------------------------------
// Step: Unserialize_parameter
// ----------------------------------------------------------------
GLOBAL.step({ Unserialize_parameter: function(ev, sc, st) {
var rootData_CalculatorData = sc.data;
ctx.workflow('scCalculator', 'c2f7371a-b3cf-422b-810e-7c3d458dffa2') ;
// Describe functionality to be implemented in JavaScript later in the project.
rootData_CalculatorData.CalculationData = ctx.json.parse(rootData_CalculatorData.input);

sc.endStep(); // Calculate
return;
}});

// ----------------------------------------------------------------
// Step: Calculate
// ----------------------------------------------------------------
GLOBAL.step({ Calculate: function(ev, sc, st) {
var rootData_CalculatorData = sc.data;
ctx.workflow('scCalculator', '7a46ce02-0643-4614-afbd-e5a69f6f92e0') ;
// Describe functionality to be implemented in JavaScript later in the project.
switch(rootData_CalculatorData.CalculationData.operator){
case "x":
rootData_CalculatorData.output = rootData_CalculatorData.CalculationData.firstNumber * rootData_CalculatorData.CalculationData.secondNumber;
break;
case "+":
rootData_CalculatorData.output = rootData_CalculatorData.CalculationData.firstNumber + rootData_CalculatorData.CalculationData.secondNumber;
break;
case "-":
rootData_CalculatorData.output = rootData_CalculatorData.CalculationData.firstNumber - rootData_CalculatorData.CalculationData.secondNumber;
break;
case "/":
rootData_CalculatorData.output = rootData_CalculatorData.CalculationData.firstNumber / rootData_CalculatorData.CalculationData.secondNumber;
break;
default :
rootData_CalculatorData.output = "Operator not defined";
}
sc.endStep(); // end Scenario
return;
}});

2 - Create the process


Now that you have you two projects, we can create the process that will combine the two packages.

Before the process create you have to export the packages with the Desktop Studio.

Once you have done this you just have to create a new project in the factory:

 


Then import your 2 desktop packages in your cloud project.


Then you have to make each workflow that you will use as skill:



Once you have done this you can create your process using the menu Create => Process


Then, you can drag and drop scSendOperation and scCalulator in your process:


The last thing that you have to do is to set outputData as input parameters of scCalculator.


And it’s done! Now you can schedule your process and test it.

 

Conclusion


The Cloud Studio doesn’t provide a way to use complex parameter, but with this technic you are able to use Desktop Studio complex parameters in a process.