[Base] Copier une table depuis un formulaire

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

[Base] Copier une table depuis un formulaire

Message par Pierre-Yves Samyn »

L'exemple traité ici permet, depuis un formulaire, de sélectionner une table puis de la copier.


L'intérêt est d'illustrer comment :
  • "remonter" depuis le formulaire jusqu'à la connexion
  • manipuler des contrôles de formulaire
  • manipuler les tables
  • exécuter une requête
Cet exemple est donc un "condensé" d'un certain nombre de questions abordées dans la section Macro...


Le principe est de créer un formulaire comprenant :
  • un formulaire nommé Standard
  • un contrôle liste nommé ListeDesTables
  • un bouton Actualiser auquel on associe la procédure PysActualiserListe
  • un bouton Copier auquel on associe la procédure PysCopier
La procédure PysActualiserListe peut aussi être associée à l'événement Réception de focus de la liste.

Le formulaire "menu" affiche la liste des tables. Sélectionner une table et cliquer sur Copier.

Nota : la nouvelle table prend le nom initial précédé de "Copie de".

Il va de soi que l'on pourrait améliorer en demandant le nom par exemple, mais bon, il me faudrait plus de temps, et puis ce n'est plus que de l'habillage :D

De même, la procédure de copie peut bien sûr être appelée autrement que depuis un formulaire...

Code : Tout sélectionner

option explicit

Sub PysActualiserListe(PysEvent)
dim PysConnection as object

PysConnection = PysEvent.Source.Model.Parent.ActiveConnection

with thiscomponent.DrawPage.Forms.getByName("Standard").getByName("ListeDesTables")
	.StringItemList = PysConnection.Tables.ElementNames
	.SelectedItems = array(0)
end with

End Sub

Sub PysCopier(PysEvent)

dim PysConnection as object, PysCols as object, PysCol as object, PysTables as object
dim PysTblDescriptor as object, PysColDescriptor as object
dim PysRequete as object, PysResultat
dim PysACopierNom as string, PysSQL as string


PysConnection = PysEvent.Source.Model.Parent.ActiveConnection
PysACopierNom = thiscomponent.DrawPage.Forms.getByName("Standard").getByName("ListeDesTables").CurrentValue

PysTables = PysConnection.Tables

if thiscomponent.DrawPage.Forms.getByName("Standard").getByName("ListeDesTables").currentvalue = "" then
	msgbox "Sélectionner une table dans la liste"
else
	if PysTables.hasByName("copie de " & PysACopierNom) then
		msgbox "La table : " & "copie de " & PysACopierNom & chr(10) & "existe déjà", 32, "Copie de table"
	else
		PysTblDescriptor = PysTables.createDataDescriptor
		PysTblDescriptor.Name = "copie de " & PysACopierNom
		PysColDescriptor = 	PysTblDescriptor.columns.createDataDescriptor
		
		PysCols = PysTables.getByName(PysACopierNom).columns
		
		for each PysCol in PysCols
			PysColDescriptor.Name = PysCol.Name
			PysColDescriptor.Type = PysCol.Type
			PysColDescriptor.Precision = PysCol.Precision
			PysTblDescriptor.columns.appendByDescriptor(PysColDescriptor)
		next PysCol
		
		PysTables.appendByDescriptor(PysTblDescriptor)
		
		PysSQL = "INSERT INTO ""copie de " & PysACopierNom & """ "&_
		            " ( SELECT """ & PysACopierNom & """.""*"" FROM """ & PysACopierNom & """)"
		
		PysRequete = PysConnection.createStatement()
		PysResultat = PysRequete.executeQuery(PysSQL) 
		      
		with thiscomponent.DrawPage.Forms.getByName("Standard").getByName("ListeDesTables")
			.StringItemList = PysConnection.Tables.ElementNames
			.SelectedItems = array(ubound(.StringItemList))
		end with
	end if
end if	

End Sub

Base exemple : http://user.services.openoffice.org/fr/ ... 030316.odb