Date: Tue, 26 Feb 2008 09:53:38 -0500
Reply-To: Gerhard Hellriegel <gerhard.hellriegel@T-ONLINE.DE>
Sender: "SAS(r) Discussion" <SAS-L@LISTSERV.UGA.EDU>
From: Gerhard Hellriegel <gerhard.hellriegel@T-ONLINE.DE>
Subject: Re: Passing variables from data step to macro while avoiding
loops. Is it possible?
by the way:
what I understood from the title:
bring different values to macro-variables (or to a macro) without loop -
I'm not sure how that could be done WITH a loop? Ok, with SET xxx POINT=...
but what's the sense?
set xxx;
call symput("no",_n_);
call symput("n"!!put(_n_,9. -L),value);
where is a loop here? Or: how can the automatic "loop" be avoided and why?
Sorry, I don't understand that.
On Tue, 26 Feb 2008 09:13:27 -0500, Gerhard Hellriegel
<gerhard.hellriegel@T-ONLINE.DE> wrote:
>Howard,
>yes, I'm confused:
>"...to avoid a program that doesn't need loops...". I'm german and my
>english isn't good. If I understand that right, that means " I don't want
>programs without loops..." or in simpler words "...I want only programs
>with loops".
>Ok, but I think we now have all possible scenarios...
>Thanks,
>Gerhard
>
>
>On Tue, 26 Feb 2008 08:56:37 -0500, Howard Schreier <hs AT dc-sug DOT org>
><schreier.junk.mail@GMAIL.COM> wrote:
>
>>On Tue, 26 Feb 2008 03:11:13 -0500, Gerhard Hellriegel
>><gerhard.hellriegel@T-ONLINE.DE> wrote:
>>
>>>Without reading it all. An example to bring all "ages" of SASHELP.CLASS
>to
>>>macro variables:
>>>
>>>%let no=0; /* dont forget that if the dataset might be empty! */
>>>data _null_;
>>> set sashelp.class;
>>> call symput("no",_n_); /* you need the number */
>>> call symput("age"!!put(_n_,8. -L),age);
>>>run;
>>>
>>>What can you do with that?
>>>
>>>%macro doit;
>>> %do i=1 %to &no;
>>> %put &&age&i = AGE &i;
>>> %end;
>>>%mend;
>>>%doit;
>>>
>>>If you use such a %do loop in a DATA step, you can avoid e.g. a loop,
>>>instead you generate all the 19 lines-of-code. Sometimes that might be
>>>faster.
>>>Gerhard
>>>
>>
>>I think Naveen wanted to *avoid* this sort of thing (macro loops and
>>constellations of macro variables) and instead have the automatic looping
>of
>>the DATA step drive things. Then Toby's pointer to CALL EXECUTE is the
>right
>>direction.
>>
>>>
>>>On Mon, 25 Feb 2008 20:48:26 -0500, Nancy Brucken <brucken@PROVIDE.NET>
>>>wrote:
>>>
>>>>Hi,
>>>>
>>>>In addition to Ron's suggestion to move the RUN; statement after your
>CALL
>>>>SYMPUT, you also need to modify your CALL SYMPUT statement if you want
>to
>>>>store all 20 of your values in separate macro variables &STK1-&STK20.
>As
>>>>your code stands right now, every time SAS reads in another
observation,
>>>>the value of SYMBOL on that record is stored in &STK. Thus, the values
>>>>keep overwriting each other, until on the 20th time through, &STK = the
>>>>value of SYMBOL on your 20th record.
>>>>
>>>>If you want to store all of the values of SYMBOL in separate macro
>>>>variables, change your CALL SYMPUT statement to read:
>>>>
>>>>call symput("stk" || trim(left(put(_n_, 2.))), put(symbol, $10.));
>>>>
>>>>If you're running SAS 9, you can use one of the CAT functions to do the
>>>>concatenation (but I'm still stuck in the version 8 world for now, so
>have
>>>>to live with that syntax).
>>>>
>>>>Hope this helps,
>>>> Nancy
>>>>
>>>>Nancy Brucken
>>>>brucken@provide.net
>>>>
>>>>
>>>>On Mon, 25 Feb 2008 14:55:13 -0500, Fehd, Ronald J. (CDC/CCHIS/NCPHI)
>>>><rjf2@CDC.GOV> wrote:
>>>>
>>>>>yes, as Toby said you need call execute
>>>>>
>>>>>Here are some examples that call parameterized include files:
>>>>>
>>>>>http://www.sascommunity.org/wiki/Summarize_Memnames_in_Libname
>>>>>
>>>>>the reason that you get the error:
>>>>>
>>>>>> WARNING: Apparent symbolic reference STK not resolved.
>>>>>
>>>>>is because you do not have a run after your call symput:
>>>>>
>>>>>> call symput("stk", put(symbol, $10.)); *Creates the global variable
>>>>>> "stk" with whatever is in the PDV for symbol. I think???;
>>>>>
>>>>>*>>>--->; run; *<---<<<;
>>>>>
>>>>>> %quotes (symbol=&stk, start=11/1/45, end = 11/1/09); *Macro that
>>>>>> created a separate datasets based on the argument supplied for
>>>>>> "symbol=";
>>>>>
>>>>>if your macro does not have complexity,
>>>>>then reduce it to a parameterized include file
>>>>>and call execute will handle it for you.
>>>>>
>>>>>Ron Fehd the macro maven CDC Atlanta GA USA RJF2 at cdc dot gov
>>>>>
>>>>>
>>>>>> -----Original Message-----
>>>>>> From: owner-sas-l@listserv.uga.edu
>>>>>> [mailto:owner-sas-l@listserv.uga.edu] On Behalf Of NMani
>>>>>> Sent: Monday, February 25, 2008 1:14 PM
>>>>>> To: sas-l@uga.edu
>>>>>> Subject: Passing variables from data step to macro while
>>>>>> avoiding loops. Is it possible?
>>>>>>
>>>>>> Dear SAS Experts;
>>>>>>
>>>>>> (1) I'm very confused. I thought I could exploit the data step to
>>>>>> avoid creating a program that doesn't need loops but I'm having
>>>>>> trouble understanding how to pass variable from the data step to the
>>>>>> macro within the data step itself. If I take the macro outside the
>>>>>> data step, the program will work but only for the 20th symbol the
>>>>>> "test1" dataset. I think the problem might be that the PDV
>initializes
>>>>>> null and that's messing up the program. I don't really know though.
>>>>>> Can someone offer me an idea on what's happening in the
>>>>>> background and/
>>>>>> or any suggestions on making this program work.
>>>>>>
>>>>>> (2) If my program runs into a symbol and returns an error
>>>>>> message(usually if the symbol cannot be found on yahoo's database)
>>>>>> then it stops. For those Visual Basic programmers there's a line of
>>>>>> code, "One Error Resume Next" that forces the program to continue
>even
>>>>>> if an error is generated. Is there a SAS equivalent?
>>>>>>
>>>>>> Sincerely,
>>>>>>
>>>>>> A student preparing for his base sas certification
>>>>>>
>>>>>>
>>>>>> --------------------------------------------------------------
>>>>>> --------------------------------------------------
>>>>>> CODE:
>>>>>>
>>>>>> data blah; *Random name, should be _null_ but keeping it blah for
>>>>>> testing reasons;
>>>>>>
>>>>>> set test1(obs=20); *Contains the dataset with the ticker names under
>>>>>> the variable name "symbol";
>>>>>>
>>>>>> call symput("stk", put(symbol, $10.)); *Creates the global variable
>>>>>> "stk" with whatever is in the PDV for symbol. I think???;
>>>>>>
>>>>>> %quotes (symbol=&stk, start=11/1/45, end = 11/1/09); *Macro that
>>>>>> created a separate datasets based on the argument supplied for
>>>>>> "symbol=";
>>>>>>
>>>>>> run;
>>>>>>
>>>>>>
>>>>>> LOG:
>>>>>> 127 data blah;
>>>>>> 128 set test1(obs=20);
>>>>>> 129
>>>>>> 130 call symput("stk", put(symbol, $10.));
>>>>>> 131 %quotes (symbol=&stk, start=11/1/45, end = 11/1/09);
>>>>>> WARNING: Apparent symbolic reference STK not resolved.
>>>>>
>>>>>> http://table.finance.yahoo.com:80/table.csv?s=&STK&a=10&b=1&c=
>>>>>> 1945&d=10&e=1&f=2009&g=d
>>>>>> WARNING: Apparent symbolic reference STK not resolved.
>>>>>> WARNING: Apparent symbolic reference STK not resolved.
>>>>>>
>>>>>> NOTE: There were 20 observations read from the data set WORK.TEST1.
>>>>>> NOTE: The data set WORK.BLAH has 20 observations and 5 variables.
>>>>>> NOTE: DATA statement used (Total process time):
>>>>>> real time 0.05 seconds
>>>>>> cpu time 0.03 seconds
>>>>>>
>>>>>>
>>>>>> NOTE: Line generated by the macro variable "SYMBOL".
>>>>>> 1 &STK
>>>>>> -
>>>>>> 22
>>>>>> ---
>>>>>> 202
>>>>>>
>>>>>> ERROR 22-322: Syntax error, expecting one of the following: a name,
a
>>>>>> quoted string, /, ;, _DATA_,
>>>>>> _LAST_, _NULL_.
>>>>>>
>>>>>> ERROR 202-322: The option or parameter is not recognized and will be
>>>>>> ignored.
>>>>>>
>>>>>> NOTE: The SAS System stopped processing this step because of errors.
>>>>>> WARNING: The data set WORK.STK may be incomplete. When this step
was
>>>>>> stopped there were 0
>>>>>> observations and 7 variables.
>>>>>> NOTE: DATA statement used (Total process time):
>>>>>> real time 0.02 seconds
>>>>>> cpu time 0.03 seconds
>>>>>>
>>>>>>
>>>>>> 132 run;
>>>>>>
>>>>>>
|