BookmarkSubscribeRSS Feed
prholland
Fluorite | Level 6

I'm trying to generate some code to run in EG 5.1 that is based on 3 List Box objects in VB.Net.  I'd like to pass a comma-separated list of values from the Form class, via the Settings class, to the Main class of an EG Custom Task.  I've used the following VB.Net (VS 2010) code to pass the _settings object from Main to Form, but, even though I get no errors, nothing appears back in my GetSasCode routine when I read the _settings properties back in Main.

In Main:

    Private _settings As New Settings

        form._settings = _settings

        form.ShowDialog(Owner)

        ' save the settings from the form

        _settings = form._settings

    Public Overrides Function GetSasCode() As String

        ' generate the SAS program and return as a String

        Return _settings.ToSasProgram()

    End Function

In Form:

    Public _settings As Settings

        Dim sb As New StringBuilder()

        Dim i As Integer

        If lstStyle.SelectedItems.Count > 0 Then

            For i = 0 To (lstStyle.SelectedItems.Count - 1)

                sb.AppendFormat(",{0}", lstStyle.SelectedItems(i).ToString())

            Next

        End If

        If lstStatgraph.SelectedItems.Count > 0 Then

            For i = 0 To (lstStatgraph.SelectedItems.Count - 1)

                sb.AppendFormat(",{0}", lstStatgraph.SelectedItems(i).ToString())

            Next

        End If

        If lstTable.SelectedItems.Count > 0 Then

            For i = 0 To (lstTable.SelectedItems.Count - 1)

                sb.AppendFormat(",{0}", lstTable.SelectedItems(i).ToString())

            Next

        End If

        _settings._runcode = sb.ToString().Substring(1)

In Settings:

    Public Property _runcode As String

In Settings ToSasProgram:

        Dim sb As New StringBuilder()

        Dim run_code1 As String

        Dim template_name As String

        run_code1 = _runcode

        While Not String.IsNullOrEmpty(run_code1)

            template_name = run_code1.Substring(0, run_code1.IndexOf(","))

            sb.AppendFormat(" source {0};", template_name)

            sb.AppendLine()

            run_code1 = run_code1.Substring(run_code1.IndexOf(",") + 1)

        End While

_runcode appears to contain nothing.

Why is this happening?stom............Phil

2 REPLIES 2
ChrisHemedinger
Community Manager

Phil,

A couple of observations...

- assuming that your Form class has an OK and Cancel button, you should be checking that the DialogResult from your ShowDialog() call is DialogResult.OK before you "commit" the setting values in your task class.  (See also: 10 tips for creating dialog windows like the pros - The SAS Dummy).

- you're missing a very important part of the task: the part where you save the task settings and then restore them via the XmlState property.  In the SasTask-derived class, this is done by overriding the GetXmlState (to save) and RestoreStateFromXml (to restore).  The convention is to pass the values via XML, but that is not strictly required.  So for your task, you could add this to your task class ("Main"):

    Public Overrides Function GetXmlState() As String

        Return _settings

    End Function

    Public Overrides Sub RestoreStateFromXml(ByVal xmlState As String)

       _settings = xmlState

    End Sub

This step is necessary because your task class instance is not reused from the "design phase" where you work with the UI to the "run" phase where your class generates a program to run within EG.

Think of your task class as an empty container.  During "design" (when you see the UI), you are collecting information that is needed to fulfill the task's purpose.  After you click OK and close the UI, the information is stored away in your project, and your task class (container) goes away (freeing memory).

When it comes time to run the task (which may be just milliseconds later), a new task container is created, and the stored information from the project is "poured" into it (via the XmlState property, or the above override functions).  This -- along with the Consumer.ActiveData, perhaps -- provides you with the state information you need to create the SAS program that you want to run.

Chris

It's time to register for SAS Innovate! Join your SAS user peers in Las Vegas on April 16-19 2024.
prholland
Fluorite | Level 6

Chris,

Once again your answer has helped me resolve my problem.  Although you suggested that I didn't need to convert to XML, I ended up using the ToXml and FromXml routine supplied in the VB.Net template (for simplicity), and borrowing some code from the BasicStatsVB_withUI project to pass the _settings data to and from the form.  I also moved the ToSasProgram function from Settings to Main, so that it was with the related code.

However, I think I now understand why my old "Proc Report" custom task, that worked fine in EG 4.1, stopped working in EG 4.2, and I think I now understand how to fix it.  This means I have yet another EG Add-in project to complete!

I know you don't like VB.Net, but thanks for tolerating it enough to help me out.

Many thanks...........Phil

PS. I am building a template extractor for ODS Styles, Statgraphs and Tables.

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

SAS Enterprise Guide vs. SAS Studio

What’s the difference between SAS Enterprise Guide and SAS Studio? How are they similar? Just ask SAS’ Danny Modlin.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 2 replies
  • 844 views
  • 3 likes
  • 2 in conversation