<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Custom Tasks .NET  Enterprise Guide - GetSasCode() in SAS Enterprise Guide</title>
    <link>https://communities.sas.com/t5/SAS-Enterprise-Guide/Custom-Tasks-NET-Enterprise-Guide-GetSasCode/m-p/105813#M9209</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks very much. I missed the Design time vs Run Time distinction in Chapter 4, and had not overridden XMLState. I thought that it was just for restoring the user interface when the task was modified in future EG sessions.&lt;/P&gt;&lt;P&gt;I see how that works now.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 08 Oct 2013 18:19:37 GMT</pubDate>
    <dc:creator>LarrryHoyle</dc:creator>
    <dc:date>2013-10-08T18:19:37Z</dc:date>
    <item>
      <title>Custom Tasks .NET  Enterprise Guide - GetSasCode()</title>
      <link>https://communities.sas.com/t5/SAS-Enterprise-Guide/Custom-Tasks-NET-Enterprise-Guide-GetSasCode/m-p/105811#M9207</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm trying to write a custom task that allows users to enter attributes into a form that builds a Proc Datasets to modify a copy of a dataset.&lt;/P&gt;&lt;P&gt;I can get the proc datasets to run correctly with a button event handler that looks like:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;SAS.Tasks.Toolkit.SasSubmitter submitter = new SAS.Tasks.Toolkit.SasSubmitter(ActiveServer);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // holds SAS log output&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string log;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // submit program and wait for completion&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; submitter.SubmitSasProgramAndWait(FinalSasCode, out log);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;where FinalSasCode has the program I want to run.&lt;/P&gt;&lt;P&gt;I have a property in the Model also called FinalSasCode and I can set it with the program text (and see in the log that it is set, but when GetSASCode() is invoked the property returns an empty string (as can be seen in the log).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Is this come kind of timing or thread issue? When does GetSasCode() get invoked?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt; &lt;/TD&gt;&lt;TD&gt;public override string GetSasCode()&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;{&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;try&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;{&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;dlg.logger.InfoFormat(" /*&amp;nbsp; From GetSasCode FinalSasCode:&amp;nbsp; */ \n proc contents data = {0}.{1}; run;\n {2} \n /*&amp;nbsp;&amp;nbsp; */", Consumer.ActiveData.Library, Consumer.ActiveData.Member, FinalSasCode);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;return string.Format(" /*&amp;nbsp;&amp;nbsp; task complete */ \n proc contents data = {0}.{1}; run;\n {2} \n /*&amp;nbsp;&amp;nbsp; */", Consumer.ActiveData.Library, Consumer.ActiveData.Member, FinalSasCode);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;catch (Exception ex)&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;{&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;dlg.logger.InfoFormat(" Exception caught in GetSASCode {0}", ex.Message);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;return string.Format(" /*&amp;nbsp; Exception generated in GetSasCode&amp;nbsp;&amp;nbsp; */");&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;}&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;}&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;From the logger:&lt;/P&gt;&lt;P&gt;2013-10-07 19:18:56,229 [Main] INFO&amp;nbsp; DataLogger [(null)] -&amp;nbsp; /*&amp;nbsp; From GetSasCode FinalSasCode:&amp;nbsp; */ &lt;/P&gt;&lt;P&gt; proc contents data = EXTEST.SALES; run;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt; /*&amp;nbsp;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This is what is submitted with the OK button:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*&amp;nbsp;&amp;nbsp; task complete */ &lt;/P&gt;&lt;P&gt; proc contents data = EXTEST.SALES; run;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt; /*&amp;nbsp;&amp;nbsp; */&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 08 Oct 2013 00:23:42 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Enterprise-Guide/Custom-Tasks-NET-Enterprise-Guide-GetSasCode/m-p/105811#M9207</guid>
      <dc:creator>LarrryHoyle</dc:creator>
      <dc:date>2013-10-08T00:23:42Z</dc:date>
    </item>
    <item>
      <title>Re: Custom Tasks .NET  Enterprise Guide - GetSasCode()</title>
      <link>https://communities.sas.com/t5/SAS-Enterprise-Guide/Custom-Tasks-NET-Enterprise-Guide-GetSasCode/m-p/105812#M9208</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Larry,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Do you need the code to run while the task is visible?&amp;nbsp; Or simply after the OK button is clicked?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If you need the code to run in EG after you click OK, you do not need the SasSubmitter piece.&amp;nbsp; The SasSubmitter class allows you to run SAS statements while your task is visible and then collect/use the results within your UI.&amp;nbsp; An example is the "solve macro expression" piece in the&lt;A href="https://github.com/cjdinger/SasMacroViewer"&gt; Macro Variable Viewer example&lt;/A&gt;.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It's important to understand the different "modes" of a custom task:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Registration&lt;/STRONG&gt; (or discovery) - the few methods that are used to add your task to the menu, determine the name, category, icon.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Design time&lt;/STRONG&gt; - when your task shows its UI and allows the end user to make selections.&amp;nbsp; All selections must be saved in the &lt;STRONG&gt;XmlState&lt;/STRONG&gt; member (facilitated by &lt;STRONG&gt;GetXmlState&lt;/STRONG&gt; and &lt;STRONG&gt;RestoreStateFromXml &lt;/STRONG&gt;within the &lt;STRONG&gt;SasTask&lt;/STRONG&gt;-derived task -- methods that you must override).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Run time&lt;/STRONG&gt; - EG creates a new instance of your task class and provides the &lt;STRONG&gt;XmlState&lt;/STRONG&gt; (which you can process in &lt;STRONG&gt;RestoreStateFromXml&lt;/STRONG&gt;), then calls &lt;STRONG&gt;GetSasCode -- &lt;/STRONG&gt;in which you construct a SAS program based on the settings you saved.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;These topics are covered in more detail in &lt;A href="https://support.sas.com/pubscat/bookdetails.jsp?pc=61874"&gt;my custom tasks book&lt;/A&gt;.&amp;nbsp; See &lt;STRONG&gt;Chapter 4: Meet the Custom Task APIs&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Chris&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 08 Oct 2013 13:13:05 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Enterprise-Guide/Custom-Tasks-NET-Enterprise-Guide-GetSasCode/m-p/105812#M9208</guid>
      <dc:creator>ChrisHemedinger</dc:creator>
      <dc:date>2013-10-08T13:13:05Z</dc:date>
    </item>
    <item>
      <title>Re: Custom Tasks .NET  Enterprise Guide - GetSasCode()</title>
      <link>https://communities.sas.com/t5/SAS-Enterprise-Guide/Custom-Tasks-NET-Enterprise-Guide-GetSasCode/m-p/105813#M9209</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks very much. I missed the Design time vs Run Time distinction in Chapter 4, and had not overridden XMLState. I thought that it was just for restoring the user interface when the task was modified in future EG sessions.&lt;/P&gt;&lt;P&gt;I see how that works now.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 08 Oct 2013 18:19:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Enterprise-Guide/Custom-Tasks-NET-Enterprise-Guide-GetSasCode/m-p/105813#M9209</guid>
      <dc:creator>LarrryHoyle</dc:creator>
      <dc:date>2013-10-08T18:19:37Z</dc:date>
    </item>
  </channel>
</rss>

