Présentation Francis Faure Support Plan du site Partenaires

AtoutFox

Contributions AtoutFox

Contributions AtoutFox

Retrouvez ci-après un extrait des dernières contributions postées sur AtoutFox

 

 ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO 

RSS © www.atoutfox.org - Contributions

Redimensionne plein écran un formulaire
Modifie les caractérisques géométriques des objets d'un formulaire proportionnelement, pour l'afficher plein écran.
Dans la méthode Activate du formulaire.
A relancer à chaque modification ou ajout d'objet.


Remarque : certains objets ont des caractéristiques qui sont définies par défaut (on le remarque rapidement) :
Il faut revenir dans les propriétés de l'objet du source pour le saisir "en dur", et hop !

Modifie les caractéristiques d'un formulaire proportionnellement
Modifie les caractéristiques d'un formulaire avec un ratio en X et en Y
Exemple : pour passer d'un formulaire développé pour écran 800 X 600 à un 1280 X 1024

=taille_ecranxy ("form1", 1280/800, 1024/600, "form2")

Ouvre le source et modifie dans les champs "properties" des objets les caractéristiques dimensionnelles

Remarque : certains objets ont des caractéristiques qui sont définies par défaut (on le remarque rapidement) :
Il faut revenir dans les propriétés de l'objet du source pour le saisir "en dur", et hop !


Créer un VCX par programme
VFP permet de créer des formulaires visuellement (SCX) basés sur des classes Visuelles (VCX)

l'objet de cet exercice est de créer par programme (PRG) une classe form dans un VCX et de créer un SCX basé sur cette classe form

Cela à déjà été traité dans l'article :
http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000752


Ce complément permet de créer une classe form : avec, en plus, des propriétés et des méthodes personnalisées

Calculer la distance entre 2 adresses, et montrer l'itineraire complet
Cette demande a ete fait par un programmeur foxpro sur un autre newgroup.
La methode est vide.




Créer une bibliothèque de classes pour le Web
La plupart des articles qui traitent de la création de bibliothèques de classes personnalisées sont beaucoup plus documentés pour les contrôles Winform que pour les controles de page aspX.
On m'a donc demandé, au cours d'une formation StrataFrame, de détailler le mode opératoire pour créer une bibliothèque de classes pour le Web.

Dans cet article, j'essaie de donner un aperçu des différentes étapes, depuis la création du projet jusqu'à l'utilisation des classes créées dans cette bibliothèque sur une page web aspX.

Je vous souhaite une bonne lecture...

Cet article a été publié initialement sur StrataFrame.fr


1 & 2 octobre 2011 à Caumont
Bureau du 1er et 2 octobre 2011.

Le bureau de l'association s'est réuni à Caumont sur Durance, pour compléter ses réunions MSN hebdomadaires.
La réunion s'est tenue chez Francis, que nous remercions encore pour son accueil (on n'oublie pas Valérie pour l'intendance générale, la disponibilité et le sourire).

Étaient présents Francis, François, Jean-Claude, Marc, et Michel.
Pendant ces deux jours, le bureau a discuté les points suivants :

· Fonctionnement administratif de l'association

Toutes les opérations comptables de l'exercice sont bien saisies sur le logiciel de compta que nous avons acheté.
Nous décidons de la clôture du 2ème compte bancaire (CIC) pour ne conserver qu'un compte courant pour l'association.
François est chargé de la mise en ouvre de cette délibération.
Les PV nécessaires à cette opération sont rédigés et signés.

La fonctionnalité de paiement en ligne (avec PayPal) sera ajoutée au site web ; Francis traite ce dossier.

· Rencontres Atoutfox Afrique 2012

Les Rencontres Afrique seront organisées en Tunisie, vers novembre 2012.
Éric nous a informés de sa volonté et de sa disponibilité pour les organiser, le bureau accepte avec plaisir. Le format précis de ces Rencontres sera défini ultérieurement.

· Conférences de Mike Gagnon

Mike Gagnon nous a proposé de donner gracieusement une journée complète de conférences.
Cette journée AtoutFox « 100% VFP avec Mike Gagnon ! » aura lieu le 27 juin à Paris.
Francis est chargé de suivre cette opération.

· Rencontres AtoutFox 2012.

Le bureau discute du format des Rencontres et décide d'ajouter cette année un espace dédié aux éditeurs.
Ils pourront ainsi présenter leurs produits avec leur démarche commerciale personnelle, sans qu'il y ait de confusion avec les sessions ordinaires.
Le format sur 2 jours est conservé (incluant l'AG de l'association en fin de 2ème journée).

Les Rencontres auront lieu les 22 et 23 mars à Reims.

Une première liste de thèmes potentiels est ébauchée.
Cette liste sera étendue et précisée après dépouillement du sondage de préparation.
Il est décidé de donner à ce sondage un caractère plus ouvert, pour permettre une expression de chacun plus individualisée.

Le soleil était au rendez-vous, l'ambiance studieuse et amicale.
AtoutFox avance !

copier une base de données en renommant le DBC
Bonjour à toutes et à tous

J'avais besoin pour un client de faire une copie de toute la base de données et de renommer cette dernière afin que le programme initial puisse accéder soit à une base, soit à l'autre, soit au deux en même temps

Une simple copie n'aurait pas suffit, puisque les deux bases doivent porter un nom différent et ce nom est intégré dans chaque table dans l'entête.

Grace à notre excellent forum, ( Vive atoutfox) Francis m'a fait connaitre ce lien
http://www.tek-tips.com/faqs.cfm?fid=1671

J'ai téléchargé ce programme et l'ai corrigé.

attention :
Le programme ne copie pas la valeur par défaut mise dans un champs
il faut le faire à la main.
Pour ma part, j'ai des champs identifiant, qui sont par défaut le padl(idint,10,"0") (pour des raisons de compatibilité descendentes )
c'est pourquoi j'ai rajouté les lignes
For e=1 To Fcount()
If Alltrim(Lower(Field(e)))=="identifiant"
cmd = " ALTER table " + atables(i) + " alter COLUMN identifiant c(10) DEFAULT PADL(idint,10,'0')"
&cmd
Endif
Endfor

AXE d'amélioration à apporter :

parcourir les champs des tables initiales afin de mettre la valeur par défaut correspondantes dans les champs des tables de destinations.

Bonne journée à toutes et à tous

Eric




VFP video lan player - Activex - VLC et Visual Foxpro
Au départ , j'ai crée ce projet afin de pouvoir docker une fenetre dans l'IDE de VFP, pour visionner des films lors des developpements, puis je l'ai integré dans une application.

Video Lan est un puissant lecteur media , qui permet de lire tous les formats media du marché.
Ce programme vous montre comment piloter l'activeX de VLC.

Cependant les dernières versions pour des raisons inconnues ne fonctionne pas , il vous faudrat vous procurer ici
la version 1.0.5 pour faire fonctionner correctement VLC avec visual Fox Pro.

Voici la version à installer sur le serveur de vlc.

http://download.videolan.org/pub/videolan/vlc/1.0.5/win32/

Amusez vous bien !

ps : je voulais signaler que j'ai été obligé de mettre un timer pour gérer la position et le temps de la video,
car ne pouvant pas posseder la derniere version de vlc à cause d'un gel de l'activex. Les attachements
des methodes existent dans les versions suivantes de VLC. (nous pourrons les rajouter plus tard.)





lire, ajouter,supprimer, modifier une table DBF FOX avec strataframe et dotnet sur 64 bits
Bonjour à tous
c'est possible d'attaquer les dbf via strataframe et dotnet
visionnez la petite vidéo sur
http://www.strataframe.fr/forum/Topic40.aspx

C'est plutot une bonne nouvelle

toutes les explications, bientôt sur http://www.strataframe.fr et sur atoutfox bien sur

Atoutfoxement
Eric



Sauvegarder un dossier le zipper et adresser un email de confirmation
bonjour à toues et à tous

Ci joint un pdf qui vous montre comment

générer une sauvegarde en fichier zip

Transférer le dit fichier zip vers un espace FTP

adresser un mail avec un fichier atteché, sans être lié au client messagerie du poste
Voir aussi sur http://www.strataframe.fr

Bonnes programmations



QueryAdataset, compte-rendu de test
QueryAdataset, compte-rendu de test Qu'est-ce que c'est ? Dans des projets VB.net ou C#, QueryAdataset permet de requêter en Transact-SQL des DataSet et DataTables, ou des fichiers xml.

C'est un simple assembly, pour les versions de .Net 2.0, 3.5, et 4.0 (j'ai vérifié). L'éditeur indique qu'il fonctionne également sous Linux avec Mono (pas testé).

Le produit embarque un parseur syntaxique qui reconnaît la quasi-totalité des instructions du T-SQL utilisées par un développeur d'applications centrées sur les données. Le T-SQL proposé est largement plus avancé que celui de VFP (par exemple utilisation des CTE, des MERGE, des PIVOT et UNPIVOT). Les commandes de traitement de flux (DECLARE, SET, IF, WHILE, etc...) sont autorisées, ainsi que les traitements par lots et les appels de scripts externes.
Conditions du test J'ai testé le produit en suivant au débogueur l'exécution de la solution de démonstration livrée avec le produit, puis dans un nouveau projet que j'ai créé spécifiquement, et enfin en l'intégrant dans un projet existant.
Le jeu de données de test le plus volumineux comportait 19820 enregistrements.


mon premier programme en strataframe
Bonjour à toutes et tous

Pour ceux qui étaient venus en Mauritanie, aux rencontres africaines, vous vous rappellez surement, j'avais présenté une session pour quelques débutants et j'avais montré en partant d'une feuille blanche comment faire un premier programme en visual foxpro.

J'ai repris ce même principe avec dotnet et strataframe.

Si vous suivez ce tutorial, vous verrez que l'on est très proche de vfp avec en plus la puissance de dotnet.
Je mets des liens car je ne peux attacher les fichiers ici, car le pdf fait 4 méga .

Le tutorial à télécharger sur http://www.strataframe.fr/telechargement/premierprogstrata.pdf

La vidéo de ce que le programme doit faire sur http://www.strataframe.fr/telechargement/monpremierprog.asf

l'intégralité sur http://www.strataframe.fr/forum/Topic36.aspx

Bonne journée à toutes et à tous

Cordialement
Eric



calcul divers, heurs de nuits, jours fériès, test périodes etc...
Bonjour à toutes et à tous

j'ai retrouvé ca dans mes vielleries alors peut être que cela peut servir à quelqun !
voici plusieurs fonctions


function
dift
*!* syntaxe d'appel : dift("01:00:00","00:40:00") --> "0000:20:00"
*!* retourne la différence entre une heure de début et une heure de fin
*!* ex : hdebut=time()
*!* select champs1,champs2 from madatabase!matable where monchamx="truc"
*!* hfin=time()
*!* ? " J'ai fait ma requête en "+ dift(hfin,hdebut)
Function
temvern
*!* syntaxe d'appel : temvern(time) ---> 42321.0000 pour 11 h 45 21 ''
*!* retourne l'heure en forme de nombre de secondes écoulées depuis 00 h 00 m 00 s
*!**************************************************
Function
nvertem
*!* syntaxe d'appel : nvertem(42321.0000) ----> "00011:45:21"
*!* retourne l'heure en forme de nombre de secondes écoulées depuis 00 h 00 m 00 s
*!**************************************************
Function
nombrepage()
*!* syntaxe d'appel : nombrepage()
*!* retourne le nombre de page d'un état
*!* A placer dans un objet en tête d'état
*!**************************************************
Function
editstruct
*!* syntaxe d'appel : editstruct()
*!* retourne la structure des tables du dossier courant dans un fichier structuredestables.txt
*!**************************************************
Function
calcheurnuit
*!* syntaxe d'appel : calcheurnuit("15:00:00","24:50:00","22:00",06:00") -->> "02:50:00"
*!* retourne le temps effectué en période de nuit
*!* IMPORTANT: mettre le début et la fin des heures de nuits sous la forme "HH:MM"
*!**************************************************
Function
mi_nutes(hm)
*!* syntaxe d'appel : mi_nutes("10:00:00") -->> 600.00
*!* retourne le nombre de mintues d'un horaire sous la forme "HH:MM:SS"
*!**************************************************
Function
toujourspositif(monparam)
*!* syntaxe d'appel : toujourspositif(-230) --> 230
*!* retourne le nombre toujours positif
*!**************************************************
Function
testperiode
*!* syntaxe d'appel : testperiode(ctod("01/06/2003"),ctod("03/07/2003"),ctod("15/06/2003"),ctod("15/09/2003"))
*!* retourne le nombre vrai (.t.) si une période et contenue dans une autre et faux(.f.) si elle ne l'est pas
*!*
*!* ex un contrat du 01/06/2033 au 03/07/2003 possède t il des jours dans la période du 15/06/2003 au 15/09/2003
*!*
*!**************************************************
Function
JOUVRES( ma_DATEDEB,ma_DATEFIN)
*!* syntaxe d'appel : jouvres(ctod("01/06/2003"),ctod("03/07/2003")) --> 24
*!* retourne le nombre de jour ouvrés dans la période des deux dates fournies en paramètres
*!**************************************************

