注释 公式 语言 日期 差异

Posted

技术标签:

【中文标题】注释 公式 语言 日期 差异【英文标题】:Notes Formula Language Date Difference 【发布时间】:2017-08-30 13:38:51 【问题描述】:

我想构建一个仅包含最新文档(超过 2 个月)的视图。我正在使用这个选择公式:

SELECT  @IsAvailable($Conflict) and docForm="ServiceOrders" and (@Today-PosDesValidFrom)<5259600

其中 5259600 是以秒为单位的 2 个月,因为我读到 - 运算符以秒为单位返回时间跨度。 我认为没有任何结果。

【问题讨论】:

【参考方案1】:

从不在视图选择公式中使用@Today 或@Now。视图索引将永远不会是最新的,因此更新任务将不断运行以刷新索引。这将对性能产生负面影响。

您应该做的是每天(在您的情况下可能是每晚)代理将标记要在视图中显示的文档。 要使代理尽可能快,请处理一个视图,其中您在其中一列中显示日期。

绝对最快的应该是这样的: 1) 创建一个名为(LookupServiceOrdersByValidDate)的隐藏视图。 2)第一列将包含字段名称PosDesValidFrom(我假设它是一个日期字段,否则您需要将其转换为日期),并按降序排序。转到该列信息框中的第四个选项卡,并确保将其设置为日期/时间。 3) 创建第二列,在其中显示文本字段DisplayIn2MonthView。降序排序。 4) 保存视图。

您现在有了一个可以使用代理循环遍历的视图。由于它是按最新的降序排列的,所以一旦到达 2 个多月前的日期,您就可以停止代理并完成。

脚本看起来像这样:

Dim session as New NotesSession
Dim db as NotesDatabase
Dim view as NotesView
Dim col as NotesViewEntryCollection
Dim entry as NotesViewEntry
Dim doc as NotesDocument
Dim validDate as NotesDateTime
Dim cutoffDate As NotesDateTime

' Get current date and time and go back 2 months
Set cutoffDate = New NotesDateTime(Now())
Call cutoffDate.AdjustMonth(-2)
' Drill down to view
Set db = session.CurrentDatabase
Set view = db.GetView("(LookupServiceOrdersByValidDate)")
' Create a collection of all entries in the view and loop through them
Set col = view.AllEntries
Set entry = col.GetFirstEntry()
Do Until entry is Nothing
    ' Get value in first column in view and use it to create new DateTime object
    validDate = New NotesDateTime(entry.ColumnValues(0))
    ' Check if we are within the 2 month cutoff date
    If Cdat(validDate.dateOnly)>=Cdat(cutoffDate) Then
        ' Get document and set flag to display
        Set doc = entry.Document
        Call doc.ReplaceItemValue("DisplayIn2MonthView","Yes")
        Call doc.Save(True,False)
    Else
        ' We are beyond the cutoff date, but we need to clear old flags.
        ' Read the value in the second column and see if it is "Yes"
        If entry.ColumnValues(1)="Yes" Then
            Set doc = entry.Document
            Call doc.ReplaceItemValue("DisplayIn2MonthView","")
            Call doc.Save(True,False)
        Else
            ' Since all "Yes" values should be at the top, if we
            ' get here there should be no more flagged documents.
            Exit Do
        End If
    End If
    Set entry = col.GetNextEntry(entry)
Loop
Print "All done."

最后,修改视图以显示文档。您可能应该使用Form 字段,而不是docForm。将选择公式设置为SELECT !@IsAvailable($Conflict) AND Form="ServiceOrders" AND DisplayIn2MonthView="Yes" 该视图现在应该只包含过去 2 个月内具有 ValidDate 的 ServiceOrder 文档。 如果您真的只想在视图中复制/保存冲突,请确保将视图设置为 not 在层次结构中显示响应文档(取消选中该框):

【讨论】:

这是一个非常聪明的想法,不幸的是我没有在表单中创建新字段的权限。 由于某种原因,我在这里的 cutoffDate 出现类型不匹配:CDat(validDate.dateOnly)>=CDat(cutoffDate) @exasswede 这种解决方案对我来说很有效,但问题是在代理运行视图之前,新订单不会出现。 另一种选择是使用 db.search() 方法创建 NotesDocumentCollection,然后在 DC 上使用 .stampAll() 方法。 @curnir:关于类型不匹配,调试器怎么说?我在回复中直接在此处编写了该代码,因此未经测试。您在哪一行得到错误?如果您希望立即显示新文档,只需颠倒逻辑即可。将标志设置为“否”并过滤掉任何具有该值的文档,而不是包括具有“是”的文档。而且您实际上不需要在表单上创建新字段,通过使用 doc.ReplaceItemValue() 您可以直接在文档中创建包含数据的字段。这就是 Domino 等无模式 NoSQL 数据库的美妙之处。

以上是关于注释 公式 语言 日期 差异的主要内容,如果未能解决你的问题,请参考以下文章

浅谈 pid的原理与差异

用openpyxl向下计算公式

c语言编写万年历时计算每月第一天是星期几的公式是啥

VBA 将公式转换为注释

产品生产成本核算中,生产订单差异计算逻辑及生产订单成本公式

谁知道怎么用C语言编写万年历啊