Condicion If, ElseIF con expresiones de ,+==

Tengo una cosulta, sucede que quiero establer unos parametros en subformulario, tengo una tabla de comisiones_tabulador cuyos campos son: Escala1, Escala2, Escala3, cada escala cuenta cuenta tambien con un tipo de producto, y según el monto facturado en el mes tomo una escala y le aplico a esa escala al tipo de producto. El porcentaje de ese producto segun la escala lo traigo en el Campo del Subuformulario llamado TABULADOR

Todo va bien hasta que quiero traer esos tipos de productos segun el monto facturado. Y el principal problema son las expresiones >=, <=, etc. Por ejemplo yo quiero que si el monto es mayor a 0 pero igual o menor 70.000 me aplique escala 1 y segun esa escala me traiga el tipo de producto que estoy tomando. Para hacer la operacion tengo un cuadro de texto que me trae la suma de lo facturado TEXTO35 y una casilla de verificacion SI/NO llamada CALCULAR y en el evento despues de actualizar coloco el siguiente codigo:

If Me.Texto35 > 200000 And Me.CALCULAR = True Then
Me.TABULADOR = DLookup("ESCALA4", "COMISIONES_TABULADOR", "TIPO_PRODUCTO=" & Nz(Me.TIPO_PRODUCTO, 0))

ElseIf Me.Texto35 = 200000 And Me.Texto35 > 140000 And Me.CALCULAR = True Then
Me.TABULADOR = DLookup("ESCALA3", "COMISIONES_TABULADOR", "TIPO_PRODUCTO=" & Nz(Me.TIPO_PRODUCTO, 0))

ElseIf Me.Texto35 = 140000 And Me.Texto35 > 70000 And Me.CALCULAR = True Then
Me.TABULADOR = DLookup("ESCALA2", "COMISIONES_TABULADOR", "TIPO_PRODUCTO=" & Nz(Me.TIPO_PRODUCTO, 0))

ElseIf Me.Texto35 <= 70000 And Me.CALCULAR = True Then
Me.TABULADOR = DLookup("ESCALA1", "COMISIONES_TABULADOR", "TIPO_PRODUCTO=" & Nz(Me.TIPO_PRODUCTO, 0))

ElseIf Me.CALCULAR = False Then
Me.TABULADOR = 0
End If
End Sub

Me funciona solo una parte de la expresion, cuando esta por encima de 200 mil y cuando esta por debajo de 70 mil, es decir solo la primera y ultima linea de codigo, por lo que supongo algo pasa con el <= y >=

2 Respuestas

Respuesta
1

También puede hacerlo mediante el uso de un diccionario, debe referenciar Microsoft Scripting Runtime

Private Sub Btn_0_Click()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    ' Definir las escalas y sus límites
    dict.Add 1, 70000   ' Escala 1 para monto <= 70000
    dict.Add 2, 140000  ' Escala 2 para monto <= 140000
    dict.Add 3, 200000  ' Escala 3 para monto <= 200000
    dict.Add 4, 2147483647 ' Escala 4 para monto > 200000 (usamos un valor grande para el límite superior)
    If Me.Calcular = False Then
        Me.Tabulador = 0
        Exit Sub
    End If
    Dim monto As Double
    monto = Me.Texto35
    Dim escalaIndex As Integer
    escalaIndex = 1
    ' Determinar el índice de la escala basado en el monto
    Dim key As Variant
    For Each key In dict.Keys
        If monto <= dict(key) Then
            escalaIndex = key
            Exit For
        End If
    Next key
    On Error Resume Next
    Me.Tabulador = DLookup("Escala" & escalaIndex, "COMISIONES_TABULADOR", "TIPO_PRODUCTO=" & Nz(Me.TIPO_PRODUCTO, 0))
    On Error GoTo 0
End Sub
Respuesta
1

Se puede acortar.

En un evento (en este caso un botón) y supongo que un Copy&Paste funcionara

Mi duda es si la referencia correcta es 70.000 o seria mas adecuada 69.999

Se recrea el nombre del campo en el DLookup basándonos en que un TRUE equivale a (-1) en Access y con ABS se obtiene el valor absoluto (en este caso un uno) y se suman las condiciones que cumple, la cifra obtenida se añade a la parte constante.

Nota: en tu expresión generas un problema al utilizar como parámetros en la misma condición (para obtener el intervalo) una igualdad, o es igual o no lo es ... lo adecuado:

Private Sub Btn_0_Click()
If Me.Calcular = False Then Me.Tabulador = 0: Exit Sub
Me.Tabulador = DLookup("Escala" & 1 + Abs(Me.Texto35 > 70000) + Abs(Me.Texto35 > 140000) + Abs(Me.Texto35 > 200000), "COMISIONES_TABULADOR", "TIPO_PRODUCTO=" & Nz(Me.TIPO_PRODUCTO, 0))
End Sub

Espero que te pueda ser útil, me he apercibido que el entorno es EXCEL y la respuesta esta dirigida a un entorno Access (pero el VBA es compatible)

¡Gracias! 

Me funcionó perfectamente, y si; tienes razón, cambie los montos a 69.999, 139.999 y 199.999

Buen día Enrique Feijóo, siguiendo con esto. El código que me enviaste me funciona muy bien . sim embargo esos datos. (69.999, 139.999, Y 199.999) Los tengo en una tabla llamada Tabulador, en un campo llamado MONTO. Como haría para anexar ese campo a tu código, de manera de llamarlos a través del campo. Y si en algún momento varían los, montos no tener que modificar el código sino solo colocar el numero monto en el campo.

Se sustituyen los referentes fijos ( en el ejemplo 7000, 14000 ...) por variables a las que se le asigna su valor con un DLookup.

Un ejemplo en el que se sustituye (en el ejemplo) la referencia [70000] por una variable:

'Original
Me.Tabulador = DLookup("Escala" & 1 + Abs(Me.Texto35 > 70000) + Abs(Me.Texto35 > 140000) + Abs(Me.Texto35 > 200000), "COMISIONES_TABULADOR", "TIPO_PRODUCTO=" & Nz(Me.TIPO_PRODUCTO, 0))
'Modificacion
Dim Variable_1 As Long, Variable_2 As Long ' .....
Variable_1 = DLookup("El-Campo", "De-la-tabla", "Que-cumpla-con....")
Variable_2 = DLookup("Otro-Campo", "De-la-tabla", "Que-cumpla-con....")
Me.Tabulador = DLookup("Escala" & 1 + Abs(Me.Texto35 > " & Variable_1 & ") + Abs(Me.Texto35 > 140000) + Abs(Me.Texto35 > 200000), "COMISIONES_TABULADOR", "TIPO_PRODUCTO=" & Nz(Me.TIPO_PRODUCTO, 0))

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas