1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 974
    Points : 555
    Points
    555

    Par défaut Export en data _null_ file

    Bonjour,


    Je posséde une table "refec9" avec les champs suivants :


    numero_police

    application

    flux

    cause_evenement

    anomalie

    date_creation_rejet

    acteur

    statut

    analyse_gestion

    analyse_moe

    date_derniere_modif

    lid

    rolper

    numper
    Je veux créer en sortie 8 tables différentes en fonction du champ "acteur" qui a 8 valeurs distinct dans la table "refec9" .

    J'ai construit ce code SAS pour export en data _null_ avec l'instruction file :

    Code SAS : 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
    data _null_;
     
    set work.refec9;
     
    mois = month(input("&sysdate9",date9.));
    annee = year(input("&sysdate9",date9.));
    jour  = day(input("&sysdate9",date9.));
    call symput('mois',compress(put(mois,Z2.)));
    call symput('annee',compress(put(annee,best.)));
    call symput('jour',compress(put(jour,Z2.)));
    call symputx('lien','\\batd0\bases_rad\ficovie\');
    call symputx('fichier','_ACTEURXXX');
    call symputx('acteur00','MOA Reglementaire');
    call symputx('acteur01','MOE FICOVIE');
    call symputx('acteur02','Gestion Pegase');
    call symputx('acteur03','Gestion 8X');
    call symputx('acteur04','Gestion PTV');
    call symputx('acteur05','Gestion Espece');
    call symputx('acteur06','Gestion Obseques');
    call symputx('acteur07','Gestion BIGBEN');
    call symputx('header','numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion analyse_moe date_derniere_modif lid rolper numper');
     
    if FIRST.acteur then do;
    put &header;
       if refec9.acteur=&acteur00 then do;
       file "&lien&annee&mois&jour&acteur00..xlsx" encoding="UTF-8" ;
       put numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion analyse_moe date_derniere_modif lid rolper numper;
       end;
       else
       if refec9.acteur=&acteur01 then do;
       file "&lien&annee&mois&jour&acteur01..xlsx" encoding="UTF-8" ;
       put numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion analyse_moe date_derniere_modif lid rolper numper;
       end;
    end;
     
    run;

    En log SAS j'ai ceci dans le journal :


    Code journal sas : 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
        24         data _null_;
        25         
        26         set work.refec9;
        27         
        28         mois = month(input("&sysdate9",date9.));
        SYMBOLGEN:  Macro variable SYSDATE9 resolves to 23NOV2017
        29         annee = year(input("&sysdate9",date9.));
        SYMBOLGEN:  Macro variable SYSDATE9 resolves to 23NOV2017
        30         jour  = day(input("&sysdate9",date9.));
        SYMBOLGEN:  Macro variable SYSDATE9 resolves to 23NOV2017
        31         call symput('mois',compress(put(mois,Z2.)));
        32         call symput('annee',compress(put(annee,best.)));
        33         call symput('jour',compress(put(jour,Z2.)));
        34         call symputx('lien','\\batd0\bases_rad\ficovie\');
        35         call symputx('fichier','_ACTEURXXX');
        36         call symputx('acteur00','MOA Reglementaire');
        37         call symputx('acteur01','MOE FICOVIE');
        38         call symputx('acteur02','Gestion Pegase');
        39         call symputx('acteur03','Gestion 8X');
        40         call symputx('acteur04','Gestion PTV');
        41         call symputx('acteur05','Gestion Espece');
        42         call symputx('acteur06','Gestion Obseques');
        43         call symputx('acteur07','Gestion BIGBEN');
        44         call symputx('header','numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut
        44       ! analyse_gestion analyse_moe date_derniere_modif lid rolper numper');
        45         
        46         if FIRST.acteur then do;
        47         put &header;
                       _
                       22
        WARNING: Apparent symbolic reference HEADER not resolved.
        2                                                          The SAS System                          09:23 Thursday, November 23, 2017
     
        48            if refec9.acteur=&acteur00 then do;
                         _____________
                         557
        ERROR: DATA STEP Component Object failure.  Aborted during the COMPILATION phase.
        ERROR 22-322: Expecting a name.  
     
        ERROR 557-185: Variable refec9 is not an object.
     
        NOTE: The SAS System stopped processing this step because of errors.
        NOTE: DATA statement used (Total process time):
              real time           0.01 seconds
              cpu time            0.00 seconds
     
        SYMBOLGEN:  Macro variable ACTEUR00 resolves to MOA Reglementaire
        SYMBOLGEN:  Macro variable LIEN resolves to \\batd0\bases_rad\ficovie\
        SYMBOLGEN:  Macro variable ANNEE resolves to 2017
        SYMBOLGEN:  Macro variable MOIS resolves to 11
        SYMBOLGEN:  Macro variable JOUR resolves to 23
        SYMBOLGEN:  Macro variable ACTEUR00 resolves to MOA Reglementaire
        49            file "&lien&annee&mois&jour&acteur00..xlsx" encoding="UTF-8" ;
        50            put numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion
        50       ! analyse_moe date_derniere_modif lid rolper numper;
        51            end;
        52            else
        53            if refec9.acteur=&acteur01 then do;
        SYMBOLGEN:  Macro variable ACTEUR01 resolves to MOE FICOVIE
        SYMBOLGEN:  Macro variable LIEN resolves to \\batd0\bases_rad\ficovie\
        SYMBOLGEN:  Macro variable ANNEE resolves to 2017
        SYMBOLGEN:  Macro variable MOIS resolves to 11
        SYMBOLGEN:  Macro variable JOUR resolves to 23
        SYMBOLGEN:  Macro variable ACTEUR01 resolves to MOE FICOVIE
        54            file "&lien&annee&mois&jour&acteur01..xlsx" encoding="UTF-8" ;
        55            put numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion
        55       ! analyse_moe date_derniere_modif lid rolper numper;
        56            end;
        57         end;
        58         
        59         run;
        60         
        61         GOPTIONS NOACCESSIBLE;
        62         %LET _CLIENTTASKLABEL=;
        63         %LET _CLIENTPROJECTPATH=;
        64         %LET _CLIENTPROJECTNAME=;
        65         %LET _SASPROGRAMFILE=;
        66         
        67         ;*';*";*/;quit;run;
        68         ODS _ALL_ CLOSE;
        69         
        70         
        71         QUIT; RUN;

    SAS refuse considérer des variables comme "header" ou "acteurXX" dans les conditions "table.champ" pour divider en 8 tables. Je ne vois pourquoi SAS réagit de la sorte ...

    J'ai utilisé la documentation ici même : http://www.users.miamioh.edu/bailera...ite-transf.pdf , https://thesasreference.wordpress.com/tag/data-_null_/ , http://www2.sas.com/proceedings/sugi27/p061-27.pdf .

    Si une ame charitable sait éclairer ma lanterne

  2. #2
    Membre confirmé
    Inscrit en
    novembre 2009
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 328
    Points : 626
    Points
    626

    Par défaut Création de macro variables

    Bonjour,

    Les macro variables sont créées à la fin de l'étape data :
    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
     
    1    data _null_;
    2      mois = month(input("&sysdate9",date9.));
    3      annee = year(input("&sysdate9",date9.));
    4      jour  = day(input("&sysdate9",date9.));
    5      call symput('mois',compress(put(mois,Z2.)));
    6      call symput('annee',compress(put(annee,best.)));
    7      call symput('jour',compress(put(jour,Z2.)));
    8      call symputx('lien','\\batd0\bases_rad\ficovie\');
    9      call symputx('fichier','_ACTEURXXX');
    10     call symputx('acteur00','MOA Reglementaire');
    11     call symputx('acteur01','MOE FICOVIE');
    12     call symputx('acteur02','Gestion Pegase');
    13     call symputx('acteur03','Gestion 8X');
    14     call symputx('acteur04','Gestion PTV');
    15     call symputx('acteur05','Gestion Espece');
    16     call symputx('acteur06','Gestion Obseques');
    17     call symputx('acteur07','Gestion BIGBEN');
    18     call symputx('header','numero_police application flux cause_evenement anomalie
    18 ! date_creation_rejet acteur statut analyse_gestion analyse_moe date_derniere_modif lid rolper
    18 !  numper');
    19     %put &header;
    WARNING: Apparent symbolic reference HEADER not resolved.
    &header
    20   run;
     
    NOTE: DATA statement used (Total process time):
          real time           0.01 seconds
          cpu time            0.01 seconds
     
     
    21
    22   %put &header;
    numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut
    analyse_gestion analyse_moe date_derniere_modif lid rolper numper
    Par ailleurs, vos macro variables ne dépendant pas de la table, il est plus simple de les définir avec la commande %let, voir ici.

    Pour la date vous pouvez utiliser la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    23   %let date=%sysfunc(today(),yymmddn.);
    24   %put &date;
    20171123

    Cordialement,

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 974
    Points : 555
    Points
    555

    Par défaut

    Bonjour ,

    Citation Envoyé par mgdondon Voir le message
    Les macro variables sont créées à la fin de l'étape data :
    Impossible de les créer à la fin dans mon cas ... J'en ai obligatoirement besoin au début. Et N'est ce pas une norme que mettre des variables au débuts ?

    C'est comme ci j'avais besoin d'une variable a=100 dans un algorithme et que on me disait de ne faire a déclaration qu'à la fine , une fois l'appel de la variable faite ... Pas étonnant que l'algo ne fonctionne pas dans ce cas là

    Citation Envoyé par mgdondon Voir le message
    Par ailleurs, vos macro variables ne dépendant pas de la table, il est plus simple de les définir avec la commande %let, voir ici.
    C'est à dire qu'ils ne dépendent pas de la table ?

    Citation Envoyé par mgdondon Voir le message
    Pour la date vous pouvez utiliser la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    23   %let date=%sysfunc(today(),yymmddn.);
    24   %put &date;
    20171123
    Je note pour la date du jour

  4. #4
    Membre confirmé
    Inscrit en
    novembre 2009
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 328
    Points : 626
    Points
    626

    Par défaut Création de macro variables

    Bonjour,

    Les macro variables sont créées en dehors des tables. J'ai dit que vos macro variables ne dépendaient pas de la table en ce sens que vous ne voulez pas créer une macro variable contenant le nombre de lignes de votre table par exemple. Dans votre cas je pense que le plus simple est de les créer avant votre étape data à l'aide de l'instruction %let. Je vous invite à lire cette page qui présente 3 méthodes pour construire des macro variables.

    Si vous tenez à les créer à l'aide d'une étape data, il faut faire une première étape data pour la création des macro variables (ce que vous avez fait dans votre précédent programme) puis une étape data qui utilisera ces macro variables.

    Cordialement,

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 974
    Points : 555
    Points
    555

    Par défaut

    Bonjour,

    @mgdondon : c'est deux programmes distinct attention , les deux programmes n'ont rien à voir !

    Je viens de corriger le programme . L'instruction %let ne fonctionne au quel cas la variable prend la valeur &mavariable et non la valeur qu'elle je lui attribue ...

    Code SAS : 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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    data _null_;
     
    mois = month(input("&sysdate9",date9.));
    annee = year(input("&sysdate9",date9.));
    jour  = day(input("&sysdate9",date9.));
    call symput('mois',compress(put(mois,Z2.)));
    call symput('annee',compress(put(annee,best.)));
    call symput('jour',compress(put(jour,Z2.)));
    call symputx('lien','\\batd0\bases_rad\ficovie\');
    call symputx('fichier','_ACTEURXXX');
    call symputx('extension','.xlsx');
    run;
     
    %put &annee &mois &jour &lien &fichier &extension ;
     
    proc sort data=work.refec9; by acteur;
     
    data _null_;
     
    set work.refec9;
     
    call symputx('acteur00','MOA Reglementaire');
    call symputx('acteur01','MOE FICOVIE');
    call symputx('acteur02','Gestion Pegase');
    call symputx('acteur03','Gestion 8X');
    call symputx('acteur04','Gestion PTV');
    call symputx('acteur05','Gestion Espece');
    call symputx('acteur06','Gestion Obseques');
    call symputx('acteur07','Gestion BIGBEN');
    call symputx('header','numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion analyse_moe date_derniere_modif lid rolper numper');
    /*
    %let lien=\\batd0\bases_rad\ficovie\;
    %let fichier='_ACTEURXXX';
    %let acteur00='MOA Reglementaire';
    %let acteur01='MOE FICOVIE';
    %let acteur02='Gestion Pegase';
    %let acteur03='Gestion 8X';
    %let acteur04='Gestion PTV';
    %let acteur05='Gestion Espece';
    %let acteur06='Gestion Obseques';
    %let acteur07='Gestion BIGBEN';
    %let header='numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion analyse_moe date_derniere_modif lid rolper numper';
    */
     
    by acteur;
     
    if FIRST.acteur then do;
    title &header;
       if acteur=&acteur00 then do;
       file "&lien&annee&mois&jour&acteur00&extension" filevar=refec9 mod;
       put numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion analyse_moe date_derniere_modif lid rolper numper;
       end;
       else
       if acteur=&acteur01 then do;
       file "&lien&annee&mois&jour&acteur01&extension" filevar=refec9 mod;
       put numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion analyse_moe date_derniere_modif lid rolper numper;
       end;
    end;
     
    run;
     
    proc sort data=work.refec9; by acteur;
     
    data _null_;
     
    set work.refec9;
     
    call symputx('acteur00','MOA Reglementaire');
    call symputx('acteur01','MOE FICOVIE');
    call symputx('acteur02','Gestion Pegase');
    call symputx('acteur03','Gestion 8X');
    call symputx('acteur04','Gestion PTV');
    call symputx('acteur05','Gestion Espece');
    call symputx('acteur06','Gestion Obseques');
    call symputx('acteur07','Gestion BIGBEN');
    call symputx('header','numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion analyse_moe date_derniere_modif lid rolper numper');
    /*
    %let lien=\\batd0\bases_rad\ficovie\;
    %let fichier='_ACTEURXXX';
    %let acteur00='MOA Reglementaire';
    %let acteur01='MOE FICOVIE';
    %let acteur02='Gestion Pegase';
    %let acteur03='Gestion 8X';
    %let acteur04='Gestion PTV';
    %let acteur05='Gestion Espece';
    %let acteur06='Gestion Obseques';
    %let acteur07='Gestion BIGBEN';
    %let header='numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion analyse_moe date_derniere_modif lid rolper numper';
    */
     
    by acteur;
     
    if FIRST.acteur then do; 
    title &header;
       if acteur=&acteur00 then do; 
       file "&lien&annee&mois&jour&acteur00&extension" filevar=refec9 mod;
       put numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion analyse_moe date_derniere_modif lid rolper numper;
       end;
       else 
       if acteur=&acteur01 then do; 
       file "&lien&annee&mois&jour&acteur01&extension" filevar=refec9 mod;
       put numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion analyse_moe date_derniere_modif lid rolper numper;
       end;
    end;
     
    run;

    Le journal SAS :

    NOTE: Writing TAGSETS.SASREPORT13(EGSR) Body file: EGSR
    22
    23 GOPTIONS ACCESSIBLE;
    24 proc sort data=work.refec9; by acteur;
    25

    NOTE: Input data set is already sorted, no sorting done.
    NOTE: PROCEDURE SORT used (Total process time):
    real time 0.01 seconds
    cpu time 0.00 seconds

    26 data _null_;

    27
    28 set work.refec9;
    29
    30 call symputx('acteur00','MOA Reglementaire');
    31 call symputx('acteur01','MOE FICOVIE');
    32 call symputx('acteur02','Gestion Pegase');
    33 call symputx('acteur03','Gestion 8X');
    34 call symputx('acteur04','Gestion PTV');
    35 call symputx('acteur05','Gestion Espece');
    36 call symputx('acteur06','Gestion Obseques');
    37 call symputx('acteur07','Gestion BIGBEN');
    38 call symputx('header','numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut
    38 ! analyse_gestion analyse_moe date_derniere_modif lid rolper numper');
    39 /*
    40 %let lien=\\batd0\bases_rad\ficovie\;
    41 %let fichier='_ACTEURXXX';
    42 %let acteur00='MOA Reglementaire';
    43 %let acteur01='MOE FICOVIE';
    44 %let acteur02='Gestion Pegase';
    45 %let acteur03='Gestion 8X';
    46 %let acteur04='Gestion PTV';
    47 %let acteur05='Gestion Espece';
    48 %let acteur06='Gestion Obseques';
    2 The SAS System 09:00 Friday, November 24, 2017

    49 %let acteur07='Gestion BIGBEN';
    50 %let header='numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion
    50 ! analyse_moe date_derniere_modif lid rolper numper';
    51 */
    52
    53 by acteur;
    54
    55 if FIRST.acteur then do;
    SYMBOLGEN: Macro variable HEADER resolves to numero_police application flux cause_evenement anomalie date_creation_rejet acteur
    statut analyse_gestion analyse_moe date_derniere_modif lid rolper numper
    56 title &header;
    SYMBOLGEN: Macro variable ACTEUR00 resolves to MOA Reglementaire
    SYMBOLGEN: Macro variable LIEN resolves to \\batd0\bases_rad\ficovie\
    SYMBOLGEN: Macro variable ANNEE resolves to 2017
    SYMBOLGEN: Macro variable MOIS resolves to 11
    SYMBOLGEN: Macro variable JOUR resolves to 24
    SYMBOLGEN: Macro variable ACTEUR00 resolves to MOA Reglementaire
    SYMBOLGEN: Macro variable EXTENSION resolves to .xlsx
    ERROR: A Physical file reference (i.e. "PHYSICAL FILE REFERENCE" ) or an aggregate file storage reference (i.e. AGGREGATE(MEMBER) )
    reference cannot be used with the FILEVAR= option.
    57 if acteur=&acteur00 then do;
    NOTE: Line generated by the macro variable "ACTEUR00".
    57 MOA Reglementaire
    _____________
    388
    76
    ERROR 388-185: Expecting an arithmetic operator.

    ERROR 76-322: Syntax error, statement will be ignored.

    58 file "&lien&annee&mois&jour&acteur00&extension" filevar=refec9 mod;
    59 put numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion
    59 ! analyse_moe date_derniere_modif lid rolper numper;
    SYMBOLGEN: Macro variable ACTEUR01 resolves to MOE FICOVIE
    60 end;
    61 else
    SYMBOLGEN: Macro variable LIEN resolves to \\batd0\bases_rad\ficovie\
    SYMBOLGEN: Macro variable ANNEE resolves to 2017
    SYMBOLGEN: Macro variable MOIS resolves to 11
    SYMBOLGEN: Macro variable JOUR resolves to 24
    SYMBOLGEN: Macro variable ACTEUR01 resolves to MOE FICOVIE
    SYMBOLGEN: Macro variable EXTENSION resolves to .xlsx
    62 if acteur=&acteur01 then do;
    ERROR: A Physical file reference (i.e. "PHYSICAL FILE REFERENCE" ) or an aggregate file storage reference (i.e. AGGREGATE(MEMBER) )
    reference cannot be used with the FILEVAR= option.
    NOTE: Line generated by the macro variable "ACTEUR01".
    62 MOE FICOVIE
    _______
    388
    76
    ERROR 388-185: Expecting an arithmetic operator.

    ERROR 76-322: Syntax error, statement will be ignored.

    63 file "&lien&annee&mois&jour&acteur01&extension" filevar=refec9 mod;
    64 put numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion
    64 ! analyse_moe date_derniere_modif lid rolper numper;
    65 end;
    3 The SAS System 09:00 Friday, November 24, 2017

    ___
    161
    66 end;
    ___
    161
    ERROR 161-185: No matching DO/SELECT statement.

    67
    68 run;

    NOTE: The SAS System stopped processing this step because of errors.
    NOTE: DATA statement used (Total process time):
    real time 0.01 seconds
    cpu time 0.01 seconds


    69
    70
    71 GOPTIONS NOACCESSIBLE;
    72 %LET _CLIENTTASKLABEL=;
    73 %LET _CLIENTPROJECTPATH=;
    74 %LET _CLIENTPROJECTNAME=;
    75 %LET _SASPROGRAMFILE=;
    76
    77 ;*';*";*/;quit;run;
    78 ODS _ALL_ CLOSE;
    79
    80
    81 QUIT; RUN;
    82
    Chose etonnante la structure " if; end; " tombe en anomalie ... SAS ne sais pas lire ces propres balises ! C'est très inquiétant car la syntaxe a pourtant été validé par l'un de mes collaborateurs !

  6. #6
    Membre confirmé
    Inscrit en
    novembre 2009
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 328
    Points : 626
    Points
    626

    Par défaut Création de macro variables

    c'est deux programmes distinct attention , les deux programmes n'ont rien à voir !
    Au contraire, les programmes ont en commun la création et l'utilisation de macro variables...

    Chose étonnante la structure " if; end; " tombe en anomalie ... SAS ne sais pas lire ses propres balises !
    Et si vous changiez de point de vue et arrêtiez de penser que c'est de la faute de SAS ? Votre log dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    57 if acteur=&acteur00 then do;
    NOTE: Line generated by the macro variable "ACTEUR00".
    57 MOA Reglementaire
    donc SAS essaie d'exécuter if acteur=MOA Reglementaire then do;.

    Il manquerait bien des guillemets quelque part...

    D'autre part, je vous conseille de déplacer la création des macro variables acteur00 à header dans votre première étape data. Écrit comme tel, si vous fermez SAS et le relancez, les macro variables acteur00 à header ne seront pas connues.

    J'ai vu que vous avez essayé d'utiliser l'instruction %let. Il vaut mieux la sortir de l'étape data.

    Cordialement,

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 974
    Points : 555
    Points
    555

    Par défaut

    Citation Envoyé par mgdondon Voir le message
    Et si vous changiez de point de vue et arrêtiez de penser que c'est de la faute de SAS ? Votre log dit :
    J'ai surtout l'impression qu'on ce moque du monde à la fin ... Je suis formel les quotes ne passent pas dans la lectures des adresses !

    La preuve en image :


    Pour preuve :

    Code SAS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* option 1 */
     
    %let filelink="\\server\under file1\under file2\johndoe.xlsx"
     
    /* option 2 */
     
    %let filelink='\\server\under file1\under file2\johndoe.xlsx'

    Équivaut à écrire :

    "\\server\under file1\under file2\johndoe.xlsx" ou '\\server\under file1\under file2\johndoe.xlsx' .

    Jusqu'à preuve du contraire les chemins Windows n'ont jamais commencés par des quotes simples ou doubles ... Les quotes simples ou doubles sont bon à mettre dans un lien si l'on fait du MSdos ...

    Exemple :

    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    instruction \\server\"under file1"\"under file2"\johndoe.csv

    Pas en SAS , qu'on arrête avec cette ânerie de quote dans un lien de fichier ! Par pitier !

    Citation Envoyé par mgdondon Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    57 if acteur=&acteur00 then do;
    NOTE: Line generated by the macro variable "ACTEUR00".
    57 MOA Reglementaire
    donc SAS essaie d'exécuter if acteur=MOA Reglementaire then do;.

    Il manquerait bien des guillemets quelque part...
    [Soupir ...]

    &acteur00 est l'appel d'une variable , pas une valeur texte ... Je ne vois pas pourquoi cela est rejeté ... Besoin de créer une variable supplémentaire &quote de la sorte :

    Code SAS : Sélectionner tout - Visualiser dans une fenêtre à part
     if acteur=&quote&acteur00&quote then do;

    ?????

    Citation Envoyé par mgdondon Voir le message
    D'autre part, je vous conseille de déplacer la création des macro variables acteur00 à header dans votre première étape data. Écrit comme tel, si vous fermez SAS et le relancez, les macro variables acteur00 à header ne seront pas connues.

    J'ai vu que vous avez essayé d'utiliser l'instruction %let. Il vaut mieux la sortir de l'étape data.
    J'ai coupé l'herbe sous le pied des call symputx et je suis en train de tout remplacer par les %let .

  8. #8
    Membre confirmé
    Inscrit en
    novembre 2009
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 328
    Points : 626
    Points
    626

    Par défaut Création de macro variables

    &acteur00 est l'appel d'une variable , pas une valeur texte ... Je ne vois pas pourquoi cela est rejeté ...
    &acteur00 est en effet l'appel d'une variable qui est interprétée comme MOA Reglementaire donc SAS essaie d'exécuter if acteur=MOA Reglementaire then do;.

    Besoin de créer une variable supplémentaire &quote de la sorte : if acteur=&quote&acteur00&quote then do;
    Je ne vois pas l'intérêt d'utiliser une macro variable quote. Vous pouvez simplement écrire if acteur="&acteur00" then do;.

    Quant aux guillemets autour des chemins et noms de fichiers, c'est la syntaxe – que vous avez d'ailleurs utilisée dans votre précédent programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    proc export data=work.&ma_table outfile="&lien&annee&mois&jour&fichier&mon_extension" 
         dbms=&mon_format replace;
         sheet=&nom_feuille;
    run;
    Cordialement,

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 974
    Points : 555
    Points
    555

    Par défaut

    Citation Envoyé par mgdondon Voir le message
    &acteur00 est en effet l'appel d'une variable qui est interprétée comme MOA Reglementaire donc SAS essaie d'exécuter if acteur=MOA Reglementaire then do;.

    Je ne vois pas l'intérêt d'utiliser une macro variable quote. Vous pouvez simplement écrire if acteur="&acteur00" then do;.

    Quant aux guillemets autour des chemins et noms de fichiers, c'est la syntaxe - que vous avez d'ailleurs utilisée dans votre précédent programme :


    Cordialement,
    Correction faite avec les quotes , j'ai un fichier qui qui se crée .

    Par contre maintenant c'est la création et l'injection des données dans le classeur Excel qui pose problème. Le fichier Excel se crée , mais reste à 0 octet et surtout n'est pas "ouvrable" ...

    Après fouillage j'ai bidouillé ceci pour l'injection dans le fichier Excel :

    Code SAS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if acteur="&acteur00" and statut^="&statut" then do; 
       file "&lien&annee&mois&jour&acteur00&extension" RECFM=V LRECL=131068 encoding='utf-8';
       put numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion analyse_moe date_derniere_modif lid rolper numper;
    end;
    else 
    if acteur="&acteur01" and statut^="&statut" then do; 
       file "&lien&annee&mois&jour&acteur01&extension" RECFM=V LRECL=131068 encoding='utf-8' ;
       put numero_police application flux cause_evenement anomalie date_creation_rejet acteur statut analyse_gestion analyse_moe date_derniere_modif lid rolper numper;
    end;

  10. #10
    Membre confirmé
    Inscrit en
    novembre 2009
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 328
    Points : 626
    Points
    626

    Par défaut Export sous condition

    Bonjour,

    Vous pouvez reprendre la macro que vous avez définie dans votre précédent message et y ajouter une condition :

    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
    %let date=%sysfunc(today(),yymmddn.);
     
    %macro export(acteur);
      proc export data=refec9 outfile="\\monserveur\sousdossier\&date._&acteur..xslx" 
           dbms=XLSX replace;
           where acteur=&acteur;
      run;
    %mend;
     
    %export("MOA Reglementaire");
    %export("MOE FICOVIE");
    %export("Gestion Pegase");
    %export("Gestion 8X");
    %export("Gestion PTV");
    %export("Gestion Espece");
    %export("Gestion Obseques");
    %export("Gestion BIGBEN");
    Il vaut mieux définir en macro variable seulement ce qui est variable. De même que je ne vois pas l'intérêt de définir une macro variable quote, il ne me semble pas utile de définir des macro variables pour le format et l’extension si l'export est toujours dans le même format.

    Bon week-end,

    PS : Il vaudrait mieux éditer votre message d'hier 11:11 et utiliser les balises [CODE] plutôt que [QUOTE] autour de la log. C'est plus lisible.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 974
    Points : 555
    Points
    555

    Par défaut

    Bonjour,

    Après de nombreuses heure a faire des tests avec les %let et les call symput(x) , j'ai tout retranscrit en %let finalement . Afin de palier au défaut du call symput(x) qui ne donne l'info au second passage du programme dans mon cas.

    J'ai littéralement coupé l'herbe sous le pied du call symput(x) pour tout mettre en %let et des "call execute" .

    Comme cela SAS peut gérer son code de manière intelligente .

    Voici le code :

    Code SAS : 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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    /* declaration des variables */
     
    %let annee = %sysfunc(date(),year4.);
    %let mois = %sysfunc(date(),Month2.); 
    %let jour = %sysfunc(date(),day2.); 
    %let lien = '\\batd0\bases_rad\ficovie\' ;
    %let general = 'GENERAL';
    %let tableori = 'refec9';
    %let acteur00 = 'MOA Reglementaire';
    %let acteur01 = 'MOE FICOVIE';
    %let acteur02 = 'Gestion Pegase'; 
    %let acteur03 = 'Gestion 8X';
    %let acteur04 = 'Gestion PTV';
    %let acteur05 = 'Gestion Espece';
    %let acteur06 = 'Gestion Obseques';
    %let acteur07 = 'Gestion BIGBEN';
    %let statut = 'Corrige' ;
    %let extension = '.xlsx' ;
    %let nomtable00 = 'nomtable00' ;
    %let nomtable01 = 'nomtable01' ;
    %let nomtable02 = 'nomtable02' ;
    %let nomtable03 = 'nomtable03' ;
    %let nomtable04 = 'nomtable04' ;
    %let nomtable05 = 'nomtable05' ;
    %let nomtable06 = 'nomtable06' ;
    %let nomtable07 = 'nomtable07' ;
    %let debprocsql = 'proc sql; create table ' ;
    %let mid1procsql = ' as select numero_police, application, flux, cause_evenement, anomalie, date_creation_rejet, acteur , statut , analyse_gestion , analyse_moe, date_derniere_modif, lid, rolper, numper, moesta, attmoesil, dtestrea, notic ' ;
    %let mid2procsql = ' from ' ;
    %let mid3procsql = ' where acteur like "' ;
    %let mid4procsql = '" and statut not like "' ;
    %let finprocsql = '" ; quit; ' ;
    %let debprocexp = 'proc export data=' ;
    %let mid1procexp = ' outfile =' ;
    %let guillemet = '"' ;
    %let mid2procexp = ' dbms=XLSX replace; ' ;
    %let mid3procexp = ' sheet="A_traiter"; ' ;
    %let finprocexp = ' run; ' ;
     
    data _null_;
     
    /* proc sql */
     
    morceau1=&debprocsql ;
    morceau21=&nomtable00 ;
    morceau22=&nomtable01 ;
    morceau23=&nomtable02 ;
    morceau24=&nomtable03 ;
    morceau25=&nomtable04 ;
    morceau26=&nomtable05 ;
    morceau27=&nomtable06 ;
    morceau28=&nomtable07 ;
    morceau3=&mid1procsql ;
    morceau4=&mid2procsql ;
    morceau5=&tableori;
    morceau6=&mid3procsql ;
    morceau71=&acteur00 ;
    morceau72=&acteur01 ;
    morceau73=&acteur02 ;
    morceau74=&acteur03 ;
    morceau75=&acteur04 ;
    morceau76=&acteur05 ;
    morceau77=&acteur06 ;
    morceau78=&acteur07 ;
    morceau8=&mid4procsql ;
    morceau9=&statut ;
    morceau10=&finprocsql ;
     
    call execute (morceau1||morceau21||morceau3||morceau4||morceau5||morceau6||morceau71||morceau8||morceau9||morceau10);
    call execute (morceau1||morceau22||morceau3||morceau4||morceau5||morceau6||morceau72||morceau8||morceau9||morceau10);
    call execute (morceau1||morceau23||morceau3||morceau4||morceau5||morceau6||morceau73||morceau8||morceau9||morceau10);
    call execute (morceau1||morceau24||morceau3||morceau4||morceau5||morceau6||morceau74||morceau8||morceau9||morceau10);
    call execute (morceau1||morceau25||morceau3||morceau4||morceau5||morceau6||morceau75||morceau8||morceau9||morceau10);
    call execute (morceau1||morceau26||morceau3||morceau4||morceau5||morceau6||morceau76||morceau8||morceau9||morceau10);
    call execute (morceau1||morceau27||morceau3||morceau4||morceau5||morceau6||morceau77||morceau8||morceau9||morceau10);
    call execute (morceau1||morceau28||morceau3||morceau4||morceau5||morceau6||morceau78||morceau8||morceau9||morceau10);
     
    /* proc export */
     
    morceau201=&debprocexp;
    /*morceau202=;*/
    morceau203=&mid1procexp;
    morceau204=&guillemet;
    morceau205=&lien;
    morceau206="&annee";
    morceau207="&mois";
    morceau208="&jour";
    morceau209bis=&general;
    morceau2010=&extension;
    morceau2011=&guillemet;
    morceau2012=&mid2procexp;
    morceau2013=&mid3procexp;
    morceau2014=&finprocexp; 
     
    call execute (morceau201||morceau5||morceau203||morceau204||morceau205||morceau206||morceau207||morceau208||morceau209bis||morceau2010||morceau2011||morceau2012||morceau2013||morceau2014);
    call execute (morceau201||morceau21||morceau203||morceau204||morceau205||morceau206||morceau207||morceau208||morceau71||morceau2010||morceau2011||morceau2012||morceau2013||morceau2014);
    call execute (morceau201||morceau22||morceau203||morceau204||morceau205||morceau206||morceau207||morceau208||morceau72||morceau2010||morceau2011||morceau2012||morceau2013||morceau2014);
    call execute (morceau201||morceau23||morceau203||morceau204||morceau205||morceau206||morceau207||morceau208||morceau73||morceau2010||morceau2011||morceau2012||morceau2013||morceau2014);
    call execute (morceau201||morceau24||morceau203||morceau204||morceau205||morceau206||morceau207||morceau208||morceau74||morceau2010||morceau2011||morceau2012||morceau2013||morceau2014);
    call execute (morceau201||morceau25||morceau203||morceau204||morceau205||morceau206||morceau207||morceau208||morceau75||morceau2010||morceau2011||morceau2012||morceau2013||morceau2014);
    call execute (morceau201||morceau26||morceau203||morceau204||morceau205||morceau206||morceau207||morceau208||morceau76||morceau2010||morceau2011||morceau2012||morceau2013||morceau2014);
    call execute (morceau201||morceau27||morceau203||morceau204||morceau205||morceau206||morceau207||morceau208||morceau77||morceau2010||morceau2011||morceau2012||morceau2013||morceau2014);
    call execute (morceau201||morceau28||morceau203||morceau204||morceau205||morceau206||morceau207||morceau208||morceau78||morceau2010||morceau2011||morceau2012||morceau2013||morceau2014);
     
    run;

    Au lieu d'avoir 1 millions de proc sql et de proc export , j'en tape 1 seule à chaque fois en dure ... avec des paramètres dynamique . Cela a été quand même du sport

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

Discussions similaires

  1. Que font DATA _NULL_ et STOP?
    Par 8twilight8 dans le forum SAS Base
    Réponses: 2
    Dernier message: 03/03/2009, 14h23
  2. [Macro] Création variable dans DATA _NULL_
    Par pierre24 dans le forum Macro
    Réponses: 8
    Dernier message: 18/07/2008, 10h56
  3. SSIS Export +Transformation Data - Script Component -
    Par magicsam dans le forum MS SQL-Server
    Réponses: 1
    Dernier message: 18/12/2007, 08h56
  4. Import export de data dans un programme
    Par jamescook dans le forum C++Builder
    Réponses: 9
    Dernier message: 16/05/2007, 11h07
  5. Réponses: 1
    Dernier message: 12/07/2006, 12h26

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