OVH Cloud OVH Cloud

delete cascade via macro

7 réponses
Avatar
ran
Bonjour,

j'essaie de créer un lien d'intégrité référentielle par macro (exécuter code
SQL)

une intégrité référentielle qui ferait ON DELETE CASCADE
je buche depuis 4 jours , à s'en rendre folle

pourriez-vous m'aider ?

d'avance merci

si vous me répondez en VB merci d'expliquer avec précision où on met que
champ, de quelle table avec précision parceque je ne comprends rien au vb.

Access 2000

7 réponses

Avatar
Evaro
Bonjour,

"ran" <duchemin@(nospam)ibelgique.com> a écrit dans le message de news:
co9f1j$1qic$

j'essaie de créer un lien d'intégrité référentielle par macro (exécuter
code
SQL)

une intégrité référentielle qui ferait ON DELETE CASCADE
je buche depuis 4 jours , à s'en rendre folle

pourriez-vous m'aider ?

d'avance merci

si vous me répondez en VB merci d'expliquer avec précision où on met que
champ, de quelle table avec précision parceque je ne comprends rien au vb.

Access 2000


En SQL je ne sais pas faire, mais voici deux fonctions VBA, la première
récupérée sur le site de Raymond et adaptée supprime une relation.

Public Function Suppr_Relation(nTable As String, nForeignTable As String) As
Boolean
On Error GoTo Err_Func
Dim db As DAO.Database, ix As Integer
Set db = CurrentDB()
Suppr_Relation = False
For ix = 0 To db.Relations.Count - 1
If db.Relations(ix).Table = nTable And db.Relations(ix).ForeignTable
= nForeignTable Then
db.Relations.Delete db.Relations(ix).Name
Suppr_Relation = True
End If
Next ix
Set db = Nothing
Exit Function
Err_Func:
Suppr_Relation = False
End Function

Public Function Cre_Relation(dbName As String, nRelation As String, nTable
As String, nForeignTable As String, lngAttrib As Long, nField1 As String,
nForeignField1 As String, Optional nField2 As String, Optional
nForeignField2 As String, Optional nField3 As String, Optional
nForeignField3 As String)

'On crée une relation et définit ses propriétés.
Dim rel As DAO.Relation, chp1 As DAO.Field, chp2 As DAO.Field, chp3 As
DAO.Field
Dim db As DAO.Database
Set db = DBEngine.Workspaces(0).OpenDatabase(dbName) ' Autre base de
données ou bien
Set db = CurrentDB ' Autre base de données ou bien
Set rel = db.CreateRelation(nRelation, nTable, nForeignTable, lngAttrib)
' On crée un champ dans la collection Fields de l'objet Relation
' rel.Attributes = lngAttrib ' dbRelationUpdateCascade +
dbRelationDeleteCascade
' On ajoute le champ à l'objet Relation et l'objet
Set chp1 = rel.CreateField(nField1)
chp1.ForeignName = nForeignField1
rel.Fields.Append chp1
' Stop
If Len(Nz(nField2)) > 0 Then
Set chp2 = rel.CreateField(nField2)
chp2.ForeignName = nForeignField2
rel.Fields.Append chp2
End If
If Len(Nz(nField3)) > 0 Then
Set chp3 = rel.CreateField(nField3)
chp3.ForeignName = nForeignField3
rel.Fields.Append chp3
End If
db.Relations.Append rel

End Function

Exemple d'utilisation :
boolVar = Cre_Relation("C:MonCheminMaBase.mdb", "Client_Commande",
"T_Client", "T_Commande", dbRelationUpdateCascade +
dbRelationDeleteCascade, "IdClient", "IdClient")

Avatar
mouly
"ran" <duchemin@(nospam)ibelgique.com> écrivait
news:co9f1j$1qic$:

Bonjour,

j'essaie de créer un lien d'intégrité référentielle par macro
(exécuter code SQL)


je ne sai spas faire depuis sql (je pense meme qu'on ne peut pas)

si vous me répondez en VB merci d'expliquer avec précision où on met
que champ, de quelle table avec précision parceque je ne comprends
rien au vb.


avec la fonction que l'on te donne dans l'autre réponse
tu fais ce qui suit :

crée un nouveau module (dans l'onglet module)
ouvre le (double click dessus)
copy dans le module la fonction que l'on t'a donnée
ferme l'editeur vb
crée une nouvelle macro "ExécuterCode"
Dans nom de fonction (en bas) tu recopies le nom de la fonction vb avec
entre parenthèse les paramètres que tu veux
mafonction(param1,param2,param3...)


--
mouly
mouly2 at yahoo dot com

Avatar
ran
ça ne fonctionne pas
access me dit qu'il ne reconnait pas la fonction
dbRelationUpdateCascade

et je ne comprends pas ce que représente nRelation

merci à vous

-----Message d'origine-----
Bonjour,

"ran" <duchemin@(nospam)ibelgique.com> a écrit dans le
message de news:

co9f1j$1qic$

j'essaie de créer un lien d'intégrité référentielle
par macro (exécuter


code
SQL)

une intégrité référentielle qui ferait ON DELETE
CASCADE


je buche depuis 4 jours , à s'en rendre folle

pourriez-vous m'aider ?

d'avance merci

si vous me répondez en VB merci d'expliquer avec
précision où on met que


champ, de quelle table avec précision parceque je ne
comprends rien au vb.



Access 2000


En SQL je ne sais pas faire, mais voici deux fonctions
VBA, la première

récupérée sur le site de Raymond et adaptée supprime une
relation.


Public Function Suppr_Relation(nTable As String,
nForeignTable As String) As

Boolean
On Error GoTo Err_Func
Dim db As DAO.Database, ix As Integer
Set db = CurrentDB()
Suppr_Relation = False
For ix = 0 To db.Relations.Count - 1
If db.Relations(ix).Table = nTable And
db.Relations(ix).ForeignTable

= nForeignTable Then
db.Relations.Delete db.Relations(ix).Name
Suppr_Relation = True
End If
Next ix
Set db = Nothing
Exit Function
Err_Func:
Suppr_Relation = False
End Function

Public Function Cre_Relation(dbName As String, nRelation
As String, nTable

As String, nForeignTable As String, lngAttrib As Long,
nField1 As String,

nForeignField1 As String, Optional nField2 As String,
Optional

nForeignField2 As String, Optional nField3 As String,
Optional

nForeignField3 As String)

'On crée une relation et définit ses propriétés.
Dim rel As DAO.Relation, chp1 As DAO.Field, chp2 As
DAO.Field, chp3 As

DAO.Field
Dim db As DAO.Database
Set db = DBEngine.Workspaces(0).OpenDatabase
(dbName) ' Autre base de

données ou bien
Set db = CurrentDB ' Autre base de données ou bien
Set rel = db.CreateRelation(nRelation, nTable,
nForeignTable, lngAttrib)

' On crée un champ dans la collection Fields de l'objet
Relation

' rel.Attributes = lngAttrib '
dbRelationUpdateCascade +

dbRelationDeleteCascade
' On ajoute le champ à l'objet Relation et l'objet
Set chp1 = rel.CreateField(nField1)
chp1.ForeignName = nForeignField1
rel.Fields.Append chp1
' Stop
If Len(Nz(nField2)) > 0 Then
Set chp2 = rel.CreateField(nField2)
chp2.ForeignName = nForeignField2
rel.Fields.Append chp2
End If
If Len(Nz(nField3)) > 0 Then
Set chp3 = rel.CreateField(nField3)
chp3.ForeignName = nForeignField3
rel.Fields.Append chp3
End If
db.Relations.Append rel

End Function

Exemple d'utilisation :
boolVar = Cre_Relation
("C:MonCheminMaBase.mdb", "Client_Commande",

"T_Client", "T_Commande", dbRelationUpdateCascade +
dbRelationDeleteCascade, "IdClient", "IdClient")

.




Avatar
Evaro
Bonjour,

"ran" a écrit dans le message de news:
a9e801c4d6bb$f4291ce0$
ça ne fonctionne pas
access me dit qu'il ne reconnait pas la fonction
dbRelationUpdateCascade

Ce n'est pas une fonction, c'est une constante qui appartient à la
bibliothèque DAO. Elle vaut 256 et
dbRelationDeleteCascade vaut 4096.
tu pourrais remplacer la constante par sa valeur, mais ton code sera moins
lisible et moins portable.


Depuis ton environnement VBA, va dans le menu Outils / Références et vérifie







































que "Microsoft DAO 3.6 Object Library est cochée", sinon recherche cette
référence et coche la.









































et je ne comprends pas ce que représente nRelation










































C'est le nom de la relation ; on ne le voit pas dans l'interface Access mais
il existe et n'est accessible qu'en VBA .

Tus peux concatémer tes deux noms de tables, par exemple
"T_Client_T_Commandes"

@ +

Etienne







































Avatar
ran
Tout d'abord,
un grand merci de prendre la peine d'aider la néophite
que je suis, le vb est toujours d'une complexité
désolante pour moi.

ensuite :
Si j'utilise la commande

Cre_Relation("H:ExecutionPompeBureau
EtudeBDDplanspiècesmod.mdb","MODèLE_PIèCE","MODèLE","PIè
CE", dbRelationDeleteCascade, "ID2MODèLE"; "ID2MODèLE")

dans la macro, ça me donne le message d'erreur suivant:
Microsoft Access
Impossible pour Microsoft Access de trouver le
nom 'dbRelationDeleteCascade' entrê dans l'expression.
Vous avez peut-êlre spêcifiê un conlr61e qui ne se
Irouvaitpas sur
l'objetencourssansindiquerdecontextedeformulaireoud'êtat.
Pour faire rêfêrence a une valeur de champ ou de conlr61e
sur un aulre formulaire ou êtat, faitesprêcêder le nom du
champ ou du conlr61e du nom d'une collection,
habituellement des formulaires ou des êtats, etd u nom du
formulaire ou êtatauquel le champ ou le conlr61e
appartient. Par exemple, Forms![Produits]![Unites en
stock]


Cre_Relation("H:ExecutionPompeBureau
EtudeBDDplanspiècesmod.mdb";"MODèLE_PIèCE";"MODèLE";"PIè
CE"; dbRelationDeleteCascade; "ID2MODèLE"; "ID2MODèLE")

dans la macro, ça me donne le message d'erreur suivant:

MIcrosoft Access
La syntaxe de l'expression entrée n'est pas
correcte.
Vous avez omis une opérande ou un opérateur, vous avez
entré un caractère ou une virgule non valides, ou encore
du texte sans le délimiter par des guillemets.

j'ai bien coché DAO 3.6

-----Message d'origine-----
Bonjour,

"ran" a écrit dans
le message de news:

a9e801c4d6bb$f4291ce0$
ça ne fonctionne pas
access me dit qu'il ne reconnait pas la fonction
dbRelationUpdateCascade

Ce n'est pas une fonction, c'est une constante qui
appartient à la

bibliothèque DAO. Elle vaut 256 et
dbRelationDeleteCascade vaut 4096.
tu pourrais remplacer la constante par sa valeur, mais
ton code sera moins

lisible et moins portable.


Depuis ton environnement VBA, va dans le menu Outils /







































Références et vérifie

que "Microsoft DAO 3.6 Object Library est cochée", sinon
recherche cette

référence et coche la.









































et je ne comprends pas ce que représente nRelation










































C'est le nom de la relation ; on ne le voit pas dans
l'interface Access mais

il existe et n'est accessible qu'en VBA .

Tus peux concatémer tes deux noms de tables, par exemple
"T_Client_T_Commandes"

@ +

Etienne


.










































Avatar
Evaro
"ran" a écrit dans le message de news:
15e201c4d6cb$0877ca70$
Tout d'abord,
un grand merci de prendre la peine d'aider la néophite
que je suis, le vb est toujours d'une complexité
désolante pour moi.

ensuite :
Si j'utilise la commande

Cre_Relation("H:ExecutionPompeBureau
EtudeBDDplanspiècesmod.mdb","MODèLE_PIèCE","MODèLE","PIè
CE", dbRelationDeleteCascade, "ID2MODèLE"; "ID2MODèLE")

dans la macro, ça me donne le message d'erreur suivant:
Microsoft Access
Impossible pour Microsoft Access de trouver le
nom 'dbRelationDeleteCascade' entrê dans l'expression.
Vous avez peut-êlre spêcifiê un conlr61e qui ne se
Irouvaitpas sur
l'objetencourssansindiquerdecontextedeformulaireoud'êtat.
Pour faire rêfêrence a une valeur de champ ou de conlr61e
sur un aulre formulaire ou êtat, faitesprêcêder le nom du
champ ou du conlr61e du nom d'une collection,
habituellement des formulaires ou des êtats, etd u nom du
formulaire ou êtatauquel le champ ou le conlr61e
appartient. Par exemple, Forms![Produits]![Unites en
stock]


Cre_Relation("H:ExecutionPompeBureau
EtudeBDDplanspiècesmod.mdb";"MODèLE_PIèCE";"MODèLE";"PIè
CE"; dbRelationDeleteCascade; "ID2MODèLE"; "ID2MODèLE")


As-tu esssayé de remplacer dbRelationDeleteCascade par 4096 ?




























Essaye de lancer le code :
BoolVar = Cre_Relation.... avec le générateur de code et non le générateur
d'expression.
@+
Etienne




























Avatar
Ben voilà !!!

c'était via la macro que ça passait pas.
Maintenant , y'a de l'espoir :-)

un TOUT TOUT GRAND MERCI

z'êtes un magicien !!!
si si
Ran

Essaye de lancer le code :
BoolVar = Cre_Relation.... avec le générateur de code et
non le générateur

d'expression.