Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Administrar relaciones mediante código o macro

Estas en el tema de Administrar relaciones mediante código o macro en el foro de Bases de Datos General en Foros del Web. Access 2003. Mis conocimientos son muy limitados. Necesito ayuda para crear una macro (o código) que elimine la relación entre dos tablas, después ejecutará actualizaciones ...
  #1 (permalink)  
Antiguo 15/06/2008, 06:29
 
Fecha de Ingreso: junio-2008
Mensajes: 20
Antigüedad: 15 años, 10 meses
Puntos: 0
Administrar relaciones mediante código o macro

Access 2003.
Mis conocimientos son muy limitados.
Necesito ayuda para crear una macro (o código) que elimine la relación entre dos tablas, después ejecutará actualizaciones de las mismas, y posteriormente que vuelva a establecer la relación entre ellas.
Muchas gracias.
  #2 (permalink)  
Antiguo 16/06/2008, 02:06
Avatar de Taribo007  
Fecha de Ingreso: agosto-2007
Mensajes: 1.338
Antigüedad: 16 años, 8 meses
Puntos: 18
Respuesta: Administrar relaciones mediante código o macro

Mira esto:
'*************************************************
'Sacado de la Ayuda de Access
'En una MDB con tablas ya existentes, como crear
'Relaciones entre las Tablas ya existentes de Datos.Mdb

Option Compare Database
Option Explicit

Function CreateRelationX()

Dim dbsNeptuno As Database
Dim tdfEmpleados As TableDef
Dim tdfNuevo As TableDef
Dim idxNuevo As Index
Dim relNuevo As Relation
Dim idxBucle As Index

Set dbsNeptuno = OpenDatabase("c:\Carpeta\Neptuno.mdb")

With dbsNeptuno
' Agrega un campo nuevo a la tabla Empleados.
Set tdfEmpleados = .TableDefs!Empleados
tdfEmpleados.Fields.Append _
tdfEmpleados.CreateField("IdDpto", dbInteger, 2)

' Crea la tabla Departmentos nueva.
Set tdfNuevo = .CreateTableDef("Departmentos")

With tdfNuevo
' Crea y agrega los objetos Field a la
' colección Fields del objeto TableDef nuevo.
.Fields.Append .CreateField("IdDpto", dbInteger, 2)
.Fields.Append .CreateField("NombreDpto", dbText, 20)

' Crea el objeto Index en la tabla Departamentos.
Set idxNuevo = .CreateIndex("ÍndiceIdDpto")
' Crea y agrega el objeto Field a la
' colección Fields del objeto Index nuevo.
idxNuevo.Fields.Append idxNuevo.CreateField("IdDpto")
' El índice en la tabla principal debe ser
' Unique para formar parte de un Relation.
idxNuevo.Unique = True
.Indexes.Append idxNuevo
End With

.TableDefs.Append tdfNuevo

' Crea el objeto Relation EmpleadosDepartamentos, utilizando los nombres
' de las dos tablas en la relación.
Set relNuevo = .CreateRelation("EmpleadosDepartamentos", _
tdfNuevo.Name, tdfEmpleados.Name, _
dbRelationUpdateCascade)

' Crea el objeto Field para la colección Fields
' del objeto Relation nuevo. Establece las
' propiedades Name y ForeignName basadas en los
' campos que se van a utilizar en la relación.
relNuevo.Fields.Append relNuevo.CreateField("IdDpto")
relNuevo.Fields!IdDpto.ForeignName = "IdDpto"
.Relations.Append relNuevo

' Imprime un informe.
Debug.Print "Properties de" & relNuevo.Name & _
" Relation"
Debug.Print " Tabla = " & relNuevo.Table
Debug.Print " TablaExterna = " & _
relNuevo.ForeignTable
Debug.Print "Fields de " & relNuevo.Name & " Relation"

With relNuevo.Fields!IdDpto
Debug.Print " " & .Name
Debug.Print " Nombre = " & .Name
Debug.Print " TablaExterna = " & .ForeignName
End With

Debug.Print "Indexes en " & tdfEmpleados.Name & _
" TableDef"
For Each idxBucle In tdfEmpleados.Indexes
Debug.Print " " & idxBucle.Name & _
", Foreign = " & idxBucle.Foreign
Next idxBucle

' Elimina los objetos nuevos porque estos es un ejemplo.
.Relations.Delete relNuevo.Name
.TableDefs.Delete tdfNuevo.Name
tdfEmpleados.Fields.Delete "IdDpto"
.Close
End With

End Function
'************************************************* *********

Y otra forma:
'************************************************* *********
Para crear una relación, tendrás que declarar una variable
objeto «DAO.Relation».

El siguiente ejemplo creará una relación de «uno a varios» entre las tablas
«Clientes» y «Facturas» mediante el campo «IdCliente», común en ambas tablas
de nuestra base de datos. Asimismo, se exigirá la integridad referencial y
se actualizará en cascada los campos relacionados:

Dim db As Database
Dim rel As DAO.Relation

' Abrimos la base de datos
Set db = OpenDatabase("C:\Bd1.mdb")

' Creamos una relación
Set rel = db.CreateRelation("ClientesFacturas", _
"Clientes", "Facturas", _
dbRelationUpdateCascade)

' Creamos el objeto «Field» del objeto «Relation»
rel.Fields.Append rel.CreateField("IdCliente")

' Indicamos el nombre del campo de la tabla externa
rel.Fields!IdCliente.ForeignName = "IdCliente"

' Añadimos la relación a la colección
db.Relations.Append rel

Para más información, consulta en la ayuda de DAO el método
«CreateRelation».
'************************************************* *********
Y otra mas:
'************************************************* *********
Option Compare Database
Option Explicit

Function CreaunatablaDAO()
Dim db As Database
Dim ObjetoTabla As TableDef

Set db = CurrentDb
Set ObjetoTabla = db.CreateTableDef("Mitabla")

With ObjetoTabla
.Fields.Append .CreateField("Campo1", dbText, 2)
.Fields.Append .CreateField("Campo2", dbInteger)
.Fields.Append .CreateField("Campo3", dbDate)
End With

db.TableDefs.Append ObjetoTabla
End Function

Function CreaTablaDDL()
Dim StrSql As String

StrSql = "CREATE TABLE Mitabla " _
& "(Id COUNTER PRIMARY KEY," _
& "[Campo1] TEXT(35) NOT NULL, " _
& "[Campo2] TEXT(50) NOT NULL, " _
& "Campo3 TEXT(200), " _
& "Email TEXT(50))"

CurrentDb.Execute StrSql
End Function

Function HacemosCambiosEnTabla()
'Permitir longitud cero
CurrentDb.TableDefs("Mitabla"). _
Fields("campo1"). _
Properties("AllowZeroLength") = True
'Cambiamos valor predeterminado
CurrentDb.TableDefs("Mitabla"). _
Fields("campo1"). _
Properties("DefaultValue") = """Valor que yo quiera"""


End Function

Sub crearTablasyRelacion()
'Esta se la pillé Juan M Afan de Ribera
'Creamos dos tablas y ademas creamos relacion entre ellas.
Dim cadSQL As String

'creamos una tabla de facturas
cadSQL = "CREATE TABLE Facturas " _
& "(IdFactura INTEGER PRIMARY KEY, " _
& "FechaFra DATETIME, " _
& "IdCliente INTEGER)"

'aquí utilizamos DAO
CurrentDb.Execute cadSQL

'creamos una tabla de detalle de facturas y relacionamos
'con la tabla facturas a través del campo IdFactura
cadSQL = "CREATE TABLE DetalleFacturas " _
& "(IdDetalle COUNTER PRIMARY KEY, " _
& "IdFactura INTEGER, " _
& "Cantidad INTEGER, " _
& "Descripcion TEXT(255), " _
& "PrecioUnitario DOUBLE, " _
& "CONSTRAINT ClaveExtFacturas FOREIGN KEY (IdFactura) " _
& "REFERENCES Facturas ON UPDATE CASCADE ON DELETE CASCADE)"

'aquí utilizamos ADO
CurrentProject.Connection.Execute cadSQL

End Sub

'********************************************
'Esta creo que es de Martí (Marjan) para borrar una tabla
Public Sub BorraTaula(NomTaula As String)
'Procedimiento para borrar tablas DAO 3.51
Dim mdb As Database
Set mdb = CurrentDb
Dim Taula As TableDef
For Each Taula In mdb.TableDefs
If Taula.Name = NomTaula Then
mdb.TableDefs.Delete (NomTaula): Exit For
End If
Next
mdb.Close
Set mdb = Nothing
End Sub
'*********************************************

Un saludo
  #3 (permalink)  
Antiguo 16/06/2008, 03:14
 
Fecha de Ingreso: junio-2008
Mensajes: 20
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Administrar relaciones mediante código o macro

Muchísimas gracias. Con respuestas así de completas y trabajadas uno se queda sin habla. Me ha solucionado el problema.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:35.