Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > ODS et reporting
ODS et reporting Forum d'entraide sur les fonctionnalités de reporting de SAS : gérer les sorties et graphiques de SAS
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/05/2011, 11h56   #1
Invité de passage
 
Inscription : avril 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 5
Points : 1
Points : 1
Par défaut Création d'un fichier rtf automatiquement pour toutes les tables d'une librairie

Bonjour,

je voudrais savoir comment il est possible (s'il est possible) de générer automatiquement un fichier rtf par table SAS. J'ai dans ma libraire 321 tables, et je n'ai jamais codé de macro...
Et j'aimerais éviter de répéter un ods rtf 321 fois.
J'ai SAS v9.0.

Pouvez-vous m'aider svp ?
sasnew est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 12h09   #2
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Bonjour,

que souhaites tu dans ton fichier rtf, les données contenues dans ta table? Ca peut demander un peu de travail de "remodelage" si tu as beaucoup de données et de variables car sinon ton fichier sortie risque d'être peu lisible. Il serait donc bien que tu précises ta question.

en tout cas voici comment faire:

1/ génère ta macro. Je propose en paramètre le nom de ton fichier sas(avec éventuellement librairie) et le nom/chemin de ton fichier sortie.

Code :
1
2
3
4
5
6
%macro sortiertf(IN=,out=);
ods rtf file=&out.;
proc print DATA=&IN.;
run;
ods rtf close;
%mend sortiertf;
2/lance ce code (=compilation de la macro). puis éxécute la macro paramétrée.

Code :
%sortiertf(IN=sashelp.bweight, out="c:\test.rtf");
j'ai pas testé mais ce devrait fonctionner.
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 12h30   #3
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Il serait obligé d'executer la macro 321 fois non?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 12h39   #4
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
oui car les paramètres en entrée de la macro sont à chaque fois différents. mais c'est peut être automatisable si l'on peut connaître à l'avance la (les) localisation(s) des tables en entrée et la (les)localisation des rtf, c'est pour l'instant que l'on ne dispose pas.

Et pour aller un peu plus loin que la question, il y a même peut être moyen d'automatiser sans passer par du language macro, sous certaines conditions (connaissances des tables sas ou des répertoires), renommage en rtf en lien avec le nom sas de la table. Idée: détecter les.sas7bat, stocker dans une table sas. Puis pour chaque ligne de la table, exportation rtf.
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 12h51   #5
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
C'est plus facile pour moi de scanner la librairie en paramètre et faire une boucle sur toutes les tables dans ce repertoire via ODS.
Ton idée de renommage est peut être plus facile
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 12h56   #6
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Bonjour

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
%macro listing;
proc sql noprint;
 
SELECT memname INTO: tab separated BY ' ' FROM dictionary.TABLES WHERE upcase (libname)='SASHELP'
AND upcase(memtype)='DATA';
quit;
 
 
%do i =1 %TO &sqlobs.; 
%let var&i= %scan(&tab.,&i,' ');
 
ods rtf file=" c:\data\temps\&&var&i...doc";
 
proc sql ;
 
SELECT * FROM sashelp.&&var&i; quit;
 
 
/*
proc print sashelp.&&var&i; run;
 
*/
 
ods rtf    close ;
 
%end;
%mend;
 
%listing ;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h04   #7
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Beau gosse
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h15   #8
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Effectivemment, en relisant le message de sasnew, le but est de prendre toutes les tables d'une seule librairie. Donc ce que vous proposez est le plus simple (si la localisation du chemin des rtf est unique et qu'on peut le nommer comme la table sas). J'avais envisagé le cas ou on veut sélectionner que certaines tables contenues dans plusieurs librairies.
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h22   #9
Membre habitué
 
Femme Géraldine CADE DESCHAMPS
Support Clients SAS (France et Europe)
Inscription : février 2010
Messages : 62
Détails du profil
Informations personnelles :
Nom : Femme Géraldine CADE DESCHAMPS
Localisation : France

Informations professionnelles :
Activité : Support Clients SAS (France et Europe)
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 62
Points : 139
Points : 139
Bonjour,

On peut faire exécuter la procédure pour chaque table de la bibliothèque sans utiliser le macro-language, pour cela il suffit d'utiliser le CALL EXECUTE :

Code :
1
2
3
4
5
6
7
8
DATA _null_ ;
  SET sashelp.vtable (WHERE=(libname='SASHELP') );
  call execute ("ods rtf file='c:\temp\test\" !! compress(memname) !! ".rtf' ;"
                !! "proc print DATA=" !! compress (libname !! '.' !! memname) !! ";"
				!! "run;"
				!! "ods rtf close;") ;
 
run ;
ici l'ods rtf et la proc print seront lancées pour chaque table de la SASHELP.
Pour en savoir plus sur le CALL EXECUTE :
http://support.sas.com/documentation...a000127810.htm

http://www.sas.com/offices/europe/fr...port_14_bd.pdf


Cordialement,
Géraldine CADE-DESCHAMPS
Support Clients SAS
Géraldine_Cade_SAS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h31   #10
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Oops Sam!!, Géraldine a dit mieux
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h39   #11
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
peut être .
Maintenant le soucis c'est comment gérer le saturation de la fenêtre output.
J’attends que sasnew teste ces deux programmes. à mon avis il aura des surprises .sauf exécution par batch. !!!
il faut ajouter des options pour ne pas générer les sorties dans la fenêtre output de sas ainsi qu'empêcher l'ouverture des 321 fichier rtf
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h48   #12
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Il se servira de
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h56   #13
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 73
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 73
Points : 32
Points : 32
Bonjour,

Code :
1
2
3
4
 
 
%do i =1 %TO &sqlobs.; 
%let var&i= %scan(&tab.,&i,' ');
[/QUOTE]

j'ai une petite question : la MacroVariable &sqlobs. est définie à quel niveau ?
Est-ce une MV automatique qui calcule le nb de table dans la librairie ?
mohamed_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h09   #14
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
c'est une macro variable automatique, générée par la proc sql et correspond à la dernière OBS selectionnée de la table.
Son utilisation est dangereuse car elle prend la valeur de la dernière proc sql exécutée et depend des filtres.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
 
proc sql noprint;
 
SELECT sex INTO: var separated  BY ' '  FROM sashelp.class WHERE age<14;
	quit;	 
 
%put var1=  &sqlobs.;
 
 
proc sql noprint;
 
SELECT sex INTO: var separated  BY ' '  FROM sashelp.class ;
	quit;	 
 
%put var1=  &sqlobs.;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/05/2011, 15h25   #15
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Tu as de la doc la dessus Sam?
C'est très pratique, ça évite de passer par une proc contents et data _null_ !
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h29   #16
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 73
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 73
Points : 32
Points : 32
Merci,

il vaudrait mieux ajouter un bout de code du genre qui compte le nb de tables:

Code :
1
2
3
4
5
 
SELECT count(DISTINCT(memname)) INTO: Nb_tab
FROM dictionary.TABLES 
WHERE upcase (libname)='SASHELP'
Quit ;
puis réutiliser &NB_TAB au lieu de &sqlobs.
mohamed_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h40   #17
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Citation:
Envoyé par MEGAMIND2 Voir le message
Tu as de la doc la dessus Sam?
C'est très pratique, ça évite de passer par une proc contents et data _null_ !
simple: bouton F1 puis tu tape SQLOBS
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h42   #18
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Citation:
Envoyé par mohamed_ Voir le message
Merci,

il vaudrait mieux ajouter un bout de code du genre qui compte le nb de tables:

Code :
1
2
3
4
5
 
SELECT count(DISTINCT(memname)) INTO: Nb_tab
FROM dictionary.TABLES 
WHERE upcase (libname)='SASHELP'
Quit ;
puis réutiliser &NB_TAB au lieu de &sqlobs.
oui si tu veux, mais avec &sqlobs tu gagnes 5 secondes de programmation
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h43   #19
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Citation:
Envoyé par s_a_m Voir le message
simple: bouton F1 puis tu tape SQLOBS

C'est quoi F1?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h42   #20
Invité de passage
 
Inscription : avril 2010
Messages : 5
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 5
Points : 1
Points : 1
Sam et Géraldine, j'ai testé vos solutions, merci !!
Quant au fait de ne pas afficher dans l'output, Google est mon ami !
Merci à tous.
sasnew est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h44.


 
 
 
 
Partenaires

Hébergement Web