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 :

Macro programme avec boucle et erreur 180-322


Sujet :

Macro

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Macro programme avec boucle et erreur 180-322
    Bonjour,


    Je me permets de vous contacter car j'ai une erreur bien précise liée à une boucle dans un macro programme.

    Dans un premier temps, je créé la table suivante sous SAS :

    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
    data Listing_a_lancer;
    		length CONTRAT_WHERE $50. CONTRAT_TXT $50. LIBELLE_CONTRAT $50. COMPTEUR 8.;
    		infile datalines DLM=',';
    		input CONTRAT_WHERE $ CONTRAT_TXT $ LIBELLE_CONTRAT $ COMPTEUR;
    		format CONTRAT_WHERE $50. CONTRAT_TXT $50. LIBELLE_CONTRAT $50. COMPTEUR 8.;
    		DATALINES;
    "1005",1005,MPLCL1,1
    "1007",1007,MPLCL2,2
    "1990",1990,MPLCL3,3
    "2030",2030,MPLCL4,4
    "2031",2031,MPLCL5,5
    "2032",2032,MPLCL6,6
    "2033",2033,MPLCL7,7
    "2034",2034,MPLCL8,8
    ;
    run;

    Si je lance le code suivant, pas de problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    %global liste_contrats_where;
    %global liste_contrats_txt;
    %global libelle_contrat;
    	data _NULL_ ;
    		set Listing_a_lancer;
    		if compteur = 1 then call symput('liste_contrats_where',CONTRAT_WHERE);
    		if compteur = 1 then call symput('liste_contrats_txt',CONTRAT_TXT);
    		if compteur = 1 then call symput('libelle_contrat',LIBELLE_CONTRAT);
    	run;
    	%put &liste_contrats_where. &liste_contrats_txt. &libelle_contrat.;
    Par contre, si je lance le même programme avec une boucle, j'obtiens une erreur :

    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
    options mprint;
    %global liste_contrats_where;
    %global liste_contrats_txt;
    %global libelle_contrat;
    %macro boucle;
    %do i = 1 %to 8; /* A changer la borne */
    	data _NULL_ ;
    		set Listing_a_lancer;
    		if compteur = &i. then call symput('liste_contrats_where',CONTRAT_WHERE);
    		if compteur = &i. then call symput('liste_contrats_txt',CONTRAT_TXT);
    		if compteur = &i. then call symput('libelle_contrat',LIBELLE_CONTRAT);;
    	run;
    	%put &liste_contrats_where. &liste_contrats_txt. &libelle_contrat.;
    %end;
    %mend;
    %boucle();

    J'obtiens l'erreur suivante :
    180 : impossible de déterminer LINE et COLUMN.
    NOTE: NOSPOOL is on. Rerunning with OPTION SPOOL might allow recovery of the LINE and COLUMN where the error has occurred.
    ERROR 180-322: Statement is not valid or it is used out of proper order.

    Par contre, avec l'option "mprint", j m’aperçois que SAS réalise quand même ce que je veux.

    A noter que j'ai absolument besoin des guillemets de la première colonne de la table "Listing_a_lancer".


    Un grand merci pour votre aide.

    Aurélien

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 482
    Points : 1 547
    Points
    1 547
    Par défaut
    Bonjour,
    Des petites modifications ont étés apportées à ton code et ça fonctionne correctement.
    Il est plus intéressant :
    => d'utiliser la routine call symputX qui permet de supprimer les blancs au début ou à la fin de la macro variable crée.
    =>d'ajouter un 3ème argument à la routine call symputX pour indiquer qu'on crée des macros-variables GLOBALES disponibles en dehors du macro-proglamme sans passer par la macro %global :
    if compteur = &i. then call symputx("liste_contrats_where&i.",CONTRAT_WHERE, "G");

    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
     
    %macro boucle;
    	data _NULL_ ;
    		set Listing_a_lancer ;
    		%do i = 1 %to 8; /* A changer la borne*/
    %global liste_contrats_where&i.;
    %global liste_contrats_txt&i.;
    %global libelle_contrat&i.;	 
     
    		if compteur = &i. then call symputx("liste_contrats_where&i.",CONTRAT_WHERE);
    		if compteur = &i. then call symputx("liste_contrats_txt&i.",CONTRAT_TXT);
    		if compteur = &i. then call symputx("libelle_contrat&i.",LIBELLE_CONTRAT);
    		%end;
    	run;
    %mend;   %boucle ;		 %PUT _USER_ ;
    Cordialement
    Ward

  3. #3
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    J'ajouterais que SET est déjà une boucle en soi, avec la variable temporaire _N_ comme compteur.
    On peut donc réduire le code à simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    data _NULL_ ;
      set Listing_a_lancer ;
      call symputx(CATS("liste_contrats_where", _N_), CONTRAT_WHERE, "G");
      call symputx(CATS("liste_contrats_txt", _N_),CONTRAT_TXT, "G");
      call symputx(CATS("libelle_contrat", _N_),LIBELLE_CONTRAT, "G");
    run;
    sans macro-boucle ni macro-programme.
    Bon courage.
    Olivier

Discussions similaires

  1. [Débutant] écriture d'un programme avec boucle
    Par mimieloic dans le forum MATLAB
    Réponses: 7
    Dernier message: 22/04/2015, 13h56
  2. Macro programme avec call symput
    Par joan_27 dans le forum Macro
    Réponses: 2
    Dernier message: 22/10/2013, 22h27
  3. programme avec boucle while
    Par karika dans le forum MATLAB
    Réponses: 3
    Dernier message: 22/05/2012, 21h18
  4. Création de macro-programme avec SAS GUIDE
    Par BIEUR dans le forum Outils BI
    Réponses: 1
    Dernier message: 10/01/2011, 09h58
  5. Mini programme avec boucles
    Par Imageek dans le forum Langage
    Réponses: 6
    Dernier message: 13/11/2008, 17h06

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