Devolver el formulario en blanco después de una acción

Tengo un formulario que necesito que después de presionar el botón "descargar" me realice la orden que le asigné e inmediatamente me limpie el formulario para poder realizar otra descarga.

1 respuesta

Respuesta
1

No entiendo tu pregunta. ¿A qué te refieres con "descargar" y que te limpie el formulario? ¿El formulario es para introducir datos a una tabla o no?

En el formulario se teclea el código y carga todos los campos referentes a ese articulo, hay un textbox "Cantidad a Descargar" para descargar una cantidad de un articulo de inventario, el formulario realiza la descarga, es decir le resta a la cantidad existente la cantidad a descargar, lo que quiero es que al terminar con esto el formulario quede en blanco para poder teclear otro código y realizar otra descarga de otro articulo. Destacar que existe un textbox que no quiero que se limpie porque este es el usuario.

Ademas no se si me responde por esta pregunte o le hago otra también necesito que el formulario antes de descargar la cantidad verifique que esta es menor o igual al disponible, si es correcto no hay problema, pero si es mayor me mande un mensaje "Cantidad insuficiente" al darle aceptar me devuelva para corregir la cantidad.

Para la primera parte, puedes usar un bucle for como el de controlar que no te queden campos vacíos, que pondrías al final de tu código:

Dim ctl As Control
For Each ctl In Me.Controls
If ctl.ControlType = acTextBox Then
If ctl.Name = "Usuario" Then

Else
ctl.Value = vbNullString
End If
End If
Next ctl

Para que te controle si hay cantidades, suponiendo que el dato lo sacas del campo "disponible" de la tabla "inventario", pon antes del código que ya tienes:

Dim vCantidad as Long

Dim vDisponible as Long

vDisponible=DLookup("disponible","inventario","Criterio")

vCantidad=Me.[Cantidad a Descargar]

If vCantidad>vDisponible Then

Msgbox "Cantidad insuficiente", vbOkOnly

Me.[Cantidad a Descargar].SetFocus

Exit Sub

End If

Puntualizaciones:

1º/ En el primer código, he supuesto que tu campo "fijo", se llama Usuario, si no es así, tendrás que cambiarlo.

2º/ En el segundo, lo que está en negrita (Criterio), tienes que cambiarlo por un criterio que te identifique el producto que estás actualizando en la tabla inventario, por ejemplo, si en el formulario tienes un campo IDProducto, y en la tabla tienes el campo ID, ambos relacionados, tu criterio sería

"[ID]=" & Me.IDProducto -> si ID es numérico

"[ID]='" & Me.IDProducto & "'" -> Si es de texto

El código quedó de la siguiente forma:

Private Sub cmdDescargar_Click()
If Nz(TxtDescargar, 0) = 0 Then
MsgBox "No ha digitado ninguna cantidad para descargar de inventario"
Dim vCantidad As Long
Dim vDisponible As Long
vDisponible = DLookup("disponible", "inventario", "[ID]= & Me.ID1")
vCantidad = Me.[Cantidad a Descargar]
If vCantidad > vDisponible Then
MsgBox "Cantidad insuficiente", vbOKOnly
Me.[Cantidad a Descargar].SetFocus
Exit Sub
End If
TxtDescargar.SetFocus
Else
If MsgBox("Está seguro que la cantidad a descargar es correcta?", vbOKCancel + vbQuestion, "CONFIRMAR") = vbCancel Then Exit Sub
DISPONIBLE = DISPONIBLE - TxtDescargar
DISPONIBLE.Requery
DoCmd.SetWarnings False
DoCmd.RunSQL "Insert into BitacoraControl(CÓDIGO, DESCRIPCIÓN, DESCARGA, USUARIO, FECHA, HORA)values(Código, Descripción, TxtDescargar, NomUsuario, Auto_Date, Auto_Time)"
DoCmd.SetWarnings True
MsgBox "La cantidad se descargó correctamente"
End If
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.ControlType = acTextBox Then
If ctl.Name = "NomUsuario" Then
Else
ctl.Value = vbNullString
End If
End If
Next ctl
End Sub

En el primer código que me sugiere da un error "que no se puede asignar un valor a ese objeto" al darle Debug me señala esta linea:

ctl.Value = vbNullString

Y en el segundo código igualmente me permite descargar una cantidad mayor al disponible.

El error del primer código lo solucionas cambiando la linea que te da error (ctl.Value = vbNullString) por esta otra:

Me.Controls(ctl.Name) = vbNullString

Evidentemente te deja descargar más cantidad de la disponible, porque tu campo entiendo se llama TxtDescargar y no "Cantidad a Descargar". Tendrás que cambiarlo en las distintas partes del código (fíjate que yo no tengo tu BD para ver los nombres, y si dices: hay un textbox "Cantidad a Descargar", entiendo que es así como se llama el control).

Con estos dos cambios ya te debería ir perfecto.

Disculpas por lo de los nombres.

Hice las correcciones que mencionas y no logré que hiciera lo que necesito en ninguno de los 2 casos.

Que estará pasando?

¿Por qué no te funciona? ¿Te da algún error? ¿Cuál?

Para dejar en blanco los campos, puedes usar esta otra opción:

1.- Borra desde Dim ctl.. hasta Next ctl

2.- Pones, para cada cuadro que tengas en tu formulario que quieras "vaciar":

Me.txtdescargar=""

Me.descripción=""

...

Y así con todos (con los nombres que tu tengas, claro)

Para lo de las cantidades: ¿esto es correcto: DLookup("disponible", "inventario", "[ID]= & Me.ID1")? Es decir, tienes una tabla "Inventario", con un campo "disponible", en la tabla hay un campo "ID" que identifica al producto y en el formulario de descarga tienes un campo "ID1"? Porque a mí me da que no....y por eso no se ejecuta esa parte del código y te deja descargar mayor cantidad.

Me dices.

Estos son los nombres tal y como los tengo en la tabla.

Tabla: ID(Auto,llave principal), Codigo(Texto), Ubicacion(Texto), Descripcion(Texto), Comentarios(Memo), Disponible(Numero), RutaFoto(Texto)

Estos son los nombres tal y como están en el formulario.

Formulario: NomUsuario, ID1, Codigo1, Ubicacion1, Descripcion1, Disponible1, TxtDescargar, Comentarios1, Foto1

Así esta hasta ahora el código del botón cmdDescargar:

Private Sub cmdDescargar_Click()
If Nz(TxtDescargar, 0) = 0 Then
MsgBox "No ha digitado ninguna cantidad para descargar de inventario"
Dim vCantidad As Long
Dim vDisponible As Long
vDisponible = DLookup("Disponible", "INVENTARIO", "[ID] = & Me.ID1")
vCantidad = Me.[TxtDescargar]
If vCantidad > vDisponible Then
MsgBox "Cantidad insuficiente", vbOKOnly
Me.[TxtDescargar].SetFocus
Exit Sub
End If
TxtDescargar.SetFocus
Else
If MsgBox("Está seguro que la cantidad a descargar es correcta?", vbOKCancel + vbQuestion, "CONFIRMAR") = vbCancel Then Exit Sub
DISPONIBLE = Disponible1 - TxtDescargar
Disponible1.Requery
DoCmd.SetWarnings False
DoCmd.RunSQL "Insert into BitacoraControl(CÓDIGO, DESCRIPCIÓN, DESCARGA, USUARIO, FECHA, HORA)values(Codigo1, Descripcion1, TxtDescargar, NomUsuario, Auto_Date, Auto_Time)"
DoCmd.SetWarnings True
MsgBox "La cantidad se descargó correctamente"
End If
Me.ID1 = ""
Me.Codigo1 = ""
Me.Descripcion1 = ""
Me.Ubicacion1 = ""
Me.Disponible1 = ""
Me.TxtDescargar = ""
Me.Comentarios1 = ""

Me.Foto1 = ""
End Sub

Ademas de lo mencionado arriba tiene otro botón BotBuscarArticulo

Cual es el procedimiento de este formulario, inicialmente esta todos los campos bloqueados excepto Codigo1 y TxtDescargar, ademas de que al cargar formulario me aparece usuario cargado, ahora, si me sé el código de artículo lo dígito y al darle enter me carga los datos referentes a ese artículo para descargar una cantidad (CLARO, recién me doy cuenta que al digitar el código manualmente me actualiza los datos pero en ID1 me crea un DI nuevo y no se actualiza al correspondiente de ese articulo, otro error que tengo que corregir), por otra parte está el BotBuscarArticulo que me carga un articulo pero con un formulario buscador (ese si esta bien, carga todo) el el procedimiento de cantidad para descargar y se le da al botón cmdDescargar

Aun no me limita si voy a descargar una cantidad mayor al disponible. Avanza en el código hasta que llega a la linea:

Me.ID1 = ""

Y da el siguiente error:

run-time error '-247352567 (80020009)': No se puede asignar un valor a este objeto.

Si gusta le podría enviar la base por correo para que lo pueda observar mas fácilmente.

Vale, aquí vamos de nuevo:

El problema de descargar los cuadros parece el siguiente: tu formulario está basado sobre una tabla o consulta, y/o el campo ID1 está basado sobre un campos de esa tabla o consulta. Si te fijas, en vista diseño, dentro del cuadro ID1 te tendría que aparecer "Independiente", y a mí me da que te aparece ID1 o ID o algo así. Si le borras el origen de control a ese campo, ya te debería funcionar esa parte del código.

Prueba tb a poner, en vez de: ="" esto otro: =Null

Para la primera parte, vamos cambiar el enfoque: si dices que Codigo1, Ubicacion1, Descripcion1, Disponible1, Comentarios1 y Foto1 te los carga al teclear un código en ID1, supongo que buscnadolos en una tabla, haz este cambio:

vDisponible=Val(Me.Disponible1)

vCantidad=Val(Me.TxtDescargar)

Te voy poner el código entero, porque veo que lo tienes todo embarullado:

Private Sub cmdDescargar_Click()

Dim vCantidad As Long
Dim vDisponible As Long

Dim ctl As Control

If Nz(TxtDescargar, 0) = 0 Then
MsgBox "No ha digitado ninguna cantidad para descargar de inventario"

TxtDescargar.SetFocus

Exit Sub
End If
vDisponible=Val(Me.Disponible1)
vCantidad=Val(Me.TxtDescargar)
If vCantidad > vDisponible Then
MsgBox "Cantidad insuficiente", vbOKOnly
Me.[Cantidad a Descargar].SetFocus
Exit Sub
End If
If MsgBox("Está seguro que la cantidad a descargar es correcta?", vbOKCancel + vbQuestion, "CONFIRMAR") = vbCancel Then Exit Sub
DISPONIBLE = DISPONIBLE - TxtDescargar
DISPONIBLE.Requery
DoCmd.SetWarnings False
DoCmd. RunSQL "Insert into BitacoraControl(CÓDIGO, DESCRIPCIÓN, DESCARGA, USUARIO, FECHA, HORA)values(Código, Descripción, TxtDescargar, NomUsuario, Auto_Date, Auto_Time)"
DoCmd.SetWarnings True
MsgBox "La cantidad se descargó correctamente"
End If
For Each ctl In Me.Controls
If ctl.ControlType = acTextBox Then
If ctl.Name = "NomUsuario" Then
Else
Me.Controls(ctl.Name)=Null
End If
End If
Next ctl
End Sub

La parte en negrita no entiendo lo que hace, asi que no sé si está bien o no...

Gracias tanto poner el formulario en blanco como hacer la verificación que no sea una cantidad mayor funciona perfectamente.

Lo que está en negrita en su respuesta es que me descuenta del disponible la cantidad a descargar y me actualiza el resultado para poder verlo.

Gracias de nuevo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas