IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macro Discussion :

Compter des événements


Sujet :

Macro

  1. #1
    Membre habitué
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 151
    Points : 167
    Points
    167
    Par défaut Compter des événements
    Bonjour à toutes et à tous,

    Précisons que je suis encore un nouveau sous SAS...

    Je dois travailler sur une base contenant des événements. Il va sans dire que pour certains enregistrements, je n'aurai pas d'événement alors que pour d'autres je peux en avoir (jusqu'à 20 ; c'est le maximum prévu). J'aurais besoin de connaitre le nombre d'événements pour chaque enregistrement. Quand événement il y a, la date de l'événement est saisi dans la base. Cette date est stockée dans la variable truc0101 pour le 1er événement, truc0201 pour le 2ième événement, truc0301 pour le 3ième etc..., jusqu'à truc2001.

    Je me suis dit que j'allais compter le nombre de variable trucXX01 non manquante avec un truc du genre Nbevt = Nbevt + NOT(MISSING(trucXX01)). J'ai mis cette instruction dans une boucle sur XX. Et quand j'ai mon nombre NbEvt, je m'en sers pour initialiser une variable dans ma table.

    Je pensais que ça pouvait marcher. Et en fait non... Ah bon ? Vous n'êtes pas surpris ??? Tiens... :-)

    Donc en gros ma question est : comment je fais pour connaitre mon nombre d'événement pour chaque enregistrement ?

    Merci d'avance pour votre aide !

    Mon code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* Génération de variables */
    DATA Db.Base;
    	SET Db.Base;
    	ATTRIB
    		NbEIT
    		LABEL = "Nombre d'EIT";
    	NbEIT = 0;
    RUN;
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    %MACRO NombreEIT();
     
    	/* Pour tous les événements */
    	%DO cpt = 1 %TO 20;
    		/* Détermination du préfixe de la variable eit0/eit selon la valeur du compteur */
    		%IF &cpt. < 10 %THEN %DO;
    			%LET PreVar = eit0;
    		%END;
    		%ELSE %DO;
    			%LET PreVar = eit;
    		%END;
     
    		/* Jusqu'à ce que la variable eitXX01 soit vide */
    		%DO %WHILE (MISSING(&PreVar.&cpt.01));
    			DATA Db.Base;
    				Set Db.Base;
    				/* Incémentation de la variable NbEIT de la base */
    				NbEIT = NbEIT + 1;
    			RUN;
    		%END;
    	%END;
     
    %MEND NombreEIT;
     
    %NombreEIT();
    J'ai aussi essayé la version suivante (mais avec le même succès) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    %MACRO NombreEIT();
    	%LET CptEIT=0;
    	/* Pour tous les événements */
    	%DO cpt = 1 %TO 20;
    		/* Détermination du préfixe de la variable eit0/eit selon la valeur du compteur */
    		%IF &cpt. < 10 %THEN %DO;
    			%LET PreVar = eit0;
    		%END;
    		%ELSE %DO;
    			%LET PreVar = eit;
    		%END;
    		&CptEIT. = &CptEIT. + NOT(MISSING(&PreVar.&cpt.01));
    	%END;
     
    	DATA Db.Base;
    		SET Db.Base;
    		NbEIT = &CptEIT.;
    	RUN;
     
    %MEND NombreEIT;
     
    %NombreEIT();
    Parfois, je me demande si j'ai bien compris la finalité des macros. J'ai l'impression que je leur demande un fonctionnement pour lequel elles ne sont pas pensées...

    Bref, encore merci d'avance !

    Au plaisir,
    Laurent

  2. #2
    Membre actif
    Inscrit en
    Juillet 2010
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 199
    Points : 214
    Points
    214
    Par défaut
    Bonjour,

    Est ce que tu as pensé à faire un tri à plat sur ta variable évènement avec la proc freq ?

  3. #3
    Membre éprouvé
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    Janvier 2012
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Points : 1 142
    Points
    1 142
    Par défaut
    Bonjour,

    Si j'ai bien compris ton besoin, pas besoin de code macro dans ce cas.
    Une simple étape data est suffisante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    /* Création d'une table de test */
    DATA BASE (DROP=I J);
    LENGTH EVT $8. TRUC0101 TRUC0201 TRUC0301 TRUC0401 TRUC0501 TRUC0601 TRUC0701 TRUC0801 TRUC0901 TRUC1001 8.;
    FORMAT TRUC: DDMMYY.;
    ARRAY TEMP(10) TRUC:;
    DO I=1 TO 50;
    	EVT = CATT("EVT_N",I);
    	DO J=1 TO DIM(TEMP);
    		TEMP(J) = RANUNI(0);
    		IF 0.4 < TEMP(J) < 0.6 THEN TEMP(J) = .;
    		ELSE TEMP(J) = ROUND(TEMP(J)*20000);
    	END;
    	OUTPUT;
    END;
    RUN;
     
    /* Etape data pour compter les TRUCXX par évènement */
    DATA BASE2 (KEEP= EVT NB_TRUC);
    SET BASE;
    ARRAY TEMP(*) TRUC:;
    NB_TRUC = 0;
    DO I = 1 TO DIM(TEMP);
    	IF TEMP(I) NE . THEN NB_TRUC + 1;
    END;
    RUN;
    Bon courage.

  4. #4
    Membre habitué
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 151
    Points : 167
    Points
    167
    Par défaut
    Bonjour,

    Merci pour la proposition et l'idée.

    Je vois comment connaitre l'info. Mais en fait j'aimerais bien le faire automatiquement.

    Au plaisir,
    Laurent

  5. #5
    Membre habitué
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 151
    Points : 167
    Points
    167
    Par défaut
    Bonjour,

    Oupsss... j'ai pas vu ton message avant de poster ma précédente réponse.


    Citation Envoyé par edward carnby Voir le message
    Si j'ai bien compris ton besoin, pas besoin de code macro dans ce cas.
    Une simple étape data est suffisante.
    Oui effectivement j'ai posté dans le forum Macro mais j'ai beaucoup hésité. J'avais aussi essayé une solution en étape DATA mais en vain. Mais évidemment si une solution simple sans macro existe, je suis tout à fait preneur !

    Je me penche sur cette solution et je vous tiens au courant.

    Je ne connais pas les tableaux mais l'idée de la table de test me plait bien !

    Merci beaucoup !

    A bientôt
    Laurent

  6. #6
    Membre habitué
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 151
    Points : 167
    Points
    167
    Par défaut
    Ben voilà ! Ca marche !!!

    Merci infiniment. En plus ça m'a permis de découvrir les array, concept qui m'a l'air tout à fait intéressant !!! Donc merci beaucoup !

    Bonne journée
    Laurent

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [langage] Compter des chaines de caractères
    Par julfra dans le forum Langage
    Réponses: 2
    Dernier message: 26/05/2004, 17h42
  2. [langage] compter des caracteres dans une chaine
    Par louisis dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 22h39
  3. [LG]Compter des Lignes...
    Par Loceka dans le forum Langage
    Réponses: 7
    Dernier message: 04/03/2004, 20h29
  4. [SQL] Compter des champs indépendement l'un de l'autre
    Par rippey dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 29/10/2003, 15h35
  5. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/06/2002, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo