首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Power查询-从部件更改寄存器创建历史记录表

Power查询-从部件更改寄存器创建历史记录表
EN

Stack Overflow用户
提问于 2021-09-21 17:50:43
回答 1查看 211关注 0票数 0

希望一个强大的查询忍者可以帮助解决这个…

引用附件,我有两个表,第一个ChangeRegTBL是一个动态表(目前有一些7500+线长),它将我们实现的更改附加到构建/装配线中。在某些情况下,这些部件号的更改将再次更改为新编号(…)。在某些情况下,是7-8次!

我想要的是一个表(在参考附件中显示为ChangeHistTBL ),它列出了“旧”的每个部分的历史以及它取代的“新”部分是什么,如果更改不止一次,则为计数,最后是汇总日期、更改请求和部分细节的历史表。

现在我经历了多次合并,等等,…但它只是混乱,缓慢,当然不处理一个动态的桌子。

试着处理好名单。累加函数…我觉得解决办法就在这个范围内

干杯

好的,我似乎不能添加一个工作簿作为附件,但可以发送这个如果需要!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-22 10:22:01

尝试使用List.Generate为每个部件编号生成一个部件历史记录,如您的表中所示,使用List.PositionOf为下一个历史步骤在Old Part列中找到New Part

该算法在“旧部件”列中对“新部件”进行一系列查找,然后将相应的历史条目添加到与“旧部件”关联的“部件历史记录”列表中。

不确定这种方法是否会更快,但应该是动态的:

请参阅代码中的注释。问是否有不清楚的事情

M码

编辑后的将部件新列更改为列表中的持久列

编辑以在当前行启动List.Generate循环

编辑以消除原始零件编号重复使用时的循环循环()

代码语言:javascript
复制
let
    Source = Csv.Document(File.Contents("C:\Users\ron\OneDrive\Documents\ChangeReg.csv"),[Delimiter=",", Columns=5, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Index", Int64.Type}, {"Change Ref", type text}, {"Part Old", type text}, {"Part New", type text}, {"Part Description", type text}}),

 //Create Part History column
     ph = Table.AddColumn(#"Changed Type", "hist", each 
            let 
                cr = Text.Split([Change Ref]," ")
            in  cr{1} & "_" & [Part New] & "_" & cr{0} & "_" & [Part Description]),
    #"Removed Columns" = Table.RemoveColumns(ph,{"Change Ref", "Part Description"}),

//create list of part histories and successor part number
    #"Added Custom" = Table.AddColumn(#"Removed Columns", "phList", each 
    let 
        //start search at current row
        newPart = List.RemoveFirstN(ph[Part New],[Index]),
        oldPart = List.RemoveFirstN(ph[Part Old],[Index]),
        partHist = List.RemoveFirstN(ph[hist],[Index]),
        index = List.RemoveFirstN(ph[Index],[Index]),
        trace = List.Generate(()=> [newP=newPart{0}, hist=partHist{0}, idx= index{0}],
                        each [idx] <> null,
                        each 
                            let 
                                //note that if [newP] not found then List.PositionOf => -1
                                i = List.PositionOf(oldPart,[newP])
                            in  if i > index{0} then 
                                    [newP = newPart{List.PositionOf(oldPart,[newP])},
                                     hist = partHist{List.PositionOf(oldPart,[newP])},
                                     idx = index{List.PositionOf(oldPart,[newP])}]
                                else 
                                    [idx=null])
    in 
        trace),
    #"Removed Columns1" = Table.RemoveColumns(#"Added Custom",{"Part New", "hist"}),

//Add last part number in the sequence
    #"Added Custom1" = Table.AddColumn(#"Removed Columns1", "Part New", each List.Last([phList])[newP]),

//count number of times the part number changed
    #"Added Custom2" = Table.AddColumn(#"Added Custom1", "Superceded Count", each List.Count([phList])),

//concatenate history of all the changes in the part numbers
    #"Added Custom3" = Table.AddColumn(#"Added Custom2", "Part History", each List.Accumulate([phList],"",
        (state,current)=> if state = "" then current[hist] else state & "#(lf)" & current[hist])),

    #"Removed Columns2" = Table.RemoveColumns(#"Added Custom3",{"phList"})
in
    #"Removed Columns2"

结果

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69273423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档