今天计算列问题的任何解决方案都是SharePoint?

时间:2009-05-18 17:04:41

标签: sharepoint formula

我希望能够在SharePoint列表的计算列中使用今天的日期,以确定任务是否过期。有一个详细记录的技巧,包括创建一个名为“今天”的虚拟列,在公式中使用它,然后删除它,从而“欺骗”SharePoint使用Today函数。

问题是这种方法不能可靠地工作 - 计算不是动态的;它仅在保存项目时生成,因此今日“列”实际上成为修改日期。 (这可能就是为什么SharePoint不会让你以直截了当的方式使用Today功能。)

有没有人找到有效的解决方案?我知道我可以使用javascript来获取客户端的实际日期并显示颜色,标记等等,但我正在寻找“服务器端”解决方案。


作为参考,今日专栏技巧及其问题在这两篇文章和相关评论中得到了很好的描述: http://blogs.msdn.com/cjohnson/archive/2006/03/16/552314.aspxhttp://pathtosharepoint.wordpress.com/2008/08/14/calculated-columns-the-useless-today-trick/

9 个答案:

答案 0 :(得分:4)

对此没有解决方法。由于列表的值存储在数据库中并“按原样”返回到其他特征(例如搜索爬行器),因此无法创建动态字段。

可以在计算中使用今天的日期创建一个显示值的自定义字段。

答案 1 :(得分:4)

除了Christophe(PathToSharePoint)的文章外,这篇文章还介绍了今日伎俩及其无效的原因

The Truth about using Today in calculated columns

有很多软糖,可能最好的是Dessie的控制台应用程序(上面提到的MNM)

Dynamically updating a SharePoint calculated column containing a Today reference

它很好但不完美,例如你可能不得不担心不同的时区。

在走这条路之前,你应该问问自己,你是否真的需要这样做。例如: -

答案 2 :(得分:1)

如果您创建Today列,则需要更新。您可以使用计时器作业或在用户点击的页面上放置jquery脚本来执行此操作。该脚本可以调用SPServices.SPUpdateMultipleListItems来执行更新。传递CAML子句,以便只更新需要更新Today值的列表项,例如每天一次。

答案 3 :(得分:0)

我的建议是创建您的on字段,为您执行此计算,然后在SharePoint列表中引用它。不是一个简单的实现,但它会起作用。

答案 4 :(得分:0)

我一直在寻找解决方案,但仍然没有运气..今日专栏技巧有不动态的限制。

我确实有一个建议,为什么我们不创建一个计时器作业,它将在每天上午12点用当前日期更新某个特定列。我知道你们中的一些人可能会认为这是一个头脑。只是我的建议:D !!

答案 5 :(得分:0)

我提出了一个非常粗略但有效的解决方案来解决这个问题而无需进行任何编码。我将解释我如何制作今日专栏以及我如何将其用于过期专栏,因为该栏目很难找到如何做。

首先,我创建了一个名为“今天”的栏目(喘气!)。接下来,我创建了一个名为“Days Overdue”的专栏。然后我打开了sharepoint设计师并创建了一个新的工作流程。我将其设置为每次编辑/更新项目时运行(请记住,我关闭了此列表的版本控制,否则我将不得不求助于编码以避免在我们的服务器上构建一堆无用的数据)。我将操作设置为简单地将修改日期存储在工作流变量中,然后将today列的值更改为该变量。虽然修改后的列是日期/时间,而我今天的列只是一个日期,但它转移得很好。然后我将工作流程设置为暂停2小时。您可以将此设置为您想要的任何时间,它只会更改您今天列更新的最新可能时间,即我的情况下的2AM。

到了过期的日子栏目。这是那个人的代码 -

=IF([Due Date]>Today,"None",IF([Date Closed]=0,Today-[Due Date],IF([Due Date]>[Date Closed],"None",IF(Today>=[Date Closed],[Date Closed]-[Due Date],IF([Due Date]<Today,Today-[Due Date])))))

以天数显示数字形式的逾期天数,或者如果未逾期,则显示“无”。您可以使用数字格式或字符串格式,但不能使用日期格式。嗯,我希望这可以帮助任何遇到这个问题并且不想深入研究编码的人。

编辑:我忘记在上面的代码中说过了过期的日期栏,我说如果今天已经过了关闭日期,则使用截止日期减去截止日期而不是今天减去截止日期,以确保在项目关闭后计算不会继续发生。你可能会注意到在代码中,但我觉得我应该指出它以防万一。

编辑2:在我的计算列的第二次编辑之前,我所处的代码没有在问题被标记为“已关闭”之后正确计算过期日期。我输入了更新的代码。代码的最后一部分没有意义,因为它与开头的逻辑相同,但它起作用所以我不想冒任何机会! :)

和平。

答案 6 :(得分:0)

我使用了以下内容并且没有任何问题。

字段名称:逾期

字段类型:已计算

返回的数据类型:是/否

式: =AND([Due Date]<NOW(),Status<>"Completed",[Due Date]<>"")

答案 7 :(得分:-1)

这是一种解决方法:

创建名为Today的日期列。 在计算的公式中使用此列(忽略公式返回错误值的事实)。 完成公式后,从列表中删除“今日”列。

由于某种原因它以这种方式工作!现在,Sharepoint将您公式中的今天视为今天的日期。

注意:如果您决定要更改公式,则必须再次创建“今日”列。否则,它不会将今天视为有效列。

答案 8 :(得分:-1)

我试过@ Farzad的方法,似乎工作得很好。我想在经过天数上进行自定义计数,因此添加了一个计算列,之前我使用了创建日期修改日期之间的差异列,只有在用户更新帖子时才会显示,这令我感到沮丧。

我现在有一个按照我想要的方式运行的公式并使用今天列,这里适用于任何想要使用它的人。我还有一个状态列,在此基础上使用了保持基数,剩下的公式基于今天 - 创建的日期差异。

=IF(Status="On Hold","On Hold",IF(AND(Today=Created,(DATEDIF(Created,Today,"D")=0)),"New",IF(AND(Today<>Created,(DATEDIF(Created,Today,"D")=0)),"New (updated)",IF(DATEDIF(Created,Today,"d")>3,"Need Update Immediately",IF(DATEDIF(Created,Today,"d")=1,"One day old",IF(DATEDIF(Created,Today,"d")=2,"Two days old",""))))))

基本上它只是一堆嵌套的 IF 条件,它为我提供了标签,我可以根据这些标签在视图中添加一个组,并在需要时过滤掉数据。希望这有助于任何寻找答案的人!