[Résolu][Base] Modifier un chemin absolu en chemin relatif

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
mumblee
NOOuvel adepte
NOOuvel adepte
Messages : 19
Inscription : 17 janv. 2009 11:30

[Résolu][Base] Modifier un chemin absolu en chemin relatif

Message par mumblee »

Bonjour,

Je débute en OOo Basic et malgré mes recherches, je n'arrive pas à trouver comment modifier la macro de Pierre-Yves Samyn pour obtenir un chemin relatif au lieu d'absolu. Le but est de pouvoir déplacer un répertoire contenant :
  • un fichier odb avec une table stockant les chemins vers des images externes
  • des fichiers images
et que l'ensemble reste fonctionnel.

La macro, maintes fois évoquée sur ces forums, est

Code : Tout sélectionner

sub EnregistrerChemin(PysEvent)
thiscomponent.drawPage.forms.getByName("MainForm").getByName("txtNomFichier").Text =_
		PysEvent.Source.Text
thiscomponent.drawPage.forms.getByName("MainForm").getByName("txtNomFichier").commit
end sub
(j'ai enlevé l'appel à AfficherImage qui n'a pas de rapport avec la question posée)

Lors de mes recherches, j'ai bien trouvé mention de DirectoryNameoutofPath et de ThisDatabaseDocument mais je ne sais pas trop comment m'y prendre :(

Des conseils svp ? Merci !
Dernière modification par mumblee le 01 mai 2011 02:41, modifié 3 fois.
LibreOffice 3.4.5 officielle, OOO340m1 (Build:502) - Ubuntu 11.10
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Re: [Base] Modifier un chemin absolu en chemin relatif

Message par Pierre-Yves Samyn »

Bonjour

Le problème est que c'est le chemin absolu qui doit être enregistré car c'est ce dont a besoin la macro pour afficher l'image concernée (je suppose que tu as fait l'essai de modifier "manuellement" le chemin pour ne garder que le nom de l'image et constaté que cela ne fonctionnait pas).

En cas de déplacement des images (ou d'arborescence différente) la piste serait alors de modifier les url par une requête de mise à jour (update) cf. http://user.services.openoffice.org/fr/ ... f=9&t=1543

Par exemple, si l'url précédent était :

Code : Tout sélectionner

C:\Documents and Settings\Pierre-Yves\Mes documents\poubelle\forum\
Pour le transformer en :

Code : Tout sélectionner

C:\Nouvel URL\
On pourrait faire :

Code : Tout sélectionner

UPDATE "TFacture" SET "NomImage" = 'C:\Nouvel URL\' || RIGHT("NomImage", LENGTH("NomImage")- LENGTH('C:\Documents and Settings\Pierre-Yves\Mes documents\poubelle\forum\')) 
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Modifier un chemin absolu en chemin relatif

Message par Dude »

Salut,

Une autre solution serait de stocker le chemin dans une table puis de charger cette donnée au démarrage de la base en variable globale.

Cela oblige néanmoins à revoir tout le mécanisme d'affichage du contrôle picto pour ajouter le chemin à la propriété URL.

:idea:
Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
mumblee
NOOuvel adepte
NOOuvel adepte
Messages : 19
Inscription : 17 janv. 2009 11:30

Re: [Base] Modifier un chemin absolu en chemin relatif

Message par mumblee »

Bonjour,

Merci de vos réponses. Je n'ai pas réagi plus tôt car j'étais en mode "bricolage-du-matin-au-soir" pendant que les enfants étaient chez les mamies :)

La première solution proposée, effectuer une requête SQL à la main, est intéressante et ponctuellement utile mais elle ne me conviendra pas. Il faut modifier la requête à chaque déménagement des données. C'est le cas à chaque fois que je transmets un tel fichier base (contenant des urls vers des fichiers externes à la base) à quelqu'un. Je cherche quelque chose de plus automatisé et générique.

J'ai bien compris que Base a besoin d'urls absolues pour accéder à un fichier. Je vois les choses ainsi :
  • stockage des urls relatives dans la base
  • lorsque c'est nécessaire -accès à un fichier externe depuis son url relative-, on fabrique l'url en concatenant le répertoire du fichier odb et le chemin relativement à ce fichier.
Est-ce qu'il existe une fonction du Basic d'OOo qui retourne le chemin d'accès à un fichier odb ?

Débutant en Basic OOo, merci de bien vouloir m'orienter :oops: En attendant je continue évidemment à chercher de mon côté...

Merci !

PS @Dude : je ne suis pas sûr d'avoir bien compris la solution que tu proposes. Pour éviter de devoir faire un UPDATE de tous les enregistrements, on stocke le chemin dans une table afin de n'avoir que cet enregistrement là à modifier ? L'utilisation d'une variable globale ne dispensera pas d'une concaténation non ? Si c'est faisable autant initialiser cette variable à la volée plutôt qu'à l'aide d'un enregistrement qui serait caduque après démanagement. Qu'en dis-tu ?
LibreOffice 3.4.5 officielle, OOO340m1 (Build:502) - Ubuntu 11.10
mumblee
NOOuvel adepte
NOOuvel adepte
Messages : 19
Inscription : 17 janv. 2009 11:30

Re: [Base] Modifier un chemin absolu en chemin relatif

Message par mumblee »

Oui, je sais, normalement on ne poste pas deux messages l'un à la suite de l'autre, mais je n'apporte pas vraiment que des précisions au message précédent.

Alors d'abord, en réponse à la question :
Est-ce qu'il existe une fonction du Basic d'OOo qui retourne le chemin d'accès à un fichier odb ?
j'ai trouvé la propriété Url de la variable spéciale ThisComponent. Ainsi le code suivant affiche ce qui était recherché :

Code : Tout sélectionner

Sub Mezou
	Msgbox("L'url d'accès au fichier courant est " + ThisComponent.Url)
End Sub
Du coup, j'ai modifié les macros de Pys (si je peux me permettre l'abréviation) pour essayer de couper et recoller des chaînes de caractères mais l'appel à la macro FileNameoutofPath échoue avec le message
Valeur ou type de données incorrect(e).
Index hors de la plage définie.
Pourtant l'appel à cette macro fonctionne très bien depuis l'IDE Basic. Le problème semble donc venir de son appel depuis un formulaire au lieu de l'IDE. Comment rectifier cela ? Un peu d'aide svp !

PS : je joint une base exemple contenant les macros évoquées.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 3.4.5 officielle, OOO340m1 (Build:502) - Ubuntu 11.10
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

Re: [Base] Modifier un chemin absolu en chemin relatif

Message par Churay »

Bonsoir
Du coup, j'ai modifié les macros de Pys (si je peux me permettre l'abréviation) pour essayer de couper et recoller des chaînes de caractères mais l'appel à la macro FileNameoutofPath échoue avec le message
FileNameoutofPath est une fonction de la bibliothèque Tools, qui n'est pas chargée par défaut.
Avant d'appeler la fonction il peut être judicieux de vérifier si elle est chargée et le faire si besoin :

Code : Tout sélectionner

If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
              GlobalScope.BasicLibraries.LoadLibrary("Tools")
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
mumblee
NOOuvel adepte
NOOuvel adepte
Messages : 19
Inscription : 17 janv. 2009 11:30

Re: [Base] Modifier un chemin absolu en chemin relatif

Message par mumblee »

Bonsoir,
Churay a écrit : Avant d'appeler la fonction il peut être judicieux de vérifier si elle est chargée et le faire si besoin :
Oui, oui, la librairie est bien chargée, voir le code.

J'ai dû mal m'exprimer. Ce n'est pas l'appel qui échoue mais l'exécution de cette fonction. Lorsque la boîte de dialogue avec le message d'erreur s'affiche l'IDE s'ouvre et pointe sur la fonction FileNameoutofPath. Vous pouvez vérifier cela à l'aide du fichier odb fourni.

----- un peu plus tard... -----

J'ai un peu remanié le bazard, fait des tests et il s'avère qu'à l'ouverture du formulaire, la propriété ThisComponent.Url est vide ! Cela explique l'erreur dans l'appel à la fonction FileNameoutofPath.

Quelqu'un qui connaît la partie adéquate de l'API peut-il m'expliquer comment accéder au fichier odb qui contient le formulaire svp ? Cela résoudrait mes problèmes.

Je joint la version modifiée du odb. Pour les images, voir le zip précédent.

----- bien plus tard... -----

J'ai enfin trouvé, il fallait utiliser ThisDatabaseDocument au lieu de ThisComponent. Voir . Dire que j'en avais parlé dans mon premier message de ce fil et qu'après je l'ai complètement oublié puisque tous les tutoriels et documentations lus me parlaient de ThisComponent et de StarDesktop.CurrentComponent...

Je joint une dernière version du fichier odb qui fonctionne. J'ose espérer que cela utile à d'autres :)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 3.4.5 officielle, OOO340m1 (Build:502) - Ubuntu 11.10
Avatar de l’utilisateur
junior76
Membre lOOyal
Membre lOOyal
Messages : 28
Inscription : 29 oct. 2007 14:45

Re: [Résolu][Base] Modifier un chemin absolu en chemin relat

Message par junior76 »

Bonjour,

merci d'avoir partager ton travail.

Juste pour info, ta macro ne fonctionne pas sous Ooo Windows.

L'URL de la base est "file:///C:/base" tandis que le contrôle "sélection d'un fichier" retourne "C:\base\monfichier.pdf"

Je n'ai pas la solution mais vais chercher car je souhaite réaliser exactement la même fonction (indépendamment de l'OS).

Cordialement.

Junior76
OpenOffice 3.2 sous Windows XP SP3
OpenOffice 3.2 sous Windows XP SP3 avec Liberkey (OOO320m12 (Build:9483))
Avatar de l’utilisateur
junior76
Membre lOOyal
Membre lOOyal
Messages : 28
Inscription : 29 oct. 2007 14:45

Re: [Résolu][Base] Modifier un chemin absolu en chemin relat

Message par junior76 »

Voici le code source qui permet de s'affranchir du système d'exploitation mais qui permet de réaliser une fonction similaire :

Code : Tout sélectionner

' Macro pour mémoriser dans le champs chemin le chemin relatif.
Sub MemorisationCheminRelatif(Chemin as event)
	Dim CheminOrigine, RepertoireODB as string
	Dim aPath as Variant

	'Stock le chemin du fichier qui vient d'être sélectionner
	CheminOrigine = ConvertToURL(Chemin.Source.Text)

	'Récupère le répertoire de la base de données
	aPath = split(convertToURL(ThisDatabaseDocument.Url), "/") 'Récupère le chemin de la base et le découpe par répertoire
	aPath(UBound(aPath ())) = "" 'Supprime le nom du fichier
	RepertoireODB = join(aPath , "/")  'Recolle tous les morceaux ensembles

	'Vérifie si le document est bel et bien un sous-répertoire de la BDD
	If instr(CheminOrigine, RepertoireODB)=1 then
		'Si OK, mémoire le chemin relatif dans "chemin_document"
		ThisComponent.Drawpage.Forms.GetByName("FORM_document").GetByName("chemin_document").text = Right(CheminOrigine, Len(CheminOrigine)-Len(RepertoireODB))
		ThisComponent.Drawpage.Forms.GetByName("FORM_document").GetByName("chemin_document").commit
	else
		MsgBox("Le fichier séléctionné n'est pas contenu dans les sous-répertoire de la base de donnée. De ce fait, nous ne pouvons ajouter ce fichier à la base.")
	endif
End Sub
Et en bonus, le code qui permet d'ouvrir le fichier directement via le formulaire :

Code : Tout sélectionner

'Ouvrir le fichier du champs "chemin_document"
Sub OuvrirDocument
	Dim Adresse, RepertoireODB as string
	Dim aPath as Variant
	Dim sv as Object

	'Récupère le répertoire de la base de données
	aPath = split(convertToURL(ThisDatabaseDocument.Url), "/") 'Récupère le chemin de la base et le découpe par répertoire
	aPath(UBound(aPath ())) = "" 'Supprime le nom du fichier
	RepertoireODB = join(aPath , "/")  'Recolle tout les morceaux ensemble

	'Concatene le Chemin de la base avec le chemin relatif
	Adresse = ConvertFromURL(RepertoireODB + ThisComponent.Drawpage.Forms.GetByName("FORM_document").GetByName("chemin_document").text)

	'Ouvre le fichier
	sv = createUnoService("com.sun.star.system.SystemShellExecute")
	sv.execute(Adresse, "",0)
End Sub
OpenOffice 3.2 sous Windows XP SP3
OpenOffice 3.2 sous Windows XP SP3 avec Liberkey (OOO320m12 (Build:9483))