【问题标题】:SharePoint Retention - Expiration date not re-calculating when item is updatedSharePoint 保留 - 更新项目时未重新计算到期日期
【发布时间】:2016-09-01 16:00:40
【问题描述】:

这几天我一直在为这个问题头疼:

想象一个计算到期日期的自定义保留公式。该公式根据创建日期和另一个日期字段 (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 会重新计算,直到某个日期设置为到期。显然不是这样。

有人能解释一下吗?我将不胜感激!

【问题讨论】:

    标签: sharepoint sharepoint-2013


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多