Buscar un valor en varios rangos al mismo tiempo

Tras la auditoria de rigor me han obligado a crear un cambio al software de access que no se como atacarlo, porque todo lo que se me ocurre, me lleva a varios centenares de lineas de código a base de comparaciones.

Os explico, tengo un botón que tras rellenar el formulario, hace una serie de cálculos y los guarda el resultado X en la base de datos. Hasta aqui todo correcto, perfecto, guay. El problema que me han creado es el siguiente.

Tengo varios rangos (28 en total) y cada rango tiene asociado un valor Y. Ejemplo

Rango 1 -> 0,000001 a 0,0001 -  Valor Y = 2,8

Rango 2 -> 0,0001 a 1 -   Valor Y = 3,4

Rango 3 ->  1 a 2 -  Valor Y = 3,9

Rango 4 ->  2 a 5 - Valor Y = 4,4

Rango 5 -> 5 a 10 - Valor Y = 6

Rango 6 -> 10 a 50 - Valor Y = 10,22

Entonces, lo que debo hacer es saber en que rango está un valor Z, una vez se que el valor Z está por ejemplo en el rango 4, comparo el valor Y con el X y el mayor de los dos es el que debo guardar en la base de datos.

Ejemplo con lo que debe hacer la rutina.

Ya he calculado que X = 0,7 y mi primer valor Z a buscar en algun rango es 3. El código debe buscar en que rango (X) está encuadrado el valor Z = 3. Está en en rango (4). Entonces asigno a la variable Y = 4,4.

Finalmente Y>X -> guardar en base de datos 4,4 sino 0,7.

Esto debo repetirlo para de 5 a 10 valores Z

Buscar Z = 10

Buscar Z = 20

Buscar Z = 100

Saludos y

Respuesta
1

Una alternativa matemática:

y = 2.8 - 0.6 * (z > 0.0001) - 0.5 * (z > 1) - 0.5 * (z> 2) - 1.6 * (z> 5) - 4.22 * (z> 10)

En la ventana de inmediato (he eliminado los resultados intermedios)

For z = 0.00001 to 15 step .1: debug.Print z, "-->" 2.8 - 0.6 * (z > 0.0001) - 0.5 * (z > 1) - 0.5 * (z> 2) - 1.6 * (z> 5) - 4.22 * (z> 10): next Z
0,00001 --> 2,8
0,10001 --> 3,4

..............

0,90001 --> 3,4
1,00001 --> 3,9
.................

1,90001 --> 3,9
2,00001 --> 4,4
.................
4,90001 --> 4,4

5,00001 --> 6
................
6,00001 --> 6
...................
9,90000999999998 --> 6

10,00001 --> 10,22
...
14,90001 --> 10,22

1 respuesta más de otro experto

Respuesta
1

Hago constar que no entiendo la mitad, sobre todo lo de la comparación del Valor Y con el valor X, pero...

Si tengo una tabla Rangos como

Y una tabla Guardar donde voy a guardar ese valor Y>X y el rango en que estaba comprendido el valor de Z

En un formulario tengo los valores que dices

Si pulso Comparar y Guardar, me deja la tabla Guardar

Es decir, que el valor de Z estaba comprendido en el rango 4 y como Y=3 es mayor que 0,7 guarda éste último( aunque no dices que debe hacer en caso de que Y sea menor que X)

Ahora le pongo como valor Z 10

Cuando pulso el botón

Me dice que z estaba comprendido en el rango 5 y como x sigue siendo menor que y guarda ese valor.

En este caso, el código del evento Al hacer clic del botón( aunque no haría falta ya que la instrucción se puede poner en cualquier evento) es

Private Sub Comando4_Click()
Dim s As Single, c As Byte
s = DLookup("valorY", "rangos", "margeninferior<=" & Me.ValorZ & " and margensuperior>=" & Me.ValorZ & "")
c = DLookup("numrango", "rangos", "margeninferior<=" & Me.ValorZ & " and margensuperior>=" & Me.ValorZ & "")
If s > ValorX Then
DoCmd.RunSQL "insert into guardar(valorguardar,rango)values(valorx," & c & ")"
End If
End Sub

¡Gracias! Pues me funciona de lujo. Ahora solo tengo que adaptar este código a mis necesidades que son  muy toca narices a nivel auditoria y listo.

Gracias gracias de nuevo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas