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 20/06/2008, 10h31   #1
Invité régulier
 
Étudiant
Inscription : mai 2008
Messages : 18
Détails du profil
Informations personnelles :
Âge : 23

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2008
Messages : 18
Points : 7
Points : 7
Envoyer un message via MSN à l'breton du 29
Par défaut boucle DATA et SQL

salut,

je souhaite mettre à jour une table par l'intermédiaire d'une boucle do until, mais lorsque je mets une proc sql dans la boucle pour que la variable soit remis a jour avant chaque execution de la condition, la boucle plante!!
Et si je mets pas la proc sql la condition d'arret ne pourra jamais etre atteinte!

est ce que quelqu'un saurait dire comment faire??

voici mon code :
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
 
DATA precision_essai; SET DATA.precision;
	do until (somme_N_o = N_a);
		proc sort DATA=DATA.precision;
		BY cantons;
		run;
		/* Somme */
		proc sql;
			CREATE TABLE DATA.precision AS
			SELECT *,sum(N_o) AS somme_N_o
			FROM DATA.precision
			GROUP BY cantons;
		quit;
		/* plus gde décimal */
		proc sql;
			CREATE TABLE  DATA.precision AS
			SELECT DISTINCT *,max(decimal_N_o) AS max_dec_N_o
   			FROM DATA.precision
   			GROUP BY cantons; 
		quit;
			IF decimal_N_o = max_dec_N_o then do;
				N_o = N_o +1;
				somme_N_o = somme_N_o +1;
				decimal_N_o = 0;
			end;
	end;
run;
Merci à tous pour l'aide précieuse que vous m'apporterez!
++
l'breton du 29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 10h39   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Je ne pense pas que SAS accepte de faire des proc sql; ou autres procédure dans une étape data??!!
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 11h00   #3
Invité régulier
 
Étudiant
Inscription : mai 2008
Messages : 18
Détails du profil
Informations personnelles :
Âge : 23

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2008
Messages : 18
Points : 7
Points : 7
Envoyer un message via MSN à l'breton du 29
effectivement c est pas sur qu'il accepte une procédure dans un data, mais une boucle do doit toujours être dans une étape data ???????

alors comment fait on pour repeter plusieurs fois une procedure quelconque??

Y a t il une syntaxe spécial??

merci.
l'breton du 29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 11h10   #4
Membre confirmé
 
Inscription : avril 2008
Messages : 233
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : avril 2008
Messages : 233
Points : 216
Points : 216
Boucle dans la macro ? Quel est ton besoin ? Que veux-tu faire avec cette proc sql boucleé ?
green_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 11h11   #5
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Ton code est trop bizzare !!!

DATA precision_essai; SET DATA.precision; => table en lecture
proc sql; CREATE TABLE DATA.precision AS => table en ecriture

Déja la il y a un gros problème : je ne sais pas comment SAS va réagir.

Il y a un problème d'algorithmique
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 11h20   #6
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Ce code suivant, montre comment exécuter une macro pour chaque valeur d'une table.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
%macro affiche(var);
proc print DATA=t(WHERE=(a=&var)); run;
%mend;
DATA t;
a=1; b=1;output;
a=2; b=2;output;
run;
 
DATA _null_; SET t;
call execute('%affiche('||a||');');
run;
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 14h25   #7
Invité régulier
 
Étudiant
Inscription : mai 2008
Messages : 18
Détails du profil
Informations personnelles :
Âge : 23

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2008
Messages : 18
Points : 7
Points : 7
Envoyer un message via MSN à l'breton du 29
en fait la condition if de ma boucle, et par conséquent ma boucle me sert à réajuster la valeur d'une variable (N_o). ms celle ci est basé sur les valeurs de deux variables (somme_N_o et max_dec_N_o) qui doivent etre remises à jour à chaque tour de boucle!! elle sont a l'origine créées par la proxc sql! c est donc pour ca que je veux bouclé la proc sql!!

Ms je n arrive pas a trouver de solutions avec ou sans boucle!!

question pas facile! ms toutes les reponses ou supposition m aideront!
merci.
l'breton du 29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 14h41   #8
Membre chevronné
 
Avatar de steelspirit
 
Inscription : janvier 2008
Messages : 420
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2008
Messages : 420
Points : 739
Points : 739
Envoyer un message via MSN à steelspirit
Bahraoui a raison, il ne faut pas confondre le langage base et macro. Pour ton problème il faut surement passer par du langage macro.

Si tu fais do until (somme_N_o = N_a); il faut forcément défine N_a sinon tu boucle indéfiniment

étape 1 : sépare tes étapes DATA des étapes PROC
étape 2 : défini N_a comme macro variable et initialise le.
étape 3 : Met tes PROC SQL dans une macro et récupère le résultat dans une macro variable à l'aide de into:

ex :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
%macro precision;
   %do %until (&somme_N_o = &N_a);
   proc sql;
			CREATE TABLE DATA.precision AS
			SELECT *,sum(N_o) AS somme_N_o
                                      INTO: somme_N_o
			FROM DATA.precision
			GROUP BY cantons;
   quit;
   %end;
%mend;
%precision;
je te conseil de prendre une feuille et de bien écrire ton algorithme ensuite test ton programme pas à pas, essai d'écrire une étape data, test, puis une macro, et une proc sql, test, une boucle, test etc ...

il faut y aller étape par étape.

bon courage

Steel
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2008, 15h14   #9
Membre confirmé
 
Inscription : avril 2008
Messages : 233
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : avril 2008
Messages : 233
Points : 216
Points : 216
Citation:
Envoyé par l'breton du 29 Voir le message
en fait la condition if de ma boucle, et par conséquent ma boucle me sert à réajuster la valeur d'une variable (N_o). ms celle ci est basé sur les valeurs de deux variables (somme_N_o et max_dec_N_o) qui doivent etre remises à jour à chaque tour de boucle!! elle sont a l'origine créées par la proxc sql! c est donc pour ca que je veux bouclé la proc sql!!

Ms je n arrive pas a trouver de solutions avec ou sans boucle!!

question pas facile! ms toutes les reponses ou supposition m aideront!
merci.
Tu peux reformuler ça ? C'est-à-dire :
1. Qu'est-ce que tu as comme table d'entré ? Un exemple avec des datalines.
2. Qu'est ce que tu veux faire ? Une explication pas obligatoirement en SAS, en français ça peut aller.
green_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 11h14   #10
Invité régulier
 
Étudiant
Inscription : mai 2008
Messages : 18
Détails du profil
Informations personnelles :
Âge : 23

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2008
Messages : 18
Points : 7
Points : 7
Envoyer un message via MSN à l'breton du 29
j'ai suivi vos conseils, et cela et presque bon!
il me reste juste un pti detail qui va pas.

j ai donc fait une boucle macro, mais celle ci boucle indefiniment car mes variables somme_N_o et N_a existe deja au depart dans ma table d'origine (data.precision). Et celle ci ne sont pas remplacées lors de l'execution des Proc SQL sensées regénérer ces variables. ce qui fait que la condition ne peut jamais etre atteinte.

voici mon code :
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
31
32
33
 
%MACRO reinitialisation ();
	/*i=0;*/
	%do %until (somme_N_o /*&i*/ = N_a);
		proc sort DATA=DATA.precision;
		BY cantons;
		run;
		/* Somme */
		proc sql;
			CREATE TABLE DATA.precision AS
			SELECT *,sum(N_o) AS somme_N_o /*&i*/
			FROM DATA.precision
			GROUP BY cantons;
		quit;
		/* plus gde décimal */
		proc sql;
			CREATE TABLE  DATA.precision AS
			SELECT DISTINCT *,max(decimal_N_o) AS max_dec_N_o /*&i*/
   			FROM DATA.precision
			GROUP BY cantons; 
		quit;
		DATA precision_essai; SET DATA.precision;
			IF decimal_N_o = max_dec_N_o /*&i*/ then do;
				N_o = N_o +1;
				somme_N_o = somme_N_o +1;
				decimal_N_o = 0;
			end;
		run;
		/*i=i+1;*/
	%end;
%MEND reinitialisation;
 
%reinitialisation ();
je n'ai pas séparé l'etape DATA des etapes proc car celles ci ne peuvent pas tourner indépendement.

Et dans la condition somme_N_o et N_a sont deux variables de ma table d'origine, elles ont donc une valeur différente à chaque ligne. et ne sont pas des variables du programme à initialiser au départ puisqu'elles prennent les valeurs de la table.

De meme comme vous pouvez voir en commentaire dans le code, j'ai essayé d'ajouter un compteur afin d'incrémenter les variables créées de la valeur de celui-ci. c'etait dans le but de créer une variable différente à chaque fois pour ne pas avoir le probléme de la variable déjà existente.

Comment puis je faire face à ce problème???

Merci.
l'breton du 29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2008, 14h03   #11
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Normal que ta macro boucle !!

(somme_N_o /*&i*/ = N_a);
Problème 1 : (&somme_N_o /*&i*/ = &N_a);
On accéde à la valeur d'une macro variable, on mettant un &avant le nom de la variable.
Problème 2: les variables somme_N_o et N_a ne change pas dans ton code!!!

Comment créer une macro variable dans uen étapde data;
Code :
1
2
3
DATA _null_ SET tatable;
call symput('somme_N_o',somme_N_o);
run;
dans une proc sql
Code :
1
2
3
4
5
proc sql;
SELECT somme_N_o INTO :somme_N_o
FROM tatable
WHERE ton_filtre;
quit;
la requete doit envoyer une seule valeur.
bahraoui 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 02h49.


 
 
 
 
Partenaires

Hébergement Web