0

我有两个视图:view1 和 view2。

view1 包含 26 名员工 (AZ) 的列表。

view2 包含每个员工每天创建的文档列表(每个员工每天只能创建 1 个文档)。这些文档中的每一个都包含创建它的员工的姓名,以及它的创建日期(不是内置的笔记创建日期)。这意味着,对于 2012 年 1 月,员工 A 有 31 个文档,2012 年 2 月 - 29 个文档,依此类推,直到今天(2012 年 8 月 16 日 - 2012 年 8 月有 16 个文档)。

我目前的情况是,对于某些员工来说,缺少文档。例如,员工 A 在 2010 年 4 月 27 日缺少文档,员工 B 在 2011 年 5 月 12 日和 2012 年 3 月 4 日缺少文档,员工 C 等等。缺少的文档因每个员工而异。有些没有丢失的文档,有些缺少多达 10 个文档。

现在我想检索缺少文档的日期并将其放在文本文件中。假设上面的员工 B 在上述日期缺少 2 个文档,因此在我的文本文件中我将显示“员工 B - 5/12/2011,3/4/2012”。但是,如果一开始它甚至不存在,我该如何检索它呢?

到目前为止,我只想计算一段时间的日期范围,比如 2010 年 1 月 1 日到 2012 年 8 月 16 日。计算该范围内有多少天,然后计算员工的总文档数。如果总文档不等于该范围内的天数,则缺少一些文档。但我仍然需要在哪个日期丢失文档。

4

2 回答 2

2

您知道 LotusScript 中的 List 数据类型吗?我认为您应该创建一个涵盖日期范围的详尽的布尔值列表。即,该范围内的每一天都有一个列表条目,日期作为列表标签,条目值指示是否找到了文档。您从一个初始化的列表开始,以便每个日期都是错误的:

Dim theDate As New NotesDateTime("1/1/2005")
dim endDate as New NotesDateTime("8/16/2012")
dim foundDates List as Boolean

While theDate.Timedifference(endDate) <= 0
  foundDates(theDate.dateOnly) = false
wend

您可能希望在函数中使用上述代码,以便可以为每个员工重新初始化列表。

现在,您需要代码遍历您的员工的一名成员的所有文档。从文档中读取日期项,并将相应的列表条目更改为 true。

dateObj = new NotesDateTime(doc.getItemValue("dateFieldName"))
foundDates(dateObj.dateOnly) = true

在遍历员工的文档后,您将拥有一个列表,其中包含找到的每个文档的日期为 true,而每个未找到的日期为 false。

现在,您现在可以使用 forall 来输出未找到的日期列表,只需检查仍然为假的条目即可。

print #textfile, StaffName;
ForAll dateEntry in foundDates
   if dateEntry = false then
      print #textfile, listtag(dateEntry)
   end if
End ForAll
print #textfile,

将上述所有内容包含在所有工作人员的循环中,确保在处理每个工作人员的文档之前将 foundDate 列表中的所有条目重新初始化为 false。

于 2012-08-16T03:54:37.127 回答
1

我认为解决此问题的最佳方法是遍历每个工作人员的日期范围并输出缺失的日期。

假设您正在考虑 lotusscript,例如(未经测试,视图的索引和日期的存储方式可能会导致问题)。

Sub Initialize
    Dim session As New NotesSession
Dim db As NotesDatabase
Dim viewStaff As NotesView
Dim viewDocs As NotesView
Dim docStaff As NotesDocument
Dim docDoc As NotesDocument
Dim keys(1) As String
Dim startDate As New NotesDateTime("1/1/2005") 'Start date of Range
Dim endDate As New NotesDateTime("1/1/2010") 'End date of Range  
Dim tempDate As NotesDateTime

'Initialise Views
Set db = session.currentDatabase
Set viewStaff = db.GetView("StaffView")
Set viewDocs = db.GetView("DocsByStaff")

'Iterate over staff to process
Set docStaff = viewStaff.Getfirstdocument()
While Not docStaff Is Nothing
    'Search for daily docs for this staff member (this will need a view indexed on the staff member name, then the date)
    keys(0) = docStaff.Fullname(0) 'Or whatever this item is called

    Set tempDate = startDate
    While tempDate.Timedifference(endDate) <= 0 'Go over each date up to and including the end date
        keys(1) = tempdate.Dateonly
        Set docDoc = viewDocs.getDocumentByKey(keys) 'Search for date using current user and date
        If docDoc Is Nothing Then 'Haven't found it
            Print "Can't find document for " + keys(0) + " on " + keys(1) ' Could output to file or something here.
        End If
        tempDate.Adjustday(1) 'Roll forward another day
    Wend

    Set docStaff = viewStaff.getNextDocument(docStaff) 'Next staff member
Wend

End Sub

可能不是最有效的方法,但如果它只是偶尔出现并且您没有太多文档,那么这种方法就足够了。

于 2012-08-16T02:56:22.627 回答