¿Cómo actualizar el subformulario para que nos dé el próximo número de pedido en el Subformulario?

Esta fórmula incremental, aconsejada en vuestra página, en lugar de un campo autonumérico funciona perfectamente; pero ¿qué ocurre si tenemos el Subformulario incrustado en un Formulario?

=DMáx("[Compras]![CodPedido] ";"Compras")+1
Por ejemplo, Formulario principal "Proveedores", subformulario "Compras" incrustado en Proveedores. El campo en cuestión "CodPedido", con la formula descrita en la Hoja de propiedades Datos, Valor predeterminado =DMáx("[Compras]![CodPedido] ";"Compras")+1

El titulo GESTIÓN DE COMPRAS presenta al abrirlo ambos formularios: Proveedores y Compras

Lo que se pretende es añadir, de una vez, varias facturas de compra del Proveedor.

¿Qué ocurre?

Al seleccionar un proveedor se puede añadir la información, editar en el subformulario la línea que estará numerada correctamente con el próximo numero correspondiente. El problema surge cuando entras en dicha línea. Inmediatamente se abre una nueva línea lista para si quieres seguir añadiendo pedidos o facturas.

PERO aquí en esta nueva línea que espera para ser editada después de que salgamos de la actual, APARECE el numero SIN INCREMENTO, es el mismo.
¿Cómo actualizar el subformulario para que nos de el próximo numero de pedido en el Subformulario "COMPRAS" sin abandonar al Proveedor?

1

1 Respuesta

816.600 pts. No responderé preguntas de usuarios que no valoren las...

MI recomendación es que te olvides de usar el valor predeterminado y generes el número por código al entrar en la linea nueva de compras.

La cosa iría así:

1º/ Abres el formulario "Compras" en vista diseño y sacas sus propiedades.

2º/ Vas a la pestaña "Eventos" y localizas "Al activar registro" (es la primera que aparece). Al situar el cursor sobre ella, verás a la derecha un botón con 3 puntos. Lo pulsas y eliges "generador de código".

3º/ En el editor de VBA que se te abrirá, entre las lineas Private Form_Current() y End Sub, escribes lo siguiente:

If Nz(Me.CodPedido, -1) = -1 Then Me.CodPedido = Nz(DMax("[CodPedido]", "TCompras"),0) + 1

Guardas y listo. La nueva línea que antes te aparecía con el número repetido te saldrá en blanco, pero al posicionarte sobre ella, te generará el número correspondiente.

Un saludo.


Muchas gracias por tu respuesta tan rápida. 

He seguido los pasos indicados:

1º. Olvidarme de la formula, eliminándola,  colocada en en la Hoja de propiedades Datos, Valor predeterminado =DMáx("[Compras]![CodPedido] ";"Compras")+1 ------ que se refería al registro "CodPedido" en el formulario.

2º. Tu formula de evento creí entender afectaría al formulario al entrar en él. Buscaría el campo y añadiría el incremento.

 No funciona.
error "3078" el motor no puede encontrar la tabla o consulta de entrada "CodPedido".
Pero resulta que el nombre de la tabla es correcto.
Si antes funcionaba la formula de incremento  en las propiedades del campo CodPedido, y no se ha variado el nombre de la tabla, ignoro por qué da error.
Tal como escribiste el código me dio error,  no recocía "TCompras". Elimine la T y probé. De nuevo saltó el Error.
La parte de código donde se intruia: que aumentara en uno el último registro  Nz(DMax("[CodPedido]", "TCompras"),0) + 1
Por lógica debía estar primero el Dominio: La tabla Compras y después el campo CodPedido:

 Nz(DMax("Compras", "[CodPedido]" ),0) + 1 

No calcula el aumento; aparece en blanco y al escribir algo en él segue en blanco añadiendo otra linea en blanco.  

Sigue dando el mismo error. 

Para probar de nuevo tu código se me ocurrió modifica:  If Nz(Me.CodPedido, -1) = -1 Then Me.CodPedido = Nz(DMax("[CodPedido]", "TCompras"),0) + 1

por este otro:   If Nz(Me.CodPedido, -1) = -1 Then Me.CodPedido = Nz(DMáx("[Compras]![CodPedido] ";"Compras"),0) + 1

Ejecuté y llega una advertencia "Está a punto de eliminar un registro". 

Encontró la tabla pero no me gusto la respuesta.

¿Cómo arreglar el código para que dé lo que se pretende? Que al abrir Gestión Compras con sus dos formularios: principal Proveedores y el incrustado Compras aparezca ya éste con su número correspondiente y que al trabajar es ese registro no nos dé el mismo número sino que lo aumente el número de la próxima entrada. Esa es la cuestión.

este ejemplo, que es lo que creo que quieres por tu pregunta inicial: http://filebig.net/files/E6DKM4zRgx

Como verás el código es el que te di en mi respuesta anterior y funciona perfectamente: al meter una nueva compra, genera automáticamente el CodCompra correspondiente y además, no sale en la linea en blanco el CodCompra repetido.

SOBRE SU BASE DE DATOS. Perfecto funciona.

Al abrir la base de datos enviada, emerge una ventana de información:
" En la base de datos o proyecto de Microsof Access falta una referencia al archivo "MSOUTL.OLB" versión 9.3. o la referencia es errónea.
* Para asegurarse de que la base de datos o el proyecto funcionan correctamente, debe corregir arreglar la referencia
Botón Mostrar Ayuda>> y botón aceptar

Presionamos aceptar y se repite la misma información.
item
y así un monton de veces.
Al fin se habre con el acompañamiento de una serie de ventanas fugaces que no es posible contar.
Una vez que se habilita el contenido

Nos posicionamos en el FCompras para ver el procedimiento. Al pinchar en los tres puntos vuelve a aparecer la misma advertencia de que falta el archivo "MSOUTL.OLB" versión 9.3. o la referencia es errónea.
Pinchas aceptando y en la ventana que se abre, el código se ve. A primera vista parece ser el mismo que se envió en la primera respuesta. Pero comparándolos encuentro una diferencia

If Nz(Me.CodPedido, -1) = -1 Then Me.CodPedido = Nz(DMax("[CodPedido]", "TCompras"),0) + 1

Private Sub Form_Current()
If Nz(Me.CodPedido, -1) = -1 Then Me.CodPedido = DMax("[CodPedido]", "TCompras") + 1
End Sub

En la base de datos mandada funciona correctamente, tal como está construida.

Pongo el código en el formulario Compras de mi base dedatos.

If Nz(Me.CodPedido, -1) = -1 Then Me.CodPedido = DMax("[CodPedido]", "Compras") + 1

Para probarla busco el Formulario GESTION DE COMPRAS. Pincho par abrirlo y me anticipa esta advertencia:

"La expresión "Al activar registro" que ha especificado como valor de la propiedad de evento produjo el error El procedimiento externo no es válido.

* La expresión no da como resultado el nombre de una macro, de una función definida por el usuario o [Procedimiento de evento].
* Hubo un error al evaluar la función, evento o macro.

Y la ayuda dice:
Este error se produce cuando un evento no se ha podido ejecutar debido a que no se puede evaluar la ubicación de la lógica del evento. Por ejemplo, si la propiedad OnOpen de un formulario se establece en =[Campo], este error se produce porque se espera que se ejecute un nombre de evento o macro al producirse el evento.

Diferencias entre su formulario y el mio.
En mi base de datos:
El formulario Principal Provedores Tiene un cuadro combinado que selecciona un proveedor y rellena los datos completos en todos sus campos del formulario o podemos habilitar uno nuevo.

Al estar vinculado de uno a varios con el subformulario Compras, también en éste, rellena los campos combinados de éste: nombre de proveedor y otro campo más...

Cualquier variación que se haga en el campo principal de Proveedores repercute en el subformulario.
En su base de datos:
El formulario Proveedores es estatico, invariable con una sola entrada. No se rrelena ni se actualiza.
El subformulario TCompras es quien parece tener la batuta. Seleccionas el cuadro de lista colocado en el campo y actualiza, cierto.

En el suyo funciona el codigo en el subformulario. Parece ser que aún no se habria rrelenado con la selección de la lista.

En el mio no funciona el código. Encuentro el numero de pedido en blanco pero el nombre proveedor relleno por efecto de la combinación de campos en ambos formularios. Todos los registros que se puedan ir poniendo sale en blanco el número de pedido... con la consabida cantinela de error en cada una de las entradas.

¿Qué debería hacer?

Olvidaba otra diferencia. En su base de datos El proveedor no reúne todas sus compras.  Cada registro puede ser de diferente proveedor.  La selección de su lista elige el proveedor para cada registro. 

Mientras que en mi formulario el Proveedor reúne solamente sus pedidos tantos cuantos tenga. No se mezclan los pedidos de otros proveedores.

Sobre el error de referencias, fallo mío: tengo una BD en la que voy haciendo mis pruebas para respuestas de este foro, y luego simplemente copio los elementos necesarios a una BD nueva para enviar los ejemplos. Es posible que haya activado alguna librería y me copiara también las referencias. Para solucionar ese error, en el editor de VBA, vete a Herrramientas->Referencias y desmarca aquellas que empiecen por FALTA.

Sobre la diferencia de códigos, en mi ejemplo usé la función Nz() para asegurar que al empezar a rellenar datos de cero, no me provocará ningún error el cálculo. En tu caso, como entiendo que ya tienes datos, siempre va a devolver un valor la función DMáx() y no tendrías ese problema.

El error que te da en "al activar registro", seguramente tenga que ver con lo de las referencias faltantes. Si no es así, tendrás que revisar que usas los nombres de campos y controles correctos.

El código lo que hace es que al ponerte en un registro del subformulario, mira si el campo CodPedido tiene o no valor. En caso de que no lo tenga, busca el valor máximo de ese campo en la tabla, le suma 1 y lo coloca en el campo CodPedido del registro activo.

Lo que comentas en tu última respuesta no es del todo cierto: sí es cierto que puedes cambiar el proveedor (lo que te envié no deja de ser un ejemplo preparado en dos minutos a lo rápido para que vieras el código en funcionamiento), pero al cambiar el proveedor, si actualizas el formulario, cambias de registro en el formulario principal o lo cierras, verás que al volver al proveedor solo te mostrará sus registros, y nunca se mezclan los pedidos de unos con otros (el subformulario solo nuestra los pedidos del proveedor). Y si no me crees, haz la prueba, ya verás.

Por último, me tienes un poco perdido con tus explicaciones. Si quieres envíame una copia de tu BD con las dos tablas y formularios que intervienen en tu problema, y con un par de datos inventados si no quieres enviar los reales, y te la devuelvo con el código funcionando.

Te doy las gracias y admiro tu bondad y buen hacer. 

Aquí te dejo la base de Datos como me comentaste

https://drive.google.com/open?id=1sO0u-Vs_lv9MiDF4LADfeECKc7tIWggl 

Saludos

¡Gracias! Decir gracias es poco. Muchísimas pero que muchísimas gracias le da un viejo de 82 años.

Un fuerte abrazo

Saludos

Como no he visto reflejarse las ¡Gracias! que te mereces, vuelvo a repetir: ¡Muchísimas gracias! te da un anciano de 82 años.

Un fuerte abrazo.

Todo solucionado.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas