** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Establecer valor en base a criterios
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoEstablecer valor en base a criterios

 Responder Responder
Autor
Mensaje
Dany Solis Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 23/Octubre/2010
Localización: Cd. Juarez Méx
Estado: Sin conexión
Puntos: 912
Enlace directo a este mensaje Tema: Establecer valor en base a criterios
    Enviado: 29/Octubre/2020 a las 23:34
Buenas tardes noches a todos,

Tengo la siguiente función que en su momento me fue proporcionada en este foro y va de maravilla, el problema que se me presenta ahora es que necesito obtener los valores de medida en base a lo que el usuario tenga declarado en una tabla, algo así:

Función:

Function RT_Clase1(Tipo1 As String, Medida1 As Variant) As Long

    If IsNull(Medida1) Then RT_Clase1 = 0: Exit Function
    '
    If Tipo1 = "Completo" Then RT_Clase1 = 0: Exit Function
    '
    If Tipo1 = "Segmentado" Then RT_Clase1 = 0: Exit Function
    
    If Medida1 > 1 Then
        RT_Clase1 = 3
      ElseIf Medida1 >= 10 Then
        RT_Clase1 = 5
      ElseIf Medida1 >= 15 Then
        RT_Clase1 = 8
      Else
        RT_Clase1 = 0
    End If
   
End Function

Tabla:
https://ibb.co/4KKwb5K

Alguna idea, para obtener los mismos resultados pero ahora basados en el valor de la tabla?

Saludos

DS

Donde hay educación, no hay distinction de clases. (Confusio)

Dany Solis
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Enviado: 30/Octubre/2020 a las 00:33
A lo mejor es la hora pero esa función que has puesto, cuando Tipo1 no es ni "Completo" ni "Segmentado", creo que solo devolverá 3 o 0. Si el valor de Medida1 supera 1, tomará valor 3, si no supera 1 no superara ni 10 ni 15 por lo que nunca deberia entrar en los ElseIf y solo entraría en el Else final (o sea, 0)

Lo que yo haría seria buscar el primer registro de la tabla dónde LongMin fuera > que Medida1 y recuperaría el valor de desfase. Lo haría con un recordset ya que DFirst no me devuelve el valor esperado. Sería tomando un solo valor que estuviera por encima de 0 y por debajo de la medida. Algo así:

strSQL = "SELECT TOP 1 Desfase FROM Tabla WHERE LongMin>0 And LongMin < " & Medida1


Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
Dany Solis Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 23/Octubre/2010
Localización: Cd. Juarez Méx
Estado: Sin conexión
Puntos: 912
Enlace directo a este mensaje Enviado: 30/Octubre/2020 a las 02:40
Pero son tres valores, esa función toma el valor que queda libre por ejemplo:

Completo y Segmentado son por default 0, pero el valor que queda a evaluar es SemiParcial y hasta el momento tiene tres variantes.

SemiParcial >1 entonces, 3
SemiParcial >=15 entonces, 5
SemiParcial >=20 entonces, 8

Con la propuesta que me das solo tomaría un solo valor, es correcto?

DS

Donde hay educación, no hay distinction de clases. (Confusio)

Dany Solis
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Enviado: 30/Octubre/2020 a las 08:34
Tu primera función solo devuelve:
- Si Completo -->0
- Si Segmentado --> 0
- Si Semiparcial tiene 2 alternativas
  - Meyor que 1 --> 1
  - En cualquier otro caso (menor o igual a 1) --> 0

Porque, a mi entender, NUNCA entrará en los ElseIf ya que cualquier numero mayor que 1 cumple con la primera y, por consecuencia, no entraria en las siguientes.

En definitiva, tu función SOLO devuelve un número (ya no entro a valorar que utilices un Long para un número que podría ser sencillamente un Byte)

En mi caso parto de la tabla que suministras y creo una consulta que me devuelva 1 solo registro dónde LongMin sea Mayor que 0 y menor que el valor de Medida1 dado. Lo único que me ha fallado es que debería haber ordenado el campo LongMin de forma descendente:
 
strSQL = "SELECT TOP 1 Desfase FROM Tabla WHERE LongMin>0 And LongMin < " & Medida1 & " ORDER BY LongMin DESC"

Prueba y nos cuentas

Xavi, un minyó de Terrassa

Mi web
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5970
Enlace directo a este mensaje Enviado: 30/Octubre/2020 a las 12:40
Tal como indica Xavi, las condiciones están mal ordenadas.

 Por ejemplo si  medida1 = 18  seguramente esperas que  RT_Clase1 = 8  debido a que cumple la condición  Medida1 >= 15, pero fíjate que anterior está la condición Medida1 >= 10 que también la cumple (18 > 10) y al principio Medida1 >= 1 que también la cumple (18 > 1), esta es la primera que comprueba y al cumplirse devuelve  RT_Clase1 = 3.

Ten presente que ElseIf  sólo funciona si la condición anterior NO se cumple.

 Debería ser...

   If medida1 < 2 Then

    RT_Clase1 = 0

  ElseIf medida1 < 10 Then

    RT_Clase1 = 3

  ElseIf medida1 < 15 Then

    RT_Clase1 = 5

  Else

    RT_Clase1 = 8

  End If

 

... aunque realmente basta con una sola línea:

   RT_Clase1 = 8 + 3 * (medida1 < 15) + 2 * (medida1 < 10) + 3 * (medida1 < 2)

 

Nota: son sumandos porque Verdadero (TRUE) en VBA es negativo (-1).

 

 

 

Saludos desde Tenerife.
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5970
Enlace directo a este mensaje Enviado: 30/Octubre/2020 a las 12:56
Estos son (también) los resultados «con una sola línea».

Medida1 RT_Clase1
0 0
1 0
2 3
3 3
4 3
5 3
6 3
7 3
8 3
9 3
10 5
11 5
12 5
13 5
14 5
15 8
16 8
17 8
18 8
19 8
20 8
21 8
Saludos desde Tenerife.
Arriba
Dany Solis Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 23/Octubre/2010
Localización: Cd. Juarez Méx
Estado: Sin conexión
Puntos: 912
Enlace directo a este mensaje Enviado: 04/Noviembre/2020 a las 05:25
Tenían razón he adecuado el código y va bien.

Gracias a los dos, este hilo se puede cerrar.

DS
Donde hay educación, no hay distinction de clases. (Confusio)

Dany Solis
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable