Copy the example code to the dot from documentation (also below) for SubScriptOptions:SelectMemory(String, ScriptMemory) and then run it raises Script Execution Failure.
How to get this method to work please? Observed in DataMiner 10.1
Script Failure (myParentScript): (Code: 0x80131500) Skyline.DataMiner.Net.Exceptions.DataMinerException: Run Subscript 'myParentScript' Failed: 0x80004005
at CManagedAutomation.RunWrapped(CManagedAutomation* , Int32 iCookie, IUnknown* pIAutomation, tagVARIANT* varParameters, tagVARIANT* pvarReturn, String scriptName)
at CManagedAutomation.Run(CManagedAutomation* , Int32 iCookie, Char* bstrScriptName, IUnknown* pIAutomation, tagVARIANT* varParameters, tagVARIANT* varEntryPoint, tagVARIANT* pvarReturn) (CSharp; 0x80131500h): (see comment for more details)
Script Failure (mySubScript): (Code: 0x80131500) Skyline.DataMiner.Net.Exceptions.DataMinerException: Get Memory Position 'subscriptMemory':1 Failed: 0x80004005
at CManagedAutomation.RunWrapped(CManagedAutomation* , Int32 iCookie, IUnknown* pIAutomation, tagVARIANT* varParameters, tagVARIANT* pvarReturn, String scriptName)
at CManagedAutomation.Run(CManagedAutomation* , Int32 iCookie, Char* bstrScriptName, IUnknown* pIAutomation, tagVARIANT* varParameters, tagVARIANT* varEntryPoint, tagVARIANT* pvarReturn) (CSharp; 0x80131500h): (see comment for more details)
Class SubScriptOptions | DataMiner Docs
Class SubScriptOptions
SelectMemory(String, ScriptMemory)
Selects a script memory from the main script to be used as the script memory in the subscript.
Examples
Main script:
<code class="hljs stata"><span class="hljs-keyword">var</span> <span class="hljs-keyword">memory</span> = engine.GetMemory(<span class="hljs-string">"parentMemory"</span>); <span class="hljs-comment">// The parent script has a script memory with name "parentMemory".</span> <span class="hljs-keyword">memory</span>.<span class="hljs-keyword">Set</span>(1, <span class="hljs-string">"MyValue"</span>); <span class="hljs-comment">// The first entry of this memory is set to the value "MyValue".</span></code>
var subscript = engine.PrepareSubScript("MySubscript");
<code class="hljs stata"> </code>
<span class="hljs-selector-tag">subscript</span><span class="hljs-selector-class">.SelectMemory</span>(<span class="hljs-string">"subscriptMemory"</span>, memory); <span class="hljs-comment">// The subscript has a script memory with name "subscriptMemory" and this memory will be linked to the parent memory.</span>
<span class="hljs-selector-tag">subscript</span><span class="hljs-selector-class">.StartScript</span>();
Sub-script:
<code class="hljs stata"><span class="hljs-keyword">var</span> <span class="hljs-keyword">memory</span> = engine.GetMemory(<span class="hljs-string">"subscriptMemory"</span>); engine.GenerateInformation(Convert.<span class="hljs-keyword">ToString</span>(<span class="hljs-keyword">memory</span>.<span class="hljs-built_in">Get</span>(1))); <span class="hljs-comment">// This will generate an information event with value: "MyValue".</span></code>
I got a similar exception and was only able to get it to work when selecting "Persistent" for the memory. In that case, it also stores the value to a file. More info available here.
What do you want to use memory for exactly? In case you are using C# in your scripts, then you can probably do what you want to achieve without using script memory.
If you need to pass input from a parent script to a subscript, then you could use parameters instead. Either you create multiple parameters if you need to pass more than just 1 value, or you can use a serialized string (json for example) that you deserialize in your subscript that contains all info you need.
Thanks Joey. Yes, script parameters definitely have their purpose and use cases and I do use them but can I here?
Here, I have human operators, who don’t need to know the auto-triggered, non-interactive, zero-prompts scripts but need to change some fairly static input values to the scripts, e.g. cost of a banana. I think the ‘Memory Files’ definition screen provides a good interface for the human operator.
I want to get a zero-user-prompt Parent script to pass values to a Subscript on-the-fly. Volatile memory sounds like a way to achieve this?
I will run more than one instances of the script-pair at the same time, so Persistent memory will not work. I’m hoping volatile memory will work?
Additionally, I manage to get a zero-user-prompt Parent script to launch a subscript to read some [fairly static, operator-changeable] values from Persistent memory. And then I tried but failed to launch a Sub-subscript [2nd level] with SelectMemory(myPersistentScriptMemoryObject) when the Sub-subscript is expecting volatile memory. You may say this is expected behaviour but according to documentation for ScriptMemory [https://docs.dataminer.services/develop/api/types/Skyline.DataMiner.Automation.ScriptMemory.html], persistent and volatile memories are of the same class; only difference is the LinkedFile property which is an empty string for volatile memory. So I expect SubScriptOptions.SelectMemory(String, ScriptMemory) to take the supplied ScriptMemory object, regardless if it’s persistent or volatile.