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

SAS Base Discussion :

Simplification d'un code : passage du cumulé au nom cumulé [DATA]


Sujet :

SAS Base

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 33
    Points : 34
    Points
    34
    Par défaut Simplification d'un code : passage du cumulé au nom cumulé
    * Bonjour, *

    Le code ci-dessous crée une ligne à chaque fois qu'il manque un mois entre deux règlements (et ce jusqu'à la date de fin d'étude Date_Fin_Rgl). Il affecte à cette ligne nouvellement crée le montant de règlement du mois précédent. (On a obtiens alors les règlements cumulés mensuels par id).

    Je cherche en vain à modifier ce programme de telle sorte qu'il crée bien une ligne correspondant au mois sans règlements, tout en attribuant la valeur 0 au règlement du mois crée et non le montant du mois précédent.(Règlements mensuels non cumulés par id)


    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
    Data entree ;
    format Date_Fin_Rgl Date_Rgl_fin_mois ddmmyy10.;id='0000000001';
    Date_Fin_Rgl= '31DEC2009'd; Date_Rgl_fin_mois ='31JAN2008'd; Montant_Reglement=10.0; output;
    Date_Fin_Rgl= '31DEC2009'd; Date_Rgl_fin_mois ='31MAR2008'd; Montant_Reglement=15.0; output;
    Date_Fin_Rgl= '31DEC2009'd; Date_Rgl_fin_mois ='28APR2008'd; Montant_Reglement=100.0; output;
    Date_Fin_Rgl= '31DEC2009'd; Date_Rgl_fin_mois ='31MAR2009'd; Montant_Reglement=150.0; output;
    Date_Fin_Rgl= '31DEC2009'd; Date_Rgl_fin_mois ='31MAY2009'd; Montant_Reglement=210.0; output;
    id='0000000002';
    Date_Fin_Rgl= '31DEC2009'd; Date_Rgl_fin_mois ='31JAN2008'd; Montant_Reglement=410.0; output;
    Date_Fin_Rgl= '31DEC2009'd; Date_Rgl_fin_mois ='31MAY2008'd; Montant_Reglement=415.0; output;
    Date_Fin_Rgl= '31DEC2009'd; Date_Rgl_fin_mois ='30JUN2008'd; Montant_Reglement=4100.0; output;
    Date_Fin_Rgl= '31DEC2009'd; Date_Rgl_fin_mois ='31JUL2009'd; Montant_Reglement=4150.0; output;
    run;
    proc sort data=entree;
    by id Date_Rgl_fin_mois;
    run;
    /*%let dtfin='31DEC2011'd;*/
    data sortie(drop=cum inter inter2 inter3 nbmois i );
      set entree;
      by id Date_Rgl_fin_mois ;
      retain cum inter inter2 inter3;
      if first.Date_Rgl_fin_mois then do;
          champ=cats('RGL_',put(month(Date_Rgl_fin_mois),z2.),put(year(Date_Rgl_fin_mois),z4.)  );
          cum=cumul_rgl;
            inter=Date_Rgl_fin_mois;
          output;
      end;
      else do;   
            if Date_Rgl_fin_mois=intnx('MONTH',inter,1,'end') then do;
               champ=cats('RGL_',put(month(Date_Rgl_fin_mois),z2.),put(year(Date_Rgl_fin_mois),z4.)  );
                 output;
                 cum=cumul_rgl;
               inter=Date_Rgl_fin_mois;
            end;
            else do;
                inter2=cumul_rgl;
                inter3=Date_Rgl_fin_mois;
                nbmois=intck('MONTH',inter,Date_Rgl_fin_mois);
                do i=1 to nbmois-1;
                      Date_Rgl_fin_mois=intnx('MONTH',inter,i,'end');
                      cumul_rgl=cum;
                      champ=cats('RGL_',put(month(Date_Rgl_fin_mois),z2.),put(year(Date_Rgl_fin_mois),z4.)  );
                      output;
                end;
                Date_Rgl_fin_mois=inter3;cumul_rgl=inter2;
                champ=cats('RGL_',put(month(Date_Rgl_fin_mois),z2.),put(year(Date_Rgl_fin_mois),z4.)  );
                output;
                cum=cumul_rgl;
              inter=Date_Rgl_fin_mois;
            end;
     
     
      end;
     
          if last.Date_Rgl_fin_mois and Date_Rgl_fin_mois ne Date_Fin_Rgl then do;
                nbmois=intck('MONTH',Date_Rgl_fin_mois,Date_Fin_Rgl);
                do i=1 to nbmois;
                      Date_Rgl_fin_mois=intnx('MONTH',Date_Rgl_fin_mois,1,'end');
                      champ=cats('RGL_',put(month(Date_Rgl_fin_mois),z2.),put(year(Date_Rgl_fin_mois),z4.)  );
                      output;
                end;  
            end;
    run;
    Je bloque sans réussir à trouver la bonne solution.
    Merci pour vos suggestions.

  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
    Bonsoir,

    je serais à ta place voici comment je procédérais.

    Je récupérerais pour chaque individu la plus petite date Date_Rgl_fin_mois (placée dans la variable debut) ainsi que la date Date_Fin_Rgl .

    Je générerais ensuite une ligne par individu et par mois entre "début" de l'individu en question et Date_Fin_Rgl de l'individu avec Date_Rgl_fin_mois contenant la date de fin de mois du mois correspondant.

    Ensuite je ne garderais que les couples (individus,Date_Rgl_fin_mois) qui ne sont pas présent dans ton fichier initial et initialiserais la variable Montant_Reglement à 0 ...

    Ce devrait être beaucoup plus court et facile que modifier ce code...dans lequel j'ai du mal à entrer je l'avoue

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 33
    Points : 34
    Points
    34
    Par défaut suite
    en fait à mon étape précédente je dispose d'une colonne qui stocke le cumul du mois précédent.

    Dans une nouvelle étpe Data, à la suite de code posté dans le sujet et par une simple soustraction de colonne avec distinction du cas first.id ça marche sans problème.
    Merci pour ton aide je retiens également ton astuce.

    Mais j'aimerai beaucoup trouver une solution utilisant ce code.

  4. #4
    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
    Si ton problème c'est que tu as déjà tout dans ton fichier "PreTable" qui correspond sauf que les montant ne sont pas bon , il suffit alors de "pointer" toutes les lignes correspondantes et mettre la valeur à 0.

    Tu as la liste des mois présents dans ta table initiale.
    Tu rajoute la variable pointeur='1'

    Tu merge sur l'individu et le mois et par une SQL par exemple ta PreTable avec ta table initiale pour récupérer la variable pointeur dans ta prétable.
    A chaque fois que tu auras une valeur manquante dans ta prétable , c'est que le mois n'était pas présent dans ta table initiale, et il te reste donc plus qu'à écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DATA TaTable;SET PreTable;
    If Pointeur^=1 THEN variable=0;
    DROP Pointeur;
    RUN;

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 33
    Points : 34
    Points
    34
    Par défaut Merci
    Merci beaucoup pour ta solution.

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

Discussions similaires

  1. simplification d'un code
    Par lolo93 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 29/04/2008, 11h38
  2. Réponses: 2
    Dernier message: 30/05/2007, 15h04
  3. compréhension de code (passage à une autre page)
    Par kokokaine dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/05/2007, 11h02
  4. Simplification de mon code?
    Par totoc1001 dans le forum MATLAB
    Réponses: 6
    Dernier message: 31/01/2007, 16h50
  5. [VBA-E] Aide pour simplification de mon code.
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/05/2006, 11h34

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