Annonce

Bienvenue sur le site support des ouvrages :
SAS - Introduction au décisionnel : méthode et maîtrise du langage
(1ère édition - épuisée)
SAS - Introduction pratique : du data management au reporting (2ème édition - épuisée)
SAS - Introduction au décisionnel : du data management au reporting (3ème édition - épuisée (hélas...))

la réponse à la question "mais où trouver la 3ème édition ?" est précisée ici


Retrouvez dans ce tiré à part, la préface écrite par Mouloud Dey, Directeur Business solutions et marchés émergents, SAS France,
l’introduction générale ainsi que le plan complet de l’ouvrage

#1 05-04-2018 12:00:23

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

Les vues SASHELP

Je recycle...

Dans le master ESA, on propose assez souvent des ateliers d'appliation à la suite de certains cours. J'ai ainsi proposé à mes étudiants de M1 l'atelier suivant afin de les aider à travailler leur cours de langage macro sous SAS.

je me dis que ça nous fait là un très beau sujet des beaux mercredis...


Voici le texte que je leur ai transmis :
Les vues SASLHELP

Durant le cours de langage macro sous SAS, nous avons utilisé une vue SASHELP : la vue VMACRO
VMACRO est une vue de la table des symboles, la table dans laquelle SAS enregistre, entre autre, les noms de macro et leur valeur.

Certes, mais qu’est-ce qu’une vue ?

C’est un programme compilé, soit en langage DATA (on parle alors de DATA Step view), soit en SQL (vue SQL) qui permet de créer une
table et que vous allez pouvoir utilisé comme une table (il y a aussi des vues SAS/ACCESS mais nous n'en parlerons pas).

Démonstration :

Code:

Data coco / view=coco ;
   X=round(rand('uniform')*100);
   Y=datetime();
Format y datetime.;
Run;

COCO est une vue.

Faites un PROC PRINT sur cette vue. Attendez quelques secondes et refaites un nouveau PROC PRINT. Le résultat est différent… Dans la vue COCO, il n’y a aucune donnée, il n’y a que l’étape data donnée plus haut sous sa forme compilée et à chaque fois que vous faites appel à cette vue, il y a exécution du programme.

Les vues SASHELP sont donc elle aussi des vues mais ce sont des vues SQL : il n’y a donc « derrière » ces vues qu’une requête SQL. (Je sais, vous n’y connaissez rien en SQL mais ce n’est pas bien grave pour ce sujet).

Regardons ce qu’il y a derrière la vue VMACRO :

Code:

PROC SQL ; 
DESCRIBE VIEW sashelp.vmacro;
QUIT;

Et vous obtenez, dans votre JOURNAL, le résultat suivant :

Code:

2595  PROC SQL ;
2596  DESCRIBE VIEW sashelp.vmacro;
NOTE: SQL view SASHELP.VMACRO définie en tant que :

        select *
          from DICTIONARY.MACROS;

2597  QUIT;

Cette vue est en fait une reproduction à l’identique d’une table appelée MACROS et présente dans une bibliothèque DICTIONARY. En fait, toutes les vues SASHELP sont des reproductions, plus ou moins à l’identique, de tables présentes dans la bibliothèque DICTIONARY.
Évidemment, à la lecture du nom de la bibliothèque, vous êtes choqué ! Comment ça ? Une bibliothèque doit avoir un nom composé au maximum de 8 lettres ! Et là, il y en a 10 !

Et oui… on ne vous dit pas tout…

DICTIONARY est une bibliothèque un peu particulière… déjà, inutile de perdre votre temps à essayer de faire un PROC PRINT sur DICTIONARY.MACROS, il vous dira que le nom de la bibliothèque ne respecte pas les conventions propres à SAS.

En fait, vous ne pouvez accéder aux tables de la bibliothèque DICTIONARY qu’avec PROC SQL.

Revenons à nos vues SASLHELP.

Elles sont TRES utiles ces vues puisque tout ce qui caractérise votre environnement SAS au cours d’une session se trouve dans ces vues et que les informations contenues dans ces vues, tirées des tables de la bibliothèque DICTIONARY, sont constamment mises à jour.

Lisez ce papier pour avoir une idée de ce que l’on peut trouver dans ces vues :
http://support.sas.com/resources/papers … 5-2010.pdf

et regardez aussi ce papier
http://www2.sas.com/proceedings/sugi26/p017-26.pdf

pour voir :
1-    Ce qu’on peut faire avec ces vues
2-    Et surtout, regardez les annexes !!

A la lecture du premier document, vous devez vous dire « mais il y a plein de trucs là-dedans qui pourraient être super utiles ! «  (<- si, si ! c’est effectivement ce que vous devez vous dire !) et vous devez, en votre for intérieur ajouter « sauf que ça n’a pas l’air simple… ce serait bien de pouvoir disposer d’une sorte de dictionnaire, qui présente les variables présentes dans chaque vue SASHELP, ce qu’elles mesurent ainsi qu’un court extrait de la vue (si la vue contient des observations). »

Et bien cette sorte de dictionnaire, c’est à vous de le produire et bien entendu, c'est un joli macro programme qui doit réaliser ce dictionnaire

Il y a une quarantaine de vues SALHELP, je veux un document d'autant de pages (HTML ou PDF).

Sur chaque page, je veux (au moins) en haut, le nom de la vue, le détail des variables présentes dans la vues (faites un PROC CONTENTS sur une vue – je souhaite voir le second tableau du résultat de ce PROC CONTENTS puisque c’est dans ce tableau que j’observe les détails que je veux voir pour chacune des variables), un extrait de la vue (une ou deux observations me suffiront).

cette page de l'aide SAS devrait vous intéresser :
http://documentation.sas.com/?docsetId= … ;locale=en

Ajoutez ce que vous voulez afin de disposer par vue SALHELP, d’une fiche la plus informative possible.


à la semaine prochaine...

Hors ligne

 

#2 11-04-2018 09:22:29

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

Re: Les vues SASHELP

Voyons comment faire...

Commençons par stocker dans un ensemble de macro-variables, les noms des vues que nous allons vouloir présenter. On va faire cela "à l'ancienne" au moyen  d'une table de résultats produite au moyen de PROC CONTENTS :

Code:

proc contents data=sashelp._all_ 
              out=toto 
              noprint short;
run;

proc sql noprint;
   select distinct memname 
          into :mem1-:mem999 from toto 
          where memtype='VIEW';
   %let nbmem=&sqlobs;
quit;

C'est là la méthode que vous employez si vous ne connaissez pas les vues SASHELP... une fois ces vues connues, vous pourrez directement obtenir les mêmes informations sans passez par une table de résultats.

Nous avons ensuite un macro programme qui commence... bien évidemment, je n'ai pas écrit directement ce macro-programme et j'ai suivi la méthode exposée dans la section 10.6.2 que l'on peut résumer ainsi : ordre et méthode !

Code:

%macro zopi;
ods html close;
filename odsout "c:/intro_sas/atelier";
ods html PATH=ODSOUT(URL=none)
         BODY="inutile.html"
         CONTENTS='atelier_contenu.html'
         FRAME='atelier_cadre.html';
;
options nonotes nosource nosource2 errors=0; 

/* récupération des labels de table des tables dictionnaires ;/*/;

data _null_;
   set sashelp.vdctnry;
   call symputx(memname, memlabel);
run;

nous allons produire un document HTML. L'instruction globale OPTIONS a pour objectif de rendre "quasi muet le journal". Nous verrons pourquoi dans quelques instants.

Si vous avez exploré les vues SASHELP, vous êtes peut être tombé sur la vue VDCTNRY... elle est intéressante cette vue parce qu'elle vous présente les tables dictionnaire qui sont à l'origine des vue SASHELP. Ce qui est surtout intéressante, c'est que les tables dictionnaire ont un LABEL de table et que nous nous sommes dit que ce serait tout à fait intéressant de pouvoir indiquer, lorsque l'on présentera une vue, le nom de la table dictionnaire d'origine accompagné de son label de table.

un petit exemple : le vue VTABLE a pour origine la table dictionnaire TABLE - et le LABEL de table attaché à cette table est : "Tables et informations propres aux tables".

Nous exploitons donc les données de la vue VDCTNRY en créant des macro-variables qui auront pour nom les noms des tables dictionnaire et qui auront pour valeur les LABELS de ces tables.

La macro-variable TABLE a donc pour valeur "Tables et informations propres aux tables".

Vous me direz "mais comment connait-il l'origine d'une vue ?"

ben... il suffit de le demander à SAS :

Code:

proc sql ;
   describe view sashelp.vtable;
quit;

et vous obtenez dans le journal la description suivante :

Code:

NOTE: SQL view SASHELP.VTABLE définie en tant que :

        select *
          from DICTIONARY.TABLES;

Les vues ne sont pas toutes des "copies" (le terme est impropre...) parfaitement identiques d'une table dictionnaire et pour certaines, c'est un peu plus compliqué... aussi, nous nous sommes dit que ce serait une bonne idée de présenter aussi la requête SQL qui construit la vue.

Cette requête SQL, nous sommes pour l'instant capable de l'afficher dans le JOURNAL...il faudrait pouvoir l'afficher dans les feuilles HTML que l'on veut construire.

comment faire ?

C'est un peu bizarre (et il existe peut être une solution plus simple...)

voyons la suite :

Code:

%do i=1 %to &nbmem;

ods html BODY="atelier_body&i..html" NEWFILE=none ;

Title "Description de la vue SASHELP &&mem&i" ;

proc printto new LOG="c:/intro_sas/atelier/poubelle/j&i..log";
proc sql ;
   describe view sashelp.&&mem&i ;
quit;
proc printto;
run;

nous attaquons la création de nos pages HTML, une page par vue SASHELP. L'option NEWFILE=none nous garantit que tout ce que nous allons produire jusqu'au %END qui termine la boucle %DO sera mis dans une page HTML unique (une page par vue).

On définit notre titre et là, vient une procédure PROC PRINTTO. Cette procédure n'est pas évoquée dans mon ouvrage mais je suis certain que j'en parle sur ce site... cette procédure nous permet d'envoyer le contenu du journal dans un fichier TXT.

Nous produisons un joli sandwich :

Code:

 
proc printto new LOG="c:/intro_sas/atelier/poubelle/j&i..log";
proc sql ;
   describe view sashelp.&&mem&i ;
quit;
proc printto;
run;

l'instruction PROC PRINTTO de fin ferme le fichier dans lequel nous avons souhaité enregistrer notre journal. Voici ce que contient un de ces fichiers (il y en aura autant qu'il y a de vues) :

Code:

        select *
          from DICTIONARY.CHECK_CONSTRAINTS;

Sans les options globales précisées plus haut, ce fichier aurait contenu un peu plus d'informations... nous avons souhaité qu'ils ne contiennent que ce dont nous avons besoin.

et que va-t-on faire avec ce fichier texte ?

une première étape DATA :

Code:

data _null_;
   infile "C:\Users\sebastien\Documents\poubelle\j&i..log" dlm=",;";
   input @ 'from' source :$40.;
   call symputx(compress('source'||_n_),scan(source,2,'.'));
   call symputx("nsources",_n_);
run;

cette première étape data a pour objectif de récupérer dans une ou plusieurs macro-variables les noms des tables dictionnaire à l'origine de la vue. Nous enregistrons aussi le nombre de tables dictionnaire source de la vue SASHELP.

nouvelle étape DATA, qui va continuer à exploiter le contenu du journal enregistré au moyen de PROC PRINTTO :

Code:

data _null_;
   infile "C:\Users\sebastien\Documents\poubelle\j&i..log" truncover;
   input text $200. ;
   if missing(text)=1 then delete;
   file print;
   put text;
run;

on enregistre dans une variable TEXT chacune des lignes du journal et ensuite : FILE PRINT ; PUT TEXT !

PUT envoie normalement une résultat dans le journal. Si au préalable, vous avez une instruction FILE PRINT, ce n'est plus vers le journal que le résultat est envoyé, c'est vers les destinations ODS ouvertes (et donc, vers la page HTML que nous souhaitons construire).

Il est maintenant temps de faire un petit commentaire à la suite de la présentation du code SQL qui construit la vue que l'on souhaite présenter :

Code:

ods escapechar="^";

%if &nsources=1 %then %do ;
ods html text="^{style systemtitle Cette vue a pour origine la table dictionnaire &source1 : &&&source1}"; 
%end;

Pour présenter notre texte, nous utilisons une options STYLE (et nous avons donc besoin d'ODS ESCAPECHAR (section 8.3.5.b) et demandons que notre texte soit mis en forme au moyen de l'élément de style SYSTEMTITLE (qui est l'élément de style utilisé pour mettre en forme les titres).

&source1 donnera le nom de la table dictionnaire source de la vue
&&&source1 donnera le label de table de cette table dictionnaire.

nous avons en effet crée une macro-variable TABLE qui a pour valeur "Tables et informations propres aux tables".

&&&source1 devient &table qui devient "Tables et informations propres aux tables"

et s'il y a plus d'une table source, quel message offrir ?

il y a au maximum deux sources (et ça ne concerne en fait que la vue VALLOPT)

Code:

%if &nsources=2 %then %do ;
ods html text="^{style systemtitle Cette vue a pour origine deux tables dictionnaire^{newline}^{nbspace 3}- &source1 : &&&source1^{newline}^{nbspace 3}- &source2 : &&&source2}"; 
%end;

et nous n'avons plus qu'à clore (provisoirement...) notre macro-programme :

Code:

%end;
ods html close ;
options notes source source2 errors=20; 
%mend;
title ; 
%zopi

qu'obtenons nous pour l'instant :

ceci : la version 1

la première page est vide (ça devrait s'arranger par la suite...) mais les autres ne le sont pas...

à la semaine prochaine pour la suite...

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr
Flux RSS