Validaciones de montos en un formulario

Tengo un formulario en la tengo un monto de un cliente como el dinero que tiene disponible el cliente, y tengo un subformulario con productos y cada producto tiene montos distintos, lo que quiero es validar que cada vez que se registre un monto de un producto se descuente del monto disponible del cliente, y que si este se excede envíe un mensaje de que el monto del producto excede el monto disponible del cliente, ambos campos de monto son campos de texto, y al momento de registrar un producto lo hago presionando el botón quizás allí deba ejecutarse dicha validación o al momento que pierda el foco del campo de monto producto.

1 respuesta

Respuesta
1

Lo primero que me llama la atención es que los campos que uses para los 'montos' (supongo que te refieres a cantidades monetarias) sean de tipo texto. Supongo que quieres decir que son cuadros de texto y no estas hablando del tipo de datos, ya que para cálculos con dinero es mejor definir el tipo de datos como numérico simple o doble (dependiendo de la precisión requerida) o como moneda.

Por otra parte yo pondría el código en el evento click del botón, ya que dices que lo usas para guardar el registro del producto. Si lo usas al perder enfoque puede que simplemente hagas click en otro sitio y sin quererlo ejecutes el código (imagina que tienes más campos en el subformulario y que pasas el enfoque a otro campo, ya habrías modificado el monto del cliente cuando a lo mejor te faltan otros datos y no quieres guardarlo aun...).

Para quitar el monto del cliente puedes hacer varias cosas. Si en el formulario principal tienes el registro del cliente y el campo monto del mismo, lo más sencillo es que en el código del botón del subformulario hagas la resta. Puede ser algo así como:

Parent!CampoDeMontoDelCliente.Value = Parent!CampoDeMontoDelCliente.Value - Me.CampoPrecioDelProductoADescontar.

Es decir, le dices que al valor del campo monto del cliente le reste el valor del precio del producto.

SI quieres comprobar si tiene bastante dinero puedes añadir antes la verificación de si esta resta da valor positivo o negativo. Si da positivo dejas que se ejecute la resta y si da negativo (no tiene bastante dinero) puedes en mantener el enfoque en el botón o en otro campo hasta que decidas que hacer con el registro.

If  Parent!CampoDeMontoDelCliente.Value - Me.CampoPrecioDelProductoADescontar < 0 then

'mantener enfoque en subformulario sin guardar registro o ....

Else

'hacer la resta indicada

end if

Como casi siempre puedes usar recordsets para actualizar registros (el registro del cliente activo, su monto disponoble...) pero en este caso si lo tienes todo en pantalla te será más fácil hacerlo como te comento.

Cordiales saludos.

Gracias por responder, si son campos numéricos ya me hace la resta pero me deja el campo con saldo negativo, necesito que el campo de monto de productos no supere el campo de monto cliente, luego del then no se que colocar.! Gracias por la ayuda y paciencia.

Disculpa la demora en responderte. La vida es corta y compleja :)

La validación que pretendes se hace de un modo u otro dependiendo de donde estén los campos a comparar, el botón...(en el mismo formulario u otro sitio). Te escribo código que comparar si importe de un campo llamado MontoARestar es mayor que un campo llamado SaldoCliente.

Option Compare Database
Option Explicit
Dim ValorValidoInferiorASaldo As Boolean

En el evento BeforeUpdate del campo del importe a restar asocias un código como el siguiente:

Private Sub MontoARestar_BeforeUpdate(Cancel As Integer)
On Error GoTo Err_MontoARestar_BeforeUpdate
    If Me!MontoARestar > Me!SaldoCliente Then
        ValorValidoInferiorASaldo= False
    Else
        ValorValidoInferiorASaldo= True
    End If
Exit_MontoARestar_BeforeUpdate:
    Exit Sub
Err_MontoARestar_BeforeUpdate:
    MsgBox Err.Description
    Resume Exit_MontoARestar_BeforeUpdate
End Sub

Este evento comprueba si el cliente tiene saldo suficiente. En caso de no tenerlo establece el valor de la variable ValorValidoInferiorASaldo a False y de tenerlo en True.

Este valor se usará en el código siguiente que asocias al eventoAfterUpdate del mismo control MontoARestar.

Private Sub MontoARestar_AfterUpdate()
On Error GoTo Err_MontoARestar_AfterUpdate
    If ValorValidoInferiorASaldo= False Then
        Dim msg As String, title As String, estilo
        estilo = vbOKOnly + vbCritical
        title = "Control de monto"
        msg = "No es posible registrar un monto superior al saldo del cliente."
        msg = msg & vbLf & vbCrLf & "Intoduzca un nuevo monto inferior."
        MsgBox msg, estilo, title
        Me!MontoArestar = Null
        Me!XXX.SetFocus
        Me!MontoArestar.SetFocus
    Else
        'Aquí dejamos guardar el valor del campo MontoARestar...
    End If
Exit_MontoARestar_AfterUpdate:
    Exit Sub
Err_MontoARestar_AfterUpdate:
    MsgBox Err.Description
    Resume Exit_MontoARestar_AfterUpdate
End Sub

Aquí si ValorValidoInferiorASaldo es False avisamos, establecemos el valor a nulo y tras enviar el enfoque a cualquier otro campo del subformulario (cambia XXX por el nombre de otro campo) lo enviamos de nuevo al campo MontoARestar.

Esto completado con la acción que hace el botón (restar de SaldoCliente el MontoARestar) que se ejecuta si ValorValidoInferiorASaldo es True debiera de completar tu validación.

En tu caso por lo que veo al releerme tu comentario debes de hacer lo mismo con monto productos y monto cliente.

Repito que depende de como lo tengas diseñado tendrás que modificar algo el código. SI sigues con problemas detalla un poco mas como son los objetos que usas.

Cordiales saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas