From 6c6c45b85c5b479dbb3f5043524cbf61f3e82d4e Mon Sep 17 00:00:00 2001 From: 4gl <@> Date: Thu, 14 May 2026 17:29:26 +0100 Subject: [PATCH 1/2] fix: issue with running jobs in viya2026 (all params must be strings) --- tests/testinit.sas | 2 ++ tests/viyaonly/mv_jobflow.test.1.sas | 10 +++--- tests/viyaonly/mv_jobflow.test.2.sas | 10 +++--- viya/mv_jobflow.sas | 53 ++++++++++++++++++---------- 4 files changed, 46 insertions(+), 29 deletions(-) diff --git a/tests/testinit.sas b/tests/testinit.sas index 0e1bb09c..dfeef920 100644 --- a/tests/testinit.sas +++ b/tests/testinit.sas @@ -12,6 +12,8 @@ /* location in metadata or SAS Drive for temporary files */ %let mcTestAppLoc=/Users/&sysuserid/testresults/sasjs_core/%mf_uid(); +%let mcTestContext=SAS Job Execution compute context; + /* set defaults */ %mp_init() diff --git a/tests/viyaonly/mv_jobflow.test.1.sas b/tests/viyaonly/mv_jobflow.test.1.sas index 7fccbc8b..e1d54bfc 100644 --- a/tests/viyaonly/mv_jobflow.test.1.sas +++ b/tests/viyaonly/mv_jobflow.test.1.sas @@ -33,19 +33,19 @@ data _null_; ; run; -%mv_createjob(path=/Public/temp,name=demo1,code=testprog) -%mv_createjob(path=/Public/temp,name=demo2,code=testprog) +%mv_createjob(path=&mcTestAppLoc,name=demo1,code=testprog) +%mv_createjob(path=&mcTestAppLoc,name=demo2,code=testprog) data work.inputjobs; - _contextName='SAS Job Execution compute context'; + _contextName="&mcTestContext"; do flow_id=1 to 2; do i=1 to 4; - _program='/Public/temp/demo1'; + _program="&mcTestAppLoc/demo1"; macrovar1=10*i; macrovar2=4*i; output; i+1; - _program='/Public/temp/demo2'; + _program="&mcTestAppLoc/demo2"; macrovar1=40*i; macrovar2=44*i; output; diff --git a/tests/viyaonly/mv_jobflow.test.2.sas b/tests/viyaonly/mv_jobflow.test.2.sas index 7bd9d2a1..1e45df51 100644 --- a/tests/viyaonly/mv_jobflow.test.2.sas +++ b/tests/viyaonly/mv_jobflow.test.2.sas @@ -29,19 +29,19 @@ data _null_; ; run; -%mv_createjob(path=/Public/temp,name=demo1,code=testprog) -%mv_createjob(path=/Public/temp,name=demo2,code=testprog) +%mv_createjob(path=&mcTestAppLoc,name=demo1,code=testprog) +%mv_createjob(path=&mcTestAppLoc,name=demo2,code=testprog) data work.inputjobs; - _contextName='SAS Job Execution compute context'; + _contextName="&mcTestContext"; do flow_id=1 to 2; do i=1 to 4; - _program='/Public/temp/demo1'; + _program="&mcTestAppLoc/demo1"; macrovar1=10*i; macrovar2=4*i; output; i+1; - _program='/Public/temp/demo2'; + _program="&mcTestAppLoc/demo2"; macrovar1=40*i; macrovar2=44*i; output; diff --git a/viya/mv_jobflow.sas b/viya/mv_jobflow.sas index 9846fb28..661adf23 100644 --- a/viya/mv_jobflow.sas +++ b/viya/mv_jobflow.sas @@ -121,7 +121,7 @@ @li mf_nobs.sas @li mp_abort.sas @li mf_getplatform.sas - @li mf_getuniquefileref.sas + @li mf_getvarlist.sas @li mf_existvarlist.sas @li mv_jobwaitfor.sas @li mv_jobexecute.sas @@ -234,14 +234,12 @@ data _null_; if last then call symputx('flowcnt',cnt,'l'); run; -/* prepare temporary datasets and frefs */ -%local fid jid jds jjson jdsapp jdsrunning jdswaitfor jfref; +/* prepare temporary datasets */ +%local fid jid jds jdsapp jdsrunning jdswaitfor; data;run;%let jds=&syslast; -data;run;%let jjson=&syslast; data;run;%let jdsapp=&syslast; data;run;%let jdsrunning=&syslast; data;run;%let jdswaitfor=&syslast; -%let jfref=%mf_getuniquefileref(); /* start loop */ %do fid=1 %to &flowcnt; @@ -259,23 +257,39 @@ data;run;%let jdswaitfor=&syslast; &dbg. if _n_= 1 then putlog "Loop &fid"; &dbg. putlog (_all_)(=); run; + /* build list of char and num vars in json format */ + /* Viya 2026 expects all values to be strings */ + %local nvars cvars ii _vnm; + %let cvars=%mf_getvarlist(&jds,typefilter=C); + %let nvars=%mf_getvarlist(&jds,typefilter=N); %put exporting job variables in json format; %do jid=1 %to &jcnt; - data &jjson; - set &jds; - if _n_=&jid then do; - output; - stop; - end; - run; - proc json out=&jfref; - export &jjson / nosastags fmtnumeric; - run; data _null_; - infile &jfref lrecl=32767; - input; - jparams=cats('jparams',symget('jid')); - call symputx(jparams,substr(_infile_,3,length(_infile_)-4)); + set &jds; + if _n_=&jid; + length _param $32767; + _param=''; + %if %length(&cvars)>0 %then %do ii=1 %to %sysfunc(countw(&cvars,%str( ))); + %let _vnm=%scan(&cvars,&ii,%str( )); + if _param ne '' then _param=cats(_param,','); + _param=cats(_param,'"' + ,"%lowcase(&_vnm)" + ,'":' + ,quote(trim(&_vnm)) + ); + %end; + %if %length(&nvars)>0 %then %do ii=1 %to %sysfunc(countw(&nvars,%str( ))); + %let _vnm=%scan(&nvars,&ii,%str( )); + if _param ne '' then _param=cats(_param,','); + _param=cats(_param,'"' + ,"%lowcase(&_vnm)" + ,'":"' + ,strip(put(&_vnm,best32.)) + ,'"' + ); + %end; + call symputx(cats('jparams',&jid),_param,'l'); + stop; run; %local jobuid&jid; %let jobuid&jid=0; /* used in next loop */ @@ -320,6 +334,7 @@ data;run;%let jdswaitfor=&syslast; ,paramstring=%superq(jparams&jid) ,outds=&jdsapp ,contextname=&&context&jid + ,mdebug=&mdebug ) data &jdsapp; format jobparams $32767.; From 70efaf84e123b279ffe43be25771fe7c0487886c Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 14 May 2026 16:29:48 +0000 Subject: [PATCH 2/2] chore: updating all.sas --- all.sas | 53 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/all.sas b/all.sas index b3d8a0e0..6335d9f1 100644 --- a/all.sas +++ b/all.sas @@ -29281,7 +29281,7 @@ run; @li mf_nobs.sas @li mp_abort.sas @li mf_getplatform.sas - @li mf_getuniquefileref.sas + @li mf_getvarlist.sas @li mf_existvarlist.sas @li mv_jobwaitfor.sas @li mv_jobexecute.sas @@ -29394,14 +29394,12 @@ data _null_; if last then call symputx('flowcnt',cnt,'l'); run; -/* prepare temporary datasets and frefs */ -%local fid jid jds jjson jdsapp jdsrunning jdswaitfor jfref; +/* prepare temporary datasets */ +%local fid jid jds jdsapp jdsrunning jdswaitfor; data;run;%let jds=&syslast; -data;run;%let jjson=&syslast; data;run;%let jdsapp=&syslast; data;run;%let jdsrunning=&syslast; data;run;%let jdswaitfor=&syslast; -%let jfref=%mf_getuniquefileref(); /* start loop */ %do fid=1 %to &flowcnt; @@ -29419,23 +29417,39 @@ data;run;%let jdswaitfor=&syslast; &dbg. if _n_= 1 then putlog "Loop &fid"; &dbg. putlog (_all_)(=); run; + /* build list of char and num vars in json format */ + /* Viya 2026 expects all values to be strings */ + %local nvars cvars ii _vnm; + %let cvars=%mf_getvarlist(&jds,typefilter=C); + %let nvars=%mf_getvarlist(&jds,typefilter=N); %put exporting job variables in json format; %do jid=1 %to &jcnt; - data &jjson; - set &jds; - if _n_=&jid then do; - output; - stop; - end; - run; - proc json out=&jfref; - export &jjson / nosastags fmtnumeric; - run; data _null_; - infile &jfref lrecl=32767; - input; - jparams=cats('jparams',symget('jid')); - call symputx(jparams,substr(_infile_,3,length(_infile_)-4)); + set &jds; + if _n_=&jid; + length _param $32767; + _param=''; + %if %length(&cvars)>0 %then %do ii=1 %to %sysfunc(countw(&cvars,%str( ))); + %let _vnm=%scan(&cvars,&ii,%str( )); + if _param ne '' then _param=cats(_param,','); + _param=cats(_param,'"' + ,"%lowcase(&_vnm)" + ,'":' + ,quote(trim(&_vnm)) + ); + %end; + %if %length(&nvars)>0 %then %do ii=1 %to %sysfunc(countw(&nvars,%str( ))); + %let _vnm=%scan(&nvars,&ii,%str( )); + if _param ne '' then _param=cats(_param,','); + _param=cats(_param,'"' + ,"%lowcase(&_vnm)" + ,'":"' + ,strip(put(&_vnm,best32.)) + ,'"' + ); + %end; + call symputx(cats('jparams',&jid),_param,'l'); + stop; run; %local jobuid&jid; %let jobuid&jid=0; /* used in next loop */ @@ -29480,6 +29494,7 @@ data;run;%let jdswaitfor=&syslast; ,paramstring=%superq(jparams&jid) ,outds=&jdsapp ,contextname=&&context&jid + ,mdebug=&mdebug ) data &jdsapp; format jobparams $32767.;