¿Cómo hacer crear varios registros desde un formulario con un botón?

Tengo un formulario vinculado a una BD, y quiero que sobre ese formulario trabaje otra gente. Mi intención es que modifiquen los distintos campos, a partir de un registro anterior, y que al hacer los cambios pertinentes, tenga un botón para "guardar copia", para que se cree un nuevo registro, en vez de que se guarde sobre el que se esta trabajando actualmente.

Si alguien me puede ayudar con el código para ese botón, sería perfecto.

1 respuesta

Respuesta
1

Una opción sería que construyas una SQL para insertar datos y la ejecutes al pulsar el botón. La idea sería poner en el código del botón esto:

Dim miSQL As String

miSQL="INSERT INTO TuTabla VALUES(" & Me.Campo1 & "," & Me.Campo2 &... & ")"

CurrentDb. Execute miSQL

Precisiones:

La más importante, has de tener en cuenta el tipo de datos, de tal forma que si el campo que recibe el dato es de texto, el valor ha de ir entre comillas simples ( ...,'" & Me.CampoTexto & "',...), y si es de tipo fecha hora, entre almohadillas ( ...,#" & Me.CampoFecha & "#,...)

Tienes información sobre la sintaxis de la SQL en este enlace: http://www.w3schools.com/sql/sql_insert.asp

Si te resulta engorroso crear la SQL, puedes crear una consulta de anexar y la ejecutas desde el botón.

Un saludo.


Un nuevo foro de access, visítanos: http://nksvaccessolutions.com/Foro/ 

Si que es muy engorroso, porque además de ser muchos datos, vienen de tablas distintas. ¿Como funcionaría lo de la consulta?

Si los datos vienen de distintas tablas (entiendo que se guardan en distintas tablas) has de hacer una SQL de datos anexados para cada tabla, lo que es aún más engorroso.

Pregunta: ¿Para qué quieres duplicar el registro? No le veo sentido...

porque yo en la tabla, solo he metido dos registros; quiero que este documento sea algo interactivo entre varias personas de la empresa, para que así, ellos abran un registro, modifiquen los campos que necesitan para un nuevo producto (aunque quiero que lo modifiquen desde un registro existente, no uno en blanco, ya que hay muchos campos que seguramente se repitan) y este lo guarden como uno nuevo, para así ir creando entre todos una biblioteca de productos.

por lo que veo es engorroso de todas formas, es que son muchos campos para hacer código...

Estoy pensando, que igual los nuevos datos podrían anexarse a una tabla nueva; es decir, yo tengo la mía (original y de la que partió mi formulario) y otra en la que podría incrustar los nuevos registros. ¿Seria así menos engorroso?

Pues creo que entiendo lo que pretendes hacer, pero darte una solución sin ver tu BD es difícil.

Se me ocurre una forma, pensada a partir de un ejemplo mío (http://siliconproject.com.ar/neckkito/index.php/component/content/article/93-ejemplos-explicados/ejemplos-de-formularios/286-datos-en-formularios-independientes-1 ), pero requiere mucha programación.

Si quieres enviarme una copia de tu BD a mi correo, te lo miro e intento hacerlo: [email protected]

No, muchas gracias :)

He creado una consulta de anexar datos, he puesto el siguiente código en el botón del formulario para que me llame a la consulta y cree un nuevo registro, pero no hace nada:

docmd. setwarnings false
DOCMD. OPENQUERY "Nombredemiconsulta"

ves algún error?

de hecho no tengo claro que haya hecho la consulta bien, me podrías decir los pasos a seguir?

Si quieres comprobar si la consulta se ejecuta bien, y si funciona correctamente desde el formulario, quita esta linea: docmd. setwarnings false

Así cuando pulses el botón te saldrá un mensaje diciendo que se va a ejecutar la consulta, y si aceptas, te saldrá otro diciendo los registros que se anexarán. Si te dice que se anexará 1 registro es que todo va OK, y si te dice que se anexarán 0 registros, es porque hay algún fallo de diseño en la consulta.

¿Puedes poner aquí la SQL de esa consulta o una imagen de su vista diseño?

me dice que va a anexar dos registros. Yo creo que el problema, es que me esta cogiendo datos de la tabla "datasheets" y anexándomelos a esa misma tabla, y yo lo que quiero es que me los coja del formulario, y no se como cambiar eso.

te adjunto dos fotos, mil gracias!

Estás en lo cierto, el error que te da es porque intenta duplicar los registros existentes en la tabla, y el id ya está siendo usado.

Si me pegas aquí la SQL te la corrijo, que es mucho para escribir...

INSERT INTO datasheets ( Id, Codigo, [Codigo_ iluminacion], Codigo_cosechado, Codigo_temperatura, [Codigo_control ph], [Materiales de construccion_linea1], [Materiales de construccion_linea2], [Materiales construccion_linea3], [Alimentacion electrica], [Control de nivel], [Control de temperatura], Rotametro, Sondas_linea1_ph, Sondas_linea2_temperatura, Sondas_linea3, [Filtro gases], iluminacion_linea4_espectro, [iluminacion_linea5_temperatura de color], aire_linea1, aire_linea2, co2_linea1, co2_linea2, Nutrientes, Desagüe, [Control de pH], [opcionales_deposito?], [opcionales_bomba?], [opcionales_ultravioleta?], [opcionales_ozonizador?], [opcionales_kitCO2?], [opcionales_compresor?], [opcionales_filtros?], [opcionales_espectro a medida?], [opcionales_cosechado automático?], [opcionales_tasa de renovación programable?], [opcionales_acceso remoto?], [opcionales_historico de datos?], [opcionales_teleasistencia?], [Volumen (L)], [Número de columnas], [¿Tiene iluminacion?], [Peso Neto (Kg)], [Peso Operación (Kg)], [Largo(mm)], [Ancho (mm)], [Alto (mm)], [Número de tubos], [Potencia de las luces (en W)], [¿Cuantas columnas tiene controladas el control de ph?], [Control de ph-especial], [control de temperatura-especial], [Isochrysis T-ISO DC], [Isochrysis T-ISO Biomasa], [Chaetoceros sp DC], [Chaetoceros sp Biomasa], [Monochrysis (Pavlova) sp DC], [Monochrysis (Pavlova) sp Biomasa], [Rhodomonas sp DC], [Rhodomonas sp Biomasa], [Chlorella vulgaris DC], [Chlorella vulgaris Biomasa], [Haematococcus pluvialis DC], [Haematococcus pluvialis Biomasa], [Idóneo para el cultivo de], [Building materials_line1], [Building materials_line2], [Building materials_line3], Probes_line1, Probes_line2, Air_line1, co2_line1, Drain_line1, [suitable for the culture of], construccion_especifica_cosechado )
SELECT datasheets.Id, datasheets.Codigo, datasheets.[Codigo_ iluminacion], datasheets.Codigo_cosechado, datasheets.Codigo_temperatura, datasheets.[Codigo_control ph], datasheets.[Materiales de construccion_linea1], datasheets.[Materiales de construccion_linea2], datasheets.[Materiales construccion_linea3], datasheets.[Alimentacion electrica], datasheets.[Control de nivel], datasheets.[Control de temperatura], datasheets.Rotametro, datasheets.Sondas_linea1_ph, datasheets.Sondas_linea2_temperatura, datasheets.Sondas_linea3, datasheets.[Filtro gases], datasheets.iluminacion_linea4_espectro, datasheets.[iluminacion_linea5_temperatura de color], datasheets.aire_linea1, datasheets.aire_linea2, datasheets.co2_linea1, datasheets.co2_linea2, datasheets.Nutrientes, datasheets.Desagüe, datasheets.[Control de pH], datasheets.[opcionales_deposito?], datasheets.[opcionales_bomba?], datasheets.[opcionales_ultravioleta?], datasheets.[opcionales_ozonizador?], datasheets.[opcionales_kitCO2?], datasheets.[opcionales_compresor?], datasheets.[opcionales_filtros?], datasheets.[opcionales_espectro a medida?], datasheets.[opcionales_cosechado automático?], datasheets.[opcionales_tasa de renovación programable?], datasheets.[opcionales_acceso remoto?], datasheets.[opcionales_historico de datos?], datasheets.[opcionales_teleasistencia?], datasheets.[Volumen (L)], datasheets.[Número de columnas], datasheets.[¿Tiene iluminacion?], datasheets.[Peso Neto (Kg)], datasheets.[Peso Operación (Kg)], datasheets.[Largo(mm)], datasheets.[Ancho (mm)], datasheets.[Alto (mm)], datasheets.[Número de tubos], datasheets.[Potencia de las luces (en W)], datasheets.[¿Cuantas columnas tiene controladas el control de ph?], datasheets.[Control de ph-especial], datasheets.[control de temperatura-especial], datasheets.[Isochrysis T-ISO DC], datasheets.[Isochrysis T-ISO Biomasa], datasheets.[Chaetoceros sp DC], datasheets.[Chaetoceros sp Biomasa], datasheets.[Monochrysis (Pavlova) sp DC], datasheets.[Monochrysis (Pavlova) sp Biomasa], datasheets.[Rhodomonas sp DC], datasheets.[Rhodomonas sp Biomasa], datasheets.[Chlorella vulgaris DC], datasheets.[Chlorella vulgaris Biomasa], datasheets.[Haematococcus pluvialis DC], datasheets.[Haematococcus pluvialis Biomasa], datasheets.[Idóneo para el cultivo de], datasheets.[Building materials_line1], datasheets.[Building materials_line2], datasheets.[Building materials_line3], datasheets.Probes_line1, datasheets.Probes_line2, datasheets.Air_line1, datasheets.co2_line1, datasheets.Drain_line1, datasheets.[suitable for the culture of], datasheets.construccion_especifica_cosechado
FROM datasheets;

MUCHÍSIMAS GRACIAS!

INSERT INTO datasheets (Codigo, [Codigo_ iluminacion], Codigo_cosechado, Codigo_temperatura, [Codigo_control ph], [Materiales de construccion_linea1], [Materiales de construccion_linea2], [Materiales construccion_linea3], [Alimentacion electrica], [Control de nivel], [Control de temperatura], Rotametro, Sondas_linea1_ph, Sondas_linea2_temperatura, Sondas_linea3, [Filtro gases], iluminacion_linea4_espectro, [iluminacion_linea5_temperatura de color], aire_linea1, aire_linea2, co2_linea1, co2_linea2, Nutrientes, Desagüe, [Control de pH], [opcionales_deposito?], [opcionales_bomba?], [opcionales_ultravioleta?], [opcionales_ozonizador?], [opcionales_kitCO2?], [opcionales_compresor?], [opcionales_filtros?], [opcionales_espectro a medida?], [opcionales_cosechado automático?], [opcionales_tasa de renovación programable?], [opcionales_acceso remoto?], [opcionales_historico de datos?], [opcionales_teleasistencia?], [Volumen (L)], [Número de columnas], [¿Tiene iluminacion?], [Peso Neto (Kg)], [Peso Operación (Kg)], [Largo(mm)], [Ancho (mm)], [Alto (mm)], [Número de tubos], [Potencia de las luces (en W)], [¿Cuantas columnas tiene controladas el control de ph?], [Control de ph-especial], [control de temperatura-especial], [Isochrysis T-ISO DC], [Isochrysis T-ISO Biomasa], [Chaetoceros sp DC], [Chaetoceros sp Biomasa], [Monochrysis (Pavlova) sp DC], [Monochrysis (Pavlova) sp Biomasa], [Rhodomonas sp DC], [Rhodomonas sp Biomasa], [Chlorella vulgaris DC], [Chlorella vulgaris Biomasa], [Haematococcus pluvialis DC], [Haematococcus pluvialis Biomasa], [Idóneo para el cultivo de], [Building materials_line1], [Building materials_line2], [Building materials_line3], Probes_line1, Probes_line2, Air_line1, co2_line1, Drain_line1, [suitable for the culture of], construccion_especifica_cosechado )

VALUES([Formularios].[TuFormulario].Codigo, [Formularios].[TuFormulario].[Codigo_ iluminacion], [Formularios].[TuFormulario].Codigo_cosechado, [Formularios].[TuFormulario].Codigo_temperatura, [Formularios].[TuFormulario].[Codigo_control ph], [Formularios].[TuFormulario].[Materiales de construccion_linea1], [Formularios].[TuFormulario].[Materiales de construccion_linea2], [Formularios].[TuFormulario].[Materiales construccion_linea3], [Formularios].[TuFormulario].[Alimentacion electrica], [Formularios].[TuFormulario].[Control de nivel], [Formularios].[TuFormulario].[Control de temperatura], [Formularios].[TuFormulario].[Rotametro], [Formularios].[TuFormulario].[Sondas_linea1_ph], [Formularios].[TuFormulario].[Sondas_linea2_temperatura], [Formularios].[TuFormulario].[Sondas_linea3], [Formularios].[TuFormulario].[Filtro gases], [Formularios].[TuFormulario].iluminacion_linea4_espectro], [Formularios].[TuFormulario].[iluminacion_linea5_temperatura de color], [Formularios].[TuFormulario].[aire_linea1], [Formularios].[TuFormulario].[aire_linea2], [Formularios].[TuFormulario].[co2_linea1], [Formularios].[TuFormulario].[co2_linea2], [Formularios].[TuFormulario].[Nutrientes], [Formularios].[TuFormulario].[Desagüe], [Formularios].[TuFormulario].[Control de pH], [Formularios].[TuFormulario].[opcionales_deposito?], [Formularios].[TuFormulario].[opcionales_bomba?], [Formularios].[TuFormulario].[opcionales_ultravioleta?], [Formularios].[TuFormulario].[opcionales_ozonizador?], [Formularios].[TuFormulario].[opcionales_kitCO2?], [Formularios].[TuFormulario].[opcionales_compresor?], [Formularios].[TuFormulario].[opcionales_filtros?], [Formularios].[TuFormulario].[opcionales_espectro a medida?], [Formularios].[TuFormulario].[opcionales_cosechado automático?], [Formularios].[TuFormulario].[opcionales_tasa de renovación programable?], [Formularios].[TuFormulario].[opcionales_acceso remoto?], [Formularios].[TuFormulario].[opcionales_historico de datos?], [Formularios].[TuFormulario].[opcionales_teleasistencia?], [Formularios].[TuFormulario].[Volumen (L)], [Formularios].[TuFormulario].[Número de columnas], [Formularios].[TuFormulario].[¿Tiene iluminacion?], [Formularios].[TuFormulario].[Peso Neto (Kg)], [Formularios].[TuFormulario].[Peso Operación (Kg)], [Formularios].[TuFormulario].[Largo(mm)], [Formularios].[TuFormulario].[Ancho (mm)], [Formularios].[TuFormulario].[Alto (mm)], [Formularios].[TuFormulario].[Número de tubos], [Formularios].[TuFormulario].[Potencia de las luces (en W)], [Formularios].[TuFormulario].[¿Cuantas columnas tiene controladas el control de ph?], [Formularios].[TuFormulario].[Control de ph-especial], [Formularios].[TuFormulario].[control de temperatura-especial], [Formularios].[TuFormulario].[Isochrysis T-ISO DC], [Formularios].[TuFormulario].[Isochrysis T-ISO Biomasa], [Formularios].[TuFormulario].[Chaetoceros sp DC], [Formularios].[TuFormulario].[Chaetoceros sp Biomasa], [Formularios].[TuFormulario].[Monochrysis (Pavlova) sp DC], [Formularios].[TuFormulario].[Monochrysis (Pavlova) sp Biomasa], [Formularios].[TuFormulario].[Rhodomonas sp DC], [Formularios].[TuFormulario].[Rhodomonas sp Biomasa], [Formularios].[TuFormulario].[Chlorella vulgaris DC], [Formularios].[TuFormulario].[Chlorella vulgaris Biomasa], [Formularios].[TuFormulario].[Haematococcus pluvialis DC], [Formularios].[TuFormulario].[Haematococcus pluvialis Biomasa], [Formularios].[TuFormulario].[Idóneo para el cultivo de], [Formularios].[TuFormulario].[Building materials_line1], [Formularios].[TuFormulario].[Building materials_line2], [Formularios].[TuFormulario].[Building materials_line3], [Formularios].[TuFormulario].[Probes_line1], [Formularios].[TuFormulario].[Probes_line2], [Formularios].[TuFormulario].[Air_line1], [Formularios].[TuFormulario].[co2_line1], [Formularios].[TuFormulario].[Drain_line1], [Formularios].[TuFormulario].[suitable for the culture of], [Formularios].[TuFormulario].[construccion_especifica_cosechado])

Creo que así te tendría que funcionar. Tendrás que cambiar lo que está en negrita por el nombre del formulario. Supongo que los nombres del formulario son los mismos que los de los campos, sino tendrás que comprobarlos uno a uno.

VALE, GENIAL,

funciona en sentido de que me incrusta un nuevo registro en la tabla, pero sin embargo, en el formulario solo me deja elegir entre los dos registros originales que tenía.

¿Como puedo arreglar esto?

Y otra cosa:

los datos del formulario (los que quiero que el usuario pueda cambiar) vienen de una tabla principal, y después, tengo varios cuadros combinados, que cada uno viene de una tabla distinta.

entonces, hice lo que hablamos en esta conversación, y va perfecto con los datos que están vinculados a esa tabla inicial, pero con los otros no, me los guarda en la tabla inicial, en un nuevo campo que he creado, pero no me los actualiza en el formulario, supongo que porque los campos del formulario no están vinculados a ese nuevo campo de la tabla inicial, estoy en lo cierto?

Vamos por partes:

1º/ Para recargar el formulario una vez que "duplicas" el registro, añade al código después de ejecutar la consulta esta linea: Me. Requery

2º/ Un fallo que no hemos tenido en cuenta, es que el registro modificado se te queda modificado (Access es lo que tiene, guarda automáticamente si el formulario está basado en la tabla), con lo que tendrás 2 registros iguales y pierdes el original. Puedes intentar solventarlo poniendo antes de la linea anterior: "Me.Undo", a ver si te descarta los cambios en el registro, una vez los insertas, pero no estoy seguro...

3º/ Si modificas los cuadros combinados, que toman sus datos de otras tablas, tendrás que insertar los nuevos datos en las correspondientes tablas, si no existen, lo que te implica una nueva SQL para una nueva consulta de datos anexados por cada cuadro combinado. Un engorro, vamos.

no me queda claro donde poner ambos códigos me.requery y me.undo ??

DoCmd.OpenQuery ...

Me. Undo

Me. Requery

así no funciona :/

El problema es que yo quiero tener un botón de guardar copia al final del informe.

He pensado que este botón tuviese un código que duplique el informe actual y borre los datos modificados en el informe actual pero los guarde en la copia. así podría funcionar? y de ser así, como sería el código?

Dime por qué no te funciona...

Lo que propones es lo que estamos tratando de hacer:

Con la consulta intentamos que se guarde en la tabla el registro modificado, y con el Me. Undo deshaga los cambios para dejar el original.

Sigo sin verle "la ventaja" a tu planteamiento de modificar un registro para guardar uno nuevo. Por si te sirve de idea: en vez de eso, crea un registro nuevo, y los campos que sean "repetitivos" los configuras como cuadros combinados que desplieguen las opciones ya registradas en la tabla, y además permitan nuevos valores. En mi opinión es mucho más simple y te dará menos quebraderos de cabeza.

no me funciona porque guarda en el registro actual los cambios que he hecho, en vez de sólo en el nuevo registro.

ya tengo cuadros combinados con los valores repetitivos, pero hay campos que tienen que ser completados con texto, pero quiero que el cliente vea lo que está escrito del anterior (en vez de que aparezca un registro en blanco) para que vea la estructura de como escribir el siguiente.

Seguiré intentando entonces, así, y ya comento. De todas muchas gracias por la ayuda.

¡Idea que igual te funciona!:

En el evento "Al activar registro" de tu formulario le pones este código:

If Me.NewRecord Then  'Si es un registro nuevo

Me.Codigo=DLast("Codigo","datasheets")

Me.[Codigo_ iluminacion]=DLast("[Codigo_ iluminacion]","datasheets")

Me.Codigo_cosechado=DLast("Codigo_cosechado","datasheets")

...

'Y así con todos los campos que quieras

End If

Si no te funcionase así el DLast, puede hacer esto otro:

If Me.NewRecord Then  'Si es un registro nuevo

Dim maxID as Long

maxID=DMax("Id","datasheets"=

Me.Codigo=DLookUp("Codigo","datasheets","Id=" & maxID)

Me.[Codigo_ iluminacion]=DLast("[Codigo_ iluminacion]","datasheets","Id=" & maxID)

...

End If

Espero que esta sea la definitiva, porque no tengo más ideas... je je

Pero esto lo haría con la consulta de anexar hecha, y con el código de me. undo y me. ¿requery también no?

Al final, he hecho una prueba con un archivo access menos complejo que el que tengo, y me funciona con el código que dijiste al principio (por lo que supongo que en el actual no me funciona por un error mio en el código, volveré a revisar). para que me vaya directamente al ultimo registro he añadido el código DoCmd.GoToRecord , , acLast, por lo que al final queda así (para posibles dudas de otras personas)

-Crear una consulta de datos anexados

-Crear un botón en el formulario, que será el de guardar como, con el siguiente código en el evento al hacer click:

Private Sub boton_guardarcomo_Click()
DoCmd.SetWarnings False
DoCmd.OpenQuery "Consulta_prueba_guardarcomo"
Me.Undo
Me.Requery
DoCmd.GoToRecord , , acLast
End Sub

Muchas gracias por tu ayuda! Saludos.

El último código que te puse es así tal cual (con el resto de controles a añadir), no interviene ni hace falta la consulta de datos anexados, ni el Me. Undo ni el Me. Requery.

Acabo de ver un error en la segunda alternativa:

donde pongo: maxID=DMax("Id","datasheets"=

debe ser: maxID=DMax("Id","datasheets")

Ah, por si te interesa, que igual también te sirve, mira este ejemplo de Neckkito: http://siliconproject.com.ar/neckkito/index.php/ejemplos-explicados/todos/93-ejemplos-explicados/ejemplos-de-formularios/190-duplicar-registros-secuencialmente 

Si consideras finalizada la pregunta, te agradecería la valorases.

Un saludo.


Un nuevo foro de access, visítanos: http://nksvaccessolutions.com/Foro/ 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas