Actualizar campos
Hola, yo de nuevo :D :D :D esta es sencillita pero no eh sido capas tengo dos formularios
productos y compras ambos formularios tienen campos similares lo que quiero es que al llenar el formulario compras también se me valla llenando el formulario productos en nuevo registro y lo valla registrando en la tabla como si lo escribiera yo normalmente, pues en ambas tablas aquí una imagne :D
productos y compras ambos formularios tienen campos similares lo que quiero es que al llenar el formulario compras también se me valla llenando el formulario productos en nuevo registro y lo valla registrando en la tabla como si lo escribiera yo normalmente, pues en ambas tablas aquí una imagne :D
1 respuesta
Respuesta de Neckkito Nck
1
1
Una manera de hacer lo que pides e ir viendo los resultados es la siguiente:
En el formulario compras tienes que sacar las propiedades (en vista diseño) de los campos comunes a ambos formularios y, en el evento "Después de actualizar", tienes que escribir el siguiente código en VBA (en los tres campos la mecánica es la misma. Te indico el primero con comentarios para que sepas qué va haciendo el código):
1) Suponiendo que el campo Producto es tipo texto y tiene ese mismo nombre en ambos formularios:
Private Sub Producto_AfterUpdate()
Dim strProducto As String
strProducto = Me.Producto.Value 'Coge el nombre del producto
'Este If es para evitar mensajes de error si por cualquier
'circunstancia el campo quedara en blanco
If IsNull(strProducto) Then
MsgBox "No hay ningun valor introducido"
Exit Sub
End If
'Asignamos el nombre del producto al campo del formulario
'Productos
Forms![Productos].[Producto].Value = strProducto
'Refrescamos para que aparezca la información
Forms![Productos].Refresh
End Sub
2) Suponiendo que el campo Cantidad es tipo número entero y tiene ese mismo nombre en ambos formularios:
Private Sub Cantidad_AfterUpdate()
Dim intCantidad As Integer
intCantidad = Me.Cantidad.Value
If IsNull(intCantidad) Then
MsgBox "No hay ningun valor introducido"
Exit Sub
End If
Forms![Productos].[Cantidad].Value = intCantidad
Forms![Productos].Refresh
End Sub
3) Suponiendo que el campo "Precio de compra" es de tipo moneda y tiene por nombre PrecioCompra en ambos formularios:
Private Sub PrecioCompra_AfterUpdate()
Dim curPC As Currency
curPC = Me.PrecioCompra.Value
If IsNull(curPC) Then
MsgBox "No hay ningun valor introducido"
Exit Sub
End If
Forms![Productos].[PrecioCompra].Value = curPC
Forms![Productos].Refresh
End Sub
4) Finalmente, al botón "GuardarYNuevo" del formulario "Compras" habrá que añadirle este código en el evento "Al hacer click":
Private Sub cmdAddNew_Click()
'Esto añade un nuevo registro en el formulario Compras
DoCmd.GoToRecord acDataForm, "Compras", acNewRec
'Esto comprueba que hay un valor en el campo Producto
'del formulario Productos. Si lo hay, añade un nuevo
'registro. Si el campo está en blanco no hace nada
If Not IsNull(Forms![Productos].[Producto].Value) Then
DoCmd.GoToRecord acDataForm, "Productos", acNewRec
Else
Exit Sub
End If
End Sub
Suerte!
En el formulario compras tienes que sacar las propiedades (en vista diseño) de los campos comunes a ambos formularios y, en el evento "Después de actualizar", tienes que escribir el siguiente código en VBA (en los tres campos la mecánica es la misma. Te indico el primero con comentarios para que sepas qué va haciendo el código):
1) Suponiendo que el campo Producto es tipo texto y tiene ese mismo nombre en ambos formularios:
Private Sub Producto_AfterUpdate()
Dim strProducto As String
strProducto = Me.Producto.Value 'Coge el nombre del producto
'Este If es para evitar mensajes de error si por cualquier
'circunstancia el campo quedara en blanco
If IsNull(strProducto) Then
MsgBox "No hay ningun valor introducido"
Exit Sub
End If
'Asignamos el nombre del producto al campo del formulario
'Productos
Forms![Productos].[Producto].Value = strProducto
'Refrescamos para que aparezca la información
Forms![Productos].Refresh
End Sub
2) Suponiendo que el campo Cantidad es tipo número entero y tiene ese mismo nombre en ambos formularios:
Private Sub Cantidad_AfterUpdate()
Dim intCantidad As Integer
intCantidad = Me.Cantidad.Value
If IsNull(intCantidad) Then
MsgBox "No hay ningun valor introducido"
Exit Sub
End If
Forms![Productos].[Cantidad].Value = intCantidad
Forms![Productos].Refresh
End Sub
3) Suponiendo que el campo "Precio de compra" es de tipo moneda y tiene por nombre PrecioCompra en ambos formularios:
Private Sub PrecioCompra_AfterUpdate()
Dim curPC As Currency
curPC = Me.PrecioCompra.Value
If IsNull(curPC) Then
MsgBox "No hay ningun valor introducido"
Exit Sub
End If
Forms![Productos].[PrecioCompra].Value = curPC
Forms![Productos].Refresh
End Sub
4) Finalmente, al botón "GuardarYNuevo" del formulario "Compras" habrá que añadirle este código en el evento "Al hacer click":
Private Sub cmdAddNew_Click()
'Esto añade un nuevo registro en el formulario Compras
DoCmd.GoToRecord acDataForm, "Compras", acNewRec
'Esto comprueba que hay un valor en el campo Producto
'del formulario Productos. Si lo hay, añade un nuevo
'registro. Si el campo está en blanco no hace nada
If Not IsNull(Forms![Productos].[Producto].Value) Then
DoCmd.GoToRecord acDataForm, "Productos", acNewRec
Else
Exit Sub
End If
End Sub
Suerte!
Hola muchas gracias
Me esta sacando error al guardar en el evento clic de guardar y nuevo el código esta así
Private Sub Guardar_Y_Nuevo_Click()
DoCmd.GoToRecord acDataForm, "Compras", acNewRec
If Not IsNull(Forms![productos].[Producto].Value) Then
DoCmd.GoToRecord acDataForm, "Productos", acNewRec
Else
Exit Sub
End If
End Sub
al darle clic me sacar erro diciendo que no encuentra el formulario productos y le intente con otro y tampoco con el unico que no lanza error es con el formulario compras osea este es el formulario donde estoy ingresando los codigos me imagino que formulario productos lo dejo o tambien tengo que insertarle los codigos?
Gracias de ante mano :D:D
Me esta sacando error al guardar en el evento clic de guardar y nuevo el código esta así
Private Sub Guardar_Y_Nuevo_Click()
DoCmd.GoToRecord acDataForm, "Compras", acNewRec
If Not IsNull(Forms![productos].[Producto].Value) Then
DoCmd.GoToRecord acDataForm, "Productos", acNewRec
Else
Exit Sub
End If
End Sub
al darle clic me sacar erro diciendo que no encuentra el formulario productos y le intente con otro y tampoco con el unico que no lanza error es con el formulario compras osea este es el formulario donde estoy ingresando los codigos me imagino que formulario productos lo dejo o tambien tengo que insertarle los codigos?
Gracias de ante mano :D:D
Por lo que comentabas en tu pregunta inicial daba por supuesto que cuando trabajabas con el formulario "Compras" tenías SIEMPRE abierto el formulario "Productos". Desde el momento en que el formulario "Productos" no está abierto es lógico que el anterior código te dé error, porque el trozo de código <<If Not IsNull(Forms![productos].[Producto]. Value) Then>> da por supuesto que tienes el formulario "Productos" abierto.
Tienes dos opciones:
1) Trabajar siempre con los dos formularios abiertos
2) Insertar en los eventos "Después de actualizar" y en evento "Al hacer click" un código que compruebe si el formulario "Productos" está abierto. Si lo está continúa ejecutando el código, y si no lo está pues sale del código.
Ese código sería el siguiente:
---
Dim Formulario As Form, Cargado As Boolean
For Each Formulario In Forms
If Formulario.Name = "Productos" Then
Cargado = True
Exit For
End If
Next Formulario
Set Formulario = Nothing
If Cargado = False Then
Exit Sub
End If
---
Para el botón yo pondría este código al principio. Para los eventos "Después de actualizar" lo pondría justo a continuación del código que comprueba si los campos se han rellenado.
A ver si así te funciona. Please, dime cosas.
Suerte!
Tienes dos opciones:
1) Trabajar siempre con los dos formularios abiertos
2) Insertar en los eventos "Después de actualizar" y en evento "Al hacer click" un código que compruebe si el formulario "Productos" está abierto. Si lo está continúa ejecutando el código, y si no lo está pues sale del código.
Ese código sería el siguiente:
---
Dim Formulario As Form, Cargado As Boolean
For Each Formulario In Forms
If Formulario.Name = "Productos" Then
Cargado = True
Exit For
End If
Next Formulario
Set Formulario = Nothing
If Cargado = False Then
Exit Sub
End If
---
Para el botón yo pondría este código al principio. Para los eventos "Después de actualizar" lo pondría justo a continuación del código que comprueba si los campos se han rellenado.
A ver si así te funciona. Please, dime cosas.
Suerte!
Acabo de repasar de nuevo tu consulta y me ha llamado la atención una cosa: en el código que me has enviado hay una línea que dice
If Not IsNull(Forms![productos].[Producto].Value) Then) donde veo que la llamada al formulario llama a un formulario "productos", con la "p" minúscula.
Y en la siguiente pone
DoCmd. GoToRecord acDataForm, "Productos", acNewRec
Donde se referencia a un formulario "Productos" con la "p" mayúscula.
Echa un vistazo al nombre que le has puesto al formulario. Cuando hayas comprobado si lo tienes en mayúscula o minúscula cambia el nombre incorrecto en el código por el correcto.
Aprovecho para comentarte también que con las prisas he olvidado escribir una línea en el código para saber si el formulario está cargado. Justo debajo de la declaración de variables (la primera línea de las Dim") tienes que añadir lo siguiente:
Cargado=False
"Gajes del oficio" ;)
Suerte!
If Not IsNull(Forms![productos].[Producto].Value) Then) donde veo que la llamada al formulario llama a un formulario "productos", con la "p" minúscula.
Y en la siguiente pone
DoCmd. GoToRecord acDataForm, "Productos", acNewRec
Donde se referencia a un formulario "Productos" con la "p" mayúscula.
Echa un vistazo al nombre que le has puesto al formulario. Cuando hayas comprobado si lo tienes en mayúscula o minúscula cambia el nombre incorrecto en el código por el correcto.
Aprovecho para comentarte también que con las prisas he olvidado escribir una línea en el código para saber si el formulario está cargado. Justo debajo de la declaración de variables (la primera línea de las Dim") tienes que añadir lo siguiente:
Cargado=False
"Gajes del oficio" ;)
Suerte!
Muchas gracias!
aaaaah ese era el problema ja ja muchas gracias ya funciona perfecto me quedo alrevez pero ya lo cuadre en el código y también otra cosita era que tenia que poner el mismo código en ambas tablas je je que pena mi ignorancia es que no se me dan los códigos:D me quedo así
producto en ambas
Dim strProducto As String
Cargado = False
strProducto = Me.Producto.Value
If IsNull(strProducto) Then
MsgBox "No hay ningun valor introducido"
Exit Sub
End If
Forms![productos].[Producto].Value = strProducto
Forms![productos].Refresh
guardar y nuevo en ambas
DoCmd.GoToRecord acDataForm, "Compras", acNewRec
If Not IsNull(Forms![Productos].[Producto].Value) Then
DoCmd.GoToRecord acDataForm, "Productos", acNewRec
Else
Exit Sub
End If
Para evitar tener que abrir las dos tablas creare un macro que diga al abrir un formulario me abra el otro.
Lo dejare abierto un ratico más por si tengo alguna dudilla con los otros dos códigos ¿si? :D
aaaaah ese era el problema ja ja muchas gracias ya funciona perfecto me quedo alrevez pero ya lo cuadre en el código y también otra cosita era que tenia que poner el mismo código en ambas tablas je je que pena mi ignorancia es que no se me dan los códigos:D me quedo así
producto en ambas
Dim strProducto As String
Cargado = False
strProducto = Me.Producto.Value
If IsNull(strProducto) Then
MsgBox "No hay ningun valor introducido"
Exit Sub
End If
Forms![productos].[Producto].Value = strProducto
Forms![productos].Refresh
guardar y nuevo en ambas
DoCmd.GoToRecord acDataForm, "Compras", acNewRec
If Not IsNull(Forms![Productos].[Producto].Value) Then
DoCmd.GoToRecord acDataForm, "Productos", acNewRec
Else
Exit Sub
End If
Para evitar tener que abrir las dos tablas creare un macro que diga al abrir un formulario me abra el otro.
Lo dejare abierto un ratico más por si tengo alguna dudilla con los otros dos códigos ¿si? :D
Listo perfecto solo una cosita más, me podrías decir cuales son los códigos de cada tipo de datos
El de texto es: str
el de numero es: int
El de moneda es: ¿curPC
cómo sera el de fecha?
Muchas gracias sos un crack 10 estrellas lastima que solo se pueda 5 :¿D?
El de texto es: str
el de numero es: int
El de moneda es: ¿curPC
cómo sera el de fecha?
Muchas gracias sos un crack 10 estrellas lastima que solo se pueda 5 :¿D?
Aprovecho para comentarte un par de cosas que creo que te pueden interesar, por lo que comentas en tu mensaje:
1. Abrir formularios con VBA
Me parece fantástico que utilices macros para automatizar acciones. Es un recurso muy útil y para eso está. Pero si por casualidad quieres saber cómo se hace eso en VBA es muy fácil. Es así:
DoCmd.OpenForm "NombreFormulario", [tipodevista], [Filtro],[Condicion],[ModoDatos],...
Los argumentos que van entre corchetes son opcionales. Además, hay más argumentos, pero no vienen al caso. También, en el editor de VBA, a medida que vas escribiendo, sale el "chivato" que te va diciendo qué viene a continuación.
En pocas palabras, si, por ejemplo, tienes un formulario "Menu" donde hay un botón que diga "Abrir", al evento "Al abrir" de ese botón le escribes el siguiente código
DoCmd. OpenForm "Compras"
Y te abrirá ese formulario, donde podrás ver todos los registros. Si lo que quieres es abrirlo y que quede preparado para añadir un nuevo registro basta que escribas (ojo con las comas, que no te puedes dejar ninguna!):
DoCmd. OpenForm "Compras",,,, acFormAdd
Así, el código final para ese supuesto botón "Abrir" sería (en tu caso):
Private Sub cmdAbrir_Click()
DoCmd. OpenForm "Compras",,,, acFormAdd
DoCmd. OpenForm "Productos",,,, acFormAdd
'Esta línea es para que cierre el formulario "Menu" para evitar tener tantos abiertos DoCmd. Close acForm, "Menu"
End Sub
Y eso es todo
2. Convenciones de llamada
Como indica la palabra, son convenciones. Quizá puedas encontrarte a alguien que en vez de escribir "int" escriba "ent". Sólo para que lo tengas en cuenta.
Hasta donde yo sé, las convenciones más estándar son las siguientes (no incluyo las que ya sabes):
Variables
bln-Boolean / byt-Byte / dtm-Fecha/Hora, que viene a significar "Date Time" / dbl-Double / err-Error / lng-Long / obj-Objeto / sng-Single / var-Variant / prm-Parámetro / udt-Definido por el usuario
Controles
ado-Datos ADO / chk-Casilla de verificación / cbo-Cuadro combinado / lst-Cuadro de lista / cmd-Botón de comando / fra-Marco (frame) / grp-Grupo de Opciones / img-Imagen / lbl-Etiqueta (label) / opt-Botón de opción / txt-Cuadro de texto
Objetos
tbl-Tabla / qry-Consulta / frm-Formulario / rpt-Informe (Report) / mac-Macro / col-Colección / pty-Propiedad / pag-Páginas de acceso a datos
Probablemente me dejo alguna, pero supongo que si te la encuentras una búsqueda por Internet te dará la respuesta.
Como verás yo a veces las utilizo y a veces no. Si el código es muy simple a veces "paso" de escribirlas por temas de rapidez. Ahora bien, si el proyecto es muy complicado sí que las uso.
1. Abrir formularios con VBA
Me parece fantástico que utilices macros para automatizar acciones. Es un recurso muy útil y para eso está. Pero si por casualidad quieres saber cómo se hace eso en VBA es muy fácil. Es así:
DoCmd.OpenForm "NombreFormulario", [tipodevista], [Filtro],[Condicion],[ModoDatos],...
Los argumentos que van entre corchetes son opcionales. Además, hay más argumentos, pero no vienen al caso. También, en el editor de VBA, a medida que vas escribiendo, sale el "chivato" que te va diciendo qué viene a continuación.
En pocas palabras, si, por ejemplo, tienes un formulario "Menu" donde hay un botón que diga "Abrir", al evento "Al abrir" de ese botón le escribes el siguiente código
DoCmd. OpenForm "Compras"
Y te abrirá ese formulario, donde podrás ver todos los registros. Si lo que quieres es abrirlo y que quede preparado para añadir un nuevo registro basta que escribas (ojo con las comas, que no te puedes dejar ninguna!):
DoCmd. OpenForm "Compras",,,, acFormAdd
Así, el código final para ese supuesto botón "Abrir" sería (en tu caso):
Private Sub cmdAbrir_Click()
DoCmd. OpenForm "Compras",,,, acFormAdd
DoCmd. OpenForm "Productos",,,, acFormAdd
'Esta línea es para que cierre el formulario "Menu" para evitar tener tantos abiertos DoCmd. Close acForm, "Menu"
End Sub
Y eso es todo
2. Convenciones de llamada
Como indica la palabra, son convenciones. Quizá puedas encontrarte a alguien que en vez de escribir "int" escriba "ent". Sólo para que lo tengas en cuenta.
Hasta donde yo sé, las convenciones más estándar son las siguientes (no incluyo las que ya sabes):
Variables
bln-Boolean / byt-Byte / dtm-Fecha/Hora, que viene a significar "Date Time" / dbl-Double / err-Error / lng-Long / obj-Objeto / sng-Single / var-Variant / prm-Parámetro / udt-Definido por el usuario
Controles
ado-Datos ADO / chk-Casilla de verificación / cbo-Cuadro combinado / lst-Cuadro de lista / cmd-Botón de comando / fra-Marco (frame) / grp-Grupo de Opciones / img-Imagen / lbl-Etiqueta (label) / opt-Botón de opción / txt-Cuadro de texto
Objetos
tbl-Tabla / qry-Consulta / frm-Formulario / rpt-Informe (Report) / mac-Macro / col-Colección / pty-Propiedad / pag-Páginas de acceso a datos
Probablemente me dejo alguna, pero supongo que si te la encuentras una búsqueda por Internet te dará la respuesta.
Como verás yo a veces las utilizo y a veces no. Si el código es muy simple a veces "paso" de escribirlas por temas de rapidez. Ahora bien, si el proyecto es muy complicado sí que las uso.
- Compartir respuesta
- Anónimo
ahora mismo