当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。
記事そのもののリンクについてはご自由に行っていただいてよいです。

テクてく Lotus 技術者 Slack に参加しよう!

2008年5月30日金曜日

特定のディレクトリのデータベース名の抽出

ノーツクライアントもしくはドミノサーバの特定のディレクトリにどのようなDBがあるのかを調べるサンプルです。
「データベースを開く」コマンドやカタログDBからでは、探しきれないDBも探すことができます。
(上記のいずれも、DBのプロパティで無効にすることができる)

隠れているDBを探すためや、ノーツDBの棚卸しに利用できるのではないでしょうか。

Sub Click(Source As Button)
    'データベースの一覧の変数の定義
    Dim session As New NotesSession
    Dim directory As NotesDbDirectory
    Dim db As NotesDatabase
    
    'プログラム変数の定義
    Dim res As String
    Dim sbj As String
    Dim i As Integer
    
    'データベースの一覧を取得する場所を選択する
    res = Inputbox ( "サーバー名を入力してください。" & Chr$(10) & "loaclの場合はローカルコンピュータを参照します。",_
    "データベースの一覧", "local" )
    'キャンセルを押した場合は処理を中断、localの場合はNULLに変換
    If res = "" Then
        Exit Sub
    Elseif res = "local" Then
        res = ""
    End If
    Set directory = New NotesDbDirectory( res )
    
    '一覧を取得するディレクトリを選択する。
    Sdir = Inputbox ( "検索するディレクトリ名を入力してください。" & Chr$(10) & "空白の場合はルートディレクトリを参照します。",_
    "ディレクトリの選択", "" )
    If Sdir = " " Or Sdir = " " Then
        Sdir = ""
    Else
        '全部小文字に変換
        Sdir = Strconv ( Sdir , 2 )
    End If
    
    i = 0
    '最初のデータベースを取得する
    Set db = directory.GetFirstDatabase( DATABASE )
    'データベースを全部取得するまで繰り返す
    Do While Not (db Is Nothing )
        yen = Instr( db.FilePath, "\" )
        If yen = 0 Then
            If Sdir = "" Then
                i = i + 1
                sbj = sbj & Cstr( i ) & "." & db.Title & " ; " & db.FilePath & Chr$(10)
            End If
        Else
            If Strconv( Left( db.FilePath, yen - 1 ), 2 ) = Sdir Then
                i = i + 1
                sbj = sbj & Cstr( i ) & "." & db.Title & " ; " & db.FilePath & Chr$(10)
            End If
        End If
        'dbの次のデータベースを取得する(GetFirstDatabaseとペアで使うこと)
        Set db = directory.GetNextDatabase
    Loop
    
    'NULLの場合はローカルなので、「ローカルコンピュータ」を代入する
    If res = "" Then
        res = "ローカルコンピュータ"
    End If
    Messagebox sbj, 0, res & "のデータベースの一覧"
End Sub


2008年5月29日木曜日

指定した文字までの抜き出し

前回の予告通り、@Left関数のスクリプト版です。
指定した文字/文字列までを抜き出す関数としています、

呼び出し方法は次の通り。
strc = Extract( "検索文字列", "抜き出しまでの文字列" )

戻り値は、抜き出した文字列(String型)。抜き出せる文字列が存在しない場合は、""を返す。

---------------------------------------------------------------------------------
Function Extract( stra As String, strb As String ) As String
Dim i As Integer

i = Instr( stra, strb )
If i = 0 Then
Extract = ""
Else
Extract = Left( stra, i - 1 )
End If
End Function

2008年5月28日水曜日

@Left関数

@Left関数の説明です。
今さらだけど、ちょっと変わった特性があるので、記載しておきます。

@Left関数では、文字列のx番目まで抜き出すという指定の他に、"xx"という文字列がある箇所までを抜き出すという指定の方法がある。
"xx"という文字列が複数ある場合には、左側から検索して最初に見つかったところまでを対象とする。
また、"xx"という文字列が見つからない場合には、NULLを返すというものである。

※スクリプトのLeftステートメントには文字列検索の抜き出しは用意されていないので、同じことをやろうとすると、自身で関数化する必要がある。そのサンプル関数は次回に紹介ということで・・・

---------------------------------------------------------------------------------
【サンプル1】
STRING := "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
@Prompt([OK];"元の文字列";STRING);
NUM := 8;
LEFT := @Left(STRING;NUM);
@Prompt([OK];@Text(NUM)+"番目まで抜き出した文字列";LEFT)

【サンプル2】
STRING := "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
@Prompt([OK];"元の文字列";STRING);
SEARCH := "J";
LEFT := @Left(STRING;SEARCH);
@Prompt([OK];SEARCH+"まで抜き出した文字列";LEFT)

2008年5月27日火曜日

ヘルプを読む癖をつけよう

良く言われていることだけど・・・

分からなくなったら、まずヘルプを読もう。
@関数の使い方にしろ、LotusScriptの使い方にしろ、
思った通りに動かない!?と思ったら、まずはヘルプを読むようにしよう。

そこで、自分の書いた関数は書式が正しいかどうかを確認しよう。
中には、使う場所が限られたものもある。そういったこともヘルプには書いてある。

たいてい、自分の思いこみで間違った使い方をしているものだ。
どんなに簡単な関数でも、ヘルプを見ることをお勧めする。
ヘルプに書いてあることが分かりづらい。という声をよく聞くが、それは読んでいないのである。
ただただ、眺めているだけなのである。

ヘルプには、自分が本当に必要としている情報は書いていないかもしれない。
だけど、そこには自分が一工夫することで解決できるような情報がたくさん詰まっている。

ヘルプを読もう。
いまだに私はヘルプのお世話になっている。ちっとも恥ずかしくはない。

2008年5月26日月曜日

リスト要素の抽出

@Subset関数の応用。
@Subset関数は、指定した数の要素を抜き出してしまうので、直接リストの中のx番目を抜き出すことが出来ない。
下記のサンプルは、それを実現している。

もっとも、Lotus Notes6からは、変数名[x]で、x番目の要素を抜き出せるようになっているが・・・
これもR5以前の環境の場合に活用してほしい。

LIST := "りんご":"みかん":"バナナ":"パイナップル";
@Prompt([OK];"リスト一覧";@Implode(LIST));

TMP1 := @Prompt([OKCANCELLIST];"リストの抜き出し";"何番目のリストを抜き出しますか?";"1";"1":"2":"3":"4");

REM "@Subset関数で指定した分だけのリストをまず、抽出する";
TMP2 := @Subset(LIST;@TextToNumber(TMP1));

REM "@Subset関数で-1を指定すると、リストの一番後ろを抜き出す。";
TMP3 := @Subset(TMP2;-1);

@Prompt([OK];"抜き出したリスト";TMP3)


2008年5月23日金曜日

文書の作成

文書の作成のLotusScriptです。
バックエンドではなく、フロントエンドで文書を作成する場合です。
@Command([Compose];"フォーム名")でも代用できるが、その後にLotusScriptで処理をしたいという場合に
必要になるでしょうから、覚えておきましょう。

下記のサンプルは、新規文書を作成した後、指定したフィールドに値をセットするものです。

----------------------------------------------------------------------------------------------
Sub Click(Source As Button)
Dim uiws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument

'1つめと2つめを省略すると(nullにする)、現在のデータベースが指定されることになる。
Set uidoc = uiws.ComposeDocument( "", "", "MainTopic" )

Call uidoc.FieldSetText( "Subject", "文書作成時にフィールドに値をセットできます" )
End Sub

2008年5月22日木曜日

文書の添付ファイルを剥がす

昨日は、ノーツ文書にファイルを添付するということを実現した。
今日は、その添付ファイルを剥がす(削除する)ということをやってみたい。

ポイントは、NotesEmbeddedObjectクラスのRemobeメソッド。
これで、添付オブジェクトを削除できるのである。
これを応用すると、添付ファイル以外も削除できそうである。

サンプルは、自文書の返答文書にある添付ファイルを削除してしまうというものである。
くれぐれもテスト用にDBを作成してから実行してほしい。
削除された添付ファイルは元に戻らないので・・・
-------------------------------------------------------------------------
Sub Click(Source As Button)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim uiws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim resdocs As NotesDocumentCollection
Dim resdoc As NotesDocument
Dim ritem As NotesRichTextItem
Dim afile As NotesEmbeddedObject

'自文書の設定
Set db = session.CurrentDatabase
Set uidoc = uiws.CurrentDocument
Set doc = uidoc.Document

'自文書の返答文書を取得する
Set resdocs = doc.Responses
Set resdoc = resdocs.GetFirstDocument

'返答文書のリッチテキストフィールドを取得
Set ritem = resdoc.GetFirstItem( "Body" )

'リッチテキストフィールドの添付ファイルを削除する
Set afile = ritem.GetEmbeddedObject( "script.csv" )
Call afile.Remove

'文書の保存
Call resdoc.Save( True , True )
End Sub

2008年5月21日水曜日

文書にファイルを添付する

今回はファイルを添付するスクリプト。
サンプルは、ホットスポットボタンをクリックしたときのものなので、フロントエンドで動作するが、
サーバエージェントにすれば、バックエンドでの動作も可能になる。
この場合、サーバのディレクトリにあるファイルを添付することができるようになる。
別処理で、ファイルを作成したものをどうしようか?という時に、FTPを使わずともNotesDBに添付することができるようになる。

Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim uiws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim doc As NotesDocument
    Dim resdoc As NotesDocument
    Dim ritem As NotesRichTextItem
    Dim afile As NotesEmbeddedObject
    
    '自文書の設定
    Set db = session.CurrentDatabase
    Set uidoc = uiws.CurrentDocument
    Set doc = uidoc.Document
    
    '新規に文書を作成した後、返答文書として位置づける
    Set resdoc = db.CreateDocument
    Call resdoc.MakeResponse( doc )
    
    'スクリプトで文書を作成した場合、フィールドに何も設定されないので自分で設定する
    resdoc.Form = "Response"
    resdoc.Subject = "添付ファイル付き文書(バックグラウンド作成)"
    
    'ファイルをリッチテキスト(Bodyフィールド)に添付する
    Set ritem = New NotesRichTextItem( resdoc, "Body" )
    Call ritem.AppendText( "この下にファイルを添付します。" )
    Call ritem.AddNewline( 2 )
    Set afile = ritem.EmbedObject( EMBED_ATTACHMENT, "", ファイルパス)
    Call ritem.AddNewline( 2 )
    Call ritem.AppendText( "この上にファイルが添付されています。" )
    
    '文書の保存
    Call resdoc.Save( True , True )
End Sub



2008年5月20日火曜日

DBにおける自分のロールを表示する

現在のDBで、自分がどのロールを保有しているのかを調べる方法。
ロールの場合、アクセス権とは違う考え方で取得されるので気を付けてほしい。

具体的には・・・
DBにおいて、AというグループとBと言うグループがACLに登録してあり、それぞれRole1とRole1、Role2を持っている場合、AとBに所属するユーザーはRole1とRole2を保持することになる。
グループ ロール
A Role1
B Role1,Role2
ユーザー Test User/OrgはA、Bのグループに所属している。

上記の場合、Test User/Orgは[Role1]:[Role1]:[Role2]のロールを持つことになる。
※[Role1]が二つあることに注目!
@UserRolesで取得すると、上記の結果になるので、@Unique(@UserRoles)で取得すると良い。


上記を踏まえたサンプルを記載しておこう。
---------------------------------------------------------------------------------------------------
REM "自分のロールを取得する。Promptで表示するので、テキスト形式に変換する";
TMP := @Implode(@Unique(@UserRoles));
@Prompt([OK];"自分のロール";TMP)

2008年5月16日金曜日

会議室予約で繰り返し予約が承認できない

Lotus Domino 6.5の会議室予約に不具合がありました。
レアなケースかな?と思うのですが、同じような症状の方がいた場合のために、こちらに掲載しておきます。

現象
会議室の予約の承認をしても、会議室の予約が行われない。

障害発生手順
・Lotus Domino 6.5の会議室予約テンプレートから会議室予約DBを作成する。
・所有者ありで会議室を作成する。
・所有者以外が、メールDBのカレンダーから繰り返しオプション付きで、作成した会議室を予約する。
・所有者に、会議室予約の承認メールが届くので、所有者はその予約を承認する。
※この時、予約は承認されるが、会議室が予約されない。

原因
所有者が承認後の動作に問題がある障害であり、問題報告番号 JLBS6T6ST4として報告済みだそうです。
Lotus Domino 7.0以降ではこの障害は発生することはないそうです。
バージョンアップを勧められたことからして6.5.x系では、修正されることはなさそうです。

回避策
所有者が設定されている会議室については、繰り返しオプションは利用しないことです。

2008年5月15日木曜日

フォームのエラーチェック時の工夫

フォームで文書を作成する際、エラーチェックは誰でもやると思う。

LotusScriptを使ったり、入力有効式(「入力が有効」*1)を使ったりすると思う。
その際、保存したらすぐに画面を閉じて欲しいような時に、関数の書き方を間違えると、
変なメッセージが出てうっとうしいことがある。

何も考えないと、
@Command([FileSave]);
@Command([FileCloseWindow])
であろう。
ただし、これだと入力チェックでエラーがあると、「文書を保存しても良いですか?」という
お決まりのメッセージが表示されてしまう。

これを解消するには、「保存して閉じる」というアクションを次のように変更するだけでよい。

@If(@IsValid=1;@Do(@Command([FileSave];@Command([FileCloseWindow]));@Return(""))

@IsValid関数は、フォーム中の「入力有効式」を全部計算してくれる関数で、全部の結果が真なら1を、偽なら0を返す。
これなら別途フィールドを用意する必要もなく、入力必須のフィールドが増えても問題はない。

---------------------------------------------------------------------------------------------------------

*1 バージョンが変わるたびに、ここの名称が変わるのはいただけない。IBMさん、少しは考えてくれないかなぁ・・・

2008年5月14日水曜日

日付の操作

日付関連第2弾。
前回は、2つの日付の差を算出したが、今回は1つの日付を元に別の日付を算出するというものである。

サンプルは、今の時間を基準としてそこからx日後(マイナスだと、前の日付)を算出するものである。
日付の計算に利用してほしい。


スクリプトの場合
Sub Click(Source As Button)
 '時間型変数の定義
 Dim jikan As NotesDateTime
 
 'Inputboxの戻り値の変数の定義
 Dim res As String
 
 '現在の時間をセット
 Set jikan = New NotesDateTime( Now )
 
 '現在の時間の表示
 Messagebox jikan.LocalTime , 0, "今の時間"
 
InputDate:
 '数値が入力されるまで続く
 res = Inputbox( "日付を何日進めますか?(-32768~32767)", "日付の操作", "" )
 '入力された値のチェック(数値以外は弾く)
 If Isnumeric( res ) Then
  Call jikan.AdjustDay( Cint( res ) )
 Else
  Messagebox "数字を入力してください(負数も可)。", 0 + 48, "日付の操作"
  '強制的に処理を戻す
  Goto InputDate
 End If
 Messagebox jikan.LocalTime, 0, res & "日後の時間"
End Sub


@関数の場合
jikan := @Now;
@Prompt([OK];"今の時間";@Text(jikan));
res := @Prompt([OKCANCELEDIT];"日付の操作";"日付を何日進めますか?";"");

tmp := @TextToNumber(res);
@If(@IsError(tmp);@Prompt([OK];"日付の操作";"数値を入力してください。");@Prompt([OK];res+"日後の時間";@Text(@Adjust(jikan;0;0;tmp;0;0;0))))

どうだろうか? 違いが判ってくれればうれしい。

2008年5月13日火曜日

@Containsと@IsMemberの違い

※リストの検索としてよく使われる関数に、@Containsと@IsMemberがある。
だが、これらの使い方を誤ると正しい結果を得られず、動作不正になってしまうことがある。


下の二つのボタンは、いずれもLISTという変数の中を検索するサンプルプログラムである。
しかし、実行してみると結果は違うことになっている。
(上が「あります。」で、下が「ありません。」になる)

これはどういうことかと言うと、@Contains関数と@IsMember関数の検索手法の違いにある。
@Contains関数は、リストの中に検索条件で指定した文字列が含まれていれば一致とするのに対して、
@IsMember関数はリストの各要素が検索条件で指定した文字列と完全に一致していれば一致とするのである。

つまり、@Containsでは、"ABCDEFG"や"ABCD"の中に"ABC"が含まれるので、検索に一致しているが
@IsMemberでは、"ABC"というリストの要素がないために、検索に一致するものはないとしているのである。


※ロールの判定に@Contains関数を使うことがあるが、似たようなロール名にしているとエラーになることがあるので注意が必要である。
(実際には、[ロール名]で判断されるのでエラーにはなり得ないが、本来の判定方法からすれば、@IsMemberが正しいと言えるだろう)

@Containsの場合
LIST := "ABCDEFG":"DEF":"GHI":"ABCD";
@If(@Contains(LIST;"ABC");@Prompt([OK];"検索結果";"あります。");@Prompt([OK];"検索結果";"ありません。"))


@IsMemberの場合
LIST := "ABCDEFG":"DEF":"GHI":"ABCD";
@If(@IsMember(LIST;"ABC");@Prompt([OK];"検索結果";"あります。");@Prompt([OK];"検索結果";"ありません。"))

2008年5月12日月曜日

WindowsScriptの呼び出し

今回は、ノーツと外部プログラムの連携について。
ノーツから外部プログラムを実行する場合、Shell関数を使うと思う。
それだと、ノーツから実行されたら制御がすぐにノーツに戻ってしまうので、
プログラムの実行結果を取得することができない。
これをWindowsScriptを使って実行すると、外部プログラムの終了を待つことができる。

サンプルではメモ帳としてあるが、戻り値があるようなCプログラムにすればノーツとCとの間で連携ができるようになる。

Sub Click(Source As Button)
    Dim obj As Variant
    Dim ret As Variant
    
    Msgbox "[OK]をクリックすると、メモ帳が起動します"
    
    Set obj = CreateObject( "WScript.Shell" )
    ret = obj.Run( "notepad.exe", 8, True )
    
    Msgbox "メモ帳が終了しました"
End Sub

2008年5月9日金曜日

曜日の割り出し

日付の操作のうち、曜日を算出するサンプル。
このサンプルは、入力した日付の曜日を出力してくれるので、
自分の誕生日が何曜日だったのか?などというものに使うと楽しいかも。

HIDUKE := @Prompt([OkCancelEdit];"日付の入力";"日付を入力してください。";@Text(@Today;"D0S0"));

TMP1 := @Weekday(@TextToTime(HIDUKE));
TMP2 := @ReplaceSubstring(@Text(TMP1);"1":"2":"3":"4":"5":"6":"7";"日":"月":"火":"水":"木":"金":"土");
@Prompt([Ok];"曜日の割り出し";HIDUKE + "は、" + TMP2 + "曜日です。")


2008年5月8日木曜日

スクリプト版@ReplaceSubString

今回はサンプルと違って、実用?できる関数である。
文字列の中身の一部分を変更したいという時に、@関数では@ReplaceSubStringを使うが、
スクリプトではそれに該当する関数がない。
クロスリファレンスでは、Mid関数となっているが、使い方が違うし、単体では実現できない。

ということで、@ReplaceSubString関数を実現するスクリプトの関数を用意した。
下記のサンプルの中のReplaceStringという関数である。
引数は@ReplaceSubString関数と同じようにしてあるので、簡単に使えると思う。

試してみてほしい。

Sub Click(Source As Button)
 Dim sValue As String
 Dim sFrom As String
 Dim sTo As String
 
 sValue = {ABCDEFG"HIJKLMN"OPQRSTU"VWXYZ,"}
 sFrom = """"
 sTo = ","
 
 Messagebox sValue, 0, "置換前"
 Call ReplaceString( sValue, sFrom, sTo )
 Messagebox sValue, 0, "置換後"
End Sub

Sub ReplaceString( sValue As String, sFrom As String, sTo As String )
 'sValueは、検索用文字列
 'sFromは、置換対象文字
 'sToは、置換後文字
 
 Dim i As Integer '置換対象文字位置
 Dim temp As String '作業用変数(検索文字列の一時格納)
 
 i = Instr( sValue, sFrom )
 Do While i <> 0
  temp = Left( sValue, i - 1 )
  temp = temp & sTo
  temp = temp & Right( sValue, Len( sValue ) - i - Len( sFrom ) + 1 )
  sValue = temp
  i = Instr( i + Len( sTo ), sValue, sFrom )
 Loop
End Sub

なお、R6.x以上であれば、Replace関数が用意されているのでそちらを使ってもよい。

2008年5月7日水曜日

データベース中の全文書を取得する

データベースの全文書を取得する方法。
ビューで選択した文書だけではなく・・・とか、ビューに表示されていない文書も処理したいという場合に使う。

プロフィール文書は取得できないので注意してほしい。


Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim docs As NotesDocumentCollection
    Dim doc As NotesDocument
    
    Dim sbj As Variant
    
    'データベースの定義
    Set db = session.CurrentDatabase
    
    'AllDocumentsはデータベースの全文書を取得するというメソッド
    Set docs = db.AllDocuments
    
    '全文書数分の繰り返し
    For i = 1 To docs.Count
        'GetNthDocument( i )は、i番目の文書を取得するという意味
        'このときの文書の並びはデータベースに保存された順
        Set doc = docs.GetNthDocument( i )
        
        'タイトルをsbjという変数に保存しておく。その際、1タイトルごとに改行する
        'Chr$(13)は改行コードを意味する
        sbj = sbj + Cstr( i ) + "." + doc.Subject(0) + Chr$(13)
    Next
    
    'タイトルの表示
    Messagebox sbj, 0, "DB中の全文書のタイトル"
End Sub

2008年5月6日火曜日

リッチテキストが壊れる・・・その後

前回の投稿からすでに3週間が経過しているが、実はまだ何の進展もない。
当方では、添付ファイルを操作するクラスを含んだプログラムで不具合が発生したが、
不具合の発生の様子からすると、添付ファイル以外でも不具合が出るのではないかと思っている。
特に、NotesRichtextNavigatorクラスを使っている場合は注意してほしい。

同じような症状が出た方がいれば教えてほしい。IBMへ連絡して対処を速めてもらうようにしたい。

日付の計算

よくノーツで質問に挙がるものの1つに、時間の計算がある。
難しそうに思えるが、そうでもない。
NotesDateTimeクラスのTimeDifferenceメソッドを使えば、秒で差が取得できる。
後は、そこから時間や日にちを計算すればいいのだ。

詳しくは下記のサンプルを見てほしい。

Sub Click(Source As Button)
 Dim DateA As NotesDateTime
 Dim DateB As NotesDateTime
 Dim str1 As String
 Dim diff As Double
 
 '最初の日付のセット
 str1 = Inputbox( "最初の日付を入力してください。", "日付の計算", Today )
 Set DateA = New NotesDateTime( str1 )
 
 '二番目の日付のセット
 str1 = Inputbox( "二番目の日付を入力してください。", "日付の計算", Today )
 Set DateB = New NotesDateTime( str1 )
 
 '日付の計算(結果は「秒」で出力される)
 diff = DateA.TimeDifference( DateB )
 Messagebox "日付の差は、" + Cstr( diff ) + "秒です。", 0, "日付の計算"
 Messagebox "日付の差は、" + Cstr( diff / 60 ) + "分です。", 0, "日付の計算"
 Messagebox "日付の差は、" + Cstr( diff / 60 / 60 ) + "時間です。", 0, "日付の計算"
 Messagebox "日付の差は、" + Cstr( diff / 60 / 60 / 24 ) + "日です。", 0, "日付の計算"
End Sub

あくまでサンプルなので、うるう年の計算はしていないので、あしからず。

2008年5月5日月曜日

データベースの選択

また@関数。
@Promptのちょっと変わった使い方です。
R5からの追加機能なので、R4.6以前を使っている人は注意!(そうそういないだろうが・・・)
[ChooseDatabase]オプションを使うと、「データベースを開く」ダイアログが表示されるのである。
そこで、取得したいDBを選択して、「開く」ボタンをクリックするだけ。

戻り値はリスト形式になっていて、
1:サーバ名(ローカルの場合は、空白)
2:DBファイル名(パス名付き)
3:DBタイトル
となっている。利用する時は注意しないと、必要なものが取得できないのだ。

------------------------------------------------------------------------------
ret := @Prompt([ChooseDatabase];"";"");

@For(i:=1;i<=@Elements(ret);i:=i+1;@Prompt([Ok];@Text(i);ret[i]))

2008年5月1日木曜日

ユーザー名の表示

@関数についても、述べていこう。
よく使う関数の一つであろう、@UserName関数と@Name関数について説明する。
下の例を見て分かるように、ユーザ名の表現方法は多岐にわたる。
気を付けてほしいのは、読者名や作成者名として扱う時は、[Canonicalize]で設定したものでないとダメだということである。
見やすいからと言って、[Abbreviate]や[CN]で設定した@UserNameでは読者名として認識してくれないのである。
下手に読者名に設定してしまうと、誰にも見えなくなってしまう文書になるので注意してほしい。


@Prompt([OK];"現在のユーザー名(省略形式)";@Name([Abbreviate];@UserName));
@Prompt([OK];"現在のユーザー名(正式形式)";@Name([Canonicalize];@UserName));
@Prompt([OK];"現在のユーザー名(共通名のみ)";@Name([CN];@UserName));
@Prompt([OK];"現在のユーザー名(組織名のみ)";@Name([O];@UserName))