|
|
 |
 |
 |
Développement
d'applications SAS/AF®
QUESTIONS
- Comment peut-on exécuter une application AF en batch ? Réponse
- Comment se distribue une application AF sans copier les programmes sources
SCL ? Réponse
- Comment se détermine le nombre d'observations dans une table SAS ? Réponse
- Comment se rafraîchit une list box ? Réponse
- Comment s'exécute une application AF ? Réponse
- Peut-on exécuter plusieurs applications AF simultanément ? Réponse
- Comment la procédure de construction de la clause WHERE de SQL QUERY
WINDOW s'utilise-t-elle dans une application AF ? Réponse
- Quelle différence existe-t-il entre NOBS et NLOBS avec la fonction
ATTRN ? Réponse
- Comment obtient-on une observation sur n lignes dans un objet DATATABLE
? Réponse
- Comment associer des couleurs à votre code SCL ? Réponse
- Que faut-il faire pour éviter que, dans certains cas, l'exécution d'une
ligne SCL ne soit pas terminée avant la suivante ? Réponse
- Quelle est la différence entre un bloc SUBMIT et un bloc SUBMIT CONTINUE
? Réponse
- Dans un objet Data Table, comment peut-on mettre des lignes complètes
en couleur ? Réponse
- Comment peut-on préserver les couleurs du texte lors d'un copier/coller
? Réponse
- Quelle est l'option qui permet d'éviter d'avoir le curseur qui clignote
dans tous les écrans AF ? Réponse
- Comment est-il possible de donner à son application AF un " look " Windows
? Réponse
- Comment peut-on insérer une image de fond dans une frame ? Réponse
- Comment peut-on faire respecter l'ordre de la tabulation pour aller
d'un objet à un autre dans un écran AF ? Réponse
- Comment insérer un numéro de page dans un document Word
via OLE ? Réponse
- Comment se fait-il que les blocs SUBMIT (ou SUBMIT CONTINUE) ne soient
pas exécutés lorsque l’on passe en TESTAF ? Réponse
- Comment personnaliser l’affichage des colonnes dans un Table Viewer
Control ? Réponse
- Comment mettre certaines lignes en couleur dans un Table Viewer Control
? Réponse
- Comment basculer sur une autre frame déjà ouverte sans
l’exécuter une nouvelle fois ? Réponse
- Comment récupérer le contenu d’une cellule sélectionnée
dans un objet Table Viewer Control associé à un SAS Data
Set Model ? Réponse
- Via SCL, comment justifier les données dans un
objet Table Viewer Control associé à un SAS Data Set Model
? Réponse
QUESTIONS AF V8
- En version 8, pourquoi ne garde-t-on pas la main lorsque l'on fait
appel à une fenêtre (Output,Graph...) dans un bloc submit ? Réponse
- Est-il possible de créer des boites de dialogues avec des messages d'erreurs
? Réponse
- En version 8, comment peut-on afficher une icône sur un Push Button
Control ? Réponse
- Comment imprimer directement un document via le SCL sans passer par
la fenêtre d'impression ? Réponse
- L'option -INITCMD du fichier de configuration ne fonctionne plus pour
le lancement d'une application AF en V8. Comment faire ? Réponse
- Comment peut-on ouvrir une page html ou un fichier html depuis une application
SAS/AF ? Réponse
- Comment créer un nouvel 'Event Handler' sur un objet donné
? Réponse
SOLUTIONS
Comment peut-on exécuter une application AF en
batch ?
La procédure DISPLAY avec l'option BATCH permet d'exécuter une application
en batch.
Syntaxe : PROC DISPLAY CATALOG= libref.catalog.entry.type BATCH;
RUN;
Cf. : SAS® Technical Report P-222, page 199 - SAS® Technical Report P-242,
page 50.

Comment se distribue une application AF sans
copier les programmes sources SCL?
Il s'agit d'utiliser la procédure BUILD avec l'instruction MERGE et l'option
NOSOURCE.
Syntaxe :
proc BUILD c=sortie ;
merge c = entree nosource;
run;
Cf. SAS/AF® software (56011) page 176

Comment se détermine le nombre d'observations dans
une table 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
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 :
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.
listid=makelist() ;
nobs=0 ;
rc = lvarlevel(dsid,'varname',nobs,listid) ;
rc = dellist(listid) ;

Comment se rafraîchit une list box ?
La méthode _REPOPULATE_ permet de rafraîchir une list box.

Comment s'exécute une application AF ?
Deux commandes L4G sont possibles pour lancer une application AF:
· Proc display c= libref.catalog.appli.type ; run;
· 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:
· -INITCMD 'af c=libref.catalog.appli.type ; '

Peut-on exécuter plusieurs applications AF simultanément
?
Oui, en utilisant la commande AFA ou AFAPPLICATION.

Comment la procédure de construction de la clause
WHERE de SQL QUERY WINDOW s'utilise-t-elle dans une application AF
?
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 & Reference
(55342).

 |
Quelle différence existe-t-il entre NOBS et NLOBS
avec la fonction ATTRN ?
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.

 |
Comment obtient-on une observation sur n lignes
dans un objet DATATABLE ?
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 :
· /* 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.

 |
Comment associer des couleurs à votre
code SCL ?
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 :
· 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!
· 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.

 |
Que faut-il faire pour éviter que, dans certains
cas, l'exécution d'une ligne SCL ne soit pas terminée avant la suivante?
La routine CALL WAIT(seconds) permet de synchroniser votre code
SCL. Elle suspend l'exécution des prochaines instructions du programme.

Quelle est la différence entre un bloc SUBMIT et
un bloc SUBMIT CONTINUE?
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.

Dans un objet Data Table, comment peut-on mettre
des lignes complètes en couleur ?
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.
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;

Comment peut-on préserver les couleurs du texte
lors d'un copier/coller ?
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.

Quelle est l’option qui permet d'éviter d'avoir
le curseur qui clignote dans tous les écrans AF ?
Il suffit de rajouter l'option -$hidecursor dans votre config.sas.

Comment est-il possible de donner à son application
AF un " look " Windows ?
Il suffit de rajouter l'option -$guifont dans la ligne de commande lançant
votre application.

Comment peut-on insérer une image de fond dans une
frame ?
Le code SCL suivant vous permet d'insérer une image en fond de frame.
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 ;

Comment peut-on faire respecter l'ordre de la tabulation
pour aller d'un objet à un autre dans un écran AF ?
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.

Comment insérer un numéro de page
dans un document Word via OLE ?
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 :
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');

Comment se fait-il que les blocs SUBMIT (ou SUBMIT CONTINUE)
ne soient pas exécutés lorsque l’on passe en TESTAF
?
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 :
AF C=lib.cat.nom_frame.frame

Comment personnaliser l’affichage des colonnes dans un
Table Viewer Control ?
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
:
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.

En version 8, pourquoi ne garde-t-on pas la main
lorsque l'on fait appel à une fenêtre (Output,Graph...) dans un bloc
submit ?
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).
INIT:
Submit;
proc print data=sashelp.air;
run;
EndSubmit;
Call ExecCMD('output');
Call display ('sasuser.af.test.frame');
Return;

Est-il possible de créer des boites de dialogues
avec des messages d'erreurs ?
En version 8, il est possible d'en créer en utilisant la fonction SCL MESSAGEBOX
(cf aide en ligne) dont voici la syntaxe :
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 :
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 ...

En version 8, comment peut-on afficher une icône
sur un Push Button Control ?
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)

Comment imprimer directement un document via le
SCL sans passer par la fenêtre d'impression ?
Vous pouvez utiliser la fonction PREVIEW (cf SAS Screen Control Language,
Version 6 Second Edition, p495).
Exemple de programme SCL :
rc = FILENAME ('fichier', "c:\temp\prog.txt");
rc = PREVIEW ('clear');
rc = PREVIEW ('include', 'fichier');
rc = PREVIEW ('print');

L'option -INITCMD du fichier de configuration ne
fonctionne plus pour le lancement d'une application AF en V8. Comment
faire ?
Cette option fonctionne toujours, mais doit être OBLIGATOIREMENT placée
après l'instruction -dmsexp dans votre fichier de configuration.

Comment peut-on ouvrir une page html ou un fichier
html depuis une application SAS/AF ?
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 :
pushbutton1 :
call execcmdi ('WBROWSE"http://www.sas.com"');
return;
Le code suivant, appliqué à un Push Button, ouvrira le
fichier open.html :
pushbutton1 :
call execcmdi ('WBROWSE"C:\tests\ods\open.html"') ;
return;

Comment créer un nouvel 'Event Handler'
sur un objet donné ?
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 :
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).

Comment mettre certaines lignes en couleur dans un Table
Viewer Control ?
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.
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;

Comment basculer sur une autre frame déjà ouverte sans
l’exécuter une nouvelle fois ?
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 :
Call ExecCMD(“NEXT test“) ;

Comment récupérer le contenu d’une cellule sélectionnée dans un objet Table Viewer Control associé à un SAS Data Set Model ?
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 :
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;

Via SCL, comment justifier les données dans un
objet Table Viewer Control associé à un SAS Data Set Model
?
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 :
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
».
|
 |
|