Lotus脚本文档创建了属性奇怪的行为

时间:2018-02-05 12:33:34

标签: lotus-notes lotus-domino lotusscript lotus

我目前正在使用domino desginer 8.5.2,我遇到了与notesdocument Created属性相关的奇怪事情。

我正在尝试在lotusscript中创建一个代理,根据创建日期选择一些文档。

我有以下测试代码,其中doc是特定NotesDatabase中的NotesDocument:

If doc.Created < DateNumber(1951,1,1) Then
    Print "old"
End If

问题是数据库中没有比2010年更早的文档但上面的代码打印某些文档的“旧”(例如5k中的10),但是当我进入调试会话并检查doc的Created属性时在Variables窗口中,它是一个正常的日期,如2012. 02. 03.或smth。

另一个有趣的注意事项是,如果我尝试将创建的日期写入csv文件,这是一个无意义的日期,如1896. 06. 20.但是当我在调试时检查属性时,它是完全正常的。

你以前遇到过这个问题吗?或者我是以错误的方式比较日期?

---- EDIT1 ------------

我过分简化了这个问题,如果它有误导性我真的很抱歉我只能谦卑地要求你保留这些想法,因为解决这个问题至关重要。

有问题的代理不处理它自己的文件,它在服务器上打开多个数据库(很多人的邮件数据库),并按多种条件处理文件(电子邮件)。我们实际做的是:

    strFileName = "D:\temp\log.csv"
    Set nStream = session.CreateStream()
    nStream.Open(strFileName)
    nStream.Truncate

    Dim deleteCutoffDate As New NotesDateTime("Today")
    Dim moveCutoffDate As New NotesDateTime("Today")
    Dim tmp As Integer
    tmp = settingsDto.GetDeleteOlderThanMonths()
    Call deleteCutoffDate.Adjustmonth((-1)*tmp, True)

    searchForm$ = {Form = "Memo" }
    Set doccol = db.Search(searchForm, Nothing, 0) 'db is an opened NotesDatabase
    Set doc = doccol.GetFirstDocument

    While Not doc Is Nothing 
        Dim nextDoc As NotesDocument
        Set nextDoc = doccol.Getnextdocument(doc)

        'Earlier condition we tried            
        'If doc.Created < deleteCutOffDate.Lslocaltime
        ' deleteCutoffDate is today - 3 years
        If (Fix( doc.Created ) < Fix( CDat(deleteCutoffDate.Dateonly))) Then

                    'Suggested solution to check dates
                    Dim longTemp As Long
                    longTemp = Fix( CDat(deleteCutoffDate.Dateonly))        'should be 36,647 (#days from Dec 30, 1899 to May 1, 2000) 
                    longTemp = Fix( doc.Created )     'check this number makes sense (see last line)!

                'This is only for logging, testing.
                Dim temp As String
                temp = Format( doc.Created, "yyyy-mm-dd")+";"+doc.Noteid+";"
                Call nStream.WriteText(temp,EOL_PLATFORM)


                '******* Processing logic goes here **********

        End If
        Set doc = nextDoc 
    Wend 
Call nStream.Close()

所以我到目前为止看到的问题和症状:

有些文件(总是一样的)有很奇怪的创作日期。假设我们有3个文件A,B,C。

当我将文档A的Created属性写入csv时,它说1899-12-30当我检查调试器时doc.Created是2015-01-06这是正确的日期但是Fix(doc.Created)是0.这没有意义。这不能通过if条件并根据Fix beeing 0写入csv但是确实如此。

文件B的日期是1899年的csv,调试器说2015-10-25,修复(doc.Created)报告正确的数字但是这个文件不应该通过If条件,因为if只允许3年以上的文件通过从今天开始。因此,如果我在'18 -02-07上运行脚本,那么在15-02-07之前创建的文档应该通过该条件。

文件C的日期是4916-04-18其他一切与上述相同 这些问题适用于多个(但始终在同一个)文档上。但这些不是特殊文件,也不是简单的电子邮件

我注意到的另一件事是,如果我连续多次运行脚本(没有调试或干扰),有时CSV会报告正确的日期!对我来说,这表明某种参考问题,但在这一点上,我不确定世界是如何运作的。

请注意,没有涉及其他处理逻辑,If条件中的所有逻辑都已被注释掉,即操纵文档。测试数据库已恢复到原始状态

如果您有任何想法,请不要拖延我已经坚持这个问题好几天了。

由于

3 个答案:

答案 0 :(得分:0)

看起来你要做的事情应该可以正常工作。我认为创建的日期来自doc通用id的一部分,所以如果以编程方式设置它,就有可能看到创建日期看起来很旧的文档。

我建议您尝试以下方法,看看是否可以找出问题所在

dim longTemp as long
dateTemp = cdat( "May 1, 2000" )
longTemp = Fix( dateTemp )        'should be 36,647 (#days from Dec 30, 1899 to May 1, 2000) 
longTemp = Fix( doc.Created )     'check this number makes sense (see last line)!
If doc.Created < dateTemp then
    print "old"
end if

重新将doc.created写入csv文件,我建议在写入之前将其格式化为文本,所以

format( doc.created, "yyyy-mm-dd")   'or your preferred date format

答案 1 :(得分:0)

我放弃了。是时候试试并建议解决方法了!这些都可能起作用吗?

解决方法1:公式

