Recherche sur le blog

vendredi 27 janvier 2012

[C#] Webservice : XML vers Dataset

Ce que nous venons de voir avec WinDev est également réalisable en C# ou même en Visual Basic. En effet, à partir d'un document XML possédant une structure particulière, il est possible de générer et d'exploiter une variable de type "Dataset". Un exemple est donné sur le site de Microsoft MSDN, le centre de ressources pour les développeurs. Initialement, les services du site WebserviceX sont destinés à être exploités en .NET, et donc, les réponses renvoyées ont parfois été adaptées en fonction.

[WD15] Utiliser un Webservice qui renvoie du XML

Aujourd'hui, présentation d'un cas plutôt intéressant, qui va nous faire découvrir des fonctions XML. Nous allons voir ici comment traiter la réponse d'un Webservice qui renvoie une chaîne au format XML et comment parcourir les différents éléments. Une deuxième solution sera également envisagée: l'utilisation de la fonction HImportXML, qui permet d'intégrer à une table (d'une base de données) le contenu d'un document XML, pour autant qu'il respecte une certaine structure. Pour vous aider, nous avons, en tant qu'exemple, importé et utilisé le Webservice "Global Weather", que l'on retrouve sur le site WebserviceX.NET.

Que va-t-on faire ici ? 

Le Webservice utilisé comme exemple ne sera pas détaillé et exploité dans son entièreté. Seul l'affichage d'une liste de couples "Pays/Ville" sera affichée, lorsqu'on saisira un nom partiel ou complet de pays dans un champ texte classique. Nous aurons donc une fenêtre, un champ de type "saisie", ainsi qu'un champ de type "combo" (liste déroulante). Si vous êtes un habitué de WinDev, vous pouvez déjà créer ces éléments et les nommer comme ceci :
  • Champ de saisie : SAI_Pays.
  • Liste déroulante : COMBO_Cities.
          
Importer le web service

Pour importer le web service, n'hésitez pas à suivre la procédure détaillée dans l'article suivant : importer un web service. Pour rappel, WinDev générera les types et les opérations adéquates, qui permettront d'affecter les paramètres d'appel, mais aussi de récupérer chacune des réponses.

Récupérer la liste des pays/villes

Comme vous êtes maintenant à l'aise avec les services web, vous devriez rapidement comprendre le code suivant, dans lequel on déclare trois variables : la première servira à contenir les paramètres, la seconde contiendra la réponse, et la troisième est une variable dans laquelle on stockera le nom du pays suivi du nom de la ville. 

          
On affecte alors le paramètre, "CountryName" dans ce cas, avec la valeur du champ "Nom du pays".  Ensuite, on appelle l'opération "GetCitiesByCountry" avec la liste de paramètres, puis on stocke le résultat dans la variable "réponse". On peut ensuite analyser la réponse en affichant ou bien en se plaçant en mode "debug". Dans notre cas, il s'agit d'une chaîne : on peut donc l'afficher (par exemple, avec Info).

         
Pour cette opération, nous avons obtenu un XML qui possède la structure suivante :

                     
Nous allons voir les différentes méthodes employées pour gérer cette réponse.

Solution 1 : parcourir le document XML

La première solution consiste à parcourir le document XML. Comment faire ? Depuis que la version 15 de WinDev est apparue, "parser" un document XML a été simplifié. On dispose d'un bon nombre de méthodes, telles que XMLSuivant, XMLTermine, XMLPremier, XMLDonnée, etc. Nous allons donc expliquer, avec un bouton de code, comment descendre et analyser chacune des données pour les ajouter à la liste. On ne passe donc pas par une quelconque table ! Notez bien qu'il s'agit d'une première ébauche, et que celle-ci pourrait sans doute être améliorée...


Qu'est-ce qui est réalisé ici ?
  • On initialise le document XML avec la réponse donnée par le service.
  • On lit le premier élément grâce à XMLPremier.
  • On effectue une boucle avec comme condition "tant que l'on n'est pas en dehors du document...". Pour cela on utilise une fonction appelée XMLEnDehors(document).
  • On vérifie que l'élément est "Table". Si ce n'est pas le cas, on va descendre d'un nœud grâce à la fonction XMLFils, puis lire l'élément qui suit. Si par contre, l'élément valait bien "Table", alors on descend encore d'un nœud.
  • Si l'élément précédent valait table, on descend d'un nœud, et on vérifie que l'élément suivant vaut "Country". Si c'est le cas, on ajoute la donnée à la variable "sLigne" grâce à XMLDonnée(document). On continue à descendre jusqu'à l'élément "City". Ensuite, on ajoutera à la liste et on remontera au parent (XMLParent), tout en effectuant une lecture supplémentaire.
  • Lorsqu'on sort de la boucle, on ferme le document (XMLTermine).
Notez que les fonctions comme XMLFils et XMLParent effectuent une lecture, donc ils se positionnent sur l'enregistrement suivant !

Testez votre fenêtre et saisissez un nom de pays (par exemple, "Belgium"). Ensuite, déroulez la liste pour voir le résultat. Si cela fonctionne et que vous obtenez quelque chose de similaire à la fenêtre ci-dessous, vous pouvez passer à la seconde solution.


Solution 2 : utiliser un fichier HyperFileSQL

Comme le document XML obtenu possède une structure bien spécifique, on va pouvoir importer celui-ci directement dans une table de base de données. Rappelons-nous la structure du fichier obtenu grâce à l'image suivante : 


D'après la documentation officielle de la fonction HImportXML, notre fichier, que nous allons soit décrire via l'analyse, soit par programmation, aurait dû s'appeler "NewDataSet" et contenir une rubrique nommée "Table" avec deux sous-rubriques. Cependant, les deux sous-rubriques de "Table" auraient dû être liées à deux sous-éléments "Table_1" et "Table_2". Ici, les sous-éléments sont "Country" et "City". Nous allons donc faire abstraction de l'élément "Table".

Au préalable, il est nécessaire de créer la table correspondante (NewDataSet - rubriques : Country [texte] - City [texte]) et réutiliser le code d'appel au service web avant d'insérer la partie qui suit.


Qu'est-ce qui est réalisé ici ? 
  • On déclare une chaine dans laquelle on va stocker le résultat, et rajouter une balise XML conforme en début de document.
  • On sauvegarde le tout dans un fichier texte avec l'extension XML.
  • On appelle la fonction HImportXML avec en paramètres, le nom de la table, et le chemin vers le fichier XML.
  • On lit le premier élément dans la table.
  • On ajoute un élément texte à la liste, qui est composé du pays, et de la ville.
  • On lit l'élément suivant jusqu'à arriver à la fin du fichier.
Si cela fonctionne, vous ne devriez pas obtenir d'erreur ou d'exception à l'exécution.

Bon développement !

jeudi 26 janvier 2012

[Tablette] Android 3.2.1. sur Asus Eeepad TF101

P20120117151625P20120117151636P20120117151811P20120117151817P20120117151829P20120117152627
P20120117152635P20120117152642P20120117152659P20120117152753P20120117152823P20120117152841
P20120117152851P20120117152912P20120117152938P20120117152943P20120117153003

Android 3.2.1. sur TF101, un album sur Flickr. Quelques screenshots d'Android 3.2.1. sur l'Asus Eeepad Transformer TF101. Ils montrent notamment la configuration et l'installation d'un client FTP, la gestion de certains paramètres, et l'ajout de l'application Adobe Reader à partir du Market.

[Actualités] Free and Open Source software Developers' European Meeting

Du 4 au 5 février 2012, à Bruxelles, venez assister à une conférence sur deux jours, la FOSDEM (Free and Open Source software Developers' European Meeting). C'est un événement gratuit (mais sponsorisé, notamment par Google, HP, Belnet et Cisco), à but non-commercial, qui vise à inciter à l'utilisation de logiciels gratuits et "open source". Il est organisé "par la communauté, pour la communauté", comme ils le précisent sur leur site internet. C'est aussi l'occasion pour les développeurs d'en rencontrer d'autres et d'échanger des idées, des astuces. Plus encore, cela permet aussi d'être tenu au courant des nouveautés dans le domaine de l'open source et du logiciel gratuit en général. Le site internet met également en avant les "Developers Rooms" qui offrent des connexions réseau ainsi que des projecteurs, à disposition de tous.


Bien que ce cela paraisse très intéressant, je ne serai pas présent car j'ai d'autres projets en cours. Je vous invite donc à jeter un œil sur le site internet "FOSDEM.org", où vous trouverez davantage d'informations, un brin d'histoire, et enfin, des informations pratiques (coordonnées de contact, plan d'accès, horaires,...). N'hésitez pas à venir partager votre expérience lorsque celle-ci sera terminée.

mardi 24 janvier 2012

[WinDev] Handle is in an invalid state (1609)

Mise à jour du 25/01 : PC SOFT fournit des correctifs pour chacune des dernières versions de WinDev. Ils sont disponibles via la FAQ. Merci au support technique de l'avoir signalé. Il n’est normalement plus nécessaire d’appliquer la procédure détaillée ci-dessous.
 
Mise à jour du 5 mai 2013 : Attention, pour la version 17, un correctif a été ajouté le 15 mars, mais le lien dans la FAQ ne pointe pas sur le bon fichier. Voici le lien corrigé : WX170PACKSQ078np.exe.

Depuis peu, pas mal d'utilisateurs de WinDev, dont moi-même, se sont vus contraints d'arrêter de développer pendant un petit moment. Quelle en était la raison ? Un bug lié à la clé Sentinel HASP / SafeKey. Aléatoirement, le programme affiche "Handle is in an invalid state (1609) - ID : 800106AC - EID : 170B" (l'ID affiché peut être différent). Ce problème est en fait dû à une mise à jour via Windows Update : la solution est alors de désinstaller complètement le pilote puis de le réinstaller à partir du DVD d'installation fourni par PC SOFT. La marche à suivre qui suit n'a pas fonctionné comme il le faut, même si pour certains cela devrait se dérouler sans embuche. C'est pourquoi j'apporterai un complément d'information afin de désinstaller entièrement tout ce qui est lié à la clé HASP.
 
En cherchant l'erreur via Google, on tombe sur les forums de PC SOFT qui ramènent vers la FAQ. Voici des détails supplémentaires.
  • Se rendre dans les options "Système" (via le panneau de configuration ou en effectuant un clic droit - "Propriétés" sur l'icône "poste de travail" / "ordinateur" - elle se trouve soit sur votre bureau, soit il existe une entrée dans le menu Démarrer).
  • Dans l'onglet "Paramètres systèmes avancés" (sous Windows 7, il faut cliquer sur cette option dans la fenêtre qui s'ouvre), se rendre dans l'option "Variables d'environnement".
  • Dans la nouvelle fenêtre, créer une nouvelle variable utilisateur ("Nouvelle..."). 
    • Nom de la variable : devmgr_show_nonpresent_devices
    • Valeur de la variable : 1
  • Valider par OK et fermer les options du système.
  • Se rendre dans la gestion d'ordinateurs. Vous pouvez vous y rendre en effectuant un clic droit sur l'icône du "Poste de travail" (Ordinateur) puis en choisissant l'option "Gérer". Rendez-vous ensuite dans "Gestionnaire de périphériques". Autre solution : Menu Démarrer, Exécuter, taper "devmgmt.msc" et valider par OK.
  • Dans la fenêtre qui s'ouvre, menu "Affichage" et cocher "Afficher les périphériques cachés".
  • Dans la branche "Contrôleurs USB", désinstaller les pilotes liés à Sentinel HASP (clic droit - désinstaller). Cocher la case "désinstaller le pilote du périphérique".
  • Débrancher la clé et redémarrer l'ordinateur.
  • Insérer le DVD de WinDev dans le lecteur de votre ordinateur.
  • Exécuter la ligne de commande suivante par le menu "Démarrer ... Exécuter" de Windows : "<LETTRE_LECTEUR>:\Hasp\haspdinst.exe" -fr. Valider le message "Operation successfully completed". Remarque : sur le DVD de la version 17, le chemin complet est <LETTRE_LECTEUR>:\Support\Hasp\haspdinst.exe.
  • Exécuter la ligne de commande suivante par le menu "Démarrer ... Exécuter" de Windows : "<LETTRE_LECTEUR>:\Hasp\haspdinst.exe" -i. Même remarque que ci-dessus pour le chemin complet. Valider le message qui s'affiche à l'écran.
Il est possible que cette dernière étape ne fonctionne pas (message "Installation omitted. Newer version already installed")...Voici donc un complément d'information qui est fourni par le site Pulsonix, qui m'a permis de valider la dernière étape ci-dessus avec succès.
  • Dans le panneau de configuration, "Ajout/suppression de programmes" (programmes et fonctionnalités, sur Windows 7), désinstaller tous les composants Sentinel HASP.
  • Dans les services (via menu Démarrer, Exécuter, "services.msc"), repérer les services Sentinel / HASP / HLServer. Les désactiver, repérer leur nom réel - que l'on trouve dans la fenêtre de propriétés du service - puis les supprimer via la commande "sc delete". Cette commande s'exécute via l'invite de commandes Windows "cmd".
  • Supprimer les fichiers "aks*.*", "hardlock.sys", et "haspnt.sys" du dossier C:\Windows\System32\drivers.
  • Dans le gestionnaire de périphériques encore, afficher les périphériques cachés puis se rendre dans la branche "périphériques non Plug-and-Play". Désinstaller "Hardlock", "Haspnt", et "HASP Fridge".
  • Lancer, depuis le DVD, la commande "<LETTRE_LECTEUR>:\Hasp\haspdinst.exe" -r -purge. Valider le message qui indique que l'opération a été correctement effectuée.
  • Éventuellement nettoyer la base de registre avec un logiciel comme CCleaner (facultatif).
  • Redémarrer l'ordinateur.
  • Réessayer la dernière étape de la FAQ de PC SOFT (voir ci-dessus).
  • L'installation du pilote devrait se faire normalement.
  • Brancher la clé HASP et attendre la fin d'installation du pilote.

Sources


Afficher les périphériques cachés (astuce)
FAQ PC SOFT
FAQ : Removal of HASP drivers
Forums de PC SOFT

mardi 3 janvier 2012

[Tablette] Passage furtif - Asus Eeepad Transformer

Nous avons eu la chance de recevoir une tablette tactile Eeepad Transformer (tournant sous Android 3.2.1 après mise à niveau) en test pour voir s'il était possible de lire facilement des fichiers PDF sur l'écran. Impossible pour moi de la tester de fond en comble mais je peux vous dire que c'est une belle "bête". Les Numériques avait testé la version livrée avec le dock faisant office de clavier et lui avait attribué 4 étoiles. Pour ma part il m'a été possible de tester la mise à jour du système, la synchronisation avec mon compte Google (photos, contacts, e-mails), la navigation internet et la lecture de documents PDF (via Adobe Reader 10.1.1.). 

La mise à jour est simple et rapide : en quelques "clics" et après deux redémarrages, on se retrouve avec la dernière version Android disponible pour ce modèle. 

La lecture PDF est agréable : l'écran est suffisamment lumineux et affiche un contraste honnête. Les documents apparaissent vraiment nets. La navigation se fait au doigt, et on peut aussi choisir la page sur laquelle se positionner en faisant apparaitre une barre latérale dans la partie inférieure de l'application. En tapant deux fois, on zoome / dé zoome. En tapant sur le bord supérieur de l'écran, on affiche une barre avec quelques options dont "type de défilement" (continu, automatique, une page) et "recherche".

La synchronisation du compte Google est automatique mais peut être reconfigurée dans les paramètres de l'engin. Si le compte est supprimé, toutes les données synchronisées sont effacées de la tablette. Pour télécharger un logiciel pour la première fois sur l'Android Market, il vous faudra obligatoirement créer un compte.

Pour terminer, voici quelques images de la tablette en pleine utilisation. Les clichés ont été pris avec un appareil photo d'appoint...