bonjour,
J'aimerais savoir (car je n'ai rien trouvé avec Xray et sur le net) s'il
était possible de supprimer des relations entre tables par macro ?
Merci
bonjour,
J'aimerais savoir (car je n'ai rien trouvé avec Xray et sur le net) s'il
était possible de supprimer des relations entre tables par macro ?
Merci
Bonjour
LibreStefan wrote
J'aimerais savoir (car je n'ai rien trouvé avec Xray et sur le net) s'il
était possible de supprimer des relations entre tables par macro ?
Xray ne peut pas donner d'info puisque les relations sont définies par du
SQL.
Tu peux décompresser un odb et voir le fichier script dans le sous-dossier
database (instructions CONSTRAINT FOREIGN KEY REFERENCES).
Cordialement
Pierre-Yves
une fois de plus merci.
Mais, il me semble que tu peux créer des tables/des champs par macro. d'où
ma supputation de pouvoir supprimer/créer des relations par macros !
Suite...
LibreStefan wrote
Mais, il me semble que tu peux créer des tables/des champs par macro. d'où
ma supputation de pouvoir supprimer/créer des relations par macros !
Ben... je ne crois pas avoir dit le contraire mais j'ai été un peu court
dans mes
explications...
Les macros peuvent exécuter du SQL donc il devrait suffire de passer les
instructions
correspondantes (données précédemment et dont tu peux trouver l'explication
sur les
sites dédiés au sql). Cela dit, je n'ai pas essayé donc pas d'exemple à te
passer là
tout de suite...
Tu peux déjà vérifier ta syntaxe en interactif via Outils> Sql
Cordialement
Pierre-Yves
P-Y-S ce n'était pas une attaque :). je vais regarder
Bonjour LibreStefan 
Te serait-il possible de t'abonner à la liste/users@fr.libreoffice.org/ , ce qui te permettrait transmettre et de recevoir instantanément tes messages ? En effet, si tu n'es pas abonné à cette liste, tes messages passent par une équipe de modérateurs, ce qui, malgré une certaine réactivité, entraîne d'inévitables délais de traitement.
S'abonner à cette liste (ou d'autres) est très simple, il te suffit d'envoyer un message vide à :Inscription à la liste Utilisateurs de LibreOffice <users+subscribe@fr.libreoffice.org> , tu recevras alors en retour un message automatique généré par un robot t'invitant à confirmer ton abonnement.
Prends garde toutefois à ce que cette réponse n’atterrisse pas dans la boîte "Spam" de ton logiciel de courrier électronique.
Bien cordialement,
Philippe
Simple pour toi ... moi je comprends rien 
Re-bonjour LibreStefan
Il suffit de consulter la page : https://fr.libreoffice.org/assistance/ qui explique en détail (et certainement bien mieux que moi) le fonctionnement, ce qui en soit, n'est pas plus compliqué que d'utiliser le formulaire d'assistance 
Bien cordialement
c'est bon j'ai trouvé comment faire avec les infos de P.Y.S
Suite...
LibreStefan wrote
c'est bon j'ai trouvé comment faire avec les infos de P.Y.S
Ok, super... 
Cela dit, comme je l'indiquais je n'avais pas encore travaillé là-dessus et
j'ai
"accepté" un peu vite le fait qu'on ne trouvait pas avec Xray.
M'étant penché rapidement sur l'API je m'aperçois qu'il devrait y avoir
tout ce qu'il faut pour éviter de passer par le SQL (ce qui devrait éviter
les problèmes de portabilité d'un moteur à un autre).
Du coup, ni une ni deux, ci-dessous un exemple illustrant comment
supprimer les index (clé primaire et relations existantes) pour la table
FournisseursProduits de la base jointe. Puis bien sûr, recréation...
Comme l'autre fois, le code ci-dessous est "minimal" : aucun contrôle
n'est fait (y a-t-il des données ? gestion des erreurs, etc.). Ce genre de
question ne serait pas à se poser si les index étaient créés lors de la
création de la table...
Le programme manipulant la base (et ma connaissance du truc étant plus
que récente) il va de soi que je te conseille de travailler sur des copies
et
non une base de production...
GestionRelations.odb
<http://nabble.documentfoundation.org/file/n4102167/GestionRelations.odb>
Cordialement
Pierre-Yves (ci-dessous le code)
sub PysCreerRelation
dim oConnection as object, oDesc as object, oDescCol as object, oTable as
object, oCol as object
dim i as long
oConnection = ThisDatabaseDocument.DataSource.getConnection("","")
oTable = oConnection.Tables.getByName("FournisseursProduits")
' Suppression des index déjà définis
for i = oTable.keys.count - 1 to 0 step -1
oTable.keys.dropByIndex(i)
next i
' Création de la clé primaire pour la table
oCol = oTable.columns.getByName("IDFournisseursProduits")
' Création du descripteur pour la clé primaire
oDesc = oTable.Keys.createDataDescriptor
oDesc.Type = com.sun.star.sdbcx.KeyType.PRIMARY
oDesc.Columns.appendByDescriptor(oCol)
' Ajout à l'index
oTable.Keys.appendByDescriptor(oDesc)
' Création de la relation vers table Fournisseur
oCol = oTable.columns.getByName("RéfFournisseur")
set oDesc = nothing
' Création du descripteur pour la clé externe
oDesc = oTable.Keys.createDataDescriptor
' Création du descripteur pour la propriété RelatedColumn
oDescCol = oDesc.Columns.createDataDescriptor
oDescCol.Name = "RéfFournisseur"
oDescCol.Type = com.sun.star.sdbcx.KeyType.FOREIGN
oDescCol.RelatedColumn = "RéfFournisseur"
oDesc.Type = com.sun.star.sdbcx.KeyType.FOREIGN
oDesc.ReferencedTable = "Fournisseurs"
oDesc.UpdateRule = com.sun.star.sdbc.KeyRule.NO_ACTION
oDesc.DeleteRule = com.sun.star.sdbc.KeyRule.NO_ACTION
oDesc.Columns.appendByDescriptor(oDescCol)
' Ajout à l'index
oTable.Keys.appendByDescriptor(oDesc)
' Création de la relation vers table Produits
oCol = oTable.columns.getByName("RéfProduit")
set oDesc = nothing
' Création du descripteur pour la clé externe
oDesc = oTable.Keys.createDataDescriptor
' Création du descripteur pour la propriété RelatedColumn
oDescCol = oDesc.Columns.createDataDescriptor
oDescCol.Name = "RéfProduit"
oDescCol.Type = com.sun.star.sdbcx.KeyType.FOREIGN
oDescCol.RelatedColumn = "RéfProduit"
oDesc.Type = com.sun.star.sdbcx.KeyType.FOREIGN
oDesc.ReferencedTable = "Produits"
oDesc.UpdateRule = com.sun.star.sdbc.KeyRule.NO_ACTION
oDesc.DeleteRule = com.sun.star.sdbc.KeyRule.NO_ACTION
oDesc.Columns.appendByDescriptor(oDescCol)
' Ajout à l'index
oTable.Keys.appendByDescriptor(oDesc)
end sub
Il y a une erreur dans le codage qui néanmoins ne déclenche pas une message
si l'on l'exécute:
En deux cas il y a la ligne:
pierre-yves samyn wrote
oDescCol.Type = com.sun.star.sdbcx.KeyType.FOREIGN
Cette constante n'est pas correcte pour une colonne, on aura besoin d'une
constante du type com.sun.star.sdbc.DataType.... La valeur de la constante
est 3, donc le „Type“ de la colonne en ton cas est DECIMAL.
En essayant de créer une *nouvelle* table je suis arrivé aux mêmes
instructions. Il y a seulement une chose à observer dans cette situation: On
doit (avec LibreOffice 4.2 au moins) d'abord créer la table (avec le PRIMARY
KEY, ça fonctionne), et puis ajouter la FOREIGN KEY à l'objet table.
Mon exemple (testé avec MySQL/MariaDB):
tableDescr = tables.createDataDescriptor
tableDescr.Name = "textmodule"
keyDescr = tableDescr.Keys.createDataDescriptor
keyDescr.Name = "Primary Key"
keyDescr.Type = com.sun.star.sdbcx.KeyType.PRIMARY
colDescr = tableDescr.Columns.createDataDescriptor
colDescr.Name = "seg"
colDescr.Type = com.sun.star.sdbc.DataType.CHAR
colDescr.Precision = 4
tableDescr.Columns.appendByDescriptor(colDescr)
keyDescr.Columns.appendByDescriptor(colDescr)
colDescr = tableDescr.Columns.createDataDescriptor
colDescr.Name = "textno"
colDescr.Type = com.sun.star.sdbc.DataType.TINYINT
colDescr.Precision = 6
tableDescr.Columns.appendByDescriptor(colDescr)
keyDescr.Columns.appendByDescriptor(colDescr)
colDescr = tableDescr.Columns.createDataDescriptor
colDescr.Name = "textdefinition"
colDescr.Type = com.sun.star.sdbc.DataType.VARCHAR
colDescr.Precision = 255
tableDescr.Columns.appendByDescriptor(colDescr)
tableDescr.Keys.appendByDescriptor(keyDescr)
' this creates the table:
tables.appendByDescriptor(tableDescr)
' Now create the foreign Key:
table = tables.getByName("textmodule")
keyDescr2 = table.Keys.createDataDescriptor
keyDescr2.Name = "FK_textmodule_segment"
keyDescr2.Type = com.sun.star.sdbcx.KeyType.FOREIGN
keyDescr2.DeleteRule = com.sun.star.sdbc.KeyRule.RESTRICT
keyDescr2.UpdateRule = com.sun.star.sdbc.KeyRule.RESTRICT
keyDescr2.ReferencedTable = "segment"
colDescr2 = keyDescr2.Columns.createDataDescriptor
colDescr2.Name = "seg" 'column in this table
colDescr2.Type = com.sun.star.sdbc.DataType.CHAR
colDescr2.Precision = 4
colDescr2.relatedColumn = "segment" 'column of the referenced table
keyDescr2.Columns.appendByDescriptor(colDescr2)
table.Keys.appendByDescriptor(keyDescr2)
Seulement le nom du clé n'est oas arrivé à la base de données, il y a un
nom généré: textmodule_ibfk_1
Gerhard
Bonjour
Gerhard Weydt wrote
Il y a une erreur dans le codage qui néanmoins ne déclenche pas une
message si l'on l'exécute:
...
Mon exemple (testé avec MySQL/MariaDB):
Je n'ai pas testé avec MySQL/MariaDB.
Le programme fonctionne avec une base "intégrée" au format HSQL
(ce qui était la question me semble-t-il). Je pense d'ailleurs que depuis
mars LibreStefan a eu le temps de le tester...
Pour info. mes sources :
http://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1sdbcx_1_1XDataDescriptorFactory.html#af61495d9431ea7757d0c4557d8766c70
http://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1sdbcx_1_1Key.html
http://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1sdbcx_1_1Key.html#a0c41ab1135fb338045777af3367d99c3
http://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1sdbcx_1_1KeyType.html
Pierre-Yves
Bonjour Pierre-Yves,
Bien sûr, le programme fonctionne, indépendant de la base de données.
Mais l'utilisation de la constante /com.sun.star.sdbcx.KeyType.FOREIGN/
est incorrecte dans le context d'une colonne. Comme la constante
simplement est une nombre INTEGER, le programme fonctionne et crée une
colonne de type DECIMAL, parce que la constante
/com.sun.star.sdbc.DataType.DECIMAL/ a aussi bien la valeur 3. Ça peut
être ce que tu voulais, mais il serait mieux d'utliser la constante
DataType en ce cas. Peut-être j'aurais dû utiliser un autre mot que
"erreur" mais le français n'est pas ma langue maternelle. Mes excuses si
ça t'a offensé!
L'indication de MySQL/MariaDB veut seulement dire que je ne sais pas si
tout fonctionne avec ce code pour une autre machine. Mon point,
cependant, est qu'il est nécessaire de créer la table
avec/tables.appendByDescriptor**/avant de définir le foreign key (je ne
connais pas la traduction).
Cordialement
Gerhard
Suite...
Peut-être j'aurais dû utiliser un autre mot que
"erreur" mais le français n'est pas ma langue maternelle. Mes excuses si
ça t'a offensé!
Aucun problème, je ne suis pas senti offensé 
"Erreur" est tout à fait correct... et je te félicite pour ton
français, surtout quand je compare avec ma pratique des langues
étrangères 
Cependant je ne te comprends pas très bien sur ce point :
Mais l'utilisation de la constante /com.sun.star.sdbcx.KeyType.FOREIGN/
est incorrecte dans le context d'une colonne. Comme la constante
simplement est une nombre INTEGER, le programme fonctionne et crée une
colonne de type DECIMAL
La question initiale, et donc ma réponse, ne porte pas sur la
création d'une table (ou l'ajout de colonne à une table) mais
sur la gestion des relations sur des tables existantes.
Le programme ne crée aucune colonne.
Cordialement
Pierre-Yves
Bonsoir Pierre-Yves,
c'est correct, le programme ne crée pas des colonnes d'une table, mais
il crée un élément d'une clé externe (j'ai trouvé la traduction dans ton
codage!).
Ici l'extrait pertinent du code:
oDesc = oTable.Keys.createDataDescriptor
...
' Création du descripteur pour la propriété RelatedColumn
oDescCol = oDesc.Columns.createDataDescriptor
oDescCol.Name = "RéfFournisseur"
oDescCol.Type = com.sun.star.sdbcx.KeyType.FOREIGN
oDescCol.RelatedColumn = "RéfFournisseur"
J'appelle ça aussi une colonne, et je pense que les auteurs d'UNO
pensaient ainsi, comme ils ont fourni la méthode createDataDescriptor
pour l'objet *Columns* de l'objet *Keys*. Et pour un DataDescriptor
d'une colonne le type est décrit par une constante
com.sun.star.sdbc.DataType.... :
On peut ou utiliser une telle constante ou la valeur numérique, mais
utiliser une constante devenant d'un autre contexte est déroutant.
Je n'ai pas supposé que tu aies utilisé la constante avec intention,
mais que c'était une erreur de copier-coller qu'on ne remarque pas,
parce que tout fonctionne. Mais pour un lecteur qui essaie de comprendre
ton codage l'emploi de la constante correcte est très utile, parce qu'il
comprend une documentation. Mon intention était de rendre ce point plus
clair.
Du reste je dois dire que j'étais très heureux de trouver ton exemple.
J'avais cherché assez longtemps pour trouver les commandes correctes, et
apparemment je n'ai utilisé les mots-clé corrects pour le trouver
qu'après que j'eusse trouvé la solution, à l'exception de l'ordre
"création de la table et puis création de l'index". Ton exemple me
confirmait que j'étais sur le bon chemin.
Cordialement
Gerhard
Suite...
> Peut-être j'aurais dû utiliser un autre mot que
> "erreur" mais le français n'est pas ma langue maternelle. Mes
excuses si
> ça t'a offensé!Aucun problème, je ne suis pas senti offensé
"Erreur" est tout à fait correct... et je te félicite pour ton
français, surtout quand je compare avec ma pratique des langues
étrangèresCependant je ne te comprends pas très bien sur ce point :
> Mais l'utilisation de la constante /com.sun.star.sdbcx.KeyType.FOREIGN/
> est incorrecte dans le context d'une colonne. Comme la constante
> simplement est une nombre INTEGER, le programme fonctionne et crée une
> colonne de type DECIMALLa question initiale, et donc ma réponse, ne porte pas sur la
création d'une table (ou l'ajout de colonne à une table) mais
sur la gestion des relations sur des tables existantes.
Le programme ne crée aucune colonne.Cordialement
Pierre-Yves--
Envoyez un mail à [hidden email]
</user/SendEmail.jtp?type=node&node=4128931&i=0> pour savoir comment
vous désinscrire
Les archives de la liste sont disponibles à
http://listarchives.libreoffice.org/fr/users/
Tous les messages envoyés sur cette liste seront archivés publiquement
et ne pourront pas être supprimés------------------------------------------------------------------------
If you reply to this email, your message will be added to the
discussion below:
http://nabble.documentfoundation.org/Supprimer-creer-des-relations-entre-tables-par-macro-tp4102110p4128931.htmlTo unsubscribe from Supprimer/créer des relations entre tables par
macro, click here
<http://nabble.documentfoundation.org/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=4102110&code=Z2VyaGFyZC53ZXlkdEB0LW9ubGluZS5kZXw0MTAyMTEwfDk2NTI2MTYxMw==>.
NAML
<http://nabble.documentfoundation.org/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html!nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers!nabble%3Aemail.naml-instant_emails!nabble%3Aemail.naml-send_instant_email!nabble%3Aemail.naml>
gjbiffba.png (33K) <http://nabble.documentfoundation.org/attachment/4128940/0/gjbiffba.png>