Pasar datos de un subformulario presupuesto a otro subformulario factura. Access 2010

¡

Tengo un formulario principal llamado formPptos, con varios campos, entre ellos NumPpto (autonumérico clave principal), IdCliente (numérico) y Trabajo (texto). Dentro de este formulario principal tengo un subformulario vista Hoja de Datos llamado formPptosDetalle, vinculado con el NumPpto, relación 1-varios. Este subformulario tiene los campos: IdPptoDetalle (autonumérico), NumPpto (numérico), Uds (numérico), PVPUd (moneda), Descripcion (texto) y PVP (moneda).

La estructura con las facturas es igual: formulario principal llamado formFras, con varios campos, entre ellos NumFra (autonumérico clave principal), IdCliente (numérico) y Trabajo (texto). Dentro de este formulario principal tengo un subformulario vista Hoja de Datos llamado formFrasDetalle, vinculado con el NumFra, relación 1-varios. Este subformulario tiene los campos: IdFraDetalle (autonumérico), NumFra (numérico), Uds (numérico), PVPUd (moneda), Descripcion (texto) y PVP (moneda).

Pues bien, desde el formulario de presupuestos, formPptos, he puesto un botón comando (se llama Pasar_a_Fra), que al hacer click, me pasa los datos de cabecera. El código que uso es:

Public Sub Pasar_a_Fra_Click()

DoCmd.OpenForm "formFras", , , , acFormAdd

Forms![formFras]![IdCliente] = Me.IdCliente

Forms![formFras]![Trabajo] = Me.Trabajo

Forms![formFras]![formFrasDetalle].Form![Uds] = Forms![formPptos]![formPptosDetalle].Form![Uds]

Forms![formFras]![formFrasDetalle].Form![PVPUd] = Forms![formPptos]![formPptosDetalle].Form![PVPUd]

Forms![formFras]![formFrasDetalle].Form![Descripcion] = Forms![formPptos]![formPptosDetalle].Form![Descripcion]

El codigo me pone los datos de cabecera bien, y la 1ª línea del subformulario formFrasDetalle. Generalmente el subformulario formPptosDetalle tiene más de 1 línea, ¿cómo hago para que las líneas del subformulario del presupuesto pase al subformulario de la factura?

2 respuestas

Respuesta
1

Prueba este código (adaptando los nombres que tu tienes, si no son los que te pongo)

Public Sub Pasar_a_Fra_Click()

Dim miSQL As String
Dim numFactura As Integer
DoCmd.SetWarnings False

'Insertas los datos del presupuesto
miSQL = "INSERT INTO TFacturas(IdCliente,Trabajo) SELECT IdCliente,Trabajo FROM TPresupuestos WHERE NumPpto=" & Me.NumPpto
DoCmd.RunSQL miSQL

'Buscas la factura que acabas de insertar y le insertas el detalle
numFactura = DLast("NumFra", "TFacturas")
miSQL = "INSERT INTO TFraDetalle(NumFra,Uds,PVPUd,Descripcion,PVP) SELECT " & numFactura & " AS Factura,Uds,PVPUd,Descripcion,PVP FROM TPptoDetalle WHERE NumPpto=" & Me.NumPpto
DoCmd.RunSQL miSQL
DoCmd.SetWarnings True

End Sub

A ver si te sirve, porque lo escribí "de cabeza", e igual hay que hacerle algún ajuste. El código te pasa los datos directamente a las tablas, que he supuesto se llaman TFacturas, TFraDetalle, TPresupuestos y TPptoDetalle

Buenas noches¡¡

Al ejecutarlo me aparece un MsgBox que dice: Introduzca el valor del parámetro. El problema creo que está en que mi autonumérico de facturas y presupuesto no es que viene por defecto, sino uno que me creé yo con el siguiente código: 

Dim Secuencia As Integer

Secuencia = (DCount("[NumFra]", "tblFras", "[NumFra] like '" & "R" & Format(Date, "yy") & "*'")) + 1

Me.NumFra = "R" & Format(Date, "yy") & "-" & Format(Secuencia, "0000")

Lo tengo puesto en el evento al activar el registro. El formFras además lo tengo como entrada de datos. Por lo tanto, entiendo que tu código tira de la tabla pero no me genera automáticamente un nuevo NumFra, que el parámetro que me pide el MsgBox.

Ya probé a abrir el formFras, para darle NumFra, pero como no se guarda en la tabla hasta que salga estoy en las mismas. Probé poniendo un  Me.Refresh y un Me.Recalc despues de pasar los datos de cabecera del formFras y tampoco me deja.

Haber si se te ocurre algo¡¡

Si te pide parámetro, lo más probable es que haya en el código SQL algún campo que no se corresponda con los que tienes en tus tablas, por eso te sale ese mensaje.

Que el NumFactura sea un autonumérico "manual", no sería problema, pues siempre podrías generarle el NumFactura dentro del propio código.

De todo modos, se me ocurre algo que puede ser más simple, partiendo de tu código original:

Public Sub Pasar_a_Fra_Click()

DoCmd.OpenForm "formFras", , , , acFormAdd

Forms![formFras]![IdCliente] = Me.IdCliente

Forms![formFras]![Trabajo] = Me.Trabajo

'Aquí pasas el detalle

Dim rst Ss DAO.Recordset

Set rst=me.formPptosDetalle.Form.RecordsetClone

rst.move First

Do Until rst.EOF

Forms![formFras]![formFrasDetalle].Form![Uds] = rst("Uds")

Forms![formFras]![formFrasDetalle].Form![PVPUd] = rst("PVPUd")

Forms![formFras]![formFrasDetalle].Form![Descripcion] = rst("Descripcion")

rst.MoveNext

Loop

rst.Close

Set rst=Nothing

End Sub

Pruébalo y me dices, porque sin tener la BD no lo puedo testar yo mismo.

Buenas tardes¡¡

Que va, me inserta en el formFrasDetalle sólo la última línea del formPptosDetaller. Si te parece bien, me pases tu email y te mando la bbdd

[email protected]

Mándala comprimida

Te dejo aquí la BD original y la modificada: http://www.filebig.net/files/27qJXEnJCs 

Al final fue lo mejor que conseguí: guardar directamente los registros en las tablas y luego abrir el formulario en esa factura. Fíjate que le cambié la propiedad "Entrada de datos" del formulario a No.

Al intentarlo hacerlo a las tablas con consultas SQL, no sé por que razón me daba error de indices duplicado, y directamente en el formulario fui incapaz de lograr que pasara a un nuevo registro del subformulario antes de meter un nuevo detalle de factura...

Respuesta

Como hacer para que guarde todos los registro en vez de solo el ultimo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas