Forum Discussion

iainh's avatar
iainh
Frequent Visitor
1 year ago
Solved

Dynamic number of calculated columns (Project Online schedule dates)

Hi all   I've been picking my brains over this problem for a while and I would like to get wider input from people that know more than me.    With the Project Online data I've developed a way to ...
  • AntrikshSharma's avatar
    1 year ago

    iainh Here is a more refined approach in case there are duplicate publish dates, refer to Solution2

     

    let
        Source = Data,
        Unpivot = 
            Table.UnpivotOtherColumns ( Source, { "Project #" }, "Publish#", "Published On" ),
        RemoveBlanks = 
            Table.SelectRows ( Unpivot, each [Published On] <> " " and [Published On] <> null ),
        ChangedType = 
            Table.TransformColumnTypes (
                RemoveBlanks,
                { { "Published On", type date }, { "Project #", Int64.Type } },
                "en-GB"
            ),
        GroupedRows = Table.Group (
            ChangedType,
            { "Project #" },
            {
                {
                    "Transform",
                    each
                        let
                            a = _,
                            b = a[Published On],
                            c = 
                                List.Accumulate (
                                    b,
                                    [ Dates = { List.First ( b ) }, vsPrevious = { 0 }, vsNext = { 0 } ],
                                    ( s, c ) =>  
                                    [
                                        Dates = s[Dates] & { c },
                                        vsPrevious = 
                                            s[vsPrevious] 
                                                & { Duration.Days ( c - List.Last ( s[Dates] ) ) },
                                        vsNext = 
                                            s[vsNext] 
                                                & { 
                                                    Number.Abs ( 
                                                        Duration.Days ( List.Last ( s[Dates] ) - c ) 
                                                    ) 
                                                }
                                    ]
                                ),
                            d =
                                Record.TransformFields (
                                    c,
                                    {
                                        { "vsPrevious", List.Skip },
                                        { "vsNext", each List.Skip ( _ , 2) & {0} }
                                    }
                                ),
                            e = { { "n - 1" } & d[vsPrevious] } & { { "n + 1" } & d[vsNext] },
                            f = Table.ToColumns ( Table.DemoteHeaders ( a ) ),
                            g = Table.PromoteHeaders ( Table.FromColumns ( f & e ) )
                        in
                            g
                }
            }
        ),
        CombineTables = 
            Table.Combine ( 
                GroupedRows[Transform], 
                type table [
                    #"Project #" = Int64.Type,
                    #"Publish#" = text, 
                    Published On = date, 
                    #"n - 1" = Int64.Type, 
                    #"n + 1" = Int64.Type
                ] 
            )
    in
        CombineTables

     

    File attached below