Affichage des articles dont le libellé est WinDev. Afficher tous les articles
Affichage des articles dont le libellé est WinDev. Afficher tous les articles

mercredi, mars 19, 2014

Modèle de champ avec Menu contextuel

Dans un modèle de champ si vous ajoutez un menu contextuel, ce dernier sera copié dans la fenêtre lors de l'insertion de champ modèle de champs. Or lorsque l'on supprime ce champ modèle de champ, le menu contextuel n'est pas supprimé de la fenêtre par conséquent, dans certain cas, des erreurs de compilation peuvent apparaître sur des variables globales du modèle champ.

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 !!!

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

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.

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]

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.

lundi, août 06, 2007

WinDev 11 . Procédures Stockées MySQL 5.x

Pour utiliser les procédures stockées avec MySQL 5.x, il faut tout d'abord avoir l'accès natif MySQL dernière version. C'est à dire la version 46b.

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

J'ai voulu faire l'équivalent de "démarrer...exécuter" de Windows, avec une combo dans WinDev 11.






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.

Le « PersoMenu » permet de lancer n'importe quel exécutable à partir de l'éditeur grâce à une ligne de commande et des macros.

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