Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.
Hola a todos: Buenos días. He desarrollado un panel de control PBI que tienen 3 llamadas api [2 de ellas se llaman dinámicamente pasando 'Id'] de varias fuentes de datos. Funciona en Desktop env y con actualización manual de datos en Service env. Pero los problemas ocurren cuando el equipo de publicación está intentando implementar la "actualización programada". El equipo me dijo que necesito cambiar el código para la conexión api para que suceda!
#1 'Aviso' api url:
https://api.genscape.com/natgas/events/v1/notices?priorities=critical&limit=50&offset=0&format=json
Hay un límite máximo de 50 avisos que puedo tirar. He cambiado el código en Advanced Editor como se muestra a continuación:
----------------------------------------
let GetData () ?>
Dejar
PageSize 50,
sendRequest (página)
Dejar
Respuesta: Web.Contents(
"https://api.xyz.com/natgas/events/v1/notices",
[
Consulta á [
prioridades"críticas",
limit.ToText(pageSize),
formato "json",
offset- Number.ToText(page * pageSize)
]
,
Encabezados s [
"Gen-Api-Key" ".........." [no mostrando la clave aquí]
]
]
),
Datos: Json.Document(Response)[data]
En
Datos
Bucle (página como número, AccumData como lista) >
Dejar
Data - Function.InvokeAfter(()->sendRequest(page), #duration(0,0,0,2)),
Resultado ?
if List.Count(Data) < pageSize
o página > 50
a continuación, Table.FromRecords(List.Combine('AccumData', Data'))
else @Loop(página + 1, List.Combine(-AccumData, Data))
En
Resultado
En
Bucle(0, )
En
Getdata
-----------------------------
¡Funciona para extraer los datos y aparecer en una tabla visual como se esperaba!
Ahora, no estoy seguro de cómo actualizar el código para la otra api, 'Detalles del aviso'.
Recibo 50 avisos ['Id' es la clave única] de api-1, entonces necesito obtener detalles de aviso para cada aviso. Llamo a #2 'detalles del aviso' api enviando el 'Id' [creado dinámicamente]
#2 'Detalles del aviso' api url->
https://api.xyz.com/natgas/events/v1/notices/details?ids-ids-&format-json
-He creado un parámetro NoticeId y
-entonces una consulta, 'query_notice_details' usando Nuevo origen-> Web-> Avanzado-> pasos usando el parámetro 'NoticeId'
-A continuación, creé una función en la consulta->NoticeDetailsFunction
-Copié #1 origen de datos y quité columnas excepto 'Id', invoqué la función anterior para obtener el origen de datos 'details_notices'
'query_notice_details': código Desde el editor avanzado:
Dejar
Origen: Json.Document(Web.Contents("https://api.xyz.com/natgas/events/v1/notices/details?ids"& NoticeId & "&format-json", [Headers-[-"Gen-Api-Key" ?"......"]]))
En
Fuente
-----------------------------------------------------------------
'details_notices': código
------------------------------------
Dejar
Fuente : notices_api(),
"Columnas eliminadas" - Table.RemoveColumns(Source,"pipelineName", "pipelineId", "priority", "type", "status", "subject", "postDate", "effDate", "endDate", "insertDate")),
"Función personalizada invocada" - Table.AddColumn(-"Removed Columns", "NoticeDetailsFunction", each NoticeDetailsFunction([id])),
"Expanded NoticeDetailsFunction" á Table.ExpandRecordColumn(-"Invoked Custom Function", "NoticeDetailsFunction", ?"data" , ?"data" ? )
"Datos expandidos" - Table.ExpandListColumn(-"Expanded NoticeDetailsFunction", "data"),
"Datos expandidos1" - Table.ExpandRecordColumn(-"Datos expandidos", "datos", "pipelineName", "priority", "type", "subject", "body", "postDate", "effDate", "endDate", "pipelineName", "priority", "type", "subject", "body", "postDate", "effDate", "endDate")
En
"Datos ampliados1"
-----------------------------------------------
¿No está seguro del cambio de código que se va a realizar para invocar la función, NoticeDetailsFunction y recorrer en iteración cada NoticeDetailsFunction([id])?
---------------------------------------------------------------------------
Ya he comprobado el enlace: https://eu001-sp.shell.com/sites/AAFAA3947/SitePages/SOURCES%20INFO%20-%20REST%20API.aspx
Lo siento si te he abrumado toda la información! ☹ Muchas gracias de antemano por su paciencia.
Solved! Go to Solution.
Hola @sohananahid,
Parece que la consulta de energía no le permite dirigir hacer operaciones de combinación entre diferentes tipos (número y texto), intente usar el siguiente código de 'agregar columna personalizada' paso, agregué tipo de texto convertir en la fórmula.
#"Added Custom" = Table.AddColumn(#"Converted to Table1", "Source", each Json.Document(Web.Contents("https://api.xyz.com/",
[
Headers=[#"Gen-Api-Key"="...."],
RelativePath="natgas/events/v1/notices/details",
Query=
[
ids=Text.From([Column1]),
format="json"
]
])))
saludos
Xiaoxin Sheng
Hola @v-shex-msft y todo: ¡Buenos días! Encontré la comprobación de los datos en la tabla de base de datos y el portal de Api que para algunas tuberías habrá el mismo evento publicado para diferentes ubicaciones [ya que se ven afectados para todas esas ubicaciones para una canalización]. Es por eso que las múltiples filas de ubicación están llegando para esas tuberías! Por lo tanto, en realidad no es un error / problema, pero un hecho! Así que estoy cerrando este hilo. Gracias a todos por su paciencia. 🙂
Hola @sohananahid,
>>Ahora, no estoy seguro de cómo actualizar el código para la otra api, 'Detalles del aviso'.
Puede extraer la lista de identificadores de la 'consulta 1' en una nueva tabla de consulta y convertirla en la tabla.
A continuación, puede agregar una columna personalizada a la nueva tabla para usar la función 'notice detail' con valores de campo id para recorrer en bucle cada fila para obtener registros detallados en lugar de usar parámetros de consulta para invocar manualmente.
saludos
Xiaoxin Sheng
Hola @v-shex-msft: Gracias por su respuesta. ¡No estoy seguro de poder seguirte claramente! Soy bastante nuevo en el mundo de Power BI. ¿Podría por favor mostrar el código para hacerlo, realmente lo apreciaría mucho.
Hola @sohananahid,
>>Puede extraer la lista de identificadores de la 'consulta 1' a una nueva tabla de consulta y convertirla en la tabla.
Seleccione una columna y haga clic con el botón derecho en ella para elegir 'Agregar como nueva consulta', a continuación, estos valores de columna se extraerán como una nueva 'consulta' con el formato 'lista'.
Haga clic con el botón derecho en la nueva lista de consultas creada por el paso anterior, elija 'a tabla' para convertirla al formato de tabla.
>>añadir una columna personalizada a la nueva tabla para utilizar la función 'detalle de aviso' con valores de campo id para recorrer en bucle cada fila para obtener registros detallados
Agregar una nueva columna a la tabla actual y utilizar la función connector para invocar datos basados en el identificador actual: (utilice el nombre de columna id como parámetro en el conector)
#"Added Custom" = Table.AddColumn(#"Converted to Table", "Source", each Json.Document(Web.Contents("https://api.xyz.com/natgas/events/v1/notices/details?ids=" & [NoticeId] & "&format=json", [Headers=[#"Gen-Api-Key"="……"]])))
Nota: [NoticeId] es el nombre de la columna id, puede reemplazarlo por el nombre del campo.
Operadores de consulta de energía: lista de operadores m
saludos
Xiaoxin Sheng
Hola @v-shex-msft y todo: Muchas gracias por su respuesta. Traté de seguir los pasos que mencionaste. No estoy seguro de qué hacer en el último paso que mencionó:
Agregar una nueva columna a la tabla actual y utilizar la función connector para invocar datos basados en el identificador actual: (utilice el nombre de columna id como parámetro en el conector)
"Añadido Personalizado" - Table.AddColumn(-"Convertido a la tabla", "Origen", cada Json.Document(Web.Contents("https://api.xyz.com/natgas/events/v1/notices/details?ids"& [NoticeId] & "&format-json", [Headers-[-"Gen-Api-Key" ?"......"])))
He seleccionado 'Agregar columna'-> 'Columna personalizada'-> luego copiar y pegar el código en 'notice_detail' función en la 'Fórmula de columna personalizada'.
Después de eso obtengo una nueva columna, 'Custom' con 'Función' en cada celda para diferentes identificadores en la tabla. ¿No estás seguro de qué hacer ahora?
El código del editor avanzado [en azul es similar al código]
-----------------------------------
Dejar
Origen: Json.Document(Web.Contents("https://api.xyz.com/",
[
RelativePath"natgas/events/v1/notices",
Consulta
[
prioridades"críticas",
límite "50",
offset"0",
formato "json"
]
,
Encabezados[
"Gen-Api-Key""......."
]
]
)),
datos - Fuente[datos],
"Convertido a la tabla" - Table.FromList(data, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
"Columna expandida1" - Table.ExpandRecordColumn(-"Convertido en tabla", "Column1", "id", "pipelineName", "priority", "type", "subject", "postDate", "effDate", "endDate", "id", "pipelineName", "priority", "type", "subject", "postDate", "effDate", "effDate", "endDate""
id1 á "Columna expandida1"[id],
"Convertido a La Tabla1" - Table.FromList(id1, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
"Añadido Personalizado" - Table.AddColumn(-"Convertido a la Tabla1", "Personalizado", cada uno (NoticeId como número) ?> let
Origen: Json.Document(Web.Contents("https://api.xyz.com/natgas/events/v1/notices/details?ids"& Number.ToText(NoticeId) & "&format-json", [Headers-[-"Gen-Api-Key"-"......"])),
"Convertido en tabla" - Record.ToTable(Source),
"Valor expandido" - Table.ExpandListColumn(-"Convertido en tabla", "Valor"),
"Valor expandido1" - Table.ExpandRecordColumn('''''Valor expandido','Valor', ''id'', 'pipelineName', 'pipelineId', '''priorNoticeIdentifierId'', 'noticeIdentifierId', 'priority', 'type", "status", "subject", "body", "postDate", "effDate", "endDate", "insertDate", "id", "pipelineName", "pipelineId", "priorNoticeIdentifierId", "noticeIdentifierId", "priority", "type", "status", "subject", "body", "postDate", "effDate", "effDate", "effDate", "effDate", "endDate", "
En
"Valor expandido1")
En
"Añadido personalizado"
---------------------------------------------------
Realmente agradecería cualquier ayuda en esto. Mejor, Sohana
Hola @v-shex-msft : También como traté de cambiar [eliminado pocos pasos y actualizado las expresiones] el código en mi consulta anterior que publiqué hoy [para hacerlo similar a su fragmento de código] como se muestra a continuación
Dejar
Origen: Json.Document(Web.Contents("https://api.xyz.com/",
[
RelativePath"natgas/events/v1/notices",
Consulta
[
prioridades"críticas",
límite "50",
offset"0",
formato "json"
]
,
Encabezados[
"Gen-Api-Key""...."
]
]
)),
datos - Fuente[datos],
"Convertido a la tabla" - Table.FromList(data, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
"Columna expandida1" - Table.ExpandRecordColumn(-"Convertido en tabla", "Column1", "id", "pipelineName", "priority", "type", "subject", "postDate", "effDate", "endDate", "id", "pipelineName", "priority", "type", "subject", "postDate", "effDate", "effDate", "endDate""
id1 á "Columna expandida1"[id],
"Convertido a La Tabla1" - Table.FromList(id1, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
"Añadido Personalizado" - Table.AddColumn(-"Convertido a la Tabla1", "Origen", cada Json.Document(Web.Contents("https://api.xyz.com/natgas/events/v1/notices/details?ids"& [NoticeId] & "&format-json", [Headers-[-"Gen-Api-Key" ?"........."])))
En
"Añadido personalizado"
---------------------------------------------------
Obtengo Errores como abajo:
Cualquier ayuda sería muy apreciada.
-----------------------------------------------------------------
Hola @sohananahid,
¿Qué error se muestra en la columna personalizada que invoca el conector web? ¿Puede compartir los mensajes de error detallados?
Después de comprobar su fórmula e instantánea, encontré que los valores de su campo id se almacenan en 'column1', por lo que necesita usar 'column1' para reemplazar notado. (también puede intentar agregar 'relativepath' y otros parámetros opcionales en el conector web):
#"Added Custom" = Table.AddColumn(#"Converted to Table1", "Source", each Json.Document(Web.Contents("https://api.xyz.com/",
[
Headers=[#"Gen-Api-Key"="...."],
RelativePath="natgas/events/v1/notices/details",
Query=
[
ids=[Column1],
format="json"
]
])))
Uso de las opciones RelativePath y Query con Web.contents() en Power Query y Power BI M Code
saludos
Xiaoxin Sheng
Hola @v-shex-msft y todo : ¡Buen día! Gracias por su continuo apoyo. Recibí el siguiente error:
Después de reemplazar NoticeId por Column1, obtenga el siguiente error:
Por lo tanto, comencé de nuevo y no borré ningún paso. Renombré "Column1" como "NoticeId", edité la parte "Added Custom" como se muestra a continuación con Ruta relativa y Consulta, creé una variable, id para usar en ids-[id]:
-------------------------
Dejar
Origen: Json.Document(Web.Contents("https://api.genscape.com/",
[
RelativePath"natgas/events/v1/notices",
Consulta
[
prioridades"críticas",
límite "50",
offset"0",
formato "json"
]
,
Encabezados[
"Gen-Api-Key""f94ffe41c1d74066b90c564397edf9b2"
]
]
)),
datos - Fuente[datos],
"Convertido a la tabla" - Table.FromList(data, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
"Columna expandida1" - Table.ExpandRecordColumn(-"Convertido en tabla", "Column1", "id", "pipelineName", "priority", "type", "subject", "postDate", "effDate", "endDate", "id", "pipelineName", "priority", "type", "subject", "postDate", "effDate", "effDate", "endDate""
id1 á "Columna expandida1"[id],
"Convertido a La Tabla1" - Table.FromList(id1, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
"Añadido Personalizado" - Table.AddColumn(-"Convertido a la Tabla1", "Personalizado", cada uno (NoticeId como número) ?> let
Origen: Json.Document(Web.Contents("https://api.genscape.com/",
[
Encabezados["Gen-Api-Key"-"f94ffe41c1d74066b90c564397edf9b2"],
RelativePath" natgas/events/v1/notices/details",
Número.ToText(NoticeId),
Consulta
[
ids-[id],
formato "json"
]
])),
"Convertido en tabla" - Record.ToTable(Source),
"Valor expandido" - Table.ExpandListColumn(-"Convertido en tabla", "Valor"),
"Valor expandido1" - Table.ExpandRecordColumn('''''Valor expandido','Valor', ''id'', 'pipelineName', 'pipelineId', '''priorNoticeIdentifierId'', 'noticeIdentifierId', 'priority', 'type", "status", "subject", "body", "postDate", "effDate", "endDate", "insertDate", "id", "pipelineName", "pipelineId", "priorNoticeIdentifierId", "noticeIdentifierId", "priority", "type", "status", "subject", "body", "postDate", "effDate", "effDate", "effDate", "effDate", "endDate", "
En
"Valor expandido1")
En
"Añadido personalizado"
--------------------------
Ahora obtengo lo siguiente con 'función' en cada celda bajo columna 'Custom'
¡¿No estoy seguro de qué hacer?! Muchas gracias de antemano.
Hola @sohananahid,
Parece que la consulta de energía no le permite dirigir hacer operaciones de combinación entre diferentes tipos (número y texto), intente usar el siguiente código de 'agregar columna personalizada' paso, agregué tipo de texto convertir en la fórmula.
#"Added Custom" = Table.AddColumn(#"Converted to Table1", "Source", each Json.Document(Web.Contents("https://api.xyz.com/",
[
Headers=[#"Gen-Api-Key"="...."],
RelativePath="natgas/events/v1/notices/details",
Query=
[
ids=Text.From([Column1]),
format="json"
]
])))
saludos
Xiaoxin Sheng
Hola @v-shex-msft: Muchas gracias por su ayuda. Se eliminó el error y ahora puedo tirar de los datos deseados. Voy a comprobar con el equipo de publicación para averiguar si este cambio de código resolverá el problema / error que hemos estado recibiendo hasta ahora reg 'Refresh programado' con consulta dinámica!
Hola @v-shex-msft : El cambio de código M ayudó a la 'Actualización programada' a ser activado! Muchas gracias por su apoyo a través de este proceso! 🙂
Hola @v-shex-msft: Buenos días. Aunque el equipo de publicación no está recibiendo el error antes, veo un problema en los datos. Obtengo una columna, 'locations' como una lista, que anteriormente [antes del cambio de código M]- Pude ver como : delimitado con el identificador de ubicación y el nombre de la ubicación. A continuación, podría seleccionar la columna, haga clic con el botón derecho y seleccione 'Dividir por delimitador'. Acabo de publicar la opción 'dividir por delimitador' no aparecer en
https://community.powerbi.com/t5/Desktop/Split-a-Single-Column-with-delimiter-colon/td-p/1428948
Si extraigo como nuevas filas/expand-> no funciona: más bien crea varias filas con el mismo 'id' y muestra los datos incorrectamente en un objeto visual Mapa.
Estoy pensando que es algo más que tengo que hacer en el código M para dividir la lista por dos puntos [:] delimitador?
El código para esta fuente de datos, #2 details_maintenance_events es como se muestra a continuación [cambiar algún valor con xyz/abc/...]:
---------------
Dejar
Origen: Sql.Database("xyz-Fundamentals", "NatGas_V3", [Query-"select * de NatGas_V3.natgas.pipeline_maintenance_events(lf)where endDate >-" &datefilter]),
"Filas ordenadas" - Table.Sort(Source,"endDate", Order.Ascending, "updateDate", Order.Descending)),
"Filas filtradas" - Table.SelectRows("Filas ordenadas", cada una verdadera),
id1 á "Filas filtradas"[id],
"Convertido a la tabla" - Table.FromList(id1, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
"Añadido Personalizado" - Table.AddColumn(-"Convertido a la tabla", "Origen", cada Json.Document(Web.Contents("https://api.abc.com/",
[
Encabezados[-"Gen-Api-Key"-"........"],
RelativePath"natgas/events/v1/maintenance-events/details",
Consulta
[
ids-Text.From([Column1]),
formato "json"
]
]))),
"Errores eliminados" - Table.RemoveRowsWithErrors(-"Added Custom", ?"Column1"-),
"Errores eliminados1" - Table.RemoveRowsWithErrors(-"Errores eliminados", "Columna1" )
"Errores eliminados2" - Table.RemoveRowsWithErrors(-"Errores eliminados1", "Origen")
"Origen expandido" - Table.ExpandRecordColumn(-"Errores eliminados2", "Origen", "datos", "datos"),
"Datos expandidos" - Table.ExpandListColumn('Origen expandido", "datos")
En
"Datos ampliados"
---------------------
Primero extraes datos de una base de datos SQL como #1 maintenance_events origen de datos, luego creo este 2do origen de datos, details_maintenance_events. No he cambiado ningún código en #1 fuente de datos[ use data-> sql database->....], que es como se muestra a continuación:
----
Dejar
Origen: Sql.Database("xyz-Fundamentals", "NatGas_V3", [Query-"select * de NatGas_V3.natgas.pipeline_maintenance_events(lf)where endDate >-" &datefilter]),
"Filas ordenadas" - Table.Sort(Source,"endDate", Order.Ascending, "updateDate", Order.Descending)),
"Filas filtradas" - Table.SelectRows("Filas ordenadas", cada uno de los verdaderos)
En
"Filas filtradas"
--------
Muchas gracias de antemano.
Hola @v-shex-msft y todo: ¡Buenos días! Hice algún cambio de código y publiqué esto en otro hilo:
https://community.powerbi.com/t5/Desktop/Split-a-Single-Column-with-delimiter-colon/m-p/1430399
Por favor, compruebe mi último post en ese hilo, ya que es donde estoy ahora! Muchas gracias de antemano.
Hola @v-shex-msft y todo: ¡Buenos días! Encontré la comprobación de los datos en la tabla de base de datos y el portal de Api que para algunas tuberías habrá el mismo evento publicado para diferentes ubicaciones [ya que se ven afectados para todas esas ubicaciones para una canalización]. Es por eso que las múltiples filas de ubicación están llegando para esas tuberías! Por lo tanto, en realidad no es un error / problema, pero un hecho! Así que estoy cerrando este hilo. Gracias a todos por su paciencia. 🙂
Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City
Check out the April 2024 Power BI update to learn about new features.
User | Count |
---|---|
2 | |
2 | |
2 | |
2 | |
1 |