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

Débutez Discussion :

Conversion Programme SAS PC sous SAS GUIDE


Sujet :

Débutez

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 40
    Points : 18
    Points
    18
    Par défaut Conversion Programme SAS PC sous SAS GUIDE
    Bonjour,

    Je débute actuellement sous SAS PC et SAS GUIDE et je dois convertir un code de SAS PC vers SAS GUIDE.

    Le code qui fonctionne parfaitement sous SAS PC 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
     
     
    %let debut=200712; 
    %let arrete=200806;
     
    /***********************************  II - DEFINITION DES MACROS ************************************************/
     
    /*********************** Macro permettant de définir les dates de chaque fin de mois ***************************/
     
    %macro dateop(do_period,do_number);
     
    %if %eval(&do_number.<1 and &do_number.>-1)=1 %then &do_period. ;
    %else %if %eval(&do_number.>0)=1 %then %do;
    %if %substr(&do_period.,5,2)=12 %then
    %dateop(%eval(&do_period.+89),%eval(&do_number.-1)) ;
    %else %dateop(%eval(&do_period.+1),%eval(&do_number.-1)) ;
    %end;
    %else %if %eval(&do_number.<0)=1 %then %do;
    %if %substr(&do_period.,5,2)=01 %then
    %dateop(%eval(&do_period.-89),%eval(&do_number.+1)) ;
    %else %dateop(%eval(&do_period.-1),%eval(&do_number.+1)) ;
    %end;
    %mend dateop;
     
     
    /***Macro permettant de créer et d'enregistrer des dates de fin de mois pour un mois et une variable donnés****/
     
    %macro definition_fin_mois(date=,var=);
    data _NULL_;
    %global &var;
    tmpdt=input("&date.01",yymmdd8.);
    tmpdt=intnx('month',tmpdt,0,'end');
    call symput("&var" ,compress("'"||put(tmpdt,date9.)||"'d"));
    run;
    %mend definition_fin_mois;
     
     
    /************************ Itération sur les 12 mois de la pocédure definition_fin_mois ***********************/
     
    %macro creation_date();
    %do i=1 %to 12;
    %global dt_fin_&i;
    %let fin_&i=%dateop(&debut.,&i);
    %put &&fin_&i;
    %definition_fin_mois(date = &&fin_&i,var=dt_fin_&i);
    %end;
    %mend creation_date;
     
     
     
    /******************* Macro permettant de répéter d'une ligne de code un nombre de fois donnée  ******************/
     
    %macro iteration(debut,fin,parametre);
    %do i=%eval(&debut) %to %eval(&fin);
    %str(%sysfunc(dequote(&parametre)));
    %end;
    %mend;
     
     
     
    /*************************************** III - CREATION DES DATES **************************************/
     
     
    /* Création de la date fin de mois de début d'année */
     
    %definition_fin_mois(date = &debut,var =dt_deb);
    %put &dt_deb;
     
    /* Création de la date fin de mois de la date d'Arrete */
     
    %definition_fin_mois(date = &arrete,var =dt_arr);
    %put &dt_arr;
     
    /* Création de la date fin de mois de la date de fin de capitalisation*/
    %let fin_capi=%dateop(&arrete.,-1);
     
    %definition_fin_mois(date = &fin_capi,var =dt_fin_capi);
    %put &dt_fin_capi;
     
     
    /* Création de la date fin de mois de l'année concernée*/
    %creation_date();

    Le problème de la convertion vers SAS GUIDE est du au fait que les invites (input) me donnent en entrée les variables
    et sous la forme suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    %LET debut = 31Dec2007;
    %LET arrete = 30Jun2008;
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    %let debut=200712; 
    %let arrete=200806;
    Comment faire tourner ce programme avec ces nouveaux inputs i.e comment faire fonctionner le programme SAS sous la forme ci-dessous:


    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
     
     
    %LET debut = 31Dec2007;
    %LET arrete = 30Jun2008;
     
    /***********************************  II - DEFINITION DES MACROS ************************************************/
     
    /*********************** Macro permettant de définir les dates de chaque fin de mois ***************************/
     
    %macro dateop(do_period,do_number);
     
    %if %eval(&do_number.<1 and &do_number.>-1)=1 %then &do_period. ;
    %else %if %eval(&do_number.>0)=1 %then %do;
    %if %substr(&do_period.,5,2)=12 %then
    %dateop(%eval(&do_period.+89),%eval(&do_number.-1)) ;
    %else %dateop(%eval(&do_period.+1),%eval(&do_number.-1)) ;
    %end;
    %else %if %eval(&do_number.<0)=1 %then %do;
    %if %substr(&do_period.,5,2)=01 %then
    %dateop(%eval(&do_period.-89),%eval(&do_number.+1)) ;
    %else %dateop(%eval(&do_period.-1),%eval(&do_number.+1)) ;
    %end;
    %mend dateop;
     
     
    /***Macro permettant de créer et d'enregistrer des dates de fin de mois pour un mois et une variable donnés****/
     
    %macro definition_fin_mois(date=,var=);
    data _NULL_;
    %global &var;
    tmpdt=input("&date.01",yymmdd8.);
    tmpdt=intnx('month',tmpdt,0,'end');
    call symput("&var" ,compress("'"||put(tmpdt,date9.)||"'d"));
    run;
    %mend definition_fin_mois;
     
     
    /************************ Itération sur les 12 mois de la pocédure definition_fin_mois ***********************/
     
    %macro creation_date();
    %do i=1 %to 12;
    %global dt_fin_&i;
    %let fin_&i=%dateop(&debut.,&i);
    %put &&fin_&i;
    %definition_fin_mois(date = &&fin_&i,var=dt_fin_&i);
    %end;
    %mend creation_date;
     
     
     
    /******************* Macro permettant de répéter d'une ligne de code un nombre de fois donnée  ******************/
     
    %macro iteration(debut,fin,parametre);
    %do i=%eval(&debut) %to %eval(&fin);
    %str(%sysfunc(dequote(&parametre)));
    %end;
    %mend;
     
     
     
    /*************************************** III - CREATION DES DATES **************************************/
     
     
    /* Création de la date fin de mois de début d'année */
     
    %definition_fin_mois(date = &debut,var =dt_deb);
    %put &dt_deb;
     
    /* Création de la date fin de mois de la date d'Arrete */
     
    %definition_fin_mois(date = &arrete,var =dt_arr);
    %put &dt_arr;
     
    /* Création de la date fin de mois de la date de fin de capitalisation*/
    %let fin_capi=%dateop(&arrete.,-1);
     
    %definition_fin_mois(date = &fin_capi,var =dt_fin_capi);
    %put &dt_fin_capi;
     
     
    /* Création de la date fin de mois de l'année concernée*/
    %creation_date();

    L'idée pour moi serait de créer un sous routine qui passerait les intputs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    %LET debut = 31Dec2007;
    %LET arrete = 30Jun2008;

    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    %let debut=200712; 
    %let arrete=200806;
    Aprés avoir passé une après midi à me casser les dents sur le sujet, je laisse ce sujet tres important pour moi à vos brillant esprits.

    Merci énormément de m'aider

  2. #2
    Membre éprouvé
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    Janvier 2012
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Points : 1 142
    Points
    1 142
    Par défaut
    Bonjour,

    Je n'ai pas regardé tout ton programme ... mais il n'y a normalement pas de "conversion" à faire entre un SAS base et un SAS EG ?

    Pour ta demande, tu peux jouer avec les formats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    %LET debut = 31Dec2007;
     
    /* conversion de la chaine de caractère en date SAS */
    %LET debut2 = %sysfunc(inputn(&debut, date9.));
    /* conversion d'une date sas en chaine de caractère */
    %LET debut3 = %sysfunc(putn(&debut2, YYMMN6.));
    /* tout en même temps ! */
    %LET debut4 = %sysfunc(putn(%sysfunc(inputn(&debut, date9.)), YYMMN6.));
     
    %PUT debut = &debut  --  debut2 = &debut2  --  debut3 = &debut3  --  debut4 = &debut4;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    Bonjour,


    Je n'ai pas regardé tout ton programme ... mais il n'y a normalement pas de "conversion" à faire entre un SAS base et un SAS EG ?
    >> En effet il n'y a normalement pas de conversion à faire mis a part de petits ajustements comme celui de l'objet de mon post.

    En effet, le pb que je pose est du au fait qu'en entrée, j'ai des invites SAS guide qui me donne la date sous le format 30Jun2007 et non celui de mon code d'origine.

    Je n'ai pas SAS pour l'instant sous la main. Des que c'est le cas je teste.

    >> Autre question SVP, que fais l'instruction merge du code ci dessous sur la table stock_fmp ?

    Apres avoir regardé sur le net, j'arrive toujours pas a comprendre. Quel en est l'equivalent SQL ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    proc sort data=stock_fmp; by id_sup; run;
     
     
    data stock_fmp;
     
           merge stock_fmp (in=a) supp (in=b)
           by id_sup;
           if a and b;
     
    run;

    Merci Bien

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    Citation Envoyé par bourbe Voir le message
    Quel en est l'equivalent SQL ?
    Merci Bien

    C'est "a peu près" un left join

    X

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    Citation Envoyé par xav2229 Voir le message
    C'est "a peu près" un left join

    X
    certainement pas : c'est exactement un inner join (s'il n'apparaît pas de doublons de id_sup dans les deux tables...)

    pour faire partie de la table résultat, les observations doivent être présentes dans les deux tables :
    en passant, ce programme élimine dans la table stock_fmp toutes les observations de la table stock_fmt qui n'ont pas une valeur de id_sup présente dans supp. Si c'est voulu, tant mieux mais c'est "un petit peu" dangereux...

    Cordialement

    Sébastien Ringuedé

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    en fait :

    c'est exactement un inner join (s'il n'apparaît pas de doublons de id_sup dans les deux tables...)
    c'est vrai mais le "sauf" est très important!

    De plus il y a d'autres considérations a prendre en compte : que se passe t'il si il y a des colonnes dans les deux tables qui ont le même nom mais ne sont pas dans la clause by??
    Exemple ces codes donne un résultat différent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    data m;
       merge a(in=aa) b(in=bb);
       by id;
       if aa and bb;
    run;
     
    proc sql;
       create table s as
       select *
       from a inner join b
       on a.id = b.id
       ;
    quit;
    C'est pour cela que c'est à peu près la même chose sinon il n'y aurait pas deux fonctions différentes.

    X

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 40
    Points : 18
    Points
    18
    Par défaut Resolu
    Merci pour votre retour ci dessus, ca marche tres bien


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

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/11/2011, 22h22
  2. Lancement automatique d'un programme sous SAS Guide
    Par val28 dans le forum SAS Base
    Réponses: 10
    Dernier message: 10/05/2011, 12h21
  3. le contenu des programmes en log sous SAS UNIX
    Par id301077 dans le forum Outils BI
    Réponses: 1
    Dernier message: 11/09/2009, 09h26
  4. rapport sous SAS Entreprise GUIDE
    Par id301077 dans le forum Outils BI
    Réponses: 5
    Dernier message: 06/04/2009, 18h35

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