Thursday, November 20, 2014

How to remove a document from all mail files by UNID

Ever have an email go out to everyone in the company that you really wanted to delete?  You can use message recall, but what if that doesn't work (you can turn it off) or the message came in from outside your network?

Below is the code to remove these documents.  Just fill in the server name and the mail file folder name in the application.  Set the agent properties to run from the actions menu and set the target to none.  The biggest thing to remember is that you must have manger-like access to the mail files in order to delete the document

%REM
   Agent Delete Across System by UNID
   Created Nov 20, 2014 by David
   Description: Given a UNID, this agent will search for and delete a document that has that ID
%END REM
Option Public
Option Declare

Sub Initialize
   '<Initialization>
   Dim ses As New NotesSession
   Dim dbdir As New NotesDbDirectory("")
   Dim db As NotesDatabase
   Dim thisdb As NotesDatabase 
   Dim doc As NotesDocument
   Dim mailfolder As String
   Set thisdb = ses.currentdatabase

   Dim servers(1 To 1) As String 'What server(s) to run on
   servers(1)="MailServer/Name"

   Dim doc_id(1 To 1) As String
   doc_id(1) = "F000E656739BFECD1A1D2D04FA1E56FD"

   '<Set value to the variables mailfolder>
   mailfolder = "mail"

   ForAll v In servers

      Set dbdir = ses.GetDbDirectory(v)
      Set db = dbdir.GetFirstDatabase(DATABASE)

      Print Left(db.Filepath,Len(mailfolder))

      '<Prints out current database>
      While Not(db Is Nothing)
        If Left(db.Filepath,Len(mailfolder)) = mailfolder Then
          db.Open "",""
          '<Check if the database is in the current specified mail folder>
          If InStr(db.filepath, mailfolder+"\") > 0 Then
          'This is code for deleting all id at one shot
            ForAll w In doc_id
              On Error 4091 Resume Next 'Trap for not finding the UNID
              Set doc = db.GetDocumentByUNId(w)
              If (Not doc Is Nothing) Then
                Print "Found and removed the document in " + db.title+" on "+ db.server
                Call doc.remove(True)
              End If
            End ForAll
          End If
        '<Next database.........>
        End If
Set db = dbdir.GetNextDatabase
    Wend
   End ForAll
   Print "Completed removing the document from mail files in " + mailfolder
End Sub

I hope this helps you out as much as it has me.  If you find any bugs or anything please let me know so I can fix my code.  

Tuesday, July 15, 2014

Open Lotus Notes email in the "old" format

If you're having issues with your Notes email, try opening it in the older format!  You can open your mail file and press CTRL-ALT at the same time to get the old style.  At times, all the graphical/Java stuff  can cause some issues.  This is a quick way to open email with that disabled.


Friday, May 30, 2014

Calculate Bytes to GB, MB,KB, B in an Excel Worksheet Cell


Have you ever needed to enter storage information into a worksheet and the data was in bytes... but you wanted to convert it to something else?  I'm working on an analysis on my disk utilization on my Domino servers and copied the data into an Excel worksheet.  The storage for the files is shown in bytes.  Using the below formula, it will take that number and show it as bytes, kilobytes, megabytes or gigabytes (I'll eventually have it show terabytes as well).  It's short, simple and works just as I needed it.

=IF((F3>=POWER(2,30)),
     TEXT((F3/POWER(2,30)),"##0.00\G"),
     IF((F3>=POWER(2,20)),
           TEXT((F3/POWER(2,20)),"##0.00\M"),
           IF((F3>=1024),
               TEXT((F3/1024),"##0.00\K"),
               TEXT((F3),"##0.00\B")
               )
         )
    )

Thursday, February 20, 2014

Copy Notes URL Link to Clipboard

Ever had the need to embed a link to the current document into a non-Notes email or product?  I don't mean an HTTP URL.  I'm talking about a URL that will open the document in your Lotus Notes client al-la "notes://server/db/view/document".  Here is some code that can be added to an action button to do just that.  Once you've clicked the button, a URL will be in the clipboard read for pasting into another application!

 %REM
    Copy Data to Clipboard  
%END REM

 

Option Declare
Const GMEM_MOVEABLE = &H40
Const GMEM_ZEROINIT = &H2
Const CF_TEXT = &H01

Declare Function OpenClipboard Lib "user32" Alias "OpenClipboard" (Byval hwnd As Long) As Long
Declare Function CloseClipboard Lib "user32" Alias "CloseClipboard" () As Long
Declare Function EmptyClipboard Lib "user32" Alias "EmptyClipboard" () As Long
Declare Function GetClipboardData Lib "user32" Alias "GetClipboardData" (Byval wFormat As Long) As Long
Declare Function SetClipboardData Lib "user32" Alias "SetClipboardData" (Byval wFormat As Long, Byval hMem As Long) As Long
Declare Function IsClipboardFormatAvailable Lib "user32" Alias "IsClipboardFormatAvailable" (Byval wFormat As Long) As Long
Declare Function GlobalAlloc Lib "kernel32" Alias "GlobalAlloc" (Byval wFlags As Long, Byval dwBytes As Long) As Long
Declare Function GlobalLock Lib "kernel32" Alias "GlobalLock" (Byval hMem As Long) As Long
Declare Function GlobalUnlock Lib "kernel32" Alias "GlobalUnlock" (Byval hMem As Long) As Long
Declare Function GlobalSize Lib "kernel32" Alias "GlobalSize" (Byval hMem As Long) As Long
Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (Byval lpString1 As Long, Byval lpString2 As String) As Long
Declare Function NEMGetCurrentSubprogramWindow Lib "nnotesws.dll" () As Long
Sub SetClipboardText(Text As String)
  
    Dim hwnd As Long
    Dim hGlobalMemory As Long
    Dim lpGlobalMemory As Long
    Dim ret As Long
  
    On Error Goto error_handler
  
    ' Get a handle to current window
    hwnd = NEMGetCurrentSubProgramWindow()
    If hwnd Then
      
        ' Allocate memory
        hGlobalMemory = GlobalAlloc(Clng(GMEM_MOVEABLE Or GMEM_ZEROINIT), Clng(Len(Text)+1))
        If hGlobalMemory Then
            lpGlobalMemory = GlobalLock(hGlobalMemory)
            If lpGlobalMemory Then
                ret = lstrcpy(lpGlobalMemory, Text)
                Call GlobalUnlock(hGlobalMemory)
                If OpenClipboard(hwnd) Then
                    ret = EmptyClipboard()
                    ret = SetClipboardData(CF_TEXT, hGlobalMemory)
                    ret = CloseClipboard()
                End If
            Else
                Msgbox "Can't allocated global memory pointer.", 32, "Error"
            End If
        Else
            Msgbox "Can't allocated global memory handle.", 32, "Error"
        End If
    Else
        Msgbox "Can't get window handle.", 32, "Error"
    End If
    Exit Sub
  
error_handler:
    Print "Error: " + Error$(Err)
    Resume Next
  
End Sub
Sub Click(Source As Button)
    Dim s As New NotesSession
    Dim ws As New NotesUIWorkspace
    Dim db As NotesDatabase
    Dim uiDoc As NotesUIDocument
    Dim plainText As String
    Dim x As String
  
    Set db = s.CurrentDatabase
    Set uiDoc = ws.CurrentDocument
    plainText = uiDoc.Document.NotesURL 'Get the Notes URL for the Document  
    setclipboardtext(plainText)
    Msgbox "Document URL copied to clipboard.", 0+64, "Successful"  
End Sub