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

ODS et reporting Discussion :

array dans une proc report pour surligner certaines cellules


Sujet :

ODS et reporting

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut array dans une proc report pour surligner certaines cellules
    Bonjour,

    Je cherche à sortir un rapport qui me surligne les cellules qui m'intéressent.
    Je ne connais pas à l'avance les noms des colonnes de mon dataset ni leur nombre donc je les afficherai toutes.
    Je voudrais utiliser un array dans une proc report, j'ai vu que c'était possible dans un bloc compute mais je n'y arrive pas.
    Dans mon éditeur, le mot array reste en rouge comme s'il nétait pas reconnu, que je le mette dans le bloc compute ou en dehors.
    Quand il est dans le bloc compute, le message est le suivant: The width of STEARLCM is not between 1 and 93. Adjust the column width or linesize.
    Quand il n'y a pas de bloc compute, le message est le suivant: Statement is not valid or it is used out of proper order. (et il me souligne array)


    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    proc report data=MyDataset nofs split = "$" headskip missing;
    	compute /* */; /* je ne sais pas quoi mettre comme variable */
    		array MyVariables{*} _NUMERIC_;
    		do i=1 to dim(MyVariables);
    			if MyVariables[i]=1
    			then call define (_COL_,"style","STYLE=[BACKGROUND=ALICEBLUE]");
    		end;
    	endcomp;
    run;
    Merci de votre aide.

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Salut.
    Je pense que cette histoire est mal embarquée, parce que l'utilisation des Array dans une proc Report est toujours compliquée. Et dans ton cas, après quelques petits essais, je n'y arrive pas.
    Si j'ai bien suivi, tu veux colorier toutes les cases qui contiennent un 1. Je te propose une solution sans Array, sans proc Report et sans macro. Mais avec une macro ça marche aussi.
    L'idée est de collecter les noms de variables et leurs types auprès d'une proc Contents : on peut ainsi automatiser le traitement sans savoir les noms des variables ou leur ordre, ou encore leur nombre. Attention, en sortie de Contents, les variables sont par ordre alphabétique : il faut donc trier par position dans la table (info VARNUM).
    Puis on crée un format pour les variables numériques qui, quand on rencontre la valeur 1, renvoie ta couleur de surlignement. Le seul souci, c'est qu'on ne doit l'appliquer qu'aux colonnes numériques : d'où l'utilité d'avoir collecté qui fait quoi auprès de la proc Contents.
    Et ensuite, pour écrire automatiquement la proc Print, j'ai fait un CALL EXECUTE, juste pour faire plaisir au camarade Bruno. C'est là où on peut préférer passer par un macro-programme, mais ça me semble inutilement surcharger le code. Question de point de vue.
    Voilà une solution, donc :
    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
    PROC CONTENTS DATA=sashelp.prdsale OUT=work.dico (KEEP=name type varnum) NOPRINT ;
    RUN ;
    PROC FORMAT ;
    	VALUE numSurl
    		1 = "ALICEBLUE"
    		OTHER = ""
    	;
    RUN ;
    PROC SORT DATA=work.dico ;
    	BY varnum ;
    RUN ;
    ODS HTML ;
    DATA _NULL_ ;
    	SET work.dico END=fin ;
    	IF _N_=1 THEN CALL EXECUTE("PROC PRINT DATA=sashelp.prdsale NOOBS LABEL ;") ;
    	CALL EXECUTE ("VAR "!!name) ;
    	IF type=1 THEN CALL EXECUTE ("/STYLE(DATA)=[BACKGROUND=numSurl.]") ;
    	CALL EXECUTE (";") ;
    	IF fin THEN CALL EXECUTE("RUN ;") ;
    RUN ;
    ODS HTML CLOSE ;
    Bon courage.
    Olivier
    Bon courage.
    Olivier

  3. #3
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut


    Pour changer, merci olivier

    Ta solution marche parfaitement. Pas de proc report, pas d'array, perso, ça ne me dérange pas . En plus, ton code me permet d'utiliser call execute dont m'avait déjà parlé Bruno (quand j'avais demandé si on pouvait imbriquer une étape data dans une étape data).

    Juste pour info, voici le lien sur lequel je suis tombée quand j'ai cherché dans google proc report array. C'est un extrait du livre "SAS guide to report writing" (Michele Burlew). http://books.google.fr/books?id=k1Zr...esult&resnum=3

    C'est à la page 130. Il met un array dans une proc report. Je sais que ce n'est pas comme mon cas, mais bon, je pensais y arriver ...

    Merci à toi pour ta solution.

    Bonne après midi et bon week end

  4. #4
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    J'avais effectivement déjà fait des Array dans ces conditions, avec une variable ACROSS et donc un nombre de colonnes un peu imprévisible. Mais pour que ça fonctionne, il faut énumérer toutes les colonnes temporaires, _C1_, _C2_, etc. Quant à lui parler d'autres variables, je suis encore un peu dans le flou : est-ce qu'on doit lui parler de ACTUAL, par exemple, ou de ACTUAL.SUM (les variables numériques, en l'absence de DEFINE, font l'objet de sommes par défaut) ? L'habitude dans COMPUTE est de parler de ACTUAL.SUM ; mais dans mes essais, c'est un échec. Et pourquoi le _NUMERIC_ ne fonctionne-t-il pas ? Ah, la proc Report, quel mystère !
    Restons à Print et Tabulate, captain.
    Bon week-end.
    Bon courage.
    Olivier

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

Discussions similaires

  1. Dislpay et somme dans une proc report
    Par enicnath dans le forum ODS et reporting
    Réponses: 2
    Dernier message: 15/12/2011, 15h53
  2. libellé du total de lignes dans une proc report
    Par enicnath dans le forum ODS et reporting
    Réponses: 2
    Dernier message: 23/07/2010, 08h37
  3. Saut de ligne dans une proc report et ODS tagset.ExcelXP
    Par l'breton du 29 dans le forum ODS et reporting
    Réponses: 2
    Dernier message: 22/07/2009, 19h42
  4. Saut de ligne dans une proc report (ou print)
    Par nunien22 dans le forum ODS et reporting
    Réponses: 7
    Dernier message: 10/03/2009, 10h11
  5. Afficher les espaces dans une PROC REPORT
    Par Fatah93 dans le forum ODS et reporting
    Réponses: 6
    Dernier message: 07/05/2008, 21h30

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