而不是if块,在doccol的搜索公式中构建日期条件。无论如何,这可能更快。

    strFileName = "D:\temp\log.csv"
    Set nStream = session.CreateStream()
    nStream.Open(strFileName)
    nStream.Truncate

    Dim deleteCutoffDate As New NotesDateTime("Today")
    Dim moveCutoffDate As New NotesDateTime("Today")
    Dim tmp As Integer
    tmp = settingsDto.GetDeleteOlderThanMonths()
    Call deleteCutoffDate.Adjustmonth((-1)*tmp, True)

    searchForm$ = {Form = "Memo" & @Created < [} + deleteCutoffDate.LocalTime + {]} '<--- removed if block and put criteria checking here
    Set doccol = db.Search(searchForm, Nothing, 0) 'db is an opened NotesDatabase
    Set doc = doccol.GetFirstDocument

    While Not doc Is Nothing 
        Dim nextDoc As NotesDocument
        Set nextDoc = doccol.Getnextdocument(doc)

        'Earlier condition we tried            
        'If doc.Created < deleteCutOffDate.Lslocaltime
        ' deleteCutoffDate is today - 3 years
                    'Suggested solution to check dates
                    Dim longTemp As Long
                    longTemp = Fix( CDat(deleteCutoffDate.Dateonly))        'should be 36,647 (#days from Dec 30, 1899 to May 1, 2000) 
                    longTemp = Fix( doc.Created )     'check this number makes sense (see last line)!

                'This is only for logging, testing.
                Dim temp As String
                temp = Format( doc.Created, "yyyy-mm-dd")+";"+doc.Noteid+";"
                Call nStream.WriteText(temp,EOL_PLATFORM)


                '******* Processing logic goes here **********
        Set doc = nextDoc 
    Wend 
Call nStream.Close()

解决方法2:通过NotesDateTime过滤?

也许这会起作用?

    strFileName = "D:\temp\log.csv"
    Set nStream = session.CreateStream()
    nStream.Open(strFileName)
    nStream.Truncate

    Dim deleteCutoffDate As New NotesDateTime("Today")
    Dim moveCutoffDate As New NotesDateTime("Today")
    Dim createdDate As NotesDateTime '<----
    Dim tmp As Integer
    tmp = settingsDto.GetDeleteOlderThanMonths()
    Call deleteCutoffDate.Adjustmonth((-1)*tmp, True)
    Call deleteCutoffDate.SetAnyTime '<----

    searchForm$ = {Form = "Memo" }
    Set doccol = db.Search(searchForm, Nothing, 0) 'db is an opened NotesDatabase
    Set doc = doccol.GetFirstDocument

    While Not doc Is Nothing 
        Dim nextDoc As NotesDocument
        Set nextDoc = doccol.Getnextdocument(doc)



        'Earlier condition we tried            
        'If doc.Created < deleteCutOffDate.Lslocaltime
        ' deleteCutoffDate is today - 3 years

        'Your current condition
        'If (Fix( doc.Created ) < Fix( CDat(deleteCutoffDate.Dateonly))) Then

        Set createdDate = New NotesDateTime(doc.Created)         '<----
        Call createdDate.SetAnyTime                              '<----
        If createdDate.TimeDifference(deleteCutoffDate) < 0 Then '<----
                    'Suggested solution to check dates
                    Dim longTemp As Long
                    longTemp = Fix( CDat(deleteCutoffDate.Dateonly))        'should be 36,647 (#days from Dec 30, 1899 to May 1, 2000) 
                    longTemp = Fix( doc.Created )     'check this number makes sense (see last line)!

                'This is only for logging, testing.
                Dim temp As String
                temp = Format( doc.Created, "yyyy-mm-dd")+";"+doc.Noteid+";"
                Call nStream.WriteText(temp,EOL_PLATFORM)


                '******* Processing logic goes here **********

        End If
        Set doc = nextDoc 
    Wend 
Call nStream.Close()

解决方法3:完整性过滤器

如果LotusScript失败,添加一个检查并使用@Formulas的函数,因为虽然速度较慢,但​​希望有效

Function fdtSaneDocCreated(doc As NotesDocument) As Variant 'Dateonly

    Const ciMinDate = 40179 'CLng(CDat("1/1/2010"))
    Const ciMaxDate = 51136 'CLng(CDat("1/1/2040"))

    fdtSaneDocCreated = doc.Created
    If fdtSaneDocCreated < ciMinDate Or fdtSaneDocCreated > ciMaxDate Then
        'This is slower, but AT LEAST IT WORKS! (... hopefully)

        Dim array As Variant
        array = Evaluate({@Created}, doc)
        fdtSaneDocCreated = array(0)

        If fdtSaneDocCreated < ciMinDate Or fdtSaneDocCreated > ciMaxDate Then
            Error 1, "This workaround doesn't work for " + doc.NotesURL
        End If
    End If
End Function

然后将doc.Created替换为fdtSaneDocCreated(doc)

来更改代码

答案 2 :(得分:0)

对于我真正需要赶上这个项目的长时间沉默感到抱歉。

首先,感谢大家为这个帖子做出贡献,所有答案都为图片添加了一个puzze片段。

所以问题是doc.Created报告了错误的日期。在您发布帖子后,我会重新提供以下文档。

http://www-01.ibm.com/support/docview.wss?uid=swg21111786

根据上面的链接,文件创建日期由OID确定。

所以有这样的: http://www-12.lotus.com/ldd/doc/domino_notes/9.0/api90ug.nsf/85255d56004d2bfd85255b1800631684/00d000c1005800c985255e0e00726863?OpenDocument

此链接说明了OID的工作原理及其外观。

我用NotesPeek和bingo检查了OID! OID应该包含一个vaild日期,但它完全像9856.06.20一样乱码。有时日期部分只是缺失,这就是我看到1899年的原因。

此问题的结束点是以下链接,确认此奇怪的行为是Notes 8.5.1的错误

https://www-01.ibm.com/support/docview.wss?uid=swg1LO47325