Plein d'infos sur WinDev, WebDev et WinDev Mobile et d'autres choses aussi. N'hésitez pas me laisser des commentaires ou des suggestions.
mercredi, mars 19, 2014
Modèle de champ avec Menu contextuel
Astuce, dans le menu contextuel, dans le code des options de menu, ne pas utiliser directement les variables globales du modèle. Il faut mieux faire l'appel du procédure local au modèle qui effectuera le traitement.
En cas de suppression du modèle de champs dans la fenêtre, ne pas oublier du supprimer également le menu contextuel.
mercredi, février 12, 2014
Variables de type date et heure initialisées avec la date et heure du jour !!!
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
vendredi, février 07, 2014
Imprimer des états dans une langue différente de l'application
WINDEV Mobile 19 : Android/iOS Réplication de données (Réplication Universelle Assistée)
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
voir aide : http://doc.pcsoft.fr/fr-FR/?2010031#NOTE4_1
jeudi, janvier 30, 2014
WLangage : Opérateur Dans
mercredi, janvier 29, 2014
Zone Répétée et Rupture : Comment récupérer le premier élément de la rupture ?
Pour récupérer l'indice de la première ligne de la rupture, il faut :
- Ajouter le code optionnel : Bouton Gauche double-clic
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
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
lundi, décembre 22, 2008
WinDev 14 : Table avec colonne Conteneur

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.
vendredi, mai 16, 2008
Comment connaitre la taille en pixel d'une chaine de caratè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 :
//[
//
// 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]
lundi, septembre 10, 2007
Créer la database sur MySQL avec WinDev, WebDev
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.
lundi, août 06, 2007
WinDev 11 . Procédures Stockées MySQL 5.x
Vous trouverez l'accès natif à l'adresse suivante :
http://www.pcsoft.fr/st/telec/modules-communs-11/mysql.htm
Soit un fichier client :
Version : Serveur MySQL 5.0.45
- Exemple de procédure stockée avec passage de paramètres :
1 – Création de la procédure stockées sur le serveur
sProc est une chaîne = [
"DROP PROCEDURE IF EXISTS `procstok`.`simpleproc1` ;
CREATE PROCEDURE simpleproc1 (OUT param1 INT) BEGIN SELECT COUNT(*) INTO param1 FROM client; END;
]
scReq est une Source de Données
// Exécution de la requête
SI PAS HExécuteRequêteSQL(scReq,MaConnexion1,hRequêteSansCorrection,sProc) ALORS
Erreur()
SINON
Info("Procédure stocké créée")
FIN
2 – Exécution de la procédure stockée :
sdReq est une Source de Données
SI PAS HExécuteRequêteSQL(sdReq,MaConnexion1,hRequêteSansCorrection,"call simpleproc1(@a);select @a;" ) ALORS
Erreur()
SINON
Info("Gagné")
// Lecture du résultat de la procédure
HLitPremier(sdReq,hSansRafraîchir)
Trace(sdReq.@a)
FIN
NOTE : la constante hSansRafraîchir permet de ne pas ré-exécuter la requête.
jeudi, juin 28, 2007
CCNG très utile.
Le lecteur de news (LST 68) intégré aux éditeurs PC SOFT, en vraiment très pratique, si l'on utilise l'option "Afficher uniquement les messages non lu", car j'avais mis en suivi un message concernant le calcul de clé de lettre recommandé qui date du mois d'avril.
Récemment une réponse a été faite. Du coup j'ai été notifié et en plus les messages apparaissent dans la liste. Pas besoin d'effectuer de recherche, tout est là.
Code-Cible Conditionnel
Très utile lors de création de procédure utilisable dans WinDev, WebDev et WinDev Mobile.
Le Code-Cible Conditionnel permet de mettre un code différent en fonction de la plateforme choisie.
Ainsi une procédure créer en WinDev, avec l'utilisation de fonction non disponible en WebDev pourra être utilisée grâce au code cible.
Exemple la fonction "Dialogue" n'est pas disponible en WebDev. Donc dans WinDev on mettra les codes suivants.
Conseil : Bien suivre l'aide pour ajouter les zones de code-cible conditionnel.
jeudi, avril 05, 2007
Demarrer...Executer dans une Combo WinDev

A chaque saisie de caractère, la combo propose les fichiers et répertoires commençant par ce caractère. Une sorte de saisie assistée.
Voici le code Utilisé :
Le code d'entrée de la combo.

Code à chaque modification de la combo :
ch est une chaîne = MoiMême..ValeurAffichée // Recupération de la valeur saisie dans la combo
pos est un entier = Position(ch,"\",0,DepuisFin) // Position du curseur.
SI Taille(ch) >= 2 ALORS // A partir du deuxième caractère on recherche les fichiers et répertoires
// Suppression du contenu de la combo
POUR i = ListeOccurrence(MoiMême) A 1 PAS -1
ListeSupprime(MoiMême,i)
FIN
SI ListeOccurrence(MoiMême) > 0 ALORS ListeModifie(MoiMême,"",1)
// Le premier caractère doit correspondre à une unité de disque : de A à Z
SI Asc("A") < pertoire =" fRep(ch+">""
// Liste des répertoires
ListeAjoute(MoiMême,ch[[1 A 2]]+["\"]+ch[[3 A pos]]+["\"]+sRépertoire)
// Répertoire suivant
sRépertoire = fRep("", frRépertoire)
FIN
// Ajout des fichiers qui sont à la racines
ListeAjoute(MoiMême,fListeFichier(ch+"*",frNonRécursif))
// Ouverture de la combo
ComboOuvre(MoiMême)
FIN
FIN
Code de Sélection de la Combo :

la propriété ..Curseur permet de positionner le curseur à la fin de la chaine saisie
jeudi, janvier 04, 2007
PersoMenu WinDev, WebDev et WinDev Mobile.
Dans le billet précédent, je parlais de WebDev 11 (35c) qui ne configurait pas le serveur Apache 2.2.3 automatiquement.
J'ai donc fait un programme en Wlangage permettant d'ajouter l'alias pour chaque site dans le fichier httpd.conf.
Puis dans WebDev j'ai créé un Perso menu :
La ligne de commande est la suivante :
"D:\Projet\ModifHttpd.conf\Exe\ModifHttpd_conf.exe" "C:\Program Files\Apache Software
Foundation\Apache2.2\conf\httpd.conf" "{$RepProjet}"
{$RepProjet} : c'est une macro disponible est cliquant sur le bouton « Macro ». Elle renvoie le chemin du répertoire du projet.
ModifHttpd_conf.exe : Mon programme WinDev permettant d'ajouter l'alias au fichier httpd.conf.
Astuce : Dans l'aide il n'est pas précisé comment créer une ligne de commande avec un chemin d'accès contenant des espaces. Le plus simple est de tester la ligne de commande dans « Demarrer...executer » de windows.
Code du programme WinDev « ModifHttpd_conf.exe » :
// Code de déclaration global du projet
LOCAL
gsRes est une chaîne
gnIdFic est un entier
gsCheminFic est une chaîne
gsALias est une chaîne
gsNomSite est une chaîne
gbRes est un booléen
// exemple de ligne de commande:
//"D:\Projet\ModifHttpd.conf\Exe\ModifHttpd_conf.exe" "C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf" "C:\WebDev 11\Exemples\Exemples complets\WW_Editeur_HTML"
gsCheminFic = LigneCommande(1) //C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf
gsALias = LigneCommande(2) //C:\WebDev 11\Exemples\Exemples complets\WW_Editeur_HTML
// Ligne de code pour test
SI EnModeTest() ALORS
gsCheminFic = "C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf"
gsALias = "C:\WebDev 11\Exemples\Exemples complets\WW_Editeur_HTML\"
FIN
SI gsCheminFic <> "" ALORS
// Ouverture du fichier httpd.conf
gnIdFic = fOuvre(gsCheminFic,foAjout)
SI gnIdFic <> -1 ALORS
SI gsALias <> "" ALORS
// On rajoute _WEB au chemin du site
SI Droite(gsALias,1) = "\" ALORS
gsALias = gsALias[[1 A (Taille(gsALias)-1)]]
FIN
gsNomSite = ExtraitChaîne(gsALias,1,"\",DepuisFin)
gsNomSite = "/"+Majuscule(gsNomSite)+"_WEB/"
// Change les \ en /
gsALias = Remplace(gsALias,"\","/")
// On construit le chemin complet
gsALias = gsALias+gsNomSite
// Construction de la chaîne à ajouter au fichier httpd.conf
gsRes = [
Alias %1 "%2"
Options None
AllowOverride None
Order allow,deny
Allow from all
]
gsRes = RC+ChaîneConstruit(gsRes,gsNomSite,gsALias)
// Écriture dans le fichier
gbRes = fEcritLigne(gnIdFic,gsRes)
SI PAS gbRes ALORS
Erreur()
FIN
fFerme(gnIdFic)
// Redemarrer le serveur.
sr est une chaîne = [
"%1" "%2"
]
sr = ChaîneConstruit(sr,"C:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe","-k restart")
LanceAppliAssociée(sr)
SINON
fFerme(gnIdFic)
gsRes = [
"%1"
]
gsRes = ChaîneConstruit(gsRes,gsCheminFic)
// que sous windows
LanceAppliAssociée(gsRes)
FIN
FIN
FIN