Bonne programmations à tous
Eric


Comment montrer la selection d'imprimante et obtenir l'information sur la selection
Voici une classe qui montre la sélection d'imprimante et obtient toute l'information
sur le choix de l'utilisateur, incluant le nombre de copies etc...
J'ai écrit cette classe pour de besoins. La plupart des autres méthodes avaient tous
leurs limites.
GETPRINTER()
retourne seulement l'imprimante choisie, mais ne permet pas de changer le
nombre de copies ou l'orientation etc...
Le code suivant ne retourne pas le nom de l'imprimante
objPrnDlg= CreateObject( "MSComDlg.CommonDialog.1")
Meme problème avec ceci
sys(1500,'_mfi_sysprint','_mfile')
La classe proposée aussi corrige le fait qu'il y une limite de 32 caractères sur
le nom de l'imprimante, la limite est maintenant 254 caractères. Non seulement elle retourne le nom correct de l'imprimante, mais retourne les valeures suivantes:
Nombre de copies. Orientation Selection de pages à imprimer. Duplex (recto, verso) Dimension du papier. Page de début. Page de fin. Le nom de la forme à utiliser (Lettre, lettre format légal, enveloppe etc.) A vous de découvrir les propriétés que vous avez besoin.

P.S. Les methodes sont vides!










DynamicBackColor qui utilise le numero de la ligne affichee dans une grille
Quand on utilise des Dynamic*, ces expressions sont évaluées ligne par ligne en commençant par la première et au niveau ligne de gauche à droite.
Il est possible d'employer cela pour remplir une collection de clefs. Apres un Refresh() ou un Scroll vertical, il est nécessaire de vider la collection et de la remplir. Pour faire le remplissage il suffit de modifier la hauteur de la grille pour forcer de réévaluer les expressions Dynamic*. Pour que cela se passe inaperçu on ajoute 1 à la hauteur et la fois prochaine on soustrait 1 de la hauteur
Voici un exemple de projet à restaurer dans un répertoire \Project9
Pour employer la classe GridLine, dans l'init de la grille
= m.this.Columns[1].AddObject('GridLine', 'GridLine') = m.this.SetAll('DynamicBackColor', [iif(empty(mod(m.this.Columns(1).GridLine.GetLine(Numbers.Id),2)), rgb(255,255,255), rgb(192,192,192))], 'Column')
On passe une clef primaire a GetLine() pour bien distinguer les lignes.

Il est possible d'utiliser cette technique pour afficher des tooltip en survolant une grille. Là, on remplira la collection avec le contenu des champs.

Petite remarque : Je ne vide et remplis pas la collection lors d'un scroll en bas d'une seule ligne

Il y a un form de démo. On peut trier en cliquant sur les header de la grille



La fonction MOD (Modulo) dans foxpro
La fonction MOD() ou % sont identiques
dans foxpro. Récemment on m'a demandé de décrypter un chiffre binaire qui
provient de la lecture d'une carte d'employé que l'on passe dans un horodateur.
La formule était qu'une fois que l'on traduit ce chiffre de décimal à binaire
et qu'on prend les 16 derniers chiffres binaire et on les retraduit en décimal,
on obtient le vrai numéro de la carte.
J'ai passé quelque heures à écrire une
fonction qui prenne un chiffre décimal en binaire, prend les 16 derniers caractères
et les ramener en décimal. Un programme qui avais 178 ligne de code.
Mais Foxpro avait déjà pensé à cette situation avec une seule fonction (ou deux), il s'agissait juste de comprendre comment l'utiliser.
Par example si le chiffre qui provient de l'horodateur est 08418894, ma fonction retournais bien 30286, mais en passant par 178 lignes de code. Mais Foxpro le fait en un ligne de code,







Atelier Visual FoxPro C/S
Bonjour,

Comme convenu lors de la session "Visual FoxPro C/S" aux rencontres Atoutfox 2011 à Montpellier le 24 mars 2011; Vous trouverez dans l'archive ci-jointe les slides et les différents programmes .prg que nous avons étudiés ensemble.
Le thème était une vulgarisation des modifications à apporter sur une programme utilisant des tables "à plat" pour le passer en client/serveur. Nous avons vu ensemble 3 outils différents dans VFP : le SPT, les remotes views et les cursor adapter.
Le serveur utilisé pour la démo était un Microsoft Sql Server Express 2008.

Cordialement
Francis FAURE

eBook Gratuit sur SQL Server 2008 R2
Adresse d'un eBook (en anglais) gratuit sur SQL Server 2008 R2 :
http://blogs.msdn.com/b/microsoft_press/archive/2010/04/14/free-ebook-introducing-microsoft-sql-server-2008-r2.aspx

Il y a d'autres eBook gratuits (quand c'est gratuit c'est pas cher...) sur d'autres thèmes (VS2010, Virtualisation, Programmation Win Phone7, ...) :
http://blogs.msdn.com/b/microsoft_press/archive/2011/03/03/ebooks-list-of-our-free-books.aspx

Cordialement
Francis


SQL Server, les étapes d'une transaction
Une brève description des étapes d'une transaction dans SQL Server.

Comment blocker le CTRL+ALT+DEL pour Windows 7


Ceci n'est pas spécifique à Foxpro, mais je le met ici à titre de référence seulement. On demande souvent comment blocker le Task Manager (CTRL+ALT+DEL) dans windows. Mais ATTENTION, vous devez comprendre l'impact de ceci . Voici un moyen.
1. Comment blocker CTRL+ALT+DEL
a) Créer un fichier texte et renommer l'extention à .REG
b) Mettre ceci dedans:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableTaskMgr"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableTaskMgr"=-
c) Sauvegarger et roulez le fichier.

2. Déblocker CTRL+ALT+DEL
Refaite a) ci-haut
b) Mettre ceci dedans:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableTaskMgr"=-
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableTaskMgr"=-
c) Refaite c)





ISXPlus : améliorations de l'intellisense
Comme promis aux rencontres, la contribution concernant la nouvelle version de ISX est en ligne, dans la rubrique "Outils", à l'adresse
http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000789


ISXPlus : améliorations de l'intellisense
Comme promis aux rencontres AtoutFox, voice ma version de ISX (baptisée modestement ISXPlus, bon, il faut bien donner un nom). C'est censé augmenter la productivité, et chez moi ca marche tès très bien.

Cette amélioration à l'intellisense native de VFP a une longue histoire, depuis ses débuts (par Christpf Wollenhaupt d'après Francis, mais les commentaires dans le PRG mentionnent « This program has been written in 1999-2002 by Christof Lange ». [qq minutes après] : Merci Francis : Christof Lange et Christof Wollenhaupt sont une seule et même personne : voir commentaire + bas ). Voici un petit historique.
11/2004 : Eddy Maue http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000104
Ces modifications sont contenues dans ma version
03/2006 : Luc http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000300
Ces modifications sont contenues dans ma version
05/2008 : Eddy Maue http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000563
Ces modifications NE SONT PAS REPRISES dans ma version
03/2010 : Christof Wollenhaupt http://www.foxpert.com/downloads.htm
Je n'ai absolument pas connaissance de cette version à ce jour (merci Francis de me l'avoir signalée), et on peut imaginer qu'elle est aussi évoluée que la mienne ?
On peut citer aussi VariSense 2.0, écrit par Derek J. Kalweit ( dkalweit@sensiblesoftware.com ; http://www.sensiblesoftware.com/VariSense.aspx ), dont certains codes ont été incorporés dans ISXPlus.
Les fonctionnalités : Ce qu'on voit La frappe « m. (point) » propose la liste des variables définies en Local, Global, Parameter, lParameter (mais pas les paramètres définis dans une déclaration du type « MaFonction(MonParamètre) »)
La frappe « This. (point) » propose la liste des membres de This, définies dans la classe ou héritées des classes parentes, qu'elles soient PRG ou VCX.

La Frappe « This. (point) » amène la liste des membres de la propriété si c'est un objet (par exemple défini avec « Protected iPropBidon1HiddenAsMyForm AS myformtest OF "testeisx.vcx" »).
La Frappe « Ctrl + UpArrow » amène la liste des #Define applicables au programme courant : ceux qui y sont définis directement, ou ceux qui sont inclus dans les fichiers .h #included.
La Frappe « . (point) » amène la liste des champs de l'alias . La Frappe « Ctrl + Espace » après le début d'une saisie amène la liste de : Si le mot commence par « m. » : liste des variables Si le mot commence par « This. » : liste des membres ou des membres du membre, etc. Si le mot avant le point est le nom d'un alias ouvert, la liste des champs de cet alias S'il n'y a pas de point, la liste des variables, plus des #Define, plus des tables La Frappe « Alt+ UpArrow » à la fin d'une saisie (même vide) amène la liste des fonctions définies dans le projet actif, plus toutes les fonctions et instructions VFP (on peut optionnellement enlever l'affichage de ces instructions VFP).
La Frappe « Alt+ DnArrow » à la fin d'une saisie d'un nom de fonction existant dans le projet amène le msgbox ci-dessous, qui permet de choisir entre atteindre la définition de la fonction, et insérer dans le PRG les commentaires correspondant aux paramètres de la fonction..

La fonction une fois commentée

La Frappe « Ctrl+F12 » duplique le texte et le met en commentaire avec les initiales du programmeur et la date (la première fois, elle demande les initiales).
La Frappe « Alt+S » monte en Set Procedure le PRG actif. La Frappe « Ctrl+Q » Active ou désactive ISX. Ce qu'on ne voit pas Une grosse différence est que ISX stocke ses données sous forme de table, ce qui est important pour la vitesse dans le cas des affichages de listes de procédures/fonctions/membres/#Define : ils n'ont pas besoin d'être lus à chaque lancement d'ISX : si le fichier n'a pas été modifié depuis la dernière lecture par ISX, les informations sont prises directement dans la table.
ISX est déjà la compilation du travail de plein de personnes. Chez moi j'y ai fait travailler des stagiaires et c'était sans doutes une erreur : merci de ne pas trop regarder la qualité du code.
Attention La version actuelle pose un Set Deleted On à l'instanciation de ISX (Do ISXPlus.PRG ou Ctrl+Q), et remet la config initiale lors de la destruction (Clear all, _Screen.oIXS = Null ou Ctrl+Q). Ca ne me gèene pas puisque je suis toujours en set deleted on, mais ce n'est pas le cas de tout le monde .

ISX ne sait lire les membres des classes définies dans ces VCX que par AMembers après avoir instancié la classe par CreateObject : ca peut être gênant pour des classes qui ne peuvent pas s'instancier « A vide », et qui affichent un message d'alerte dans ce cas. On peut désactiver cette fonctionnalité par la propriété « lIgnoreVCXClasses » de la classe cMyISX.
Installation et personnalisation Installer : Il suffit de placer le contenu du Zip dans un répertoire (NB : les images vont normalement dans un sous-répertoire "Graphics" mais je ne sais pas comment faire pour inclure l'info dans WinZip sans que toute l'architecture soit sauvegardée depuis la racine).
Lancer : "Do ISXPlus.PRG". On peut aussi mettre cette commande dans le config.fpw.
Interrompre : "Ctrl+Q
Relancer : Ctrl+Q

Il vaut mieux ne pas toucher à la classe de base cISX pour faire ses personnalisations. Le mieux est d'utiliser la classe héritière cMyISX (dans MyISX.PRG) :
Pour changer les options Pour surcharger la méthode Install, qui permet de définir les combinaisons de touches associées aux fonctions Pour définir de nouvelles fonctionnalités .
Complément En code VFP, je donne aussi qq PRG à insérer dans le gestionnaire d'intellisense VFP (Outils/Gestionnaire d'intellisense/Custom), qui correspond à la table _FoxCode montrée par Ken Levy lors des rencontres de Montpellier.


Introduction to Artificial Intelligence - State Space Search
Le materiel de ma presentation

Librairie (Library) FTP pour .NET ecrite en C# mais utilisable aussi en VB.NET, dll
LIBRAIRIE que j'ai écrite en C# pour faire des commandes FTP envoyer, downloader pour .NET et etc...

C'est utilisable aussi avec le langage VB.NET

Conversion d'un nombre en lettre (FrCh)
C'est une fonction qui permet de transformer une nombre en lettre.

Elle a été repris et adapté pour le francais suisse et avoir les centimes en lettre :
ericleissler
http://www.atoutfox.org/articles.asp?ACTION=FCONSULTER&ID=0000000067

Paramètre :
lnNumberIn : nombre à convertir (p.exemple 54.04)
lcCurrencyName : monnaie (franc)

Exemple : 54.04 => cinquante quatre francs zéro quatre


Utilitaires méconnus, quelques trucs et astuces
Voici quelques classes d'utilitaires, parmi ceux qui se trouvent dans le NameSpace MicroFour.StrataFrame.Tools.

Cette liste n'est pas exhaustive, et les regroupements dans lesquels je les présente ne sont qu'un choix personnel.
Pour utiliser ces utilitaires, pensez à référencer la DLL MicroFour StrataFrame UI Expanded dans votre projet.

Calendrier perpétuel
Calendrier perpétuel pour utilisation avec VFOX non francisé

Pour l'interface VFOX Française, supprimer les appels aux fonctions [moisenmot] et [jourenmot]

Pour introduire d'autres dates nationales modifier la vue et la source en conséquence.


JourFeries.prg
lMajore = JourDerie(m.dDate) OR (DOW(m.dDate) = 7) && "dimanche"

Test d'instanciation d'une application
Eviter de lancer plusieurs instances d'une application à l'aide du serveur DDE



Tester si Excel est lancé


Avant de lancer Excel, s'assurer qu'il ne l'est pas déjà.





Ping with IcmpSendEcho2()
Contient une classe qui resoud une addresse ip ou un url (utilisant ws2_32.dll)

Contient un classe qui permet de faire un ping en utilisant IcmpSendEcho2() contenu dans iphlpapi.dll ou icmp.dll

Minimum OS : win2000

Traduction de l'exemple dans http://msdn.microsoft.com/en-us/library/aa366051(VS.85).aspx



Comment encrypter un message avec CAPICOM et Foxpro
CAPICOM est un DLL de Microsoft qui permet d'encrypter des messages, inclure des signatures digitales dans un courriel etc. Vous pouvez le télécharger ici : http://www.microsoft.com/downloads/en/details.aspx?FamilyID=860ee43a-a843-462f-abb5-ff88ea5896f6&displaylang=en .
Voici comment encrypter et décrypter un message (avec clef privée). Mais CAPICOM a plusieurs autre utilitées.
Vous pouvez les trouver ici: http://msdn.microsoft.com/en-us/library/aa375732(v=vs.85).aspx




Traverser un arbre binaire en récursif et en itératif
Voici le code pour traverser un arbre binaire en récursif et en itératif

Récursif
Avantages : plus facile à écrire et à comprendre le code
Désavantages : le call stack (DO Level) est égal à la profondeur de l'arbre

Itératif
Avantages : on a besoin de seulement un niveau ( DO level)
Désavantages : plus difficile à écrire et à comprendre le code

Utilisation
Télécharger le code et exécuter TraverseExample()

Il y a deux classes. Une qui traverse récursivement en une qui traverse itérativement
Les deux classes implémentent les six façons de traverser un arbre binaire, à savoir
(1) PreOrder
(2) InOrder
(3) PostOrder
(4) Converse PreOrder
(5) Converse InOrder
(6) Converse PostOrder


Paginer les données côté serveur, mettre en cache côté client
Vous voulez sélectionner des lignes dans une table, mais celle-ci comporte trop de lignes pour qu'il soit réaliste de les ramener en une seule fois sur le client. Vous allez alors « paginer » votre requête, organiser celle-ci en lots successifs qui vont récupérer les lignes voulues depuis le serveur. Quand vous aurez chargé une page de données, vous voudrez peut-être la conserver localement pour pouvoir y revenir sans avoir à le recharger depuis le serveur. Vous allez alors « mettre en cache » ces pages sur le client.


Sélectionner un objet sur un formulaire
À l'aide du contrôle Shape sélectionner un objet sur un formulaire. Il apparaîtra un contour surligné et des poignées pour pouvoir manipuler l'objet sélectionné

Comment :

Exécutez l'exemple ci-bas ajouté

Dans une zone vide du formulaire appuyez simultannément sur la touche Shift et le bouton gauche de la souris. Bouger le cuseur et enrobé l'objet cible avec la shape de sélection.

Les poignées qui apparaissent permet la manipulation de l'objet

a+ Eddy Maue

2 & 3 Octobre 2010 à Ste Catherine de Fierbois
Compte Rendu de la réunion de Comité
des 02 & 03 Octobre 2010 à Ste Catherine de Fierbois


Etaient présents :
Francis Faure ,
François Lepage ,
Eric Leissler (en session MSN le samedi)
Michel Lévy ,
Marc Thivolle



1 : Journée SERVOY
Servoy France organise une journée gratuite d'ateliers le 9 Novembre 2010 à Paris. Ce jour, l'évènement est annoncé sur le site de Servoy . AtoutFox participe à l'organisation de cette journée. Un message pour annoncer cet évènement sur le site web AtoutFox est rédigé. Un e-mailing à tous les membres de France, Belgique et Suisse est également préparé pour un envoi semaine prochaine à J-30.



2 : Organisation des Rencontres AtoutFox 2011
Les Rencontres AtoutFox 2011 sont prévues les 24 & 25 Mars prochains. La ville retenue pour cette année est Montpellier. Le lieu précis reste à déterminer.
Les premiers thèmes envisagés pour les sessions sont :
Silverlight avec VFP par Uwe du DFPUG.DE Visual Studio Lightswitch : le nouveau produit MS d'accès aux données VFPinSQL : Utiliser des données FoxPro dans SQL Server Outils utiles & méconnus de VFP9 Codeplex : Quoi de neuf ? VFP9 et les nouveaux OS 32 & 64 bits OLE Automation avec VFP L'usage des DBCs Etat des lieux de l'écosystème VFP Témoignages sur des migrations en cours Comment améliorer les performances de VFP, client de SQL ?

3 : Point sur les Rencontres Fox Afrique
Les premières Rencontres Fox Afrique ont eu lieu du 13 au 15 mai 2010 à Nouakchott en Mauritanie. En l'état actuel des choses, organiser des Rencontres en 2011 dans le Maghreb semble compliqué. Le Maroc pourrait être la destination des prochaines Rencontres Fox Afrique.



4 : Défraiement des membres du Comité
Conformément à la résolution 5 de l'Assemblée Générale du 20 Mars 2009, François Lepage demande si l'un des membres du Comité présent lors de ce week-end demande à bénéficier du défraiement prévu. Aucune personne présente ne demande à en bénéficier.



5 : Prochaine réunion du Comité
La prochaine réunion du Comité est prévue pour les 22 & 23 Janvier 2011 prochains à Caumont sur Durance chez Francis.


changer le nombre de page d'un état

Bonjour à toutes et à tous

exemple : pour mettre 2 pages à l'état monetat.frx
changelenombredepage("monetat.frx",2)

ensuite
report form montetat ........................

Bonne journée à tous
Eric



Comment trouver le SID (security identifyer) , domaine et le nom de l'utilisateur courant


Gérer les connexions aux données dans StrataFrame
Le point essentiel d'une connexion à une source de données, c'est la chaine de connexion.

Cette contribution tente de répondre aux questions suivantes :
Comment stocker de façon permanente les sources de données nécessaires à une application ? Comment mettre à disposition ces sources de données à travers toute l'application ? Comment utiliser plusieurs sources de données dans une même application ?

Plan d'Exécution Graphique pour des Requêtes SQL Simples (traduction)
Cet article est paru initialement le 16 décembre 2008 sur le magazine en ligne Simple-Talk http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/

L'auteur de cet article est Grant Fritchey : il est DBA dans une grosse compagnie d'assurance américaine et il travaille sur SQL Server depuis la version 6.0 en 1995. Il a également travaillé sur Sybase, et a développé en VB, VB.Net, C#, et Java.

Son livre « SQL Server Execution Plans » est disponible chez Amazon http://www.amazon.com/Server-Execution-Plans-Grant-Fritchey/dp/1906434026/ref=sr_1_3?ie=UTF8&s=books&qid=1280842445&sr=8-3


Grant Fritchey est MVP SQL Server.




c# - Tableau à dimension multiple
Quelque chose qui me manquais sous Vfp et qu'enfin je retrouve sous c#

tableau à 3 dimensions

Un exemple simple d'utilité serait le maintien en mémoire des mémos dans une année pour une période
de 12 mois

String DateMemo[12,5,7][ ] ;

et ou on a 12 mois, 5 semaine, 7 jours

ExempleNum = 1
l'exemple présenté est un tableau à 3 dimensions remplient de Int si
ExempleNum = 2
tableau de caractere String à 3 dimensions





Mettre à jour une vue multi-tables sur le serveur SQL avec le trigger INSTEAD OF
Mettre à jour une vue multi-tables sur le serveur SQL avec le trigger INSTEAD OF


Très souvent, on envisage la migration des données vers SQL Server comme une solution à des problèmes que les dbf ne peuvent pas gérer nativement (sécurité, fragilité par exemple), ou en réponse à des dysfonctionnements liés à l'évolution des OS et des machines (caches disque entre autres).

Mais on peut aussi choisir de migrer de façon positive, pour accéder à des fonctionnalités nouvelles, pour simplifier l'écriture, pour accélérer les traitements, pour faciliter la maintenance.

L'objectif de cette contribution est de vous donner envie de migrer.

Quelques définitions : Une vue sur le serveur, pourquoi faire ? Nos données sont normalisées, et nous utilisons des vues pour obtenir des jeux d'enregistrements dénormalisés, consommables dans notre code métier ou notre couche visuelle sur le client fox. En tant que développeurs fox, nous avons l'habitude de réaliser cette dénormalisation en créant des vues coté client, ou en requêtant cette jointure par du code SPT ou dans un Cursor Adapter. C'est ce que nous faisons par exemple entre une table « clients » et une table « contacts », ou bien entre une table « en_tete_facture » et une table « lignes_de_factures ».

Créons cette vue sur le serveur SQL lui-même : nous gagnerons en performance, en utilisant toute la puissance de la mise en cache des plans d'exécution et leur adaptation automatique aux données réelles (imaginez cela comme une super-optimisation Rushmore).

Une vue sur le serveur n'est rien d'autre que du code SELECT dont le résultat est « vu » comme une table, elle est mise à jour sans aucune intervention nécessaire .
Un TRIGGER INSTEAD, qu'est-ce que c'est ? En fox, nous ne connaissons que les trigger after , c'est-à-dire du code procédural exécuté automatiquement après un événement INSERT, UPDATE, ou DELETE. J'emploie ici volontairement le terme d'événement, dans le sens utilisé dans le monde SQL : ce ne sont pas des événements au sens de la POO, mais des événements de données.

En SQL, la norme SQL:1999 prévoit 2 types de triggers, les BEFORE et les AFTER. Cette norme est implémentée en Transact-SQL sous la syntaxe de TRIGGER INSTEAD OF et TRIGGER AFTER.

Un trigger AFTER s'exécute après le ou les évènements auxquels il répond, et de ce fait les contraintes de lignes et les règles d'intégrité référentielles structurelles ont déjà été vérifiées quand on arrive au début du trigger.

Un TRIGGER INSTEAD OF « intercepte » le ou les événement(s) de données pour lesquels il est écrit, et c'est le code contenu dans ce trigger qui est exécuté à la place de l'événement initial. Aucune contrainte de ligne ou d'intégrité n'a été vérifiée à l'entrée dans le trigger (uniquement les contraintes de schéma et de type de données).
Mettre à jour une vue multi-table sur le serveur, comment ? Si une vue contient des calculs (et à fortiori des agrégations) ou une clause DISTINCT, ou des sous-requêtes ailleurs que dans sa clause WHERE, elle ne peut être mise à jour directement. Nous allons donc utiliser le TRIGGER INSTEAD pour coder cette mise à jour des tables sous-jacentes.

Les objets de notre exemple :
Parcourons le script « create_tables_parent_enfant », qui définit nos 2 tables. Il crée 2 tables nommées parent et enfant, chacune dotée d'un champ identity (autoinc en fox) sur lequel est basée la clé primaire. Ces 2 tables sont liées dans une contrainte d'intégrité référentielle nommée « FK_enfant_parent ». De plus, les données du champ « enf_ch1 » sur la table « enfant » ne doivent pas prendre la valeur ' z2z2 '. C'est ce qu'en fox on appelle une règle de niveau champ. En SQL, on appelle cet objet une contrainte de validation, ou contrainte check. Comme tout objet, il porte un nom, nous l'avons appelé « CK_enfant_enf_ch1 »

Le script de création de la vue nous permet de voir qu'elle modifie la casse de la colonne « par_ch1 » issue de la table « parent » ; les 2 tables sont liées par une jointure sans surprise, de type FK/PK. Remarquons juste que nous faisons remonter dans cette vue les PK des 2 tables (nous les utiliserons dans le trigger).
Regardons maintenant plus attentivement le script de création du trigger.

Comme nous voulons mettre à jour les 2 tables ou aucune, nous empaquetons ces 2 mises à jours dans une transaction. Le code lui-même est inséré dans une structure d'interception d'erreur par TRY/CATCH, dont le principe est identique à celui que nous connaissons en fox (remarquons seulement la petite différence syntaxique). Une erreur déclenchée dans le TRY entrainera l'exécution du code contenu dans le CATCH, que nous avons ici simplifié à un simple ROLLBACK. Bien entendu, ce code devrait comporter un traitement personnalisé de gestion de l'erreur, afin de remonter ses détails jusqu'à la couche client, mais ce n'est pas l'objet de la présente contribution. Nous aurions pu également utiliser un SET XACT_ABORT ON.

Le code traite donc la mise à jour de chaque table par un UPDATE, en vérifiant d'abord si la mise à jour est requise, et en utilisant les pseudo-tables :
Vérifier si la mise à jour est requise pour cette table La commande UPDATE(nom_de_colonne) renvoie le booléen VRAI si l'évènement déclencheur impacte cette colonne.
L'utilisation de la pseudo-table INSERTED Les pseudo-tables sont des jeux d'enregistrements présentés dans les trigger, et disponibles comme des tables dans le code des trigger. Ces pseudo-tables (que nous appellerions des cursor en fox) sont nommées INSERTED et DELETED, elles ont exactement la même structure que l'objet (table ou vue) sur lequel porte le trigger, elles contiennent les jeux d'enregistrements impactés par l'évènement demandeur. Dans un trigger INSERT, seule la pseudo-table INSERTED est présentée ; dans un trigger DELETE, seule la pseudo-table DELETED est présentée. Et dans un trigger UPDATE, les 2 pseudo-tables sont présentées, DELETED contient les valeurs d'origine (avant l'update) de la table ou de la vue, et INSERTED contient les valeurs de destination.

Dans notre exemple, nous avons uniquement besoin des valeurs contenues dans INSERTED pour les appliquer aux tables sous-jacentes de la vue.
La clause FROM dans la source des données du SET Nous retrouvons les enregistrements dans chacune des tables par une simple jointure entre cette table et INSERTED sur la clé primaire. La clause FROM permet d'utiliser le jeu résultant de cette jointure à la fois pour identifier la ligne à mettre à jour et pour déterminer la valeur de remplacement. Tout simple, non ?

Le dernier script est un simple test, permettant de vérifier le fonctionnement de l'ensemble.

Il ne reste plus qu'à consommer cette vue serveur comme si c'était une table, dans notre client fox (avec une vue distante, du code SPT, ou un Cursor Adapter) ou notre client StrataFrame (avec un BO).


Comment obtenir l'information sur le serveur SMTP Sous Windows 7


Comment utiliser un DLL foxpro (ou autre) sans avoir besoin de l'enregistrer
Cette technique vise Foxpro 9 (SP2) spécifiquement.

Mise-à-jour. Je me suis fait demandé comment obtenir le CLSID d'un DLL pour pouvoir ensuite le mettre dans le manifest. Voici une méthode: (cette methode utilise tlbinf32.dll qui vient avec Visual Studio)

1. Trouver l'information à partir du fichier TBL.

CLEAR
LOCAL otlb
otli=NEWOBJECT('tli.tliapplication')
otlb=otli.TypeLibInfoFromFile("serial.dll")
FOR EACH oCoClass IN otlb.CoClasses
?"Class name : ",oCoClass.NAME
?"CLSID is : ",oCoClass.GUID
ENDFOR




Export XLS (via ODBC)
Bonjour,

J'ai réceptionné une demande Khaled en email me demandant comment on peut exporter des données VFP dans une feuille Excel avec des données dans différents onglets.
J'ai répondu qu'il y avait plusieurs solutions (Automation, Odbc, ..) comme toujours en VFP

Je propose une illustration avec ODBC ci-après.
Cet exemple prend des morceaux de 2 tables (Clients et Employés) de la base Northwind pour les mettre dans des onglets. (testé avec excel 2003)

Cordialement
Francis

Outlook : visualiser dans une table les propriétés des dossiers Contacts,Tasks,Calendar.....
Salut vous tous

cet exemple permet de visualiser les propriétiées qui composent les différents dossiers d'Outlook. En autant qu'il y est au moins un item d'inscrit dans le dossier

Outbox folder : Pour pouvoir voir ce 4ieme dossier, mettre Outlook en mode offline et faites l'envoit d'un courrier. Après avoir exécuter mon code, détruire l'item que est dans le dossier de sortie pour les email.

Anyways regarder le code pour vous faire une idée

have fun


Obtenir l'adresse IP et l'adresse MAC d'un ordinateur
Differente technique pour obtenir l'adresse IP et adresse MAC d'un ordinateur.

GetSpecialFolder **** toutes la gagne et y'en a un paquet enfin j'en ai ressencé 12287
Salut à tous

voici la fonction que vous retrouverez si vous faites une recherche sur Google et j'ai eu de la difficulter à là trouver.

Procedure GetSpecialFolder(tnFolder)
Local lcSpecialFolderPath, ;
lcPath
lcSpecialFolderPath = replicate(chr(0), 260)

Declare SHGetSpecialFolderPath In shell32.Dll ;
long hwndOwner, String @cSpecialFolderPath, Long nWhichFolder , integer fCreate

SHGetSpecialFolderPath(0, @lcSpecialFolderPath, tnFolder, 0)

lcRetVal = Strtran( lcSpecialFolderPath , Chr(0) ,'' )
Return iif( vartype(lcRetVal)="C",lcRetVal,"")

Moi ce que je cherchais c'était le 28ieme item de cette fonction soit :
%userprofile%\AppData\Local

simplement ou sont enregistré les données et préférences de la majorité des logiciels que
nous installons.

je joins une routine qui vous permettras de découvrir une multitude d'autres dossiers spéciaux, qui,
je le crois, vous permetteront de mieux comprendre la structure de Windows en matière de dossiers.

À vous d'adapter ce code pour savoir ceux qui n'existe pas sous Xp, moi je n'ai plus rien qui roule sous Xp.


a+ aller have fun
Le mouton noir d'Atoufox ... moi même le québécois Eddy




Outlook : Recheche avec EntryID
Salut vous tous,

Pour chaque items composant la base de données d'outlook il existe une propriété qui identifie de façon unique un item pour la messagerie, les appointements, les tâches et les contactes, les notes et autres.

le hic c'est qu'il faut spécifier le dossier qui a pour entité unique (propriété) StoreID l. ID spécique d'un dossier sur lequel se portera la recherche. Bref il faut savoir ce qu l'on recherche. On recherche un message, un contacte ou une tâche ?.... c,est à nous de le savoir

Qu'elle est l'importance ? ..... Je dirais que dans une base de données de contactes, il peut y avoir plusieurs Mike Gagnon (notre expert Outlook) qui figure dans notre base de contactes. Et pour chaq'un de ces Mike, on aura un Id différent et ca va de soi, on est habitué à ca avec Fox.

Cette propriété c'est EntryID

Donc on a un StoredID qui identifie un dossier et un EntryID qui idenfie un item de ce dossier.

Là ou j'ai eu beaucoup de difficulté c'est que la fonction de recherche loContactFolder.items.Find() ne fonctionne pas avec l'entryId

on peut écrire loMikeItem = loContactFolder.items.find("[Firstname] = 'Mike'") et ca fonctionnera pour le premier item rencontré dans la liste des contactes pour Firstname = Mike. Bref ca ne veut pas dire que c'est le
bon Mike et s'il y en un on peut toujours exécuter
? loMikeItem.fullname
? loMikeItem.homeadress

Pouquoi je veux travailler avec l'entryID ?.

En Vba j'ai développer 12 fonctions qui me permettent de savoir si j'ai ajouté, modifier ou détruit un item dans les dossiers agenda, contacte, tache ou messagerie. La seul chose que ces fonctions font c'est d'enregistrer l'entryID dans un fichier texte comme suivant :

2010-05-31 85316,36IPM.TaskDelItem .txt
2010-05-31 85380,64IPM.Task AddItem .txt
2010-05-31 85387,2IPM.Task ModifItem .txt
2010-05-31 85389,37IPM.Task DelItem .txt
2010-05-31 85405,13IPM.Task ModifItem .txt
2010-05-31 85407,09IPM.Task DelItem .txt
2010-05-31 85442,98IPM.Appointment AddItem .txt
2010-05-31 85446,24IPM.Appointment ModifItem .txt
......

et ainsi de suite. dans chacun de ces fichiers texte ou je retrouve la donnée suivante

00000000FB9DC40F4AEB6548A4211D0BD77C4D3F84202000
soi un EntryID que je retrouverai aisément dans une table.dbf


Ma surprise c'est que toutes les modifs apportés par la synchro avec mon mobile 6.1 sont aussi répertoriés.

j'ai donc 2 données intéressante :
I PM.Appointment AddItem
qui me dit que j'ai ajouté l'appointement "00000000FB9DC40F4AEB6548A4211D0BD77C4D3F84202000"
qui me dit de quel EntryId il s'agit dans l'agenda

Saurait aussi pu etre
IPM.Task DelItem
00000000FB9DC40F4AEB6548A4211D0BD77C4D3F84202000

Donc vous devinez la suite. Il devient facile de modifier et de répertorier dans des dbfs comme dans sql server une relation unique entre les tables et le fichier Pst d'outlook.

a+ et bonne chance pour la suite



code postaux francais
la liste des codes postaux francais et des communes en dbf
Bonne journée à tous
Cordialement
Eric


Reproduction totale ou partielle strictement interdite • KitWeb : générateur de sites internetWan Again : fournisseur d'accès à InternetDesign or Decline : SSII (informatique, développement logiciel)Valid XHTML 1.0 Transitional