Distribué par le projet Fr.OpenOffice.org

Exemples de macros pour manipuler des bases de données et réaliser des formulaires évolués

Révision 1.00 du 05/07/04

Réalisé avec : OOo 1.1.2	Plate-forme / Os : Toutes

Table des Matières

1 But de cet how-to	3

2 Pré-requis	3

3 Comment éviter les messages d'erreur à l'ouverture de ce fichier	3

4 Préparation préliminaire pour tester toutes les macros	4

5 Gestion des sources de données	5

5.a Liste des sources de données	5

5.b Liste des propriétés d'une source de données	5

5.c Création d'une source de données	5

5.d Suppression d'une source de données	6

5.e Activation des paramètres nommés	6

5.f Liste des tables d'une source de données	7

6 Gestion des tables	9

6.a Liste des champs d'une table	9

6.b Liste des clés d'une table	9

6.c Liste des indexes d'une table	10

6.d Création d'une table	11

6.e Suppression d'une table	11

7 Gestion des requêtes	12

7.a Liste des requêtes d'une source de données	12

7.b Créer une requête dans une source de données	12

7.c Supprimer une requête dans une source de données	13

8 Gestion des données	14

8.a Lire les enregistrements d'une table	14

8.b Lire un enregistrement de type Date et l'écrire dans un fichier Calc	15

8.c Ajouter un enregistrement dans une table	16

8.d Modification d'un enregistrement	16

8.e Suppression d'un enregistrement	16

9 Formulaires	17

9.a Sélectionner un enregistrement à partir d'une ListBox	17

9.b Enregistrer un champ calculé dans une table	17

9.c Remplir une ListBox et une ComboBox par macro	18

9.d Désactiver un champ en fonction du contenu d'un autre	19

9.e Rendre un champ invisible en fonction du contenu d'un autre	19

9.f Rendre une section invisible en fonction du contenu d'un champ	20

9.g Afficher des Images dans un formulaire	21

9.h Afficher les Images d'un dossier	22

10 Autres liens sur la programmation ou sur les formulaires	23

11 Conclusion	23

12 Crédits	24

13 Licence	24

But de cet how-to

Cet how-to a pour but de donner un maximum d'exemples de macros dans le domaine des bases de données et des formulaires.

Je l'ai réalisé car je pense qu'il est beaucoup plus facile (en tout cas pour moi) d'apprendre un nouveau langage de programmation en partant d'exemples simples.

J'espère donc qu'il vous donnera envie de vous lancer dans la programmation en basic sous OOo et, en particulier, dans la création de formulaires évolués.

Et peut-être qu'à votre tour, vous aurez envie de venir partager sur le site francophone de OOo vos propres macros et vos formulaires.

Pré-requis

Cet how-to est destiné à des personnes ayant déjà des connaissances dans les domaines suivants :

Création et utilisation de sources de données (Outils / Sources de données ou F4)

Création et utilisation de formulaires

Bases de données (Langage SQL)

Utilisation de l'éditeur de macros.

Assignation d'une macro à un bouton ou à un événement.

Vous trouverez des liens vers d'autres documents à la fin de cet how-to sur les sujets ci-dessus.

Comment éviter les messages d'erreur à l'ouverture de ce fichier

Normalement, si tout se passe bien, vous avez dû voir 6 fois le message d'erreur suivant apparaître sur votre écran lors de l'ouverture de ce fichier.

En effet plusieurs macros de ce document nécessitent une source de donnée « dBase » avec une table nommée « Essai » pour fonctionner. Si ce n'est pas le cas, les formulaires utilisant cette table n'arrivent pas à s'initialiser ce qui provoque ces messages.

Pour éviter ces messages et pour faire fonctionner l'ensemble des macros de ce document, je vous conseille donc la lecture du chapitre suivant.

Préparation préliminaire pour tester toutes les macros

La plupart des macros de ce document ne nécessitent aucune préparation et sont directement fonctionnelles. Il est donc possible de tester la macro, simplement en cliquant sur le bouton correspondant, pour en voir le résultat et ensuite en étudier son code.

D'autres macros nécessitent de créer une table particulière pour fonctionner ou sinon il faudra adapter la macro ou modifier le formulaire. Mais je pense qu'il sera plus simple de créer une table de test au format dBase pour pouvoir utiliser ces macros (et éviter aussi les messages d'erreurs à l'ouverture de ce fichier).

Voici la procédure :

Il faut commencer par créer une source de données de type « dBase » nommée également « dBase » (Outils / Source de données).

Ensuite, il faut créer une nouvelle table dans cette source de données ayant les caractéristiques suivantes :

Champ1 (Numérique)

Champ2 (Numérique)

Total (Numérique)

Fichier (Char)

LaDate (Date)

Ensuite, il est préférable de renseigner quelques valeurs dans votre nouvelle table.

Au final, vous devez donc avoir quelque chose qui ressemble à cela :

Une fois cette table créée, il faut fermer ce fichier et le ré-ouvrir pour vérifier la disparition des messages d'erreurs.

Gestion des sources de données

Liste des sources de données

La liste des sources de données est celle qui apparaît en faisant « Outils / Source de données ».

sub Liste_Source_De_Donnees()

dim oContext as object

dim TabNomSources as variant

dim i as integer

'Objet contenant les sources de données.

oContext = createUnoService("com.sun.star.sdb.DatabaseContext")

'Tableau contenant les noms des sources de données.

TabNomSources=oContext.getElementNames()

'UBound retourne le nombre d'éléments du tableau

for i = 0 to UBound(TabNomSources())

msgbox TabNomsources(i)

next i

end sub

Liste des propriétés d'une source de données

Les propriétés d'une source de données sont les informations que vous avez renseignées lors de la création de celle-ci (Nom, URL, Type...).

Dans la plupart des cas, il suffit de connaître le nom de la source et son URL pour la créer. Les autres propriétés sont plus rarement utilisées.

L'URL de la source comprend à la fois le type de base (MySQL, dBase..) et son chemin d'accès.

sub Liste_Proprietes_Source_De_Donnees()

dim oContext as object

dim TabNomSources as variant

dim oSource as object

oContext = createUnoService("com.sun.star.sdb.DatabaseContext")

TabNomSources=oContext.getElementNames()

'Object contenant la premiere source de données trouvée

oSource=oContext.GetByName(TabNomSources(0))

msgbox "Nom de la source de données : " & TabNomSources(0)

msgbox "URL : " & oSource.URL

msgbox "IsReadOnly : " & oSource.IsReadOnly

msgbox "IsPasswordRequired : " & oSource.IsPasswordRequired

msgbox "User : " & oSource.User

msgbox "Password : " & oSource.Password

end sub

Création d'une source de données

Pour faire fonctionner cet exemple, il est nécessaire de renseigner les lignes 7, 9 et 11.

Il existe un how-to sur le site indiquant d'une manière détaillée comment créer une source de données automatiquement lors de l'ouverture d'un fichier pour réaliser des publipostages.

sub Creation_Source_De_Donnees()

dim oContext as object

dim oSource as object

dim Reponse as string

'Mettre Calc, dBase ou MySQL (attention à la casse)

const TypeSource="dBase"

'Nom de la source de données à créer

const NomSource="dBaseTest"

'Nom et Chemin complet de la base

const NomBase="C:\Test.dbf"

oContext=createUnoService("com.sun.star.sdb.DatabaseContext")

'Test si la source de données existe

Reponse=oContext.hasByName(NomSource)

If Reponse then

msgbox "La source de données " & NomSource & " existe déjà !"

exit sub

end if

'Création de la source de données

oSource = oContext.createInstance

oContext.registerObject(NomSource, oSource)

select case TypeSource

case "dBase": oSource.URL = "sdbc:dbase:" & NomBase

case "Calc": oSource.URL = "sdbc:calc:" & NomBase

case "MySQL": oSource.URL = "sdbc:mysql:odbc:" & NomBase

end select

msgbox "Source de Données " & NomSource & " créée."

end sub

Suppression d'une source de données

Pour faire fonctionner cet exemple, il est nécessaire d'indiquer en ligne 6, le nom de la source de données à supprimer. Par défaut, cet exemple supprimera la source de données créée par l'exemple précédent.

sub Suppression_Source_De_Donnees()

dim oContext as object

dim Reponse as boolean

'Nom de la source de données à créer

const NomSource="dBaseTest"

oContext=createUnoService("com.sun.star.sdb.DatabaseContext")

'Test si la source de données existe

Reponse=oContext.hasByName(NomSource)

If not Reponse then

msgbox "La source de données " & NomSource & " n'existe pas !"

exit sub

end if

'Suppression de la source de données

oContext.revokeObject(NomSource)

msgbox "Source de Données " & NomSource & " supprimée !"

end sub

Activation des paramètres nommés

Cette macro permet de faire fonctionner les sous-formulaires pour les versions 1.0.x de OOo et provient d'un how-to anglais sur la création de sous-formulaires :

http://dba.openoffice.org/howto/param_subst.html.

Pour les versions plus récentes (>1.1.x), elle n'est plus nécessaire sauf pour la base de données Sqlite.

Les paramètres nommés permettent de créer des sous-formulaires et des requêtes du genre "SELECT * FROM MaTable WHERE LeChamp=:toto" Le signe : signale qu'il faut utiliser le paramètre nommé "toto" qui sera demandé à l'utilisateur pour exécuter la requête SQL.

Pour plus d'infos, sur l'utilisation des paramètres nommés voir les documents suivants :

http://fr.openoffice.org/Documentation/How-to/Bdd/06bdd_ht_paramnomme.sxw

http://fr.openoffice.org/Documentation/How-to/calc/Transfert_de_donnees%2014fr.sxw

http://fr.openoffice.org/Documentation/How-to/writer/creation_sous-formulaires20fr_1.01.sxw

Sub EnableParameterNameSubstitution()

dim sDataSourceName as string

sDataSourceName = InputBox("Nom de la source de données : " )

' the data source context (ehm - the service name is historical :)

Dim aContext as Object

aContext = createUnoService( "com.sun.star.sdb.DatabaseContext" )

If ( Not aContext.hasByName( sDataSourceName ) ) Then

MsgBox "Source inexistante : " + sDataSourceName + "!"

Exit Sub

End If

' the data source

Dim aDataSource as Object

aDataSource = aContext.getByName( sDataSourceName )

' append the new ParameterNameSubstitution flag

Dim bFlag as Boolean

bFlag = TRUE

Dim aInfo as Variant

aInfo = aDataSource.Info

aInfo = AddInfo( aInfo, "ParameterNameSubstitution", bFlag )

' and write back

aDataSource.Info = aInfo

' flush (not really necessary, but to be on the safe side :)

aDataSource.flush

End Sub

Function AddInfo( aOldInfo() as new com.sun.star.beans.PropertyValue,sSettingsName as String, aSettingsValue as Variant ) as Variant

Dim nLower as Integer

Dim nUpper as Integer

nLower = LBound( aOldInfo() )

nUpper = UBound( aOldInfo() )

' look if the setting is already present

Dim bNeedAdd as Boolean

bNeedAdd = TRUE

Dim i As Integer

For i = nLower To nUpper

If ( aOldInfo( i ).Name = sSettingsName ) Then

aOldInfo( i ).Value = aSettingsValue

bNeedAdd = FALSE

End If

Next i

' allocate the new array

Dim nNewSize as Integer

nNewSize = ( nUpper - nLower )

If bNeedAdd Then nNewSize = nNewSize + 1

Dim aNewInfo( nNewSize ) as new com.sun.star.beans.PropertyValue

' copy the elements (a simply copy does not work in Basic)

For i = nLower To nUpper

aNewInfo( i ) = aOldInfo( i )

Next i

' append the new setting, if necessary

If ( bNeedAdd ) Then

aNewInfo( nUpper + 1 ).Name = sSettingsName

aNewInfo( nUpper + 1 ).Value = aSettingsValue

End If

AddInfo = aNewInfo()

End Function

Liste des tables d'une source de données

En ligne 15, il est possible d'indiquer le nom de la source de données à utiliser plutôt que de prendre la première source de données trouvée.

sub Liste_Tables()

dim oContext as object

dim oSource as object

dim oConnexion as object

dim oLesTables as object

dim Reponse as boolean

dim TabNomSources as variant

dim NomSource as string

dim i as integer

dim Login as string, Password as string

oContext = createUnoService("com.sun.star.sdb.DatabaseContext")

TabNomSources=oContext.getElementNames()

NomSource=TabNomSources(0) 'Nom de la première source de données

'NomSource="dBase" 'Nom de la source de données

oSource=oContext.GetByName(Nomsource)

Login="" 'Indiquer le login de connexion à la source

Password="" 'Indiquer le password de connexion

oConnexion=oSource.getconnection(Login,Password)

oLesTables=oConnexion.tables 'Objet contenant toutes les tables

msgbox "Nombre de tables = " & NomSource & " = " & oLesTables.count

'Affiche la liste des tables

for i = 0 to (oLesTables.count-1)

msgbox oLesTables(i).name

next i

end sub

Gestion des tables

Liste des champs d'une table

En ligne 17, il est possible d'indiquer le nom de la source de données à utiliser plutôt que de prendre la première source de données trouvée.

sub Liste_Proprietes_Table()

dim oContext as object

dim oSource as object

dim oConnexion as object

dim oLesTables as object

dim oTable as object

dim oLesChamps as object

dim Reponse as boolean

dim TabNomSources as variant

dim NomSource as string

dim i as integer

dim Login as string, Password as string

oContext = createUnoService("com.sun.star.sdb.DatabaseContext")

TabNomSources=oContext.getElementNames()

NomSource=TabNomSources(0) 'Nom de la première source de données

'NomSource="dBase" 'Nom de la source de données

oSource=oContext.GetByName(Nomsource)

Login="" 'Indiquer le login de connexion à la source

Password="" 'Indiquer le password de connexion

oConnexion=oSource.getconnection(Login,Password)

oLesTables=oConnexion.tables 'Objet contenant toutes les tables

msgbox "Nombre de tables dans " & NomSource & "=" & oLesTables.count

oTable=oLesTables(0) 'Objet contenant la première table

msgbox "Nom de la première table = " & oTable.name

oLesChamps=oTable.columns 'Object contenant les champs

msgbox "Nombre de champs de " & oTable.name & "=" & oLesChamps.count

'Affiche la liste des noms des champs et leurs propriétés

for i = 0 to (oLesChamps.count-1)

msgbox oLesChamps(i).name & " (" & oLesChamps(i).typename & ")"

next i

end sub

Liste des clés d'une table

Si la source de données ou la table est inexistante ou si la table ne contient pas de clé, cette macro se termine en erreur.

Cet exemple ne peut pas fonctionner avec une table de type dBase, car il faut obligatoirement une clé primaire.

Pour OpenOffice, une clé correspond uniquement à la clé primaire d'une table. A ma connaissance, une table ne peut pas avoir plusieurs clés primaires.

sub Liste_Cles_Table()

dim oContext as object

dim oSource as object

dim oConnexion as object

dim oLesTables as object

dim oTable as object

dim oLesCles as object

dim oLesChamps as object

dim Reponse as boolean

dim TabNomSources as variant

dim NomSource as string

dim NomTable as string

dim i as integer, j as integer

dim Login as string, Password as string

oContext = createUnoService("com.sun.star.sdb.DatabaseContext")

TabNomSources=oContext.getElementNames()

'Demande le nom de la source -> Défaut=1iere trouvée

NomSource=TabNomSources(0)

NomSource = InputBox("Nom source de données : ","",NomSource)

oSource=oContext.GetByName(Nomsource)

Login="" 'Indiquer le login de connexion à la source

Password="" 'Indiquer le password de connexion

oConnexion=oSource.getconnection(Login,Password)

oLesTables=oConnexion.tables 'Objet contenant toutes les tables

'Demande la table -> Défaut=1iere trouvée

NomTable=oLesTables(0).name

NomTable = InputBox("Nom Table : ","",NomTable)

oTable=oLesTables.GetByName(NomTable)

oLesCles=oTable.getkeys() 'Objet contenant toutes les clés

for i=0 to oLesCles.count-1

oLesChamps=oLesCles(i).columns 'Objet contenant les champs de la clé

for j=0 to oLesChamps.count-1

msgbox oLesCles(i).name & " ->" & oLesChamps(j).name

next j

next i

if oLesCles.count=0 then msgbox "Aucune clé trouvée !"

end sub

Liste des indexes d'une table

Si la source de données ou la table est inexistante, cette macro se termine en erreur.

Cet exemple ne peut pas fonctionner avec une source de type dBase. Il faut utiliser une vraie base de données comme MySQL ou Sqlite.

La liste des indexes contient également la liste des clés (cf exemple précédent).

sub Liste_Indexes_Table()

dim oContext as object

dim oSource as object

dim oConnexion as object

dim oLesTables as object

dim oTable as object

dim oLesIndexes as object

dim oLesChamps as object

dim Reponse as boolean

dim TabNomSources as variant

dim NomSource as string

dim NomTable as string

dim i as integer, j as integer

dim Login as string, Password as string

dim Champ as string

oContext = createUnoService("com.sun.star.sdb.DatabaseContext")

TabNomSources=oContext.getElementNames()

'Demande le nom de la source -> Défaut=1iere trouvée

NomSource=TabNomSources(0)

NomSource = InputBox("Nom source de données : ","",NomSource)

oSource=oContext.GetByName(Nomsource)

Login="" 'Indiquer le login de connexion à la source

Password="" 'Indiquer le password de connexion

oConnexion=oSource.getconnection(Login,Password)

oLesTables=oConnexion.tables 'Objet contenant toutes les tables

'Demande la table -> Défaut=1iere trouvée

NomTable=oLesTables(0).name

NomTable = InputBox("Nom Table : ","",NomTable)

oTable=oLesTables.GetByName(NomTable)

oLesIndexes=oTable.GetIndexes() 'Objet contenant tous les indexes

for i=0 to oLesIndexes.count-1

oLesChamps=oLesIndexes(i).columns 'Contient les champs de la clé

Champ=""

for j=0 to oLesChamps.count-1

Champ=Champ & " " & oLesChamps(j).name

next j

msgbox oLesIndexes(i).name & "->" & Champ

next i

if oLesIndexes.count=0 then msgbox "Aucun indexe trouvé !"

end sub

Création d'une table

Si la source de données est inexistante ou si la table existe déjà, cette macro se termine en erreur.

Cet exemple ne peut pas fonctionner avec une source de type dBase. Il faut utiliser une vraie base de données comme MySQL ou Sqlite.

Sub CreationTable()

dim oContext as object

dim oSource as object

dim oConnexion as object

dim oStatement as object

dim TabNomSources as variant

dim NomSource as string

dim SQL as string

dim Retour as integer

oContext = createUnoService("com.sun.star.sdb.DatabaseContext")

TabNomSources=oContext.getElementNames()

NomSource=TabNomSources(0)

NomSource = InputBox("Nom source de données : ","",NomSource)

oSource=oContext.GetByName(Nomsource)

oConnexion=oSource.getconnection("","")

oStatement = oConnexion.CreateStatement()

'Création d'un table avec une requete SQL

SQL="CREATE TABLE TableTest(ACodeCli INT(4) NOT NULL , " & _

"ANomCli CHAR(30) NOT NULL, " & _

"PRIMARY KEY(ACodeCli)) "

Retour=oStatement.executeUpdate(SQL)

end sub

Suppression d'une table

Il suffit de reprendre l'exemple précédent en utilisant une requête SQL DROP TABLE.

Je n'ai pas mis d'exemple, pour éviter tout risque de perte de données.

Gestion des requêtes

Liste des requêtes d'une source de données

Si la source de données est inexistante, cette macro se termine en erreur.

Pour tester cette macro, il est nécessaire de créer au moins une requête dans une source de données. Pour cela, il faut faire un clic-droit + « nouvelle requête » sur la ligne « Requêtes » des sources de données.

sub Liste_Requetes()

dim oContext as object

dim oSource as object

dim oLesRequetes as object

dim TabNomSources as variant

dim TabNomRequetes as variant

dim NomSource as string

dim i as integer

oContext = createUnoService("com.sun.star.sdb.DatabaseContext")

TabNomSources=oContext.getElementNames()

NomSource=TabNomSources(0)

NomSource = InputBox("Nom source de données : ","",NomSource)

oSource=oContext.GetByName(Nomsource)

oLesRequetes=oSource.getQueryDefinitions()

TabNomRequetes=oLesRequetes.getElementNames()

for i = 0 to UBound(TabNomRequetes())

msgbox TabNomRequetes(i)

next i

if UBound(TabNomRequetes())=-1 then msgbox "Aucune requete trouvée !"

end sub

Créer une requête dans une source de données

Si la source de données est inexistante ou si la requête SQL existe déjà, cette macro se termine en erreur.

Remarque au sujet de la syntaxe des requêtes : OpenOffice est très difficile au niveau de la syntaxe. Il est conseillé de toujours utiliser l'apostrophe inclinée (ALT+GR + 7) pour entourer le nom des champs et le nom des tables. Il faut également mettre un espace de chaque coté des signes de comparaison de la clause Where.

Pour voir le résultat de cette macro, il faut regarder dans les requêtes de la source de données indiquée.

sub Creer_Requete()

dim oContext as object

dim oSource as object

dim oLesRequetes as object

dim oRequete as object

dim TabNomSources as variant

dim NomSource as string

dim SQL as string

oContext = createUnoService("com.sun.star.sdb.DatabaseContext")

TabNomSources=oContext.getElementNames()

NomSource=TabNomSources(0)

NomSource = InputBox("Nom source de données : ","",NomSource)

oSource=oContext.GetByName(Nomsource)

oLesRequetes=oSource.getQueryDefinitions()

SQL = InputBox("Requete SQL : ","","Select * From `MaTable`")

oRequete = oLesRequetes.createInstance()

oRequete.setPropertyValue("Command", SQL)

oLesRequetes.insertByName("NouvelleRequete", oRequete)

end sub

Supprimer une requête dans une source de données

Si la source de données est inexistante ou si la requête n'existe pas, cette macro se termine en erreur.

sub Supprimer_Requete

dim oContext as object

dim oSource as object

dim oLesRequetes as object

dim TabNomSources as variant

dim NomSource as string

dim NomRequete as string

oContext = createUnoService("com.sun.star.sdb.DatabaseContext")

TabNomSources=oContext.getElementNames()

NomSource=TabNomSources(0)

NomSource = InputBox("Nom source de données : ","",NomSource)

oSource=oContext.GetByName(Nomsource)

oLesRequetes=oSource.getQueryDefinitions()

NomRequete=InputBox("Requète à supprimer : ","", "NouvelleRequete")

oLesRequetes.removeByName(NomRequete)

end sub

Gestion des données

Lire les enregistrements d'une table

Si la source de données est inexistante ou si la requête SQL n'est pas valide, cette macro se termine en erreur.

Sub Liste_Enregistrement

dim oContext as object

dim oSource as object

dim oConnexion as object

dim oLesTables as object

dim oLesRequetes as object

dim oStatement as object

dim oDonnees as object

dim TabNomSources as variant

dim NomSource as string

dim NomTable as string

dim SQL as string

oContext = createUnoService("com.sun.star.sdb.DatabaseContext")

TabNomSources=oContext.getElementNames()

'Demande le nom de la source -> Défaut=1iere trouvée

NomSource=TabNomSources(0)

NomSource = InputBox("Nom source de données : ","",NomSource)

oSource=oContext.GetByName(Nomsource)

oConnexion=oSource.getconnection("","")

oLesTables=oConnexion.tables 'Objet contenant toutes les tables

'Demande la table -> Défaut=1iere trouvée

NomTable=oLesTables(0).name

'Requete SQL par défaut

SQL = "SELECT * FROM " & NomTable

SQL = InputBox("Requete SQL : ","",SQL)

oStatement = oConnexion.CreateStatement()

oDonnees=oStatement.executeQuery(SQL)

If Not IsNull(oDonnees) Then

oDonnees.next 'Retourne les données suivantes

'Affiche le contenu du 1ier et du deuxième champ

MsgBox	oDonnees.GetString(1) & "-" & oDonnees.GetString(2)

End If

End Sub

Lire un enregistrement de type Date et l'écrire dans un fichier Calc

(Auteur : Philippe Lefevre)

Cette macro nécessite la source de données de type dBase, nommée également dBase contenant une table « Essai » constituée au moins du champ « LaDate »

Cette exemple montre comment il est possible de lire une date d'une base de données pour l'écrire et la formater dans un nouveau fichier Calc.

sub Lire_Date()

dim oDoc as object

dim oFeuille as object

dim oCellule as object

dim NLS as new com.sun.star.lang.Locale

dim oFormats as Object

dim cFormatDate as string

dim lFormatId as long

oDoc = StarDesktop.LoadComponentFromURL("private:factory/scalc","_blank",0,array())

oFeuille=oDoc.getCurrentController.activeSheet

oCellule = oFeuille.getCellRangeByName("A1")

dim oContext as object

dim oSource as object

dim oInteractionHandler as object

dim oConnection as object

dim oRequete as object

dim oResultat as object

dim oDate as object

oContext = createUnoService("com.sun.star.sdb.DatabaseContext")

oSource = oContext.getByName("dBase")

oConnection=oSource.getconnection("","")

oRequete = oConnection.createStatement()

oResultat = oRequete.executeQuery("SELECT LaDate FROM Essai")

oResultat.next

oDate = oResultat.getTimestamp(1)

oCellule.Value = CDbl(DateSerial(oDate.Year, oDate.Month, oDate.Day))

NLS.Language = "FR"

NLS.Country = "fr"

oFormats = oDoc.NumberFormats

cFormatDate = "NNNNJ MMMM AAAA"

lFormatId = oFormats.queryKey(cFormatDate, NLS, true)

if lFormatId = -1 then

lFormatId = oFormats.addNew(cFormatDate, NLS)

end if

oCellule.NumberFormat = lFormatId

end sub

Ajouter un enregistrement dans une table

Si la source de données est inexistante ou si la requête SQL n'est pas valide, cette macro se termine en erreur.

Cet exemple ne peut pas fonctionner avec une source de type dBase. Il faut utiliser une vraie base de données comme MySQL ou Sqlite.

sub Ajouter_Enregistrement

dim oContext as object

dim oSource as object

dim oConnexion as object

dim oLesTables as object

dim oLesRequetes as object

dim oStatement as object

dim oDonnees as object

dim TabNomSources as variant

dim NomSource as string

dim NomTable as string

dim SQL as string

dim Retour as boolean

oContext = createUnoService("com.sun.star.sdb.DatabaseContext")

TabNomSources=oContext.getElementNames()

'Demande le nom de la source -> Défaut=1iere trouvée

NomSource=TabNomSources(0)

NomSource = InputBox("Nom source de données : ","",NomSource)

oSource=oContext.GetByName(Nomsource)

oConnexion=oSource.getconnection("","")

oLesTables=oConnexion.tables 'Objet contenant toutes les tables

NomTable=oLesTables(0).name

oStatement = oConnexion.CreateStatement()

SQL = "INSERT INTO " & NomTable & " VALUES(10, 100)"

SQL = InputBox("Requete SQL : ","",SQL)

Retour=oStatement.executeUpdate(SQL)

end sub

Modification d'un enregistrement

Il suffit de reprendre l'exemple précédent en utilisant une requête SQL UPDATE.

Je n'ai pas mis d'exemple, pour éviter tout risque de perte de données.

Suppression d'un enregistrement

Il suffit de reprendre l'exemple précédent en utilisant une requête SQL DELETE.

Je n'ai pas mis d'exemple, pour éviter tout risque de perte de données.

Formulaires

Sélectionner un enregistrement à partir d'une ListBox

Cet exemple nécessite la source de données Bibliography pour fonctionner.

En sélectionnant une référence dans la ListBox ci-dessous, les deux champs du formulaire de droite doivent afficher les données correspondantes.

La macro « Actualiser_ListBox » est affectée à l'événement « Bouton de souris enfoncé » et permet de prendre en compte les dernières modifications effectuées dans la table.

La macro Selectionner_Enregistrement » est affectée à l'événement « Modifié(es) ».

Sub Actualiser_ListBox(oEvt as object)

thiscomponent.drawpage.Forms.GetByName("Formulaire1").reload

End Sub

Sub Selectionner_Enregistrement(oEvt as object)

dim oControl as object

dim oForm as object

dim LaSelection as string

dim SQL as string

'Le controle qui appel la macro

oControl=oEvt.source

'Résultat de la sélection

LaSelection=oControl.SelectedItem

oForm=thiscomponent.drawpage.Forms.GetByName("Formulaire1")

'Défini la requete SQL

SQL="select * from biblio where Identifier='" + LaSelection + "' "

oForm.command=SQL

'Recharge le formulaire avec la nouvelle requete SQL

oForm.reload

End Sub

Enregistrer un champ calculé dans une table

Cette macro et ce formulaire nécessitent une source de données de type dBase, nommée également dBase contenant une table « Essai » constituée de 3 champs « Champ1 », « Champ2 » et « Total »

En modifiant la valeur de la zone « Champ1 » ou de la zone « Champ2 », la zone « Total » est automatiquement recalculée et la table est mise à jour.

La macro est exécutée par l'événement « Texte modifié » de « Champ1 » et de « Champ2 ».

Sub Calcul_Formulaire()

dim oForm as object

dim oChampTotal as object

dim Val1 as double

dim Val2 as double

dim ValTotal as double

'Désactive les erreurs si la table n'existe pas

on error resume next

'oForm contient l'object formulaire nommé "Formulaire2"

oForm = ThisComponent.DrawPage.Forms.getByName("Formulaire2")

'oChampTotal contient le champ de formulaire à calculer

oChampTotal=oForm.GetByName( "Total" )

'Récupération des valeurs de Champ1 et Champ2 et calcul du Total

Val1=oForm.GetByName("Champ1").effectivevalue

Val2=oForm.GetByName("Champ2").effectivevalue

ValTotal=Val1+Val2

'Cette ligne modifie le Champ nommé "Total" et met à jour la Bdd

oForm.updateDouble(oForm.findColumn("Total" ), ValTotal)

End Sub

Remplir une ListBox et une ComboBox par macro

En cliquant sur le bouton « Remplir ListBox », la liste de vos sources de données doit apparaître dans la ListBox et dans la ComboBox.

En cliquant sur le bouton « Vider ListBox », les deux listes doivent se vider.

Sub Remplir_ListeBox()

dim oForm as object

dim oListBox as object

dim oComboBox as object

dim oContext as object

dim TabNomSources as variant

oForm = ThisComponent.DrawPage.Forms.getByName("Formulaire0")

'Object contenant la ListBox

oListBox=oForm.GetByName("ListBox2")

'Object contenant la ComboBox

oComboBox=oForm.GetByName("ComboBox")

oContext = createUnoService("com.sun.star.sdb.DatabaseContext")

TabNomSources=oContext.getElementNames()

'Ajout le tableau comme élements de la ListBox

oListBox.StringItemList=TabNomSources()

'Selectionne le 1ier element de la ListBox

oListBox.SelectedItems=Array(0)

'Ajout le tableau comme élements de la ComboBox

oComboBox.StringItemList=TabNomSources()

End Sub

Sub Vider_ListeBox()

dim oForm as object

dim oListBox as object

dim oComboBox as object

oForm = ThisComponent.DrawPage.Forms.getByName("Formulaire0")

oListBox=oForm.GetByName("ListBox2" )

oListBox.StringItemList=array()

oComboBox=oForm.GetByName("ComboBox")

oComboBox.StringItemList=array()

End Sub

Désactiver un champ en fonction du contenu d'un autre

Il est nécessaire d'avoir créé la table « Essai » et la source de données « dBase » pour tester cette macro. Il faut commencer par cliquer dans « Champ1 » pour pouvoir naviguer dans ce formulaire.

Si Champ1>=10 alors Champ2 est activé (accessible)

La macro est exécutée par l'événement « Après le changement d'enregistrement » du formulaire.

Sub Desactiver_Champ_Formulaire()

dim oForm as object

dim oChamp1 as object

dim oChamp2 as object

dim Test as boolean

oForm = ThisComponent.DrawPage.Forms.getByName("Formulaire3")

'Récupération la valeur de Champ1

oChamp1=oForm.GetByName("Champ1")

'Object contenant Champ2

oChamp2=oForm.GetByName("Champ2")

'Test contient True si Champ1>=10

Test=oChamp1.effectivevalue>=10

'Champ2 est activé si Test=True

oChamp2.enabled=Test

End Sub

Rendre un champ invisible en fonction du contenu d'un autre

Il est nécessaire d'avoir créé la table « Essai » et la source de données « dBase » pour tester cette macro. Il faut commencer par cliquer dans « Champ1 » pour pouvoir naviguer dans ce formulaire.

Si Champ1>=10 alors Champ2 est visible.

La macro est exécutée par l'événement « Après le changement d'enregistrement » du formulaire.

Sub Rendre_Invisible_Champ_Formulaire()

dim oForm as object

dim oChamp1 as object

dim oChamp2 as object

dim oVueChamp2 as object

dim Test as boolean

oForm = ThisComponent.DrawPage.Forms.getByName("Formulaire4")

'Récupération la valeur de Champ1

oChamp1=oForm.GetByName("Champ1")

'Object contenant Champ2

oChamp2=oForm.GetByName("Champ2")

'Test contient True si Champ1>=10

Test=oChamp1.effectivevalue>=10

'Object contenant la vue de Champ2

oVueChamp2 = thisComponent.currentController.GetControl(oChamp2)

'Champ2 est Visible si Test=True

oVueChamp2.Visible = Test

End Sub

Rendre une section invisible en fonction du contenu d'un champ

Il est nécessaire d'avoir créé la table « Essai » et la source de données « dBase » pour tester cette macro. Il faut commencer par cliquer dans « Champ1 » pour pouvoir naviguer dans ce formulaire.

Si Champ1>=10 alors la section contenant le Champ2 est affichée.

La macro est exécutée par l'événement « Après le changement d'enregistrement » du Formulaire.

Sub Rendre_Invisible_Section()

dim oForm as object

dim oChamp1 as object

dim oChamp2 as object

dim oSection as object

dim Test as boolean

oForm = ThisComponent.DrawPage.Forms.getByName("Formulaire5")

'Récupération la valeur de Champ1

oChamp1=oForm.GetByName("Champ1")

'Object contenant Champ2

oChamp2=oForm.GetByName("Champ2")

'Test contient True si Champ1>=10

Test=oChamp1.effectivevalue>=10

oSection = ThisComponent.GetTextSections.GetByName("Section1")

oSection.IsVisible=Test

End Sub

Afficher des Images dans un formulaire

Cet exemple nécessite que la table « Essai » existe et que le champ « Fichier » de celle-ci comporte un nom de fichier image existant.

Ensuite, il faut modifier la ligne 8 ou 10 de la macro pour indiquer le chemin où sont enregistrées les images.

Il faut commencer par cliquer dans le champ de formulaire pour pouvoir naviguer dans ce formulaire.

sub Afficher_Image

Dim oForm As Object

Dim oChampNomImage As Object

Dim oImageControl As Object

Dim NomImage as string 'Nom de l'image

'Exemple de chemin pour Windows

'const Chemin="file:///C:/MesImages/"

'Exemple de chemin pour Linux

const Chemin="file:///opt/OpenOffice.org1.1.2/share/gallery/"

oForm = ThisComponent.DrawPage.Forms.getByName("Formulaire6")

'Champ de formulaire qui contient le nom de l'image

oChampNomImage = oForm.getByName("Fichier")

NomImage = oChampNomImage.effectivevalue

'Controle Picto qui contient l'image

oImageControl = oForm.GetByName("ImageControl")

oImageControl.ImageURL=Chemin & NomImage

end sub

Afficher les Images d'un dossier

Il faut modifier la ligne 1 ou 2 de la macro pour indiquer le chemin où sont enregistrées les images. Modifier éventuellement en ligne 37 le type des images de vos images (.gif)

'public const LeChemin="C:\MesImages\"

public const LeChemin="/opt/OpenOffice.org1.1.2/share/gallery/"

Sub SelectionListBox(oEvt as object)

dim LeFichier as string

LeFichier=oEvt.source.SelectedItem

Afficher_Image2(LeFichier)

End Sub

Sub SelectionComboBox(oEvt as object)

dim LeFichier as string

LeFichier=oEvt.source.SelectedText

Afficher_Image2(LeFichier)

End Sub

sub Afficher_Image2(LeFichier as string)

Dim oForm As Object

Dim oImageControl As Object

oForm = ThisComponent.DrawPage.Forms.getByName("Formulaire7")

oImageControl = oForm.GetByName("ImageControl")

oImageControl.ImageURL="file:///" & LeChemin & LeFichier

end sub

Sub Remplir_ListeBox2()

Dim LeFichier As String

dim TabNomFichiers(0) as string

dim i as integer

dim oForm as object

dim oListBox as object

dim oComboBox as object

'Liste des fichiers dans TabNomFichiers

LeFichier = Dir(LeChemin, 0)

i=0

While LeFichier <> ""

if right(LeFichier,4)=".gif" then

redim preserve TabNomFichiers(i) as string

TabNomFichiers(i)=LeFichier

i=i+1

end if

LeFichier = Dir

Wend

'Object contenant le formulaire

oForm = ThisComponent.DrawPage.Forms.getByName("Formulaire7")

'Object contenant la ListBox

oListBox=oForm.GetByName("ListBox")

'Ajout le tableau comme élements de la ListBox

oListBox.StringItemList=TabNomFichiers()

'Selectionne le 1ier element de la ListBox

oListBox.SelectedItems=Array(0)

'Object contenant la ComboBox

oComboBox=oForm.GetByName("ComboBox")

'Ajout le tableau comme élements de la ComboBox

oComboBox.StringItemList=TabNomFichiers()

End Sub

Autres liens sur la programmation ou sur les formulaires

Pour commencer en programmation, je conseille la lecture du « Manuel de programmation Basic » de Sun pour StarOffice :

http://api.openoffice.org/TipsAndTricks/external.html

http://docs.sun.com/db/doc/817-3917?l=fr&q=StarOffice&s=t

Ensuite, il existe un document donnant de nombreux exemples de macros :

http://fr.openoffice.org/Documentation/How-to/Basic/OOo_API_intro-06.sxw

Pour les plus chevronnés, il ne faut pas oublier la référence de l'API :

http://api.openoffice.org/common/ref/com/sun/star/module-ix.html

Il existe également un outil très utile pour connaître les propriétés et les méthodes des objets que l'on utilise :

http://fr.openoffice.org/Documentation/How-to/Basic/XrayTool30_fr.sxw

D'autres documents sont disponibles aux adresses :

http://fr.openoffice.org/Documentation/How-to/indexht.html

http://fr.openoffice.org/Documentation/Index.html

Pour les formulaires, il existe le document suivant pour débuter :

http://fr.openoffice.org/Documentation/How-to/writer/creation_sous-formulaires20fr_1.01.sxw

Il ne faut pas négliger non plus l'aide en ligne de OOo qui est très bien fournie dans ce domaine.

Pour le SQL, je n'ai pas vraiment de liens privilégiés, car la documentation est très abondante sur Internet, mais je pourrais citer :

http://www.commentcamarche.net/sql/sqlintro.php3

Conclusion

Voilà, c'est la fin de cet how-to et j'espère vous avoir donné envie de réaliser vos propres macros et vos propres formulaires.

Si vous avez des remarques ou si vous voulez ajouter des exemples de Macro dans ce document, il ne faut pas hésiter à me contacter en direct ou sur les « mailing-list » de OOo.

Peut-être à une prochaine fois pour de nouvelles aventures... ;-)

Crédits

Auteur : Tony GALMICHE ( tony.galmiche@tiscali.fr ou tonygalmiche@openoffice.org )

Remerciements :

Bernard Marcelly pour son aide sur la macro permettant de masquer une section et surtout pour son excellent outils Xray, sans lequel je pataugerais encore beaucoup dans l'API de OOo.

Agnès Simonet, José et Jovial pour la relecture et les tests.

Philippe Lefevre pour la relecture et la macro « Lire un enregistrement de type Date et l'écrire dans un fichier Calc »

Intégré par : Sophie GAUTIER

Dernière modification : 05/07/04

Contacts : Projet Documentation OpenOffice.org - Fr.OpenOffice.org

Traduction :

Licence

Appendix

Public Documentation License Notice

The contents of this Documentation are subject to the Public Documentation License Version 1.0 (the "License"); you may only use this Documentation if you comply with the terms of this License. A copy of the License is available at http://www.openoffice.org/licenses/PDL.html.

The Original Documentation is ''''. The Initial Writer of the Original Documentation is Tony GALMICHE Copyright (C) 2003. All Rights Reserved (Initial Writer contact: tony.galmiche@tiscali.fr or tonygalmiche@openoffice.org ) .

Contributor(s): ______________________________________.

Portions created by ______ are Copyright (C)_________[Insert year(s)]. All Rights Reserved. (Contributor contact(s):________________[Insert hyperlink/alias]).

NOTE: The text of this Appendix may differ slightly from the text of the notices in the files of the Original Documentation. You should use the text of this Appendix rather than the text found in the Original Documentation for Your Modifications.

Exemples_macro_pour_bdd_0.92

Fr.OpenOffice.org	OpenOffice.org Documentation Project How-To	20 / 24

2003-12-27T18:24:14