Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

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.

Reply
sohananahid
Post Partisan
Post Partisan

Problema con 'Actualización programada' para llamadas api

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.

2 ACCEPTED SOLUTIONS

Hola @sohananahid,


sohananahid_1-1601509026839.png


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

Community Support Team _ Xiaoxin
If this post helps, please consider accept as solution to help other members find it more quickly.

View solution in original post

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. 🙂

View solution in original post

13 REPLIES 13
v-shex-msft
Community Support
Community Support

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

Community Support Team _ Xiaoxin
If this post helps, please consider accept as solution to help other members find it more quickly.

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

Community Support Team _ Xiaoxin
If this post helps, please consider accept as solution to help other members find it more quickly.

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'.

sohananahid_0-1601398612762.png

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?

sohananahid_1-1601398612773.png

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:

sohananahid_0-1601420214552.png

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

Community Support Team _ Xiaoxin
If this post helps, please consider accept as solution to help other members find it more quickly.

Hola @v-shex-msft y todo : ¡Buen día! Gracias por su continuo apoyo. Recibí el siguiente error:

sohananahid_0-1601509026832.png

Después de reemplazar NoticeId por Column1, obtenga el siguiente error:

sohananahid_1-1601509026839.png

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'

sohananahid_2-1601509250764.png

¡¿No estoy seguro de qué hacer?! Muchas gracias de antemano.

Hola @sohananahid,


sohananahid_1-1601509026839.png


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

Community Support Team _ Xiaoxin
If this post helps, please consider accept as solution to help other members find it more quickly.

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. 🙂

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.