Hallo Thomas,
Post by Thomas WinklerPost by André Minhorsthttp://www.access-entwicklerbuch.de/2007/index.php?page=buch&bookpage=Kap_08/05_02.html
Siehe dort unter Funktion 'CREATETABLEMitANSI92'.
Wie Du schon in der Diskussion mit Karl mitbekommen hast, löst Dein
Vorschlag mein Problem nicht.
reite nur darauf herum ...
Post by Thomas WinklerAllerdings habe ich inzwischen weiter experimentiert und habe eine
funktionierende Lösung gefunden. Allerdings bereitet sie mir ein wenig
Bauchschmerzen, wegen eineiger Probleme (sind das überhaupt welche), die
"On Error Resume Next" erfordern. Was meint ihr dazu?
(BTW: Hab die Sub extra so benannt, dass Karl sein "ALTER CONSTRAINT"
bekommt :-)
Public Sub alterConstraint(ByRef strRelationName As String, ByRef
lngAttributes As Long)
Dim relOld As DAO.Relation
Dim relNew As DAO.Relation
Dim fldOld As DAO.Field
Dim fldNew As DAO.Field
Dim prp As DAO.Property
'Das ist nötig, da sich nicht alle Properties übertragen lassen
On Error Resume Next
For Each relOld In CurrentDb.Relations
If LCase(relOld.Name) = LCase(strRelationName) Then
Set relNew = CurrentDb.CreateRelation
'Properies der Relation übertragen
For Each prp In relOld.Properties
If LCase(prp.Name = "attributes") Then
relNew.Properties(prp.Name) = lngAttributes
Else
relNew.Properties(prp.Name) = relOld.Properties(prp.Name)
End If
Next prp
'Felder übertragen
For Each fldOld In relOld.Fields
Set fldNew = relNew.CreateField(fldOld.Name)
'Properties der Felder übertragen
For Each prp In fldOld.Properties
fldNew.Properties(prp.Name) = fldOld.Properties(prp.Name)
Next prp
relNew.Fields.Append fldNew
Next fldOld
CurrentDb.Relations.Delete relOld.Name
CurrentDb.Relations.Append relNew
End If
Next relOld
End Sub
Ist das praxistauglich? Mit welchen Nebeneffekten ist ggf. zu rechnen?
Das On Error Resume next wäre mir hier ein wenig zu global. Ich würde es
nur vor der Zeile positionieren, die beim Übertragen der Properties
Probleme macht und die Fehlerbehandlung direkt dahinter wieder mit On Error
Goto 0 anschalten.
Und eigentlich wolltest Du ja auch nur die Löschweitergabe hinzufügen. Du
darfst dann also nicht pauschal einen neuen Wert über lngAttributes setzen,
weil Du damit ja gegebenenfalls andere Attribute änderst. Stattdessen musst
Du prüfen, ob schon eine Löschweitergabe vorhanden ist und diese
gegebenenfalls hinzufügen (ungetestet):
...
If LCase(prp.Name = "attributes") Then
If not relOld.Properties(prp.Name) _
OR dbDeleteCascade = dbDeleteCascade then
relNew.Properties(prp.Name) = lngAttributes + dbDeleteCascade
else
relNew.Properties(prp.Name) = lngAttributes
end if
Else
...
Noch besser wäre, Du prüfst vor dem Anlegen der neuen Relation, ob die
Löschweitergabe schon aktiviert ist:
If relOld.Properties("Attributes").Value Or dbDeleteCascade =
dbDeleteCascade then ...
Falls ja, kannst Du direkt zum nächsten Relation-Objekt wechseln.
Generell würde es mir allerdings Bauchschmerzen bereiten, pauschal die
Löschweitergabe aller Relationen zu aktivieren.
Ciao
André
--
http://www.access-entwicklerbuch.de
http://www.access-im-unternehmen.de