【问题标题】:How to retrieve the "Record activity" flag of Lotus Notes database?如何检索 Lotus Notes 数据库的“记录活动”标志?
【发布时间】:2011-10-07 10:10:40
【问题描述】:

我想检索 Lotus Notes 数据库的“记录活动”标志,如屏幕截图所示(请参阅左下角的复选框)。我怎样才能通过 API 做到这一点?

【问题讨论】:

    标签: lotus-notes


    【解决方案1】:

    更新: 仅通过 LotusScript 无法做到这一点,但也许您可以通过 Lotus Notes C API 获取此信息。

    NSFDbGetUserActivity 方法将返回用户活动信息(显示在该对话框中),或者如果没有摘要信息,它将返回 ERR_SPECIAL_ID。这不是确定是否检查记录活动标志的精确方法,但您可以从方法的结果推断标志的状态。

    当然,仍有可能检查标记,但尚未记录任何活动,或者相反,标记未检查但活动先前已记录在数据库。

    另一种解决方案可能是以编程方式执行通常会记录在用户活动中的操作。然后,您可以检查该活动是否确实被记录,然后您就会知道该标志是否处于活动状态。如果您指定一个特殊的 Notes 用户来运行此代码,则可以更容易地从活动列表中挑选出该用户,从而避免由某些正常的最终用户活动引起的误报。

    下面的代码向您展示了如何通过 C API 获取用户活动信息,取自本教程页面上的示例 #3:http://www.triplewhitefox.com/tech-calling-c-api-from-lotusscript

    (声明)

    'Structures used by Notes C API
    Type TIMEDATE
       Innards(1) As Long 'DWORD
    End Type
    
    Const MAXALPHATIMEDATE = 80
    
    Type DBACTIVITY
       First As TIMEDATE      'TIMEDATE /* Beginning of reporting period */
       Last As TIMEDATE        'TIMEDATE /* End of reporting period */
       Uses As Long            'DWORD /* # of uses in reporting period */
       Reads As Long           'DWORD /* # of reads in reporting period */
       Writes As Long          'DWORD /* # of writes in reporting period */
       PrevDayUses As Long     'DWORD /* # of uses in previous 24 hours */
       PrevDayReads As Long    'DWORD /* # of reads in previous 24 hours */
       PrevDayWrites As Long   'DWORD /* # of writes in previous 24 hours */
       PrevWeekUses As Long    'DWORD /* # of uses in previous week */
       PrevWeekReads As Long   'DWORD /* # of reads in previous week */
       PrevWeekWrites As Long  'DWORD /* # of writes in previous week */
       PrevMonthUses As Long   'DWORD /* # of uses in previous month */
       PrevMonthReads As Long  'DWORD /* # of reads in previous month */
       PrevMonthWrites As Long 'DWORD /* # of writes in previous month */
    End Type
    
    'STATUS LNPUBLIC NSFDbGetUserActivity(DBHANDLE hDB, DWORD Flags, DBACTIVITY far *retDbActivity, HANDLE far *rethUserInfo, WORD far *retUserCount);
    Declare Function NSFDbGetUserActivity Lib "nnotes.dll" (Byval hDB As Long, Byval Flags As Long, retDbActivity As DBACTIVITY, rethUserInfo As Long, retUserCount As Integer) As Integer
    
    'STATUS LNPUBLIC NSFDbClose( DBHANDLE hDB);
    Declare Function NSFDbClose Lib "nnotes.dll" (Byval hDB As Long) As Integer
    
    'STATUS LNPUBLIC NSFDbOpen(char far *PathName, DBHANDLE far *rethDB);
    Declare Function NSFDbOpen Lib "nnotes.dll" (Byval filepath As String, DB As Long) As Integer
    
    'STATUS LNPUBLIC ConvertTIMEDATEToText(const void far *IntlFormat, const TFMT far *TextFormat, const TIMEDATE far *InputTime, char far *retTextBuffer, WORD TextBufferLength, WORD far *retTextLength);
    Declare Function ConvertTIMEDATEToText Lib "nnotes.dll" (Byval IntlFormat As Integer, Byval TextFormat As Integer, InputTime As TIMEDATE, Byval retTextBuffer As String, Byval TextBufferLength As Integer, retTextLength As Integer) As Integer
    

    初始化

    Sub Initialize
       Dim ReturnCodel As Long
       Dim hDBl As Long
       Dim retDbActivity As DBACTIVITY
       Dim rethUserInfo As Long
       Dim retUserCount As Integer
       Dim Flags As Long
    
       Dim retTextBuffer As String
       Dim retTextLength As Integer
       Dim BufferSize As Integer
    
       Dim session As New NotesSession
    
       'Open the database
       ReturnCodel = NSFDbOpen(session.CurrentDatabase.FilePath, hDBl)
       If ReturnCodel <> 0 Then
          Error 9999, "An error occurred calling the API function " + _
             "NSFDbOpen." & Chr$(10) & "The return code was " & + _
             Trim$(Str$(ReturnCodel)) & "."
          Exit Sub
       End If
    
       Flags = 0
       ReturnCodel = NSFDbGetUserActivity(hDBl, Flags, retDbActivity, rethUserInfo, retUserCount)
       If ReturnCodel <> 0 Then
          Error 9999, "An error occurred calling the API function " + _          "NSFDbGetUserActivity." & Chr$(10) & "The return code was " & + _
             Trim$(Str$(ReturnCodel)) & "."
          Call NSFDbClose(hDBl)
          Exit Sub
       End If
    
       retTextBuffer = String$(MAXALPHATIMEDATE + 1,0)
       ReturnCodel = ConvertTIMEDATEToText(0, 0, retDBActivity.First, retTextBuffer, MAXALPHATIMEDATE, retTextLength)
       Print "First access = " + Left(retTextBuffer, retTextLength)
    
       retTextBuffer = String$(MAXALPHATIMEDATE + 1,0)
       ReturnCodel = ConvertTIMEDATEToText(0, 0, retDBActivity.Last, retTextBuffer, MAXALPHATIMEDATE, retTextLength)
       Print "Last access = " + Left(retTextBuffer, retTextLength)
    
       Print "Uses = " + Cstr(retDBActivity.Uses)
       Print "Reads = " + Cstr(retDBActivity.Reads)
       Print "Writes =" + Cstr(retDBActivity.Writes)
    
       'Close the database
       ReturnCodel = NSFDbClose(hDBl)
    End Sub
    

    【讨论】:

    • 我想检索 Lotus Notes 数据库的“记录活动”标志,而不是用户活动。
    • 根据我对 API 的研究,这可能是您最接近访问标志的方式。不过,请参阅上面的更新。我认为您最好的选择是执行触发更新用户活动摘要的操作,然后检查该摘要以查看是否记录了该操作。
    • 是的,我认为这是唯一的选择。似乎没有办法直接检索该标志。
    【解决方案2】:

    AGECOM 提供了一个 NotesUser Activity 类 (CLASSUserActivity) 应用程序。他们已经完全复习并更新了最初由 Daniel Alvers 编写的课程。

    Release 2x 的改进包括:

    • 对原始代码的大量修复和增强。

    • 在从 LotusScript 调用 Lotus C-API 代码时更正数据类型和内存对齐。

    • 在整个代码中实现错误处理。

    • 增强示例代理以收集和显示检索到的用户活动信息。

    • 扫描所有或选定数据库中的用户活动的新选项。

    • 显示用户活动信息报告的新视图。

    您可以从 AGECOM 网站下载更新: http://www.agecom.com.au/useractivity

    该应用程序是标准的 Lotus Notes 应用程序,可以立即从 Lotus Notes 客户端运行。

    【讨论】:

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