mercredi, février 12, 2014

Variables de type date et heure initialisées avec la date et heure du jour !!!

Avant une variable date ne contenait rien lors de la déclaration. J'en ai eu marre d'avoir mes variables de type date et heure initialisées avec la date et heure du jour, j'ai donc cherché et j'ai trouvé la fonction du va bien : DateHeureParDéfaut

Permet de définir la valeur par défaut des variables de type Date, Heure, et DateHeure (dixit l'aide)

bien, mais on peut pas passer une chaine vide ou la valeur null....dommage

lundi, février 10, 2014

Permutation : Changer un bouton en lien

Je viens de découvrir les permutations. Pouvoir passer d'un bouton à un lien sans avoir à le recréer.




vendredi, février 07, 2014

Imprimer des états dans une langue différente de l'application

Si on veut faire une édition dans une langue différente de l'application sans modifier la langue de l'application, dans ce cas on utilise la fonction : iNationImpression

WINDEV Mobile 19 : Android/iOS Réplication de données (Réplication Universelle Assistée)

J'attendais la version 19 pour mettre la réplication en place sur des application Android/iOS. Au départ j'avais testé sur Android avec une base abonnée SQLite mais la réplication ne fonctionne qu'avec HFSQL. Pas grave et ça m'arrange.

Pourquoi la Réplication Universelle Assistée et pas la programmée ?

Car la Réplication Universelle Assistée permet de faire de la réplication avec un minimum de code (une dizaine de ligne). La plupart de la configuration s'effectue avec des assistants.

Mise en place 

J'ai réalisé quelques tests en m'appuyant sur la documentation : http://doc.pcsoft.fr/fr-FR/?1000021071. Les étapes sont bien précisées. Juste quelques commentaires :

1 - Installation du serveur de réplication.

L'aide en ligne sur le sujet est bien faite. Il cohabite très bien avec un Serveur d'application WEBDEV.
Si on utilise une base HFSQL classic, il faut penser à donner les droits à "l'invité internet" sur le répertoire des données (base maître).
Si les droits sont pas défini, un message pas très explicite apparaît sur le terminal du type "impossible d'accéder aux fichiers ....".

A noter également, qu'il n'est pas nécessaire de créer des comptes. Celui par défaut est largement suffisant.

Dans le volet publication, on peut ajouter une publication. Attention : le nom de l'application que l'on donne doit être identique au nom du fichier .wer (sans l'extension)

2 - Définition de la réplication. (ReplicEdit)

Pas de problématique, a part pour les pamaètres. Dans la description d'un fichier de données, onglet "Filtre". Si on souhaite mettre un paramètre, il faut bien dans la combo seléctionner "Nouveau Paramètre" exemple :


Autre chose également, si utilisation d'une base HFSQL classic, ne pas oublier de définir le répertoire de la base maître dans le menu "Réplication...Description de la réplication" onglet "Fichiers maîtres"

Si utilisation d'une base HFSQL client/serveur. Il faut avant même de lancer ReplicEdit avoir une connexion décrit dans l'analyse sinon c'est rapé.

3 - Publication

On peut le faire dans l'administrateur du serveur de réplication ou depuis ReplicEdit. Attention à la fin de l'assistant on propose un code. celui-ci ne contient ni le nom de la réplication, ni le login, ni le mot de passe défini dans l'assistant.

4 - Programmation dans WINDEV Mobile.

tout le code est donner dans l'aide. Attention à réplicSynchro dans le cas d'un replica immédiat, bien définir le deuxième paramètres ReplicaImmédiat. Sinon on a l'impression que ca marche pas.

Conclusion

Le résultat est assez bleuffant. Ajout, modification, suppression (par swipe) depuis une même application avec deux configuration de projet Android et iOS. Un code unique. Pas testé avec WINDEV et WEBDEV mais d'après la doc le code ne change.

Pour les tests j'ai utilisé que quelques fichiers avec 2 ou trois paramètres, on va voir à à l'usage...

par contre si Modification automatique des fichiers de données ou modification du .wer, ben à priori rien de prévu. Je pense qu'il faut refaire un ReplicInitialise après avoir fait un HModifieStructure. Mais bon cette dernière focntion ne me dit pas si la structure à vraiment changer ou pas.

Je sais pas comment vais faire pour l'instant. Mais on va tester....







vendredi, janvier 31, 2014

WINDEV Editeur de code : Sélection en colonne

La sélection en colonne dans l'éditeur de code est très pratique. Voici une petite vidéo rapide .
voir aide : http://doc.pcsoft.fr/fr-FR/?2010031#NOTE4_1


jeudi, janvier 30, 2014

WLangage : Opérateur Dans

L'opérateur DANS permet de comparer une valeur à une liste de valeurs. Son évaluation renvoie un booléen. très pratique et évite les opérateur _OU_ ou _ET_.

Si Mavaleur DANS(5,6,7) alors
         // trt

Fin

mercredi, janvier 29, 2014

Zone Répétée et Rupture : Comment récupérer le premier élément de la rupture ?

Dans une Zone Répétée avec rupture si on double clic sur une rupture l'indice renvoyé par (ou ZoneRépétéeSelect) est soit l'indice de la première ligne ou l'indice de la ligne sélectionnée par l'utilisateur.

Pour récupérer l'indice de la première ligne de la rupture, il faut :
- Ajouter le code optionnel :
Bouton Gauche double-clic



avec le code suivant :

ZoneRépétéeSelectPlus ( ZoneRépétée1 , ZoneRépétéeInfoXY ( ZoneRépétée1 , tiNumLigne , SourisPosX (), SourisPosY ()))


Cela va forcer la sélection de la première ligne de la rupture

Champ calendrier : Comment "déselectionner" toutes les dates sélectionnées par programmation

Le champ calendrier, avec l'option "Sélection de période" dans l'onglet détail de la description du champ calendrier, permet de sélectionner une période. le code est alors du type :

CAL_SansNom1..DateDébut = "20140115"
CAL_SansNom1..DateFin = "20140129"

Pour désélectionner une période il faut faire :

CAL_SansNom1..DateDébut = ""
CAL_SansNom1..DateFin = ""

Si le calendrier est avec l'option : "Selection multiple" alors dans ce cas il faut utiliser la fonction CalendrierSelectMoins() :

Sélection de date :
CalendrierSelectPlus(CAL_SansNom1,"20140115")
CalendrierSelectPlus(CAL_SansNom1,"20140120")
CalendrierSelectPlus(CAL_SansNom1,"20140122")

Dé sélection de date :

CalendrierSelectMoins(CAL_SansNom1,"20140115")
CalendrierSelectMoins(CAL_SansNom1,"20140120")
CalendrierSelectMoins(CAL_SansNom1,"20140122")

Voir les fonctions de manipulations du champ calendrier : cliquer-ici

mercredi, septembre 08, 2010

WEBDEV - Afficher une image dans un champ de saisie

Je viens de visiter une site sympa ou le formulaire de contact m'a plu. J'ai donc décidé de le refaire en WEBDEV.

Objectif réaliser ceci :

Dans WEBDEV on commence par créer deux cellules. La première avec un fond blan uni et la seconde avec les paramètres suivants :

Ensuite il faut définir la couleur de CEL_Form et mettre l'image à droite :

Puis ajout des champs de saisie et pour chaque champ de saisie on créer un style au projet


et on place le code CSS :

dans chaque champ de saisie on aura le code css suivant :

background-image: url(c-icons.png);

background-repeat: no-repeat;
padding-left: 20px;
border: 1px solid #BFBFBF;

puis pour chaque champ on ajoutera un code css spécifique :
Nom : background-position: 3px 4px;
Email : background-position: 3px -15px;
Site web : background-position: 3px -37px;
sujet : background-position: 3px -57px;

cette ligne idique quelle partie de l'image il faut afficher dans le champ, car on fait référence qu'a une seule image c-icons.png :


C'est presque fini. Il reste le champ de saisie pour le messge. Pour celui-ci on aura qu'une ligne CSS à mettre :
border: 1px solid #BFBFBF;

Et pour le bouton le style CSS sera le suivant :
color: white;
background: #2E6DA3;
border: none;

On pourrait presque se passer du code CSS et mettre le tout dans les ongles texte et fond su style.

ATTENTION : les modifications de style CSS ne seront visible qu'en exécution...

vendredi, août 20, 2010

comment géolocaliser une adresse et la centrer avec WEBDEV (Google Maps v3) ?

Voici une petit code javascript qui s'utilise avec le code déjà publier dans le billet suivant "WEBDEV 15 - Google maps v3" .

Dans la collection de procédure : pGestionCartes ajouté la procédure suivante :

function RechercheCoordonneesDepuisAdresse(sAdresse, sNomFonction)
{

// On a récupéré le nom de la fonction sous forme de chaîne, donc on récupère maintenant le pointeur sur cette fonction
var objFonction = eval(sNomFonction);
//alert(objFonction);
var geo = new google.maps.Geocoder();
geo.geocode({'address': sAdresse},objFonction);
}

sNomfonction est une fonction WLangage navigateur local à la page par exemple. Voici un exemple de fonction :
function LocalRetourRecherche(res,stat) /
{
var coordonnee = null;
if (stat == google.maps.GeocoderStatus.OK){
gObjCarte.setCenter(res[0].geometry.location);
var coordonnee = res[0].geometry.location;
//Pour le debuguage de lappli
var marke = new google.maps.Marker({position: coordonnee, map: gObjCarte, title: "adress" });
}else {
alert("Geocode was not successful for the following reason: " + stat);
}
}

Les deux paramètres (res et stat) sont passés automatiquement par la méthode geo.geocode.

mercredi, juillet 21, 2010

WEBDEV 15 - Google maps V3

Pour afficher une carte Google maps v3 dans un site WEBDEV, je me suis inspiré de l'exemple WW_Cartes de la LST 72.

Pour passer en v3 des APIs google maps, il faut bien évidement consulter la doc :

A partir de cette introduction et de la doc des API (http://code.google.com/intl/fr-FR/apis/maps/documentation/javascript/reference.html) on peut commencer dans WEBDEV.

Dans l'onglet avancé de la description de la page mettre :


Dans cette page, mettre un champ libellé HTML et dans le code d'initialisation de ce dernier mettre le code suivant :



Ce code permet d'afficher la carte sur tous les navigateurs. Sans ce code sous chrome la carte prends tout le navigateur.

Ensuite dans le code Onload de la page mettre le code :

gObjCarte est un entier
CreerCarte("CARTE", 0,180)

La variable gObjCarte est utilisée dans plusieurs fonction de manipulation de la carte elle est donc déclarer en global navigateur.

Pour une facilité d’utilisation et de réutilisation création d’une collection de procédure dans les procédures globales navigateur

Nom de la collection : pGestionCartes

La procédure est écrite en javascript. Il faut donc cliquer sur WL après création de la procédure

Création de la carte :

// Résumé : Création de la carte google map

// Syntaxe :

//CreeCarte ()

//

// Paramètres :

// sNomChampCarte : Nom du champ HTML (..alias ou id défini dans DIV)

// nlat : latitude du centre de la carte

// nlong : longitude du centre de la carte

// Valeur de retour :

// Aucune

//

function CreerCarte(sNomChampCarte,nlat,nlong)

{

if (nlat==0){

nlat = 48.856558;

};

if (nlong==0){

nlong = 2.350966;

};

// Création de la carte

var latlng = new google.maps.LatLng(nlat, nlong);

var myOptions = {

mapTypeControl: true,zoom: 5, center: latlng, mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU},navigationControl: true,mapTypeId: google.maps.MapTypeId.ROADMAP

}

// création de la carte

gObjCarte = new google.maps.Map(document.getElementById(sNomChampCarte),myOptions);

}

lundi, décembre 22, 2008

WinDev 14 : Table avec colonne Conteneur

Les colonnes de type conteneur permettent une plus grande liberté d'affichage :


Dans la description du champ, il suffit d'indiquer dans la colonne concernée, son type et de définir un champ principal. Utile pour le tri sur la colonne.

Ensuite, il faire un Drag&Drop dans champs (disponibles dans la deuxième barre d'outil de l'éditeur de fenêtre) et de les placer dans la colonne de type conteneur.
Pour alimenter la colonne conteneur par programmation, il faut utiliser l'indice de l'élément ajouter dans la table :

exemple de code :
i est un entier
POUR TOUT CLIENT SUR NomClient
i = TableAjouteLigne(MoiMême,0,"","")
TABLE_Table1.COL_Client[i].LIB_NOM_Prénom = CLIENT.NomClient
TABLE_Table1.COL_Client[i].LIB_Adresse1 = CLIENT.Adresse1
TABLE_Table1.COL_Client[i].LIB_Adresse2 = CLIENT.Adresse2
TABLE_Table1.COL_Client[i].LIB_CP_Ville = CLIENT.CodePostal+" "+CLIENT.Ville
FIN

Les champs LIB_xx sont placés dans une colonne de type conteneur.

samedi, décembre 20, 2008

Tracer un chemin avec les fonctions Google de Windev 14

Il est possible de tracer un chemin avec la fonction gglrecupèreCarte. Il faut pour cela utiliser tous les paramètres de la fonction. Quelques difficultés peuvent être rencontrées, voir astuces en bas de cet article.

Il faut déterminer les différents paramètres du trait de la structure gglParamètreCarte. De plus il faut déterminer un marqueur si vous utilisez le zoom automatique (la zone ne fonctionne pas contrairement au message d'erreur affiché dans le cas où aucun marqueur n'est défini)
Ici j'ai utilisé un tableau de structure pour les différents points du tracé. Ce qui a permis d'utiliser les [ ] pour le remplissage du tableau dynamique.
Le POUR TOUT ELEMENT est très pratique pour le parcours du tableau.
Remarquez également l'utilisation de la fonction Ajoute pour ajouter un élément à un tableau. On aurait pu aussi utiliser la fonction TableauAjoute.

Voici le code utilisé lors du clic sur le bouton :

point est une structure
lat est un réel
longi est un réel
FIN

cléGoogle est une chaîne = "VotreClé"
Chemin est un gglParamètreCarte
stUnPoint est un point
sCoord est un gglCoordonnée
tabCoord est un tableau de 0 point
Trajet est un gglChemin
UnMarq est un gglMarqueur

// définition du trait
Chemin.Chemin..Couleur = iRougeFoncé
Chemin.Chemin..Epaisseur = 2
Chemin.Chemin..Opacité = 100

//définition du tableau de point
tabCoord = [[40.7078,-74.0021],[46.7140,-56.3968],[51.0165,-29.5967],[51.1067,-25.1016],
[49.8997,-6.1730],[48.9577,2.1423]]
// définition des points du tracer
POUR TOUT ELEMENT stUnPoint DE tabCoord
sCoord.Latitude = stUnPoint.lat
sCoord.Longitude = stUnPoint.longi
Ajoute(Chemin.Chemin..Point,sCoord)
FIN
Chemin.Format = gglJPG
// quand on met un Zoom auto il faut préciser une Zone ou un marqueur
// mais marche pas avec une zone alors on met un marqueur
//chemin.Zone.Latitude = 40.7078
//chemin.zone.Longitude = -74.0021
// définition du marqueur
UnMarq.Latitude = 40.7078
UnMarq.Longitude = -74.0021
UnMarq.Taille = gglPetit
Ajoute(Chemin.Marqueur,UnMarq)
IMG_Image1=GglRécupèreCarte(cléGoogle,40.7078,3.9483,gglZoomAuto,600,400,gglHybride,Chemin)

CAS ERREUR:
Erreur(ErreurInfo(errComplet))


ASTUCES :
Lorsque Google ne renvoie pas la carte, il n'y a pas de message d'erreur, rien ne se passe. Donc si lors du clic sur le bouton, vous avez tout de suite la main sur l'appli, c'est que vous avez trop de points.

Il faut faire attention au nombre de point du tracé. En effet on est limité à 100 points, sauf que celui-ci diminue si on met des marqueurs. Donc si la carte ne s'affiche pas, c'est que vous dépassez le nombre de points. Dans mes tests en mettant 7 marqueurs, je n'ai pu mettre que 70 points au tracé.

Le cas erreur, c'est la gestion automatique des erreurs, inutile de le saisir directement, vous aurez une erreur. Il faut cliquer sur le lien "Si erreur : par programme" du pcode pour avoir le "cas erreur".


Attention :
Si vous utilisez la syntaxe Chemin.Chemin..Point, vous ne pouvez pas l'utiliser dans la fonction Ajoute, il faudra écrire Chemin.Chemin.point. (signaler au ST)

Vous ne pouvez pas non plus utiliser les [] pour remplir un tableau de structure si vous avez déclaré votre tableau : tab est un tableau dynamique de 0 gglCoordonnées (signaler au ST).
C'est pour ca que dans le code il y a une déclaration d'une structure "Point".

Utilisation des fonctions google en WinDev 14

Pour afficher une carte dans un champ image, il faut utiliser les fonctions gglRecupèreCarte et la structure gglCoordonnée. De plus une fonction bien utile pour trouver les coordonnées géographiques d'une ville ou une adresse : gglAdresseVersCoordonnées.

Pour utiliser les fonctions google, il faut s'inscrire sur le site de Google afin d'obtenir la clé indispensable pour la récupération de carte.

Voici les quelques ligne de code pour obtenir ce résultat :
cléGoogle est une chaîne = "Votre clé"
sCoord est un gglCoordonnée

sCoord = GglAdresseVersCoordonnées(cléGoogle,SAI_Adresse)

IMG_Image1 = GglRécupèreCarte(cléGoogle,sCoord.Latitude,sCoord.Longitude,12,631,408,gglHybride)

Astuce : attention au zoom, il va de 0 à 19, toutefois à 19, si google ne peut pas fournir ce niveau de détail, il se passera rien dans votre fenêtre. par conséquent indiquer un niveau de détail normal.

vendredi, mai 16, 2008

Comment connaitre la taille en pixel d'une chaine de caratère

La fonction TexteLargeur permet de connaitre la taille en pixel d'une chaine de caractère.
Toutefois, cette fonction admet en premier paramètre un champ de saisie.
De plus il faut faire attention à la police utilisé.

Si par exemple vous créez la police suivante :

polPolice est une Police
polPolice = PoliceCrée("Tahoma", 7, iNormal, iNoir)

Il faut alors associé la police au champ de saisie :

SAI_Saisie1..Police = polPolice

Ensuite :

NbPixel = TexteLargeur(SAI_Saisie1,"Ma chaîne")

vendredi, janvier 18, 2008

WinDev 12 – Splitter une chaîne dans un tableau

Voici une procédure qui permet de mettre les valeurs d'une chaîne de caractères séparées par un séparateur défini, dans un tableau :

// Résumé : Permet de remplir un tableau de chaine à partir d'une chaine et d'un séparateur

// Syntaxe :

//[ = ] Split ( est chaîne, est chaîne [, est booléen [, est entier]])

//

// Paramètres :

// sChaineCara (chaîne) : Chaine de caractères à splitter

// sSeparateur (chaîne) : Le séparateur à utiliser

// bTrié (booléen - valeur par défaut=0) : Faux (valeur par défaut) le tableau n'est pas trié, vrai pour avoir un tableau trié

// pType (entier - valeur par défaut=1) : Type de trie : ttCroissant ou ttDécroissant

// Valeur de retour :

// tableau : // Tableau contenant les valeurs de la chaine passée en paramètre.

//

// Exemple :

// tabSP est un tableau dynamique de 0 chaines

//

// tabSP = Split("toto;abc;zoro;aab;tata",";",Vrai,ttCroissant)

PROCEDURE Split(sChaineCara est une chaîne, sSeparateur est une chaîne,bTrié est un booléen = Faux,pType est un entier = ttCroissant)

tabSplit est un tableau dynamique de 0 chaînes

s est une chaîne // variable de boucle

POUR TOUTE CHAINE s DE sChaineCara SEPAREE PAR sSeparateur

TableauAjouteLigne(tabSplit,s)

FIN

SI bTrié ALORS

SI pType = 0 ALORS pType = ttCroissant

TableauTrie(tabSplit,pType)

FIN

RENVOYER tabSplit

Exemple d'utilisation :

tabSP est un tableau dynamique de 0 chaîne

tabSP = Split("toto;abc;zoo;aab;tata",";",Vrai,ttCroissant)

mardi, janvier 15, 2008

WinDev 12 - Utilisation de MesParamètres

Cette instruction WLangage permet de passer autant de paramètres à une procédure que l'on souhaite grâce à l'opérateur *.

Exemple :

PROCEDURE Calcul(pParam1, *)

Dans cette procédure * représente les autres paramètres possibles.

Ces paramètres optionnels sont accessibles via l'instruction MesParamètres.

Le plus intéressant, avec cette instruction, c'est que l'on peut accéder à des propriétés d'un objet. Par exemple si on veut modifier la visibilité d'une colonne dans une procédure globale on peut passer en paramètre à la procédure le nom complet de la colonne :

Exemple code :

// Code d'un bouton
ModInterface(Fen_Fenêtre1.Table1.Col_Colonne1, faux)

PROCEDURE ModInterface(*)

MesParamètres[1]..visible = MesParamètres[2]

mercredi, octobre 17, 2007

WebDev - Récupérer le User name Windows de l'internaute

Si vous saisissez cette URL : http://localhost/?user=%USERNAME% vous verrez apparaitre le nom d'utilisateur du poste dans l'URL. (Seulement valable sous IE)

Il est donc possible grâce à une applet Java de récupérer cette information. Dans la LST 68 page 35, l'exemple WD Applet FTP permet de le faire.

Dans l'applet la fonction RéseauUtilisateur() permet de récupérer le nom d'utilisateur Windows.

Dans le site WebDev une fonction Javascript permet de récupérer la valeur de la variable.

p, class: MsoNormal

mercredi, septembre 12, 2007

Achat sur Internet : PCSOFT lance la commande en ligne

Je viens de voir sur le site de PC SOFT, la possibilité d'acheter des produits en ligne.
Sur la page tarif, on peut se constituer un panier et régler par carte bancaire via paybox.

Depuis le temps qu'on attendait cette possibilité, c'est enfin une réalité.

lundi, septembre 10, 2007

Créer la database sur MySQL avec WinDev, WebDev

N'ayant pas trouvé comment créer la database MySQL avec l'accès natif, je me suis reporté sur la connexion ODBC
Lors de la connexion avec l'accès natif, il faut préciser le nom de la base. Il est donc necessaire d'utiliser PHPMyAdmin ou SQLylog pour créer la base.
Je souhaitais créer par programmation la database puis lancer le script des tables.

La fonction SQLConnecte permet d'effectuer ce traitement si on utilise la connexion ODBC.

Voici le code permettant de créer la database :

id est un entier = SQLConnecte("MysqlODBC","root","mdp","","ODBC ",hODBC)
SI id <> 0 ALORS
sNomDatabase est une chaîne = "Database"
// création de la base de données
sSql est une chaîne = "CREATE DATABASE IF NOT EXISTS %1"
sSql = ChaîneConstruit(ssql,sNomDatabase)
// execution de la requête
SI PAS SQLExec(ssql,"REQ") ALORS
SQLInfoGene()
Erreur("La Database n'a pas pu être créée. Code erreur : " + SQL.Erreur +RC+...
SQL.MesErreur)
FIN
SINON
// La connexion a échoué : affichage d'un message explicatif
SQLInfoGene()
Erreur("La connexion à la source de données" + "localhost" + ...
"a échoué."+RC+...
"Code erreur : " + SQL.Erreur +RC+...
SQL.MesErreur)
FIN
// Dans tous les cas (connexion OK ou pas)
SQLDéconnecte()

Ensuite on peut utiliser les fonctions "H*" avec l'accès natif MySQL.
Un peut contraignant, car il faut le drivers ODBC d'installé sur le poste.