マクロ変数の値を READONLY にして定数化できるのね。
https://support.sas.com/resources/papers/proceedings15/SAS1575-2015.pdf
https://support.sas.com/resources/papers/proceedings15/SAS1575-2015.pdf
SASプログラムとログを解析するユーティリティを開発するための備忘録です。This is a memo to develop utility that analyzes the SAS log.
SAS Viya CLIの入門として資料を書き起こしました。CLIを使ってViyaのシステムを管理したい人向けです。内容を以下に示します。
title "!SASROOT/sashelp/class.sas7bdat"; proc compare base="!SASROOT/sashelp/class.sas7bdat"(drop=age) compare="!SASROOT/sashelp/class.sas7bdat"; run; title;
$ export ACCESS_TOKEN=$(cat ~/.sas/credentials.json | jq -r '.Default."access-token"')
$ export URL=https://viya4.example.com/jobExecution/jobs
$ curl -k "${URL}?limit=1000&filter=and(ge(creationTimeStamp,2022-04-07),ne(state,"completed"))&orderby=endTimeStamp" -H "Authorization: Bearer $ACCESS_TOKEN" | jq -r '.items[] | [.state, .id, .jobRequest.name, .endTimeStamp, .creationTimeStamp, .modifiedTimeStamp, .elapsedTime, .createdBy, .modifiedBy, .error.message, .error.errorCode ]'
SASでREST APIを使うときにアンパサンドのエスケープでしばし悩んだのメモしておきます。URLの後ろにクエリパラメータを書くときに必要になります。&はマクロ変数を展開するときの目印であるので、これが展開されないように工夫します。で、いろいろ試したのですが1回で代入ではなく、2回の代入と関数の組み合わせで動きました。1回の代入でとも思いますが、通常URLはベースの部分とパラメータの部分に分かれるので、変数を分けた方が可読性が良いです。
追記: クエリのパラメータは PROC HTTPのオプションの機能を使う方がスマートだと判りました。以下の記事を参照してください。
http://sasutility.blogspot.com/2022/10/proc-http.html
UNIXだとsas.serversありますがWindowsにはありません。なかなか使い勝手の良いスクリプトが無かったのですが、PowerShellで書かれているサービス起動/停止のスクリプトがありました。このスクリプト、特に設定は無しでGet-ServiceでSASのサービスを探して、起動順序に従って処理してくれます。
Start/Stop all SAS Services in Windows using PowreShell
/* ジョブスケジューリングのJSONファイルとマップのファイルを定義 */ filename folders temp; filename jsonmap temp; /* JSONファイルを取得 */ proc http url="https://henteko.azure.com/jobFlowScheduling/flows" out=flows oauth_bearer=sas_services; headers 'Accept'='application/vnd.sas.collection+json'; run; /* JSONファイルの先頭をログに出力して確認するだけ */ data _null_; infile flows; length buf $4096; input buf 1-4096; put _all_; run; /* JSONエンジンで読み込ませて、マップは生成 */ libname flows json fileref=folders map=jsonmap automap=replace; /* 後はライブラリ参照名から要素と中身を見る */ proc print data=flows.items; run;