Fuentes de datos de funciones recursivas

Un usuario Pregunto ✅

¡Hola!

Tengo un problema al combinar varios archivos en una tabla que llama a una función recursiva. Quiero obtener de una página web algunos archivos que se actualizan diariamente y sus nombres son sólo la fecha en que se actualizan. Así que decidió crear una función que está aumentando una variable de fecha y un contenido de tabla. Hasta que llegue a endDate. El problema está justo en el código que está llamando a la tabla externa cuando llama a la función esta es la salida que lanza

Formula.Firewall: La consulta 'Función invocada' (paso 'Origen') hace referencia a otras consultas o pasos, por lo que es posible que no tenga acceso directamente a un origen de datos. Vuelva a generar esta combinación de datos.

Cambiar el fragmento de código en negrita para una tabla local hace que funcione perfectamente, combinando esas 2 tablas tantas veces como se llama la función. ¿Alguna sugerencia?

¡Gracias!

(startDate como fecha, endDate como fecha, datos como tabla) como tabla >
Dejar
sDate á Date.AddDays(startDate, -1),

Table.Combine(
{

Csv.Document(
Web.Contents(
"Enlace de Github"(
if(Time.Hour(DateTime.LocalNow()) >= 0 and Time.Hour(DateTime.LocalNow()) < 19) then
Date.AddDays(
Date.From(DateTime.LocalNow()),
-2
)
else
Date.AddDays(
Date.From(DateTime.LocalNow()),
-1
)
)
),
[Delimitador",", Columnas 14, Codificación 65001, QuoteStyle-QuoteStyle.None]
)
}
),

if(sDate <- endDate) y, a continuación,
Currentdata
Más
@Query1(sDate, endDate, currentData)

En
loopCheck

En respuesta a Syndicate_Admin

Gracias por la sugerencia. Pensé en iterar dentro de un «paso», pero no entendí completamente cómo hacerlo. Después de que sugeriste usar List.Generate(), comencé a leer sobre él e intentar implementarlo y finalmente superar, esta es la solución que funciona si alguien está teniendo el mismo problema. Recomendando encarecidamente esta página List.Generate() explicación para entender lo que está pasando dentro de este «método».

Dejar
startDateTime á DateTime.LocalNow(),
Primera fecha reportada
endDate : #date(2020,01,22),

List.Generate(
() =>
[x = Date.From(startDateTime),
y - #table(
tabla de tipos [
Column1 = text,
Column2 = text,
Column3 = text,
Column4 = text,
Column5 = text,
Column6 = text,
Column7 = text,
Column8 = text,
Column9 = text,
Column10 = text,
Column11 = text,
Column12 = text,
Column13 = text,
Columna14 - texto
],
{}
)
],

