我在网上找到了一段代码来获取我需要的大部分内容,除了我还在寻找每个 VA 报告使用的 SAS 表名称。有没有办法使用数据步骤函数来写入元数据来做到这一点?
data MDIDs;
length Server_Uri rp_uri Metadata_ID Name _Name TypeName Path Location _Location MetadataCreated MetadataUpdated CreatedBy ModifiedBy $256;
length Created Modified 8.;
format Created Modified datetime19.;
nobj = 1;
n=1;
call missing(Metadata_ID, _Name, MetadataCreated, MetadataUpdated, Created, Modified, TypeName, Path, Server_Uri, _location, CreatedBy, ModifiedBy);
do while(n le nobj);
nobj=metadata_getnobj("omsobj:Transformation?@PublicType = 'Report.BI'",n,Server_Uri);
rc=metadata_getattr(Server_Uri,'Id',Metadata_ID);
rc=metadata_getattr(Server_Uri,'Name',_Name);
rc=metadata_getattr(Server_Uri,"MetadataCreated",MetadataCreated);
rc=metadata_getattr(Server_Uri,"MetadataUpdated",MetadataUpdated);
name=translate(translate(translate(translate(_name,"-","–"),"£","£"),"%","%"),"+","+");
Created=input(MetadataCreated,anydtdtm.);
Modified=input(MetadataUpdated,anydtdtm.);
rc=metadata_getattr(Server_Uri,"PublicType",TypeName);
numrp=metadata_getnasn(Server_Uri,"ResponsibleParties",1,rp_uri);
if numrp>0 then do;
numrp=metadata_getnasn(Server_Uri,"ResponsibleParties",1,rp_uri);
rc=metadata_getattr(rp_uri,"name",CreatedBy);
numrp=metadata_getnasn(Server_Uri,"ResponsibleParties",2,rp_uri);
rc=metadata_getattr(rp_uri,"name",ModifiedBy);
end;
TreesCount=metadata_getnasn(Server_Uri,"Trees",1,Server_Uri);
rc=metadata_getattr(Server_Uri,"Name",Path);
_tree=1;
do while (_tree>0);
_tree=metadata_getnasn(Server_Uri,"ParentTree",1,Server_Uri);
if _tree > 0 then do;
_rc=metadata_getattr(Server_Uri,"Name",_location);
Path=catx('/',_location,Path);
end;
end;
Location = '/'||Path;
output;
n=n+1;
end;
keep Metadata_ID Name TypeName Location Created Modified CreatedBy ModifiedBy;
run;
如有任何帮助,我们将不胜感激。谢谢!
根据您的版本,有两种方法可以执行此操作。 SAS 9.4 使用元数据服务器并使用 SAS 进行解析,而 SAS Viya 使用 API。
元数据服务器不会告诉您 VA 报告在 SAS 9.4 中使用哪些数据,但您可以提取报告 XML 并解析它以查找所有数据源。当您从元数据服务器上的报告文件中提取内容时,您将获得 XML。
所有数据源都属于
<DataSources>
标签。例如,这里我们有两个表加载到 LASR:CARS 和 CLASS。
<DataSources>
<DataSource label="CARS" type="relational" name="ds7">
<InMemoryResource resourceName="SBIP://METASERVER/Shared Data/LASR/AUTOLOAD/CARS(table)" label="AUTOLOAD.CARS"/>
<BusinessItemFolder>
...
</BusinessItemFolder>
</DataSource>
<DataSource label="CLASS" type="relational" name="ds19">
<InMemoryResource resourceName="SBIP://METASERVER/Shared Data/LASR/AUTOLOAD/CLASS(Table)" label="AUTOLOAD.CLASS"/>
<BusinessItemFolder>
...
</BusinessItemFolder>
</DataSource>
</DataSources>
您可以使用 SAS 提取它。
data want;
infile "/path/to/file/report.xml" lrecl=32676 length=len;
input line $varying32767. len;
if(find(upcase(line), '<DATASOURCE LABEL='));
table = scan(line, 2, '"');
drop line;
run;
table
CARS
CLASS
您可以使用 Viya REST API 获取报告 XML 并以类似的方式解析它。唯一的区别是您还需要获取 CASLIB。您将需要报告 URI,您可以从 SAS Drive 或通过复制报告链接来获取该 URI。 URI 看起来像 GUID,如下所示:
fc0331a6-311h-4267-84d8-512ec2ff375d
您可以通过转至报告服务的
/content
端点来获取 XML。例如:
https://myviyaserver.com/reports/reports/fc0331a6-311h-4267-84d8-512ec2ff375d/content
如果您想按名称查找系统上的每个报告 URI,您可以通过转到
/reports/reports/?limit=999999
获取 JSON 文件。请记住,如果您有大量报告,将其设置为非常高的限制将返回大量数据,因此请先尝试将其设置为较低的值,然后再进行测试。如果您不给它任何选项,它将默认为 20,这是一个很好的起点。
https://myviyaserver.com/reports/reports
JSON 输出
{
"links": [
...
],
"name": "reports",
"accept": "application/vnd.sas.summary",
"start": 0,
"items": [
{
"id": "fc0331a6-311h-4267-84d8-512ec2ff375d",
"name": "My Dashboard",
"createdBy": "[email protected]",
"creationTimeStamp": "2024-02-13T13:17:53.169Z",
"modifiedBy": "[email protected]",
"modifiedTimeStamp": "2024-02-15T09:39:13.190Z",
"links": [
...
]
},
{
"id": "ac019za6-421h-81d8-4c12-916ea235379d",
"name": "My Other Dashboard",
"createdBy": "[email protected]",
"creationTimeStamp": "2024-02-22T16:51:03.960Z",
"modifiedBy": "[email protected]",
"modifiedTimeStamp": "2024-02-23T15:43:42.874Z",
"links": [
...
]
},
...
您可以使用
PROC HTTP
在 SAS Studio 中完成这一切,并对数据步骤进行少量更改。
filename resp temp;
proc http
url="https://%scan(&_baseurl, -2, /)/reports/reports/fc0331a6-311h-4267-84d8-512ec2ff375d/content"
out=resp
method='get'
oauth_bearer=SAS_SERVICES;
run;
data want;
infile resp lrecl=32676 length=len;
input line $varying32767. len;
if(find(upcase(line), '<CASRESOURCE'));
caslib = scan(line, 4, '"');
table = scan(line, 6, '"');
keep caslib table;
run;
循环查看 Viya 中的每个 Visual Analytics 报告并获取数据源这是浏览报告列表并获取其数据,然后将其保存到单个文件的完整代码。
filename resp1 temp; * Response for JSON report list;
filename resp2 temp; * Response for XML;
%let limit = 20; *Limit the number of returned reports;
/* Get reports */
proc http
url="https://%scan(&_baseurl, -2, /)/reports/reports?limit=&limit"
out=resp1
method='get'
oauth_bearer=SAS_SERVICES;
run;
libname reports json "%sysfunc(pathname(resp1))";
/* Save every report name and ID to a macro variable */
data _null_;
set reports.items;
call symputx(cats('id', _N_), id);
call symputx(cats('name', _N_), name);
call symputx('n_reports', _N_);
run;
/* Loop through every ID and macro variable, pull its XML and get its data sources */
%macro get_report_data;
proc datasets lib=work nolist;
delete report_data;
quit;
%do i = 1 %to &n_reports;
%let id = &&id&i;
%let name = &&name&i;
/* Wait a few seconds between each attempt */
%let rc = %sysfunc(sleep(3, 1));
proc http
url="https://%scan(&_baseurl, -2, /)/reports/reports/&id/content"
out=resp2
method='get'
oauth_bearer=SAS_SERVICES;
run;
data tmp;
length name $100. id caslib table $50.;
infile resp2 lrecl=32676 length=len;
input line $varying32767. len;
if(find(upcase(line), '<CASRESOURCE'));
name = "&name";
id = "&id";
caslib = scan(line, 4, '"');
table = scan(line, 6, '"');
drop line;
run;
proc append base=report_data data=tmp;
run;
%end;
%mend;
%get_report_data;
name id caslib table
My Dashboard fc0331a6-311h-4267-84d8-512ec2ff375d PUBLIC CARS
My Other Dashboard ac019za6-421h-81d8-4c12-916ea235379d PUBLIC CLASS