Le forum du Master ESA économétrie et statistique appliquée - Université d'Orléans

Vous n'êtes pas identifié.

Annonce

Vous êtes sur le forum du master ESA !

Le site du master ESA - description de la formation, notes de cours, contacts... est ici :

http://www.univ-orleans.fr/deg/masters/ESA/

#1 15-05-2017 16:57:32

ana.albutiu
Member
Date d'inscription: 11-09-2013
Messages: 11

SAS : Utiliser une macro variable avec une liste des dates

Bonjour,

Je voudrais passer une liste de dates via une macro variable. Je soupçonne que je me prends la tête et qu'il doit y avoir une solution plus simple....

proc sql noprint;
    select distinct date_alim
    into :liste_dates separated by ' "d," '
    from malib.matable
    order by date_alim
;
quit;

%let quotes1 = %str(%");
%let quotes2 = %str(%"d);

%let liste_dates1 = %bquote(&quotes1.&liste_dates&quotes2);

data mytable2;
    set malib.matable ( where = (date_alim in ( &liste_dates1. ))) ;
run;



... et bien sûr que ça marche pas. L'erreur que j'obtiens avec cette version du code est "Missing parenthesis for data set option list", alors que pas du tout...

Ce que je comprends pas c'est qu'avec une autre macro-variable avec exactement les mêmes valeurs, mais déclarée explicitement, ça marche :

%let liste_dates_ok = "01MAY2017"d, "02MAY2017"d ;

data mytable2;
    set malib.matable ( where = (date_alim in ( &liste_dates_ok. ))) ;
run;

On dirait que ces deux variables, &liste_dates_ok et &liste_dates1 sont exactement égales quand je fais %put, mais dans l'instruction, la deuxième ne marche pas.
En fait, quand je crée ces macrovariables, j'ai plein d'avertissements "The meaning of an identifier after a quoted string might change in a future SAS release. Inserting white space between a quoted string and the succeeding identifier is recommended."

Précisions :
- j'ai essayé avec et sans le bquote, c'est pareil
- j'ai essayé avec simples cotes et doubles cotes, c'est pareil
- je ne peux pas changer le format des dates dans la table malib.matable, parce qu'en fait c'est une table dans une librairie SQL Server
- je veux utiliser la liste plutôt dans une proc imstat pour charger des données sur un serveur LASR, mais c'est pareil pour une simple étape data

Merci d'avance pour toute suggestion !

Hors ligne

 

#2 15-05-2017 17:35:46

gozgoz
Member
Date d'inscription: 03-09-2013
Messages: 29

Re: SAS : Utiliser une macro variable avec une liste des dates

Salut  Ana,

J'y connais rien aux formats/informats de date dans sql server mais apparemment elles sont de la forme JJMONYYYY, tu devrais essayer un truc comme ça :

proc sql noprint;
    select distinct '"'||date_alim||'"d'
    into :liste_dates separated by '  '
    from malib.matable_avec_les_dates_que_je_veux
;/*Pas besoin d'un order smile */
quit;

data mytable2;
    set malib.matable ( where = (date_alim in ( &liste_dates. ))) ;
run;

Et si proc sql renvoie une erreur parce que tu utilises un opérateur caractère (||) avec une variable numérique, il faudrait essayer  select distinct '"'||put(date_alim,format approprié ou juste un $)||'"d'

Pour info:
"The meaning of an identifier after a quoted string might change in a future SAS release. Inserting white space between a quoted string and the succeeding identifier is recommended."

Les développeurs de SAS sont bienveillants, ils te préviennent juste que tu devrais éviter d'utiliser dans ta syntaxe un quote/doublequote suivi d'une lettre type une date: "..."d, une datetime : ".."dt, un nom littéral: '....'n au cas où dans une prochaine version ils en inventeraient un autre wink

Et une dernière chose, en relisant ton code j'ai l'impression que SAS sait déjà que date_alim est une date donc une variable numérique donc...:

proc sql noprint;
    select distinct date_alim
    into :liste_dates separated by '  '
    from malib.matable_avec_les_dates_que_je_veux
;/*Pas besoin d'un order smile */
quit;

data mytable2;
    set malib.matable ( where = (date_alim in ( &liste_dates. ))) ;
run;

...devrait marcher !

En espérant t'avoir aidé.

Bon courage

Dernière modification par gozgoz (15-05-2017 17:56:03)

Hors ligne

 

#3 16-05-2017 06:30:50

esa_sr
Administrator
Date d'inscription: 21-02-2007
Messages: 5109
Site web

Re: SAS : Utiliser une macro variable avec une liste des dates

on va faire TRES simple (parce que vous vous compliquez énormément la vie...)

Code:

data test;
   do date='01jan2017'd to '10jan2017'd;
     output;
   end;
   format date ddmmyy10.;
run;

proc sql ;
select distinct date format=8. into :liste_date separated by ' ' from test;
run;

proc print data=test(where=(date in (&liste_date)));
run;

et voilà !

Hors ligne

 

#4 16-05-2017 07:33:03

ana.albutiu
Member
Date d'inscription: 11-09-2013
Messages: 11

Re: SAS : Utiliser une macro variable avec une liste des dates

Merci beaucoup pour votre réactivité !

Effectivement, la solution la plus simple marche le mieux big_smile

Hors ligne

 

#5 17-05-2017 09:45:08

gozgoz
Member
Date d'inscription: 03-09-2013
Messages: 29

Re: SAS : Utiliser une macro variable avec une liste des dates

roll

Hors ligne

 

Pied de page des forums

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson