在SharePoint MOSS 2007中,我创建了一个自定义内容类型,我将应用于文档库。其中一个必填字段是“Incoming Date”,另一个是“截止日期”。
截止日期始终为入会日期后10个工作日。收件人日期是邮件收到信件的时间,不一定是文件张贴到图书馆时。
从这里开始:http://msdn.microsoft.com/en-us/library/bb862071.aspx
=DATE(YEAR([Incoming Date]),MONTH([Incoming Date]),DAY([Incoming Date])+10)
增加10天,但如何添加10个工作日?根据我们的sharepoint部署的治理计划,我没有VS.NET的奢侈品。
假设一个人负责数据输入,但我想让他们更容易。
答案 0 :(得分:4)
对于非常具体的“10天”要求,这是过度的,但这应该从任何开始日期计算任意天数的截止日期。
我写它是为了匹配Excel的WORKDAY函数的结果(假设计算字段中的每个函数都是Excel函数,那几乎应该是一个东西)。对于一周中的每一天,以及多年来,它都经过了1到146天的“完成”测试,没有任何不一致的迹象。除非我从Excel中复制它,否则它应该像宣传的那样工作。唯一的缺点是它没有假期,但如果用户习惯于SharePoint,他们无论如何都不会有期望。完全没有。任何形式的。为了任何东西。或希望。或者曾经负责微笑的脸上的肌肉。或者能够看到一个孩子,看到除了死亡惨淡的确定性之外的任何事情。所以,如果他们的任务在圣诞节到期,那就没什么大不了的了。它也比它可能需要的更加笨拙。
=[Start Date]+[Days to Complete]
+ ROUNDDOWN([Days to Complete]/5,0)*2
+ IF(WEEKDAY([Start Date])+MOD([Days to Complete],5)>=7,2,0)
- ROUNDDOWN(WEEKDAY([Start Date])/7,0)
+ IF(AND(MOD([Days to Complete],5)=0,WEEKDAY([Start Date])=1),-2,0)
+ IF(AND(MOD([Days to Complete],5)=0,WEEKDAY([Start Date])=7),-2,0)
第一行是......显而易见的。第二行增加了周末。接下来的4行调整了第二行的不足。
答案 1 :(得分:2)
首先,我应该指出你正在努力完成这个公式,这也会做同样的事情。
= [传入日期] + 10
根据评论,您已经发现10个工作日(M-F)将始终有2个周末,因此您可以使用此
= [传入日期] + 14
但这仍未考虑假期
如果没有工作流程中的某些自定义代码,或者某些javascript 'hack'以及您所在地区的假日天数据库,您将无法执行此操作。
一种可能性是将您的截止日期默认为从创建记录后的10个工作日
=今天+ 14
然后依靠您的用户手动更改此日期,如果在此期间有假期。
我刚刚撰写的博客文章中有关此内容的详细信息 - Working Days, Weekends and Holidays in SharePoint Calculated Columns
答案 2 :(得分:0)
也许您可以通过使用工作流程(可能是自定义工作流程)来管理到期日期来解决此限制?截止日期意味着它是一个可操作的项目,无论如何都应该分配给某人。
请注意,VS.NET不一定非常奢侈 - 您可以将其用于free。
答案 3 :(得分:0)
我相信我已经找到了一个相当防弹的方法来计算假期和周末的10个工作日截止日期。 1)计算2周时段是否为星期一,如果是,则仅添加11天(假设开始日计为10天时段的第1天)。否则,您将为10个工作日加上两个周末添加13(请记住,开始日期已计为第1天;如果您未将开始日期计为第1天,则变量将为12和14)。 2)为每个假日创建一个唯一的计算列,如果假日在该范围内,则返回值1。 3)通过在开始日期添加值(周末和假日)来确定您的“总日期”。 4)确定您的毛重日期是在星期六或星期日,如果是,请返回适当的天数推迟到星期一。 5)添加所有周末,假日,并将星期六和星期日值添加到您的开始日期,这将为您提供截止日期。
注意:我在这里看到的唯一挑战是假期将截止日期推迟到周末,然后将截止日期推迟到恰好是另一个假期的星期一。这在我的假期计划中没有发生,但可能在你的假期计划中。此外,您还需要每年不断添加新的假期,因此需要从头开始为长期运行的列表重新创建列数组。或者,您可以每年开始一个新的列表。
C_Wknd =IF(TEXT(WEEKDAY([Complaint Created On]),"ddd")="Mon",11,13)
C_NYDay =IF(AND([Complaint Created On]<=DATE(2009,1,1),([Complaint Created On])+C_Wknd>=DATE(2009,1,1)),"1","0")
C_MLKDay =IF(AND([Complaint Created On]<=DATE(2009,1,19),([Complaint Created On])+C_Wknd>=DATE(2009,1,19)),"1","0")
C_MemDay =IF(AND([Complaint Created On]<=DATE(2009,5,25),([Complaint Created On])+C_Wknd>=DATE(2009,5,25)),"1","0")
C_PresDay =IF(AND([Complaint Created On]<=DATE(2009,2,16),([Complaint Created On])+C_Wknd>=DATE(2009,2,16)),"1","0")
C_IndDay =IF(AND([Complaint Created On]<=DATE(2009,7,4),([Complaint Created On])+C_Wknd>=DATE(2009,7,4)),"1","0")
C_LabDay =IF(AND([Complaint Created On]<=DATE(2009,9,7),([Complaint Created On])+C_Wknd>=DATE(2009,9,7)),"1","0")
C_ColDay =IF(AND([Complaint Created On]<=DATE(2009,10,12),([Complaint Created On])+C_Wknd>=DATE(2009,10,12)),"1","0")
C_VetDay =IF(AND([Complaint Created On]<=DATE(2009,11,11),([Complaint Created On])+C_Wknd>=DATE(2009,11,11)),"1","0")
C_ThxDay =IF(AND([Complaint Created On]<=DATE(2009,11,26),([Complaint Created On])+C_Wknd>=DATE(2009,11,26)),"1","0")
C_XmsDay =IF(AND([Complaint Created On]<=DATE(2009,12,25),([Complaint Created On])+C_Wknd>=DATE(2009,12,25)),"1","0")
C_GrossDte =[Complaint Created On]+C_Wknd+C_NYDay+C_MLKDay+C_MemDay+C_PresDay+C_IndDay+C_LabDay+C_ColDay+C_VetDay+C_ThxDay+C_XmsDay
C_EndSat =IF(TEXT(WEEKDAY(C_GrossDte),"ddd")="Sat",2,0)
C_EndSun =IF(TEXT(WEEKDAY(C_GrossDte),"ddd")="Sun",1,0)
Resolution Due =C_GrossDte+C_EndSat+C_EndSun