Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
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 17/11/2010, 16h10   #1
Membre du Club
 
Inscription : janvier 2007
Messages : 183
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 183
Points : 48
Points : 48
Par défaut from dictionary columns

Bonjour,
j'ai récupéré le programme suivant qui ne fait rien.
quelqu'un peut il m'expliquer ce qu'il devrait faire?
Code :
1
2
3
4
5
6
proc sql noprint;
  SELECT catt( name,'=',quote( catt(label,' (',name,')') ) )
   INTO : embed_names_into_labels separated BY ' '
   FROM dictionary.COLUMNS
   WHERE libname='sashelp' AND memname='class' AND NOT missing(label);
  quit;
En premier ce qui m'intrigue est le
Code :
FROM dictionary.COLUMNS
Or ce programme paraît il est sensé marrché.
A+
merci
AlexFred est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 10h22   #2
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Bonjour;
dictionary.columns te permet d'avoir des informations sur la table , elle fait à peu pré la même chose que la proc contents sauf que les résultats sont transposés ( horizonta).
On utilise en général cette méthode pour récupéré des informations de la tables dans une macro variables :

personnelement je l'utilise pour récupérer les noms de colonnes de la table;

je te donne un exemple d'usage courant:

Code :
1
2
3
4
5
proc sql;
reset noprint;
SELECT name INTO: var separated BY ',' FROM dictionary.COLUMNS WHERE UPCASE (libname)='SASHELP' AND UPCASE (memname)='AIR';
%put mes VARIABLES = &var.;
quit;
regarde ta log tu verra le résultat. tu peux récupérer les label, les length et toute autres information relatives à la table.

bon courage.
Julie.

Dernière modification par fafabzh6 ; 19/11/2010 à 09h56. Motif: Suppression citation
  Envoyer un message privé Réponse avec citation 10
Vieux 18/11/2010, 16h19   #3
Membre du Club
 
Inscription : janvier 2007
Messages : 183
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 183
Points : 48
Points : 48
bonjour,
merci rosesansepines

Toutefois je ne comprends pas pourquoi ton code marche quand on met :
Code :
WHERE UPCASE (libname)='SASHELP' AND UPCASE (memname)='AIR';
et ne marche pas quand on a:
Code :
WHERE libname='sashelp' AND memname='class';
Je récupère alors dans le log
Code :
NOTE: Aucune ligne n'a été sélectionnée.
C'est ce message que je récupérais depuis le début et pourtant j'avais bien récupéré la bonne casse
et qui commençait à m'énerver sérieusement.

mais maintenant grâce au UPCASE, tout marche bien
Merci encore Julie
AlexFred est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 16h41   #4
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
sas est case sensitive , celà dis que la librerie sashelp n'existe pas d'ailleurs elle s'appel Sashelp ( le s majuscule), on utilise les upcase si on n'est pas sur
de la présence des caractères majuscules ou miniscules dans le nom de la librery ainsi le nom de la table et pour remidier à ça on a le choix entre upcase ou lowcase pour rendre tout miniscule.

test,
Code :
1
2
3
4
5
proc sql;
reset noprint;
SELECT name INTO: var separated BY ',' FROM dictionary.COLUMNS WHERE libname='Sashelp' AND  memname='Air';
%put mes VARIABLES = &var.;
quit;

ou sinon avec un lowcase :
Code :
1
2
3
4
5
proc sql;
reset noprint;
SELECT name INTO: var separated BY ',' FROM dictionary.COLUMNS WHERE LOWCASE (libname)='sashelp' AND LOWCASE (memname)='air';
%put mes VARIABLES = &var.;
quit;
Julie.

Dernière modification par fafabzh6 ; 19/11/2010 à 09h57. Motif: Suppression citation
  Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 18h07   #5
Membre du Club
 
Inscription : janvier 2007
Messages : 183
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 183
Points : 48
Points : 48
Je suis bien d'accord avec toi.
Mais dans mon cas je l'appliquais à un libname et un data que j'avais créé.
Et je ne faisais que reproduire ces noms par un copier coller.
Pour moi, le mystère reste.
Mais, le principal, c'est que cela marche
Encore merci.
AlexFred est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 09h31   #6
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
Bonjour,

Les tables du libname dictionary ne sont accessible qu'en utilisant une PROC SQL et non une étape DATA. Ce qui implique que tu n'utilisé pas les même infos.

Cordialement
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 11h09   #7
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Bonjour,

Je me permets juste d'ajouter une petite remarque car je viens de trouver le même type de code dans un projet.

De mon côté, il a été très utile de remplacer le sql par des fonction SAS.
J'ai gagné énormément en temps d'exécution (et CPU Time).

Voici un bout du code en SAS:
Code :
1
2
3
4
5
6
7
8
9
10
%macro get_type(FIELD,dataset);
	%LOCAL rc dsid fieldnum;
	%IF %sysfunc(exist(&dataset)) %then 
	%do;
		%let dsid=%sysfunc(open(&dataset));
		%let fieldnum=%sysfunc(varnum(&dsid,&FIELD));/*numéro du champ */
		%let fieldtype= %sysfunc(vartype(&dsid,&fieldnum)); /* type du champ : char ou numeric?*/
		%let rc=%sysfunc(close(&dsid));
	%end;
%mend;
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 12h43   #8
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Bonjour;
que représente field dans : %macro get_type (field,dataset);

Merci.


Citation:
Envoyé par L0007 Voir le message
Bonjour,

Je me permets juste d'ajouter une petite remarque car je viens de trouver le même type de code dans un projet.

De mon côté, il a été très utile de remplacer le sql par des fonction SAS.
J'ai gagné énormément en temps d'exécution (et CPU Time).

Voici un bout du code en SAS:
Code :
1
2
3
4
5
6
7
8
9
10
%macro get_type(FIELD,dataset);
	%LOCAL rc dsid fieldnum;
	%IF %sysfunc(exist(&dataset)) %then 
	%do;
		%let dsid=%sysfunc(open(&dataset));
		%let fieldnum=%sysfunc(varnum(&dsid,&FIELD));/*numéro du champ */
		%let fieldtype= %sysfunc(vartype(&dsid,&fieldnum)); /* type du champ : char ou numeric?*/
		%let rc=%sysfunc(close(&dsid));
	%end;
%mend;
  Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 14h07   #9
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Citation:
que représente field dans : %macro get_type (field,dataset);
Effectivemment, le fait qu'il soit en majuscule peut porter à confusion...

field c'est simplement le nom que j'ai donné à ma variable qui représente le nom du champ.

Le but de cette macro c'est de lui donner le nom d'un champ pour connaître son type.

Il faut regarder dans l'aide de sas (par exemple recherche varnum), il y a plein de fonction utiles pour obtenir des renseignements sur un dataset.
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 14h46   #10
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
tu peux me dire un exemple d'utilisation de ton code?
ce que j'ai fourni c'est pour récupéré les colonnes, label, lenght,... d'une table

Merci.



Citation:
Envoyé par L0007 Voir le message
Effectivemment, le fait qu'il soit en majuscule peut porter à confusion...

field c'est simplement le nom que j'ai donné à ma variable qui représente le nom du champ.

Le but de cette macro c'est de lui donner le nom d'un champ pour connaître son type.

Il faut regarder dans l'aide de sas (par exemple recherche varnum), il y a plein de fonction utiles pour obtenir des renseignements sur un dataset.
  Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 16h24   #11
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Code :
tu peux me dire un exemple d'utilisation de ton code?
Par exemple,
Je fais un test sur une valeur par défaut (différente si c'est un char ou un num).
Code :
1
2
3
4
5
6
7
8
9
10
%macro get_values(FIELD,dataset);
	PROC SQL noprint nofeedback;
		SELECT DISTINCT %str(&FIELD) INTO :result separated BY "/"
	  	FROM &dataset
			%IF &fieldtype eq C %then /*Si c'est un char*/
				WHERE %str(&FIELD) NE "\";
			%else /* C'est un num 
				WHERE &field NE .;;
	quit;
%mend;
Citation:
ce que j'ai fourni c'est pour récupéré les colonnes, label, lenght,... d'une table
Effectivemment le mien ne fait pas la même chose mais est aussi dans la but de récupérer des infos du dataset.

Je voulais juste signaler que
Citation:
De mon côté, il a été très utile de remplacer le sql par des fonction SAS.
J'ai gagné énormément en temps d'exécution (et CPU Time).
L0007 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 17h46.


 
 
 
 
Partenaires

Hébergement Web