Hola a todos.
Hasta la fecha, únicamente tengo un post en Excel Signum sobre números primos y Power Apps: Aquí y el motivo no es otro que a Power Fx le resulta complejo o, más bien, está limitado. Hay que recordar que Power Apps no está construido específicamente para el cálculo.
Por ello, en esa entrada que construí en su momento, ya me resultó complicado y limitado el hacer un código que detectase si un número era o no primo, imaginaos uno que genere números primos…
Pero, ahora que tenemos recursos como Azure Functions, esto resulto mucho más fácil. Y es que lo vamos a generar en Python, directamente y luego pasaremos el resultado a Power Apps por medio de Automate (nuestra forma habitual de trabajar).
Esta va a ser la App:

Y vamos a tener que construir una función para poder desplegarla en Azure y a la que podamos llamar con Automate. Por ello, la función va a ser esta:
import json
import azure.functions as func
def es_primo(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
def main(req: func.HttpRequest) -> func.HttpResponse:
try:
data = req.get_json()
desde = int(data.get("desde", 0))
hasta = int(data.get("hasta", 0))
primos = [n for n in range(desde, hasta + 1) if es_primo(n)]
return func.HttpResponse(
body=json.dumps({"primos": primos}),
status_code=200,
mimetype="application/json"
)
except Exception as e:
return func.HttpResponse(
body=json.dumps({"error": str(e)}),
status_code=400,
mimetype="application/json"
)
Perfecto, y ahora vamos con el flujo, que vamos a ejecutar directamente desde Power Apps:


Recordad que en el cuerpo de la acción HTTP, hay que poner esto:
{
"desde": @{triggerBody()['number']},
"hasta": @{triggerBody()['number_1']}
}
Ya que es número lo que pasamos a la función.
En el jSON debemos utilizar esto para incluirlo en «Generar desde la muestra»:
{
"primos": [2,3,5,7,11]
}
Y finalmente, en la respuesta debemos pegar esta expresión:
string(body('Análisis_del_archivo_JSON'))
Y ahora en la APP, en el botón vamos a incluir este código en la propiedad OnSelect:
If(
IsBlank(txtDesde.Text) || IsBlank(txtHasta.Text);
Notify(
"Debes introducir un valor en 'desde' y 'hasta'.";
NotificationType.Warning
);
Set(
varResultado;
FLUJONUMEROSPRIMOS.Run(
Value(txtDesde.Text);
Value(txtHasta.Text)
).resultado
)
)
Y en el label en la propiedad text:
If(
IsBlank(varResultado);
"";
Substitute(
Mid(
varResultado;
Find("["; varResultado) + 1;
Find("]"; varResultado) - Find("["; varResultado) - 1
);
",";
", "
)
)
Y el resultado final es este:

