SharePoint保留 - 更新项目时不会重新计算到期日期

时间:2016-08-31 15:24:36

标签: sharepoint sharepoint-2013

我几天来一直在讨论这个问题:

想象一下计算到期日的自定义保留公式。公式根据创建日期和另一个日期字段(AvailableUntil)计算到期日期。如果尚未传递“其他”日期字段,则该项目不能过期,因此无法设置过期日期。要完整,请参阅我的公式代码,但我确信一切正常。

public DateTime? ComputeExpireDate(Microsoft.SharePoint.SPListItem item, System.Xml.XmlNode parametersData)
    {
        DateTime? expiracyDate = null;

        Logger l = new Logger(DiagnosticsCategory.Retention);
        l.Info("Calculating expiration date for messages - archive creation date + available until");

        RetentionRepository retentionRepository = new RetentionRepository(l, new Guid(Constants.RetentionModuleGUID), item.ParentList.ParentWeb.Site);

        RetentionPolicy policy = null;

        SPSecurity.RunWithElevatedPrivileges(delegate
        {
            policy = retentionRepository.GetPolicy(new Guid(Constants.RetentionModuleGUID));
        });

        if (policy != null)
        {
            DateTime createDate = SPUtility.ParseDate(item.ParentList.ParentWeb, item[SPBuiltInFieldId.Created].ToString(), SPDateFormat.DateTime, false);
            DateTime? availableUntilDate = null;

            try
            {
                availableUntilDate = SPUtility.ParseDate(item.ParentList.ParentWeb, item[CoreConstants.Constants.AvailableUntil_FieldInternalName].ToString(), SPDateFormat.DateTime, false);
            }
            catch (Exception ex)
            {
                l.Error(ex.Message);
            }

            if (policy.ArchiveDays > 0)
            {
                expiracyDate = createDate.AddDays(policy.ArchiveDays);
            }

            if (policy.ArchiveMonths > 0)
            {
                expiracyDate = createDate.AddMonths(policy.ArchiveMonths);
            }

            if (policy.ArchiveYears > 0)
            {
                expiracyDate = createDate.AddYears(policy.ArchiveYears);
            }

            if ((availableUntilDate != null && availableUntilDate > DateTime.Now) || (expiracyDate != null && expiracyDate > DateTime.Now))
            {
                // Available until date is not yet passed, no retention!
                // Never set an expiracy date in the future
                expiracyDate = null;
            }

            l.Info("Calculated expiracy date: " + expiracyDate.ToString());
        }
        else
        {
            l.Error("Could not retrieve the policy for " + Constants.RetentionModuleName);
        }

        return expiracyDate;
    }

该政策已添加到列表中的内容类型上。

现在发生了什么:

  • 我在列表中添加一个项目:计算到期日期(无论是返回日期还是null,它都完成了它的工作)。
  • 现在假设我修改了该项,更具体地说是AvailableUntil日期字段。

我认为修改原始项目会在下次我的“信息管理策略”计时器作业运行时重新计算到期日期。情况似乎并非如此。

任何人都可以协助我如何强制重新计算到期日期吗?我是唯一一个没有找到这种正常行为的人。到期日期只计算一次和一次。

我可以重新计算到期日期的唯一方法是在列表内容类型上重新应用策略,但在我们的脚本中似乎有点过载。

我们认为在ComputeExpireDate方法中返回'null'会将项目的保留日期设置为null。然后我们推断SharePoint将重新计算,直到日期设置为到期。事实并非如此。

任何人都可以对此有所了解吗?我将非常感激!

1 个答案:

答案 0 :(得分:1)

似乎问题来自使用PowerShell更新项目的字段。如果我使用powershell更新项目(以更早地设置创建日期以测试保留),则清除_dlc_ExpireDate但不“标记”以设置为重新计算。

如果我们通过网络编辑项目,似乎事件接收者正在重新计算到期日期。