Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Administrator
3 years ago

Bucle Date.AddDays

Hola

Tengo 4 columnas, 'día', 'fecha de inicio', 'fecha de finalización', 'semana'.

Col 'día' es un número entero que define el número del día.

Col 'semana' define la frecuencia con la que se repite el registro.

A continuación, el primer registro ID 11232 indica que el registro ocurre cada lunes, martes, miércoles (día = 123) con una fecha de inicio 22/07/2019 y una fecha de finalización 09/10/2022 y se repite cada 2 semanas (col 'semana' = 2). El valor en semana puede ser 0, lo que significa que el registro no se repite, 1 significa que se repite cada semana, etc.

Mi salida deseada se mostraría debajo de las fechas hasta que cumpla con la fecha de finalización.

Estoy pensando que un bucle Date.AddDays en el editor de consultas sería el camino a seguir, pero estoy luchando por escribirlo.

10 Replies

  • Hi , @Qotsa

    De acuerdo con su descripción, desea generar la lista de fechas de acuerdo con la columna "semana, fecha de inicio, fecha de finalización, día". ¿Derecha?

    Estos son mis datos de prueba en mi lado.

    Puede colocar este código M en el "Editor avanzado" del Editor de Power Query:

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("lY9RDoNACETvst8mwMDichbj/a8hLrUxtv3oDzOQPBi2rYlA0ZamLBGp2Z7VjFOQQ1oJmB6gIJnzti+F6h217usnHBcsTOI32uYuZXg/9UWHv+FBYhc86rIU28UrNDBS++PqIH16/h7597cTLf933mK98u4H", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [id = _t, carerId = _t, day = _t, length = _t, startDate = _t, endDate = _t, week = _t]),
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"id", Int64.Type}, {"carerId", Int64.Type}, {"day", Int64.Type}, {"length", Int64.Type}, {"startDate", type date}, {"endDate", type date}, {"week", Int64.Type}}),
        test = Table.AddColumn(#"Changed Type", "day_list", (x)=> List.Transform(Text.ToList(Text.From(x[day])),(y)=>Number.From(y)-1)    ),
        #"Added Custom" = Table.AddColumn(
    test, "start_Monday", (x)=>Date.AddDays(Date.StartOfWeek(x[startDate]),1)                   
    
    
    ),
        #"Added Custom1" = Table.AddColumn(#"Added Custom", "Accumul_list", (x)=>
    if x[week]=0 then null  else if x[week]=1 then {0..(Duration.Days(Date.AddDays(Date.EndOfWeek(x[endDate]),1)-x[start_Monday])+1)/7-1}else if x[week]=2 then 
    List.Generate(()=>0,each _<=(Number.RoundUp((Duration.Days(Date.AddDays(Date.EndOfWeek(x[endDate]),1)-x[start_Monday])+1)/7/2)-1)*2,each _+2)   else 1),
        #"Added Custom2" = Table.AddColumn(#"Added Custom1", "Need List", (x)=> 
     if x[Accumul_list]<> null then  List.Sort(List.TransformMany(x[day_list],each x[Accumul_list],(x,y)=>y*7+x)) else x[endDate]
     ),
        #"Added Custom3" = Table.AddColumn(#"Added Custom2", "End List", (x)=>
    try  
    List.Select(List.Accumulate(x[Need List],{},(a,b)=> a& {Date.AddDays(Date.From(x[start_Monday]) ,b)} ),(z)=>z<=x[endDate])
    
    
    otherwise x[Need List]
    
    )
    in
        #"Added Custom3"

    Luego podemos obtener la lista de fechas en la columna agregada, otra columna que no necesita, puede eliminarlas.

    Gracias por su tiempo y uso compartido, y gracias por su apoyo y comprensión de PowerBI.

    Saludos

    Aniya Zhang

    Si esta publicación ayuda, considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Administrator

      Hi , @Qotsa

      En mi código, el amarillo es el paso que devuelve la tabla así:

      Debe reemplazar el código fuente de su origen de datos y hacer que vuelva como la misma tabla anterior.

      Luego puede agregar los pasos azules debajo de él.

      Si su columna es diferente a la mía, puede modificarla ligeramente de acuerdo con las indicaciones.

      No necesita definir una función, solo necesita agregar "," y agregar los pasos que proporciono debajo de él. Y en el último "en" el último paso.

      Además, el siguiente texto es el nombre del paso en el Editor de Power Query, ¡puede verlos en los pasos! Y cada paso se ejecuta bajo el paso anterior.

      En Power Query, puede verlos todos:

      Gracias por su tiempo y uso compartido, y gracias por su apoyo y comprensión de PowerBI.

      Saludos

      Aniya Zhang

      Si esta publicación ayuda, considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Administrator

      Hi, @Qotsa

      Gracias por su rápida respuesta, los últimos dos días fueron fin de semana por lo que no puedo responderle de inmediato.

      Para su pregunta, ¿puede conectar su fuente de datos desde Mysql y hacer que la tabla de retorno sea así?

      Luego puede darme todas las capturas de pantalla de su interfaz del Editor de Power Query (quiero ver la columna si es la misma que yo), incluidos sus campos y los pasos que generó.

      Y debe copiarme todo el código M en el "Editor avanzado" de esta consulta en el Editor de Power Query.

      Si puedes, también puedes subir el. pbix a OneDrive y comparte tu enlace conmigo.

      Gracias por su tiempo y uso compartido, y gracias por su apoyo y comprensión de PowerBI.

      Saludos

      Aniya Zhang

      Si esta publicación ayuda, considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

      • Syndicate_Admin's avatar
        Syndicate_Admin
        Administrator

        @v-yueyunzh-msft TY por su asistencia hasta la fecha.

        My Advanced Editor tiene el siguiente código.

        dejar
        Source = MySQL.Database("34.252.51.71", "powerbi114", [ReturnSingleDatabase=true]),
        powerbi114_cmCarerAvailability = Source{[Schema="powerbi114",Item="cmCarerAvailability"]}[Data],
        #"Valor reemplazado" = Table.ReplaceValue(powerbi114_cmCarerAvailability,",","",Replacer.ReplaceText,{"day"}),
        #"Changed Type" = Table.TransformColumnTypes(#"Replacement Value",{{"day", Int64.Type}}),
        #"Columnas eliminadas" = Table.RemoveColumns(#"Tipo cambiado",{"created", "createdBy", "deleted", "deletedBy", "updated", "updatedBy", "companyId", "locationId", "adjustedStartDate", "startTime", "endTime"}),
        #"Added Custom" = Table.AddColumn(
        test, "start_Monday", (x)=>Date.AddDays(Date.StartOfWeek(x[startDate]),1)


        ),
        #"Added Custom1" = Table.AddColumn(#"Added Custom", "Accumul_list", (x)=>
        if x[week]=0 then null else if x[week]=1 then {0..( Duration.Days(Date.AddDays(Date.EndOfWeek(x[endDate]),1)-x[start_Monday])+1)/7-1}else if x[week]=2 then
        List.Generate(()=>0,each _<=(Number.RoundUp((Duration.Days(Date.AddDays(Date.EndOfWeek(x[endDate]),1)-x[start_Monday])+1)/7/2)-1)*2,each _+2) else 1),
        #"Added Custom2" = Table.AddColumn(#"Added Custom1", "Need List", (x)=>
        if x[Accumul_list]<> null then List.Sort(List.TransformMany(x[day_list],each x[Accumul_list],(x,y)=>y*7+x)) else x[endDate]
        ),
        #"Added Custom3" = Table.AddColumn(#"Added Custom2", "End List", (x)=>
        probar
        List.Select(List.Accumulate(x[Need List],{},(a,b)=> a& {Date.AddDays(Date.From(x[start_Monday]) ,b)} ),(z)=>z<=x[endDate])


        de lo contrario x[Lista de necesidades]

        )
        en
        #"Añadido personalizado3"

        PBIX -> https://1drv.ms/u/s!AiX0_cACeSxJgSqVYOQ7GmGUY8FG?e=dH6kJG

  • @v-yueyunzh-msft Necesito expandir la columna 'Lista final'. Para hacer esto, he intentado agregar la siguiente línea en el editor avanzado sin suerte.

    #"Added Custom4" = Table.TransformColumns(#"Added Custom3", {{"End List", each if _ = false then {false} else _}})

    ¿Podrías echar un vistazo al .pbix por favor?

    Archivo .pbix de OneDrive

    COMPAÑÍA