vendredi 8 juillet 2016

Vérifier ses adresses clients grace aux API adresse.data.gouv.fr



Il faut souvent utiliser des outils payants pour valider les adresses de vos bases de données clients, de plus c'est généralement assez coûteux. 
Il y a aussi Google Maps, mais là aussi il faut payer ou vous limiter à 2500 connexions par jours et à d'autres restrictions de vitesse.

Je vous propose d'utiliser les nouvelles API  http://adresse.data.gouv.fr/api/ crée par IGN, la Poste et OpenStreetMap, donc des acteurs reconnus.

Pour ce faire, un simple formulaire Windev dans lequel je vais taper une adresse et un code postal, et vérifier la cohérence des informations saisies. L'API retourne un geojson FeatureCollection respectant la spec GeoCodeJSON:

N'hésitez pas à consulter en détail le site de l'API car on peut aussi passer en paramètre un fichier CSV par exemple.

Formulaire windev de recherche de l'adresse
Formulaire de base 
Le bouton chercher construit la requête avec l'adresse et le code postal. Cette requête est transmise à l'API et on récupère une chaîne au retour au format JSON si tout va bien.
J'ai du ajouter un paramètre et spécifié l'en tête au format XML pour que tout fonctionne bien avec Windev.

code du bouton recherche
Code lié au bouton chercher

Le code en plein texte:

sMarequete est une chaîne ANSI ="http://api-adresse.data.gouv.fr/search/?q=%1&postcode=%2"
sMarequete=ChaîneConstruit(sMarequete,SAI_Adresse,SAI_Ville)
HTTPParamètre(httpParamètreMode, 1)

bCMaRéponse est un boolean=HTTPRequête(sMarequete,"","X-Requested-WITH: XMLHttpRequest"+RC)
SI ErreurDétectée ALORS
Erreur(ErreurInfo(errComplet))
SINON
sMonresultat est une chaîne ANSI=HTTPDonneRésultat(httpRésultat)
soit monresultat=JSONVersVariant(sMonresultat)
POUR TOUT idsearch DE monresultat.features
TableAjouteLigne(TABLE_adresses,idsearch.properties.name,idsearch.properties.city,idsearch.geometry.coordinates[1],idsearch.geometry.coordinates[2],idsearch.properties.score)
FIN
FIN


On construit un variant automatiquement avec la fonction JSONVersVariant et on parcours ce dernier pour ajouter toutes les occurrences trouvées au tableau.
On récupère l'adresse, la ville, les coordonnées du point et un score entre 0 et 1 selon la qualité du résultat. Mon exemple est simpliste mais on peut de cette façon corriger et valider ses adresses et géocoder ses clients.



jeudi 18 février 2016

Partie 2 - Création de l'application mobile liée au webservice

Dans cette partie, nous allons utiliser le Webservice créé lors de la première partie, et créer une application mobile pour Iphone permettant au client de récupérer ses dossiers sur smartphone ou tablette.

Ne possédant pas la licence de Windev Mobile, j'ai utilisé la version démo téléchargeable sur le site de PcSoft.

Lancer windev mobile, et choisir de créer un nouveau projet pour IOS. On peut faire la même chose sous Android, mais il faut télécharger le SDK approprié.


 
Windev mobile
Je vais créer deux fenêtres, une recevra le code du client et son mot de passe. Un bouton de validation enverra ces données au Webservice, un tableau d'objets "Dossier" sera rempli avec les dossiers du client et passé en paramètre à la deuxième fenêtre, qui contiendra une zone répétée avec les données de chaque dossier.


 
fenêtre un, accueil




 
fenêtre deux, dossiers du client

Code : Dans le contenu du projet, choisir d'importer un webservice, clic droit sur webservice :

 Puis renseigner l'adresse du serveur, ici c'est mon poste avec un serveur Wamp


En fin validez, on récupère les procédures et les types associés au webservice. Ici j'ai fait simple mais on devrait créer d'autres procédures et objets pour récupérer par exemple les échantillons  du dossier, les résultats des échantillons, etc..


ClDossier est une Classe
           
        codeDossier est une chaîne
        StatutDossier est une chaîne
        DateDossier est une Date
        LibelleDossier est une chaîne
        codeClient est une chaîne
           
   
FIN


Code du bouton de la fenêtre accueil : 

bufWsResponseEXPRESS est un Buffer


bufWsResponseEXPRESS=LGA_WS.RecupererDossiers(SAI_SansNom1)


SI Taille(bufWsResponseEXPRESS)>0 ALORS
    tabFinalEXPRESS est un tableau de CDossier dynamique
   
    Désérialise(tabFinalEXPRESS,bufWsResponseEXPRESS,psdBinaire)
    OuvreFenêtreMobile(EXPRESS_FEN_EXPRESS_FEN_SansNom2,tabFinalEXPRESS)
  
   
SINON
    Info("Pas dedossier pour ce client")
   
FIN


A l'ouverture de la fenêtre qui liste les dossiers :

PROCEDURE MaFenêtre(gtabCodeclientEXPRESSEXPRESS est un tableau de CDossier dynamique)
    
   
POUR iEXPRESS=1 A gtabCodeclientEXPRESSEXPRESS..Occurrence
       ZoneRépétéeAjouteLigne(ZR_ListedesDossiers,gtabCodeclientEXPRESSEXPRESS[iEXPRESS].codeDossier,gtabCodeclientEXPRESSEXPRESS[iEXPRESS].DateDossier,gtabCodeclientEXPRESSEXPRESS[iEXPRESS].LibelleDossier,gtabCodeclientEXPRESSEXPRESS[iEXPRESS].StatutDossier)
       
  
FIN


Résultat : 

La liste des dossiers obtenue

 On a ainsi créé une application mobile utilisable sous IOS qui permet de récupérer les dossiers du client en fonction de son login. Beaucoup de choses resteraient à faire (sécurité, échantillons, résultats)  mais le schéma de base est identique, c'est le même principe avec des objets différents.


 

mercredi 2 septembre 2015

De nouvelles formules dans le champ tableur de Windev

Le nouveau champ tableur est très utile, mais il peut vous manquer des fonctions mathématiques assez vitales car le nombre de fonctions disponibles par rapport à Excel est enceore limité pour l'instant.

Voici une méthode assez rapide pour ne pas être bloqué.

- Se rendre sur la page du projet math.net, et télécharger le package.

- Dans votre projet Windev, clic droit sur assemblages.net et choisir utiliser un assemblage.net dans le projet. Venir choisir le ficher dll concerné comme ci dessous.



 Créer une procédure globale avec les fonctions que vous souhaitez utiliser comme ci dessous :

PROCEDURE pochisq(df, x sont des numériques)
pclOStats est un "MathNet.Numerics.Distributions.ChiSquared" dynamique

pclOStats=ChiSquared::InvCDF(df,x)

RENVOYER(pclOStats.ToString())

Consultez bien la documentation de la fonction sur le site de math.net pour avoir le détail.
Dans ce cas présent, on utilise une fonction inverse du test du Khi2. La procédure windev ne sert qu'a faire le lien avec la fonction .net, et renvoie la réponse en passant la valeur et le nombre de degrés de liberté.

Vous pouvez utilisez ensuite créer des fonctions utilisables dans vos champs tableurs, par exemple  comme ceci :

PROCEDURE poissoninf(valeur est un numérique)
xAmini est un numérique

SELON valeur
   
CAS <=3
   
    RENVOYER 0   
   
AUTRE CAS
     xAmini=(pochisq((valeur-1)*2+2,0.025))
     RENVOYER xAmini/2
           
FIN

Pensez à rajouter dans le code de la fenêtre contenant votre champ tableur la ligne suivante :

//autorisation des fonctions internes
    TableurAutoriseProcédure(TBLR_FP,"poissoninf"+RC+"poissonsup"+RC+"sensidossier"+RC+"surfacelot"+RC+"volumepreleve"+RC+"incertitudevolume"+RC+"smoyennegrille")

TBLR_FP est le nom de votre champ tableur, et les données entre guillemets "poissoninf" sont les fonctions rendues disponibles dans ce tableur pour vos utilisateurs. Sans cette ligne, vos fonctions ne seront pas disponibles lorsque vous écrivez vos formules dans le tableur.


Ici, dans cette exemple, j'ai créé une fonction poissoninf, qui utilise la fonction pochisq qui elle même appelle une fonction .net. En utilisant cette librairie, tout est réalisable ! c'est très fourni et vous pouvez créer des tableaux de calculs très complexes pour vos utilisateurs !