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»