Como se copia todos los datos de un subformulario a otro subformulario

Estoy copiando datos de un formulario a otro formulario, ambos con subformularios, el problema esta en que los registros del subformulario solo me copia la primera fila.

Estas son los datos:

Formulario "Cotizacion" Con Subformulario "DetalleCotizacion"

En el detalle tengo el campo codigoprodcuto, cantidad, Subtotal

El segundo Formulario "OrdenTrabajo" con subformulario "DetalleTrabajo" y con los mismos campos del primero

Quiero que me copie los registros del formulario Cotizacion a OrdenTrabajo..

3 Respuestas

Respuesta
2

Supongamos que los formularios dependen de unas tablas que tienen el mismo nombre. Lo más sencillo es que, en cualquier evento( por ejemplo, al pulsar un botón de comando) de un formulario, para el ejemplo vamos a usar Cotizaciones, le pases los datos de tabla a tabla.

Docmd.runsql"insert into OrdendeTrabajo(nombrecliente,dirección,...) select nombrecliente,dirección,... from Cotizaciones"

Si sólo quieres que te pase algunos registros debes usar

Docmd...................from Cotizaciones where....

Por ejemplo,

Docmd.runsql"insert into Ordendetrabajo(nombrecliente,direccion,....) select empresa,dondevive,...from Cotizaciones where pais="""España"""

Los nombres de los campos origen y destino no tienen porqué llamarse igual, pero sí ser de datos coherentes.

También podrías usar una consulta de datos anexados, y en la casilla de criterios poner el(los) que quieras.

Para copiar los registros del subformulario DetalleCotización al subformulario DetalleTrabajo, vamos a suponer que Cotización y DetalleCotización están relacionados por IdCotización.

En el mismo evento que te puse antes, le puedes añadir la línea

docmd.runsql"insert into DetalleTrabajo(campoA,campob,Campoc,...) select diatrabajo,operario,material,...from DetalleCotización where Idcotización = " & me.idcotizacion & ""

Me explico. Pasa a la tabla DetalleTrabajo aquellos valores de los campos diatrabajo, operario, material,... de la tabla DetalleCotización de aquellos registros en que su Idcotización sea igual al que "figura" en ese momento en la pantalla del formulario Cotización.

Lo haré de esta manera, gracias...

De todas formas, si quieres, repito, si quieres, mándame un mensaje ( sólo el mensaje) a [email protected] y te mando unos ejemplos de como puedes hacerlo.

Si lo haces, en el asunto del mensaje pon tu alias, Carlos Bocel, ya que si no sé quien me escribe ni los abro.

Respuesta
2

Puede hacerlo recorriendo un recordset. Pruebe con este código. Asume que tiene un botón llamado CopiarDaaaaatos

Private Sub CopiarDatos_Click()
    Dim rsOrigen As DAO.Recordset
    Dim rsDestino As DAO.Recordset
    Dim subformOrigen As Subform
    Dim subformDestino As Subform
    ' Referencia a los subformularios
    Set subformOrigen = Me.DetalleCotizacion.Form
    Set subformDestino = Me.DetalleTrabajo.Form
    ' Establecer el Recordset del subformulario de origen
    Set rsOrigen = subformOrigen.RecordsetClone
    ' Mover al primer registro
    rsOrigen.MoveFirst
    ' Recorrer todos los registros del subformulario de origen
    Do While Not rsOrigen.EOF
        ' Añadir un nuevo registro al subformulario de destino
        subformDestino.Recordset.AddNew
        subformDestino.Recordset!codigoproducto = rsOrigen!codigoproducto
        subformDestino.Recordset!cantidad = rsOrigen!cantidad
        subformDestino.Recordset!Subtotal = rsOrigen!Subtotal
        subformDestino.Recordset.Update
        ' Mover al siguiente registro
        rsOrigen.MoveNext
    Loop
    ' Cerrar el Recordset
    rsOrigen.Close
    Set rsOrigen = Nothing
End Sub

Explicación del Código:

Referencias a los subformularios: Utilizamos Me.DetalleCotizacion.Form y Me.DetalleTrabajo.Form para referenciarlos correctamente.

Recordset Clone: Se usa RecordsetClone para crear una copia del conjunto de registros del subformulario de origen.

Bucle Do While: Recorre todos los registros del subformulario de origen.

AddNew y Update: Para cada registro en el subformulario de origen, se crea un nuevo registro en el subformulario de destino y se copian los campos deseados.

Manejo de objetos: Se asegura de cerrar el Recordset después de usarlo. Este código le sirve mientras trabaje con tablas JET y el formulario principal tenga un origen de datos vinculado.

Respuesta
1

Sin conocer el método empleado para hacer la copia, es complicado localizar la causa del problema.

Los formularios 'no tienen datos' solo los utilizan y un 'formulario continuo' solo tiene un registro (el activo) para interactuar con el, el resto (los 'inactivos') solo son una imagen fantasma.

La forma correcta de copiar todos los registros de un formulario (sea o no continuo) es utilizando su 'RecordsetClone' que es un Recordset que es una copia fiel de el contenido que se genera de forma automática al abrir un formulario vinculado a un origen de datos.

Los registros se han de 'copiar' a otro conjunto de registros que sea compatible (sea tabla, consulta ...) y se puede hacer con una SQL.

¡Gracias!

El problema que tengo es que solo me copia un registro del subformulario más los otros no y yo quiero que me copie todo el listado que tenga 

No aclaras el método que aplicas y créeme que he visto muchos (y algunos muy imaginativos).

Normalmente para hacer un 'coy&paste' no se utilizan los formularios, se utilizan tablas o consultas, tal como he indicado los formularios (presenten un registro o varios), solo interactúan con el registro activo.

Desde VBA se puede acceder a todo el conjunto de registros de un formulario que indique su origen de datos, y (utilizando el/su 'RecordsetCLone') se pueden manipular de forma automatizada con una gran eficiencia y sin mas limites que los que tenga su origen de datos (es una copia fiel que se crea al abrirlo).

Para copiar los datos se puede hacer de muchas formas, desde emular a un usuario (recorriéndolo registro a registro) a utilizar dos Recordset (uno el origen, otro el destino y al origen se conoce) o bien recorrer solo el origen con un bucle y mediante una SQL inyectarlos en el destino.

Lo ideal y mas sencillo (no siempre es factible) es utilizar una SQL que los seleccione y directamente inyectarlo en su destino (una consulta de datos anexados).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas