Les données sont générées dynamiquement en interrogeant le serveur de métadonnées SAS 9 via PROC METADATA. Aucune source de données externe ou table SASHELP n'est utilisée.
1 Bloc de code
PROC METADATA Data
Explication : Ce bloc utilise PROC METADATA pour envoyer une requête XML au serveur de métadonnées SAS. Si le paramètre 'user' est à 0, il demande tous les objets de type 'Person'. Sinon, il construit une requête XML plus complexe avec un filtre pour rechercher un utilisateur spécifique par son nom. La réponse XML du serveur est stockée dans le fileref temporaire 'response'.
Copié !
%macro mm_getusers(
outds=work.mm_getusers,
user=0
)/*/STORE SOURCE*/;
filename response temp;
%if %superq(user)=0 %then %do;
proc metadata in= '<GetMetadataObjects>
<Reposid>$METAREPOSITORY</Reposid>
<Type>Person</Type>
<NS>SAS</NS>
<Flags>0</Flags>
<Options>
<Templates>
<Person Name=""/>
</Templates>
</Options>
</GetMetadataObjects>'
out=response;
run;
%end;
%else %do;
filename inref temp;
data _null_;
file inref;
put "<GetMetadataObjects>";
put "<Reposid>$METAREPOSITORY</Reposid>";
put "<Type>Person</Type>";
put "<NS>SAS</NS>";
put "<!-- Specify the OMI_XMLSELECT (128) flag -->";
put "<Flags>128</Flags>";
put "<Options>";
put "<Templates>";
put '<Person Name=""/>';
put "</Templates>";
length string $10000;
string=cats('<XMLSELECT search="Person[ @Name=',"'&user'",']"/>');
put string;
put "</Options>";
put "</GetMetadataObjects>";
run;
proc metadata in=inref out=response;
run;
%end;
1
%macro mm_getusers(
2
outds=work.mm_getusers,
3
user=0
4
)/*/STORE SOURCE*/;
5
6
filename response temp;
7
%IF %superq(user)=0 %THEN %DO;
8
PROC METADATA in= '<GetMetadataObjects>
9
<Reposid>$METAREPOSITORY</Reposid>
10
<Type>Person</Type>
11
<NS>SAS</NS>
12
<Flags>0</Flags>
13
<Options>
14
<Templates>
15
<Person Name=""/>
16
</Templates>
17
</Options>
18
</GetMetadataObjects>'
19
out=response;
20
RUN;
21
%END;
22
%ELSE %DO;
23
filename inref temp;
24
DATA _null_;
25
file inref;
26
put "<GetMetadataObjects>";
27
put "<Reposid>$METAREPOSITORY</Reposid>";
28
put "<Type>Person</Type>";
29
put "<NS>SAS</NS>";
30
put "<!-- Specify the OMI_XMLSELECT (128) flag -->";
Explication : Cette étape DATA _NULL_ génère dynamiquement une map XML (SXLEMAP) dans un fileref temporaire. Cette map définit comment transformer les données XML hiérarchiques (reçues de PROC METADATA) en une structure de table SAS à deux colonnes : 'uri' et 'name', en utilisant des expressions XPath pour localiser les attributs Id et Name des éléments Person.
Copié !
filename sxlemap temp;
data _null_;
file sxlemap;
put '<SXLEMAP version="1.2" name="SASObjects"><TABLE name="SASObjects">';
put "<TABLE-PATH syntax='XPath'>/GetMetadataObjects/Objects/Person";
put "</TABLE-PATH>";
put '<COLUMN name="uri">';
put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/Person/ @Id</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>32</LENGTH>";
put '</COLUMN><COLUMN name="name">';
put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/Person/ @Name</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>256</LENGTH>";
put '</COLUMN></TABLE></SXLEMAP>';
run;
1
filename sxlemap temp;
2
DATA _null_;
3
file sxlemap;
4
put '<SXLEMAP version="1.2" name="SASObjects"><TABLE name="SASObjects">';
5
put "<TABLE-PATH syntax='XPath'>/GetMetadataObjects/Objects/Person";
6
put "</TABLE-PATH>";
7
put '<COLUMN name="uri">';
8
put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/Person/ @Id</PATH>";
9
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>32</LENGTH>";
10
put '</COLUMN><COLUMN name="name">';
11
put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/Person/ @Name</PATH>";
12
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>256</LENGTH>";
13
put '</COLUMN></TABLE></SXLEMAP>';
14
RUN;
3 Bloc de code
PROC SORT Data
Explication : Le moteur LIBNAME XML est utilisé pour créer une bibliothèque SAS virtuelle (_XML_) qui lit directement les données du fileref 'response' en appliquant le schéma défini par 'sxlemap'. PROC SORT est ensuite utilisé pour lire la table virtuelle '_XML_.SASObjects', la trier par nom, et créer la table de sortie finale spécifiée par le paramètre '&outds'. Enfin, les ressources temporaires (filerefs et libname) sont libérées.
LIBNAME _XML_ xml xmlfileref=response xmlmap=sxlemap;
2
3
PROC SORTDATA= _XML_.SASObjects out=&outds;
4
BY name;
5
RUN;
6
7
filename sxlemap clear;
8
filename response clear;
9
LIBNAME _XML_ clear;
10
11
%mend mm_getusers;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Informations de Copyright : Copyright 2010-2023 HMS Analytical Software GmbH, http://www.analytical-software.de. This file is part of SASUnit, the Unit testing framework for SAS(R) programs.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.