Se me desactiva el Bloqueo Numérico al actualizar registros en Access

Para que me mostrase más líneas de registros en el subformulario que tengo en el formulario 03-TPV Facturacion, tuve que poner en VBA en el subformulario que me actualizase los registros después de insertar. Pero claro, esto me daba el problema de que no me desplegaba donde escojo los artículos (CboArticulo). Para solucionar esto, utilicé la función SendKeys("+{TAB}"), y de aquí me viene el que se desactive el bloqueo numérico.

Al final, ha quedado esto:

Private Sub Form_AfterInsert()
    Me. Requery
    DoCmd. GoToRecord,, acNewRec
    Me. Cantidad. SetFocus
    Me. CboArticulo. SetFocus
    SendKeys ("+{TAB}")
    SendKeys ("{TAB}")
End Sub

Entonces, resumiendo, lo que me quiero es que me muestre más de una línea de registros y que me despliegue el listado de artículos, pero no sé cómo arreglarlo.

A ver si alguien tiene alguna sugerencia.

Os dejo la base de datos para que sepáis de qué hablo.

https://www.dropbox.com/s/k94xicvi3bkb0co/Tienda%20BD.accdb?dl=0 

1 respuesta

Respuesta
1

Diego: No he mirado tu BD, pero si lo que quieres es que te abra el desplegable CboArticulo, después del Set Focus, simplemente ponle >> Me. CboArticulo. DropDown o bien >> Me! CboArticulo. DropDown

El método SendKeys lo he usado unas cuantas veces y si no es el problema de teclado es otro, pero casi siempre he tenido problemas y no lo uso. Un saludo >> Jacinto

Buenas, Jacinto. Gracias por responder. Así hago para abrir el desplegable. Pero eso tiene un problema: solo me muestra una línea de registro, no dos (la que estoy editando y una nueva). Y eso es lo que quiero arreglar.

De acuerdo Diego: Le daré una mirada a la que tenga un momento, porque ando un poco apurado de tiempo. Un saludo >> Jacinto

Me he bajado tu BD y al mirar el Formulario y SubForm, he reparado en que ya te dí una solución para esa anomalía, pero ignoro si es que no se adapta a lo que quieres. A mi me pareció buena pero has de ser tu el que se encuentre confortable con ella.

La verdad es que dedicándole tiempo seguro que habrá otras soluciones, entre ellas la de Activar el teclado numérico desde ese procedimiento.

Partiendo de lo que te comentaba, en lo referente a mi enemistad con el SendKeys, si tu te encuentras cómodo usándolo, prueba con el código que hay en éste enlace (Activar/Desactivar Teclado Numérico). Por supuesto que yo no lo he probado.

http://www.abcdatos.com/trucos/truco/l3892.html 

Aquí tienes otro de Microsoft

https://answers.microsoft.com/es-es/office/forum/office_xp-excel/activar-y-desactivar-teclado-numerico-funcion/df60e9fe-773b-4aea-8b6c-b2d9cd13f38d 

Y supongo que habrá bastantes más

Está hecho para Visual Basic, pero por lo que he visto parece compatible con VBA.

El fichero de la solución que aporté:

http://www.mediafire.com/file/70w3zf7cybnxal6/TiendaBDEjemplo201805071613.accdb 

Un saludo >> Jacinto

A ver, me explico. Con respecto a la respuesta que me diste tú, está genial, y me ayudó bastante. Era lo que quería. Pero trajo consigo un problema. Lo tienes en la imagen:

Entonces, para que me muestre la segunda línea (un nuevo registro), sin tener que hacerlo manualmente, utilizo el código:

Private Sub Form_AfterInsert()
    Me. Requery
    DoCmd. GoToRecord,, acNewRec

Sin embargo, al hacer eso, no me funciona el código para desplegar CboArticulo, es decir, este:

Private Sub CboArticulo_GotFocus()
Me!CboArticulo.Dropdown
End Sub

Para conseguir que funcionara, pregunté aquí, y me propusieron añadir la función SendKeys, quedando el código:

