1. Création site Internet
  2. > Articles Techniques
  3. > Data Mining, Décisionnel
  4. > SAS : Détection de connexion serveur
SAS : Détection de connexion serveur

SAS : Détection de connexion serveur

lundi 4 janvier 2010, par Guillaume Orsal

Pour des raisons professionnelles, j’utilise régulièrement l’outil de statistiques SAS, en mode client-serveur. Mais trop souvent la connexion au serveur, automatisée à l’ouverture de l’application ne fonctionne pas. Je souhaitais donc avoir un moyen de déterminer automatiquement si la connexion était établie, pour sécuriser la suite des traitements.

Je m’en suis ouvert au spécialiste SAS de la société qui m’a dit que ce n’était pas possible de détecter la connexion, même avec le langage macro. Je ne me suis pas laissé abattre, et j’ai cherché une solution. Après quelques recherches dans l’aide mal conçue de l’application, j’ai enfin trouvé.

J’ai eu l’idée toute simple que tester la connexion au serveur, revenait à vérifier l’existence de tables des librairies distantes (une base de donnée SAS). Il n’y avait qu’à trouver la macro fonction %exists.

En toute fin de mon autoexec.sas (le programme exécuté à l’ouverture d’une session SAS), donc après que les associations aux librairies aient été effectuées, j’ai ajouté le bout de code suivant.

Test global

%macro Test_Connexion_Serveur();

 /* Déclaration de la variable résultat comme globale */
 /* pour faciliter sa réutilisation ultérieure */
 %global Connexion_Serveur ;

 /* Initialisation de la variable résultat */
 %let Connexion_Serveur = OK ;

 /* Test de la non existence d'une table de ma 1ère librairie */
 %if not( %sysfunc( exist( Librairie1.MaTable ) ) )
 %then %let Connexion_Serveur = KO ;

 /* Test de la non existence d'une table de ma 2ème librairie */
 %if not( %sysfunc(  exist( Librairie2.UneAutreTable ) ) )
 %then %let Connexion_Serveur = KO ;

 /* Affichage du résultat du test */
 %put Connexion au serveur SAS : &Connexion_Serveur ;

%mend Test_Connexion_Serveur;

/* Appel de ma fonction */
%Test_Connexion_Serveur;

J’ai affecté le résultat à une variable globale afin de pouvoir l’utiliser dans un script si nécessaire.

Dans mon cas, seul m’intéressait d’afficher le résultat global dans la fenêtre journal. Mais on pourrait sans problème ajouter une fonction pour avoir un résultat plus détaillé, qui indiquerait quelles sont les librairies en erreur. Ce qui donnerait quelque chose comme suit.

Test détaillé

%macro Test_Connexion_Serveur();

 %global Connexion_Serveur ;
 %let Connexion_Serveur = OK ;

 /* Test de la non existence d'une table de ma première librairie */
 %if not( %sysfunc( exist( Librairie1.MaTable ) ) ) %then %do ;

   /* Si non trouvée, alors modification de la variable résultat */
   %let Connexion_Serveur = KO ;
   
   /* Affichage de la librairie en anomalie */
   %put Pb accès librairie : Librairie 1;

 %end ;

 /* Test de la non existence d'une table de ma seconde librairie */
 %if not( %sysfunc(  exist( Librairie2.UneAutreTable ) ) ) %then %do ;
   %let Connexion_Serveur = KO ;
   %put Pb accès librairie : Librairie 2;
 %end ;

 %put Connexion au serveur SAS : &Connexion_Serveur ;

%mend Test_Connexion_Serveur;

%Test_Connexion_Serveur;

Enfin, on pourrait imaginer que ce soit le script SAS qui va s’exécuter ensuite qui fasse tout seul appel à la fonction, pour ne tester que les librairies dont il a besoin. Dans mon cas, j’utilise trop souvent les mêmes librairies pour que cela présente un intérêt, mais cela pourrait servir à quelqu’un. Cela donnerait quelque chose comme cela.

Test à la demande

/* Déclaration de la variable résultat comme */
/* globale pour faciliter sa réutilisation ultérieure */
%global Connexion_Serveur ;

/* Initialisation de la variable résultat */
%let Connexion_Serveur = OK ;

%macro Test_Connexion_Serveur( LibrairireATester );
 /* En fonction de la librairie à tester */
 %if ( &LibrairieATester=Librairie1 ) %then %do ;
   %if not( %sysfunc( exist( Librairie1.MaTable ) ) ) %then %do ;
     %let Connexion_Serveur = KO ;
     %put Pb accès librairie : &LibrairieATester;
   %end ; %else %do ;
     %put Connexion à la librairie &LibrairieATester : OK;
   %end ;
 %end ;

 %if ( &LibrairieATester=Librairie2 ) %then %do ;
   %if not( %sysfunc( exist( Librairie2.MaTable ) ) ) %then %do ;
     %let Connexion_Serveur = KO ;
     %put Pb accès librairie : &LibrairieATester;
   %end ; %else %do ;
     %put Connexion à la librairie &LibrairieATester : OK;
   %end ;
 %end ;

 /* Si aucun paramètre on affiche un peu d'aide */
 %if ( %length(&LibrairieATester) = 0 ) %then %do;
   %put Liste des paramètres : Librairie1, Librairie2 ;
 %end;

%mend Test_Connexion_Serveur;

/* Appel de ma fonction */
%Test_Connexion_Serveur() ;
%Test_Connexion_Serveur( Librairie1 ) ;
%Test_Connexion_Serveur( Librairie2 ) ;
%Put Connexion au serveur : &Connexion_Serveur;

Le dernier exemple est parfaitement simplifiable, car la structure de test se répète autant de fois qu’on a de librairies. Vous ferez également attention dans le chemin des librairies à utiliser. En effet, ces macros doivent s’exécuter en local puisque c’est pour tester la connexion serveur et donc on n’est pas sur d’être connecté. Par contre, il faut utiliser le chemin d’accès local aux librairies distantes, sinon la macro ne trouvera jamais rien. Dans l’exemple ci-dessous, cela correspond au Lib1_dst, le nom de la librairie défini en local.

RSubmit ;
 LibName Lib1 "/Monchemin/SurMaLibrairie";
EndRSbumit ;
LibName Lib1_Dst SLibRef=Lib1 Server=MonServeur;

Evidemment tout ceci ne fonctionne qu’avec des tables dont on est sûr de l’existence.

Voilà. Je vous explique bientôt, comme j’ai ensuite réussi à automatiser l’exécution des scripts, tout en sécurisant mon traitement, puisque je peux désormais m’assurer que les accès fonctionnent, ce qui limite fortement le risque d’anomalie en sortie.

Voir en ligne : Support SAS sur le module de connexion Client / Serveur

Spip | Plan du site | Mentions légales | RSS 2.0 |
© 2001-2024 Guillaume Orsal EI