Tuesday, July 3, 2018

Verify the addresses in a field are in the Lotus Addressbook


While I am not a fan of it, you sometimes have to create an application internal group for notifications.  In Domino, the admin-p process takes care of keeping your groups maintained when someone leaves or has a name change.  But what about those internal groups?  They aren't maintained by the system.  And most of the time, your application administrators (typically end users) are more focused on adding names.  So how do you keep the list clean?

To solve this issue, I wrote the below code and added it to the "Exiting" subroutine of a field.  It will basically read through every entry of the field and verify that the address exists in the public address book (NAB).  If it doesn't find the address, it's removed from the field.  This has worked well in keeping old addresses out of our fields.

The better solution would be to have a group in your address book.  But when you can't do that, this will help keep your lists clean.


Sub Exiting(Source As Field)
%REM
Validate the members of this group exist in the NAB
Created by David
%END REM

Dim s As New notessession
Dim uiw As New notesuiworkspace
Dim doc As Notesdocument
Dim x As Integer
Dim j As Integer
Dim listIn As Variant
Dim listOut As Variant

Dim db As NotesDatabase
Dim ses As New NotesSession
Dim ndoc As NotesDocument
Dim view As NotesView
Dim vc As NotesViewEntryCollection

    'Let's initially open this DB and then connect to a view
Set db = New NotesDatabase("server-name","names.nsf")
Set view = db.GetView( "($Users)" )
Set vc = view.AllEntries

Set  uidoc = uiw.currentdocument
Set doc = uidoc.document
listIn = doc.GetItemValue("Field-Name")
Redim listOut(Ubound(listIn)) As Variant

j = 0
For x = 0 To Ubound(listIn)
Set ndoc = view.GetDocumentByKey(listIn(x),True)
If Not (ndoc Is Nothing) Then
listOut(j) = listIn(x)
j = j + 1
End If
Next

Call doc.ReplaceItemValue("Field-Name", listOut)
Call uidoc.Reload
End Sub

Thursday, July 9, 2015

A great use for your Neodymium magnet from an old hard drive

OK, so you are like most of us nerds and you have a bajillion old computer hard drives just sitting around the house.  Pop it open and you'll find a set of Neodymium magnets over the drive heads. These are super strong "rare-earth" magnets that are not your normal magnets.  Oh boy! A new toy to play with!

So what can you do with them?  Use them on your refrigerator to stick your kids artwork to it?  You'll never get the magnet off again!  Did I mention they are hard to get off of metal surfaces?  And if your finger is in the way, it can pinch or crush them if the magnet is large enough or strong enough.  So what can you do with one?????  I know......

I recently moved into a new cube at work (complete with a window).  It's bigger and nicer - but has a limited number of available power outlets.  I added a power strip beside my desk, but it sits on the floor and is hard to reach when I need it.  To remedy this, I used one of my super-strong magnets.


1) Get a power strip and plug it into the wall.  Place it next to your desk with a metal frame or sides.

Step 1

2) Place the power strip on a flat surface and flip it over.  Center your Neodymium magnet on the back side of the strip.  This is where you are going to locate the magnet for sticking to your metal surfaces.
Step 2
3) Next, cut a few short strips of duct tape and place them over your magnet.  Make sure it's good and strong duct tape.  You will want to make sure the magnet isn't going anyplace.  And, the duct tape will cut down a little on the power of the magnet so you can remove it from where you place it.

Step 3
4) Finally, stick the power strip to the metal surface of your choice.  I stuck mine to the side of my desk.  It held in-place where it was convenient to reach.  I plugged my phone charger in and there ya go!  A power strip within my reach.  When I'm done, I can move the strip around so it's out of the way or just leave it in place.

Step 4
There are plenty of other uses for these magnets.  Be creative and have some fun with them.  But be sure to keep them from your kids.  These are so strong that they can hurt little fingers and hands. And you really don't want them being swallowed.  It's a for sure visit to the E.R. for some surgery.

Monday, March 9, 2015

Fix Unread Mail Count In Lotus Notes

One of the biggest annoyances for users is for the unread document count to get off.  It says you have 10 unread documents in your Inbox, but you really only have 3.  Here are some steps to correct this.  I'll be honest, it's a hit/miss fix.  But most of the times it will work.


  1. Open the user's mail file.
  2. Go to the view "All Documents."
  3. Select: View -> Show -> Unread only. (Only the unread e-mails will be displayed in the view.)
  4. Select: Edit -> Select All to select all unread documents in the view.
  5. Select: Edit -> Unread Marks -> Mark All Read. (Note: all documents will disappear.)
  6. Deselect: View -> Show -> Unread only.
  7. Select: Edit -> Unread Marks -> Mark Selected Unread.

The "Unread Counter" should now be corrected.

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