FAQ SASConsultez toutes les FAQ

Nombre d'auteurs : 13, nombre de questions : 308, dernière mise à jour : 5 avril 2016  Ajouter une question

 

Cette F.A.Q., qui traite de tout type de questions portant sur l'outil SAS, a été réalisée à partir des contributions des membres des forums sas de developpez.com en vue de répondre à des questions fréquemment posées par les utilisateurs et grâce à SAS France qui a bien voulu nous donner accès à ses sources.

Si vous désirez contribuer à l'amélioration de cette F.A.Q., vous pouvez participer au billet de participation à l'enrichissement de la faq SAS , ou contacter le responsable SAS , ou contacter un des responsables de l'équipe Business Intelligence .

Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous vous souhaitons une bonne lecture.

L'équipe SAS de developpez.com remercie les contributeurs actuels : ash_rmy , bahraoui , datametric , fafabzh6 , Fleur-Anne.Blain , green_fr , oncle_pete , raf64flo , rastoix , s_a_m et steelspirit .

L'équipe SAS de developpez.com remercie aussi claudeLeloup et jacques_jean pour leurs relectures attentives de la F.A.Q. dans le but de chasser les fautes d'orthographes.


SommaireSAS AF et fomulairesSAS AF (32)
précédent sommaire suivant
 

Pour cela,

  • lancer une session, puis dans Options => Préférences, sélectionner OFF pour les items commands et Tools ;
  • dans les propriétés de l'icône SAS rajouter (après l'invocation de l'autoexec.sas) la syntaxe suivante :

Code sas : Sélectionner tout
-SASCONTROL NOMINMAX NOSYSTEMMENU -ASWCONTROL NOTITLE -NOAWSMENU ;
  • Fermer SAS. Relancer SAS. Il n'existe plus aucun moyen de fermer/réduire quoi que ce soit.

Nota : avant de mettre en place ce genre de blocage, il convient de s'assurer que l'appli d'ouverture possède bien un bouton de fermeture de SAS.

Mis à jour le 10 octobre 2008 Oncle_Pete

La procédure DISPLAY avec l'option BATCH permet d'exécuter une application en batch.

Syntaxe :

Code sas : Sélectionner tout
1
2
PROC DISPLAY CATALOG= libref.catalog.entry.type BATCH;  
RUN;

Mis à jour le 26 avril 2012 sas

Le code SCL suivant vous permet d'insérer une image en fond de frame.

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
INIT : 
instwid = makelist() ; 
instreg = makenlist('LRX','LRY','ULX','ULY') ; 
  
rc = setnitemn(instreg,100,'LRX') ; 
rc = setnitemn(instreg,100,'LRY') ; 
rc = setnitemn(instreg,0,'ULX') ; 
rc = setnitemn(instreg,0,'ULY') ; 
rc = setniteml(instwid,instreg,'_region_') ; 
  
image = loadclass('sashelp.fsp.image.class'); 
  
call send (image, '_NEW_', objid,instwid); 
  
call send (objid, '_READ_FILEPATH_', 'C:\sas612\setup.bmp'); 
Return ;

Mis à jour le 26 avril 2012 sas

En utilisant la méthode _SET_VIEWER_ATTRIBUTE_ au niveau de l'entrée SCL de l'objet Data Table (Modèle), vous pourrez mettre toutes les cellules d'une ligne en couleur.

Le code SCL suivant, associé à l'objet Data Table, permet de mettre toutes les lignes où sexe='M' en jaune.

Code sas : Sélectionner tout
1
2
3
4
5
6
INIT: 
    if sexe="M" then 
      call send(_viewer_,'_SET_VIEWER_ATTRIBUTE_','_ALL_', 'BCOLOR','YELLOW'); 
    else 
      call send(_viewer_,'_SET_VIEWER_ATTRIBUTE_','_ALL_', 'BCOLOR', 'BACKGROUND'); 
Return;

Mis à jour le 26 avril 2012 sas

Avec une instruction SUBMIT CONTINUE, le code de la section n'est pas chargé en mémoire. Il est exécuté immédiatement.

Quand une instruction SUBMIT est rencontrée, le code placé entre SUBMIT et ENDSUBMIT est chargé dans le buffer. Il n'est pas exécuté. Pour libérer le buffer et exécuter le code, il faut utliser une autre section SUBMIT - ENDSUBMIT avec le paramètre CONTINUE ou attendre l'exécution de la section TERM.

Mis à jour le 26 avril 2012 sas

La routine CALL WAIT(seconds) permet de synchroniser votre code SCL. Elle suspend l'exécution des prochaines instructions du programme.

Mis à jour le 26 avril 2012 sas

Pour des raisons de maintenance et de clarté, il est intéressant dans son code SCL de distinguer les blocs étiquettes (INIT, MAIN, TERM et autres), les blocs SUBMIT ,les blocs de commentaires ou autres textes par des couleurs différentes.

Suivant que vous ayez saisi le texte ou non, il existe deux moyens de colorier son texte :

a) Si le texte est déjà saisi :

Sélectionner le texte puis dans la boîte de commande saisir : color mtext votre_couleur.

Le nom de la couleur doit être en anglais bien sûr!

b) Avant de saisir le texte :

Touche Echap + initial de la couleur désirée

R : rouge

G : vert

Y : jaune

B : bleu

K : noir

C : cyan

etc.

Maintenant, c'est à vous de définir votre norme de programmation.

Mis à jour le 26 avril 2012 sas

Pour qu'une observation puisse être représentée sur plusieurs lignes dans l'objet DATATABLE, il est nécessaire d'inclure dans votre code SCL les routines CALL SEND suivantes :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
· /* Récupération de l'identifiant du DATATABLE */ 
call send(_SELF_,'_get_widget_','datatab',tableid); 
  
· /* Chargement du DATATABLE à partir de la table NOM.TABLE */ 
call send(tableid,'_set_dataset_','nom.table','browse'); 
  
· /* autorise l'affichage des observations sur plusieurs lignes */ 
call send( tableid, '_SET_TEXT_WRAP_','Y', 'Y' ); 
  
· /* positionne le nombres de caractères en lignes */ 
call send( tableid, '_SET_COLUMN_ATTRIBUTE_', 'STATE1','DISPLAY_WIDTH',40); 
call send( tableid, '_REFRESH_');
Pour garder des performances acceptables, les dimensions des cellules sont calculées en fonction de la partie visible de la première ligne du DATATABLE. Cela peut entraîner des troncatures si la première ligne ne contient pas la variable la plus longue.

Mis à jour le 26 avril 2012 sas

La fonction ATTRN(id_table, param) retourne le nombre d'observations dans la table quand param vaut 'NOBS' ou NLOBS'.

Une table contient un nombre d'observations physiques (NOBS) qui se décomposent en nombre d'observations utiles (NLOBS) et en nombre d'observations marquées pour suppression (NDEL).

NOBS = NLOBS + NDEL .

Cf. : SAS® SCREEN CONTROL LANGUAGE (55147) page 238-239 et l'AIDE EN LIGNE de la fonction ATTRN.

Mis à jour le 26 avril 2012 sas

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
length dsname $17 msg $200; 
init: 
classid=loadclass('sashelp.sql.qwwhere.class'); 
id = instance(classid); 
sqllist = makelist(); 
wherelst = makelist(); 
dsname = 'sasuser.crime'; 
call send(id,'where_bld', 
sqllist, 
dsname, 
wherelst, 
'TITRE', 
'','','','',msg ) ; 
return ;
Ce code appelle la fenêtre WHERE de SQL QUERY WINDOW et vous permet de construire une clause WHERE.

Le résultat est retourné dans la liste wherelst.

D'autres méthodes sont utilisables aussi facilement.

Pour plus d'informations, vous pouvez consulter SAS® Guide to the SQL Query Window - Usage et Reference (55342).

Mis à jour le 26 avril 2012 sas

Oui, en utilisant la commande AFA ou AFAPPLICATION.

Mis à jour le 26 avril 2012 sas

Deux commandes L4G sont possibles pour lancer une application AF :

Code sas : Sélectionner tout
Proc display c= libref.catalog.appli.type ; run;
Code sas : Sélectionner tout
DM 'AF=libref.catalog.appli.type AF';
Une autre possibilité est d'insérer dans le fichier CONFIG.SAS l'option INITCMD dont la syntaxe générale est :

Code sas : Sélectionner tout
-INITCMD 'af c=libref.catalog.appli.type ; '

Mis à jour le 26 avril 2012 sas

La méthode _REPOPULATE_ permet de rafraîchir une list box.

Mis à jour le 26 avril 2012 sas

4 solutions sont possibles :

1 - Utilisation de la fonction ATTRN

Cf. : SAS® SCREEN CONTROL LANGUAGE, REFERENCE, Second Edition, page 238.

Remarque : Une clause WHERE sur une table ne sera pas prise en compte dans le calcul du nombre d'observations. Pour connaître le nombre d'observations d'une table où une clause WHERE est appliquée, il faut utiliser la fonction VARSTAT et la statistique N (cf. page 592).

2 - Utilisation de la procédure SQL et d'une macro variable

Code sas : Sélectionner tout
1
2
3
4
SUBMIT CONTINUE SQL ; 
reset noprint ; 
select count(*) into :NOBS from libref.table ; 
ENDSUBMIT ;
La macro variable NOBS contiendra le nombre d'observations

3 - Utilisation de la fonction FETCH

Cf. : SAS®SCREEN CONTROL LANGUAGE, REFERENCE, Second Edition, page 331.

Exemple :

Code sas : Sélectionner tout
1
2
3
4
5
6
dsid=open('libref.table') ; 
nobs=0 ; 
do while(fetch(dsid) ne -1) ; 
nobs=nobs+1 ; 
end ; 
if dsid then dsid=close(dsid) ;
4 - Utilisation d'une liste SCL.

Code sas : Sélectionner tout
1
2
3
4
listid=makelist() ; 
nobs=0 ; 
rc = lvarlevel(dsid,'varname',nobs,listid) ; 
rc = dellist(listid) ;

Mis à jour le 26 avril 2012 sas

Il s'agit d'utiliser la procédure BUILD avec l'instruction MERGE et l'option NOSOURCE.

Syntaxe :

Code sas : Sélectionner tout
1
2
3
proc BUILD c=sortie ; 
      merge c = entree nosource; 
run;

Mis à jour le 26 avril 2012 sas

Il suffit de rajouter l'option -$hidecursor dans votre config.sas.

Mis à jour le 26 avril 2012 sas

Dans votre config.sas, l'option -$rtfcolor permettra de préserver la couleur du texte quand on copie du texte SAS provenant d'une fenêtre SAS Log ou d'une entrée SCL.

Mis à jour le 26 avril 2012 sas

Le mode TESTAF ne prend pas en compte les blocs SUBMIT.

Pour les prendre en compte il faut tester la frame en utilisant la commande suivante :

Code sas : Sélectionner tout
AF C=lib.cat.nom_frame.frame

Mis à jour le 26 avril 2012 sas

L'exemple ci-dessous permet d'insérer un numéro de page, en bas à droite, dans un document Word existant (c:\testdoc.doc) via OLE :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 hostcl=loadclass('sashelp.fsp.hauto'); 
    call send(hostcl,'_new',wordobj,0,'word.application'); 
    call send(wordobj,'_setproperty','visible','true'); 
    call send(wordobj,'_getproperty','documents',wbsobj); 
    call send(wbsobj,'_do','open','c:\testdoc.doc'); 
    call send(wordobj,'_getproperty','activedocument',wbsobj); 
  
    call send(wbsobj,'_getproperty','Sections',section); 
    call send(section,'_compute','Item', 1 ,section1); 
    call send(section1,'_getproperty','Footers',footer); 
    call send(footer,'_compute','Item', 1 ,footer1); 
    call send(footer1,'_getproperty','PageNumbers',wdpage); 
    call send(wdpage,'_compute','add','2','true',test); 
  
    call send(wbsobj,'_do','saveas','c:\testdoc.doc',0); 
    call send(wbsobj,'_do','close'); 
    call send(wordobj,'_do','quit');

Mis à jour le 26 avril 2012 sas

Les méthodes à utiliser pour récupérer la valeur d'une cellule sélectionnée sont les suivantes :

sur le Table Viewer Control:

_getActiveCell(rowlist,collist)

= retourne les coordonnées de la cellule active (dans 2 listes, ici, rowlist et collist)

sur le SAS Data Set Model :

_getColumnText(columnName,text) si il s'agit de texte

OU

_getColumnValue(columnName,value) si il s'agit d'une valeur numérique

Pour effectuer le test (variable caractère ou variable numérique), vous devez au préalable récupérer le type de la colonne.

Pour ce faire, les méthodes _getDisplayedColumnName et _getColumnNumber sont à votre disposition.

Ci-dessous un exemple de code en utilisant un Pushbutton :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
pushbutton: 
   tableviewer._getActiveCell(rowList,columnList); 
   if listlen(columnList) gt 0 then  do; 
      columnNumber=getitemn(columnList,1); 
      sasdataset._getDisplayedColumnName(columnNumber,columnName); 
      sasdataset._getColumnNumber(columnName,columnNumber); 
      columnType=sasdataset.columns{columnNumber}.type; 
      if columnType='C' then do; 
         sasdataset._getColumnText(columnName,text); 
         put text=; 
      end; 
      else if columnType='N' then do; 
         sasdataset._getColumnValue(columnName,value); 
         put value=; 
      end; 
   end; 
 return;

Mis à jour le 27 avril 2012 sas

Pour spécifier une justification des données via programmation SCL vous pouvez utiliser l'attribut " Columns " associé à la propriété " Justification ".

Ci-dessous un exemple de code scl qui justifie à droite l'ensemble des colonnes d'une table :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
init: 
  
sds.table="work.b"; 
do i=1 to dim(sds.columns); 
sds.columns{i}.justification='right'; 
end; 
  
return;
Pour de plus amples informations sur l'utilisation de l'attribut " Columns ", nous vous invitons à consulter l'aide en ligne du Système SAS.

Vous pouvez effectuer une recherche sur "SAS Data Set Model: columns" pour le fonctionnement de l'attribut " Columns "; et une recherche sur "Column Properties Class Attributes" pour obtenir la liste des propriétés modifiables via cet attribut " Columns ".

Mis à jour le 27 avril 2012 sas

Pour ouvrir une page html ou un fichier html, vous pouvez utiliser la commande WBROWSE.

Le code suivant, appliqué à un Push Button, ouvrira la page www.sas.com :

Code sas : Sélectionner tout
1
2
3
 pushbutton1 : 
    call execcmdi ('WBROWSE"http://www.sas.com"'); 
    return;
Le code suivant, appliqué à un Push Button, ouvrira le fichier open.html :

Code sas : Sélectionner tout
1
2
3
 pushbutton1 : 
    call execcmdi ('WBROWSE"C:\tests\ods\open.html"') ; 
    return;

Mis à jour le 26 avril 2012 sas

Dans la fenêtre 'Properties', se positionner sur l'objet voulu, puis aller sur 'Event Handler' et faire un click droit > New Event Handler.

L'exemple suivant est un 'Event Handler' créé sur un 'Graph Output Control' et est déclenché à partir de n'importe quel objet (Event Generator=Any Object(*)).

La frame comporte donc une listbox comprenant des noms de graphiques et un 'Graph Output Control' affichant le graphique sélectionné.

Dans ce cas présent, l' 'Event Handler' va permettre de contrôler à tout moment (Event Generator=Any Object) que le graphique affiché correspond bien à l'item sélectionné dans la listbox.

Pour se faire le nouvel 'Event Handler' est appliqué sur l'évènement 'SelectedItem Changed' et utilise une nouvelle méthode 'OnSelectedItemChanged'.

Voici le code utilisé pour la méthode :

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import sashelp.classes.attributeChangedEvent.class ; 
  
useclass lib.cat.nom_classe.class ; /* nom de la classe objet à utiliser*/ 
  
onSelectedItemChanged: method obj:attributeChangedEvent; 
dcl char(83) item, num rc index; 
item=obj.value.characterValue; 
if item ne '' then do; 
rc=cexist(item); 
if rc=0 then do; 
index=obj.objectID.selectedIndex; 
item=nameitem(obj.objectID.items, index); 
rc=cexist(item); 
end; 
if rc=0 then put 'Invalid GRSEG name'; 
else graph=item; 
end; 
endmethod; 
enduseclass;
Remarque : cet exemple, et donc ce code, proviennent du support du cours NFRA (cours Frame v8).

Mis à jour le 26 avril 2012 sas

