The View - 30 proven Lotuscript tips
-
Upload
bill-buchan -
Category
Documents
-
view
432 -
download
1
description
Transcript of The View - 30 proven Lotuscript tips
![Page 1: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/1.jpg)
© 2007 Wellesley Information Services. All rights reserved.
30 Proven Tips to Optimize Your LotusScript Development
Bill BuchanHADSL
![Page 2: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/2.jpg)
2
What We’ll Cover …
• Introduction• Theory• Practice• Advanced• Wrap-up
![Page 3: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/3.jpg)
3
Introduction
• Who is the target audience? Lotus Notes Developers
• What is this about? This talk aims to run through 30 different LotusScript tips
10 of these tips (“Theory”) are fundamental10 of these tips (“Practice”) are what you should be doing10 of these tips (“Advanced”) are there to provoke thought
![Page 4: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/4.jpg)
4
Introduction (cont.)
• Why 30 tips? “The Lazy Programmer” methodology Experience and understanding Push your comfort zone and provoke thought
• Who am I? Bill Buchan Dual PCLP in v3, v4, v5, v6, v7 10+ years senior development for Enterprise customers
Learn from my pain! 5+ years code auditing CEO – HADSL – developing best-practice tools
![Page 5: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/5.jpg)
5
What We’ll Cover …
• Introduction• Theory• Practice• Advanced• Wrap-up
![Page 6: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/6.jpg)
6
Theory #1: Option Declare
• You should always use “Option Declare”• Yes, but why?
If not, all variables are created at run-time as variantsThis makes type-checking redundantData conversion costs ten times more performance!And means all errors will be run-time errors
Remember: Test lots, test early Use the strengths of the compiler to help you
![Page 7: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/7.jpg)
7
Theory #2: Templates and Versions
• In terms of custom code, you should always: Create templates with new code
Databases with “ntf” extensionOR databases with Master Template Name set
Create a separate copy for each version Keep them in a central repository
• Why? It makes it far easier to roll back Version control Easier to construct test cases with “other” versions
![Page 8: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/8.jpg)
8
Theory #3: Application Lifecycle
• You should always: Develop in a development “sandbox” Test in a user acceptance environment Pass the template to your administrator to apply
• Why? It’s a basic change control system Professionalism It shakes out “hardcoded” bugs
Hardcoded server names, paths, replica IDs It allows you to run extensive testing without affecting
production
![Page 9: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/9.jpg)
9
Theory #3: Application Lifecycle (cont.)
manager
DevDeveloper manager
Administrator
UAT
Productionmanager
editor
user
![Page 10: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/10.jpg)
10
Theory #4: “Measure Twice, Cut Once”
• Spend more time thinking and less time coding• Think of at least TWO methods of solving a problem
The best approach is usually a blend of the two Think about the data model!
• Why? More planning, less work
• “You know it’s been a rough night when you wake up next to some code you don’t recognize.” – Bob Balaban
![Page 11: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/11.jpg)
11
Theory #5: Code Structure
• Problem decomposition: Smaller code sequences are easier to:
Maintain – the majority of the costReuse – if kept simple
Rule of thumb: If its more than a screenful – can it be broken up?But – don’t be prescriptive
• It’s all about: Problem decomposition Maintainability Code reuse Get the data model right to start with!
![Page 12: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/12.jpg)
12
Theory #5: Code Structure (cont.)
• Tips: Keep functions/procedures/classes at a manageable size
But don’t be prescriptive Think before decomposing problems
• Discussion “Declare at the top” or “Declare in the code”
I prefer to declare variables in the code
![Page 13: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/13.jpg)
13
Theory #6: How to Code
• How to code Code for maintenance
Code updates cost more than new code Architect well. Get the data model right to start with.
• Only code for performance, if required Get it working before getting it working for speed
• Why? The highest cost in development is software maintenance Make it easier for the person maintaining the app It could be YOU
![Page 14: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/14.jpg)
14
Theory #7: How to Test
• Test soon, test often, test completely Look at test-driven development
Write the specificationWrite the structureWrite the testsWrite the code
Automatic testing means:Far easier to regression test all the time
Minimize run-time errors by:Always assuming that data operations outside the current
database may failTrapping all run-time errors and providing an execution
path that fails safely
![Page 15: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/15.jpg)
15
Theory #7: How to Test (cont.)
• Why test early? Costs rise as the tests fail further away from development Cheapest to most expensive are:
Unit tests — by the developerUser acceptance tests (UATs) — by the testerEnd-user failure — by the user
The more tests you perform in unit testing:The cheaper your development will beThe more professional your colleagues will think you areThe more your boss will like you
![Page 16: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/16.jpg)
16
Theory #8: “Attitude”
• The first rule of Best Practices is: There is no Best Practice!
• Seriously: Don’t use Best Practices in a prescriptive manner Examine each one and decide whether it makes sense in
this context Be open to new ideas
• Attitude is better than prescriptive coding No “Not invented here” syndrome Collaborate “The Lazy Programmer”
![Page 17: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/17.jpg)
17
Theory #9: Comments
• Comments Don’t over-comment – explain the “Why!” I usually only comment non-intuitive algorithms
“This isn’t what you think … ”• A good use of comments is to write meta-code
For instance, when first writing a function, write the code-branches as a series of comments
Leave them in once the code is complete
Function test (param1 as String, param2 as String) as integer ' check the parameters and bail out if incorrect.
' Add Param 1 to param 2
' Check it’s valid. If so – update...
' Errorhandlerend function
![Page 18: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/18.jpg)
18
Theory #9: Comments (cont.)
• Remember: Comments consume code space in LotusScript There’s a 64k — about 1,400 line — limit for each code
sequenceThis should not normally be an issueClasses, of course, are all declared in Declarations In terms of classes, you can “subclass” to break up large
class declarations• Check out LotusScript.doc:
www.lsdoc.org It’s a “JavaDoc for LotusScript” You can annotate code to make the comments clearer
![Page 19: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/19.jpg)
19
Theory #10: Error Handling
• An Error is thrown at run-time when: A resource is unavailable: Database, server, memory File I/O breaks Etc., etc.
• Execution stops at the point of error• Sets error information:
Error$ — a textual description Err — a numeric error code Erl — the line number of the error
• Jumps to the error handling routine If there is no error handling routine in the current code
sequence, jumps to calling function If top-level function has no error handler, then default error
handling is used
![Page 20: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/20.jpg)
20
Theory #10: Error Handling (cont.)
• If an error occurs in the middle of a critical sequence of updates, possibly some updates will happen, and some will not Serious data consistency errors Get all your validation done before committing transactions Perform all the transaction “commits” at the same time
In our case, all the “saves” Defensive coding minimizes this effect Do not use “on error goto next”
• You must deal with errors
![Page 21: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/21.jpg)
21
Theory #10: Error Handling (cont.)
• Two approaches: Error trap in almost every routine
Very granular, lots of informationMinimal chance of breaking transactionsHowever, lots of code
Error trap at the topVery simple, minimal codeYou will lose context — you might not be able to get valid
data on how the error happenedYou might break transactions — and therefore compromise
data integrity
• I recommend: Error trap in most routines!
![Page 22: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/22.jpg)
22
What We’ll Cover …
• Introduction• Theory• Practice• Advanced• Wrap-up
![Page 23: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/23.jpg)
23
Practice #1: The List Operator
• List stores a value with a unique lookup key Pros:
It’s easy and it’s fast It’s built right into LotusScript, since v4.5
Cons:You can’t directly read and write a list from a document
item – convert to an array first
Dim Pres list as StringPres(“George”) = “Bush”Pres(“Bill”) = “Clinton”
Print “Georges’s last name is: “ + Pres(“George”)if not isElement(Pres(“Chad”)) then print “Chad wasn’t found”forall thisPres in Pres Print listtag(thisPres) + “ “ + thisPresend forall
![Page 24: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/24.jpg)
24
Practice #2: Defensive Coding
• Defensive coding is: Assume the worst, check all input
On every function Does this affect performance? Not usually. A typical function looks like:
Function mytest(p1 as String, p2 as String) as integer mytest = false if p1=”” then exit function if p2=”” then exit function ... ' Now actually do something! .... mytest = trueend function
![Page 25: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/25.jpg)
25
Practice #3: Extending Arrays the Easy Way
• Pros: No need to keep separate index of array size Automatically “trims”
• Cons: Slow with large arrays Need to define some “empty” value
Sub initialize() Dim myArray() as String redim myArray(0) call myExtend (myArray, “Hello Sailor”)end sub
function myExtend(S() as String, ns as String) as integer if (S(ubound(S)) <> “”) then redim preserve S(ubound(S)+1) S(ubound(S)) = ns extend = trueend function
![Page 26: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/26.jpg)
26
Practice #4: Logging
• If you have applications with scheduled Agents• Or, if you have a diverse range of clients
Then, you need to log your Agent (both client and scheduled) run-time status
• Why? Applications will break You need to know when they break Timing metrics for performance testing
• Beware! Don’t make the logging
so slow that it affects application performance!
![Page 27: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/27.jpg)
27
Practice #4: Logging (cont.)
• OpenLog is an OpenNTF Project: www.openntf.org
• It provides a framework for collecting error logging To use in your database:
Copy the script libraries from the OpenLog databaseUpdate the code:
Function test(param1 as String) as integer Test = false on error goto errorhandler ' ... Test = true
exitFunction: exit functionerrorhandler: call logError() resume exitfunction
end function
![Page 28: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/28.jpg)
28
Practice #4: Logging (cont.)
• Example OpenLog output:
![Page 29: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/29.jpg)
29
Practice #5: Code Hiding
• Code hiding Means decomposing your code so that consumers don’t see
your code Including yourself
Infers a logical interface (with clear naming!) Customers/peers now write to the “interface”
Not the code itself It simplifies the coding experience How?
“Private/Public” methods in classes, script libraries, etc.
![Page 30: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/30.jpg)
30
Practice #6: Use NotesDateTime Instead of Strings!
• Don’t store date/time values as Strings• Use NotesDateTime structures, and save them• Why?
You don’t know how the client will interpret dates Is it dd/mm/yyyy or mm/dd/yyyy?
It means that views will be able to sort on dates• This happens more often than you think!
And things always break on the 13th of the month
![Page 31: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/31.jpg)
31
Practice #7: Wizards
• A Wizard interface in Notes Client: Create a form with a tabbed table Set the tabs to “1,” “2,” “3,” etc. Select “Switch Rows Programmatically” Set the “name” field to the name of the table:
e.g., “RequestTable” Create a variable on the form with $Name:
e.g., “$RequestTable” Have “forward” and “back” buttons increment/decrement
the variable
![Page 32: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/32.jpg)
32
Practice #8: Consuming Web Services
• Two approaches: First, quick and dirty Install MS Soap on client machines Write LotusScript to create an MS Soap Object
Pro: Very quick, handy for testingCon: Platform specific, requires DLL
on clients, no timeout
Dim Client As VariantSet Client = CreateObject("MSSOAP.SoapClient") 'Initialize connection to the Web ServiceCall Client.mssoapinit ("http://localhost/testWS.nsf/Simple?wsdl") 'Call our simple GetEmailAddress function provided by Web service Dim result As Stringresult = Client.getJoke() 'output result to message box Messagebox result, 48, "Get Joke"
![Page 33: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/33.jpg)
33
Practice #8: Consuming Web Services (cont.)
• Two approaches: Second, big and robust Create a Java Agent that you pass a Notes document to – with
all your setup information Read the document in your Java Agent, and consume the
Web service Write the results back to your Notes document Once the Java Agent returns, read the document for
the results Pro:
Multi-platform, scalable Con:
Quite a lot of work
![Page 34: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/34.jpg)
34
Practice #9: Evaluate
• Evaluate allows you to run @Functions within LotusScript
• Sometimes faster, easier• Example:
evaluate(|@unique|)• DON’T:
Overuse it. Lots of LotusScript functions mimic @functions strRight == @StrRight
![Page 35: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/35.jpg)
35
Practice #10: “Trusted Servers”
• Scheduled Agents cannot normally open databases on other servers “Trusted Servers” field in R6 server document, security
section allows servers to “trust” other servers This allows you to centralize “collection” Agents Caveat: Don’t trust servers in another domain!
• Pros: Simplifies architecture Fewer Agents
• Con: Relies on fast, reliable network infrastructure …
![Page 36: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/36.jpg)
36
What We’ll Cover …
• Introduction• Theory• Practice• Advanced• Wrap-up
![Page 37: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/37.jpg)
37
Advanced #1: Custom Classes
• What are Custom Classes? Custom Classes help to:
Bundle data and code in one placeDecompose problems into “objects”Write smaller, more focused codeDefine and implement the internal data model
Custom Classes aid reusabilityPros: Good design methodology, leads to JavaCons: “Different,” and takes time to sink in
![Page 38: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/38.jpg)
38
Advanced #1: Custom Classes (cont.)
Class Person private nName as NotesName private strUNID as String
sub new(strNewName as string, strNewUNID asString) me.nnName = new NotesName(strNewName) me.strUNID = strNewUNID end sub
public function getName as String if (me.nnName is nothing) then exit function getName = nnName.Canonical end function
public function getUNID as String getUNID = strUNID end functionend class
![Page 39: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/39.jpg)
39
Advanced #2: Understanding Binding
• There are two types of binding: Early: Set by the compiler
Pros: Type checking, speed, and ease of useExample: “Dim S as String”
Late: Set at run-timePros: Flexibility, NO type checkingCons: Performance, run-time errors
Dim V as variantDim S as new NotesSessionset V = S.CurrentDatabase
print V.getTitle()
![Page 40: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/40.jpg)
40
Advanced #2: Understanding Binding (cont.)
Function ListCollection(p as variant) as integer test = false
if (typeName(p) = “NOTESVIEW”) or _ (typeName(p) = “NOTESDOCUMENTCOLLECTION”) then ' decompose this collection into a number of ' single document calls to myself dim doc as NotesDocument set doc = P.getFirstDocument while (not doc is nothing) call listCollection(doc) set doc = p.getNextDocument(doc) wend else ' We've been passed a single document. ' Process it. Print “I have been passed doc: “ + doc.Title(0) test = true end if
end function
![Page 41: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/41.jpg)
41
Advanced #3: Coding for Performance
• Remember: Expensive operations include: Opening databases and views Documents with lots of fields
• When collecting data: Cache views where possible Use NotesViewEntry instead of opening documents
![Page 42: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/42.jpg)
42
Advanced #3: Coding for Performance (cont.)
• Performance example: 100,000 document database 7 hours for “open every document in Database”
Not using views 60 minutes using NotesView and opening documents 12 minutes for “NotesViewEntry”
See also:Application Performance Techniques for Notes and Web Clients(Jamie Magee)
![Page 43: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/43.jpg)
43
Advanced #4: Lists and Custom Classes
• Custom Classes bind complex data and operations• Lists look these up quickly in memory
Example: Let’s extend our Person class:
dim People list as Persondim PeopleByUNID list as Person
Dim P as new Person(“Joe Bloggs/ACME”, “010101010201020”)....set People(P.getName) = Pset PeopleByUNID(P.getUNID) = P
if (isElement(People(“Joe Bloggs/ACME”))) then _ Print “Joe's UNID is: “ + People(“Joe Bloggs/ACME”).getUNID
if (isElement(PeopleByUNID(“010101010201020”))) then _
Print “UNID '010101010201020' is: “ + _ PeopleByUNID(“010101010201020”).getName
![Page 44: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/44.jpg)
44
Advanced #5: Class Inheritance
• Class inheritance allows us to “Extend” classes to add functionality:
class StaffPerson as Person private strStaffID as String
sub new(strNewPerson as String, strNewUNID as String) end sub
public function setStaffNumber(newNo as String) strStaffID = newNo end function
public function getStaffNumber as String getStaffNumber = me.strStaffID end functionend class
![Page 45: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/45.jpg)
45
Advanced #6: Encapsulation
• Encapsulation allows us to include other complex types in our classes: Allows you to collect different types of
complex information
class Department private headOfDepartment as Person private members list as Person as String private departmentname as String private Locations list as String
…end class
![Page 46: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/46.jpg)
46
Advanced #7: Version-Specific Code with Classes
Class createUser function createUser(...) as integer .... end function ….end class
Class createUserv6 as createUser function createUser(...) as integer .... end functionend class
Dim s as new NotesSessiondim vCU as variant
select case s.version case 5 set vCU = new createUser() case 6 set vCU = new createUserv6() case else Print “Version not supported” set vCU = nothingend case
if (not vCU is nothing) then _ call vCU.CreateUser(....)
![Page 47: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/47.jpg)
47
Advanced #8: LSI_Info()/GetThreadInfo
• LSI_INFO() gives some run-time information• Superceded by GetThreadInfo
GetThreadInfo(11) gives calling class GetThreadInfo(10) gives function name And lots more
• Why? Error trapping: We can track where we came from We don’t have to pass lists of parameters to error
trapping code Prevents “cut-n-paste coding” errors ...
![Page 48: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/48.jpg)
48
Advanced #8: LSI_Info()/GetThreadInfo (cont.)
Function RaiseError() Dim thisType As String Dim es as String thisType = Typename(Me) ' Not a class, use the calling module instead If (thisType = "") Then thisType = Getthreadinfo(11) es = thisType & "::" & Getthreadinfo(10) & ": "
If (Err = 0) Then es = es + "Manually raised an error" Else es = es + "Run time error: (" + Trim(Str(Err)) + ") " + _ Error$ + " at line: "+ Trim(Str(Erl)) End If
Print esend function
' calling code... ...ExitFunction: exit functionerrorhandler: Call RaiseError() resume exitFunctionend function
![Page 49: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/49.jpg)
49
Advanced #9: Execute
• Execute runs LotusScript code from a String: Example:
Why?Accommodates version/platform differences at run-time
Dim executeString as StringexecuteString = | print “Hello world” dim s as new NotesSession dim db as NotesDatabase set db = s.currentDatabase print “Current Database name is: “ + db.Title|
execute (executeString)
![Page 50: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/50.jpg)
50
Advanced #10: Mixing Java and LotusScript
• Use each language to its strengths: Java – good for Web services, network I/O, multi-threaded
operations LotusScript – traditional Notes development language, works
in UI• How to mix:
Simple: Call an Agent, passing a Notes DocumentFast. I didn’t say you had to save the document!Works both ways
LS2JCall Java from LotusScriptExample on the next slide ...
![Page 51: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/51.jpg)
51
Advanced #10: Mixing Java and LotusScript …
// Create a Script Library of type “Java” called xlib// containing the following function: public class calculator {
public int add(int a, int b) { return a + b; }
public int div(int a, int b) { return a / b; }
public int mul(int a, int b) { return a * b; }
public int sub(int a, int b) { return a - b; }
}
Option PublicUse "xlib"Uselsx "*javacon"
Sub Initialize Dim mySession As JavaSession Dim myClass As JavaClass Dim calculator As JavaObject Dim a,b,c As Integer Set mySession = New JavaSession() Set myClass = mySession.GetClass("calculator") Set calculator = myClass.CreateObject() a = 10 b = 5 c = calculator.mul(a,b) MessageBox "a * b = " & c End Sub
![Page 52: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/52.jpg)
52
What We’ll Cover …
• Introduction• Theory• Practice• Advanced Tips• Wrap-up
![Page 53: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/53.jpg)
53
Resources
• Homework: Classes – my OO presentation
www.billbuchan.com/web.nsf/htdocs/BBUN6MQECQ.htm Steve McConnell, “Code Complete, Second
Edition” (Microsoft Press, 2004)www.amazon.com/gp/product/0735619670
Duffbert’s presentation on Javahttp://hostit1.connectria.com/twduff/home.nsf/htdocs/
TDUF5VAQSY.htm Bob Balaban, “Programming Domino 4.6 with Java” (M&T
Books, 1998)http://www.amazon.com/gp/product/1558515836
![Page 54: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/54.jpg)
54
Resources (cont.)
• LS 2004/AD104 – LotusScript Tips & Tricks http://www-10.lotus.com/ldd/sandbox.nsf/ecc552f1ab6e46e
4852568a90055c4cd/68797abc4efa809a85256e51006a2c8a?OpenDocument&Highlight=0,AD104
• nsftools – Notes Tips www.nsftools.com/tips/NotesTips.htm
• The Notes FAQ! www.keysolutions.com/NotesFAQ/
![Page 55: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/55.jpg)
55
Resources (cont.)
• Brian Benz and Rocky Oliver, “Lotus Notes and Domino 6 Programming Bible” (Wiley, 2003) www.amazon.com/gp/product/0764526111
• Notes.net (of course) www.notes.net
• Articles in THE VIEW André Guirard, “Speed up view development — A LotusScript
agent to automatically create a view with fields from any form” (THE VIEW, July/August 2006)
Mikkel Heisterberg, “Self-documenting LotusScript code” (THE VIEW, January/February 2006)
![Page 56: The View - 30 proven Lotuscript tips](https://reader033.fdocuments.net/reader033/viewer/2022042623/547e19d7b47959a2508b4aa3/html5/thumbnails/56.jpg)
56
7 Key Points to Take Home
• You never stop learning good development techniques• Develop your code for maintenance• Good architecture is the best starting point• Understand the problem area before proposing
solutions• Spend a little time each day reading blogs, “THE VIEW,”
and the support database Even though specific articles may not be of immediate
interest, they may pay off in the future• A problem shared/discussed is a problem better defined• Have fun and enjoy your work