Evite que la función de la API del mapa de Bing se ejecute/actualice cuando se edite la consulta.

Un usuario Pregunto ✅

rixmcx59

hola a todos, creé una función que llama al servicio web de mapas de Bing, funciona muy bien y me da la distancia recorrida y la duración entre mis ubicaciones de inicio y fin, sin embargo, es un poco lento.

Mi pregunta es, ¿puedo agregar una condición o algún otro truco para evitar que la función se ejecute a menos que mis columnas de distancia estén en blanco? En cada edición de la consulta, sin importar cuán pequeña sea, me veo obligado a aplicar cambios y la función procesa la distancia en las más de 900 filas.

Gracias por cualquier ayuda

parar2k

@ rixmcx59 no puede evitar la actualización completa, tan pronto como actualice, se actualizará y hará que la función llame para cada fila.

parar2k

@rixmcx59 puede usar técnicas de actualización incremental para no procesar los registros que ya están procesados. Hay pocos artículos sobre cómo hacer esto, aquí hay una de esas publicaciones.

Revisa mi última publicación en el blog Año 2020, Pandemia, Power BI y más allá para obtener un resumen de mis lanzamientos de funciones favoritas de Power BI en 2020

me gustaría Prestigio si mi solución ayudó. 👉 Si puede dedicar tiempo a publicar la pregunta, también puede hacer esfuerzos para dar Kudos a quien haya ayudado a resolver su problema. ¡Es una muestra de agradecimiento!

Visitanos en https://perytus.com, su ventanilla única para proyectos/capacitación/consultoría relacionados con Power BI.

parar2k

@ rixmcx59 no puede evitar la actualización completa, tan pronto como actualice, se actualizará y hará que la función llame para cada fila.

rixmcx59

En respuesta a parar2k

Gracias por la respuesta, ¿hay alguna posibilidad de una actualización parcial usando un intervalo de fechas en «Administrar parámetros» para la función de consulta?

felipetreacy

Hola @rixmcx59

Sería realmente útil si publicara el código que está utilizando, por lo que no estamos adivinando lo que está haciendo. Y algunos datos de muestra para que podamos ver su estructura de datos/nombres de columna.

¿Cuál es el mensaje de error completo?

¿Qué paso lo está generando?

Si solo desea llamar a la función cuando una columna no contiene nulo, use esto. Suponiendo que desea comprobar el [Address] y [Work Location] columnas para nulo

each if [Address] <> null and [Work Location] <> null then fnDistince([Address], [Work Location]) else null

Saludos

phil

rixmcx59

En respuesta a felipetreacy

Intenté esto por sugerencia de mahoneypat

each if [Distance] = null then fxMilesDuration([Address],[Work Location]) else [Distance]

y este error

Expression.Error: The field 'Distance' of the record wasn't found.
Details:
    Department Org Code=9000
    Department Name=MyDept
    ID=001901
    Classification=INFORMATION TECH
    Work Schedule=5-8-40 MTWTF 8
    Report Date=12/28/2020
    Name=AnyName
    Email=Any.Nname@MyDept.com

También intenté usar «Distancia» en lugar de [Distance] y obtuve esto

Expression.Error: We cannot convert the value "Distance" to type Table.
Details:
    Value=Distance
    Type=[Type]

Aquí está la función

let 
    Route = (StartAddress as text, DestinationAddres as text) =>
let
    Source = Xml.Tables(Web.Contents("http://dev.virtualearth.net/REST/V1/Routes/Driving?o=xml&distanceUnit=mi&wp.0="&StartAddress&"&wp.1="&DestinationAddres &"&avoid=minimizeTolls&key=MyBingApiKey
")),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Copyright", type text}, {"BrandLogoUri", type text}, {"StatusCode", Int64.Type}, {"StatusDescription", type text}, {"AuthenticationResultCode", type text}, {"TraceId", type text}}),
    ResourceSets = #"Changed Type"{0}[ResourceSets],
    ResourceSet = ResourceSets{0}[ResourceSet],
#"Changed Type1" = Table.TransformColumnTypes(ResourceSet,{{"EstimatedTotal", Int64.Type}}),
    Resources = #"Changed Type1"{0}[Resources],
    Route = Resources{0}[Route],
#"Changed Type2" = Table.TransformColumnTypes(Route,{{"Id", type text}, {"DistanceUnit", type text}, {"DurationUnit", type text}, {"TravelDistance", type number}, {"TravelDuration", Int64.Type}, {"TravelDurationTraffic", Int64.Type}, {"TrafficDataUsed", type text}, {"TrafficCongestion", type text}}),
#"Removed Columns" = Table.RemoveColumns(#"Changed Type2",{"Id", "BoundingBox", "DistanceUnit", "DurationUnit", "TrafficDataUsed", "TrafficCongestion", "RouteLeg"})
in
#"Removed Columns"
in 
    Route

mis pasos

let
    Source = Excel.Workbook(File.Contents("C:UsersuserDocumentsMy DocsrequesttEmployeeHr.xlsx"), null, true),
    Table1_Table = Source{[Item="Table1",Kind="Table"]}[Data],
    #"Changed Type" = Table.TransformColumnTypes(Table1_Table,{{"Department Org Code", type text}, {"Department Name", type text}, {"ID", type text}, {"Classification", type text}, {"Work Schedule", type text}, {"Report Date", type date}, {"Name", type text}, {"Email", type text}, {"Dept ID", Int64.Type}, {"Descr", type text}, {"SUP NAME", type text}, {"CampusCode", type text}, {"CampusAddress", type text}, {"CampusCity", type text}, {"CampusState", type text}, {"CampusZip", Int64.Type}, {"Address 1", type text}, {"Address 2", type text}, {"City", type text}, {"State", type text}, {"Postal", Int64.Type}, {"FullName", type text}, {"FName", type text}, {"LName", type text}, {"Active", type logical}}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Changed Type",{{"Postal", type text}, {"CampusZip", type text}}),
    #"Inserted Merged Column" = Table.AddColumn(#"Changed Type1", "MergedFullAddress", each Text.Combine({[Address 1], [City], [State], Text.From([Postal], "en-US")}, ","), type text),
    #"Inserted Merged Column1" = Table.AddColumn(#"Inserted Merged Column", "MergedCityStateZip", each Text.Combine({[City], [State], Text.From([Postal], "en-US")}, ","), type text),
    #"Inserted Merged Column2" = Table.AddColumn(#"Inserted Merged Column1", "Work Location", each Text.Combine({[CampusAddress], [CampusCity], [CampusState], Text.From([CampusZip], "en-US")}, ","), type text),
    #"Added Conditional Column" = Table.AddColumn(#"Inserted Merged Column2", "Address", each if [Address 1] = [Postal] then [MergedCityStateZip] else [MergedFullAddress]),
    #"Added Custom" = Table.AddColumn(#"Added Conditional Column", "Distance", each fxMilesDuration([Address],[Work Location])),
    #"Expanded Distance" = Table.ExpandTableColumn(#"Added Custom", "Distance", {"TravelDistance", "TravelDuration"}, {"Distance.TravelDistance", "Distance.TravelDuration"})
in
    #"Expanded Distance"

No tengo mucha experiencia, pero parece que necesito agregar un paso para expandir las columnas de distancia antes de la condición y luego aplicar la función cuando la Distancia es nula. Gracias

rixmcx59

En respuesta a felipetreacy

Ok, déjame obtener lo que pediste, pero las direcciones nunca serán nulas, son las columnas expandidas (TravelDistance, TravelDuration) las que serán nulas con nuevos registros. Estoy tratando de evitar la actualización de los registros existentes.

mahoneypat

En el paso en el que invoca su función personalizada, puede envolverla en un if…then…else, donde verifica si la columna Distancia = nula. Si es así, ejecute la función y, si no, devuelva el valor de la columna Distancia.

En lugar de «… cada fnDistince([City1], [City2]) …», tratar

«… cada si [Distance] = nulo entonces fnDistinción([City1], [City2]) demás [Distance] …»

Saludos,

Palmadita

rixmcx59

En respuesta a mahoneypat

Gracias, parece que funcionará, lo intentaré, publicaré el resultado y aceptaré su solución.

rixmcx59

En respuesta a rixmcx59

Estos son mis pasos actuales, intenté insertar la condición sin suerte. ¿El error indicó que no se pudo convertir la distancia?

#»Personalizado agregado» = Table.AddColumn(#»Columna condicional agregada», «Distancia», cada fxMilesDuration([Address],[Work Location])),
#»Distancia ampliada» = Table.ExpandTableColumn(#»Personalización agregada», «Distancia», {«Distancia del viaje», «Duración del viaje»}, {«Distancia.Distancia del viaje», «Distancia.Duración del viaje»})
en
#»Distancia ampliada»

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *