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

SAS IML Discussion :

[IML] Goto statement dans une proc iml


Sujet :

SAS IML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Points : 12
    Points
    12
    Par défaut [IML] Goto statement dans une proc iml
    Bonjour à tous,

    Dans une proc iml j'utilise plusieurs GOTO pour diriger la résolution du programme vers des parties de celui-ci sans oublier à chaque fin de ces parties de rediriger par un nouveau goto vers l'endroit souhaité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    proc iml;
    st=2;
    goto st2;
    st2 : st=4; print st;goto st4;
    st3 : st=5; print st;goto exit;
    st4 : st=3; print st;goto st3;
    exit :  quit;
    La sortie montre que le programme s'exécute sans prendre en compte les GOTO puisque qu'il affiche les valeurs de st successives comme suit : 4 puis 5 puis 3.

    Le message d'erreur est le suivant :

    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
    26
     
    1071  proc iml;
    NOTE: IML Ready
    1072  st=2;
    1073  goto st2;
    ERROR: Unresolved label: ST2
    1074  st2 :
    1074!       st=4;
    1074!             print st;
    1074!                      goto st4;
    ERROR: Unresolved label: ST4
    1075  st3 :
    1075!       st=5;
    1075!             print st;
    1075!                      goto exit;
    ERROR: Unresolved label: EXIT
    1076  st4 :
    1076!       st=3;
    1076!             print st;
    1076!                      goto st3;
    ERROR: Unresolved label: ST3
    1077  exit :  quit;
    NOTE: Exiting IML.
    NOTE: PROCEDURE IML used (Total process time):
          real time           0.01 seconds
          cpu time            0.01 seconds
    Pourquoi ces GOTO ne sont pas pris en compte ?
    Quel est le problème ?

    Merci

  2. #2
    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
    Le problème c'est qu'on ne peut faire de GOTO que dans un module, ou encadrés de blocs DO/END.
    CAUTION: The GOTO and LINK statements are limited to being inside a module or DO group. (pris dans la doc SAS/IML sur GOTO, ici)
    Ton programme doit être transformé ainsi :
    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
    proc iml;
    st=2;
    do ; 
    	goto a;
    	a: do ; 
    		st=4; 
    		print st;
    		goto c; 
    	   end ;
    	b: do ; 
    		st=5; 
    		print st;
    		goto hell ;
           end ;
    	c: do ; 
    		st=3; 
    		print st;
    		goto b;
           end ;
    	hell:
    	    stop;
    end ;
    quit;
    Olivier
    Bon courage.
    Olivier

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Merci,

    Comme la doc (cf. votre référence) dit aussi insérer un goto dans un module, j'ai cherché du côté du module et je suis tombé sur les fonctions définies avec start et finish comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    proc iml;
    start essai(st) global(t);
    goto st2;
    st2 : st=4; print st;goto st4;
    st3 : st=5; print st;goto exit;
    st4 : st=3; print st;goto st3;
    exit : t=st;finish essai;
    run essai(2);
    print t;
    quit;
    C'est un peu fastidieux, il faut définir une variable global (ici t) , mais ça marche aussi.
    La question est toujours : quelle est la méthode la moins consommatrice de mémoire et donc de temps ?

    Merci encore !

  4. #4
    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
    La moins consommatrice de temps et de mémoire, c'est de ne pas faire de GOTO du tout, je pense !
    Normalement, un module bouffe un peu de place, mais vu la taille des instructions, je ne pense pas que ça fasse une grosse différence.
    La solution optimale (à mes yeux, et je ne fais pas souvent d'IML) serait d'écrire des IF / THEN / ELSE pour gérer les différents cas, et s'il y a trop de répétitions de code, de les stocker dans des macro-programmes (SAS s'occupera du copier/coller, comme ça on centralise quand même le code).
    Mais des utilisateurs plus habitués à optimiser leur IML auront sans doute de meilleures suggestions.
    Bon courage.
    Olivier

Discussions similaires

  1. Appels de procedures stockées dans une proc stockée ?
    Par Nadaa dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 17/07/2008, 10h32
  2. Proc export dans une proc IML
    Par stefsas dans le forum SAS IML
    Réponses: 0
    Dernier message: 05/05/2008, 16h08
  3. [type de retour dans une proc]
    Par viny dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 19/03/2005, 14h35
  4. [erreur dans une proc]
    Par viny dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 11/03/2005, 12h45
  5. Comment completer une variable dans une PROC
    Par Le Basque dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/09/2004, 17h18

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