Power BI M代码中排除指定文本格式日期列表时遇类型转换错误的求助
Power BI M代码中排除指定文本格式日期列表时遇类型转换错误的求助
嗨,我来帮你搞定这个Power BI M查询里的日期排除问题!你遇到的cannot convert value to type list错误,核心原因是**ExcludeDate的类型不符合要求**——List.Contains函数要求第一个参数必须是**列表(List)**类型,但你的ExcludeDate大概率是单个文本值,或者是用逗号拼接的字符串,不是合法的M列表格式。
另外还要提一句:你原来的过滤逻辑是保留包含目标日期的行,但你的需求是排除这些日期,所以逻辑也需要调整一下。
解决方案步骤:
将用户输入的日期文本转换为合法列表
如果用户是通过文本框输入多个日期(比如格式为"29-08-23,28-08-23"),需要先把这个逗号分隔的文本拆分成M语言认可的列表:// 处理用户输入的日期文本,转换为列表(如果输入有空格,记得加Text.Trim去除) ExcludeDateList = List.Transform(Text.Split(ExcludeDate, ","), Text.Trim)修正过滤逻辑,排除目标日期
把原来的Filterfunction改成排除列表内日期的逻辑,同时使用转换后的列表:Filterfunction = (row) => not List.Contains(ExcludeDateList, row[#"ACTUAL_DATE - Copy"])
修改后的完整M代码:
let Portfolioname = #"Mapping-PortfolioName"[PortfolioName], SelectDelta = @#"Mapping Columns-03 PORT TE"[Column_Name], BqlQuery = BQL.Query("let(#report=dropna(PORT_ALL(report_name='03 PORT TE',classification_level=[" & Classification & "],dates=range(" & #"Delta Date-1" & ", "& #"Delta Date" &" , frq=D)), remove_id=true);)get(#report)for([" & Text.Combine( Portfolioname, ",") & "])preferences(addcols=all)"), SelectedColumns = Table.SelectColumns(BqlQuery, SelectDelta), Source = SelectedColumns, #"Sorted Rows" = Table.Sort(Source,{{"ACTUAL_DATE", Order.Ascending}, {"ID", Order.Ascending}}), #"Rounded Off" = Table.TransformColumns(#"Sorted Rows",{{"TOTAL_RISK_D_D", each Number.Round(_, 2), type number}}), #"Duplicated Column" = Table.DuplicateColumn(#"Rounded Off", "ACTUAL_DATE", "ACTUAL_DATE - Copy"), #"Changed Type" = Table.TransformColumnTypes(#"Duplicated Column",{{"ACTUAL_DATE - Copy", type text}}), // 新增:将用户输入的日期文本转换为列表 ExcludeDateList = List.Transform(Text.Split(ExcludeDate, ","), Text.Trim), // 修正过滤逻辑:排除列表中的日期 Filterfunction = (row) => not List.Contains(ExcludeDateList, row[#"ACTUAL_DATE - Copy"]), #"Filtered Rows" = Table.SelectRows(#"Changed Type", Filterfunction) in #"Filtered Rows"
额外说明:
- 如果你的
ExcludeDate已经是一个列表(比如直接定义为{"29-08-23", "28-08-23"}),那可以跳过文本转列表的步骤,直接用ExcludeDate代替ExcludeDateList即可。 - 一定要确保
ACTUAL_DATE - Copy列的文本格式和ExcludeDate里的日期格式完全一致,否则会出现匹配失败的情况(比如一个是"29-08-23",一个是"29/08/23"就匹配不上)。
备注:内容来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

