Buenas tardes a todos,
ante todo gracias por su tiempo.
La duda con la que me presento debe ser realmente sencilla y yo no soy capaz de verla porque me he debido ofuscar...
Para ilustrar mi problema les muestro la pequeña parte de una bd en access 2007 que nos concierne:
En este esquema, hay un formulario (
PoliticasComerciales) que a su vez contiene un subformulario (
TarifasPoliticaComercial) que a su vez, entre otros, tiene otros dos subformularios (
TarifasPrecio y
TarifasPoliticaComercialDetalles).
Para rematar este último subformulario (
TarifasPoliticaComercialDetalles) tiene un subformulario llamado
TarifasPrecioDetalles.
Bien, dicho ésto, les expongo el problema que tengo:
Estoy tratando de crear un botón en el primer formulario para duplicar el registro activo y a su vez tantos subformularios como cuelgan de él. A la hora de crear el duplicado del primero y del subyacente todo funciona bien, pero a la hora de continuar hacia abajo, me encuentro que no tengo forma de recuperar los nuevos códigos asignados a través de los insert para asignarlos en los siguientes registros a crear en las tablas.
Les dejo aquí también un trozo del código que se guía por el orden del autonumérico para asociar correctamente a cada registro los códigos que deberiere tener:
Código vb:
Ver originalPrivate Sub DuplicarPolitica_Click()
On Error GoTo Err_DuplicarPolitica_Click
DoCmd.SetWarnings False
Dim strNombreOriginal As String
strNombreOriginal = Me.Nombre
Dim strNombre As String
strNombre = InputBox("Por favor, introduzca el nombre de la NUEVA política comercial", "Introducir nuevo nombre", strNombreOriginal)
Dim SQLText As String
Dim bExiste As Boolean
bExiste = ExisteTexto("Nombre", "PoliticasComerciales", strNombre)
If strNombre = "" Then
Exit Sub
End If
Dim CodigoPoliticaComercial As Integer
CodigoPoliticaComercial = Me.CodigoPoliticaComercial
DoCmd.RunCommand acCmdSelectRecord
If bExiste = False Then
DoCmd.RunCommand acCmdCopy
DoCmd.GoToRecord , , acNewRec
DoCmd.RunCommand acCmdPaste
Me.Nombre = strNombre
'Guardamos el registro
DoCmd.RunCommand acCmdSaveRecord
'Copiamos TarifasPoliticaComercial
DoCmd.RunSQL "INSERT INTO TarifasPoliticaComercial (CodigoPoliticaComercial, CodigoTipoPoliticaComercial, Nombre, FechaInicio,FechaFin, EsActivo, InactivoDesde, UltimaModificacion) " _
& " SELECT " & Me.CodigoPoliticaComercial & ", CodigoTipoPoliticaComercial, Nombre, FechaInicio, FechaFin, EsActivo, InactivoDesde, UltimaModificacion FROM TarifasPoliticaComercial " _
& " WHERE CodigoPoliticaComercial = " & CodigoPoliticaComercial & " ORDER BY CodigoTarifaPoliticaComercial "
Dim db As Database
Dim rstNTarifa As DAO.Recordset 'TarifasPoliticaComercial Nuevas
Dim rstTarifa As DAO.Recordset 'TarifasPoliticaComercial Copiadas
Dim rstNDetalles As DAO.Recordset 'TarifasPoliticaComercialDetalles Nuevas
Dim rstDetalles As DAO.Recordset 'TarifasPoliticaComercialDetalles Copiadas
Dim rstNPrecio As DAO.Recordset 'TarifasPrecio Nuevas
Dim rstPrecio As DAO.Recordset 'TarifasPrecio Copiadas
Dim nCodigoPoliticaComercial As Integer
nCodigoPoliticaComercial = Me.CodigoPoliticaComercial
Set db = CurrentDb()
Set rstNTarifa = db.OpenRecordset(" SELECT CodigoTarifaPoliticaComercial FROM TarifasPoliticaComercial WHERE CodigoPoliticaComercial = " & nCodigoPoliticaComercial & " ORDER BY CodigoTarifaPoliticaComercial ")
Set rstTarifa = db.OpenRecordset(" SELECT CodigoTarifaPoliticaComercial FROM TarifasPoliticaComercial WHERE CodigoPoliticaComercial = " & CodigoPoliticaComercial & " ORDER BY CodigoTarifaPoliticaComercial ")
rstNTarifa.MoveFirst
rstTarifa.MoveFirst
If Not (rstTarifa.BOF And rstTarifa.EOF) Then
If Not (rstNTarifa.BOF And rstNTarifa.EOF) Then
Dim nCodigoTarifaPoliticaComercial As Long
Dim CodigoTarifaPoliticaComercial As Long
Do While Not rstTarifa.EOF
nCodigoTarifaPoliticaComercial = rstNTarifa![CodigoTarifaPoliticaComercial]
CodigoTarifaPoliticaComercial = rstTarifa![CodigoTarifaPoliticaComercial]
'Copiamos TarifasPoliticaComercialDetalles
DoCmd.RunSQL "INSERT INTO TarifasPoliticaComercialDetalles (CodigoTarifaPoliticaComercial, CodigoBloque, CodigoPrograma, DiaDesde, DiaHasta, QHDesde, QHHasta, Notas, EsActivo, InactivoDesde, UltimaModificacion) " _
& " SELECT " & nCodigoTarifaPoliticaComercial & ", CodigoBloque, CodigoPrograma, DiaDesde, DiaHasta, QHDesde, QHHasta, Notas, EsActivo, InactivoDesde, UltimaModificacion " _
& " FROM TarifasPoliticaComercialDetalles " _
& " WHERE CodigoTarifaPoliticaComercial = " & CodigoTarifaPoliticaComercial & " "
'Copiamos TarifasPrecio
DoCmd.RunSQL "INSERT INTO TarifasPrecio (CodigoTarifaPoliticaComercial, CodigoFormato, CodigoAccion, CodigoBloquePosicion, Nombre, FechaInicio, FechaFin, EsActivo, InactivoDesde, UltimaModificacion) " _
& " SELECT " & nCodigoTarifaPoliticaComercial & ", CodigoFormato, CodigoAccion, CodigoBloquePosicion, Nombre, FechaInicio, FechaFin, EsActivo, InactivoDesde, UltimaModificacion " _
& " FROM TarifasPrecio " _
& " WHERE CodigoTarifaPoliticaComercial = " & CodigoTarifaPoliticaComercial & " "
Set rstNDetalles = db.OpenRecordset(" SELECT CodigoTarifaPoliticaComercialDetalles FROM TarifasPoliticaComercialDetalles WHERE CodigoTarifaPoliticaComercial = " & nCodigoTarifaPoliticaComercial & " ORDER BY CodigoTarifaPoliticaComercialDetalles ")
Set rstDetalles = db.OpenRecordset(" SELECT CodigoTarifaPoliticaComercialDetalles FROM TarifasPoliticaComercialDetalles WHERE CodigoTarifaPoliticaComercial = " & CodigoTarifaPoliticaComercial & " ORDER BY CodigoTarifaPoliticaComercialDetalles ")
If Not (rstDetalles.BOF And rstDetalles.EOF) Then
If Not (rstNDetalles.BOF And rstNDetalles.EOF) Then
Dim nCodigoTarifaPoliticaComercialDetalles As Long
Dim CodigoTarifaPoliticaComercialDetalles As Long
Dim nCodigoTarifaPrecio As Long
Dim CodigoTarifaPrecio As Long
Set rstNDetalles = db.OpenRecordset(" SELECT CodigoTarifaPoliticaComercialDetalles FROM TarifasPoliticaComercialDetalles WHERE CodigoTarifaPoliticaComercial = " & nCodigoTarifaPoliticaComercial & " ORDER BY CodigoTarifaPoliticaComercialDetalles ")
Set rstDetalles = db.OpenRecordset(" SELECT CodigoTarifaPoliticaComercialDetalles FROM TarifasPoliticaComercialDetalles WHERE CodigoTarifaPoliticaComercial = " & CodigoTarifaPoliticaComercial & " ORDER BY CodigoTarifaPoliticaComercialDetalles ")
Do While Not rstDetalles.EOF
nCodigoTarifaPoliticaComercialDetalles = rstNDetalles![CodigoTarifaPoliticaComercialDetalles]
CodigoTarifaPoliticaComercialDetalles = rstDetalles![CodigoTarifaPoliticaComercialDetalles]
Set rstNPrecio = db.OpenRecordset(" SELECT CodigoTarifaPrecio FROM TarifasPrecio WHERE CodigoTarifaPoliticaComercial = " & nCodigoTarifaPoliticaComercial & " ORDER BY CodigoTarifaPrecio ")
Set rstPrecio = db.OpenRecordset(" SELECT CodigoTarifaPrecio FROM TarifasPrecio WHERE CodigoTarifaPoliticaComercial = " & CodigoTarifaPoliticaComercial & " ORDER BY CodigoTarifaPrecio ")
If Not (rstPrecio.BOF And rstPrecio.EOF) Then
If Not (rstNPrecio.BOF And rstNPrecio.EOF) Then
Do While Not rstPrecio.EOF
nCodigoTarifaPrecio = rstNPrecio![CodigoTarifaPrecio]
CodigoTarifaPrecio = rstPrecio![CodigoTarifaPrecio]
'Copiamos TarifasPrecioDetalles
DoCmd.RunSQL "INSERT INTO TarifasPrecioDetalles (CodigoTarifaPoliticaComercialDetalles, CodigoTarifaPrecio, CodigoDuracion, CodigoTipoPrecio, CodigoTipoValor, Valor, NumeroSpots, Periodo, EsActivo, InactivoDesde, UltimaModificacion) " _
& " SELECT " & nCodigoTarifaPoliticaComercialDetalles & ", " & nCodigoTarifaPrecio & ", CodigoDuracion, CodigoTipoPrecio, CodigoTipoValor, Valor, NumeroSpots, Periodo, EsActivo, InactivoDesde, UltimaModificacion " _
& " FROM TarifasPrecioDetalles " _
& " WHERE CodigoTarifaPoliticaComercialDetalles = " & CodigoTarifaPoliticaComercialDetalles & " " _
& " AND CodigoTarifaPrecio = " & CodigoTarifaPrecio & " "
rstNPrecio.MoveNext
rstPrecio.MoveNext
Loop
End If
End If
rstNDetalles.MoveNext
rstDetalles.MoveNext
Loop
Falla en algunas ocasiones...
¡IMPORTANTE!: No me es posible cambiar el esquema de las tablas (ojalá pudiera, pero es del cliente y es intocable...) y también quisiera evitar crear una tabla temporal, si fuere posible