each [x] > endDate,
cada uno de ellos [
x = Date.AddDays([x], -1),
y - Table.Combine(
{
[y],
Table.AddColumn(Csv.Document(
Web.Contents(
"Enlace de Github"(
if(Time.Hour(startDateTime) >= 0 and Time.Hour(startDateTime) < 19 and x = Date.From(startDateTime)) then
Date.AddDays(
Date.From(x),
-2
)
else
Date.AddDays(
Date.From(x),
-1
)
)
),
[Delimitador",", Columnas 14, Codificación 65001, QuoteStyle-QuoteStyle.None]
), "Reference_Date", cada x)
}
)
],
cada uno [y]
),
lastTable - List.Last(currentData),
"Columnas renombradas" - Table.RenameColumns(lastTable,"Column1", "FIPS", "Columna2", "Admin2", "Columna3", "Province_State", "Column4", "Country_Region", "Columna5", "Last_Update", "Columna6", "Lat", "Columna7", "Long_", "Columna8", "Confirmado", "Columna9", "Muertes", "Columna10", "Recuperado", "Columna11", "Activo", "Columna12", "Combined_Key", "Columna13", "Incident_Rate", "Columna14", "Columna14", "Case_Fatality_Ratio"),
"Filas filtradas" - Table.SelectRows(-"Columnas renombradas", cada una ([FIPS] <> "FIPS" y [FIPS] <> "Provincia/Estado")),
"Valor reemplazado" - Table.ReplaceValue ('Filas filtradas',"."",",""Reemplazar.ReemplazarText,'"Lat", "Long_", "Confirmado", "Muertes", "Recuperado", "Activo", "Incident_Rate", "Case_Fatality_Ratio"-),
"Changed Type1" á Table.TransformColumnTypes('Valor reemplazado','Long_'tipo de tipo, "Confirmado", Int64.Type, "Muertes", Int64.Type, "Recuperado", Int64.Type, "Active", Int64.Type, "Incident_Rate", número de tipo, "Case_Fatality_Ratio", Percentage.Type, "Reference_Date", tipo date, "Last_Update", "Last_Update"),
"Valor reemplazado1" - Table.ReplaceValue(-"Changed Type1","US","United States of America",Replacer.ReplaceText,'"Country_Region"'),
"Errores reemplazados" - Table.ReplaceErrorValues('Valor reemplazado1', ''Last_Update','','''Case_Fatality_Ratio'
En
"Errores reemplazados"

si lo piensas, esto no es tanto una función recursiva como un iterador. (las funciones recursivas pueden arrastrarse por varios niveles, los iteradores permanecerán en el mismo nivel)

por lo que una alternativa es list.generate la URL de github (basadas en los mismos criterios de corte), y luego llamar a web.contents() contra la lista y combinar los resultados.

En respuesta a Syndicate_Admin

Gracias por la sugerencia. Pensé en iterar dentro de un «paso», pero no entendí completamente cómo hacerlo. Después de que sugeriste usar List.Generate(), comencé a leer sobre él e intentar implementarlo y finalmente superar, esta es la solución que funciona si alguien está teniendo el mismo problema. Recomendando encarecidamente esta página List.Generate() explicación para entender lo que está pasando dentro de este «método».

Dejar
startDateTime á DateTime.LocalNow(),
Primera fecha reportada
endDate : #date(2020,01,22),

List.Generate(
() =>
[x = Date.From(startDateTime),
y - #table(
tabla de tipos [
Column1 = text,
Column2 = text,
Column3 = text,
Column4 = text,
Column5 = text,
Column6 = text,
Column7 = text,
Column8 = text,
Column9 = text,
Column10 = text,
Column11 = text,
Column12 = text,
Column13 = text,
Columna14 - texto
],
{}
)
],

each [x] > endDate,
cada uno de ellos [
x = Date.AddDays([x], -1),
y - Table.Combine(
{
[y],
Table.AddColumn(Csv.Document(
Web.Contents(
"Enlace de Github"(
if(Time.Hour(startDateTime) >= 0 and Time.Hour(startDateTime) < 19 and x = Date.From(startDateTime)) then
Date.AddDays(
Date.From(x),
-2
)
else
Date.AddDays(
Date.From(x),
-1
)
)
),
[Delimitador",", Columnas 14, Codificación 65001, QuoteStyle-QuoteStyle.None]
), "Reference_Date", cada x)
}
)
],
cada uno [y]
),
lastTable - List.Last(currentData),
"Columnas renombradas" - Table.RenameColumns(lastTable,"Column1", "FIPS", "Columna2", "Admin2", "Columna3", "Province_State", "Column4", "Country_Region", "Columna5", "Last_Update", "Columna6", "Lat", "Columna7", "Long_", "Columna8", "Confirmado", "Columna9", "Muertes", "Columna10", "Recuperado", "Columna11", "Activo", "Columna12", "Combined_Key", "Columna13", "Incident_Rate", "Columna14", "Columna14", "Case_Fatality_Ratio"),
"Filas filtradas" - Table.SelectRows(-"Columnas renombradas", cada una ([FIPS] <> "FIPS" y [FIPS] <> "Provincia/Estado")),
"Valor reemplazado" - Table.ReplaceValue ('Filas filtradas',"."",",""Reemplazar.ReemplazarText,'"Lat", "Long_", "Confirmado", "Muertes", "Recuperado", "Activo", "Incident_Rate", "Case_Fatality_Ratio"-),
"Changed Type1" á Table.TransformColumnTypes('Valor reemplazado','Long_'tipo de tipo, "Confirmado", Int64.Type, "Muertes", Int64.Type, "Recuperado", Int64.Type, "Active", Int64.Type, "Incident_Rate", número de tipo, "Case_Fatality_Ratio", Percentage.Type, "Reference_Date", tipo date, "Last_Update", "Last_Update"),
"Valor reemplazado1" - Table.ReplaceValue(-"Changed Type1","US","United States of America",Replacer.ReplaceText,'"Country_Region"'),
"Errores reemplazados" - Table.ReplaceErrorValues('Valor reemplazado1', ''Last_Update','','''Case_Fatality_Ratio'
En
"Errores reemplazados"

Deja un comentario

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