Ver Mensaje Individual
  #1 (permalink)  
Antiguo 05/03/2012, 09:30
Uran
 
Fecha de Ingreso: enero-2012
Mensajes: 49
Antigüedad: 12 años, 9 meses
Puntos: 4
Duplicar registros tablas relacionadas

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 original
  1. Private Sub DuplicarPolitica_Click()
  2. On Error GoTo Err_DuplicarPolitica_Click
  3.  
  4. DoCmd.SetWarnings False
  5.     Dim strNombreOriginal As String
  6.     strNombreOriginal = Me.Nombre
  7.     Dim strNombre As String
  8.     strNombre = InputBox("Por favor, introduzca el nombre de la NUEVA política comercial", "Introducir nuevo nombre", strNombreOriginal)
  9.     Dim SQLText As String
  10.     Dim bExiste As Boolean
  11.     bExiste = ExisteTexto("Nombre", "PoliticasComerciales", strNombre)
  12.     If strNombre = "" Then
  13.         Exit Sub
  14.     End If
  15.     Dim CodigoPoliticaComercial As Integer
  16.     CodigoPoliticaComercial = Me.CodigoPoliticaComercial
  17.     DoCmd.RunCommand acCmdSelectRecord
  18.     If bExiste = False Then
  19.         DoCmd.RunCommand acCmdCopy
  20.         DoCmd.GoToRecord , , acNewRec
  21.         DoCmd.RunCommand acCmdPaste
  22.         Me.Nombre = strNombre
  23.         'Guardamos el registro
  24.        DoCmd.RunCommand acCmdSaveRecord
  25.         'Copiamos TarifasPoliticaComercial
  26.        DoCmd.RunSQL "INSERT INTO TarifasPoliticaComercial (CodigoPoliticaComercial, CodigoTipoPoliticaComercial, Nombre, FechaInicio,FechaFin, EsActivo, InactivoDesde, UltimaModificacion) " _
  27.         & " SELECT " & Me.CodigoPoliticaComercial & ", CodigoTipoPoliticaComercial, Nombre, FechaInicio, FechaFin, EsActivo, InactivoDesde, UltimaModificacion FROM TarifasPoliticaComercial " _
  28.         & " WHERE CodigoPoliticaComercial = " & CodigoPoliticaComercial & " ORDER BY CodigoTarifaPoliticaComercial "
  29.         Dim db As Database
  30.         Dim rstNTarifa As DAO.Recordset 'TarifasPoliticaComercial Nuevas
  31.        Dim rstTarifa As DAO.Recordset 'TarifasPoliticaComercial Copiadas
  32.        Dim rstNDetalles As DAO.Recordset 'TarifasPoliticaComercialDetalles Nuevas
  33.        Dim rstDetalles As DAO.Recordset 'TarifasPoliticaComercialDetalles Copiadas
  34.        Dim rstNPrecio As DAO.Recordset 'TarifasPrecio Nuevas
  35.        Dim rstPrecio As DAO.Recordset 'TarifasPrecio Copiadas
  36.        Dim nCodigoPoliticaComercial As Integer
  37.        
  38.         nCodigoPoliticaComercial = Me.CodigoPoliticaComercial
  39.        
  40.         Set db = CurrentDb()
  41.         Set rstNTarifa = db.OpenRecordset(" SELECT CodigoTarifaPoliticaComercial FROM TarifasPoliticaComercial WHERE CodigoPoliticaComercial = " & nCodigoPoliticaComercial & " ORDER BY CodigoTarifaPoliticaComercial ")
  42.         Set rstTarifa = db.OpenRecordset(" SELECT CodigoTarifaPoliticaComercial FROM TarifasPoliticaComercial WHERE CodigoPoliticaComercial = " & CodigoPoliticaComercial & " ORDER BY CodigoTarifaPoliticaComercial ")
  43.         rstNTarifa.MoveFirst
  44.         rstTarifa.MoveFirst
  45.         If Not (rstTarifa.BOF And rstTarifa.EOF) Then
  46.         If Not (rstNTarifa.BOF And rstNTarifa.EOF) Then
  47.            
  48.             Dim nCodigoTarifaPoliticaComercial As Long
  49.             Dim CodigoTarifaPoliticaComercial As Long
  50.            
  51.             Do While Not rstTarifa.EOF
  52.            
  53.                 nCodigoTarifaPoliticaComercial = rstNTarifa![CodigoTarifaPoliticaComercial]
  54.                 CodigoTarifaPoliticaComercial = rstTarifa![CodigoTarifaPoliticaComercial]
  55.                
  56.                 'Copiamos TarifasPoliticaComercialDetalles
  57.                DoCmd.RunSQL "INSERT INTO TarifasPoliticaComercialDetalles (CodigoTarifaPoliticaComercial, CodigoBloque, CodigoPrograma, DiaDesde, DiaHasta, QHDesde, QHHasta, Notas, EsActivo, InactivoDesde, UltimaModificacion) " _
  58.                 & " SELECT " & nCodigoTarifaPoliticaComercial & ", CodigoBloque, CodigoPrograma, DiaDesde, DiaHasta, QHDesde, QHHasta, Notas, EsActivo, InactivoDesde, UltimaModificacion " _
  59.                 & " FROM TarifasPoliticaComercialDetalles " _
  60.                 & " WHERE CodigoTarifaPoliticaComercial = " & CodigoTarifaPoliticaComercial & " "
  61.                
  62.                 'Copiamos TarifasPrecio
  63.                DoCmd.RunSQL "INSERT INTO TarifasPrecio (CodigoTarifaPoliticaComercial, CodigoFormato, CodigoAccion, CodigoBloquePosicion, Nombre, FechaInicio, FechaFin, EsActivo, InactivoDesde, UltimaModificacion) " _
  64.                 & " SELECT " & nCodigoTarifaPoliticaComercial & ", CodigoFormato, CodigoAccion, CodigoBloquePosicion, Nombre, FechaInicio, FechaFin, EsActivo, InactivoDesde, UltimaModificacion " _
  65.                 & " FROM TarifasPrecio " _
  66.                 & " WHERE CodigoTarifaPoliticaComercial = " & CodigoTarifaPoliticaComercial & " "
  67.                
  68.                 Set rstNDetalles = db.OpenRecordset(" SELECT CodigoTarifaPoliticaComercialDetalles FROM TarifasPoliticaComercialDetalles WHERE CodigoTarifaPoliticaComercial = " & nCodigoTarifaPoliticaComercial & " ORDER BY CodigoTarifaPoliticaComercialDetalles ")
  69.                 Set rstDetalles = db.OpenRecordset(" SELECT CodigoTarifaPoliticaComercialDetalles FROM TarifasPoliticaComercialDetalles WHERE CodigoTarifaPoliticaComercial = " & CodigoTarifaPoliticaComercial & " ORDER BY CodigoTarifaPoliticaComercialDetalles ")
  70.                
  71.                 If Not (rstDetalles.BOF And rstDetalles.EOF) Then
  72.                 If Not (rstNDetalles.BOF And rstNDetalles.EOF) Then
  73.                
  74.                     Dim nCodigoTarifaPoliticaComercialDetalles As Long
  75.                     Dim CodigoTarifaPoliticaComercialDetalles As Long
  76.                     Dim nCodigoTarifaPrecio As Long
  77.                     Dim CodigoTarifaPrecio As Long
  78.                     Set rstNDetalles = db.OpenRecordset(" SELECT CodigoTarifaPoliticaComercialDetalles FROM TarifasPoliticaComercialDetalles WHERE CodigoTarifaPoliticaComercial = " & nCodigoTarifaPoliticaComercial & " ORDER BY CodigoTarifaPoliticaComercialDetalles ")
  79.                     Set rstDetalles = db.OpenRecordset(" SELECT CodigoTarifaPoliticaComercialDetalles FROM TarifasPoliticaComercialDetalles WHERE CodigoTarifaPoliticaComercial = " & CodigoTarifaPoliticaComercial & " ORDER BY CodigoTarifaPoliticaComercialDetalles ")
  80.                    
  81.                     Do While Not rstDetalles.EOF
  82.                    
  83.                         nCodigoTarifaPoliticaComercialDetalles = rstNDetalles![CodigoTarifaPoliticaComercialDetalles]
  84.                         CodigoTarifaPoliticaComercialDetalles = rstDetalles![CodigoTarifaPoliticaComercialDetalles]
  85.                         Set rstNPrecio = db.OpenRecordset(" SELECT CodigoTarifaPrecio FROM TarifasPrecio WHERE CodigoTarifaPoliticaComercial = " & nCodigoTarifaPoliticaComercial & " ORDER BY CodigoTarifaPrecio ")
  86.                         Set rstPrecio = db.OpenRecordset(" SELECT CodigoTarifaPrecio FROM TarifasPrecio WHERE CodigoTarifaPoliticaComercial = " & CodigoTarifaPoliticaComercial & " ORDER BY CodigoTarifaPrecio ")
  87.                         If Not (rstPrecio.BOF And rstPrecio.EOF) Then
  88.                         If Not (rstNPrecio.BOF And rstNPrecio.EOF) Then
  89.                             Do While Not rstPrecio.EOF
  90.                                 nCodigoTarifaPrecio = rstNPrecio![CodigoTarifaPrecio]
  91.                                 CodigoTarifaPrecio = rstPrecio![CodigoTarifaPrecio]
  92.                                 'Copiamos TarifasPrecioDetalles
  93.                                DoCmd.RunSQL "INSERT INTO TarifasPrecioDetalles (CodigoTarifaPoliticaComercialDetalles, CodigoTarifaPrecio, CodigoDuracion, CodigoTipoPrecio, CodigoTipoValor, Valor, NumeroSpots, Periodo, EsActivo, InactivoDesde, UltimaModificacion) " _
  94.                                 & " SELECT " & nCodigoTarifaPoliticaComercialDetalles & ", " & nCodigoTarifaPrecio & ", CodigoDuracion, CodigoTipoPrecio, CodigoTipoValor, Valor, NumeroSpots, Periodo, EsActivo, InactivoDesde, UltimaModificacion " _
  95.                                 & " FROM TarifasPrecioDetalles " _
  96.                                 & " WHERE CodigoTarifaPoliticaComercialDetalles = " & CodigoTarifaPoliticaComercialDetalles & " " _
  97.                                 & " AND CodigoTarifaPrecio = " & CodigoTarifaPrecio & " "
  98.                             rstNPrecio.MoveNext
  99.                             rstPrecio.MoveNext
  100.                             Loop
  101.                         End If
  102.                         End If
  103.                     rstNDetalles.MoveNext
  104.                     rstDetalles.MoveNext
  105.                     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