Copiar datos de un formulario a otro

Tengo dos formularios(presupuestos y facturas) y quería que cuando me acepten un presupuesto al darle a un botón del formulario presupuestos que me copie los campos en un nuevo registro en el formulario de facturas.

Los campos son todos iguales excepto el id de cada uno y los nombres también son iguales.
No se casi nada de visual basic si me podrías explicar como hacer el código te estaría muy agradecido.

1 respuesta

Respuesta
2

Puedes hacerlo con este código en el botón:

Dim miSQL as STRING

miSQL="INSERT INTO TablaFacturas(Campo1,Campo2...) SELECT CampoP1, CampoP2... FROM TablaPresupuestos WHERE ID=" & me.Id

DoCmd.SetWarnings False
DoCmd.RunSQL miSQL
DoCmd.SetWarnings True

Donde:

TablaFacturas será el nombre de tu tabla de facturas

(Campo1, Campo2...) serán los nombres de los campos de la tabla facturas, menos el id, que imagino será un autonumérico

CampoP1, CampoP2... serán los nombres de la tabla presupuestos que vas a traspasar.

TablaPresupuestos será el nombre de tu tabla presupuestos

Otra posible opción, sin usar VBA, sería que hicieras una tabla de datos anexados, y la ejecutes al pulsar el botón.

hola probé los que me dijiste con un par de campos pero me da un error de compilación creo que en donde pone me.id te mando una imagen

<a>http://www.subeimagenes.com/img/captura-957800.html</a>

Ya probé con la consulta también el problema es que me copia todos no el registro actual.

gracias por todo a ver si me puedes mirar eso. un saludo

El "error" está en que no tienes ningún campo llamado id, sino que tu lo llamas idclientes. Por tanto, tienes que cambiar la parte del WHERE en la SQL:

miSQL="INSERT INTO Facturas(idclientes, fecha) SELECT idclientes, fecha FROM Presupuestos WHERE idclientes=" & Me.idclientes

Vale ahora si que me va. pero también quería que copiara los materiales en el mismo boton. te explico en el formulario presupuestos hay un subformulario (llamado PresMaterial compuestos por los campos "idPresupuestos/IdMaterial/unidades/Preciounidad"; la tabla PresMaterial) donde hay un cuadro combinado donde vas eligiedo los materiales (tabla "Material" compuesto por "idMaterial/Nombre/Precio unidad) y quería copian en el formulario facturas en el subformulario "FactMaterial" (Compuesta por los campos "idfacturas/idmaterial/unidades/preciounidad" ; la tabla es FactMaterial) también hay un cuadro combinado y igual a lo de presupuestos

Gracias por todo lo que me estas ayudando.

Un saludo

La mecánica sería similar al proceso que te di anteriormente, pero cambiando las tablas y los campos.

Antes de seguir, indicarte que hay un error en el código que te pasé (en la parte del where), y que hará que no te funcione correctamente: en tus tablas facturas y presupuestos, debieras tener unos campos id que relacionen cada registro (por ejemplo idPresupuesto e idFactura). Si es así, el WHERE sería:

WHERE idPresupuesto =" & Me.idPresupuesto

Pues si insertas filtrando por el idcliente, y el cliente tiene más de un presupuesto, te va a insertar de más...

Dicho esto, el código de tu botón quedaría así:

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

'Insertas los datos del presupuesto
miSQL = "INSERT INTO Facturas(idclientes,fecha) SELECT idclientes,fecha FROM Presupuestos WHERE idPresupuesto =" & Me.idPresupuesto
DoCmd.RunSQL miSQL

'Buscas la factura que acabas de insertar y la insertas
numFactura = DLast("IDFactura", "Facturas")
miSQL = "INSERT INTO FactMaterial(idFacturas,idMaterial,Unidades,PrecioUnidad) SELECT " & numFactura & " AS Factura,idMaterial,Unidades,PrecioUnidad FROM PresMaterial WHERE idPresupuestos=" & Me.subPresMaterial.Form.idPresupuestos
DoCmd.RunSQL miSQL
DoCmd.SetWarnings True

'Opcional: abres el formulario en la nueva factura
DoCmd.OpenForm "Facturas", , , "ID=" & numFactura

Fíjate que previamente a insertar los datos del subformulario hay que buscar el último Idfactura (el que se acaba de crear) para que los datos del subformulario queden correctamente relacionados.

Te dejo un mini-ejemplo para que lo veas mejor: http://www.filebig.net/files/pV29seWkZW

(El ejemplo no lleva exactamente los mismos nombres que tu tienes)

Me funciono perfecto muchas gracias. una ultima cosa se podría hacer algo para que evitar darle dos veces para que no de suplique. para que sepas el formulario presupuestos y facturas están relacionadas(en el form de facturas hay un campo idpresupuesto) lo comento como aclaración. muchísimas gracias. un saludo

La opción más sencilla es que en la tabla de presupuestos añadas un campo tipo Si/No (por ejemplo Facturado). Luego, lo añades también al formulario, le sacas sus propiedades y le pones Visible en No, para que no se vea.

El funcionamiento sería así: si ese campo está desmarcado (valor No, o Falso), el código del botón se ejecuta y una vez traspasados los datos, se marca a Si o Verdadero. Si el cmapo ya está marcado, es porque el presupuesto ya se facturó, y el botón no hace nada (o avisa de que ya está facturado)

El código completo sería así (en negrita lo nuevo):

Dim miSQL As String
Dim numFactura As Integer

'Compruebas si se ha facturado

If Me.Facturado=True Then

MsgBox "El Presupuesto ya ha sido facturado"

Exit Sub

End If
DoCmd.SetWarnings False
'Insertas los datos del presupuesto
miSQL = "INSERT INTO Facturas(idclientes,fecha) SELECT idclientes,fecha FROM Presupuestos WHERE idPresupuesto =" & Me.idPresupuesto
DoCmd.RunSQL miSQL
'Buscas la factura que acabas de insertar y la insertas
numFactura = DLast("IDFactura", "Facturas")
miSQL = "INSERT INTO FactMaterial(idFacturas,idMaterial,Unidades,PrecioUnidad) SELECT " & numFactura & " AS Factura,idMaterial,Unidades,PrecioUnidad FROM PresMaterial WHERE idPresupuestos=" & Me.subPresMaterial.Form.idPresupuestos
DoCmd.RunSQL miSQL
DoCmd.SetWarnings True

'Marcas la casilla facturado como verdadera

Me.Facturado=True
'Opcional: abres el formulario en la nueva factura
DoCmd.OpenForm "Facturas", , , "ID=" & numFactura

Si no quieres lanzar aviso, borra la linea: MsgBox "El Preuspuesto ya ha sido facturado"

Si no necesitas nada más, te agradecería que finalizases la pregunta, para que no se me acumulen las preguntas abiertas.

La pregunta no admite más respuestas

Más respuestas relacionadas