Lotus DEvCon 2000 - LotusScript Tips and Techniques
-
Upload
hiroaki-komine -
Category
Technology
-
view
228 -
download
3
Transcript of Lotus DEvCon 2000 - LotusScript Tips and Techniques
LotusScript Tips and TechniquesLotusScript Tips and Techniques
ロータス株式会社、開発本部ロータス株式会社、開発本部 小峯小峯 宏秋宏秋
今日のお話今日のお話
LotusScript LotusScript のちょっとしたテクニックのちょっとしたテクニック
文字列の扱い方、日付の扱い方文字列の扱い方、日付の扱い方
プラットフォーム依存の機能を使うプラットフォーム依存の機能を使う
スクリプトライブラリの利用スクリプトライブラリの利用
エージェントエージェント
RunOnserverRunOnserver
デバッグデバッグ
日本語別名日本語別名
LotusScriptLotusScript
@@関数関数
文字列の扱い方文字列の扱い方
文字定数文字定数
リテラル文字の文字区切りリテラル文字の文字区切り
" " (" " (二重引用符二重引用符))
| | (| | (縦棒縦棒))
{ } ({ } (中カッコ中カッコ) )
文字列の中に区切り文字を使うときは文字列の中に区切り文字を使うときは......
2回繰り返す2回繰り返す " "これはこれは "" "" 引用文引用文 "" "" です。です。"" { {これはこれは { { 引用文引用文 }} }} です。です。}}
または、別の文字区切りを使うまたは、別の文字区切りを使う | |これはこれは " " 引用文引用文 " " です。です。||
利用例利用例 (1) (1)
スクリプト内での式の利用スクリプト内での式の利用Evaluate ( Evaluate ( formula$, [object]formula$, [object] ) )notesDatabase.Search( notesDatabase.Search( formula$,formula$,
notesDateTime, maxDocs%notesDateTime, maxDocs% ) )
Dim db As New NotesDatabase( "Server", "sample.nsf" )Dim collection As NotesDocumentCollection .....
formula$ = "Form = ""Project"" ReminderDate = @Today"Set collection = db.Search( formula$, NotesDateTime, 0 )
利用例利用例 (1) (1)
スクリプト内での式の利用スクリプト内での式の利用Evaluate ( Evaluate ( formula$, [object]formula$, [object] ) )notesDatabase.Search( notesDatabase.Search( formula$,formula$,
notesDateTime, notesDateTime, maxDocs%maxDocs% ) )
Dim db As New NotesDatabase( "Server", "sample.nsf" )Dim collection As NotesDocumentCollection .....
formula$ = "Form = ""Project"" ReminderDate = @Today"formula$ = {Form = "Project" ReminderDate = @Today}Set collection = db.Search( formula$, NotesDateTime, 0 )
| (| (縦棒縦棒) ) やや { } ( { } (中カッコ中カッコ) ) には複数行の文字には複数行の文字列が書ける列が書ける
文字定数文字定数 (2) (2)
msgtext$ = "文書の情報" & Chr$(10) & _ "作成者 = " & authorName$ & Chr$(10) & _ "作成日 = " & creationDate$ & Chr$(10) & _ "文書タイトル = " & subject$
" (" (二重引用符二重引用符) ) でもできますがでもできますが...... ファイル出力などで問題が出るかもファイル出力などで問題が出るかも
利用例利用例 (2) (2)
フォーマットした文字列の出力フォーマットした文字列の出力
Sub Click(Source As Button)...msgtext$ = |文書の情報
作成者 = | & authorName$ & |作成日 = | & creationDate$ & |文書タイトル = | & subject$ & |
"OK" ボタンを押してください。処理を続行します。|
Messagebox msgtext$
End Sub
文書の情報作成者 = Hiroaki Komine作成日 = 00/10/25文書タイトル = 原稿
"OK" ボタンを押してください。処理を続行します。
OK
文字列の演算文字列の演算
"+" "+" それともそれとも "&" "&" を使うべきかを使うべきか
演算子によって結果が違う演算子によって結果が違う...???...???
& ... & ... 2つのを文字列を連結2つのを文字列を連結オペランドが数値なら、まず文字に変換オペランドが数値なら、まず文字に変換
+ ... + ... はオペランドによって動きが変わるはオペランドによって動きが変わる !! !!
オペランドがどちらも数値なら加算オペランドがどちらも数値なら加算
どちらも文字列なら連結どちらも文字列なら連結
文字列の演算文字列の演算 (2) (2)
もしオペランドが数値と文字列だったらもしオペランドが数値と文字列だったら var1=5, var2="123" var1=5, var2="123" var1 + var2 = ??? var1 + var2 = ???
結果は結果は
あるときはあるときは "5123" "5123"
またあるときはまたあるときは 128 128
不安定な結果を生まないために不安定な結果を生まないために
文字列の連結には文字列の連結には "&" "&" を使うを使う
数値計算では明示的にデータ型の変換数値計算では明示的にデータ型の変換ををCint, Clng, Csng, CdblCint, Clng, Csng, Cdbl
Dim num1 As IntegerDim num2 As VariantDim st As String
文字列の演算文字列の演算 (3) (3)
num1 = 5num2 = 5st = "123"
Messagebox num1 + num2 ' 10Messagebox num1 & num2 ' "55"Messagebox num1 & st ' "5123"Messagebox num2 & st ' "5123"Messagebox num1 + st ' 128Messagebox num2 + st ' "5123"
文字演算の関数文字演算の関数
Left, Right, Mid, Len, InStrLeft, Right, Mid, Len, InStr
目的に応じて4種類目的に応じて4種類
Left - Left - 文字数文字数
LeftB - LeftB - ユニコードバイト数ユニコードバイト数
LeftBP - LeftBP - プラットフォーム数プラットフォーム数
LeftC - LeftC - 表示上の文字数表示上の文字数 - R5 - R5 からの新関数からの新関数
文字演算の関数文字演算の関数 (2) (2)
Left("ABCあいうえお", 6) => "ABCあいう"
LeftB("ABCあいうえお", 6) => "ABC"
LeftBP("ABCあいうえお", 6) => "ABCあ"
LeftC("ABCあいうえお", 6) => "ABCあいう"
文字演算の関数文字演算の関数 (3) (3)
LeftB v.s. LeftBPLeftB v.s. LeftBP
BP BP はプラットフォーム依存のバイトはプラットフォーム依存のバイト Visual BASIC Visual BASIC のの LeftB LeftB と互換と互換
しかし、動きはプラットフォーム依存しかし、動きはプラットフォーム依存 ( (ノーツノーツ//ドミノにはお薦めしませんドミノにはお薦めしません!)!)
LeftCLeftC
R5 R5 の新しい関数の新しい関数
C C はカラムはカラム (Column) - (Column) - 表示上の文字数表示上の文字数
タイ語やインド語のための関数タイ語やインド語のための関数
パフォーマンスパフォーマンス......
同じく日付同じく日付//時刻の演算時刻の演算
日付・時刻の内部形式は日付・時刻の内部形式は Double Double の浮動小の浮動小数点数数点数
データ宣言にはデータ宣言には Variant Variant
MsgBox MsgBox 関数やデバッガでは関数やデバッガでは String String に自動に自動変換変換
フォーマットはフォーマットは OS OS の設定に依存の設定に依存
OS: OS: コントロールパネルコントロールパネル→→地域設定地域設定
日付・時刻の加減算日付・時刻の加減算
Sub Click(Source As Button)Dim vdate As VariantDim ival As Integer
vdate = Todayival = 5
Messagebox "vdata + ival = " & Cstr(vdate + ival)Messagebox "vdata - ival = " & Cstr(vdate - ival)
End Sub
5日進める
5日遅らせる
日付・時刻の加減算日付・時刻の加減算 (2) (2)
デモデモ
日付の加減算日付の加減算
時刻の加減算時刻の加減算
同じく日付同じく日付//時刻の演算時刻の演算 (2) (2)
String String を使うと日付が変わるを使うと日付が変わる...??...??
日付・時刻の受渡しには日付・時刻の受渡しには String String 変数は使変数は使わないわない
特に和暦のときに注意特に和暦のときに注意 12 12年年 ⇒⇒ 平成平成1212年年 or or 西暦西暦20122012年年 ??? ???
日付・時刻へのデータ変換には日付・時刻へのデータ変換には Cdat Cdat
DateValue/TimeValue DateValue/TimeValue に注意に注意
日付・時刻の変数 (1)Variant (Double)
日付・時刻の変数 (2)Variant (Double)
String
DateValue()
CDat()
Dim vDate As VariantDim sDate As String
vDate = TodaysDate = Today
Messagebox "vDate = "& vdate ' 12/10/25Messagebox "sDate = "& sdate ' 12/10/25Messagebox "CDat(vDate) = " & Cdat(vdate) ' 12/10/25
Messagebox "CDat(sDate) = " & Cdat(sdate) ' 24/10/25Messagebox "DateValue(vDate) = " & Datevalue(vdate) ' 24/10/25
平成12年10月9日
String String を使ったときの問題を使ったときの問題
コントロールパネル/地域設定和暦 - y/m/d
日付・時刻定数は日付・時刻定数は ? ?
日付・時刻を文字列で定義しない日付・時刻を文字列で定義しない
文字列の解釈は文字列の解釈は OS OS の設定に依存の設定に依存
年月日の並び年月日の並び
元号の解釈元号の解釈
日付・時刻を埋め込むときは日付・時刻を埋め込むときは......
DateNumber / TimeNumberDateNumber / TimeNumber
Dim dt As Variantdt = DateNumber (1969,7,20) + TimeNumber (20,17,40)
西暦1969年7月20日午後8時17分40秒
プラットフォーム依存の機能を使うプラットフォーム依存の機能を使う
プラットフォーム依存の機能を使うプラットフォーム依存の機能を使う
ロータススクリプトはマルチプラットフォームロータススクリプトはマルチプラットフォーム対応対応
コンパイルされたスクリプトは複製されるコンパイルされたスクリプトは複製される
もしプラットフォームに依存する機能を使もしプラットフォームに依存する機能を使うならうなら ..... .....たとえばたとえば
IME IME 関連関数関連関数
ファイル操作関数ファイル操作関数
Win32 API Win32 API コールコール
LSXLSX
プラットフォーム依存の機能を使うプラットフォーム依存の機能を使う (2) (2)
IsDefined IsDefined 関数関数 - - ランタイム関数ランタイム関数
実行時にプラットフォーム情報を取得実行時にプラットフォーム情報を取得
プラットフォーム識別定数はデザイナーヘプラットフォーム識別定数はデザイナーヘルプのルプの %if %if の項目に記載の項目に記載
LINUX - R5.02 LINUX - R5.02 よりより
WIN98/WIN2K - R5.03 WIN98/WIN2K - R5.03 よりより
ノーツノーツ//ドミノのスクリプトはコンパイルされドミノのスクリプトはコンパイルされた中間コードが複製されるので、た中間コードが複製されるので、%if %if でコンでコンパイル時の切り替えはできないパイル時の切り替えはできない
Sub Click(Source As Button)Dim cdrive As StringDim cdir As String
If (isdefined("WIN32")) Thencdrive$ = Curdrive$()
ElseIf (isdefined("MAC")) Then
cdir$ = Curdrive$()cdrive$ = Left$(cdir$, Instr(1, Dir$, ":"))
End IfEnd If
Messagebox ("ドライブ名 : " & cdrive$)End Sub
プラットフォーム依存の機能を使うプラットフォーム依存の機能を使う (3) (3)
LSX LSX ロードの問題ロードの問題
LSX - LotusScript eXtensionLSX - LotusScript eXtension
C/C++ C/C++ で作成されるユーザー定義のクラスで作成されるユーザー定義のクラス
C/C++ C/C++ のアプリケーションモジュールのアプリケーションモジュール (.dll (.dll or .so) or .so) でノーツプログラムディレクトリに提供でノーツプログラムディレクトリに提供
モジュールはモジュールは OS OS 毎にビルド毎にビルド
ノーツデータベースとともに複製されないノーツデータベースとともに複製されない
スクリプトは複製されるのでスクリプトは複製されるので
スクリプト実行開始時にロードしようとするスクリプト実行開始時にロードしようとする
ON ERROR ON ERROR では処理できないでは処理できない - "Uselsx error" - "Uselsx error"
オプショナルオプショナル LSX LSX
Notes R5.03 Notes R5.03 からの新機能からの新機能
USELSX "?YourLsx"USELSX "?YourLsx"
LSX LSX モジュールがなくとも、元のスクリプトモジュールがなくとも、元のスクリプトは実行可能は実行可能
LSX LSX 内のクラス内のクラス//関数が呼ばれたときに関数が呼ばれたときに
実行時エラー実行時エラーErrUnknownClassId(230)ErrUnknownClassId(230)ErrErrorinLoadingDll(48)ErrErrorinLoadingDll(48)
スクリプトライブラリの利用スクリプトライブラリの利用
スクリプトライブラリスクリプトライブラリ
ノーツの設計要素の一つノーツの設計要素の一つ
いろいろな設計要素から呼び出せるいろいろな設計要素から呼び出せる
エージェント、フォーム、ボタンエージェント、フォーム、ボタン
他のスクリプトライブラリ他のスクリプトライブラリ
ユーザー定義の関数やサブルーチンのセットユーザー定義の関数やサブルーチンのセット
たとえばたとえば......
ソートや検索ソートや検索
高度な文字列比較高度な文字列比較
ビット演算ビット演算
スクリプトライブラリスクリプトライブラリ - - 使い方使い方
作成作成
ドミノデザイナードミノデザイナー[[作成作成] - [] - [設計設計] - [] - [スクリプトライブラリスクリプトライブラリ]]
関数やサブルーチンの作成関数やサブルーチンの作成
ライブラリ名を付けて保存ライブラリ名を付けて保存
呼出し呼出し
スタッティックスタッティック ( (普通の呼出し方普通の呼出し方))
(Options) (Options) セクションでセクションでUse "library_name"Use "library_name"
ダイナミックダイナミックExecute | Use "library_name" ... |Execute | Use "library_name" ... |
スクリプトライブラリスクリプトライブラリ - - スタティックスタティック
プログラムの保存時プログラムの保存時
参照されたすべてのスクリプトライブラリがロード参照されたすべてのスクリプトライブラリがロード
呼出し元スクリプトのコンパイルのために参照呼出し元スクリプトのコンパイルのために参照
Sub, Functions, Const, Type, ClassSub, Functions, Const, Type, Class
ライブラリに問題があれば、コンパイルエラーをライブラリに問題があれば、コンパイルエラーを表示してコンパイル中止表示してコンパイル中止
スクリプトライブラリスクリプトライブラリ - - スタティックスタティック (2) (2)
プログラム実行時プログラム実行時
参照されるクリプトライブラリがロード参照されるクリプトライブラリがロード
すべてのライブラリが正しくロードされなくすべてのライブラリが正しくロードされなくてはならないてはならない
すべての外部参照を検証すべての外部参照を検証Sub, Function ...Sub, Function ...
エラーがあれば実行されないエラーがあれば実行されない
スクリプトライブラリスクリプトライブラリ - - ダイナミックダイナミック
Use Use 文と処理内容を文字列としてを文と処理内容を文字列としてを Execute Execute に渡すに渡す
if condition=True thenExecute | Use "MyLibrary"
Call MySub ( ... )
val = MyFunc( ...) |Else
...End If
スクリプトライブライブラリスクリプトライブライブラリ - - ダイナミックダイナミック
必要なときに必要なライブラリがロードされる必要なときに必要なライブラリがロードされる
注意注意!!
保存時のコンパイルチェックはされない保存時のコンパイルチェックはされない
利点利点
不要なライブラリはロードされない不要なライブラリはロードされない
再起呼出しのチェックもパス再起呼出しのチェックもパス
Main
Sub01 Sub02
便利ですが便利ですが......制限があります制限があります
コンパイルエラーは実行時に発生コンパイルエラーは実行時に発生
デバッグできないデバッグできない
実行時にコンパイルされ、終了後に実行時にコンパイルされ、終了後にただちに捨てられるただちに捨てられる ⇒⇒ パフォーマンスは悪いパフォーマンスは悪い
スクリプトライブライブラリスクリプトライブライブラリ - - ダイナミックダイナミック
スクリプトライブラリで良くある問題スクリプトライブラリで良くある問題
スクリプトライブラリの定数スクリプトライブラリの定数
定数は呼出し元のオブジェクトに保存される定数は呼出し元のオブジェクトに保存される
呼出しもとの再コンパイル忘れ呼出しもとの再コンパイル忘れ
AAととBBがスクリプトライブラリがスクリプトライブラリCCを利用を利用
CCを編集してを編集してAAを再コンパイルを再コンパイル
BBはそのままで、実行時エラーはそのままで、実行時エラー
Notes UI Notes UI クラスの使用クラスの使用
開発:クライアント側開発:クライアント側運用:サーバエージェント運用:サーバエージェント
エージェント利用とデバッグエージェント利用とデバッグ
リモートエージェントリモートエージェント
NotesAgent.RunOnServer - R4.62 NotesAgent.RunOnServer - R4.62 からから
分散環境でのスクリプトの実行分散環境でのスクリプトの実行
重い作業、特殊な作業での重い作業、特殊な作業でのエージェントの利用エージェントの利用
クライアントクライアント//サーバーモデルサーバーモデル
ノーツノーツIDIDによるデータ交換によるデータ交換 - R5.02 - R5.02 からから
リモートエージェントの呼出し例リモートエージェントの呼出し例
データ交換する文書のノーツ ID
Set agent = db.GetAgent("LoadEmployeeAgent")Set doc = db.CreateDocument
Set item = doc.AppendItemValue("HR_ID", hr_id)Call doc.save(True, False)
paramDocID = doc.NoteIDCall Agent.RunOnServer(ParamID)
Delete doc
リモートエージェントのコード例リモートエージェントのコード例
Set agent = session.CurrentAgent
' データ受け渡し用の文書 ID を取得NotesID$ = agent.ParameterDocID
' 文書のデータを参照Set doc = db.GetDocumentById(NotesID$)Set item = doc.GetFirstItem("HR_ID")hr_id = item.text
...
' サーバーでの処理を実行' - ノーツデータベースの検索' - SQL コマンドの実行' などなど
Set item = doc.AppendItemValue("FirstName", FIRST)Set item = doc.AppendItemValue("LastName", LAST)Set item = doc.AppendItemValue("Division", DIVISION)
Call doc.save(True, True)
リモートエージェントのコード例リモートエージェントのコード例 (2) (2)
呼出しコードの注意呼出しコードの注意
バックエンドで文書が更新されるバックエンドで文書が更新される
スクリプトで保持している文書オブジェクトスクリプトで保持している文書オブジェクトは古くなっているは古くなっている
' 呼出し元コードのつづき
' 既存の文書オブジェクトは削除Delete Doc
' 文書オブジェクトの再取得Set doc = db.GetDocumentByID(ParamDocID)FIRST = doc.GetItemValue("FirstName")
スクリプトデバッグのヒントスクリプトデバッグのヒント
スクリプトアプリケーションの実行時の情報スクリプトアプリケーションの実行時の情報をどのようにとるかをどのようにとるか??
たとえばたとえば......作成したアプリケーションがスクリプトエラー作成したアプリケーションがスクリプトエラーを起こしているを起こしている......しかし、その関数がどのように呼ばれていしかし、その関数がどのように呼ばれているかわからないるかわからない......
スクリプトのデバッグのヒントスクリプトのデバッグのヒント (2) (2)
GetThreadInfo - R5 GetThreadInfo - R5 からの新しい関数からの新しい関数例例
%Include "lsprcval.lss"
GetThreadInfo ( LSI_THREAD_VERSION) ロータススクリプトのバージョンを文字列で返す
"4.0.0.21"
ID 意味
LSI_THREAD_LINE 現在の行番号
LSI_THREAD_PROC 現在のプロシージャの名前
LSI_THREAD_MODULE 現在のモジュールの名前
LSI_THREAD_VERSION ロータス スクリプトのバージョン番号
LSI_THREAD_LANGUAGE 各国語設定
LSI_THREAD_COUNTRY 国別設定
LSI_THREAD_TICKS 国別設定
LSI_THREAD_TICKS_PER_SEC 秒ごとのクロックの刻みを取得
GetThreadInfo GetThreadInfo のパラメータのパラメータ
日本語別名の使用日本語別名の使用
日本語別名の処理のための拡張日本語別名の処理のための拡張
NotesSession.UserName NotesSession.UserName ←← ユーザー名ユーザー名 ( (基本名のみ基本名のみ))
NotesSession.UserNameListNotesSession.UserNameList ←← NotesName NotesName クラスのリストクラスのリスト
UserNameList(0) - UserNameList(0) - 基本名基本名
UserNameList(1) - (UserNameList(1) - (日本語日本語))別名別名
日本語別名日本語別名
日本語別名処理のコード例日本語別名処理のコード例
Dim session as new NotesSession
Dim namelist as variant
Dim nname as NotesName
namelist = session.UserNameList
forall nname in namelist
print "Common name =" & nname.common
print "Language =" & nname.language
end forall
@関数での日本語別名の処理@関数での日本語別名の処理
ユーザ名と言語情報ユーザ名と言語情報
@UserName(1) - @UserName(1) - ユーザーの日本語別名ユーザーの日本語別名
@UserNameLanguage(1) - @UserNameLanguage(1) - 別名の言語別名の言語 日本語なら日本語なら "ja" "ja"
言語タグの文字列への変換言語タグの文字列への変換
@Locale@Locale
@Locale ([LocaleName]; "ja-JP") ⇒ "日本語(日本)"
@Locale ([LanguageName]; "ja-JP") ⇒ "日本語"
@Locale ([CountryName]; "ja-JP") ⇒ "日本"
@関数での日本語別名の処理@関数での日本語別名の処理
他のユーザの別名他のユーザの別名((基本名基本名))の検索の検索
@NameLookup@NameLookup
ドミノディレクトリを検索する。ドミノディレクトリを検索する。
@NameLookup([Exhaustive];"Hiroaki Komine/TYO/Lotus"; "AltFullName")
⇒ "小峯 宏秋/東京/ロータス"
Next Release Next Release での計画での計画
コア機能の追加コア機能の追加
データタイプの追加データタイプの追加 - BYTE/BOOLEAN - BYTE/BOOLEAN
ビルトイン関数の追加ビルトイン関数の追加
Java Java オブジェクトの参照オブジェクトの参照
外部オブジェクトとの接続外部オブジェクトとの接続
JSP JSP との統合との統合
SOAPSOAP
リモート・デバッグリモート・デバッグ
データベース・リコンパイルデータベース・リコンパイル