Traspasar todos los datos de un formulario a otro formulario

Quería pedirles de su ayuda para crear un código en un botón al hacer click que me lleve todos los datos del formulario "OrdenDeTrabajo" con subformulario "DetalleOrdenDeTrabajo" al formulario "FacturaDeVenta" y el subformulario "DetalleFacturaDeVenta" . Estos formulario y subformularios tienen los mismos campos. La idea es que al momento de traspasar los datos no haya variación en el stock y precio de la tabla "Artículos"

1 Respuesta

Respuesta
1

Solo necesitas hacer dos consultas de datos anexados, una para los datos del formulario y otra para los del subformulario (en ese orden, además)

CurrentDb.Execute "INSERT INTO TablaFacturas SELECT * FROM TablaORDEN WHERE CampoClave=" & Me.CampoClave

CurrentDb.Execute "INSERT INTO TablaDetallesFacturas SELECT * FROM TablaDetalleORDEN WHERE CampoClave=" & Me.CampoClave

Eso siempre que realmente las tablas tengan exactamente los mismos campos y en las mismas posiciones (si no fuera así tendrías que indicar cada campo en la SQL: INSERT INTO TablaFacturas( Campo1, Campo2...) SELECT Campo1, Campo2... FROM TablaOrden WHERE....) En la parte del WHERE tienes que poner, en la primera SQL, un campo que identifique el registro que quieres traspasar, y en la segunda, tienes que poner el campo que hace de "vínculo" entre las dos tablas.

En esta misma web ya se dieron muchas soluciones al respecto, por ejemplo:

Pasar albarán a factura

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

Como convertir pedidos a Factura con un botón ACCESS

¿Pasar automáticamente de Presupuesto a Factura?

Copiar datos de un formulario a otro

Mire los otros ejemplos, pero los encuentro más complicados que el que me indicas tu. Este es el código que forme con los datos que me entregaste. Lo único que agregue fue el mensaje de texto

Private Sub Comando107_Click()
If MsgBox("Estas a punto de factura esta Orden de Trabajo, ¿Deseas Continuar?", vbYesNo, "CONFIRMAR") = vbNo Then Exit Sub
CurrentDb.Execute "INSERT INTO FACTURA_VENTAS SELECT* FROM ORDENES_DE_TRABAJO WHERE FVENTA=" & Me.FVENTA
CurrentDb.Execute "INSERT INTO FACTURA_VENTAS_DETALLES SELECT* FROM ORDENES_DE_TRABAJO_DETALLE WHERE FVENTA=" & Me.FVENTA
End Sub

Al presionar el botón me sale este código de falla

Si tu campo clave es una fecha, la parte del where tiene que ser así:

...WHERE FVenta=#" & Me.FVenta & "#"

o mejor incluso:

...WHERE FVenta=#" & Format(Me.FVenta,"mm/dd/yyyy") & "#"

Pero el campo clave de la tabla FACTURA_VENTAS y FACTURA_VENTAS_DETALLES con el que se relaciona son por el campo número de factura ™FVENTA™ y no por el campo fecha y en las tablas ORDENES_DE_TRABAJO y ORDENES_DE_TRABAJO_DETALLE se relacionan con el campo número de orden ™OT™

Y me olvidaba contarte que el campo es de tipo texto

Vale, había supuesto que FVenta era el campo Fecha que se ve en tu formulario.

Si son de texto, sería:

...WHERE FVenta='" & Me.FVenta & "'"

Me da lata seguir molestando, pero me sale este error ahora

No molestas para nada. Ese error te indica que en tu formulario no hay ningún control que se llama FVenta. Releyendo todo el tema, entiendo que el WHERE tendría que ser:

... WHERE OT='" & Me.OT & "'"

También comentas, en un principio que los formularios (y por tanto entiendo que las tablas) tienes los mismos campos, pero luego resulta que no es del todo cierto. La solución que te propuse te sirve si al "número" de factura le vas a dar el mismo "número" de orden de trabajo. Si no es así, te remito de nuevo a los ejemplos de mi primera respuesta, y el proceso sería:

1º/  Calculas el número de factura que corresponde

2º/ Pasas en la SQL ese número de factura y el resto de los campos del formulario principal.

3º/ Pasas en la SQL ese campo y el resto de campos del subformulario.

Sería parecido a este ejemplo (se usa un ID autonumérico, peo la idea es la misma): http://www.filebig.net/files/EV8P4PmE9i

Si ves que no lo consigues, no tengo inconveniente en que me pongas aquí la BD y devolvértela con el código exacto que necesitas.

Lo he intentado de varias formas pero no me resulta, se que estoy haciendo algo mal pero no puedo descubrir lo que es. Probé también cambiando a copiar campo por campo con SQL, pero no logro dar con la solución. De igual forma con el código para el numero de factura +1. Así que me gustaría enviarte  una copia de la BD pero no se como hacerlo. Te agradezco tu paciencia e interés por enseñarnos y ayudarnos a poder seguir con este tema tan fascinante de la programación. Todo lo que he podido realizar en La BD solo lo he podido lograr con tu ayuda y varios colegas mas. Muchas gracias.

Súbela a filebig.net y ponme aquí el enlace de descarga. O usa mega, Dropbox o similar

ahí esta el link https://www.filebig.net/files/DGzzGqGYTL  espero haberlo hecho bien

Mañana lo veo y te digo algo

Ahí tienes: http://www.filebig.net/files/Dfm3W3BqhN 

Has de fijarte mejor en qué tablas pones en cada SQL, así como en poner todos los campos que marcas como requeridos.

oka, pondré mas atención en esos puntos, gracias. Probé la BD y me copia todos los campos  indicados en el código a la tabla correspondiente, pero cuando se abre el formulario me sale en blanco. Es posible que al presionar el botón de facturar a parte de copiar los datos en la tabla me los ingrese también en el formulario, ya que no me muestra en que correlativo estoy.

le habrá pasado algo al código 

Private Sub Comando107_Click()
Dim miSQL As String
Dim numFactura As Integer

numFactura = Val(DLast("FVENTA", "FACTURA_VENTAS")) + 1
If MsgBox("Estas a punto de facturar este pedido, ¿Desea continuar?", vbYesNo, "CONFIRMAR") = vbNo Then Exit Sub
miSQL = "INSERT INTO FACTURA_VENTAS(FVENTA,FECHA,PATENTE,KILOMETROS,[CODIGO CLIENTE]) SELECT " & numFactura & " AS Fact,FECHA,PATENTE,KILOMETROS, [CODIGO CLIENTE] FROM ORDENES_DE_TRABAJO WHERE OT='" & Me.OT & "'"
CurrentDb.Execute miSQL, dbFailOnError

miSQL = "INSERT INTO FACTURA_VENTAS_DETALLES(FVENTA,CODIGO_ARTICULO_FV,[TIPO DE ARTICULO],DESCRIPCION) SELECT " & numFactura & " AS Fact,CODIGO_ARTICULO_OT,[TIPO DE ARTICULO],DESCRIPCION FROM ORDENES_DE_TRABAJO_DETALLE WHERE OT='" & Me.OT & "'"
CurrentDb.Execute miSQL, dbFailOnError

Me.FACTURADO = True

DoCmd.OpenForm "INGRESO FACTURAS DE VENTA", , , "FVENTA='" & numFactura & "'"
End Sub

Al código no le pasa nada, está perfecto.

Ahora bien, si en el evento "al cargar" del formulario de ventas, le dices que se te vaya a un nuevo registro, lógicamente se te va a un nuevo registro, y por eso lo ves en blanco. Solo verás el registro que acabas de traspasar si ya tenías abierto el formulario de ventas...

Hay muchas posibilidades de solucionarlo:

1º/ quitar ese código del "form load" del formulario de facturas, y controlar que se vaya al registro nuevo por otro método

2º/ ver si al formulario presupuesto está abierto o no, y en función de eso ir al registro nuevo o no

3º/ usar OpenArgs en la linea del DoCmd. OpenForm, y luego analizarlo en el "form load" para ir al registro nuevo o al nuevo

...

Pero cualquier opción será más o menos válida (aunque todas van a funcionar) según el funcionamiento que le quieras dar a la BD... ahí no te puedo recomendar ninguna

Oka, entiendo. Realizare la primera opción, y voy a agregar los demás campos para ver como me va. Ahí te cuento, gracias.

Funciona a la perfección, muchas gracias por tu ayuda y paciencia.

Apropósito, tengo una duda con la consulta de datos anexados que creaste, solo tiene como tres campos para anexar, pensé que tenia que agregar los demás campos que faltaban, pero así funciona bien.

A la consulta de datos anexados le puedes poner todos los campos que quieras, hasta 255, que si mal no recuerdo, es el límite que admite

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas