28 septembre 2006

Filigrane / image en fond d'un état

J'ai vu de nombreux développeurs, et encore un fil de discussion récent sur le forum, batailler pour ajouter dans le fond d'un état une image. Typiquement, une mention "duplicata" en diagonale dans le fond d'un état. Le piège consiste à partir sur la fonctionnalité de "formulaire" que propose l'éditeur d'état, elle est très spécifique. Il faut utiliser la solution "Image de fond" donnée dans la description de l'état (cf image du billet). Cette solution consiste à appeler dans le code avant impression du bloc de haut de page, la commande suivante :
iImprimeImage("Image.jpg", 0, 0, iLargeurPage(), iHauteurPage())

Il n'y a rien d'autre à faire !

Astuce : pensez à optimiser la taille de cette image, car elle sera envoyée au pilote de l'imprimante. Et s'il y a bien un domaine dans lequel il faut éviter d'être trop gourmand en ressources, c'est bien celui de l'impression.

Quiz - connaissez-vous la fonction "HStatCalcule" ?

Il s'agit probablement d'une des fonctions WLangage les plus méconnue du moteur Hyper File, et pourtant elle est primordiale ! Dernier exemple en date, une requête récupère 350 enregistrements, dans une table en comportant 400 000. Les 350 enregistrements sont rapidement récupérés (fonction "ConstruitTableFichier" pour leur visualisation), pourtant la requête ne rend pas la main et la table reste bloquée avec le sablier. Renseignement pris sur l'application et son activité, il s'avère que d'importants mouvements ont été faits sur ce fichier.

Solution dans pareil cas : appeler la fonction "HStatCalcule", pour obtenir un chargement immédiat et complet des données de la requête.

Voici la description de la fonction donnée dans l'aide :

Ces statistiques sont utilisées lors de la pose d'un filtre, la création d'une requête ou encore la création d'une vue sur le fichier. Le moteur Hyper File analyse la condition de sélection et s'appuie ensuite sur ces statistiques pour déterminer les rubriques les plus discriminantes qui permettront d'optimiser les parcours des fichiers.
Les statistiques permettent d'avoir des informations sur le contenu du fichier au moment de leur calcul. Aussi, plus il y a de modifications du fichier après ce calcul et moins ces statistiques sont fidèles au contenu du fichier. Plus le fichier contient d'enregistrements et moins la modification d'un enregistrement a d'impact sur le reflet du fichier que les statistiques renvoient.

Un autre point important sur le sujet "performances", concerne la densité des index. Un fichier de stockage peut être utilisé pour de l'insertion permanente de données, mais peut avoir peu de consultations. A l'inverse, un fichier peut être consulté en permanence, tout en étant que rarement complété. Et bien en fonction de l'usage du fichier, il peut être bon d'ajuster le "taux de densité" de l'index, afin de favoriser les insertions, ou les consultations. Le taux de densité est modifiable lors de la réindexation des fichiers (WDOptimiseur, ou fonction "HRéindexe").

22 septembre 2006

Exécutables WINDEV et Framework

Un billet de remerciement pour le support technique PC SOFT, qui a publié de l'information sur la méthode de téléchargement du Framework par les exécutables. La documentation ne va pas aussi loin, et la compréhension d'un mécanisme de ce type permet une bien meilleure utilisation.

En complément, il est bon de préciser que la sélection d'un Framework commun lors de la création d'un exécutable est une possibilité, mais pas une obligation pour l'exécutable. Je reformule, si vous créez un exécutable en demandant l'utilisation d'un Framework commun, cet exécutable utilisera bien le Framework commun mais à la condition qu'il ne trouve pas un Framework dans son propre répertoire.

21 septembre 2006

Bogues et Philosophie

La philosophie a-t-elle sa place dans le développement, notamment en ce qui concerne la tolérance aux bogues ?

Et bien comme tout sujet philosophique, tout est question de point de vue.

Intervenant sur de nombreux projets dans des domaines très disparates, je suis régulièrement sollicité pour la recherche de bogues récalcitrants, vous l'aviez constaté dans certains de mes billets. Techniques et outils de débogage permettent toujours de parvenir à une solution, quelqu'en soit l'origine. Mais à quel prix ? Faut-il peu importe le coût aller jusqu'à la correction systématique, oui diront les puristes, pas si sûr diront ceux qui n'ont pas peur de philosopher(*) !

C'est en tout cas mon avis, à quoi bon perdre des heures à chercher la petite bête, cela ne fait que freiner l'avancée des projets. Je pense qu'il ne faut pas hésiter parfois à "laisser tomber" un traitement récalcitrant, en préférant le recoder, ou refaire une IHM, on y est souvent gagnant. Il en est de même pour la configuration des PC, avec la soixantaine de processus qui cohabitent, en cas de conflit il est bien plus rapide de remonter un point de restauration, même si cela n'est pas bon pour l'autosatisfaction... Les versions de Windows qui s'enchaînent vont dans ce sens, il est préférable d'avoir aujourd'hui un Windows XP, plutôt qu'un Windows 98 sans bogue, il sera préférable dans quelques années d'avoir un Windows Vista, plutôt qu'un Windows XP entièrement stabilité.

(*) ndlr : je parle ici d'une philosophie très bon marché, plus inspirée des réalités économiques, que par une réelle pensée. Je n'ai pas la prétention d'être un philosophe !

13 septembre 2006

Ma variable date change-t-elle toute seule de valeur !!!

Le W-Langage dispose d'un type "date" qui permet de manipuler très facilement les dates, chose fréquente dans un programme. Par exemple, il permet de facilement connaître la date 7 jours en arrière, sans avoir de calcul à faire pour connaître le mois, ou l'année. Exemple :

DateMoins7 est une Date = DateSys()
DateMoins7..Jour -= 7

Info
(DateMoins7)


Si les calculs sont aisés avec ce type, il faut être concentré lors de son affectation, car il peut provoquer un changement inopiné de valeur, tant que son principe n'a pas été bien assimilé. Par exemple, on tente d'affecter le 31 janvier 2006 à une variable date avec ce code :

MaDate est une Date
MaDate..Jour = 31

MaDate..Mois = 1

MaDate..Année = 2006

Info
(MaDate)


Contre toute attente, la date ne sera pas le 31/1/2006, mais le 30/1/2006. La date a changé toute seule !

Voici l'explication, qu'il faut donc garder dans un coin de tête pour bien profiter des avantages de ce type.

L'affectation de MaDate avec ..Jour = 31 ne fait pas d'affecter le jour. Il y a une affectation automatique du mois et de l'année, avec le mois en cours, et l'année en cours. Ainsi l'affectation de MaDate avec ..Jour = 31, revient à affecter la variable avec le 31/9/2006. Mais il n'y a que 30 jours en septembre, et le type date corrige automatiquement l'affectation. On a donc à ce moment là le 30/9/2006 dans la variable MaDate. L'affectation suivante ..Mois = 1 ne fait que remplacer dans la date le mois de septembre, par le mois de janvier. On a donc le 30 janvier 2006 dans la date, et non pas le 31 comme l'on pouvait s'y attendre.

J'espère que cette explication sera utile à quelques développeurs !

12 septembre 2006

Lutter contre les mystères du développement...

Au premier abord l'informatique n'est constituée que de zéros et de uns, combinés par une logique implacable. Il n'en est rien, bien heureusement pour tous les Développeurs qui trouveraient le temps bien long sans le piment apporté par bogues et effets de bords pouvant survenir dans les applications !

Et oui, ce qui est obligatoirement vrai un jour, peut finalement ne pas l'être le lendemain pour une raison qu'il sera difficile de trouver, et qui provoquera un report de planning. Quel développeur n'a pas pesté sur un code qui marchait très bien, et qui ne plus fonctionne sans avoir été modifié ...

L'arme absolue en la matière n'existe pas, mais il est possible dans des applications sensibles d'adopter une programmation défensive. Elle consiste à compléter les traitements de tests supplémentaires, vérifiant ce qui normalement n'est pas à vérifier, car n'arrive jamais. Ces tests sont les assertions.

En W-Langage, la fonction "dbgAssertion()"vous permettra de mettre en place ces tests supplémentaires. Les assertions seront actives durant l'exécution en mode test sur le poste de développement. Il sera ainsi possible de détecter une éventuelle anomalie, insoupçonnée lors de la conception. Typiquement, les tests seront placés dans tous les traitements qui vont recevoir des paramètres, afin de vérifier leur valeur.

Voici une méthode de programmation permettant d'activer les assertions dans l'application en production. Cela permet d'effectuer des tests complémentaires, une fois l'application compilée, et diffusée. Il suffit d'ajouter une ligne de code unique dans le projet, et de lancer l'exécutable avec une ligne de commande :

// Initialisation du projet, activation des assertions
// si la ligne de commande contient ASSERT
dbgActiveAssertion(Position(LigneCommande(), "ASSERT", 1, sansCasse))

La mise en place d'une programmation défensive a un coût en temps réel lors de l'écriture du code. En revanche elle permet un gain de temps significatif dans les phases de mises au point.

08 septembre 2006

Ne pas oublier les FAA !

On reste bien dans le domaine WINDEV cette fois-ci, il ne s'agit pas de "Federal Aviation Administration", mais de "Fonctionnalités Automatiques des Applications" !
En effet, les applications WINDEV peuvent être enrichies sans effort de développement de fonctionnalités automatiques :
- mémorisation de la taille et de la position des fenêtres,
- sélection des colonnes à visualiser dans les champs tables,
- activer les animations des fenêtres, le GFI,
- obtenir un graphique, un total à partir d'une colonne de table,
- retrouver l'historique des modifications apportées à un champ relié à la base Hyper File,
- mémorisation de la valeur d'un champ...


Une documentation complète destinée aux utilisateurs est éditée par PC SOFT. Je vous encourage à la consulter de temps en temps, afin de ne pas passer à côté d'une possibilité intégrée aux applications.

N'oubliez donc pas ces fonctionnalités, elles ne coûtent pas de temps de développement, et donnent un plus fonctionnel indéniable aux applications.

05 septembre 2006

Abonnement France Telecom, fin d'une époque !

Une fois n'est pas coutume, le billet de rentrée est sans rapport avec le Développement WINDEV, mais concerne le fournisseur d'accès Free ! Comme à son habitude, Free se maintient à la une de l'actualité des FAI en proposant à ses abonnés non dégroupés la possibilité de s'affranchir de l'abonnement mensuel France Telecom (lire le communiqué).

Il est bien évidence que cette nouvelle offre baptisée "Freebox only" s'intègre à une stratégie commerciale de long terme. Mais cela au prix de marges faibles voir négatives dans l'immédiat, de part les tarifs France Telecom imposés aux fournisseurs d'accès.

Le groupe Iliad a choisi de prendre en considération sa clientèle actuelle et future, plutôt que d'engranger des bénéfices à court terme en réduisant les coûts comme d'autres FAI l'on fait par le passé.

Application au développement : une petite fonctionnalité surprise, sans supplément dans une version, peut être un sacré plus pour la satisfaction des utilisateurs surtout s'il s'agit d'une FAA ;-)