Desktop productivity for business analysts and programmers

SAS EG Addin question

Reply
N/A
Posts: 0

SAS EG Addin question

Hi guys, Chris,
I am new to both SAS and Visual Studio. For the last couple of weeks I have learned to write a SAS macro for my financial auditing job. My boss wants me to develop a custom task for SAS EG using VB. We now have Visual Studio 2005 pro. I spend a few days searching the web and trying to understand the codes of some sample custom tasks on the web but only got a very rough picture. Some points still confused me, for example

How to call a SAS macro with parameters in VB ?(although I have seen an equivalent C# code from one of the sample custom tasks downloaded from SAS support page)

How to create the .dll file? etc.

Any suggestions, pointer or examples on this? Much appreciated.
Community Manager
Posts: 2,891

Re: SAS EG Addin question

John,

Most custom tasks simply generate SAS code based on user selections in one or more forms presented in the task. When you already have a SAS macro that does the work you want, the only variation in the generated code from run to run is the parameters passed to the macro, or else perhaps some %LET statements to set up some variables.

You're not calling the macro directly from the task; you are simply generating a SAS program that will call the macro when run within EG.

Is there a C# example that we have that looks like what you want to do? If so, post back and I'll try to provide some code snippets for a VB.NET equivalent.

One other note: if you are using VS2005, you'll want to look at this thread:
http://support.sas.com/forums/thread.jspa?forumID=10&threadID=121&tstart=0

Chris
N/A
Posts: 0

Re: SAS EG Addin question

Thanks Chris,

It helps me clarify things a little bit. And here is the C# code of a sample custom task from http://support.sas.com/documentation/onlinedoc/guide/release30/addins/

public string SasCode
{
get
{
string member = (bAllMembers || dataset.Length==0) ? "_ALL_" : dataset;
string co = catobs.ToString();
string macro = Global.ReadFileFromAssembly("EGAddin.CharacterizeData.Characterize_Data.sas");
string call = string.Format("%charact(dsn={0},lib={1},catobs={2});",member,library, co);
string charts = (bCharts) ? Global.ReadFileFromAssembly("EGAddin.CharacterizeData.GraphCode.sas") : "";

string code = macro + Environment.NewLine + call + Environment.NewLine + charts;

return code;
}
}

I guess most of my questions are really from VB side. Any resources of VB programming for a beginner you would share? Thanks a lot!
Community Manager
Posts: 2,891

Re: SAS EG Addin question

Here is the VB.NET version of this function:

Public Function get_SasCode() As String
Dim member As String = IIf((Me.bAllMembers OrElse (Me.dataset.Length = 0)), "_ALL_", Me.dataset)
Dim co As String = Me.catobs.ToString
Dim macro As String = Global.ReadFileFromAssembly("EGAddin.CharacterizeData.Characterize_Data.sas")
Dim call As String = String.Format("%charact(dsn={0},lib={1},catobs={2});", member, Me.library, co)
Dim charts As String = IIf(Me.bCharts, Global.ReadFileFromAssembly("EGAddin.CharacterizeData.GraphCode.sas"), "")
Return macro & Environment.NewLine & call & Environment.NewLine & charts
End Function


Great places to start with .NET development:
http://www.gotdotnet.com (Microsoft-supported community)
http://www.codeproject.com

Chris
N/A
Posts: 0

Re: SAS EG Addin question

Thanks a million Chris!
N/A
Posts: 0

Re: SAS EG Addin question

Hi Chris,
I have another question, under ISASTaskDescription, where does the Clsid come from, here's the example from the SAS custom task page,

Public ReadOnly Property Clsid() As String Implements SAS.EG.AddIns.ISASTaskDescription.Clsid
Get
Clsid = "7c02a543-9187-40ef-a835-b59420ce6fb9"
End Get
End Property


Thanks,
John
Community Manager
Posts: 2,891

Re: SAS EG Addin question

John,

The Clsid property returns a value called a GUID, which you can generate easily from a Visual Studio command prompt. Simply run "uuidgen", and it will generate one for you -- copy and paste it into your task code.

The Visual Studio templates that we provide (for VS2003) will generate the value for you. If you are developing a task without using the templates, you'll have to use uuidgen.

It's important to supply a unique value for the Clsid for each task. This value is how Enterprise Guide can distinguish one task from another. If you have two or more tasks with the same Clsid value in your \Custom directory, Enterprise Guide will show only the first one it finds.

Chris
N/A
Posts: 0

Re: SAS EG Addin question

Thanks again Chris!

Where do I copy the number generated by uuidgen.exe into? Clsid property or Assembly > UGID?

And why do I keep getting such addin manager error message "the add-in does not contain the correct interface signature"? Is that because I am using Visual Studio 2005?

Since I can't use the VS 2003 template, can you please confirm this:

All I need is an user interface Window form.vb and a classlibrary.vb implementing SASTask subs. All the other .vb like Assembly.vb will be generated by VS?

Cheers,
John
Message was edited by: John_learntoSAS at Jun 1, 2006 1:35 PM
Community Manager
Posts: 2,891

Re: SAS EG Addin question

John,

Yes, copy the GUID to the Clsid property implementation.

And yes, since you don't have the benefit of the templates, you need to implement ISASTask, ISASTaskAddIn, and ISASTaskDescription yourself. All of that is very easy with Visual Studio.

See my previous posting re: using VS2005. You cannot create custom tasks that use .NET 2.0 (EG 4.1 won't support that), so you'll need to target .NET 1.1 with VS2005. That's possible to do with an extension called MSBee available from Microsoft.

Chris
N/A
Posts: 0

Re: SAS EG Addin question

Thanks Chris, you are such a great help!
N/A
Posts: 0

Re: SAS EG Addin question

Thanks again Chris, I finished my little custom task and my boss was happy. One question though is how do I code the SAVE function (so I can save the process and schedule it just like the other tasks do)?


cheers,
John
N/A
Posts: 0

Re: SAS EG Addin question

Hi Chris,

The same question again. How do I code the SAVE function (so that the process is saved as a schedule task)? Much appreciated!

cheers,
John
Frequent Contributor
Posts: 81

Re: SAS EG Addin question

John,

You'll need to code a replacement Public Property for XmlState (in ISASTask), which reads and writes the state of the task in XML format. An example can be found in the following code (from ClassicHat.vb):

Public Property XmlState() As String Implements _
SAS.Shared.AddIns.ISASTask.XmlState
Get
Dim sw As StringWriter = New StringWriter
Dim writer As XmlTextWriter = New XmlTextWriter(sw)
writer.WriteStartElement("ClassicHat")
writer.WriteElementString("Size", _
XmlConvert.ToString(HatSize))
writer.WriteEndElement()
writer.Close()
XmlState = sw.ToString()
End Get
Set(ByVal Value As String)
If Value <> Nothing And Value.Length > 0 Then
Try
Dim sr As StringReader = New StringReader(Value)
Dim reader As XmlTextReader = New XmlTextReader(sr)
reader.ReadStartElement("ClassicHat")
HatSize = _
XmlConvert.ToInt32(reader.ReadElementString("Size"))
reader.ReadEndElement()
reader.Close()
Catch
End Try
End If
End Set
End Property

.............Phil
Ask a Question
Discussion stats
  • 12 replies
  • 237 views
  • 0 likes
  • 3 in conversation