I use many lists in my programs. They are handy for keeping it tidy and configurable. I surely could put a constant in its own identificator and sometimes I do. But what if I need two or more similar constants? Lists are definitely the best choice for holding column numbers and for exchanging fields between Office and Notes documents.
Sometimes double lists would be better than normal lists. Example: an agent for importing some fields from an Excel book with many sheets into a Notes document using a double list for declaring the import structure. It should work this way:
Dim xlImport List2 As String
xlImport( "Sheet1", "report" ) = "Title"
xlImport( "Sheet2", "date3" ) = "Date"
xlImport( "Sheet1", "dept" ) = "Department"
With such a structure one could define the import as a simple forall loop:
Dim xlSheet As Variant
Dim xlRange As Variant
Forall f In xlImport
xlSheet = xlBook.Worksheets( Listtag( f, 1 ) )
xlRange = xlSheet.Range( Listtag( f, 2 ) )
Call notesDocument.ReplaceItemValue( f, xlRange.Value )
End Forall
Unfortunately double lists don’t exist in LotusScript, so there is no chance for that code to run in a Notes system.
Here is my implementation of double lists, in its own “DoubleLists” script library. Its use is very similar to the one described earlier, but this is working code.
Dim xlImport List As Variant '= List As String
List2( xlImport, "Sheet1", "report" ) = "Title"
List2( xlImport, "Sheet2", "date3" ) = "Date"
List2( xlImport, "Sheet1", "dept" ) = "Department"
Forall sheet In xlImport
xlSheet = xlBook.Worksheets( Listtag( sheet ) )
Forall f In sheet
xlRange = xlSheet.Range( Listtag( f ) )
Call notesDocument.ReplaceItemValue( f, xlRange.Value )
End Forall
End Forall
The important thing here is the flexibility of this approach, something similar to the Prolog programming language. The import machine is known and fixed, but by means of a simple set of declarations it can import any book. And adding a new field to import is just a matter of copy and paste a declaration and adjust it, as well as stopping the import of a field is just a matter of commenting out a declaration. And the program gets self documented. These are the reasons why I use lists and double lists as much as possible.
'DoubleLists:
Option Public
Option Declare
Use "LsConst.lss"
Property Set List2( aList As Variant, tag1 As String, tag2 As String ) As Variant
%INCLUDE "error_handling"
If Iselement( aList( tag1 ) ) Then
Dim aux1 As Variant '= List
aux1 = aList( tag1 )
Select Case Datatype( List2 )
Case V_DISPATCH, V_ERROR, V_IUNKNOWN, V_LSOBJ, V_PRODOBJ
Set aux1( tag2 ) = List2
Case Else
aux1( tag2 ) = List2
End Select
aList( tag1 ) = aux1
Else
Dim aux2 List As Variant
Select Case Datatype( List2 )
Case V_DISPATCH, V_ERROR, V_IUNKNOWN, V_LSOBJ, V_PRODOBJ
Set aux2( tag2 ) = List2
Case Else
aux2( tag2 ) = List2
End Select
aList( tag1 ) = aux2
End If
End Property
Property Get List2( aList As Variant, tag1 As String, tag2 As String ) As Variant
%INCLUDE "error_handling"
If Iselement( aList( tag1 ) ) Then
Dim aux As Variant
aux = aList( tag1 )
If Iselement( aux( tag2 ) ) Then
Select Case Datatype( aux( tag2 ) )
Case V_DISPATCH, V_ERROR, V_IUNKNOWN, V_LSOBJ, V_PRODOBJ
Set List2 = aux( tag2 )
Case Else
List2 = aux( tag2 )
End Select
Else
List2 = Null
End If
Else
List2 = Null
End If
End Property