忽略 Power BI 查询中的空白调用自定义函数
Posted
技术标签:
【中文标题】忽略 Power BI 查询中的空白调用自定义函数【英文标题】:Ignoring Blanks in Power BI Query Invoke Custom Function 【发布时间】:2020-05-22 22:20:07 【问题描述】:我在 Power BI Desktop 的空白查询中使用以下代码:
(InitialDate as date, FinalDate as date ) as number =>
let
DaysBetweenDates = Duration.Days(FinalDate-InitialDate),
DaysList = List.Dates(List.Min(InitialDate,FinalDate),Number.Abs(DaysBetweenDates), Duration.From(1)),
WeekDaysList = List.Select(DaysList, each (Date.DayOfWeek(_, Day.Monday) < 5) ),
WorkingDays = (if DaysBetweenDates < 0 then -1 else 1) * List.Count(WeekDaysList)
in
WorkingDays
计算两个给定日期之间的工作日(即不包括周六和周日)的代码。我在向查询中添加列时使用调用自定义函数,如下所示:
Invoke Custom Function
问题是,当一个或两个日期为空(空白)时,调用的函数返回错误。见下文:
Error
如何更改代码以忽略一个或两个日期为空/空白的情况,只返回空白?
如果不可能,有没有办法在 DAX 中实现相同的功能?
谢谢!
【问题讨论】:
【参考方案1】:您可以首先检查您是否有有效的日期并在 if 语句中使用它,然后您可以确保为您的计算赋予空日期值(即使您不使用它们)
let
ValidDates = FinalDate <> null and InitialDate <> null,
InitialDate = if InitialDate = null then DateTime.LocalNow() else InitialDate,
FinalDate = if FinalDate = null then DateTime.LocalNow() else FinalDate,
DaysBetweenDates = if ValidDates then Duration.Days(FinalDate-InitialDate) else 0,
...
WorkingDays =if ValidDates then (if DaysBetweenDates < 0 then -1 else 1) * List.Count(WeekDaysList) else null
in
ps 没有测试代码
【讨论】:
嗨@Aldert。代码不起作用,当其中一个字段为空白/空时,我仍然在查询中收到错误。我刚刚修改了我的代码,在“let”和“in”之间添加了你的行。也许问题出在第一行,其中 InitialDate 和 FinalDate 被视为日期值并且可以将 null 转换为值?谢谢。 我相信这与您使用空日期进行计算有关。您可以尝试在为空时给 InitalDate 和 FinalDate 一些值,请参阅调整后的答案【参考方案2】:Power Query 具有错误处理功能。也许这就是你可以解决这个问题的方法。
这里是关于错误处理的 https://docs.microsoft.com/en-us/powerquery-m/errors
你可以这样做
DaysList = try List.Dates(List.Min(InitialDate,FinalDate),Number.Abs(DaysBetweenDates), Duration.From(1)),
WeekDaysList = if DaysList[HasError] then <handle this somehow> else List.Select(DaysList[Value], each (Date.DayOfWeek(_, Day.Monday) < 5) ),
【讨论】:
【参考方案3】:我正在使用从 Youtube 找到的确切代码:https://www.youtube.com/watch?v=bs3yzmf9elA
在 cmets 中,创建者建议如何完全按照您的要求进行操作:
1. Invoke Custom Function normally
2. When the formula bar has processed the function, add "try" right after the word "each"
3. Add "otherwise null" right before the final parenthesis
在创建者的情况下,该函数称为 Query1。代码基本上是检查公式中是否有错误并在给你最终输出之前返回 null
= Table.AddColumn(#"Removed Columns1", "Query1", each try Query1([Initial], [Final]) otherwise null)
上面的代码帮助我处理丢失的日期。但我注意到天数的计算没有考虑假期。这就是我现在正在努力进行的排序!哈哈。
希望这会有所帮助!
【讨论】:
【参考方案4】:我遇到了同样的问题。 您需要接受不按类型指定的参数并假设它将是日期,否则为空:
(InitialDate, FinalDate ) as number =>
if InitialDate = null or FinalDate = null then 0
else
let
DaysBetweenDates = Duration.Days(FinalDate-InitialDate),
DaysList = List.Dates(List.Min(InitialDate,FinalDate),Number.Abs(DaysBetweenDates), Duration.From(1)),
WeekDaysList = List.Select(DaysList, each (Date.DayOfWeek(_, Day.Monday) < 5) ),
WorkingDays = (if DaysBetweenDates < 0 then -1 else 1) * List.Count(WeekDaysList)
in
WorkingDays
【讨论】:
以上是关于忽略 Power BI 查询中的空白调用自定义函数的主要内容,如果未能解决你的问题,请参考以下文章