Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro 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 27/01/2011, 15h50   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 30
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 30
Points : 3
Points : 3
Par défaut argument dans la fonction scan

Bonjour à tous,

J'ai un petit problème avec la fonction scan de sas. Je m'explique : je voudrai mettre 2ème argument de la fonction une variable de ma table. Ça ne marche pas et je ne vois pas trop comment faire autrement.

Code :
1
2
3
IF alea&i > %sysevalf(%scan(&fqaa,age_encours,' ')) then do;
	etat_adh='Autonome';
end;
Pour info j'ai réussi avec une boucle mais le temps d'exécution est beaucoup trop long.
Code :
1
2
3
4
5
6
%do j=1 %TO 66;
IF age_encours=%eval(&j+44) then do;
	IF alea&i > %sysevalf(%scan(&hqaa,&j,' ')) then do;
		etat_adh='Autonome';
	end;
%end;
Merci d'avance.
bublibus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h09   #2
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012


mais tu as la fonction SCAN pour une étape DATA et non la macro %SCAN. Tu as essayé ?
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h13   #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
Je n'ai rien compris
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h23   #4
Invité de passage
 
Inscription : janvier 2011
Messages : 30
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 30
Points : 3
Points : 3
Je viens d'essayer et voila la reponse dans le log :

Code :
1
2
3
4
ERROR: La fonction macro %SYSEVALF a trop d'arguments. Les arguments superflus seront ignorés.
ERROR: Opérande de conversion %SYSEVALF 'AGE_ENCOURS' inconnu ; conversion interrompue.
ERROR: Opérande caractère trouvé dans la fonction %EVAL ou condition %IF là où un opérande numérique
       est requis. La condition était : scan(1 2 3 4 5 6 etc
bublibus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h27   #5
Invité de passage
 
Inscription : janvier 2011
Messages : 30
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 30
Points : 3
Points : 3
Megamind2,

En fait je voudrais utiliser l'age de la personne comme index dans la fonction scan pour la macro-variable fqaa, ie que si la personne a 50 ans, je voudrais comparer la colonne alea&i avec la 50eme valeur de la macro-variable fqaa.

C'est plus clair ?
bublibus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h28   #6
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
Ju ne serais pas entrain de de comparer du alpha numérique?

Code :
IF alea&i > %sysevalf(%scan(&hqaa,&j,' '))
Si c'est le cas, faudrait faire iun input

Code :
IF input(alea&i,best.) > %sysevalf(input(%scan(&hqaa,&j,' '),best.))
Brice
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h39   #7
Invité de passage
 
Inscription : janvier 2011
Messages : 30
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 30
Points : 3
Points : 3
Merci pour la réponse mais en fait cette manière là marche (avec la boucle), mais comme je disais le temps d'execution avec la boucle est beaucoup trop long...

Du coup c'est pour ça que je cherche à savoir si on peut mettre le nom d'une colonne comme 2ème argument dans la fonction scan.
bublibus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h43   #8
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
ça sert à quoi si tu ne parcours pas ta macro liste hqaa. Cela veut dire que tu veux juste tester avec une seule variable?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h48   #9
Invité de passage
 
Inscription : janvier 2011
Messages : 30
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 30
Points : 3
Points : 3
Désolé mais je ne comprends pas ta question
bublibus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h52   #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
Visiblement tu scanes ta macro qui est une liste séparée par des blancs, et pour chaque valeur scanner tu testes. Alors je ne vois pas pourquoi tu veux rajouter une colonne en dur dans ta fonction sacn.
Comme j'ai pas tout le code, c'est chaud de tout capter
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 17h04   #11
Invité de passage
 
Inscription : janvier 2011
Messages : 30
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 30
Points : 3
Points : 3
En fait, pour essayer d'etre plus clair , j'ai dans ma table une colonne avec l'age en cours de la personne et une colonne avec un nombre aleatoire.
Dans une autre table j'ai une colonne qaa : la 1ere valeur correspond à 45 ans la 2è à 46 et ainsi de suite. Comme je ne peux pas travailler sur deux tables en meme temps (enfin je crois) j'ai crée une macro variable &hqaa où j'ai stocké les valeurs de la colonne qaa séparé par un espace).

Donc suivant la valeur de l'age en cours, je voudrais recuperer la valeur de la macro-variable hqaa.

C'est plus clair ou pas du tout ?
bublibus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 17h10   #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
T'as été clair
Pourquoi faire simple quant on peut faire plus compliqué?

Je suppose qu'il n'y a pas une clé de jointure commune aux deux tables pour faire plus compliquer.
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 17h17   #13
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Citation:
Envoyé par bublibus Voir le message
Comme je ne peux pas travailler sur deux tables en meme temps (enfin je crois)
que veux tu faire plus exactement ? peut être une proc sql avec une clause where suffira et /ou avec étape data et proc sort.
  Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 17h18   #14
Invité de passage
 
Inscription : janvier 2011
Messages : 30
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 30
Points : 3
Points : 3
Effectivement il n'y en a pas...

ps: merci beaucoup pour la rapidité des réponses
bublibus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 17h21   #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
De rien
Navré de ne pas pouvoir t'aider
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 17h28   #16
Invité de passage
 
Inscription : janvier 2011
Messages : 30
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 30
Points : 3
Points : 3
Pour mettre le contexte, je dois faire une projection dans le temps de l'état des personnes, leur âge évolue donc chaque année. Trois états sont possibles : Autonome, dépendant ou Décès. J'ai donc des tables de probabilité me permettant de savoir avec quelle proba la personne va changer ou non d'état. Chaque personne est dotée d'un nombre aléatoire, si ce nombre est inférieur à la probabilité changement d'état.
bublibus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 17h36   #17
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
Comment ce nombre aléatoire est généré et comment est-il associé à chaque personne (son âge)?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 17h43   #18
Invité de passage
 
Inscription : janvier 2011
Messages : 30
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 30
Points : 3
Points : 3
En fait pour ne pas m'embeter dans la table où sont les personnes, j'ai generer 70 colonnes avec par exemple pour la 1ere :

Code :
alea1 = rand('uniform');
et du coup la 1ere année je prends alea1, la deuxieme année alea2 etc
bublibus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 17h58   #19
Invité de passage
 
Inscription : janvier 2011
Messages : 30
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 30
Points : 3
Points : 3
Citation:
Envoyé par bublibus Voir le message
Pour info j'ai réussi avec une boucle mais le temps d'exécution est beaucoup trop long.
Code :
1
2
3
4
5
6
%do j=1 %TO 66;
IF age_encours=%eval(&j+44) then do;
	IF alea&i > %sysevalf(%scan(&hqaa,&j,' ')) then do;
		etat_adh='Autonome';
	end;
%end;
Désolé mais ça revient pas un peu ça (code qui marche mais trop long en exécution) ?

Ce que je veux éviter justement c'est de faire une boucle.
bublibus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 18h00   #20
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
T'as raison, je pense que t'as pas le choix de faire une boucle
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h29.


 
 
 
 
Partenaires

Hébergement Web