Læs LDAP værdier

Fra Lotus Script (eller et Visual Basic login script) kan man nemt hente bruger information i AD og bruge i eksempelvis en email signature.


' Read LDAP(Active Directory) information

Set objSysInfo = CreateObject("ADSystemInfo")
qQuery = "LDAP://" & objSysInfo.Username
 Set objuser = GetObject(qQuery)

name = objuser.displayname

Class Path

Med denne klasse kan du nemt oprette en ny folder på disken. Nedenstående eksempel opretter folder “d:\temp\sample dir”

Dim p As New path( "d:\temp" )
Call p.add( "Sample dir?" )
Call p.create()
Print p.getPath()

Class Path kan kopieres herfra:


Class Path As AbstractObject
	Private path As String

%REM
        path: the default path. Use 'TEMP' or 'MY' to use the default temp or 'My Documents' path
%END REM
	Sub New( path As String )
		Select Case Ucase( path )
		Case "TEMP":
			Me.path = getTempPath()
		Case "MY":
			Me.path = getMyDocuments()
		Case Else
			Me.path = path
		End Select

		Call legalize()
	End Sub

%REM
        Returns the 'My Documents' path
%END REM
	Private Function getMyDocuments() As String
		Dim formula As String
		formula = |@RegQueryValue( "HKEY_CURRENT_USER" ; "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" ; "Personal" )|
		Dim v As Variant
		v = Evaluate( formula )
		getMyDocuments = v( 0 )
	End Function

%REM
                Function getTempPath
                Returns the temp path
%END REM
	Private Function getTempPath() As String
		getTempPath = Environ( "temp" )
	End Function

	Function add( subdir As String )
		On Error Goto eh
		subdir = Replace( subdir, "/", "\" )
		If Left( subdir, 1 ) = "\" Then
			path = path & Mid( subdir, 1 )
		Else
			path = path & subdir
		End If
		Call legalize()

		Exit Function
eh:
		Error Err, getErrorInfo( Me )
	End Function

%REM
Returns the name of the current path
%END REM
	Function getPath() As String
		getPath = path
	End Function

%REM
                Convert to a legal path (remove illegal chars)
%END REM
	Private Function legalize()
		On Error Goto eh
		Const ILLEGAL_CHARS = |*?:"|
		Dim char As String
		Dim s As String
		Dim i As Integer

		Me.path = Replace( path, "/", "\" )
		If Right( path, 1 ) <> "\" Then path = path & "\"

		s = ""

                'Note - : is legal if in second position
		If Mid( path, 2, 1 ) = ":" Then
			s = Left( path, 2 )
			path = Mid( path, 3 )
		End If

		For i = 1 To Len( path )
			char = Mid( path,i ,1 )
			If Instr( ILLEGAL_CHARS, char ) = 0 Then
				s = s & char
			End If
		Next

		path = s

		Exit Function
eh:
		Error Err, getErrorInfo( Me )
	End Function

%REM
Creates the specified path
%END REM
	Function create( )
		On Error Goto eh
		Dim v As Variant
		Dim p As String

		v = Split( path, "\" )

		p = v( 0 )
		Dim i As Integer
		For i = 1 To Ubound( v )
			If v( i ) <> "" Then
				p = p & "\" & v( i )
				If Dir( p, 16+4+2 ) = "" Then 'ATTR_DIRECTORY + ATTR_HIDDEN + ATTR_SYSTEM
					Mkdir( p )
				End If
			End If
		Next

		Exit Function
eh:
		Error Err, getErrorInfo( Me )
	End Function

End Class

cls.system findes i Developer Toolbar basen

Lav pæne tabeller i RichText

Med Lotus Script kan du nemt lave tabeller som nedenstående:

Tabellen er lavet udfra med dette Lotus Script kode:

 Use "ViewTable"
 Dim vt As New ViewTable( body ) 
 Call vt.addColumn( "Filename", "subject", 10, "" ) 
 Call vt.addColumn( "Date", "@created", 5, "" ) 
 Call vt.createTable( "" ) 
 Set doc = coll.getFirstDocument()
 Do Until doc Is nothing
    Call vt.addRow( doc, "" ) 
    Set doc = coll.Getnextdocument(doc)
 loop
 Call vt.close()

 

Links

Beregning af jubilæer og runde dage

I firmaets telefonliste kan man med fordel lave et view med mærkedage. Vedlagt Lotus Script agent kan bruges som skabelon. Agenten skal køre f.eks. én gang pr uge og vil markere personer der har en snarlig mærkedag med ‘isAnniversary=1’. Samtidigt vil der i feltet ‘anniversary’ står navnet på dagen, f.eks: ’20 års jubilæum’

Disable Out Of Office replies på mails sendt fra Script

Når su sender en mail fra Lotus Script (med doc.send), så sætter Notes automatisk et $AutoForward=1 felt på  – dermed disables Out Of Office beskeder. Hvis du sender mailen på anden vis – eller hvis du sender mailen til en Outlook bruger, så får du brug for nedenstående kode:

 Function disableOOO( memo As NotesDocument )
 Call memo.replaceItemValue( "$AutoForward", "1" ) 'notes

'
 'Note: The X-Auto-Response-Suppress flag must be set in the mime header
 'but, we can't create a new mimeitem if a Notes RichText body item already exist on the document
 'solution: copy the body field to another field, create the mime flags and then restore the body field

'rename the body field
 Dim body As NotesRichTextItem
 Dim copybody As NotesRichTextItem
 Set body = memo.Getfirstitem("body")
 Set copybody = memo.Createrichtextitem("copybody")
 Call copybody.Appendrtitem(body)
 Call body.Remove()

'mime - set the X-Auto-Response-Suppress flag
 Dim session as New NotesSession
 session.Convertmime = False
 Dim header As NotesMIMEHeader
 Dim mimebody As NotesMIMEEntity

Set mimebody = memo.CreateMIMEEntity
 Set header = mimebody.CreateHeader({MIME-Version})
 Call header.SetHeaderVal("1.0")
 Set header = mimebody.CreateHeader("X-Auto-Response-Suppress")
 Call header.SetHeaderVal("All")
 session.Convertmime = True

'restore the body field
 Set copybody = memo.Getfirstitem("copybody")
 Set body = memo.Createrichtextitem("body")
 Call body.Appendrtitem(copybody)
 Call copybody.Remove()

'
 End Function
 

Udokumenteret: NotesViewColumn.isConstant

NotesView.Columns indeholder flere kolonner end der er værdier i NotesViewEntry.ColumnValues. Dette kan være et problem hvis man ønsker at mappe en værdi med en kolonne, som jeg har gjort i min ‘Export view to Excel’ funktion (som findes i Developer Toolbox).

F.eks. medtages kolonner der indeholder en konstant og hidden columns ikke i ColumnValues array’et. Faldt heldigvis over funktionen NotesViewColumn.isConstant som der kan finde disse kolonner.

Nyttige genveje i Notes designer

Med den Eclipse baserede designer klient er der kommet mange nye keyboard shortcuts – her er en liste over dem jeg bruge mest når jeg programmerer:

  • Ctrl+M: Maximize editor
  • Ctrl+Alt+L: Goto error line
  • Ctrl+D: Slet linie
  • Ctrl+Shift+7: Toggle comments.
  • Ctrl+B: Build all
  • Ctrl+Shift+L: Vis genvejstaster. Ctrl+Shift+L igen for at åbne settings siden
  • Ctrl+I: Auto indent Lotus Script – I XPages benyttes Ctrl+Shift+F
  • Tilsvarende kan du med tab eller Shift+Tab rykke en markeret blok ind eller ud
  • Alt+Up/Down: Flyt linie eller blok
  • Ctrl+Shift+Up/Down: Hop til næste/foregående metode.
  • F2: Context hjælp på markeret
  • F5 Continue
  • F8 Step into / Shift-F8 Step over
  • F9 Toggle breakpoint

I Notes klienten er der også et par nyttige og ikke så kendte genveje:

  • Med Ctrl+Up/Down i bullet list (som denne) kan du flytte linien op eller ned
  • Tilsvarende kan Ctrl+Up/Down flytte en hel række i en tabel (marker blot rækken)
  • Ctrl+M – opretter en ny mail
  • Ctrl-Tab indsætter en tab, også i richtext felter og tabeller (normalt hopper markør til næste felt)

Links

Notes performance tips

Notes 8 har ca 20.000 filer i 4.600 biblioteker – heraf 7.500 (udokumenterede) property filer. Hvis du blot starter og stopper Notes – så er ca 300 filer blever modified!
Så Notes er meget afhængig af en hurtigt disk:

  • Få dig en SSD disk asap
  • Disable antivirus i Notes data biblioteket
  • Disable Windows disk indexing af Notes data biblioteket

Benyt nyeste ODS

  • Notes.ini: CREATE_R85_DATABASES=1
  • Kør ‘ncompact -ods’ (fra en command prompt) eller notes.ini: NSF_UpdateODS=1
Andre settings:
  • Developers bør ændre i \framework\rcp\deploy\jvm.properties filen:
    vmarg.Xmx=-Xmx1024m
    vmarg.Xms=-Xms256m (mere info her)
  • Bemærk: Du kan checke memory forbruget ved at vælge ‘File, Preferences, General’ i Notes Designer klienten og her enable ‘Show Heap Status‘.
  • Enable network compression
  • Disable alle de porte der ikke benyttes (typisk bliver kun TCPIP brugt)

Bemærk: Fra Developer Toolbox installationssiden har du en nem genvej til alle settings.

Links

LotusScript Mails på 3 nemme måder

Her er mine foretrukne måder at sende mails på fra LotusScript. Bemærk at de 3 metoder nemt kan kombineres – og at der nemt kan indsættes tabeller/views via AbstractRichText klassen

1. Simpel ‘hardcoded’ mail med pænt formateret RichText

Med få linjers kode kan der oprettes en ny mail og indsættes pænt formateret RichText ved at benyttes AbstractRichText klassen:

Set mail = db.createDocument
 mail.form = “Memo”
 mail.subject = "Eksempel på mail oprettet med AbstractRichText klassen"
 mail.sendto = session.username

 Dim body As New AbstractRichText( mail, "body" ) 'create a New body Field On the mail
 Call body.append( "Hej, \n\nHer er et link til databasen: " )
 Call body.append( db )
 Call body.append( body.getStyle( "bold=True;color=GRAY" ))
 Call body.append( "\n\n\nMed venlig hilsen\n\n" )
 Call body.append( body.getStyle( "bold=False;" ))
 Call body.append( session.commonUsername )

 Call mail.send( False )

2. Mail baseret på et template dokument 

Via én form og view kan der oprettes ‘Mail Skabeloner’ som herefter kan benyttes som udgangspunkt for oprettelse og afsendelse af mails (klassen cls.fw.memo):

'initialize, based on a template
 Dim mail As AbstractMemo
 Set mail = createMemo( db, "TEST" )

 'create the memo and merge with data from the document
 Call mail.create( doc, Nothing )

 'send the mail
 Call mail.send()

På template dokumentet kan (super) brugeren selv redigere mailen og indsætte flette felter. Mail kan både sendes/script som text, html eller richtext. Afsender navnet kan styres med Principal feltet – og agent signer/current user kan skjules helt hvis mail sendes via mail.box:

3. Mail baseret på en on-the-fly template – sendt via mail.box så jeg kan styre afsenderen

Her er kun cls.fw.memo klassen brugt til at oprette en ny Mail Skabelon med indstillinger og herefter afsende mailen via serverens mail.box:

'create the template
 Dim mt As New MemoTemplate()
 Call mt.create( db, "" ) 'create a new blank template with default settings

 'setup
 Call mt.setPostMethod( "mailbox" )
 Call mt.setSender( |"Mickey Mouse" <noreply@majkilde.dk> |, "" )
 Call mt.setSubject( "New mail from majkilde" )
 Call mt.setRecipients( session.UserName, "", "" )

 'initialize, based on the new template
 Dim mail As AbstractMemo
 Set mail = createMemo( db, mt )

 'create the memo and merge with data from the document
 Call mail.create( doc, Nothing )
 Call mail.insert( "Hi, \nThis is a sample mail \n\nDatabase Link" )
 Call mail.insert( doc )

 'send the mail
 Call mail.send()

Links

 

Spar på Print() statements – de er super langsomme

Bemærk de to funktioner nedenfor – begge løber igennem et loop 1000x

  • Slowloop funktionen: printer hver gang – dvs. 1000 prints. Det tager 550 millisec
  • Fastloop kalder en funktion og beregner en % og printer kun når tallet ændres. Dvs. kun 100 prints. Det kan gøres på 140 millsec. Med andre ord: 4x hurtigere!!!

Progress klassen initialiseres med en max værdi. Herefter skal Print metoden blot kaldes som i eksemplet. Klassen sikre at der kun laves 100 print’s (når der er ændringer) – og beregner også hvor lang tid der er igen.

Til at måle tiden, har jeg brugt min Stopwatch klasse:

Links: