ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Affiliation RSS   

rss RSS : Really Simple Syndication

Le format RSS (fichier XML) permet de syndiquer du contenu provenant d'autres sites.
www.atoutfox.org propose :

  • la publication d'un flux RSS des dernières contributions du site www.atoutfox.org
  • la publication d'un flux RSS des derniers messages sur le forum www.atoutfox.org
  • de consulter les fluxs RSS relatant de Visual FoxPro provenant d'autres sites.

Pour répondre aux questions reçues suite à l'ouverture de cette rubrique :
« c'est quoi un RSS ? »  et  « à quoi cela sert-il ? »
Une  réponse résumée et très simplifiée :
Un feed RSS est un fichier créé dynamiquement, au format XML, contenant : une date de publication, un titre, un auteur, éventuellement une description (ou partie de description), et un lien.
Dans le cas d'Atoutfox, le feed RSS est une publication des entêtes des contributions.
Ce feed RSS rendu public permet d'être utilisé dans un autre site : la liste du contenu du site source apparait dynamiquement dans le contenu du site client avec un lien retournant sur la source... (Syndication). Le site client augmente son contenu, le site source reçoit des liens et augmente sa visibilité et son référencement.
Les informations sont à jours sur tous les sites en même temps puisque c'est dynamique.
Exemple d'utilisation d'un flux RSS : affichage ci-après des 6 derniers codes et forum de www.foxprofr.com à l'intérieur de www.atoutfox.org... Est-ce plus clair ? (sinon un petit appel à votre ami google... ;-)

Cordialement, Francis FAURE

 

Les 6 derniers articles de...

Feed RSS des dernières contributions ajoutées sur www.atoutfox.org    (source )

Date Titre Auteur
11/01/2017
11:44:17

DBF -> MsOffice (VFP9 version 4, VFP6 version 2/3)
Fonction et classes pour Export DBF -> MsOffice
Versions pour VFP9 et VFP6 (janvier 2017).

Vilhelm-Ion Praisach
04/12/2016
11:44:17

Ajout de logo dans une feuille Excel
On trouve un peu partout dans le WEB la méthode, Insert_Image() , pour insérer une image ou un logo dans une feuille Excel.
.
Cette méthode présente l'inconvénient de ne pas conserver l'image ou le logo après sauvegarde de la feuille Excel dans certaines situations.
.
La méthode suivante, Add_Image() , permet de conserver image ou logo après la sauvegarde de la feuille.

FAUCONNET MIchel
26/11/2016
11:44:17

Version 3.1415926 du décompilateur DVFP
Version 3.1415926 du décompilateur dvfp Je met à la disposition de la communauté cette version qui bénéficie d'améliorations apportées suites à différents bugs qui m'ont été signalés ces derniers mois.

Pour bien faire je devrais faire une liste des bugs corrigés, mais faute de temps, il est quand même préférable de publier la version plutot que d'attendre que je rédige la doc.

On trouvera, bien sûr, tous les sources dans le zip.

Robert Plagnard

Robert Plagnard
26/11/2016
11:44:17

Report dans les DLL
Report dans les DLL Introduction Le problème initial est la production dynamique de rapports VFP au format PDF pour être téléchargeables sur un site internet.
Le site tourne sous Windows Server, avec IIS et PHP. PHP permet d'instancier un objet COM+ à partir d'une DLL créée en VFP 9. Cet article traite des problèmes rencontrés avec l'instruction « report » dans les DLL VFP9
Dans tout ce qui suit, je considère des rapports qui fonctionnent parfaitement bien quand ils sont lancés dans le contexte d'un EXE. Dans le contexte d'une DLL c'est l'objet de cet article !

Dans une DLL Multi threads Il n'est pas possible d'utiliser l'instruction « report »
Report form MyReport noconsole to file MonFichier.ps nodialog Pas d'erreur à la compilation, mais à l'exécution erreur 1001 : Feature is not available
C'est une erreur générée par le runtime car le code VFP est exactement le même, que l'on compile un EXE, une DLL mono ou une DLL multi threads.

Dans une DLL Mono thread En prenant des précautions dues au contexte mono thread, on peut, dans certaines conditions, utiliser « report ».

Avec « reportbehavior 80 »
Cela n'est pas possible. Même en prenant les précautions pour ne pas écrire dans une interface utilisateur, par exemple :
Set reportbehavior 80 Report form MyReport noconsole to file MonFichier.ps nodialog Génère l' erreur 2031 : User-interface operation not allowed at this time
Alors que dans un EXE, cela marche sans problème. Le fichier.ps est un fichier PostScript que l'on peut visualiser avec gsView par exemple.

Avec « reportbehavior 90 »
Cela dépend.

Set reportbehavior 90 Report form MyReport noconsole to file MonFichier.ps nodialog
Génère l' erreur 1733 : Class definition OUTPUT type 0 is not found
Il semblerait qu'ils aient oublié le cas « to file », et que seuls « to print » et « preview » aient été prévus.

Par contre
Set reportbehavior 90 Report form MyReport noconsole to print nodialog
Fonctionne bien avec une « imprimante pdf ». Personnellement j'utilise « Bullzip PDF printer » qui me donne satisfaction. Extraordinaire ! Sauf que, dès que l'on met une image dans le report (aussi petite soit-elle), on récupère une erreur 1108 : Picture too big, corrupt, or in wrong format C'est un problème lié à l'utilisation de GDI+. Des problèmes analogues ont été décrits par Calvin Hsia (voir http://blogs.msdn.com/b/calvin_hsia/archive/2005/07/24/442873.aspx )
Mais je ne pense pas que ce soit tout à fait la même raison, car on a le même problème que ce soit un JPG, un PNG ou un BMP.
Le problème n'apparait pas de manière systématique, dans un tout petit report, avec la même image, ça marche. Pour produire l'erreur il faut que le rapport soit assez compliqué.
Par contre si l'on met le BMP dans un champ général d'une table, cela marche, c'est un contournement possible. C'est d'ailleurs la seule solution que j'ai trouvée.
Toutes ces raisons m'ont fait essayer xFrx.

Avec XFRX Les difficultés rencontrées sont les suivantes :

Avec le mode classique (sans utiliser les nouvelles possibilités du report 90)
loSes = XFRX("XFRX#INIT") loSes.SetParams("output.pdf",,.T.,,.T.,,"PDF") loSes.ProcessReport("Rapport.frx") loSes.finalize()
Ça marche à 99.9%
Mon report est assez compliqué, avec beaucoup d'impressions conditionnelles, certains traits horizontaux ne sont pas à leur bonne place. Ce n'est pas très grave, mais ce n'est pas joli. L'image JPG située dans l'entête s'affiche bien.
Un autre avantage, dans ce cas, est la possibilité d'utiliser une DLL Multi threads car aucune instruction report n'est utilisée. Tout est fait par xfrx.

En utilisant les nouvelles possibilités du report 90 (reportbehavior 90)
loLsn = XFRX("XFRX#LISTENER") loLsn.SetParams( "output.pdf",,.T.,,.T.,, "PDF" ) report form rapport.frx object loLsn
On l'a bien compris, cette façon de faire ne peut être utilisée que dans une DLL mono thread. Ça marche bien, les traits horizontaux sont bien positionnés, mais on rencontre le même problème avec les images. Cela n'est pas étonnant, car xFrx sous-traite l'affichage à ReportOutPut.app. Je n'ai pas testé mais je pense que le même contournement doit être possible avec un champ général.

Conclusion La solution que j'avais développée dans le cadre de Windows server 2008 était différente. Je n'avais pas trouvée de solution telle que celle décrite ci-dessus et j'avais choisi de produire le rapport à partir d'un EXE qui était lancé dans la DLL. Le lancement de l'EXE se faisant proprement par un CreateProcess de win32api. En attendant la fin de l'exe et en sérialisant les demandes, cette méthode marchait parfaitement bien.
Sous Windows server 2012, je n'arrive plus à lancer l'exe à partir d'un CreateProcess. C'est un problème de droits. J'ai essayé de beaucoup de manières, sans succès. Je pense que les droits et la sécurité sont plus stricts que sur Windows server 2008. On trouve beaucoup d'articles sur ce sujet.
En désespoir de cause, je pensais développer un spooler de rapport (un EXE VFP), qui dans mon cas, serait relativement simple. Ayant besoin d'un seul rapport défini par quelques paramètres. La DLL pourrait faire une demande de rapport en créant une entrée dans une table. Le spooler regardant périodiquement s'il y a des demandes, les satisfait au fur et à mesure et indique que le rapport est prêt. Le spooler est une sorte de service, mais malheureusement on ne sait pas créer de service en VFP. On contourne la difficulté en faisant démarrer automatiquement une session au démarrage du serveur qui elle-même lance automatiquement notre EXE. LogonExpert (produit payant) permet de le faire.
Jusqu'au moment où j'ai trouvé une solution ...

Postscriptum J'ai passé beaucoup plus de temps à trouver la solution simple, qu'il n'aurait fallu de temps pour développer le Spooler. J'aime les solutions simples, mais ce sont les plus difficiles à trouver.

Robert Plagnard le 2 août 2016

Robert Plagnard
25/09/2016
11:44:17

ODT (Writer) -> TXT
Une fonction simple qui extrait le texte contenu dans un document Writer odt , et crée un fichier txt avec le même nom .

ImportOoWrText 1.0

Vilhelm-Ion Praisach
19/09/2016
11:44:18

Inspect tables
Classes pour la visualisation des tableaux à partir de Word et PowerPoint documents

InspectDocx 1.0
InspectPptx 1.0

Vilhelm-Ion Praisach

Feed RSS des derniers messages ajoutés sur forum www.atoutfox.org    (source )

Date Titre Auteur
23/02/2017
12:33:58

Des colonnes récalcitrantes
Bonjour,
Dans un Grid, j'ai plusieurs colonnes, qui sont dimensionnées à la création.
Lorsque le Form est lancé, les 3 dernières colonnes ne conservent pas la taille donnée mais se rétrécissent, pourquoi ? Je n'ai pas trouvé de différences entre les précédentes et ces dernières....
Je n'ai pas ce type de pb sur d'autre Form.

Roland

Roland38
23/02/2017
12:33:58

Re: ne pas passer à la colonne suivante
C'est vrai, tu as raison, mais en fait je ne voulais pas remettre en cause une grande partie du code.
Je garde ton exemple pour une prochaine utilisation. Mais avant tout, je doit comprendre le fonctionnement
de ton code......
Vu mon âge ;o) j'ai le cerveau lent .....
Roland


Roland38
20/02/2017
12:33:58

Re: distance entre deux adresses avec google maps
Marc,

en effect, il semble que c'est pas du tout une bug. Google est trops intelligent: quand il y a une blockage, accident soit une autre, google choisit le prochaine route courte sauf blockage.
Pendant mon teste avec les routes en Belgique il y était une accident sur la Route A12 enfin propose une route sur la E19 plus longue mais plus vite.
Aujourdhui, pas de accident et voila une route prendre le A12 correcte.

Coordialement,

Koen

Koen
20/02/2017
12:33:58

Re: distance entre deux adresses avec google maps
Merci pour ces explications. J'espère que le bug concernant le mode de
transport est en voie de résolution.

Le 18/02/2017 à 09:18, Koen a écrit :
> Marc,
> Mike propose de utiliser une code qui donne le route totale, j'ai repondu que je cherche une code qui me donne que le distance et le temps de voyage entre deux adresses, voyage par voiture.
> En suite Mike à corriger une code qui donne ça:
> [VFP]
> Lparameter tcAddress1, tcAdresse2
> Local lcAddress1, lcAddress2, lcURL, loHTTP, lcResult
> if vartype(tcAddress1='C'
> lcAddress1 = m.tcAddress1
> else
> *!* return .F. &&handicapé enfin de mode de teste
> endif
>
> if vartype(tcAddress2='C'
> lcAddress2 = m.tcAddress2
> else
> *!* return .F. &&handicapé enfin de mode en teste
> endif
>
> *!* teste
> lcAddress2 = "Grasmarktstraat 100, Brussel"
> lcAddress1 = "De Keizerlei 12, Antwerpen"
> *!* valeurs trouvé par GoogleMaps en internet:
> *!* 56 min, 52,7 km
>
> If !Empty(lcAddress1) Or !Empty(lcAddress2)
>
> lcURL= "http://maps.google.be/maps/api/distancematrix/xml?origins="+lcAddress1+"&destinations="+lcAddress2+"&mode=driving&language=nl-BE&sensor=false"
> loHTTP = Createobject("MSXML2.XMLHTTP")
> loHTTP.Open("GET", lcURL, .F.)
> loHTTP.Send
> oXMLDOM = loHTTP.responseXML
> lcResult=(loHTTP.ResponseText)
> oOrigine = oXMLDOM.selectNodes("//origin_address")
> If "NOT_FOUND" $ lcResult Then
> Else &&! NOT_FOUND = FOUND
> llFound = .T.
> Endif && "NOT_FOUND" $ lcResult
>
> Endif &&if !EMPTY(cAddress1)
>
> If llFound
>
> lcDeparture = oOrigine.Item(0).Text
> lcArrival0 = oXMLDOM.selectNodes("//destination_address")
> lcArrival = lcArrival0.Item(0).Text
> lcStatus0 = oXMLDOM.selectNodes("//status")
> lcStatus = lcStatus0.Item(0).Text
> lcDuration0 = oXMLDOM.selectNodes("//duration / text")
> lcDuration = lcDuration0.Item(0).Text
> lcDistance0 = oXMLDOM.selectNodes("//distance / text")
> lcDistance = lcDistance0.Item(0).Text
>
> Endif
>
> [/VFP]
>
> code functionne, mais bien que le code mentionne bien 'mode=driving' il semble que le distance et le duration est messuré par air en mode ligne droîte. Voir les examples donne entre les deux adresses par teste.
>
> Coordialement,
>
> Koen
>
>

Marc Thivolle
18/02/2017
12:33:58

Re: distance entre deux adresses avec google maps
Marc,
Mike propose de utiliser une code qui donne le route totale, j'ai repondu que je cherche une code qui me donne que le distance et le temps de voyage entre deux adresses, voyage par voiture.
En suite Mike à corriger une code qui donne ça:
[VFP]
Lparameter tcAddress1, tcAdresse2
Local lcAddress1, lcAddress2, lcURL, loHTTP, lcResult
if vartype(tcAddress1='C'
lcAddress1 = m.tcAddress1
else
*!* return .F. &&handicapé enfin de mode de teste
endif

if vartype(tcAddress2='C'
lcAddress2 = m.tcAddress2
else
*!* return .F. &&handicapé enfin de mode en teste
endif

*!* teste
lcAddress2 = "Grasmarktstraat 100, Brussel"
lcAddress1 = "De Keizerlei 12, Antwerpen"
*!* valeurs trouvé par GoogleMaps en internet:
*!* 56 min, 52,7 km

If !Empty(lcAddress1) Or !Empty(lcAddress2)

lcURL= "http://maps.google.be/maps/api/distancematrix/xml?origins="+lcAddress1+"&destinations="+lcAddress2+"&mode=driving&language=nl-BE&sensor=false"
loHTTP = Createobject("MSXML2.XMLHTTP")
loHTTP.Open("GET", lcURL, .F.)
loHTTP.Send
oXMLDOM = loHTTP.responseXML
lcResult=(loHTTP.ResponseText)
oOrigine = oXMLDOM.selectNodes("//origin_address")
If "NOT_FOUND" $ lcResult Then
Else &&! NOT_FOUND = FOUND
llFound = .T.
Endif && "NOT_FOUND" $ lcResult

Endif &&if !EMPTY(cAddress1)

If llFound

lcDeparture = oOrigine.Item(0).Text
lcArrival0 = oXMLDOM.selectNodes("//destination_address")
lcArrival = lcArrival0.Item(0).Text
lcStatus0 = oXMLDOM.selectNodes("//status")
lcStatus = lcStatus0.Item(0).Text
lcDuration0 = oXMLDOM.selectNodes("//duration / text")
lcDuration = lcDuration0.Item(0).Text
lcDistance0 = oXMLDOM.selectNodes("//distance / text")
lcDistance = lcDistance0.Item(0).Text

Endif

[/VFP]

code functionne, mais bien que le code mentionne bien 'mode=driving' il semble que le distance et le duration est messuré par air en mode ligne droîte. Voir les examples donne entre les deux adresses par teste.

Coordialement,

Koen

Koen
17/02/2017
12:33:58

Re: distance entre deux adresses avec google maps
Le 17/02/2017 à 18:18, Mike Gagnon a écrit :
> Réponse envoyée
>
> Mike
>
>
>
>
Cet échange est bien mystérieux.

Marc Thivolle

Feed RSS des derniers codes ajoutés sur www.foxprofr.com    (source )

Date Titre Auteur

Feed RSS du forum www.foxprofr.com    (source )

Date Titre Auteur

Feed RSS des news de www.foxcentral.net    (source )

Date Titre Auteur
22/02/2017
21:03:13

Markdown Monster 1.2 released

West Wind Technologies
20/02/2017
19:37:58

West Wind WebSurge 1.02 released

West Wind Technologies
12/02/2017
03:00:57

Chicago FUDG meets Tuesday 14 Feb 2017

Chicago FoxPro Users and Developers Group
07/02/2017
22:11:13

Help Builder 5.0 RC3 released

West Wind Technologies
02/02/2017
10:31:47

West Wind Web Connection 6.10 released

West Wind Technologies
02/01/2017
20:55:09

Markdown Monster 1.1 released

West Wind Technologies

Feed RSS de fox.wikis.com    (source )

Date Titre Auteur

 


Publicité

Les pubs en cours :


www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2017.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0