从 EG(元数据)获取 SAS VA 报告名称和 SAS 表名称

问题描述 投票:0回答:1

我在网上找到了一段代码来获取我需要的大部分内容,除了我还在寻找每个 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
1个回答
0
投票

根据您的版本,有两种方法可以执行此操作。 SAS 9.4 使用元数据服务器并使用 SAS 进行解析,而 SAS Viya 使用 API。

SAS 9.4

元数据服务器不会告诉您 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

SAS 维亚

您可以使用 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
© www.soinside.com 2019 - 2024. All rights reserved.