Private Sub Form_AfterInsert()
    Me. Requery
    DoCmd. GoToRecord,, acNewRec
    Me. Cantidad. SetFocus
    Me. CboArticulo. SetFocus
    SendKeys ("+{TAB}")
    SendKeys ("{TAB}")
End Sub

Así las cosas, quiero que me muestre esa segunda línea, y que, al poner el foco en CboArticulo, me lo despliegue. Me da igual que sea SendKeys. Lo que quiero conseguir es lo que te he dicho

¿Me entiendes?

¡Mil gracias!

Te dejo un vídeo de lo que hace.

https://www.dropbox.com/s/9en4uffivj4vox7/V%C3%ADdeo.avi?dl=0 

¿Ves cómo solo aparece una línea de registro, y como, después de rellenarla, "se oculta"?

¿Cómo puedo arreglar eso?

¡Gracias!

Ese comportamiento es cuando comento este código:

Private Sub Form_AfterInsert()
    Me. Requery
    DoCmd. GoToRecord,, acNewRec
    Me. Cantidad. SetFocus
    Me. CboArticulo. SetFocus
    SendKeys ("+{TAB}")
    SendKeys ("{TAB}")
End Sub

Diego: Partiendo de la base de que no entiendo que ese formulario, no abra un nuevo registro al inserter uno, ya que por omisión un Formulario continuo ya lo hace, he hecho una prueba que a mi me ha funcionado en 2 o 3 registros que he insertado.

Te facilito el enlace de Mediafire.

http://www.mediafire.com/file/kvt8dtu2mkj7l7l/TiendaBDEjemplo201805071613.rar 

El combo se desplega sin ponerle DrpDown. Un saludo >> Jacinto

El archivo está corrupto. A ver si puedes mandarlo de nuevo. ¡Gracias!

Diego: Ahora la he subido sin compactar. Espero no tengas problemAS.

http://www.mediafire.com/file/qobfi6dpgxp7886/TiendaBDEjemplo201805182003.accdb 

Ya me contarás si te va bien. Un saludo >> Jacinto

Me lo he podido descargar sin problemas.

Dos preguntas:

1. Sobre este código:

Private Sub CboArticulo_AfterUpdate()
Me.SKU = Me.CboArticulo.Column(2)
[PVP] = [PVPR]
Me.Requery
Me.CboArticulo.Value = ""
DoCmd.GoToRecord , , acNewRec
End Sub

Cuando actualizo CboArticulo, me lleva al siguiente CboArticulo, cuando me debería llevar al textbox Cantidad. Ojo, que he intentado poner Me.Cantidad.SetFocus en vez de la línea de nuevo registro, y me salta siempre al textbox de cantidad del primer registro, no al del registro por el que voy.

2. He visto que siempre quitas lo de maximizar. ¿Por qué? Esto es una curiosidad, nada más.

¡Gracias!

Diego: Ese código lo que hace es llevar la acción a un nuevo registro, poniendo antes el CboArticulo en blanco, y como tu tienes ya programado que al recibir el foco muestre el combo desplegado, por eso no lo pongo yo.

Si lo que quieres es que primero se vaya a la cantidad, cosa que veo normal que así sea hay alguna línea que has de cambiar al Evento AfterUpdate de la Cantidad. Eso que te he enviado, solo era para que vieras como forzar el Nuevo Registro y que el desplegable se mostraba.

Para pasar primero por la Cantidad los eventos y el Código te quedaría así.

Esto que sigue Borrado

'Private Sub Form_AfterInsert()
'    Me.Requery
'    DoCmd.GoToRecord , , acNewRec
'    Me.Cantidad.SetFocus
'    Me.CboArticulo.SetFocus
'    SendKeys ("+{TAB}")
'    SendKeys ("{TAB}")
'End Sub

El AfterUpdate del Combo >>

Private Sub CboArticulo_AfterUpdate()
Me.SKU = Me.CboArticulo.Column(2)
[PVP] = [PVPR]
Me.Cantidad.SetFocus
'Me.Requery
'Me.CboArticulo.Value = ""
'DoCmd.GoToRecord , , acNewRec
End Sub

Las líneas con la comilla son las que había y las puedes borrar.

El AfterUpdate del TextBox Cantidad >>

Private Sub Cantidad_AfterUpdate()
Me.Requery
Me.CboArticulo.Value = ""
DoCmd.GoToRecord , , acNewRec
End Sub

La egunda cuestión del motivo por el que no maximizo los formularios, solo es una manía personal, y no está respaldada por alguna razón técnica.

Me alegraría que al final puedas resolver ese tema. Un saludo >> Jacinto

Vale, ya pillo el tema. Claro, yo quiero que vaya pasando por cada uno de los campos del registro en cuestión. Cantidad -> Descuento -> PVP -> Importe -> Intranet.

Entonces, tengo que poner el código de Cantidad que me has pasado, salvo la línea de nuevo registro, que iría en Intranet.

En cuanto a maximizar, pues yo tengo la manía de maximizar todo.

Mañana lo hago y te comento el resultado.

Más ganas tengo de que esté resuelto, porque vaya tela.

Muchas gracias por estar ahí.

Diego: En el Evento After Update de la cantidad solo has de poner el enfoque en el control al que quieres ir. Si el último control es el de la Intranet, me temo que lo vas a tener complicado, porque según yo lo veo ahí no tendrás AfterUpdate.

Un saludo >> Jacinto

Ostras, pues es verdad, no había pensado. Pues lo veré a ver qué solución puedo darle. Ahora no estoy para pensar, la verdad.

Gracias.

Buenos días, Jacinto. He estado probando cosas. Lo primero que he hecho ha sido quitar del orden de tabulación tanto ImpTotal como Intranet, porque no tienen sentido que estén habilitados en ese formulario (esto es cosa mía, de funcionamiento de la tienda, nada más). Aparte, he organizado el código para verlo todo más fácil.

Tal y como está ahora, veo un problema:

Cuando estoy en PVP, tanto si introduzco un valor, como si no hago nada y presiono TAB, no me muestra las líneas de registro antiguas en la pantalla (tal y como viste en el vídeo). Esto no funciona, obviamente, porque no hay un código metido. He probado poniendo el que tú me distes cuando se entra en el campo, pero tampoco funciona. No puedo poner después de actualizar, pues hay veces que no me interesa cambiar ese campo.

Ahora mismo, el funcionamiento de los campos CboArticulo, Cantidad y Descuento es el que quiero. El problema radica, como te he dicho, en el campo PVP.

A ver si me puedes orientar con alguna solución.

Muchas gracias, y disculpa la insistencia.

P.D.: no me quites lo de maximizar las ventanas. ¡Gracias!

Diego: Prueba programando el Evendo Al perder el enfoque del campo PVP.

En cualquier caso y pensando lógicamente que debes tener tus razones para hacer ese proceso tan personalizado. No sé si has visto la BD antigua de Microsoft Neptuno, en la que hay un proceso de Pedidos de Clientes, muy Estandar. Un saludo >> Jacinto

Ya lo he resuelto. He utilizado este código:

' ARREGLAR EL PROBLEMA DE LA LÍNEA DE REGISTRO Y DESPLEGAR CBOARTICULO
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Sub pulsoNUMLOCK()
    If GetKeyState(vbKeyNumlock) = 1 Then
        SendKeys "{NUMLOCK}", True
    End If
End Sub
Private Sub CboArticulo_AfterUpdate()
    Me.SKU = Me.CboArticulo.Column(2)
    [PVP] = [PVPR]
    Me.CboArticulo.Value = ""
    pulsoNUMLOCK
End Sub
Private Sub CboArticulo_GotFocus()
Me!CboArticulo.Dropdown
End Sub
Private Sub Form_AfterInsert()
    Me.Requery
    DoCmd.GoToRecord , , acNewRec
    DoCmd.GoToRecord , , acPrevious
    DoCmd.GoToRecord , , acNewRec
    Me.Cantidad.SetFocus
    Me.CboArticulo.SetFocus
    SendKeys ("{TAB}")
    If Nz(Me.Cantidad.Value, "") <> "" Then Me.Cantidad.Value = 1: Me.Cantidad.Value = 0
    SendKeys ("+{TAB}")
End Sub

Muchas gracias, Jacinto, por estar ahí. Un saludo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas