nsfl10n

Lotus Notes/Domino のブログ。nsf:Notes Storage Facility。l10n:Localization。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告|
  3. トラックバック(-)|
  4. コメント(-)

カスタムOK/キャンセルボタンと入力チェック

CustomOKCancelDialogs.png ButtonTypes.png
Custom OK/Cancel Buttons and Validation

 皆様と共有したいと思う面白いことを発見しました。ダイアログボックスでオリジナルな(Notesが生成するデフォルトのボタンじゃない)OK/キャンセルボタンを使いたい方だけにぴったりな情報ですが。この話をご存じない方でも、ダイアログボックスでOKとキャンセルボタンを指定することが出来ることあご存じかと。ダイアログフォームにホットスポットボタンを追加して、"OK"か"キャンセル"というボタンの種類("ヘルプ"というのもある)を選べばいい(こちらの画像参照)。ボタンの中には何もロジックを組み込んではいけない。そして、ダイアログボックスを呼ぶ出すロジックの中で、NotesにOKボタンとキャンセルボタンを表示させないようにします。それは、それぞれスクリプトのws.DialogBox メソッドの4番目と11番目のパラメーターです。

 サンプルコード:

Sub Click(Source As Button) Dim ws As New NotesUIWorkspace Dim doc As NotesDocument Set doc = ws.CurrentDocument.Document If ws.DialogBox("sfrmTemp", True, True, True, False, False, False, "Title", doc, True, True) Then Msgbox "OK がクリックされました" Else Msgbox "キャンセルがクリックされました" End If End Sub

 4番目のパラメータが"True"だとキャンセルボタンが非表示で、11番目のパラメータが"True"だと、OKボタンが非表示になります。

 そして、これがオリジナルなOK/キャンセルボタンを作成する方法になります。しかし、これがこの Tip のポイントではありません。この Tip の目的は、オリジナルなOKキャンセルボタンを使うときに分かっただけのものです。 このダイアログフォーム上のフィールドに input validation チェックが入ってると、オリジナルOK/キャンセルボタンが使えなくなります。どうしてこうなるのか理由は定かではありませんが、問題が起こりうる場合というのは説明することができます。ダイアログボックスを開いて、入力チェックにひっかかっている(例えば未入力の場合とか)のにOKボタンを押したとき、入力チェックプロンプトのOKボタンを押してしまうと、OK/キャンセルボタンが効かなくなってしまうのです(どちらを押してもダイアログボックスは開いたままです)。一番最初にすべての入力チェックをパスした場合だけ、すべてうまく機能してくれます(ダイアログボックスは閉じる)。

 つまり、カスタムOK/キャンセルボタンが機能するのは最初だけで、ダイアログボックスを閉じることなくもう一度オープンしたりすると機能しなくなるということになります。これを回避する次善策としては、入力チェックはダイアログフォームを呼び出すスクリプトの中でやるということになります。例:

Sub Click(Source As Button) Dim ws As New NotesUIWorkspace Dim doc As NotesDocument Dim continue As Variant Set doc = ws.CurrentDocument.Document continue = True While continue If ws.DialogBox("sfrmTemp", True, True, True, False, False, False, "Title", doc, True, False) Then If doc.GetItemValue("Name")(0) = "" Then Msgbox "nameフィールドを入力してください.", 16, "フィールドの値が正しくありません" Else continue = False End If Else continue = False End If Wend End Sub

 ユーザーがキャンセルをクリックされるまで(ws.DialogBox メソッドは False を返しますので)、または、name フィールドが入力されるまで、whileループが続きます。name フィールドを入力しないと、メッセージボックスが表示されて、ループ処理が続きます。そして、入力チェックは下のフォームの代わりにスクリプトで実行されます。文書はリセットされないので、ユーザーが入力した文字列が消えてしまうことはありません。これは、ユーザーが Name フィールドが体という理由だけで最初からやり直す必要がなくなるということです。他の項目に入力された値は保護されます。

 もし、複数の入力チェックを行う必要があるなら、Elseif 条件を追加していけば問題ありません。入力チェックすべてにパスしたら、continue に Falseがセットされて、ループ処理から抜けます。

===引用ここまで===

 例示コードは、dim 宣言とかを追加してます。にしても、いまいち、いい使い道が思いつかないTipではありますが。個人的には、大した意味もなく無闇矢鱈にNotesの標準インターフェースから外れるべきではないとも思います。。。ところで、ND6から、input validationって「入力の確認」というヘンな日本語に変わったんですね。その真下にある「入力が有効」って使い道が分からないし、誤訳っぽい?(汗)。

This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.
スポンサーサイト
  1. 2005/05/29(日) 01:40:28|
  2. Designer|
  3. トラックバック:0|
  4. コメント:0

Lotus Domino R6 と Windows Active Directory のシングルサインオン

Lotus Domino R6 and Windows Active Directory SSO

 R6で、この仕様に関する手続が変わった。

 これを設定する際に、Jake のDomino HTTP スタックの代替手段という記事を見つけたが、R5に関するものだった。R6 のシステム管理ヘルプにはほんの少ししか記述がなかった。しかも、いくつか間 違ってた。IBMのサイトをちょっと検索してみたところ、Domino R6 を Microsoft の IIS サービスとともに有効化させるには どうしたらいいかという文書を見つけた。3ページに渡って、細かい設定方法が 記述されていた。しかし、SSOを設定 するには不十分だった。

 細かい部分については、Microsoft IIS セキュリティオプションの詳細(日本語)という文書がR6ヘルプにあった。ポイントとし ては、

  • ユーザー文書はADドメイン(Active Directory Domain)を必ず含まなければなら ず、ユーザー名はフルネームが必要。DOMAIN\UserName フォームになければならな い。例:MyADDomain\Shigeru Yoshida
  • サーバ自体が同じ Active Directory にユーザーとして登録されている必要が ある。
  • ユーザー文書の HTTPPassword フィールドは無視される。
  1. 2005/05/26(木) 23:32:26|
  2. Admin|
  3. トラックバック:0|
  4. コメント:0

@関数のループ処理を使いこなすには

 Looping Tricks for IBM Lotus Notes and Domino Developers

 Notes/Dominoの開発者の多くにとって、いちばんの実装して欲しい機能のひとつだったのが、@関数へのループ処理だ。そして、それはND6において、やっと実装された。3つの関数を使ってループ処理を実現できるようになったのだ。@For, @DoWhile, @While の3つだ。

@While と @DoWhile

 @While と @DoWhile は、基本的には同じものだ。同じ引数を必要とするが、しかし、違う命令なのだ。条件は次のようなものだ。

@While(test condition; code to run)

 または、

@DoWhile(code to run; test condition)

 テスト条件(test condition)は、コードを実行するために、必ず True を返す必要がある。そして、false になると実行を中止する。

 @While と @DoWhile との間の主な違いは、@While はテスト条件を最初にテストし、True が帰ってきたら、再度コードを実行する。それに対して、@DoWhile はコードを実行し、もう一度コードを実行するべきかどうか判断するために、テスト条件をテストするのだ。簡単に言うと、@While = テストしてから実行し、@DoWhile = 実行してからテストする、となる。

  1. 2005/05/24(火) 01:07:30|
  2. Designer|
  3. トラックバック:0|
  4. コメント:2

ND7.0 は管理機能の自動化だけでなくクライアントの拡張も

Besides automating administration, Release 7.0 enhances the client side as well

 Admin 2005において、IBM で Lotus Notes/Domino のワールドワイドの販売を指揮している Ed Brill が、(挙手によると)そのほとんどがND6か6.5ユーザーである、およそ300人の出席者に対して、リリース7の改良点についてのプレゼンテーションを行った。

 最も多くのフィードバックを受けたリリース7の特徴は、IBM DB2 データベースアプリケーションやツールが Domino のデータにアクセスするところである。この機能は、シンプルなメールDBを除いて、索引やデータ付きの大きなDBを利用するアプリケーションに、より良いパフォーマンスをもたらすだろう。また、"DB2用のすごいレポートツール vs あまりすごくないNotes用のレポートツール"という理由から、Domino ユーザーはこの機能に興奮するだろう、とも。

 曰く、リリース7.0は主にサーバのためのリリースで、しかも、できるだけ自動的に管理するようにデザインされている。拍手による判定に寄れば、観衆の中の管理者が気に入りそうな機能の一つは、エンドユーザーにメールやカレンダの設定をいじらせないクライアントポリシーロックダウン機能だろう。"ユーザーのNotesクライアントのあらゆる側面をコントロールすることが可能になるため、管理者はハッピーになれるだろう。そして、エンドユーザーが設定を変えてもプリファレンスが戻ってしまうのはなぜか、いまや明白になるだろう。"

 また、Brill はNotes/Dominoのレガシーな20万行ものコードを削ったことでボトルネックを取り除いたとも述べた。サーバを新しいコードに変えるだけで、Domino 7 はCPUの使用率を25%も下げることが示されたし、さらなる改善はまだまだ可能だ、とも。"これはサーバ強化の面からも組織にとって大きな利益になるだろう。"

 スケラービリティについても、リリース7で大きく向上した。"ヘルプデスクが私にメールボックスの割り当て容量を超えたと通知してきたら、それは10MBの添付ファイルがついたカレンダエントリが原因である場合もあると思う。しかし、新クリーンアップ機能を使えば、管理者はカレンダエントリもメールと同様にアーカイブすることが可能になるだろう。"

 7.0は主にサーバをアップグレードするリリースではあるが、Notes クライアントをアップグレードすることにもつながる。"クライアントサイドにおいてもリリース7にアップグレードする大きな価値がある。従って、管理者として、もしデスクトップの更改を考える必要がないと考えているなら、それは違う。"

 スマートタグのサポート機能によってもたらされるマイクロソフトとの統合が、Notes はユーザーのデスクトップにある他のツールとうまく動いてくれないという議論に終止符を打つことになるだろう。また、Notes 7.0 クライアントビューアーとフィルターはマイクロソフトの Office 2003 をサポートする、と。

 Notes 7.0 のオートセーブ機能も一部の出席者には受けが良かった。特に、アメリカのFujifilm Medical Systems 社でアプリケーションサーバのシステム管理者をしている Mike Brabo にとっては。彼が searchDomino に語ったところによると、"この機能はユーザーからヘルプデスクへの多くのコールを減らすことができるだろう。そして、それはヘルプデスクから私へのコールをなくすことを意味するのだ。"

 QAセッションにおいて、Brill は、出荷前の最後のパブリックベータであるベータ4は、6~8 週間以内にプレリリースされるだろうと発言した。"これはバグを見つけるか、または、あなたの平和を永遠に保持するための最後のチャンスになるでしょう"

====引用ここまで====

 5/18~20まで、ボストンで行われていたAdmin 2005 -- THE VIEW Administration Conference for Notes and Domino というカンファレンスで行われた講演から。こういうカンファレンスが開催され、Notes/Dominoの開発・販売陣からダイレクトに情報提供がなされる機会が設けられるというのは 非常に意義があります。ちなみに、料金は三日間で$1,600ぐらい。

 それに引き替え、日本ローカルはこんなんとかこんなんばっかだし・・・(苦笑)。

  1. 2005/05/22(日) 03:37:37|
  2. News|
  3. トラックバック:0|
  4. コメント:0

Notes 文書の背景色をダイナミックに変更する

colors.png
Dynamically change background color of a Notes doc

 文書の背景色を制御する $PaperColor フィールドについてはよく知られている。変更を反映するためには、文書を開き直さなければならないのが欠点だが。そして、239もの色番号につきまとわれる羽目になる。この Tip は、フォーム自身から色を選択してダイナミックに色を変更する方法だ。

  • まず、カラータイプを設定するフィールドを作る。ここでは DocColor フィールドとしよう。
  • 次に、その下にJavaScirpit式のボタンを作成する。
  • 次の JavaScriptのコードを記述する

document.bgColor = document.forms[0].DocColor.value.substr (2,6)

 この Tip は、カラーフィールドというフィールドの種類を使うので、ND6でのみ有効だ。このアイディアをR5で動くようにすると、JavaScriptの部分で機能が縮小してしまうだろう。

  1. 2005/05/21(土) 01:21:49|
  2. Designer|
  3. トラックバック:0|
  4. コメント:0

Notesユーザーの望む新機能はより良いUI

Notesユーザーの望む新機能はより良いUI

workspaces.png

Better UI tops Notes users' wish list

 IBMはすでに Lotus Notes の次のメジャーリリースである 7.0 以降に向けた作業に入っている。先週の、5月3日、N/Dのワールドワイドな販売を指揮しているEd Brill のブログサイトを訪れた人は、「もし Lotus Notes 7.x に機能をひとつ追加するとしたら、なにがいい?」と尋ねられた。

 マルチポストを回避することで「ひとつの」という制限を回避した回答もあったが、5月9日までに184のコメント、回答が寄せられた。

 そのスレッドを始めるに当たって、Brill 自身は、マルチレベル undo 機能をリクエストしていた。そしてそれには7人の回答者が賛同した。しかしながら、最も多かったリクエストが、ノーツのユーザーインターフェースへの改善だ。"Notes クライアントのUIにしわ取りが必要な時期に来て居るんじゃないか"と、ある回答者。Notes より Exchange の方がいいと誰かが言うと、"Outlook のインターフェースの方が、[Notes]のメールテンプレートより素晴らしいとみんな言う"と他の回答者が返す。

 ほんの一握りの回答がUIの改善提案について言及した。"ファーストクラスの、リッチな、自分でいじれる Web ポータルのような Welcome パネル"が欲しいと言う者もいた。また、もっとユーザーが自由に選択可能なビュー/フォルダのカラムで、ひとつの場所ですべてが設定可能なプリファレンスを持つとか、メールファイルの中にすでにある文書の設定に基づいて動くもの"と言ったUIの改善を提案する者も。さらに、"Notes と Web で統一されたひとつのUIを持った、セクシーでモダンなメールテンプレート"を希望する者までいた。

 ついには、あるユーザー曰く、"Notesのメール体験のすべての部分、すなわち、大部分のユーザーにとってもNotesのインターフェースであるツールバーからアイコンに至るまでの動きに関する部分に、一貫性があり、モダンで、キレイで魅力的であることに何の意味があるのだろうか。見た目がショボイなら優れたものを持つ意味など無い。"とまで言われてしまった。

P.S. Brill は、スレッドがとても扱いづらくなってしまったので、提案について猶予を求めた。

===引用ここまで===

 いや、ほんとその通りですね(笑)。使いにくすぎるノーツメール、Javaアプレットですべてを誤魔化そうとするWeb掲示板テンプレート、誰も使わないブックマーク、存在意義が未だに理解できないウェルカムページ、使い物にならないワークプレース、R4から進化しないワークスペース、誰も知らないし知りたくもないワークスペース形式のブックマーク、エクセルの表をテーブルとして貼り付けられないリッチテキスト、OKボタンを押すためだけに出てくるデバッグモードダイアログ、重すぎて立ち上げるたびに憂鬱になるNotesクライアント、、。

 そうか、これは Notes クライアントに幻滅させて、IBM workplace クライアントへの移行を促そうという陰b(以下略

  1. 2005/05/19(木) 00:27:17|
  2. Designer|
  3. トラックバック:0|
  4. コメント:0

WindowsのデスクトップにDBリンクを作成する

Create database link as shortcut on your Windows Desktop

 あらゆるリンク(文書、view、DB)は、Windowsのデスクトップにショートカットとして作成することができます。たとえ Notes クライアントを立ち上げていなくても、そのリンクを選択してオープンすることができるのです。更に、OSとパスワードを同期するオプションを選択していれば、Notes のユーザーIdパスワードすら入力する必要はありません。

操作方法:

 ショートカットを作成したいDBを開いて下さい。メニューから、編集 - リンクのコピー - (たとえば)文書リンク...を選択してください。そうしたら、すべてのプログラムウィンドウを最小化して、右クリックから「ショートカットの貼り付け」を選択してください。

===========

 こんなことやりたいと思ったことも、やりたいとも思わないのですが(苦笑)、いつか役に立つこともあるかも知れないのでメモメモ。。。(笑)

  1. 2005/05/18(水) 00:26:25|
  2. Client|
  3. トラックバック:0|
  4. コメント:0

LotusScriptで簡単にリストをソートする

LotusScriptで簡単にリストをソートする SharePlace.info | article | "Smart Sorting" of List In Lotus Script

 リストはLotusscriptで非常に強力がデータ構造だ。要素を加えたり、取得したりするのも簡単に出来る。ここではリストのアドバンテージについて細かく言うつもりはない。その代わり、Lotusscriptでリストを"ソートする"シンプルで効果的な方法を紹介させて頂きたい。この記事の終わりには、なぜ私がソートするという言葉に引用符ダブルコーテーションを使ったのかが明らかになるだろう。

 実際、Lotusscriptには、リストをソートしてくれるメソッドはないと思われる。ここに一つの解決方法がある - すなわち、連結された文字列を集めてすべてにリストのタグをつける。リストに用を加えるときはいつでも、文字列にリストタグも付ければいい。

Dim lstMyList List As String Dim strTags As String lstMyList ("B") = "List" strTags = |"B"| lstMyList ("A") = "Sorting" strTags = StrTags & |:"A"| lstMyList ("D") = "Simple" strTags = StrTags & |:"D"| lstMyList ("C") = "Is" strTags = StrTags & |:"C"|

ソート前print結果:

Forall elements In lstMyList Print elements End Forall List Sorting Simple Is

 リストにすべての要素を加え終わったら、連結された文字に、@sortという@関数(ND6からの新機能)を送り込んで、Evaluate関数をソートされたリストタグが格納されている配列に対して実行します。

Dim varTagsArray As Variant varTagsArray = Evaluate (|@sort (| & strTags & |)|)

 一回リストタグが格納されている配列をソートし終わったら、ソートされたリストタグの順番にリストの要素を取得します。

ソート後のprint結果:

Dim i As Integer For i = 0 To Ubound (varTagsArray) Print (lstMyList (varTagsArray(i))) Next Sorting List Is Simple

 見たとおり、実際にはソートされていないというトリックだ。その代わりにリストタグの配列はソートされる。それゆえ、私は引用符ダブルコーテーションで"ソートする"と使ったのだ。この方法は、大きなリストオブジェクトを扱うときに最も役に立ち、オブジェクトはソートしている間メモリにコピーされないのだ。なぜなら、ダブルコーテーションのタグによって行われるのであり、値で行われるわけではないからであり、ソートのプロセスはより効率的に行われるからだ。

 大きい配列に対してこの方法でソートするなら、具体的に言うと1500以上の要素の場合、気を付けるべきだ。そこが@sortの限界だからだ。

========================

 でもこの方法だと、ロジックはシンプルだけど、パフォーマンスが出ない場合があるという指摘があったので、もうひとつ方法を示すことにする。もうひとつの方法は、"Quick Sort"と呼ばれる方法で、平均1.5-2秒かかっていた処理が、0.5-1秒にまで縮めることが出来る。

 二番目の方法:

 @sort関数をリストタグ全部の文字列に送り込んで、ソートされた配列を取得するのではなく、ダイナミックな配列にリストタグを加えるのだ。

Dim lstMyList List As String Dim varTagsArray () As String Dim varSortedTagArray As Variant Dim intArrIndex as Integer lstMyList ("B") = "List" Redim Preserve varTagsArray (intArrIndex) varTagsArray (intArrIndex) = "List" intArrIndex = intArrIndex + 1 lstMyList ("A") = "Sorting" Redim Preserve varTagsArray (intArrIndex) varTagsArray (intArrIndex) = "Sorting" intArrIndex = intArrIndex + 1 ...

 リストの要素すべてを加えたら、リストタグの配列に quick sort function (アドレス帳DBから取ってきた)に送り込む。

varSortedTagArray = QuickSort (varTagsArray),

quick sort function:

Function QuickSort(sArray As Variant) As Variant Dim sA() As String Dim j As Long Dim bottom As Long Dim top As Long bottom = Lbound ( sArray ) top = Ubound ( sArray ) Redim sA( bottom To top ) As String For j = bottom To top sA ( j ) = sArray ( j ) Next ' DoQS does a QuickSort if the Sublist is longer than 10 elements ' Thus, when DoQS finishes, all elements are within 10 spots of their correct location. ' For lists that are close to being in order, an Insertion Sort is much faster than a QuickSort, so we ' run through the whole thing once doing an Insertion Sort to finish tidying up the order. Call DoQS( sA, bottom, top ) Call DoInsertSort ( sA, bottom, top ) QuickSort = sA End Function Sub DoQS( sA() As String, bottom As Long, top As Long ) ' Called by QuickSort ' Uses Public variable sA (array of string) Dim length As Long Dim i As Long Dim j As Long Dim Pivot As Long Dim PivotValue As String Dim t As String Dim LastSmall As Long length = top - bottom + 1 ' Only do the QuickSort if the sublist is at least 10 items long If length > 10 Then ' Pivot is chosen approx. halfway through sublist. ' This gives us best speed if list is almost sorted already, and is no worse than any ' other choice if the list is in random order. Pivot = bottom + (length \ 2) ' Move PivotValue out of the way PivotValue = sA( Pivot ) sA ( Pivot ) = sA ( bottom ) sA ( bottom ) = PivotValue ' LastSmall is the location of the last value smaller than PivotValue LastSmall = bottom For i = bottom + 1 To top If sA ( i ) < PivotValue Then LastSmall = LastSmall + 1 t = sA ( i ) sA ( i ) = sA ( LastSmall ) sA ( LastSmall ) = t End If Next ' Move the PivotValue back t = sA ( LastSmall ) sA ( LastSmall ) = sA ( bottom ) sA ( bottom ) = t Pivot = LastSmall ' Now sort each side Call DoQS ( sA, bottom, Pivot - 1 ) Call DoQS ( sA, Pivot + 1, top ) End If End Sub Sub DoInsertSort ( sA() As String, Byval bottom As Long, Byval top As Long ) Dim i As Long Dim x As Long Dim v As String Dim Found As Integer For i = bottom+1 To top x = i v = sA (i ) Do While (sA(x-1) > v) sA ( x ) = sA ( x-1 ) x = x - 1 If x=0 Then Exit Do End If Loop sA (x) = v Next End Sub

 ソートされた配列を取得したら、リストをソートする記事の部分に戻って、その後の処理を参照してくれ。

This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.
  1. 2005/05/17(火) 01:04:51|
  2. Designer|
  3. トラックバック:0|
  4. コメント:0

LotusScriptをHTMLとして整形する

ls2htmls.png

Format Your LotusScript

 このページは、恥ずかしながら(許可を得て)、nsftoolsのJulian Robichauxの偉業を拝借させて頂いたものだ。一番簡単な使い方としては、このフォームはデフォルトのままで、"LotusScript Code to Format"という入力欄に、あなたのLotusScriptのプログラムを貼り付けて、"Format Script"ボタンを押してみてくれ。あなたのプログラムコードは、二番目の入力欄に、生のHTMLに変換されるだろう。最後に、"Show on Web Page"ボタンを押せば、整形された結果を確認できると思う。そうしたら、あなたのwebサイトのWebページにincludeするためにhtmlコードをコピーして貼り付けるとか、または、自分のLotusScriptライブラリーにHTMLとして単にとっておくというのもアリだろう。(フォームとプログラムコードは、JulianのノーツDBからダウンロードできる。---Format LotusScript as HTML, RTF)

=======

 昨日のエントリーで早速使わせてもらいました。dim とか as とかが青に、コメント文が黄緑になるので、デザイナーっぽい見栄えで開発者にとって見やすいという、ただそれだけなんですが、すごい便利です。しかも、CSS形式で出力できるので汎用的です。

 ただ、これが役に立つっていうのは、ロータススクリプトをHTMLで表現したい人というかなりニッチというか、どれだけ需要があるかちょっと疑問なんですが(苦笑)。


  1. 2005/05/16(月) 00:27:00|
  2. Designer|
  3. トラックバック:0|
  4. コメント:0

返答がある文書が削除されないようにするには

Prevent document deletion if there are response documents

 返答文書が存在するメイントピックが削除されないようにするためのTipsをご覧いれよう。このロジックを、DatabaseスクリプトのQueryDocumentDeleteイベントに入れるだけでいい。

Sub Querydocumentdelete(Source As Notesuidatabase, Continue As Variant) 'Get a handle on the current document Dim ns As New NotesSession Dim nDocCurrent As NotesDocument Dim ndcCollection As NotesDocumentCollection Set ndcCollection = Source.Documents Set nDocCurrent = ndcCollection.GetFirstDocument 'See if the current document has any responses associated with it 'if so do not allow the deletion Dim ResponseCollection As NotesDocumentCollection Set ResponseCollection = nDocCurrent .Responses numDocs& = ResponseCollection.Count '# of response documents If numDocs& > 0 Then Messagebox "この文書には返答文書がついているため削除できません。",64,"Action Cancelled Continue = False End If End Sub
This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.
  1. 2005/05/15(日) 01:37:45|
  2. Designer|
  3. トラックバック:0|
  4. コメント:0

桁数を揃える新しいベターな方法

Pad.png


A new, better pad technique

 0埋めしたいとき、どんなに数が大きくても問題ない方法について解説します。@if で書き分けることも、とても大きな桁数を使うことで常にゼロ埋め状態にすることも出来る。このコードはxより小さかったら0を埋めて、もしxより大きかったらそのままにする方法だ。

Code

REM "The Code";
StringToPad := "12345";
StringLength := 4;
PadChar := "0";
UsualWay := @Right(@Repeat(PadChar; StringLength) + StringToPad ; StringLength);
MyWay:=@Repeat(PadChar;@Max(StringLength-@Length(StringToPad);0))+StringToPad;

REM "Sample outputs for testing";
@Prompt([OK];"よくある方法-Pad("+@Text(StringLength)+"): "+StringToPad;UsualWay);
@Prompt([OK];"私の方法-Pad("+@Text(StringLength)+"): "+StringToPad;MyWay)


==============

StringLength := 4の数字を変えてみると使い方が判ります。
  1. 2005/05/14(土) 01:32:55|
  2. Designer|
  3. トラックバック:0|
  4. コメント:0

ロータススクリプトからHTMLコードを取得するには

IBM - How to Retrieve the HTML Code of a Web Page via LotusScript

問題

 ロータススクリプトからHTMLコードを取得したい場合はどうしたらいいだろうか。

解法

 getDocumentByURL メソッドを使えばいい。このメソッドは文書の body フィールド内のHTMLコードを NotesDocument オブジェクトで返してくれる。次のような例の方法で取得できる。

 Dim session As New NotesSession
 Dim db As NotesDatabase
 Dim webDb As NotesDatabase
 Dim doc As NotesDocument
 Set db = session.CurrentDatabase

 Set doc =  db.GetDocumentByURL("http://www.notes.net/notesua.nsf/Viewname/DocumentUNID?OpenDocument")
 Dim html As String
 html = doc.GetItemValue("Body")(0)

 スケジューリングされた状態で動かすときは、必ずサーバ上で取得タスクを動かさないといけない。Java クラスでも同じことが可能だ。詳細は、"Java で Lotusscript の GetDocumentByURL メソッドを代替するには" (#1105866)という技術情報を参照。

IBM - A Java Alternative to the GetDocumentByURL LotusScript Method
  1. 2005/05/12(木) 02:00:21|
  2. Designer|
  3. トラックバック:0|
  4. コメント:0

リッチテキストフィールドの入力チェック

Validating Rich Text Fields

 リッチテキストフィールドの入力チェックをするには、いくつかの方法があるが、何を選ぶかは要件次第。

 最初は、フィールドにどんな値が入ってもチェックできる方法。これは、テキストでも添付ファイルでも、db/view/文書リンク、半角スペースであってもチェックできる。これは、Lotusscriptを使ってquerysaveでチェックすることになる。


Sub Querysave(Source As Notesuidocument, Continue As Variant)
   Call Source.GotoField("Body")
   On Error Resume Next
   Call Source.SelectAll
   Call Source.DeselectAll
   On Error Goto 0
   If Err <> 0 Then
      Err = 0
      Msgbox "Bodyフィールドに値を入れてください。", 16, "入力エラー"
      Continue = False
      Exit Sub
   End If
End Sub



 このコードは、フィールド(例だとbody)に飛んで、フィールドの内容を選択/選択解除しようとすることでエラーを検知します。これで、フィールドが空だったらエラー("文書コマンドが有効ではありません")となる原因になる。そして、このエラーにトラップを仕掛けて、エラーだったらユーザにメッセージを表示し、continue=falseで文書の保存を中止する。

 個人的には、次の2つの理由からこの方法があまり好きではない。第一に、UIアクションが続くこと。もし、このフォームが縦長のフォームで、ユーザーが一番上を見てて、bodyフィールドが一番下にあった場合、source.gotofieldがユーザーの画面を一番下のリッチテキストフィールドまで押し下げてしまう。このフィールド名(source.currendfield)を保存でき、終わったらそこのフィールドにユーザーを戻しても、ジャンプはまた発生するだろう。さらに、リッチテキストフィールド全体が選択/選択解除されるため、もしユーザーがいくつかの段落を入力してたら、選択/選択解除時に画面がチカチカすることになってしまう。ユーザーは疑問に思うだろう("私の書いたテキストになにが起こったんだろう?")。

 他にリッチテキストフィールドの入力チェックをする方法として、隠しフィールドでチェックするというのがある。リッチテキストフィールドは、input validationイベントを持ってないから、直に入力チェックすることは出来ない。しかし、他のフィールドに仕掛けることは可能だ。リッチテキストの下にフィールド(入力チェックは上から下へ、左から右へ行われるからだ)を配置して隠してしまえばいい。(実際、フィールドを隠すのをお奨めする) このフィールドは編集可能でないとだめだ(validationイベントを捕まえる唯一の方法だ)。そして、どんな種類のフィールドでもOKだ(テキストか数値が一般的だが)、そのほかの内容は問題にならない(デフォルト値は放っておけるし、input translationには何も影響しない)。

 入力チェックにおいて、なにをチェックしたいかによるが、最初に、テキストを入力しないといけないだろう。そして、正しいテキストであるべきだ - スペースや改行はカットされないだろう。(リッチテキストに書かれたシングルスペースは上記の処理はスルーするだろう) このinput validationは、リッチテキストにテキストがないときに有効だ。


@If(@Trim(@Abstract([TextOnly]; 100; ""; "Body")) = ""; @Failure("bodyフィールドに値を入力してください"); @Success)



 もし、@abstractに馴染みがなければ、ヘルプを見てください。bodyフィールドの最初の100文字を取り出して、スペースを取り除きます。もし文字列が空なら、リッチテキストフィールドにテキストはありません。

 しかし、もし添付ファイルはあるけどテキストがない場合はどうなるか。その場合、添付ファイルがくっついているかどうかのチェックを簡単に加えることが出来る。


@If(@Attachments != 0; @Success; @Trim(@Abstract([TextOnly]; 100; ""; "Body")) = ""; @Failure("bodyフィールドに値を入力してください"); @Success)



 注意して欲しいのが、@Attachmentによるチェックは、文書に対するチェックだと言うことだ。必ずしも問題のあるフィールドというわけではないのだ。もし複数のリッチテキストフィールドがあるなら、この入力チェックは裏目に出るかも知れない。チェックしたいフィールドとは別のリッチテキストフィールドに添付ファイルを貼り付けてるかも知れないからだ。

 これらの方法の違いはなんだろうか。まず1番目のものでは、リッチテキストフィールドにあるものはなんでもチェックできる。半角スペースであっても。そして、私が特に好きでないユーザーインタフェースへの「干渉」があります。 2番目のものでは、1つ以上の正しい文字列がある場合にだけ、チェックできるでしょう--どんなスペース、タブも、または復帰改行も許容されないでしょう。 3番目のものでは、正しい文字列があるか、または添付ファイルががドキュメントのどこかにあると、チェックできるでしょう。

 私の個人的な好みは2番目の方法を使用することです。 ユーザがテキスト以外にリンク、添付ファイルまたは何かを入れているなら、自分達はそれらがフィールドに加えた他の何を示すかためにほぼ常に2、3の言葉を付け足します。そして、これらの付け足された言葉を使えば、入力チェックを通過させることができるでしょう。
  1. 2005/05/11(水) 02:08:02|
  2. Designer|
  3. トラックバック:0|
  4. コメント:2

全DBを一括管理する

adminalldb.png


Manage all your databases at once

 もし、あるディレクトリーにあるか否かを問わず、サーバ上の全DBを一括で管理したいときは、ALLビューを使えばいい。

 たとえば、全DBにACLの変更を施したいときとか、クラスタ用に全DBのレプリカを作りたいときとかに、通常の「Tree」ビューから、管理クライアントの「ツール」メニューの横にある「すべて」ビューに切り替えれば良い。

 こうすれば、ディレクトリなしで全DBをリスト表示できるし、全DBを一括選択することも可能だし、必要なコマンドを発行することも出来る。
  1. 2005/05/10(火) 01:52:57|
  2. Admin|
  3. トラックバック:0|
  4. コメント:0

汎用Excel出力スクリプト

exlexports.png

 ノーツも6.5からCSV出力機能が追加されました(遅いよ)。それはそれで使えるのですが、ノーツのビューに表示されている内容ををエクセルファイルに出力したい。ということを考えたり、クライアント/エンドユーザーからリクエストを頂いたりすることは多いと思います。そして、web上にはそのための多くのtoolが有償・無償問わず公開されています。

 で、いろいろある中で、一番のお気に入りが、Art Yatesの「Export any view to Excel」(on searchdomino)です。ひとつのsub関数で完結し、環境設定一切なしで、これをこのままエージェントに貼り付けてアクションメニューから実行すれば、どこからでも実行可能という、汎用性と移植性が非常に高いscriptです。(スクリプト引用欄の下につづく)

================================

"Export any view to Excel" by Art Yates:

Sub Initialize 'Create an Excel Spreadsheet from any view '11/3/2000 Art Yates Dim Session As New NotesSession ,db As NotesDatabase Dim sourceview As NotesView,sourcedoc As NotesDocument Dim dataview As NotesView, dc As NotesDocumentCollection Dim datadoc As NotesDocument, maxcols As Integer Dim WS As New Notesuiworkspace Dim ViewString As String, Scope As String, GetField As Variant Dim C As NotesViewColumn, FieldName As String, K As Integer,N As Integer Dim xlApp As Variant, xlsheet As Variant, rows As Integer, cols As Integer Dim nitem As NotesItem , entry As NotesViewEntry, vwNav As NotesViewNavigator Dim ShowView() As Variant, i As Integer, VList As Variant, ColVals As Variant Set db = session.CurrentDatabase 'link to current database 'fetch then display a list of views in the database Vlist= db.views K=Ubound(Vlist) 'get size of list Redim Preserve ShowView(K) N=-1 For i = 0 To K If Len(Vlist(i).Name) >0 Then FieldName=Trim(Vlist(i).Name) If Mid(Fieldname,1,1) <>"(" Then 'do not show hidden views N=N+1 ShowView(N) = FieldName End If End If Next i Redim Preserve ShowView(N) 'now sort the list - by default views are listing in the order that they were created For i=0 To N For K=i To N If ShowView(i) > ShowView(k) Then FieldName=ShowView(i) ShowView(i) = ShowView(k) ShowView(k)=FieldName End If Next k Next i viewstring= ws.Prompt(PROMPT_OKCANCELLIST,"List of Views","Choose a View","",ShowView ) If Len(viewstring)=0 Then Exit Sub 'ViewString ="Dan's View" Set dataview = db.getview(ViewString) 'get selected view Set vwnav= dataview.createViewnav() rows = 1 cols = 1 maxcols=dataview.ColumnCount 'how many columns? Set xlApp = CreateObject("Excel.Application") 'start Excel with OLE Automation xlApp.StatusBar = "Creating WorkSheet. Please be patient..." xlApp.Visible = True xlApp.Workbooks.Add xlApp.ReferenceStyle = 2 Set xlsheet = xlApp.Workbooks(1).Worksheets(1) 'select first worksheet 'worksheet title xlsheet.Cells(rows,cols).Value ="View: " + ViewString + ", from Database: " + db.title +", Extract created on: " + Format(Now,"mm/dd/yyyy HH:MM") xlApp.StatusBar = "Creating Column Heading. Please be patient..." rows=2 'column headings starts in row 2 For K=1 To maxcols Set c=dataview.columns(K-1) xlsheet.Cells(rows,cols).Value = c.title cols = cols + 1 Next K Set entry=vwnav.GetFirstDocument rows=3 'data starts in third row Do While Not (entry Is Nothing) For cols=1 To maxcols colvals=entry.ColumnValues(cols-1) 'subscript =0 scope=Typename(colvals) Select Case scope Case "STRING" xlsheet.Cells(rows,cols).Value ="'" + colvals Case Else xlsheet.Cells(rows,cols).Value = colvals End Select Next cols xlApp.StatusBar = "Importing Notes Data - Document " & rows-1 '& " of " & dc.count & "." rows=rows+1 Set entry = vwnav.getnextdocument(entry) Loop xlApp.Rows("1:1").Select xlApp.Selection.Font.Bold = True xlApp.Selection.Font.Underline = True xlApp.Range(xlsheet.Cells(2,1), xlsheet.Cells(rows,maxcols)).Select xlApp.Selection.Font.Name = "Arial" xlApp.Selection.Font.Size = 9 xlApp.Selection.Columns.AutoFit With xlApp.Worksheets(1) .PageSetup.Orientation = 2 .PageSetup.centerheader = "Report - Confidential" .Pagesetup.RightFooter = "Page &P" & Chr$(13) & "Date: &D" .Pagesetup.CenterFooter = "" End With xlApp.ReferenceStyle = 1 xlApp.Range("A1").Select xlApp.StatusBar = "Importing Data from Lotus Notes Application was Completed." 'xlapp.ActiveWorkbook.saveas "c:VX" + Trim(Format(Now,"yyy")) 'save with generated name dataview.clear Set xlapp=Nothing 'stop OLE Set db=Nothing End Sub
This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.

 これが物足りなくなったら、これの高機能版である「Developer Buddy v1.02」をガシガシカスタマイズすれば、自分の欲しいモノができると思います。

「Developer Buddy v1.02」をダウンロードするには、"Click here to download"をクリックしたら、リンク先の下部にある「I have read and accept the terms and conditions」をクリックすると、nsf入りのzipファイルがダウンロードできます。「Developer Buddy」の説明書きはこんな感じです。

================================

 そう、このアプリケーションは、私がまとめたいと思った、すべての例を含んでいます。

 新しいアプリケーションを始めたいと思ったときはいつでも、自分の「Developer's Buddy」の中からピックアップした設計要素をベースに構築します。ここには、自分が作ったcodeや、他から持ってきたcodeが詰まってます。

 このアプリは、ノーツクライアントでもWebブラウザでも実行可能です。また、Excel出力用の標準的なフォームやビューをすべて含みます。そして、Tipsや引用や高度な検索を加えてます。

 以下のリストが、このDBに含まれる様々な機能です。そして、これらを公開してくれた皆様に感謝します。

  • documentのキャッシングを防ぐ(notes.netのスレッドから)
  • 添付ファイルを加えてきちんと表示する (Mark Roden)
  • ページをリフレッシュしたときにアップデートされたTips/引用を加える(George Franceのすごい機能)
  • web のフォームにアドレス帳lookupを加える(Glen S. Orenstein)
  • ブラウザを介してFlashファイルを表示する (Razzak Khan)
  • ページのトップにアクションバーをロックする(Herman Hebbinkによるもうひとつの偉業)
  • ブラウザを介してフォームを印刷する(me)
  • シンプルなキーワードlookupとその管理機能(me)
  • ベーシック & アドバンス検索機能(notes.netのntfをもとに開発)
  • テーブルに文書情報を表示するHTMLビュー, 普通のビューよりブラウザで見た方が良い(TLCC tip)
  • カテゴライズされた/カテゴライズされていない/ひとつのカテゴリのビューの例(me)
  • ブラウザを介したビューのスペーシング
  • エクセル出力機能(Art Yates, Ken Pespisa そしてその他の皆様)
  • 使えそうなイメージリソース(主に標準ノーツテンプレから)
  • 効率的で探跡可能な共有アクション (Scot Haberman)

  1. 2005/05/08(日) 23:05:54|
  2. Designer|
  3. トラックバック:0|
  4. コメント:0

デザイナーで設計要素を開いてもプロパティボックスを表示させない方法

debugprompt.png


Stop The Properties Box From Being Displayed When You Open A Object In Designer - Walnut - Canberra Lotus User Group
http://walnut.agileware.net/node/567

デザイナーで設計要素を開いてもプロパティボックスを表示させない方法。

フォームやビュー、エージェントとかをドミノデザイナーで開くと、いつもノーツのプロパティボックスが自動で表示されます。慣れてくると、ちょっとうざったいです。

Teamwork SolutionsのBill Ernestがこの素晴らしいTipを共有してくれたことに感謝しつつ、notes.iniに次の一行を加えれば解決します。

DesignNoInitialInfobox=1

もうノーツのプロパティボックスが自動で開かれません。Yay!

===================

CodeStore経由のTips。これも嬉しいTipsなんですが、個人的にはND6で最も不満なのがデバッグモード開始/終了ダイアログです。これ無効にするnotes.iniのパラメータとかってないんでしょうか。
  1. 2005/05/07(土) 03:35:41|
  2. Designer|
  3. トラックバック:0|
  4. コメント:0

DomikonMonkey

domikonmonkeys.png


※ノーツコンソの新懇談室には対応してません。。。

DomikonMonkey
http://blog-imgs-1.fc2.com/n/s/f/nsfl10n/domikonresponse.user.js

 これは、OpenNTFのLDDMonkeyをドミノ懇談室(by softbank)向けに改変したものです。

 OpenNTFというのは海外のノーツのオープンソースプロジェクトの名前で、LDDMonkeyというのはそこで配布されているLDD(Lotus Developers Domainというフォーラム群)を見やすくするためのユーザースクリプトです。DomikonMonkeyは、それをドミノ懇談室向けにカスタマイズしたもの。というわけです。

 LDDやドミノ懇談室みたいに、Webノーツで埋め込みビューをやってるところはタイトルのスレッド表示は得意だけど、スレッド全体の議論の流れを把握したいという場合は、1文書づつ開き直す必要があり煩わしい。という問題を解決するためのツールです。上のサムネイル見れば一目瞭然かと。

 LDDMonkeyを実行するためには、Mozilla Firefoxというwebブラウザと、GreasemonkeyというFirefox用の拡張機能が必要になります。IEしか使ってないという方にはちょっとハードルが高めに見えますが、、、。LotusNotes + 掲示板DB + エージェント = Firefox + Greasemonkey + LDDMonkey( or DomikonMonkey) ぐらいに考えて頂ければ。。。ドミノ懇談室専用閲覧ツールぐらいのノリでインストールするというのもアリかと。。。

 マニアックな技術ネタに言及すると、このツールは"Ajax"という技術が使われてて、ドミノとajaxの組み合わせるとこんなことができるのかというサンプルのひとつとも言えます。詳しくはこちらをどうぞ。

Project LDDMonkey Documentation Document
Greasemonkey - Firefox まとめサイト
Firefox拡張の「Greasemonkey」が人気上昇中--セキュリティリスクも - CNET Japan

 greasemonkey自体は埋め込みスクリプトという技術の応用なので、IEでもFirefoxでも可能(らしい)のですが、IEだとかなりハードルが高いらしく、greasemonkey for IEは開発中止になってしまった模様です。。。

daishar.com: Goodbye to GreasemonkIE

-ご利用方法:

1) Mozilla Firefoxをインストールします。

Firefox - Web の再発見

2) greasemonekyをインストールします。Firefoxを起動してgreasemonkey配布サイトに行き、"install greasemonkey"とかなんとかいうのをクリックします。

mozdev.org - greasemonkey: index

3) Domikonmonkeyをインストールします。Firefoxを再起動して、次のリンクをクリックして、domikonresponse.user.jsを表示します。jsファイルをダウンロードして、ブラウザにドラッグ&ドロップして表示しても同じです。

http://blog-imgs-1.fc2.com/n/s/f/nsfl10n/domikonresponse.user.js

4) ツール(T)→Install User Script→OKボタンを押して、インストールを完了させます。

5) ドミノ懇談室に行って、返答文書付きの文書を開いて、[+]をクリックしてみてください。

-注意:

jsファイル内のコメント文もローカライズしてありますが、これは単に自分用のメモ書きなので、訳はかなりテキトーです。
バージョンアップは保証されません。
ライセンスは本家のlddmonkeyに従います。

謝辞:

mozilla firefoxプロジェクト, openntfプロジェクトの皆様, greasemonkey, lddmonkeyの作者に感謝します。
  1. 2005/05/06(金) 03:52:30|
  2. OpenNTF|
  3. トラックバック:0|
  4. コメント:0
04 | 2005/05 | 06
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

Search

Featured Entries

Recent Entries

Recent Comments

Recent Trackbacks

Archives

Category

Links

Ads

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。