Macro Calc qui ne marche plus en V5

Bonjour,

Le code ci-dessous affiche une boite de dialogue et en récupère les éléments.

Ce code fonctionnait en version 3.6 et en version 4. Depuis le déploiement d'une version 5, il plante à la ligne suivante (Variable objet non définie)

oPDialog.getControl("DateField1").setDate(CDateToIso(Date))

Si je désactive cette ligne, le reste fonctionne bien. (avec un message d'erreur sur la validation de la boite, logique)

J'ai cherché dans l'aide la fonction CDateToIso qui existe toujours. Même topo avec Now à la place de Date.

J'ai tenté de déclarer oPDialog as object mais rien de mieux.

J'ai tenté également de charger d'autres librairies (extrait de l'aide) sans rien de mieux.

Avez-vous une idée de ce qui pourrait ne plus lui plaire avec cette ligne ? Le contrôle DateField1 est bien toujours présent. Rien n'a été modifié.

Merci d'avance pour vos pistes.

Marie-Jo

Bonsoir Marie-Jo,

Bonjour,

Le code ci-dessous affiche une boite de dialogue et en récupère les
éléments.

Ce code fonctionnait en version 3.6 et en version 4. Depuis le
déploiement d'une version 5, il plante à la ligne suivante (Variable
objet non définie)

oPDialog.getControl("DateField1").setDate(CDateToIso(Date))

En décomposant :
oControl = oPDialog.getControl("DateField1")
oControl.setDate(CDateToIso(Date))

où est-ce que ça plante ? Sur la 1ere ligne ou sur la seconde ?

Si c'est sur la 1ere, alors il n'y a pas de contrôle "DateField1" sur le dialogue. S'il y en a un, regarder s'il n'y en aurait pas un 2e de même nom :slight_smile:

Si c'est sur la 2e, alors le contrôle "DateField1" n'est pas du bon type.

Amicalement,

Du fait du changement dans la gestion des dates (introduction d'une structure com.sun.star.util.Date dans la v.4.chaispu), il faut maintenant écrire :

oPDialog.getControl("DateField1").setDate(CDateToUnoDate(Date))

Amicalement,

Le changement a eu lieu dans la v.4.1.1 de libO.

Plus d'infos à propos des dates ici, par Bernard Marcelly :
https://forum.openoffice.org/fr/forum/viewtopic.php?f=8&t=41236&p=226246#p226246

Et les release notes (notes de version) :
https://wiki.documentfoundation.org/ReleaseNotes/4.1#Changes_to_UNO_APIs

... intéressante lecture :slight_smile:

Amicalement,

Pour ceux que ça intéresse...

Méthode de débogage pour ce cas de plantage

1. Installer l'outil xray de Bernard Marcelly

à télécharger ici :
http://berma.pagesperso-orange.fr/

2. Dans notre code, après avoir décomposé la ligne plantogène

oPDialog.getControl("DateField1").setDate(CDateToIso(Date))

en

oControl = oPDialog.getControl("DateField1")
oControl.setDate(CDateToIso(Date))

ajouter une instruction

oControl = oPDialog.getControl("DateField1")
xray oControl
oControl.setDate(CDateToIso(Date))

pour analyser le contrôle DateField et ses propriétés et méthodes.

(pour que l'instruction fonctionne, la bibliothèque xray doit avoir été chargée : il suffit de l'ouvrir dans l'IDE au préalable [la double cliquer])

3. Exécuter

L'outil XRay affiche les infos demandées

4. On y voit que, dans les méthodes de oControl, la méthode setDate() attend un type "struct".

5. Ensuite chercher sur internet "libreoffice datefield setdate"
qui renvoie vers (4e entrée sous le moteur de recherche StartPage)

"[Solved] Put current date into Date Field"
https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=67996

où l'on voit qu'il s'agit d'une structure de type com.sun.star.util.Date

Infos complémentaires

Bonjour Jean-François

1000 mercis... car d'autres fichiers sont impactés. Nous avons l'explication !

Le changement a eu lieu dans la v.4.1.1 de libO.

Plus d'infos à propos des dates ici, par Bernard Marcelly :
https://forum.openoffice.org/fr/forum/viewtopic.php?f=8&t=41236&p=226246#p226246

Et les release notes (notes de version) :
https://wiki.documentfoundation.org/ReleaseNotes/4.1#Changes_to_UNO_APIs

... intéressante lecture :slight_smile:

Amicalement,

A noter du coup que j'ai modifié également la suite du code (qui enregistre les données de la boite de dialogue)
Code d'origine (qui plante)
     'Date_garde = CDateFromIso(oPDialog.getControl("DateField1").getDate)
Remplacé par ce code qui marche
     Date_garde = CDateFromUnoDate(oPDialog.getControl("DateField1").getDate)

*Pour mémoire, tu m'a donnés cette solution (je ne vois pas où il est question de moralité ;-))*
Moralité, remplace la ligne
oDateField1.setDate(CDateToIso(Date))
par
oDateField1.setDate(CDateToUnoDate(Date))

Marie-Jo