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 à macro dans étape data pour modifier table


Sujet :

Macro

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Par défaut Appel à macro dans étape data pour modifier table
    Bonsoir,
    Pour chaque ligne de l.corps, la macro IsInTable vérifie que la valeur de org est dans sasuser.nomorg.

    En fonction du résultat, j'aimerais que la valeur de CodeQual de la table toto soit modifiée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dm log 'clear' editor;
     
    data toto;
    	set l.corps(obs=10);
    	length CodeQual $ 255;
    	CALL EXECUTE ('%IsInTable(sasuser.nomorg, org,' || org ||', TRUE, TRUE);');
    run;

    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
    %macro IsInTable(MyTable, MyVar, MyValue, DisplayWarning, UpdateTable);
    	%global Trouve;
    	%let Trouve=FALSE;
     
    	%global NbOcc;
     
    	proc sql noprint;
    		SELECT COUNT(1) INTO :NbOcc FROM &MyTable WHERE &MyVar=&MyValue;
    	quit;
     
    	%if &UpdateTable=TRUE %then 
    		CodeQual="OK";
     
     
    	%If &NbOcc>0 %THEN %let Trouve=TRUE;
    	%if &DisplayWarning=TRUE AND &Trouve=FALSE %THEN %put "ATTENTION," &MyValue "pas trouvée pour" &MyVar;
    	%if &UpdateTable=TRUE AND &Trouve=FALSE %THEN CodeQual="PAS OK";
    %mend;
    J'obtiens l'erreur :

    NOTE: Ligne générée par la routine CALL EXECUTE.
    10 +
    CodeQual="OK" CodeQual="PAS OK";

    --------

    180

    ERREUR 180-322: Instruction incorrecte ou mal utilisée.
    Je n'arrive pas à trouver ce qui ne va pas.
    Si quelqu'un a une idée je suis preneur

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Par défaut
    Pour chaque ligne de l.corps, la macro IsInTable vérifie que la valeur de org est dans sasuser.nomorg.
    Donc tu veux faire ce que fait un SQL Join (ou un MERGE)

    non?

    xav

  3. #3
    Membre chevronné Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Par défaut
    Bonjour Xav,
    merci pour ta réponse.

    Je viens de trouver une solution qui marche. Je ne sais pas si c'est l'idéal, j'utilise une seconde proc sql pour mettre à jour la table :

    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 IsInTable(MyTableRef, MyVar, MyValue, MyTableOut, MyVarOut, DisplayWarning, UpdateTable);
    	%global Trouve;
    	%let Trouve=FALSE;
     
    	%global NbOcc;
     
    	/* Recherche d'une occurence &MyValue dans &MyTableRef pour la varaible &MyVar */
    	proc sql noprint;
    		SELECT COUNT(1) INTO :NbOcc FROM &MyTableRef WHERE &MyVar=&MyValue;
    	quit;
     
    	%If &NbOcc>0 %THEN %let Trouve=TRUE;
    	%if &DisplayWarning=TRUE AND &Trouve=TRUE %THEN %put "ATTENTION," &MyValue "pas trouvée pour" &MyVar;
     
    	/* Mise à jour de la variable &MyVarOut de la table &MyTableOut avec le résultat du test */
    	%if &UpdateTable=TRUE %Then %do;
    		proc sql noprint;
    			UPDATE &MyTableOut SET &MyVarOut=resolve('&Trouve') WHERE &MyVar=&MyValue;
    		quit;
    	%end;
    %mend;

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

Discussions similaires

  1. [DATA] Boucle sur deux tables dans étape Data
    Par Babzoo dans le forum SAS Base
    Réponses: 4
    Dernier message: 30/01/2014, 08h50
  2. Appel de macro dans proc data avec call execute
    Par Laurent04 dans le forum Macro
    Réponses: 4
    Dernier message: 18/02/2013, 13h45
  3. Macro : lag ne marche pas dans étape DATA
    Par cladoo dans le forum Macro
    Réponses: 5
    Dernier message: 08/11/2011, 13h15
  4. Réponses: 4
    Dernier message: 26/04/2010, 09h54
  5. 1 champs dans 1 form pour 2 tables
    Par froutloops62 dans le forum IHM
    Réponses: 1
    Dernier message: 13/04/2007, 05h10

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