我目前正在使用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条件中的所有逻辑都已被注释掉,即操纵文档。测试数据库已恢复到原始状态
如果您有任何想法,请不要拖延我已经坚持这个问题好几天了。
由于
答案 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)
我放弃了。是时候试试并建议解决方法了!这些都可能起作用吗?
而不是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()
也许这会起作用?
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()
如果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确定。
此链接说明了OID的工作原理及其外观。
我用NotesPeek和bingo检查了OID! OID应该包含一个vaild日期,但它完全像9856.06.20一样乱码。有时日期部分只是缺失,这就是我看到1899年的原因。
此问题的结束点是以下链接,确认此奇怪的行为是Notes 8.5.1的错误