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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
DATA JeuDeTest;
INFILE DATALINES;
LENGTH NumEtudiant $6 Periode $6 Note 8 Coefficent 8 Groupe $1 ;
INPUT
NumEtudiant Periode Note Coefficent Groupe ;
DATALINES;
001254 201703 17 2 S
001254 201707 16 1 I
001478 201706 15 2 I
001478 201707 14 3 I
007777 201606 11 2 I
007777 201707 14 3 S
007777 201801 19 5 I
;
RUN;
/** definition de la fonction periode suivante d un periode **/
PROC FCMP OUTLIB=work.funcs.temp ;
FUNCTION PeriodeSuivante(periode $) $;
mois=SUBSTR(periode,5,2);
annee=SUBSTR(periode,1,4);
nummois=INPUT(mois,8.)+1;
numannee=INPUT(annee,8.);
IF nummois=13 THEN DO;
nummois=1;
IncAnnee=1;
END;
ELSE IncAnnee=0;
numannee=numannee+IncAnnee;
successeur=PUT(numannee,z4.)!!PUT(nummois,z2.);
RETURN (successeur);
ENDSUB;
QUIT;
/** decl de la librairie de fonctions **/
OPTIONS CMPLIB=work.funcs;
/** Liste des variables de la table en entree **/
%MACRO ListeVar(DATA=,VarSortie=);
%GLOBAL &VarSortie;
PROC CONTENTS DATA = &DATA NOPRINT
OUT = file (KEEP = name );
RUN;
PROC SQL NOPRINT;
SELECT DISTINCT name
INTO: &VarSortie SEPARATED BY ","
FROM file;
QUIT;
%MEND;
%ListeVar(DATA=JeuDeTest,VarSortie=Liste);
DATA _null_;
CALL SYMPUT ('BListe',TRANWRD("&Liste",","," "));
CALL SYMPUT ('QListe',"'"!!TRANWRD("&Liste",",","','")!!"'");
RUN;
/**** mise en oeuvre de l algorithme ****/
DATA Resultat;
LENGTH TypePeriode $10 ;
IF 0 THEN SET JeuDeTest; /** declaration type et taille des variables nécessaire pour la definition du Hash **/
IF _N_=1 THEN DO;
DECLARE HASH MEMOIRE();
MEMOIRE.DEFINEKEY('TypePeriode');
MEMOIRE.DEFINEDATA('TypePeriode',&QListe);
MEMOIRE.DEFINEDONE();
END;
RETAIN PeriodeCourante ;
SET JeuDeTest;
BY NumEtudiant periode;
IF FIRST.NumEtudiant THEN DO;
RCM=MEMOIRE.CLEAR();
PeriodeCourante=Periode;
TypePeriode="Courante";
OUTPUT;
RCM=MEMOIRE.ADD();
END;
ELSE DO;
IF PeriodeSuivante(PeriodeCourante)=Periode
THEN DO;
RCM=MEMOIRE.CLEAR();
PeriodeCourante=Periode;
TypePeriode="Courante";
OUTPUT;
RCM=MEMOIRE.ADD();
END;
ELSE DO;
PeriodeCible=Periode;
TypePeriode="Cible";
RCM=MEMOIRE.ADD();
TypePeriode="Courante";
RCM=MEMOIRE.FIND();
*Periode=PeriodeSuivante(Periode);
DO UNTIL (PeriodeSuivante(Periode)=PeriodeCible);
Periode=PeriodeSuivante(Periode);
OUTPUT;
END;
TypePeriode="Cible";
RCM=MEMOIRE.FIND();
RCM=MEMOIRE.CLEAR();
TypePeriode="Courante";
RCM=MEMOIRE.ADD();
OUTPUT;
END;
END;
KEEP &BListe;
RUN; |
Partager