<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Formation SAS - Stage SAS - BI - Data warehouse - Datamart &#187; Formation Programmeur SAS</title>
	<atom:link href="http://www.formations-sas.fr/category/formation-programmeur-sas/feed" rel="self" type="application/rss+xml" />
	<link>http://www.formations-sas.fr</link>
	<description>SAS : Formation &#38; Stage &#124; Systèmes Decisionnels</description>
	<lastBuildDate>Wed, 23 Jun 2010 09:33:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>SAS Variable Aplhanumérique contient du numérique</title>
		<link>http://www.formations-sas.fr/formation-programmeur-sas/000482/sas-variable-aplhanumerique-contient-numerique.html</link>
		<comments>http://www.formations-sas.fr/formation-programmeur-sas/000482/sas-variable-aplhanumerique-contient-numerique.html#comments</comments>
		<pubDate>Sat, 05 Jun 2010 13:42:51 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[BO programmeur SAS]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[alpahnumérique]]></category>
		<category><![CDATA[autoformation]]></category>
		<category><![CDATA[code sas]]></category>
		<category><![CDATA[numérique]]></category>
		<category><![CDATA[SAS]]></category>
		<category><![CDATA[variable]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=482</guid>
		<description><![CDATA[Comment tester si une variable alphanumérique ne contient que du numérique. Besoin fonctionnel simple mais néanmoins possible, on souhaite par exemple dans une entreprise du secteur assurance automobile éliminer toutes les lignes d’une table des assurés dont le numéro de police, variable alphanumérique, contient au moins une lettre. Cas par exemple des assurances de type [...]]]></description>
			<content:encoded><![CDATA[<h1>Comment tester si une variable alphanumérique ne contient que du numérique.</h1>
<p style="text-align: justify;">Besoin fonctionnel simple mais néanmoins possible, on souhaite par exemple dans une entreprise du secteur assurance automobile <strong>éliminer toutes les lignes d’une table</strong> des assurés dont le numéro de police, <strong>variable alphanumérique</strong>, contient au moins une lettre. Cas par exemple des assurances de type x plus.</p>
<p style="text-align: justify;">Le programme SAS ci-dessous vous fournit une des possibilités offerte par la programmation SAS dans <span id="more-482"></span>une étape DATA.</p>
<p style="text-align: justify;"><code><br />
<strong>/* Résultats dans la LOG */<br />
data _null_;<br />
 a="2";<br />
 b="k44k";<br />
 if ifn(a &gt; 0,1,0) then put "a OK !";<br />
 else                   put "a KO !";<br />
 if ifn(b &gt; 0,1,0) then put "b OK !";<br />
 else                   put "b KO !";<br />
run;<br />
</strong></code></p>
<p style="text-align: justify;"><strong>/* Contenu de la log */</strong></p>
<p style="text-align: justify;"><strong>   a OK !<br />
   b KO !<br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/formation-programmeur-sas/000482/sas-variable-aplhanumerique-contient-numerique.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Détection des doublons avec SAS</title>
		<link>http://www.formations-sas.fr/formation-programmeur-sas/000471/detection-des-doublons-avec-sas.html</link>
		<comments>http://www.formations-sas.fr/formation-programmeur-sas/000471/detection-des-doublons-avec-sas.html#comments</comments>
		<pubDate>Tue, 12 Jan 2010 11:07:37 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[BO programmeur SAS]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[Tuyaux, Conseils SAS]]></category>
		<category><![CDATA[detection]]></category>
		<category><![CDATA[doublon]]></category>
		<category><![CDATA[SAS]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=471</guid>
		<description><![CDATA[SAS &#8211; Détection des doublons. Le but ici est de vous fournir un programme simple pour vous permettre de rechercher les doublons que vous pourriez avoir dans une de vos table SAS.   Nous utilisons pour cela la proc SQL de SAS.   On commence par afficher les informations de la table avec deux petites particularités :   [...]]]></description>
			<content:encoded><![CDATA[<h1>SAS &#8211; Détection des doublons.</h1>
<p style="text-align: justify;">Le but ici est de vous fournir un programme simple pour vous permettre de <strong>rechercher les doublons</strong> que vous pourriez avoir dans une de vos table SAS.  </p>
<p>Nous utilisons pour cela la <strong>proc SQL de SAS</strong>.  </p>
<p>On commence par afficher les informations de la table avec deux petites particularités :  </p>
<p>On regroupe les observations sur un critère que vous devez déterminer, ici on à choisi : &laquo;&nbsp;<strong>Nom</strong>, <strong>prenom</strong>, <strong>ville</strong>, <strong>region</strong>, <strong>pays</strong>&nbsp;&raquo; c&#8217;est l&#8217;objet de la partie <strong>GROUP BY</strong>.  </p>
<p>Ensuite on demande à SAS de nous retourner toutes les lignes aggrégées de la table dont le nombre de tuples &laquo;&nbsp;Nom, prenom, ville, region, pays&nbsp;&raquo; est supérieur à 1. C&#8217;est la clause <strong>HAVING</strong>. <span id="more-471"></span>  </p>
<p>Le résultat renverra toutes les lignes possédant au moins <strong>un doublon</strong>, l&#8217;ensemble des variables de la table plus le &laquo;&nbsp;<strong>nombre</strong>&nbsp;&raquo; d&#8217;occurences pour chaque tuple.</p>
<p><code><br />
/* ****************************************** */<br />
/* Site : http://www.formations-sas.fr - 2010 */<br />
/*                                            */<br />
/* PGM = Détection des doublons sur Table SAS */<br />
/*                                            */<br />
/* Auteur : Pascal MAUBERT                    */<br />
/* ****************************************** */</code></p>
<p><strong>proc sql;<br />
   title &#8216;Recherche des doublons&#8217;;<br />
   select *, count(*) as nombre<br />
      from table_double_sas<br />
      group by Nom, prenom, ville, region, pays<br />
      having count(*) &gt; 1;<br />
quit;</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/formation-programmeur-sas/000471/detection-des-doublons-avec-sas.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Limiter les étapes DATA</title>
		<link>http://www.formations-sas.fr/formation-programmeur-sas/000463/limiter-les-etapes-data.html</link>
		<comments>http://www.formations-sas.fr/formation-programmeur-sas/000463/limiter-les-etapes-data.html#comments</comments>
		<pubDate>Fri, 04 Dec 2009 09:28:42 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[BO programmeur SAS]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[Optimisation SAS]]></category>
		<category><![CDATA[Tuyaux, Conseils SAS]]></category>
		<category><![CDATA[consommation]]></category>
		<category><![CDATA[CPU]]></category>
		<category><![CDATA[I/O]]></category>
		<category><![CDATA[limiter etape data]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[performances]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=463</guid>
		<description><![CDATA[Limiter les étapes DATA Dans la série optimisation et tuyaux, voici le premier d&#8217;une série de conseil pour l&#8217;optimisation de vos programme SAS. Pour des raisons de simplification et de méconnaissance du produit SAS, nous avons tous débuté en créant une multitude d&#8217;étape data inutiles. Ces étapes sont coûteuses aussi bien en terme de CPU [...]]]></description>
			<content:encoded><![CDATA[<h1>Limiter les étapes DATA</h1>
<p>Dans la série optimisation et tuyaux, voici le premier d&#8217;une série de conseil pour l&#8217;optimisation de vos programme SAS.</p>
<p>Pour des raisons de simplification et de méconnaissance du produit SAS, nous avons tous débuté en créant une multitude d&#8217;étape data inutiles. Ces étapes sont coûteuses aussi bien en terme de CPU qu&#8217;en terme d&#8217;I/O (accès disques entrée/sorties ou Input/Output).</p>
<p>Quand une table est d&#8217;une grande volumétrie, essayez de ne la lire qu&#8217;une seule fois et de créer toutes les tables dépendantes en un seul passage, vous gagnerez toutes les lectures successives de cette table SAS.</p>
<pre>/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/*                                            */
/* Tuyaux - Performances, Optimisation SAS    */
/* <strong>GAIN : CPU - IO</strong>                            */
/*                                            */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

<strong>/* ACCEPTABLE */</strong>
data tablea;
 set db.master;
 if flag1;
run;

data tableb;
 set db.master;
 if flag1 and age &lt; 21;
run;

data tablec;
 set db.master;
 if flag1 and age &gt;= 21;
run;

<strong>/* PLUS EFFICACE */</strong>
data tablea tableb tablec;
 set db.master;
 if flag1 then do;
    output tablea;
    if age &lt; 21 then output tableb;
    else             output tablec;
 end;

run;

/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/formation-programmeur-sas/000463/limiter-les-etapes-data.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SAS SPDE description et exemple de PGM SAS SPDE</title>
		<link>http://www.formations-sas.fr/datamart/000352/sas-spde-spds.html</link>
		<comments>http://www.formations-sas.fr/datamart/000352/sas-spde-spds.html#comments</comments>
		<pubDate>Tue, 01 Dec 2009 10:42:51 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[datamart]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[Formation SAS]]></category>
		<category><![CDATA[Optimisation SAS]]></category>
		<category><![CDATA[architecture SMP]]></category>
		<category><![CDATA[moteur de donnée]]></category>
		<category><![CDATA[performance requête]]></category>
		<category><![CDATA[SAS]]></category>
		<category><![CDATA[SAS Scalable Performance Data Engine]]></category>
		<category><![CDATA[SAS SPDE]]></category>
		<category><![CDATA[SAS SPDS]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=352</guid>
		<description><![CDATA[Exemple de programme SAS SPDE (SPDS) Avant Propos. Le but de cet article n&#8217;est pas de se substituer à une formation appliquée de SAS SPDE, mais de présenter ce fabuleux produit, même si les techniciens SAS avancés seront surement capable de s&#8217;en contenter pour comprendre, assimiler et utiliser SAS SPDE. Cet article ne prétends pas [...]]]></description>
			<content:encoded><![CDATA[<h1>Exemple de programme <strong>SAS SPDE</strong> (<strong>SPDS</strong>)</h1>
<h2><strong>Avant Propos.</strong></h2>
<p>Le but de cet article n&#8217;est pas de se substituer à une formation appliquée de SAS SPDE, mais de présenter ce fabuleux produit, même si les techniciens SAS avancés seront surement capable de s&#8217;en contenter pour comprendre, assimiler et utiliser SAS SPDE.</p>
<p>Cet article ne prétends pas non plus à se substituer à la documentation officielle de SAS Institute sur SAS SPDE, un lien vers celle-ci (documentation en anglais) se trouve en bas de la page.</p>
<h2><strong>Description générale de SAS SPDE</strong></h2>
<p>SAS SPDE est un moteur de gestion de données SAS, SAS SPDS est un serveur à part entière de gestion des données et au fonctionnant proche de SAS SPDE. SAS SPDE est intégré au module SAS Base comme moteur de gestion des données .</p>
<p>Aujourd&#8217;hui intégré au produit / module SAS Base, son nom à été changé en SAS SPDE.</p>
<p>Ce moteur de données SAS offre des performances exceptionnelles et trouve sa raison d&#8217;être dans le besoin de performances accrues lors de requêtes sur des tables de très gros volumes. C&#8217;est à dire des tables allant de 512 méga à plusieurs terra octets.</p>
<p>En synthèse, si on souhaite pouvoir lancer une requête contenant plusieurs critères sur une table de plusieurs terra octets et obtenir une réponse en quelques secondes, alors la solution SAS SPDE  est une solution appropriée.</p>
<p>SAS SPDE est donc l&#8217;un des procédé d&#8217;optimisation, il en existe bien d&#8217;autre,  pour l&#8217;accès à des données décisionnelles, données d&#8217;entreprise, de fortes volumétrie et nécessitant des performances accrues en terme de temps de réponse à des requêtes.</p>
<h2><strong>Description technique de SAS SPDE</strong></h2>
<p><strong>Pourquoi SAS SPDE est encore plus rapide que SAS Base, qui déjà offre des performance hors du commun ?</strong></p>
<p><span id="more-352"></span>Le principe de fonctionnement du moteur SAS SPDE tire profit des architectures SMP <span id="main" style="visibility: visible;"><span id="search" style="visibility: visible;">(Symmetric Multiprocessing). Dans cette architecture, </span></span>les processeurs partagent le bus d&#8217;accès à la mémoire vive, communiquent entre eux et peuvent travailler en parallèle.</p>
<p>Et enfin ajoutons également une batterie de disque dur rapide sur lesquels seront réparti un partitionnement des grosses table SAS.</p>
<h2><strong>Simplification et synthèse :</strong></h2>
<p>Pour effectuer une requête sur une table de 4 terra-octets, sur une machine possédant 16 processeurs et 9 disques durs :</p>
<p>SAS SPDE, avec les doigts de l&#8217;administrateur  <img src='http://www.formations-sas.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  partitionne la table (partie donnée) en 6 blocs et implémente chacun de ces blocs sur un disque dur différent, crée un descripteur nommé méta-data sur un autre disque dur, qui contiendra les informations sur la table et enfin utilisera les deux derniers disques durs afin d&#8217;y stocker les fichiers d&#8217;index.</p>
<p>Un choix de la taille du partitionnement, par exemple 128 Mo, donnera un total de 32 blocs poue cette table de 4 terra-octets, et ces blocs seront répartit sur les 6 disques durs prévue à cet effet via l&#8217;allocation faite lors du libname.</p>
<p>Ensuite lors de la requête 1 ou 2 des CPU travailleront sur les fichiers d&#8217;index, une dizaine sur les blocs de donnée, 1 sur les méta-data et le reste sur le tri automatique à la volée sur l&#8217;éventuelle classification induite par des group by.</p>
<p>SAS SPDE ne nécessite plus l&#8217;utilisation de la PROC SORT, en effet, les données sont triées automatiquement à la volée en cas de besoin.</p>
<p>Tout ce petit monde travaillera en parallèle et communiquera ensemble afin de fournir un résultat très rapide et cohérent à l&#8217;utilisateur.</p>
<h2><strong>Programme SAS d&#8217;exemple sur SAS SPDE</strong></h2>
<p>Se programme à pour vocation et vous fournir des informations synthétique sur la syntaxe générale à utiliser lors d&#8217;un travail sur des données à faire gérer par le moteur de donnée SAS SPDE.</p>
<p>Le programme ci dessous proposé, ne prétend pas vous fournir toutes les informations sur le produit SAS SPDE, mais une base sérieuse afin de vous permettre de commencer à travailler avec SAS SPDE. Attention toutefois, lors de l&#8217;utilisation de SAS SPDE, les performances ne peuvent être significative que si votre machine possède plusieurs processeurs et plusieurs disques durs. La connexion à ces derniers via fibre optique est un plus.</p>
<p>Cet exemple de programme SAS, utilise les modules SAS : SAS Base, SAS SPDE, SAS SQL et SAS MACRO.</p>
<pre><span style="font-size: medium;">/* Options d'otimisation et de conte rendu */
options fullstimer bufno=16 bufsize=16384;

/* Exemple d'utilisation du moteur SAS SPDE */
/* définition et mise en place de l'accès via LIBNAME */

libname mon_spde spde "D:\SAS Divers\SAS_SPDE/disk1/metadata"
 datapath  = ("D:\SAS Divers\SAS_SPDE/disk2/userdata"
 "D:\SAS Divers\SAS_SPDE/disk3/userdata")
 indexpath = ("D:\SAS Divers\SAS_SPDE/disk4/userindexes"
 "D:\SAS Divers\SAS_SPDE/disk5/userindexes")
 ;  /* temp=yes; Attention ! Cette option vide les libnames
 de SPDE à la fin de la session SAS. */

/* MACRO itérative pour la création d'une table SAS
 de 400 variables et d'environ 80 000 observations */
options nomprint nosymbolgen;
/* Définition, compilation et stockage temporaire */
%macro test(deb=1,fin=200);
 data mon_spde.test_spde(index=(total /unique)asyncindex=yes partsize=24);
 %do i = &amp;deb %to &amp;fin;
 %do inc = 1 %to 399;
 a&amp;inc = &amp;i * &amp;inc;
 total=sum(of a:);
 output;
 %end;
 %end;
 run;
%mend test;

/* Appel de la macro pour création de la table */
%test ;

/* Requête de création d'une table via une
 selection d'observations sur critères .. */
proc sql;
create table mon_spde.select_spde as
 select * from mon_spde.test_spde
 where total between 400000 and 5000000
 and a1 &gt;= 5 and a1 &lt;= 63;
quit;

/* MACRO Itérative exemple en SAS Base */
options nomprint nosymbolgen;
%macro test(deb=1,fin=200);
 data toto(index=(total /unique));
 %do i = &amp;deb %to &amp;fin;
 %do inc = 1 %to 399;
 a&amp;inc = &amp;i * &amp;inc;
 total=sum(of a:);
 output;
 %end;
 %end;
 run;
%mend test;

%test ;

proc sql;
create table select_toto as
 select * from toto
 where total between 400000 and 5000000
 and a1 &gt;= 5 and a1 &lt;= 63;
quit;

/* Copie  d'une table de SAS base vers SAS SPDE */
proc copy in = work out = mon_spde;
 select toto;
run;
/* Copie  d'une table de SAS base vers SAS SPDE,
 bien plus performant que la PROC COPY */
proc append base=mon_spde.toto(asyncindex=yes partsize=24)
 data=work.toto;
run;

/* Compte rendu du contenu d'une biblithèque SAS SPDE */
proc contents data=mon_spde._all_;
run;</span></pre>
<h2><strong>Note :</strong></h2>
<p>A noter que la PROC APPEND offres des performances accrues par rapport à la PROC COPY de l&#8217;ordre de facteur 10, toutefois pour la copie de beaucoup de table se trouvant sur la même bibliothèque, l&#8217;écriture de la PROC COPY est beaucoup plus simple. Mais comme toujours en SAS il existe des solutions à tout problème et ici nous pourrions, par exemple, encapsuler la proc append dans une macro et automatiser le transfert de toutes les tables contenues dans un libname x d&#8217;un moteur SAS Base vers un Moteur SAS SPDE.</p>
<h2><strong>Documentation :</strong></h2>
<p>Pour les longs discours et pour plus de détails sur SAS SPDE, voir la documentation officielle de SAS Institute, version SAS 9.2 : <a title="SAS SPDE - SAS SPDS" href="http://support.sas.com/documentation/cdl/en/engspde/61887/PDF/default/engspde.pdf" target="_blank"><strong>Scalable Data Performance Engine</strong></a></p>
<p>Copyright de l&#8217;article © P.Maubert 2009</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/datamart/000352/sas-spde-spds.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Changer une variable Caractère en Numérique SAS.</title>
		<link>http://www.formations-sas.fr/formation-programmeur-sas/000344/changer-une-variable-caractere-en-numerique-sas.html</link>
		<comments>http://www.formations-sas.fr/formation-programmeur-sas/000344/changer-une-variable-caractere-en-numerique-sas.html#comments</comments>
		<pubDate>Tue, 03 Nov 2009 19:57:23 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[BO programmeur SAS]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[Optimisation SAS]]></category>
		<category><![CDATA[Tuyaux, Conseils SAS]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=344</guid>
		<description><![CDATA[Changer une variable Caractère en Numérique SAS. Ce problème est un problème très simple, il est souvent rencontré lors des développements en SAS. Les informations nécessaires sont généralement fournies lors des formations SAS AVC1 (avancé I) et bien souvent oubliées par les stagiaires. Donc voici un rappel de la méthode &#171;&#160;propre&#160;&#187;, du changement d&#8217;une variable [...]]]></description>
			<content:encoded><![CDATA[<h1>Changer une variable Caractère en Numérique SAS.</h1>
<p>Ce problème est un problème très simple, il est souvent rencontré lors des développements en SAS. Les informations nécessaires sont généralement fournies lors des formations SAS AVC1 (avancé I) et bien souvent oubliées par les stagiaires.</p>
<p>Donc voici un rappel de la méthode &laquo;&nbsp;propre&nbsp;&raquo;, du changement d&#8217;une variable de type caractère en variable de type numérique.</p>
<p>Utilisation pour la démonstration, d&#8217;une table SAS &laquo;&nbsp;COMPANY&nbsp;&raquo; fournie en standard dans le libname &laquo;&nbsp;SASHELP&nbsp;&raquo; : <strong>sashelp.company</strong>.</p>
<p>Nous allons changer ici la variable &laquo;&nbsp;<span style="font-size: medium;">DEPTHEAD</span>&nbsp;&raquo; de type caractère et de longueur 15 en une variable de type numérique et d&#8217;une longueur de 3, sans changement du nom de la variable.</p>
<p>Par défaut une variable numérique en SAS fait 8 de longueur et cela n&#8217;est pas toujours nécessaire, aussi si vous avez beaucoup de variable numérique et un nombre d&#8217;observation important, il est de bon ton, pour des raisons d&#8217;optimisation, de dimensionner correctement les variables numériques.</p>
<p>L&#8217;instruction length permet d&#8217;effectuer cela.</p>
<p>Théoriquement impossible, nous allons voir que la solution est assez facile à mettre en œuvre.</p>
<pre><span style="font-size: medium;">/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* SAS V9                                     */
/*                                            */
/* Comment convertir une variable caractère   */
/* en numérique.                              */
/*                                            */
/* Procéder en trois étapes :                 */
/* 1 Utilisez l'option dataset RENAME         */
/* 2 Utilisez la fonction de changement de    */
/*   type                                     */
/* 3 Supprimez la variable intermédiaire      */
/*                                            */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

data test_change_type(drop=new_var);
 set sashelp.company(rename=(DEPTHEAD=new_var));
 length DEPTHEAD 3.;
 DEPTHEAD=input(new_var,$15.);
run;

/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/formation-programmeur-sas/000344/changer-une-variable-caractere-en-numerique-sas.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Changer une variable Numérique en Caractère</title>
		<link>http://www.formations-sas.fr/formation-programmeur-sas/000337/changer-une-variable-numerique-en-caractere.html</link>
		<comments>http://www.formations-sas.fr/formation-programmeur-sas/000337/changer-une-variable-numerique-en-caractere.html#comments</comments>
		<pubDate>Sat, 10 Oct 2009 17:53:42 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[BO programmeur SAS]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[Optimisation SAS]]></category>
		<category><![CDATA[Tuyaux, Conseils SAS]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=337</guid>
		<description><![CDATA[Changer une variable Numérique en Caractère en SAS. Ce problème est un problème très simple, il est souvent rencontré lors des développements en SAS. Les informations nécessaires sont généralement fournies lors des formations SAS AVC1 et bien souvent oublié par les stagiaires. Donc voici un rappel de la méthode &#171;&#160;propre&#160;&#187;, du changement d&#8217;une variable de [...]]]></description>
			<content:encoded><![CDATA[<h1>Changer une variable Numérique en Caractère en SAS.</h1>
<p>Ce problème est un problème très simple, il est souvent rencontré lors des développements en SAS. Les informations nécessaires sont généralement fournies lors des formations SAS AVC1 et bien souvent oublié par les stagiaires.</p>
<p>Donc voici un rappel de la méthode &laquo;&nbsp;propre&nbsp;&raquo;, du changement d&#8217;une variable de type numérique en variable de type caractère.</p>
<p>Utilisation pour la démonstration, d&#8217;une table SAS &laquo;&nbsp;COMPANY&nbsp;&raquo; fournie en standard dans le libname &laquo;&nbsp;SASHELP&nbsp;&raquo; : <strong>sashelp.company</strong>.</p>
<p>Nous allons changer ici la variable &laquo;&nbsp;N&nbsp;&raquo; de type numérique et de longueur 8 en une variable de type caractère et d&#8217;une longueur de 12, sans changement du nom de la variable.</p>
<p>Théoriquement impossible, nous allons voir que la solution est assez facile à mettre en œuvre.</p>
<pre><span style="font-size: medium;">
/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* SAS V9                                     */
/*                                            */
/* Comment convertir une variable numérique   */
/* en caractère ?                             */
/*                                            */
/* Procéder en trois étapes :                 */
/* 1 Utilisez l'option dataset RENAME         */
/* 2 Utilisez la fonction de changement de    */
/*   type                                     */
/* 3 Supprimez la variable intermédiaire      */
/*                                            */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

data test_change_type(drop=new_var);
 set sashelp.company(rename=(n=new_var));
 n=put(new_var,12.);
run;

/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/formation-programmeur-sas/000337/changer-une-variable-numerique-en-caractere.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SAS Optimisation Transaction Ajout et Mise à jour</title>
		<link>http://www.formations-sas.fr/formation-programmeur-sas/000366/sas-optimisation-transaction-ajout-maj.html</link>
		<comments>http://www.formations-sas.fr/formation-programmeur-sas/000366/sas-optimisation-transaction-ajout-maj.html#comments</comments>
		<pubDate>Sat, 05 Sep 2009 17:18:52 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[BO programmeur SAS]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[Optimisation SAS]]></category>
		<category><![CDATA[Tuyaux, Conseils SAS]]></category>
		<category><![CDATA[ajout maj]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[SAS]]></category>
		<category><![CDATA[sas base]]></category>
		<category><![CDATA[traitement transaction]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=366</guid>
		<description><![CDATA[SAS Optimisation Transaction Ajout et Mise à jour Avant propos Cet article à pour de présenter une démarche d&#8217;optimisation pour un traitement de type Transaction pour l&#8217;ajout ou la mise à jour de données SAS. Ce genre de problématique étant récurrent, il m&#8217;a semblé utile de vous fournir l&#8217;exemple détaillé ci-dessous. Cet exemple se base [...]]]></description>
			<content:encoded><![CDATA[<h1>SAS Optimisation Transaction Ajout et Mise à jour</h1>
<h2>Avant propos</h2>
<p>Cet article à pour de présenter une démarche d&#8217;optimisation pour un traitement de type Transaction pour l&#8217;ajout ou la mise à jour de données SAS.</p>
<p>Ce genre de problématique étant récurrent, il m&#8217;a semblé utile de vous fournir l&#8217;exemple détaillé ci-dessous.</p>
<p>Cet exemple se base sur des faits réels rencontrés lors d&#8217;une mission d&#8217;optimisation pour le compte du client &laquo;&nbsp;La Redoute&nbsp;&raquo;, lors de mon passage au service Consulting de chez SAS Institute. Le chiffres fournis sont approximatifs et n&#8217;engage en rien la responsabilité de qui que ce soit.</p>
<h2>Problème :</h2>
<p>Redoute : 25 000 000 de lignes de commandes par jour et un temps de traitement sous SAS MVS avoisinant les 22 heures.</p>
<p>Bien sur, <strong>panique </strong>et demande d&#8217;intervention pour un <strong>audit d&#8217;optimisation</strong>.</p>
<p><strong>Étude cynématique </strong>: par téléphone, par courrier et par internet réception des lignes de commande stockées dans DB2. La nuit Unload DB2 vers un fichier plat pour incorporation dans SAS. Lecture des lignes de commandes, tentative de mise à jour de la base SAS avec les lignes de commandes et en cas de rejet ajout de celles-ci dans la base SAS. Temps de traitement abominable.</p>
<h2><strong>Synthèse des Solutions</strong></h2>
<p>Deux cas se présentent :</p>
<ol>
<li>On connait sous DB2 la nature de la transaction &laquo;&nbsp;ligne de commande&nbsp;&raquo; ajout ou modification</li>
<li>On ne la connait pas</li>
</ol>
<p><strong>Dans ces deux cas une solution performante existe.</strong></p>
<p>La première la plus simple, ne sera pas détaillé dans cet article, simplement on transmet issu de DB2 dans l&#8217;unload une variable de type flag avec A pour ajout et M pour mise à jour. Sous SAS on éclate le fichier en deux tables SAS une pour les ajouts qui seront traités par la PROC APPEND et l&#8217;autre pour les mises à jour qui seront traités avec une étape DATA / MERGE.</p>
<p>Pour le deuxième cas un peu plus pointu, voici ci-dessous un exemple de programme <span id="more-366"></span>fournissant une solution optimisée pour ces traitements transactions AJOUT / MAJ.</p>
<p>Plutôt que le programme SAS, je vous fournit le compte rendu d&#8217;exécution sur une machine de base et exécuté sous Windows Vista SAS V9.</p>
<p><strong>Machine</strong> : Sans marque AMD 7750 x2, RAM 4 Go, HD SATA 500 Go, Windows Vista 64 bits SAS V 9.00.</p>
<p>Attention les temps d&#8217;exécution peuvent paraître excellent, mais la machine n&#8217;est pas partagée et les tables d&#8217;exemple sont petites et surtout elles n&#8217;ont que 6 variables, dans la vraie vie c&#8217;est plutôt de 200 à 500 variables.</p>
<p>Toutefois, La Redoute avec cette solution à ramenée son temps de traitement de 22 à moins de 3 heures.</p>
<p><strong>Tables d&#8217;exemple :</strong></p>
<ul>
<li>Base : toto1 &#8211; 5 000 000 de lignes et 6 variables</li>
<li>Transaction : toto2 &#8211; 525 000 lignes et 6 variables</li>
<li>TP &#8211; MAJ : maj &#8211; 175 001 lignes et 6 variables</li>
<li>TP &#8211; Ajout : add &#8211; 349 999 lignes et 6 variables</li>
<li>Temps d&#8217;exécution total réel (elaps) : 9.53 secondes</li>
</ul>
<p><strong>Extrait de la Log :</strong></p>
<pre><span style="font-size: small;">379  /* ****************************************** */
380  /* Site : http://www.formations-sas.fr - 2009 */
381  /* SAS V9 : Optimisation                      */
382  /*                                            */
383  /* Comment optimiser un traitement de         */
384  /* transaction en SAS.                        */
385  /*                                            */
386  /* Auteur : Pascal MAUBERT                    */
387  /* ****************************************** */
388
389  options compress=no bufno=8 bufsize=9220 fullstimer msglevel=i;
390
391  /* Création de la table de base exemple */
392  data toto1(index=(i /unique));
393   do i = 1 to 5000000;
394      j=i*2;
395      y=j*3.14;
396      orig='A';
397      k=i*j;
398      total=sum(of i j y k);
399      output;
400   end;
401  run;

Note: La table WORK.TOTO1 a 5000000 observations et 6 variables.
Note: Index simple i défini.
Note: L'étape DATA used (Total process time):
 temps réel                   3.96 secondes
 temps processeur utilisateur 2.48 secondes
 temps processeur système     0.99 secondes
 Mémoire                            68348k

402
403  /* Création de la table de Transaction exemple */
404  data toto2(index=(i /unique));
405   do i = 1500000 to 12000000 - 1 by 20;
406      aj=i*2/2;
407      ay=aj*3.14/3.14;
408      aorig='B';
409      ak=i*aj/aj;
410      total=sum(of i aj ay ak);
411      output;
412   end;
413  run;

Note: La table WORK.TOTO2 a 525000 observations et 6 variables.
Note: Index simple i défini.
Note: L'étape DATA used (Total process time):
 temps réel                   0.32 secondes
 temps processeur utilisateur 0.23 secondes
 temps processeur système     0.09 secondes
 Mémoire                            12940k

414
415  /*  Début du traitement hebdomadaire, chez vous sur les unload DB2 */
416  /*  Création des tables MAJ et ADD */
417  data maj
418       add(rename=(aj=j aorig=orig ay=y ak=k));
419   merge toto1(in=a keep=i)
420         toto2(in=b);
421   by i;
422   if b and a     then output maj;
423   if b and not a then output add;
424   else delete;
425  run;

INFO : Index i sélectionné pour traitement de la clause BY.
INFO : Index i sélectionné pour traitement de la clause BY.
Note:  5000000 observations copiées de la table WORK.TOTO1.
Note:  525000 observations copiées de la table WORK.TOTO2.
Note: La table WORK.MAJ a 175001 observations et 6 variables.
Note: La table WORK.ADD a 349999 observations et 6 variables.
Note: L'étape DATA used (Total process time):
 temps réel                   3.89 secondes
 temps processeur utilisateur 3.58 secondes
 temps processeur système     0.29 secondes
 Mémoire                            268k

426
427  /* Traitement de la table MAJ */
428  data toto1;
429   set maj(drop=aj ay ak); /* Le drop si Variables non MAJ */
430   modify toto1 key=i /unique ;
431   i=i;
432   *j=aj;
433   *y=ay;
434   orig=aorig;
435   *k=ak;
436   if _iorc_=0 then replace;
437   else do; _error_=0; output; end;
438  run;

Note:  175001 observations copiées de la table WORK.MAJ.
Note: Table WORK.TOTO1 mise à jour.  175001 observations recopiées, 0 observations ajoutées et 0 observations supprimées.
Note: L'étape DATA used (Total process time):
 temps réel                   0.90 secondes
 temps processeur utilisateur 0.60 secondes
 temps processeur système     0.26 secondes
 Mémoire                            151k

439
440  /*  Traitement de la table ADD */
441  Proc append data=add base=toto1;
442  run;

Note: Ajout de WORK.ADD to WORK.TOTO1.
INFO : Processus d'ajout rapide d'un moteur en cours d'utilisation.
INFO: la méthode de lecture par bloc du moteur est en cours d'utilisation.
INFO: la méthode d'écriture par bloc du moteur est en cours d'utilisation.
Note:  349999 observations copiées de la table WORK.ADD.
Note: 349999 observations added.
Note: La table WORK.TOTO1 a 5349999 observations et 6 variables.
Note: La procédure APPEND used (Total process time):
 temps réel                   0.46 secondes
 temps processeur utilisateur 0.31 secondes
 temps processeur système     0.15 secondes
 Mémoire                            8639k

443
444  /* ****************************************** */
445  /* Site : http://www.formations-sas.fr - 2009 */
446  /* Auteur : Pascal MAUBERT                    */
447  /* ****************************************** */

</span></pre>
<p><span style="font-size: small;">Et maintenant selon la formule consacrée : A vos claviers <img src='http://www.formations-sas.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
</span></p>
<p><span style="font-size: small;"> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/formation-programmeur-sas/000366/sas-optimisation-transaction-ajout-maj.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Longueur utilisée d’une variable SAS : Numérique, Alphanumérique</title>
		<link>http://www.formations-sas.fr/datamart/000313/longueur-variable-sas.html</link>
		<comments>http://www.formations-sas.fr/datamart/000313/longueur-variable-sas.html#comments</comments>
		<pubDate>Thu, 21 May 2009 22:09:03 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[BO programmeur SAS]]></category>
		<category><![CDATA[datamart]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[Optimisation SAS]]></category>
		<category><![CDATA[Tuyaux, Conseils SAS]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=313</guid>
		<description><![CDATA[Longueur utilisée d’une variable SAS : Numérique, Alphanumérique. Dans la problématique d’optimisation des applications SAS, des traitements et de la charge machine, nous sommes parfois amené à effectuer des recherches afin d’optimiser les programmes SAS et les bases de données SAS. Un des points important est la volumétrie que représentent ces données. En effet, lorsque des [...]]]></description>
			<content:encoded><![CDATA[<h2><strong>Longueur utilisée  d’une variable SAS : Numérique,  Alphanumérique.</strong></h2>
<p align="justify">Dans la problématique d’<strong>optimisation</strong> des <strong>applications SAS</strong>, des  <strong>traitements</strong> et de la <strong>charge machine</strong>,  nous sommes parfois amené à effectuer des recherches afin d’<strong>optimiser</strong> les <strong>programmes SAS</strong> et les <strong>bases de données SAS</strong>.</p>
<p align="justify">Un des points important est la <strong>volumétrie</strong> que représentent ces  données. En effet, lorsque des bases de données stockent de <strong>grande quantité de données</strong>, des dizaines voire des  centaines <strong>de millions de lignes</strong>, il  devient très <strong>rentable</strong> et <strong>judicieux</strong> de se pencher sur l’<strong>optimisation</strong> des  traitements, programmes SAS, mais également  sur les bases de données SAS.</p>
<p align="justify">Or si SAS nous  fournit une <strong>gestion simplifiée</strong> de la création et de la <strong>gestion de ses tables</strong>, il n’en demeure pas moins,  qu’un peu de <strong>travail d’optimisation</strong> reste à la charge  du <strong>concepteur</strong> de l’<strong>architecture des données</strong>. Cela devient encore plus vrai dans  le monde du <strong>décisionnel</strong>, monde dans lequel les données, stockées sous forme de  <strong>data Warehouse</strong> ou de <strong>datamarts</strong>, atteignent  des volumes très important et ou <strong>le temps d’analyse est conséquent</strong>.</p>
<p align="justify">Hormis les <strong>problématiques de bien fondé</strong> de telle ou telle  variable dans une table, de <strong>la normalisation des tables</strong> qui n’est pas<span id="more-313"></span> envisageable dans le <strong>BI</strong> ou le <strong>décisionnel</strong>, il nous reste  un point important d’<strong>optimisation</strong>, c’est la longueur  de <strong>stockage des variables</strong>.</p>
<p align="justify">Par défaut, les <strong>variables SAS</strong>,  n’ont pas besoin d’être définies, <strong>déclarées</strong>, leur création est <strong>automatiquement</strong> effectuée lors de leur <strong>assignation  de valeur</strong>.</p>
<p align="justify">Dans le cas d’une définition automatique d’une <strong>variable  numérique</strong>, SAS attribue une longueur par défaut de <strong>8 positions numérique</strong>. Or comme  vous pouvez le voir ci-dessous dans le<strong> tableau présenté</strong> (plate-forme MVS/Z/OS),  il est bien rare d’avoir besoin d’une <strong>si grande  longueur</strong> de variable.</p>
<p><strong>Table 10.1  Variable Length and Largest Exact Integer  Length in Bytes</strong></p>
<p><strong>Significant Digits  Retained Largest Integer Represented Exactly</strong></p>
<p><strong>2          2          256</strong></p>
<p><strong>3          4          65,536</strong></p>
<p><strong>4          7          16,777,216</strong></p>
<p><strong>5          9          4,294,967,296</strong></p>
<p><strong>6          12        1,099,511,627,776</strong></p>
<p><strong>7          14        281,474,946,710,656</strong></p>
<p><strong>8          16        72,057,594,037,927,936</strong></p>
<p align="justify">SAS nous fournit  en standard, via le <strong><a href="http://www.formations-sas.fr/formation-sas/000211/formation-sas-base-prog1.html" target="_self">module SAS Base</a></strong>,  un grand nombre de <strong>fonctions</strong>, telles  que : Fonctions de <strong>tableaux</strong>, fonctions de <strong>caractères</strong>, fonctions de  <strong>devises</strong>, fonctions de <strong>dates</strong> et de <strong>temps</strong>, fonctions de <strong>statistiques</strong>, fonctions  de <strong>gestion de fichiers</strong>, fonctions  <strong>financières</strong>, fonctions de <strong>macro</strong>, fonctions <strong>mathématiques</strong>, fonctions de  <strong>probabilité</strong> de <strong>quantile</strong>, fonctions <strong>aléatoires</strong>, fonctions de <strong>trigonométrie</strong>, fonctions de <strong>variable</strong>, fonctions de <strong>Web</strong> …</p>
<p align="justify">Or si il est facile pour les variables de <strong>type caractères</strong>,  de connaître la <strong>longueur utilisée</strong> d’une variable à l’aide de la fonction chaine <strong>LENGTH()</strong>, il n’en est pas de même  pour les variables de type <strong>numérique</strong>.</p>
<p align="justify">Toutefois nous n’allons  pas en rester là, et ce que SAS n’a  pas fait pour nous, <strong>nous allons le  faire nous même</strong>. Avant de vous  donner notre solution, nous allons  nous mettre dans un cas d’école simple  afin de <strong>rappeler le contexte à nos amis débutant en SAS</strong>.</p>
<p align="justify">Les informaticiens <strong>maîtrisant déjà SAS</strong>,  nous vous conseillons de <strong>passer directement à la solution</strong>.</p>
<p align="justify">Pour les autres, afin de vous  aider à mieux comprendre voici un petit programme  qui crée une table SAS nommée  test_var, en environnement <strong>SAS MS Windows</strong>.</p>
<p align="justify">
<pre class="Style1"><span style="font-size: medium;">data test_var;
  a=1;
  dt='27dec2008'd;
  b="un  deux";
  c=scan(b,1)!!"  / "!!scan(b,2)!!".";
run;</span></pre>
<p>Alors à la lecture de ce <strong>programme  SAS</strong>, il serait <strong>plausible de penser</strong> que :</p>
<p>a : variable  numérique longueur 1</p>
<p>dt :  variable numérique longueur 9</p>
<p>b : variable  alphanumérique longueur 7</p>
<p>c : variable  alphanumérique longueur 11, soit b +  blanc / blanc et point.</p>
<p>Soit un total  pour les lignes de la table de <strong>28  octets</strong>, bytes, positions, digit, c …</p>
<p>Eh bien  <strong>NON</strong> !</p>
<p>La longueur totale de la ligne  est de <strong>427</strong> c.</p>
<p>Et elle pourrait  être réduite à <strong>25</strong> c.</p>
<p align="justify">Soit un  <strong>différentiel de 402</strong> c, ce qui ne représente rien ou pas grand chose pour une table de <strong>200 000  lignes</strong> avec si peu de variables,  multipliez par 20 le nombre de variable, par 100 le nombre de ligne et alors le <strong>gain  sera colossale</strong>, non seulement en <strong>volumétrie</strong>, mais lors des <strong>traitements</strong> de ces  <strong>données</strong> SAS par des programmes, vous <strong>économiserez</strong> sur le temps de <strong>lecture</strong>,  sur le temps de <strong>transfert</strong> sur le <strong>réseau</strong>, sur le volume de <strong>mémoire</strong> nécessaire,  le temps <strong>CPU</strong>, le temps d’<strong>analyse</strong> et enfin le temps pour l’<strong>écriture</strong> des données  si vous écrivez une table en sortie.</p>
<p align="justify">Voici les  explications correspondantes à cette longueur  surprenante de 427 c.</p>
<div>
<ul>
<li> La variable fait  8 position alors que 3 (longueur  minimum en environnement MS Windows) aurait suffit</li>
<li> La variable dt  fait 8 alors que 4 aurait suffit (date SAS  = nb jours écoulés depuis 1-1-1960).</li>
<li> La variable b est  sans surprise</li>
<li> En revanche la  variable c fait 404 c et là les débutants s’arrachent les cheveux, en fait si  vous aviez suivis notre cours SAS de  base vous sauriez que par défaut certaines fonctions caractère et notamment la  fonction scan, attribue automatique une longueur  de 200 c lors de son exécution à la variable résultante.</li>
</ul>
<p><strong>Voici une  variante de solution pour le problème exposé :</strong></div>
<pre class="Style1"><span style="font-size: medium;">data test_var2;
  length  a 3 dt 4 b $ 7 c $ 11;
  a=1;
  dt='27dec2008'd;
  b="un deux";
  c=scan(b,1)!!"  / "!!scan(b,2)!!".";
run;</span></pre>
<p align="justify">
<p align="justify"><strong>b</strong> n’est définit  dans l’instruction length, que pour <strong>garder l’ordre des variables SAS</strong> dans la table test_var2 par rapport à test_var.</p>
<p align="justify">Les fonctions : <strong>trim</strong>(), <strong>left</strong>(), <strong>compress</strong>() ne  fonctionnement pas pour ce problème (scan). Essayez-le par vous même pour vérifier.</p>
<p align="justify">Bien vous vous doutez bien qu’en général,  <strong>une table SAS</strong> ne possède pas qu’une  ligne et connue par vous, il va donc  falloir <strong>mettre au point</strong> un petit programme afin de déterminer la <strong>longueur maximale  utilisée</strong> dans notre table.</p>
<p align="justify">Pour cela nous allons  utiliser la procédure   <strong>SAS SQL</strong>.</p>
<p align="justify">Commençons par le plus simple,  déterminer la plus grande longueur utilisée d’une <strong>variable de type caractère</strong>,  soit <strong>alphanumérique</strong> dans une table SAS.</p>
<pre class="Style1"><span style="font-size: medium;">PROC SQL;
  select max(length(b))  as lg_b,  max(length(c)) as lg_c
  from  test_var2 ;
Quit ;</span></pre>
<p align="justify">
<p align="justify">Il nous reste  maintenant à atteindre <strong>le but de cet article</strong> d’<strong>optimisation</strong> SAS, faire la même chose sur les <strong>variables  numériques</strong>, sachant que SAS ne nous  proposent pas l’équivalent de LENGTH().</p>
<p align="justify">L’<strong>astuce</strong> est la  suivante, calculer le <strong>logarithme  népérien base 10</strong> des variables et <strong>arrondir à l’entier supérieur</strong> le résultat  obtenu et bien sur ne retenir que la <strong>valeur maximale trouvée</strong> dans la table. Ajoutons encore une variable  à notre table de départ.</p>
<pre class="Style1"><span style="font-size: medium;">data test_var3;
  length  a 3 dt 4 b $ 7 c $ 11;
  a=11;
  dt='27dec2008'd;
  b="un deux";
  c=scan(b,1)!!"  / "!!scan(b,2)!!".";
  d=123456789;
run;</span></pre>
<p>Et maintenant  calculons le résultat :</p>
<pre class="Style1"><span style="font-size: medium;">PROC SQL;
  select max(ceil(log10(a))) as lg_a, max(ceil(log10(dt))) as lg_dt, max(ceil(log10(d))) as lg_d
  from  test_var3 ;
Quit ;</span></pre>
<p align="justify">
<p align="justify">Ici dans notre  exemple, la fonction MAX() n’est pas utile, mais elle  devient indispensable dans une table de plus d’une ligne.</p>
<p align="justify">Le  résultat est : <strong>2, 5, 9</strong>.</p>
<p align="justify">Aidé du<strong> tableau des longueurs</strong>, dans <strong>le companion de votre environnement</strong>, vous avez tout pour<strong> optimiser les longueur de variable</strong>.</p>
<p align="justify"><strong>A vous de jouer</strong> avec SAS!</p>
<p align="justify">Au fil du temps et selon notre disponibilité, nous mettrons à votre disposition ces quelques exemples que nous fournissons lors de nos formations SAS.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/datamart/000313/longueur-variable-sas.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SAS Fonctions Concaténation Versus V9</title>
		<link>http://www.formations-sas.fr/formation-programmeur-sas/000292/sas-fonctions-concatenation-v9.html</link>
		<comments>http://www.formations-sas.fr/formation-programmeur-sas/000292/sas-fonctions-concatenation-v9.html#comments</comments>
		<pubDate>Tue, 05 May 2009 09:11:45 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[concaténation]]></category>
		<category><![CDATA[concaténation chaine caractere]]></category>
		<category><![CDATA[concaténation variable]]></category>
		<category><![CDATA[fonction SAS]]></category>
		<category><![CDATA[Programmation SAS]]></category>
		<category><![CDATA[SAS fonctions]]></category>
		<category><![CDATA[SAS V9]]></category>
		<category><![CDATA[v9 sas]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=292</guid>
		<description><![CDATA[Habitué en SAS, dans les étapes DATA, à utiliser les opérateurs de concaténation "!!" ou encore "&#124;&#124;", les seconds n'étant pas portable sur toutes les plate-formes SAS, par exemple sur MVS, Z/OS ..., nous vous déconseillons leur usage. Donc le Système SAS nous offre aujourd'hui une série de quatre nouvelles "fonction de concaténation" de chaîne de caractère, basé sur la racine "CAT".]]></description>
			<content:encoded><![CDATA[<p><!--  .cn { 	font-family: Courier New, Courier, monospace; } --></p>
<h1>Parmi les nouvelles fonctions en SAS V9.</h1>
<h3><strong> SAS V9 &#8211; Les fonctions de concaténation.</strong></h3>
<p align="justify">Habitué en SAS, dans les <strong>étapes DATA</strong>, à utiliser les <strong>opérateurs</strong> de <strong>concaténation</strong> &laquo;&nbsp;!!&nbsp;&raquo; ou encore &laquo;&nbsp;||&nbsp;&raquo;, (les seconds n&#8217;étant pas portables sur toutes les  plate-formes SAS, par exemple sur MVS, Z/OS &#8230;, nous vous  déconseillons leur usage),  le <strong>Système SAS</strong> change la donne en nous offrrant aujourd&#8217;hui une série de trois nouvelles &laquo;&nbsp;<strong>fonction de concaténation</strong>&nbsp;&raquo; de <strong>chaîne de caractère</strong>, appelées : &laquo;&nbsp;<strong>CAT, CATS, CATX</strong>&laquo;&nbsp;.</p>
<p align="justify">Plus riche et permettant une gestion plus élaborée de la <strong>concaténation de variable</strong>, ces nouvelles fonctions, en <strong>SAS V9</strong>, permettent même d&#8217;ajouter des caractères séparateur entre les <strong>variables concaténées</strong>.</p>
<p align="justify">Plutôt qu&#8217;un long discours, voici un ensemble de portions de code  SAS, mettant en scène les différentes possibilitées offertes en terme de <strong>concaténation de variables</strong> de type caractère avec<strong> le Système SAS V9</strong>.</p>
<p align="justify">Dans <strong>les exemples</strong> qui vous sont proposés ci-dessous, vous trouverez quatre cas d&#8217;utilisation de chacune <strong>des fonctions de concaténation</strong>,  systématiquement, la quatrième (a4), présente le résultat qui serait obtenu  lors de l&#8217;utilisation des trois précédentes (a1, a2, a3). Cette approche vous  permettra de voir plus rapidement le résultat qui sera produit par les <strong>instructions SAS V9</strong> sans devoir exécuter le code ci-dessous.</p>
<pre><span style="font-size: small;">/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* SAS V9                                     */
/* Fonctions de concaténation de chaines de   */
/* caractères.                                */
/*                                            */
/* Fonctions : CAT, CATS, CATX                */
/*                                            */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

/* Tronc Commun */

data test_cat;
 length cas $ 10 a1 a2 a3 a4 $ 45 x y z $ 15;
 x="Pays";
 y="FR";
 z="2009";
/* Exemple d'utilisation des nouvelles fonctions SAS de concaténation */
 /* SAS Version 9 */
 /* portions de code par groupe de 4 instructions équivalentes,
 la 4 a pour but de montrer le résultat */

 a1 = trim(x) !! ' ' !! trim(y) !! ' ' !! z ;
 a2 = 'Pays' !! '  FR  ' !! '2009';
 a3 = 'Pays ' !! trim(y) !! ' ' !! z ;
 a4 = 'Pays FR 2009';
 cas="Cas 1";
 output;

/* le symbole "!!" peut remplacer le "||", toutefois cela est déconseillé,
 si vous avez des besoins de portabilité, par exemple, pouvoir utiliser
 votre code sous MVS ou Z/OS */
/* Sans blanc aux extrémités */
/* Concatenates character strings and removes leading and trailing blanks  */

 a1 = cats(x,y,z) ;
 a2 = cats('Pays','  FR  ','2009');
 a3 = cats('Pays',y,z);
 a4 = 'PaysFR2009';
 cas="Cas 2";
 output;

/* Ajouter un séparateur et supprimer les blancs de début et de fin de chaine */
/* Concatenates character strings, removes leading and trailing blanks,
 and inserts separators */

 a1 = catx('-',x,y,z) ;
 a2 = catx('-','Pays','  FR  ','2009');
 a3 = catx('-','Pays',y,z);
 a4 = 'Pays-FR-2009';
 cas="Cas 3";
 output;

/* Garder tous les blancs */
/* Concatenates character strings without removing leading or trailing blanks  */

 a1 = cat(x,y,z) ;
 a2 = cat('Pays','  FR  ','2009');
 a3 = cat('Pays',y,z);
 a4 = 'Pays  FR  2009';
 cas="Cas 4";
 output;

/* Enlever les blancs de fin uniquement */
/* Concatenates character strings and removes trailing blanks  */

 a1 = catt(x,y,z) ;
 a2 = catt('Pays','  FR  ','2009');
 a3 = catt('Pays',y,z);
 a4 = 'Pays  FR2009';
 cas="Cas 5";
 output;
run;

/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */</span></pre>
<p align="justify">A vos claviers <img src='http://www.formations-sas.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  !</p>
<p align="justify">Ou copier / coller directement dans votre fenêtre programme SAS.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/formation-programmeur-sas/000292/sas-fonctions-concatenation-v9.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Extraction Aléatoire sans Doublon</title>
		<link>http://www.formations-sas.fr/formation-programmeur-sas/000276/extraction-aleatoire-sans-doublon.html</link>
		<comments>http://www.formations-sas.fr/formation-programmeur-sas/000276/extraction-aleatoire-sans-doublon.html#comments</comments>
		<pubDate>Fri, 01 May 2009 08:12:06 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[aléatoire]]></category>
		<category><![CDATA[doublon]]></category>
		<category><![CDATA[exemple]]></category>
		<category><![CDATA[exemple sas]]></category>
		<category><![CDATA[extraction]]></category>
		<category><![CDATA[Formation SAS]]></category>
		<category><![CDATA[programme sas]]></category>
		<category><![CDATA[programmeur sas]]></category>
		<category><![CDATA[sans]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=276</guid>
		<description><![CDATA[Afin d'appliquer un modèle prédictif sur une représentation limitée d'une population, afin d'optimiser les performance lors de l'écriture de programme en effectuant des tests sur une petite portion d'un base de données, nous avons la possibilité avec le système SAS de réaliser très simplement une extraction de données, de type aléatoire et bien sur, cerise sur le gâteau : sans doublons.]]></description>
			<content:encoded><![CDATA[<style type="text/css">
<!--
.Style1 {font-family: Georgia, "Times New Roman", Times, serif}
.Style3 {
	font-family: "Courier New", Courier, monospace;
	font-weight: bold;
	font-size: 14px;
}
.Style4 {font-size: 16px}
-->
</style>
<h1 class="Style1">Programme Exemple SAS : Extraction Aléatoire sans Doublon</h1>
<p class="Style1">&nbsp;</p>
<p class="Style1">La problématique est la suivante, réaliser une <strong>pannélisation</strong>, pour des raisons de performance.</p>
<p align="justify" class="Style1">&nbsp;</p>
<p align="justify" class="Style1">Afin d&#8217;appliquer un <strong>modèle</strong> <strong>prédictif</strong> sur une <strong>représentation limitée</strong> de population, ou afin d&#8217;<strong>optimiser les performance</strong> lors de l&#8217;<strong>écriture de programme</strong> <strong>SAS</strong> en effectuant des tests sur une petite portion d&#8217;une base de données, nous avons la possibilité avec <strong>le système SAS</strong> de réaliser très simplement une <strong>extraction de données</strong>, de type <strong>aléatoire</strong> et bien sur, cerise sur le gâteau : sans <strong>doublons</strong>.</p>
<p align="justify" class="Style1">&nbsp;</p>
<p align="justify" class="Style1">Dans le <strong>programme SAS</strong> suivant, il vous suffit de renseigner les <strong>macros variables</strong>, entre le signe &#8216;=&#8217; et le signe &#8216;;&#8217; : <strong>PCT</strong>, contenant le pourcentage de lignes de la table à extraire et  <strong>DS1</strong>, donnez lui le nom complet de la table SAS source, soit libname.tablename, ensuite lancer le <strong>programme SAS</strong> et voilà c&#8217;est tout.</p>
<p align="justify" class="Style1">&nbsp;</p>
<pre>
<h3 align="justify" class="Style1"><strong>Programme exemple SAS : Extraction aléatoire sans doublon.</strong></h3>

<span id="more-276"></span>
<p class="Style3 Style4">/***  Pourcentage d'observations à garder ***/
<p class="Style3">* - - - - - - - - - - A modifier - - - - - - - - *
<p class="Style3">%let pct=20;	           /***  &lt;=== PCT A modifier       ***/
%let ds1=ia.employee_data; /***  &lt;=== Table SAS A modifier ***/
<p class="Style3">* - - - - - - - - - - A garder - - - - - - - - - *
<p class="Style3">data extraction(drop=nombre_aleatoire indice_depl nb_ligne_out d1 pct nb rc);
/* Combien d'observations dans la table sas. */
  if _n_ = 1 then do;
    d1=open(&quot;&amp;ds1&quot;);
    nb=attrn(d1,'nobs');
    if d1 then rc=close(d1);
  end;
<p class="Style3">
/* Préparation à l'extraction des données SAS */
  pct=input(symget('pct'),2.2);
  pointer=0;
  nb_ligne_out=nb * pct;

/* Boucle d'extraction */
  do while(nb_ligne_out &gt; 0);
    pointer+1;
    nombre_aleatoire=ranuni(0);
    indice_depl=nb_ligne_out / (nb - pointer);
    if nombre_aleatoire &lt; indice_depl then do;
      set &amp;ds1 point=pointer;
      output;
      nb_ligne_out=nb_ligne_out-1;
    end;
  end;
stop;
run;
</pre>
<p><strong>Ce code SAS, peut être utilisé avec <a href="/000211/programmation-sas-base-prog1.html" target="_self">SAS BASE</a>, avec <a href="/000216/le-langage-sas-macro-macr.html" target="_self">SAS Macro</a>, avec <a href="/formation-sas/000258/sas-enterprise-guide.html" target="_self">SAS enterprise Guide (SEG)</a>.</strong> Des exemples (outils) comme celui-ci sont fournis lors de nos formations/stages.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/formation-programmeur-sas/000276/extraction-aleatoire-sans-doublon.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

