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 :

Appel de macro dans proc data avec call execute


Sujet :

Macro

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Appel de macro dans proc data avec call execute
    Bonjour,
    J'aimerais appeler une macro et récupérer une 'valeur de retour' à chaque itération dans l'étape data.
    Avec call execute ça fonctionne, la macro est appelée à chaque fois mais je récupère toujours le même résultat dans "tempo". Comment récupérer la variable l à chaque itération pour la stocker dans une colonne de SASUSER.TEST ?
    Merci,
    bon week-end.

    le code 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
    %macro PcTranche(tranche,annee,garantie);
     
    		PROC SQL;
    		Select Tranche, asin, sum(st_prov_n) 
    		into :k, :m, :l
    		from rea_aut.rskcp_C9_retraite
    		where Tranche =&tranche  and asin = &annee and CorrespGarGTN =  &garantie 
    		group by Tranche, asin, CorrespGarGTN;
    		quit;
     
     
    %mend PcTranche;
     
     
     
     data  SASUSER.TEST;
    	set rea_aut.rskcp_C9_Retraite;
    	call execute('%PcTranche ('||"'"||Tranche||"'"||','||asin||','||trim("'"||CorrespGarGTN||"'")||')');
    	tempo =&l;
     
    run;

  2. #2
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour

    J'ai essayé de deviner a la vue de ton code ce que tu souhaitais obtenir.
    Et il me semble que nul besoin de call execute ou de macro code pour cela.

    Si tu essayais de ne nous expliquer le traitement que tu souhaite réaliser ?

    Par un exemple Table de départ / Table de sortie ?

    Bon we a toi

  3. #3
    Membre éclairé

    Femme Profil pro
    SAS FRANCE - Support Clients France et Europe
    Inscrit en
    Février 2010
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : SAS FRANCE - Support Clients France et Europe
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 289
    Points : 886
    Points
    886
    Par défaut
    Bonjour,

    l'instruction temp=&l est exécuté avant que toutes les proc SQL le soit. Je pense que ce programme devrait donner le résultat attendu :
    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 PcTranche(tranche,annee,garantie);
     
    		PROC SQL;
    		SELECT Tranche, asin, sum(st_prov_n) 
    		INTO :k, :m, :l
    		FROM rea_aut.rskcp_C9_retraite
    		WHERE Tranche =&tranche  AND asin = &annee AND CorrespGarGTN =  &garantie 
    		GROUP BY Tranche, asin, CorrespGarGTN;
    		quit;
     
     
     DATA  SASUSER.TEST;
    	SET rea_aut.rskcp_C9_Retraite;
    	IF Tranche =&tranche  AND asin = &annee AND CorrespGarGTN =  &garantie THEN tempo =&l;
     
    run;
     
    %mend PcTranche;
     
     
     
     DATA  SASUSER.TEST;
    	SET rea_aut.rskcp_C9_Retraite;
    	call execute('%PcTranche ('||"'"||Tranche||"'"||','||asin||','||trim("'"||CorrespGarGTN||"'")||')');
    run;
    Mais à mon avis, ce n'est pas la bonne méthode. Il me semble qu'il faudrait juste faire une jointure :
    - faire une proc means ou summary sur la table rea_aut.rskcp_C9_retraite pour avoir les valeurs recherchées
    - puis joindre le résultat à rea_aut.rskcp_C9_Retraite.

    ça devrait être plus simple et "plus naturel" comme programmation.

    Cordialement,
    Géraldine Cade Deschamps
    Support Clients SAS

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Je reviens sur le premier code proposé par le questionneur.
    il faut bien comprendre que les "Call execute" sont générés par l'étape data qui les contient, mais sont executés une fois celle-ci finie.

    Donc, pour ajouter une variable (issue de la proc sql) à chaque ligne du fichier de départ, il faut que cet ajout soit programmé lui aussi par un call execute, juste après l'obtention du résultat &l dans tempo.

    Mais une proc sql interrompant une étape data, il faudra plutôt utiliser un proc append juste après la création d'un data uniligne, lisant la même ligne du fichier d'entrée que le sql précédent (avec un where construit à l'identique), et ajoutant la valeur tempo à ce moment là.

    du coup, le data initial (celui qui génère tout le reste), peut être un DATA _null_, le sasuser.test étant celui créé par le proc append.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Merci pour vos réponses, le problème est résolu.

    J'ai utilisé comme conseillé un proc means et fait une jointure sur le résultat.

    Désolé pour le retard, je ne me suis pas remis à ce sujet ces deux dernières semaines.

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

Discussions similaires

  1. Proc DATA avec macro
    Par vitalii dans le forum Macro
    Réponses: 0
    Dernier message: 19/08/2013, 12h04
  2. [XL-2007] appeler une macro dans un xla
    Par patricktoulon dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/11/2009, 17h23
  3. Appel à macro dans étape data pour modifier table
    Par Filippo dans le forum Macro
    Réponses: 2
    Dernier message: 14/10/2009, 09h00
  4. Réponses: 5
    Dernier message: 10/07/2009, 16h57
  5. Condition dans PROC DATA
    Par benbrisefer dans le forum SAS Base
    Réponses: 2
    Dernier message: 24/04/2009, 10h04

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