in reply to Accessing a Lotus Notes Database

Hi,

I am trying to write a script that will take a name off the command line and return the internet email address as stored in the company global address book in Lotus Notes. The following script will loop through all records and print out the data, which I can redirect to a temp file for grep'ing later, but I would like to look it up realtime. I saw the @dblookup function in Lotus, but wasn't successful at running it via perl. Any ideas? Your help is greatly appreciated.

use strict;
use English;
use warnings;
use vars qw($opt_d $opt_v);
use Getopt::Std;
use Win32::OLE;

# Open the email database in Lotus Notes
# (To use another person's email database, switch to
#  their userid in Notes before running this program)
my $notes = Win32::OLE->new('Notes.NotesSession')
             or die "Can't open Lotus Notes";
my $database = $notes->GetDatabase("LNSERVER","names.nsf");
#my $database = $notes->GetDatabase("","names.nsf");

# Verify the server connection
print "Connected to ", $database->{Title}, 
      " on ", $database->{Server}, "\n";

# Loop over all of the folders
foreach my $viewname (GetViews($database)) {

  # Get the object for this View
  print "Checking folder $viewname...\n";
  my $view = $database->GetView($viewname);

  # Get the first document in the folder
  my $num = 1;
  my $doc = $view->GetFirstDocument;
  next unless $doc;
  GetInfo($num,  $doc);

  # Get the remaining documents in the folder
  while ($doc = $view->GetNextDocument($doc)) {
    $num++;
    GetInfo($num, $doc);
  }
}

sub GetInfo
{
  my ($num, $doc) = @_;

  my $FirstName = $doc->{'FirstName'}->[0];
  my $LastName = $doc->{'LastName'}->[0];
  my $MiddleInitial = $doc->{'MiddleInitial'}->[0];
  my $email = $doc->{'ShortName'}->[0];
  $email .= '@uhc.com';
  print "$FirstName $MiddleInitial $LastName\t$email\n";
}

sub GetViews {
   return ("People");
}

Replies are listed 'Best First'.
Re^2: Accessing a Lotus Notes Database
by diotalevi (Canon) on Dec 30, 2002 at 21:23 UTC

    @DbLookup is not valid outside of the Notes client context and cannot be accessed via this method. Tough beans. Normally you follow a pattern something like the following when you're looking for something conceptually like @DbLookup. I'm posting this in LotusScript and you'll have to translate that into perl. I haven't use the OLE interface to perl so I don't want to just "wing" it.

    If you follow that it's just (a) get the view, (b) find document(s) that match your criteria, (c) do something with them. Easy peasy.

    If you need something faster/better then either (a) write an interface to the C or C++ API DominoPerl, (b) use the Java API (which works nicely) or (c) don't do it.

    Const C_VIEW = "People" Const C_KEY = "Marvin Martian/IT/SomeCompany" Const C_ITEM = "Fullname" Dim S As NotesSession Dim Db As NotesDatabase Dim View As NotesView Dim Doc As NotesDocument Set S = New NotesSession Set Db = S.CurrentDatabase Set View = Db.GetView( C_VIEW ) Set Doc = View.GetDocumentByKey( C_KEY, True ) If Doc.HasItem( C_ITEM ) Then Print C_ITEM & ": " & Doc.GetFirstItem( C_ITEM ).Text Else Print C_ITEM & " Doesn't exist!" End If

    Equivalent OLE code *might* look like this but you'll need to try it out for your self. In general you'll need to check out the LotusScript object model to see what is available.

    use constant C_VIEW => "People"; use constant C_KEY => "Marvin Martian/IT/SomeCompany"; use constant C_ITEM => "Fullname"; use strict; use warnings; use Win32::OLE; my $notes = Win32::OLE->new('Notes.NotesSession') or die "Can't open Lotus Notes"; my $db = $notes->GetDatabase(@{&C_DB()}); die "Database was not opened" unless $db->IsOpen; my $view = $db->GetView( C_VIEW ); my $doc = $view->GetDocumentByKey( C_KEY, -1 ); if (defined $doc) { print C_ITEM . ": " . $doc->GetFirstItem( C_ITEM )->Text() . "\n" +; } else { print C_ITEM . " Doesn't exist!\n" }

    Fun Fun Fun in the Fluffy Chair