Saturday, June 19, 2010

Unzip a zip file - Lotus Script

How to unzip a zip file? unzipping of files should be done in the backgrouod. The script should not show any dialog box and should not ask for destination folder and any other details. We can't do these things using lotus script. Lotus script does not have function to do this. By using windows API functions in Lotus script we can achieve it.

strFile = "C:\4942.zip"
strDest = "c:\files"
Set objFSO = CreateObject("Scripting.FileSystemObject")
If Not objFSO.FolderExists(strDest) Then
    objFSO.CreateFolder(strDest)
End If

UnZipFile strFile, strDest

Sub UnZipFile(strArchive, strDest)
    Set objApp = CreateObject( "Shell.Application" )

    Set objArchive = objApp.NameSpace(strArchive).Items()
    Set objDest = objApp.NameSpace(strDest)

    objDest.CopyHere objArchive
End Sub

Browse for Folder - Lotus Script

Lotus script Function OpenFileDialog will show a dialog box and it will allow us to select only file. It wont allow us to select folder or we can't use this function to restrict the user to select only folder. It is big deal in a certain point where we want the user should select only folder and not a file. How to solve this issue?. we can achieve this by using windows API. This solution will work only in windows platform.
Create an agent and place the below code in Declaration part.

' Flags for the options parameter
Const BIF_returnonlyfsdirs   = &H0001
Const BIF_dontgobelowdomain  = &H0002
Const BIF_statustext         = &H0004
Const BIF_returnfsancestors  = &H0008
Const BIF_editbox            = &H0010
Const BIF_validate           = &H0020
Const BIF_browseforcomputer  = &H1000
Const BIF_browseforprinter   = &H2000
Const BIF_browseincludefiles = &H4000

Dim wsh, objDlg, objF


Create below two functions


%REM
    Function browse_folder
    Comments: Check whether the value has been returned.
%END REM
Function IsValue(obj)
    Dim tmp
    On Error Resume Next
    tmp = " " & obj
    If Err <> 0 Then
        IsValue = False
    Else
        IsValue = True
    End If
    On Error GoTo 0
End Function

%REM
    Function browse_folder
   Comments: Main function for browse folder
%END REM
Function browse_folder()
    Dim objDlg
    Dim objF
' Get Application object of the Windows shell.
Set objDlg = CreateObject("Shell.Application")

' Use the BrowseForFolder method.
Set objF = objDlg.BrowseForFolder (&H0, _
    "Select the folder to copy", _
    BIF_editbox + BIF_returnonlyfsdirs)

' Here we use the first method to detect the result.
If IsValue(objF) Then
    MsgBox "Selected folder: " & objF.Title
Else
    MsgBox "Canceled"
End If

' Here we use TypeName to detect the result.
If InStr(1, TypeName(objF), "Folder") > 0 Then
    MsgBox "Selected folder: " & objF.Title
Else
    MsgBox "Canceled"
End If
End Function


Call the function as below 
browse_folder()

 

Sort Lotus Notes document collection

Using this Lotus Script code, I can sort a Lotus Notes document collection using a specified field, such as text/date/number, as the key.

This example shows entries in ascending order, but the array sort within the function can be extended.

Note: The comment within the code explains what happens as the code goes into effect.

Function SortDocumentCollection(dc As NotesDocumentCollection, strKeyFieldName As String) As NotesDocumentCollection

%REM
dc a populated document collection that you what to sort
strKeyFieldName the field in the document that will be used as a key in the sort
%END REM

Dim session As New NotesSession
Dim db As NotesDatabase
Dim sdc As NotesDocumentCollection
Dim doc As NotesDocument
Dim itemSorKey As NotesItem
Dim a As Integer, b As Integer, c As Integer, moved As Integer
Dim varSorKey As Variant

Dim tmparray As SortingArray

%REM
in the declaration set-up the following custom class Type SortingArray
sortkey As Variant
unid As String
End Type
%END REM

Set db = session.CurrentDatabase

%REM
by creating a profile document collection for a form that dose not exist in the database create a document collection with no document in, this is used later to hold the sorted results.
%END REM
Set sdc = db.GetProfileDocCollection("$$Blank-DocumentCollection")

a% = 0

REM loop through document collection.
Set doc = dc.GetFirstDocument
Do While Not(doc Is Nothing)

Set itemSorKey = doc.GetFirstItem(strKeyFieldName)

REM check the sork key field item existes.
If itemSorKey Is Nothing Then
REM if not set the sort key to blank.
varSorKey = ""
Else
REM else set the sort key to the fiest value in the sort key item.
varSorKey = itemSorKey.values(0)
End If

REM populate custom class.
Redim Preserve array(a%) As SortingArray
array(a%).sortkey = varSorKey
array(a%).unid = doc.UniversalID

REM get the next document.
Set doc = dc.GetNextDocument(doc)
a% = a% + 1
Loop

REM sort sort the array.
b% = 0
moved% = True

Do Until Not moved%
moved% = False

REM assending sort.
For b% = 0 To Ubound(array) - 1
If array(b%).sortkey > array(b% + 1).sortkey Then
tmparray = array(b%)
array(b%) = array(b% + 1)
array(b% + 1) = tmparray
moved% = True
End If
Next
Loop

REM populate the blank document collection (sdc) in sorted order.
For c% = 0 To Ubound(array)
Set doc = db.GetDocumentByUNID(array(c%).unid)
Call sdc.AddDocument(doc)
Next

REM return the sorted document collection.
Set SortDocumentCollection = sdc

End Function