DATA Step, Macro, Functions and more

%SYSLPUT in a macro

Reply
Occasional Contributor
Posts: 19

%SYSLPUT in a macro

I try to connect remote session via rsubmit and I need to pass a parameter to remote session using %syslput. But I have to do it in a macro.

So I have read a problem note in support SAS (http://support.sas.com/kb/47/072.html) , it recommends to use %nrstr expression. But when I use

%nrstr I get a message like

ERROR 180-322: Statement is not valid or it is used out of proper order.

macro >>>

%macro master_test(papa);

  %put ########### Construction type is &papa ###########;

  libname consdata '.....\CONSTRUCTION_DATA';

  options autosignon=yes sascmd='sas -nosyntaxcheck -autoexec "C:\......\autoexec.sas"';

  %NRSTR(%syslput _global_/like='papa' remote=EXTRCTN);

  rsubmit  process=EXTRCTN wait=yes persist=no;

  options autosignon=yes notes sascmd='sas -nosyntaxcheck -autoexec "C:\........\autoexec_for_MASTER.sas"';

  %let e_construction_type=&papa;

  %NRSTR(%syslput _global_/like='e_construction_type' remote=EUSD);

       rsubmit  process=EUSD wait=no persist=no ;

           data a;

                 a=45;  

            run;

       endrsubmit;

  waitfor _all_ EUSD;

  endrsubmit;

%mend;

Best Regards

PROC Star
Posts: 1,324

Re: %SYSLPUT in a macro

Hi,

I haven't used SAS/Connect in many years, so these are mostly guesses.

If you take the code out of the macro, does it work?  (I'm hoping the answer is no)

I noticed a line in the docs for %syslput:

"To use %SYSLPUT, you must have initiated a link between a local SAS session or client and a remote SAS session or server using the SIGNON command or SIGNON statement. For more information, see the documentation for SAS/CONNECT software."

I see you have the autosignon option, which is honored by the rsubmit statement.  Maybe %syslput can't honor the autosignon, so it doesn't know there is a remote session to write to.

--Q.

Occasional Contributor
Posts: 19

Re: %SYSLPUT in a macro

Unfortunately it works out of the macro block

PROC Star
Posts: 1,324

Re: %SYSLPUT in a macro

Another wild guess would be to %unqoute it:

 %unquote(%NRSTR(%syslput _global_/like='papa' remote=EXTRCTN));


Occasional Contributor
Posts: 19

Re: %SYSLPUT in a macro

Hi Quentin,

thanx for your reply , I hoped that your recommendation would be useful but it didn't... Below the code and you can see the error log on the bottom.

%macro master_test(papa);

  options autosignon=yes sascmd='sas -nosyntaxcheck -autoexec "C:\....\autoexec_for_MASTER.sas"';

  %unquote(%NRSTR(%syslput _global_/like='papa' remote=EXTRCTN));

  rsubmit  process=EXTRCTN wait=yes persist=no;

  options autosignon=yes notes sascmd='sas -nosyntaxcheck -autoexec "C:\....\autoexec_for_MASTER.sas"';

  %let e_construction_type=&papa;

  %unquote(%NRSTR(%syslput _global_/like='e_construction_type' remote=EUSD));

  rsubmit  process=EUSD wait=no persist=no;

       data a;

            a=&e_construction_type;

       run;

  endrsubmit;

  waitfor _all_ EUSD;

  endrsubmit;

%mend;

NOTE: Remote signon to EXTRCTN commencing (SAS Release 9.03.01M1P110211).

NOTE: Unable to open SASUSER.PROFILE. WORK.PROFILE will be opened instead.

NOTE: All profile changes will be lost at the end of the session.

NOTE: Copyright (c) 2002-2010 by SAS Institute Inc., Cary, NC, USA.

NOTE: SAS (r) Proprietary Software 9.3 (TS1M1)

      Licensed to ############., Site ########.

NOTE: This session is executing on the X64_S08R2  platform.

NOTE: Updated analytical products:

SAS/STAT 9.3_M1

NOTE: SAS initialization used:

      real time           0.09 seconds

      cpu time            0.10 seconds

NOTE: AUTOEXEC processing beginning; file is C:\..........................\autoexec_for_MASTER.sas.

NOTE: PROCEDURE PRINTTO used (Total process time):

      real time           0.00 seconds

      cpu time            0.00 seconds

NOTE: AUTOEXEC processing completed.

NOTE: Remote signon to EXTRCTN complete.

NOTE: Remote submit to EXTRCTN commencing.

1     options autosignon=yes notes sascmd='sas -nosyntaxcheck -autoexec "C:\.................\autoexec_for_MASTER.sas"';

2     %unquote(%syslput _global_/like='e_construction_type' remote=EUSD);

ERROR: Unrecognized option to the %SYSLPUT statement.

3     rsubmit process=EUSD wait=no persist=no;

4     data a;

5     a=&e_construction_type;

WARNING: Apparent symbolic reference E_CONSTRUCTION_TYPE not resolved.

6     run;

7     endrsubmit;

8     waitfor _all_ EUSD;

NOTE: Remote submit to EXTRCTN complete.

NOTE: Remote signoff from EXTRCTN commencing.

NOTE: Remote signon to EUSD commencing (SAS Release 9.03.01M1P110211).

NOTE: Unable to open SASUSER.PROFILE. WORK.PROFILE will be opened instead.

NOTE: All profile changes will be lost at the end of the session.

NOTE: Copyright (c) 2002-2010 by SAS Institute Inc., Cary, NC, USA.

NOTE: SAS (r) Proprietary Software 9.3 (TS1M1)

      Licensed to #########, Site ###########.

NOTE: This session is executing on the X64_S08R2  platform.

NOTE: Updated analytical products:

SAS/STAT 9.3_M1

NOTE: SAS initialization used:

      real time           0.07 seconds

      cpu time            0.07 seconds

NOTE: AUTOEXEC processing beginning; file is C:\................\autoexec_for_MASTER.sas.

NOTE: PROCEDURE PRINTTO used (Total process time):

      real time           0.00 seconds

      cpu time            0.00 seconds

NOTE: AUTOEXEC processing completed.

NOTE: Remote signon to EUSD complete.

NOTE: Background remote submit to EUSD in progress.

NOTE: Remote submit to EUSD commencing.

1     data a;

2     a=&e_construction_type;

        -

        22

WARNING: Apparent symbolic reference E_CONSTRUCTION_TYPE not resolved.

ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant, a missing value, INPUT, PUT.

3     run;

NOTE: The SAS System stopped processing this step because of errors.

WARNING: The data set WORK.A may be incomplete.  When this step was stopped there were 0 observations and 2 variables.

NOTE: DATA statement used (Total process time):

      real time           0.01 seconds

      cpu time            0.00 seconds

NOTE: Remote submit to EUSD complete.

NOTE: Remote signoff from EUSD commencing.

NOTE: SAS Institute Inc., SAS Campus Drive, Cary, NC USA 27513-2414

NOTE: The SAS System used:

      real time           0.41 seconds

      cpu time            0.21 seconds

NOTE: Remote signoff from EUSD complete.

NOTE: SAS Institute Inc., SAS Campus Drive, Cary, NC USA 27513-2414

NOTE: The SAS System used:

      real time           1.00 seconds

      cpu time            0.26 seconds

NOTE: Remote signoff from EXTRCTN complete.

Super Contributor
Posts: 644

Re: %SYSLPUT in a macro

It looks to me like you have a 'race condition', ie statements are being executed out of order with respect to which remote session you wish to connect to:

NOTE: Remote submit to EXTRCTN commencing.

1     options autosignon=yes notes sascmd='sas -nosyntaxcheck -autoexec "C:\.................\autoexec_for_MASTER.sas"';

2     %unquote(%syslput _global_/like='e_construction_type' remote=EUSD);

ERROR: Unrecognized option to the %SYSLPUT statement.

System has connected to EXTRCTN but not yet to EUSD hence the option remote=EUSD is not recognised.

You may need to rearrange the macro to have explicit signons to each remote before using %syslput.

Occasional Contributor
Posts: 19

Re: %SYSLPUT in a macro

Posted in reply to RichardinOz

Hi ,

I think that problem isn't that. Because same code works fine when it is not contained by %macro %mend block.

Another point is within the macro block SAS start to read lines as a macro but when it see the %SYSLPUT expression it starts to execute the code immediately.

But still if you can give me a sample using explicit signon I try with pleasure

Best Regards.

Super Contributor
Posts: 644

Re: %SYSLPUT in a macro

It seems clear to me from the log that the connection to EXTRCTN happens relatively quickly but the

connection to EUSD takes longer.  The first %syslput statement appears to have executed successfully.

Meanwhile the second %sylput statement (with remote=EUSD) appears to have been executed locally before the connection was complete.  I think you need some statement to force the connection before the %syslput is executed.

I don't have access to a SAS environment with multiple remote sessions so this is my best guess: place dummy rsubmit statements before %syslput commands.

%macro master_test(papa);

  options autosignon=yes sascmd='sas -nosyntaxcheck -autoexec "C:\....\autoexec_for_MASTER.sas"';

  rsubmit  process=EXTRCTN wait=yes ;

  endrsubmit ;

  %unquote(%NRSTR(%syslput _global_/like='papa' remote=EXTRCTN));

  options autosignon=yes notes sascmd='sas -nosyntaxcheck -autoexec "C:\....\autoexec_for_MASTER.sas"';

  %let e_construction_type=&papa;

  rsubmit  process=EUSD wait=yes ;

  endrsubmit ;

  %unquote(%NRSTR(%syslput _global_/like='e_construction_type' remote=EUSD));

  rsubmit  process=EUSD wait=no persist=no;

       data a;

            a=&e_construction_type;

       run;

  endrsubmit;

  waitfor _all_ EUSD;

  endrsubmit;

%mend;

Regular Contributor
Posts: 218

Re: %SYSLPUT in a macro

Hi,

Please double check and look-up examples from either the on-line help, or the SAS/Connect User Guide.

You can use %SYSLPUT on it's own. You don't need to wrap it inside %NRSTR!

I have always used it like this

%syslput <remote macro variable name>  = [some value | &<local macro variable name>] /remote=<Remote host Name>;

Hope this helps,

Ahmed

Occasional Contributor
Posts: 19

Re: %SYSLPUT in a macro

Posted in reply to AhmedAl_Attar

Hi Ahmed ,

problem isn't %syslput , it works fine , but if you use it in a macro block you will encounter this problem.

Check this out >>> http://support.sas.com/kb/47/072.html

Best Regards

Super User
Super User
Posts: 7,070

Re: %SYSLPUT in a macro

Where did you define the macro variable as GLOBAL?  The first reference I see to e_construction_type is inside the macro definition.

Try this sample program.

%macro test;

  %local mvar;

  %let mvar=local value;

  %syslput _global_ /like='mvar' ;

%mend test;

%let mvar=global value;

%test;

rsubmit;

  %put mvar="&mvar";

endrsubmit;

Occasional Contributor
Posts: 19

Re: %SYSLPUT in a macro

Hi Tom ,

I have to use %syslput in macro block , like below.

%macro test;

  %let mvar=5;

  %syslput _global_ /like='mvar' ;

       rsubmit;

            %put mvar="&mvar";    

       endrsubmit;

%mend test;

%test;

Best Regards

Super User
Super User
Posts: 7,070

Re: %SYSLPUT in a macro

Still looks like you are trying to use SYSLPUT to copy the value of GLOBAL macro variable.  The only definition of MVAR is within the macro TEST so it will not by in the GLOBAL symbol table.  Try adding a %GLOBAL MVAR; statement before the %LET statement in your test macro.

Occasional Contributor
Posts: 19

Re: %SYSLPUT in a macro

When I use %global get the error message below

ERROR: Attempt to %GLOBAL a name (PAPA) which exists in a local environment.

Occasional Contributor
Posts: 19

Re: %SYSLPUT in a macro

Actualy my problem is that I cant mask %syslput expression from normal execution. I have to execute %syslput expression in macro execution period. The note about this issue in SAS support says to use %NRSTR , but it doesnt work.

Ask a Question
Discussion stats
  • 28 replies
  • 2400 views
  • 0 likes
  • 6 in conversation