La méthode _setViewerAttribute peut être utilisée afin de colorer une ligne mais uniquement selon une condition. Cette méthode doit être placée dans le code SCL du modèle du Table Viewer Control (click droit sur l'objet, " à Table " ; " Edit SCL "). L'exemple suivant montre comment colorer en orange les observations de la table SASHELP.CLASS pour lesquelles la variable AGE est supérieure à 13.

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
length colname $ 8; 
dfinit: 
  dcl list columns={}; 
  call send(_self_,'_get_displayed_columns_',columns); 
  numcols=listlen(columns); 
return; 
  
init: 
age: 
  if age gt 13 then 
  do i=1 to numcols; 
    colname=getitemc(columns,i); 
    _self_._setViewerAttribute(colname,'bcolor','orange'); 
  end; 
return; 
  
dfterm: 
  if columns then columns=dellist(columns); 
return;

Mis à jour le 26 avril 2012 sas

L'utilisation de la commande NEXT permet de se positionner sur une frame déjà active.

Cette commande s'utilise conjointement avec la valeur donnée à l'attribut Title de la frame concernée.

Ainsi, pour une frame dont le titre est " test ", la frame " test " est rendue active de la manière suivante :

Code sas : Sélectionner tout
Call ExecCMD("NEXT test") ;

Mis à jour le 27 avril 2012 sas

Vous pouvez utiliser la fonction PREVIEW (cf SAS Screen Control Language, Version 6 Second Edition, p495).

Exemple de programme SCL :

Code sas : Sélectionner tout
1
2
3
4
rc = FILENAME ('fichier', "c:\temp\prog.txt"); 
rc = PREVIEW ('clear'); 
rc = PREVIEW ('include', 'fichier'); 
rc = PREVIEW ('print');

Mis à jour le 26 avril 2012 sas

Cette option fonctionne toujours, mais doit être OBLIGATOIREMENT placée après l'instruction -dmsexp dans votre fichier de configuration.

Mis à jour le 26 avril 2012 sas

L'attribut Columns du SasDataSet Model permet de changer la taille, le format, la couleur etc. des différentes colonnes.

Exemple permettant de changer la couleur de fond pour toutes les colonnes :

Code sas : Sélectionner tout
1
2
3
do i=1 to dim(sasdataset1.columns); 
sasdataset1.columns{i}.dataBackgroundColor='cyan'; 
end;
L'attribut Columns accepte uniquement le numéro de la colonne, il est possible de récupérer son numéro via la méthode _getColumnNumber qui prend le nom de la colonne comme argument.

Mis à jour le 26 avril 2012 sas

Si du code SCL est exécuté après un bloc submit, le SCL prend automatiquement la main.

Pour pouvoir rester sur la fenêtre lancée par le bloc submit, il faut rajouter la fonction SCL Call ExecCMD juste après le bloc submit.

Pour l'exemple ci-dessous, sans le Call ExecCMD, la frame Test est appelée et prend la main (la fenêtre Output est donc en arrière plan).

Code sas : Sélectionner tout
1
2
3
4
5
6
7
8
9
INIT: 
Submit; 
proc print data=sashelp.air; 
run; 
EndSubmit; 
  
Call ExecCMD('output'); 
Call display ('sasuser.af.test.frame'); 
Return;

Mis à jour le 26 avril 2012 sas

En version 8, il est possible d'en créer en utilisant la fonction SCL MESSAGEBOX (cf aide en ligne) dont voici la syntaxe :

Code sas : Sélectionner tout
text=MESSAGEBOX(textlist-id<, icon<, buttons<, caption<, default<, right>>>>>);
-textlist-id : nom de la liste qui contient le texte à afficher.

-icon :

'I' : Information or note icon (default)

'?' : Query icon

'!' : Warning icon

'S' : Error icon

-buttons :

'O' : OK (default)

'OC' : OK Cancel

'YN' : Yes No

'YNC' : Yes No Cancel

'ARI' : Abort Retry Ignore

'RC' : Retry Cancel

-caption : title of the messagebox

-right :

'N' : Left justify (default)

'Y' : Right justify

Exemple :

Code sas : Sélectionner tout
1
2
3
4
5
dcl list messagelist={'Voulez vous quitter l'application ?'},char(1) box; 
box=MessageBox(messagelist,'?','YN','N'); 
rc=dellist(messagelist); 
if box='Y' then call ExecCMD('end'); 
else ...

Mis à jour le 26 avril 2012 sas

Au niveau des attributs du Push Button Control, vous devez modifier deux attributs concernant l'apparence :

- Icon : choix de l'icône

- ButtonStyle : choix de la valeur Icon Only ou Icon with Text (attention, la valeur par défaut est Text Only ce qui peut expliquer la non visualisation de l'icône)

Mis à jour le 26 avril 2012 sas

Vous devez rajouter l'option $TABNOPBMENU à l'exécution de SAS et la tabulation respectera l'ordre de définition des objets dans la frame.

Mis à jour le 26 avril 2012 sas

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2020 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.