本文へジャンプ

ソフトウェア > Lotus > Lotus Developer Domain > 

Iris Today Archives

Lotusphere 2001 データベース・コンテスト


Lotus Software
by Jason Lounsbery
レベル:ビギナー
対象:Domino 5.0
原文の掲載:2000年5月1日

Iris Today Archivesの原文(US)

インデックス
全体像
ステップ1: 名前と電子メール
ステップ2: コンテストにエントリーする
ステップ3: アンケート
受賞者を選ぶ
実際のデータベースの実行

もしあなたが今年の Lotusphere に運良く参加できたとしたら、アンケートに答えるだけで私たちの Notes.net コンテストに参加するチャンスがあったことでしょう。もしあなたがオフィスで仕事をしていなければならなかったとしてもアンケートに答えることはできますが、コンテストに参加することはできません。

このコンテストとアンケートの目的は Notes.net のプロモーションでした。Notes.net ユーザーには MP3 プレーヤーなどの商品を手にするチャンスが提供され、ユーザーによるフィードバックをしていただき、そして楽しんでいただく、といったものです。Lotusphere での活動を始めた当初から、エントリーの有効化、アンケートの実行、そして商品が当たる 16 名のランダムな選択など、関係するあらゆることをできる限り自動化するデータベースをセットアップする必要性を感じていました。

この記事では、Lotusphere でのコンテストとアンケートを処理するコンテスト・データベースを見ていきます。より深く見てみたい方は、Lotusphere 2001 コンテスト・データベースのテンプレートを Iris Sandbox からダウンロードしてください。このテンプレートはロータスのビジネス・パートナーである Knowledge Resource Group によって設計されました。


全体像
コンテスト・データベースは Lotusphere の参加者たちがコンテストにエントリーしたり、みなさんがブラウザーからアンケートに答えることができるように設計されました。トップ・ページとなったのが Lotusphere コンテスト・ウェルカム・ページでした。

Contest welcome page

ユーザーが [Enter the contest] リンクをクリックするとエントリー文書が表示されます。エントリーとアンケートは同じ文書の異なったセクションなのです。どちらのセクションが表示されるかは、ユーザーが進んでいるステップによって異なります。ステップ1では、ユーザーは名前と電子メール・アドレスを入力します。ステップ2はコンファレンスに参加している人たちのためのコンテストへのエントリーです。コンテストにエントリーするためには、各 Lotusphere 参加者に与えられた個別の ID ナンバーが必要なため、コンファレンスに参加していない人はコンテストにエントリーすることができません。ステップ3では、アンケートの入力を行います。

有効化は文書内の3つのフィールドで行われます。名前、電子メール・アドレス、そして Lotusphere に参加している人であれば、コンテスト番号です。すべての有効化は、QuerySave エージェントを介してバックエンドにて行われます。各ステップが終わる度に文書は保存、有効化され、最終ステップまでアンケートは送信されません。アンケートが送信されなければ、コンテストへのエントリーは受け付けられません。

一度送信されると、すべてのエントリーが1つのビューに集められ、このビューに対してエージェントが実行され、その日の受賞者を決定します。
 
上に戻る
 
ステップ1: 名前と電子メール
ではステップ1から詳しく見ていきましょう。ここでユーザーは名前と電子メール・アドレスを聞かれます。これら2つのフィールドは必須フィールドです。1つのフィールドが空白のままであれば、ユーザーは現在のページに戻され再度名前と電子メール・アドレスの入力を求められます。

Screen of step 1

フィールドの下には2つのリンクがあります。「I am not at lotusphere」と「I am at Lotusphere」です。いずれかのリンクをクリックすることでフィールドが有効化されます。すべての有効化は同じ QuerySave エージェントを使用しバックエンドで行われます。「I am at Lotusphere」をクリックすることでユーザーはステップ2である、コンテストにエントリーする段階に進むことができます。

これは「I am not at Lotusphere」ホットスポットの式です。

@SetField("AtLotusSphere";"no");
@SetField("pass";"5");
@Command([FileSave]);
@Command([FileCloseWindow])

pass というフィールドは QuerySave エージェント内で使用されます。その値は文書などのセクションを有効化するかをシステムに指示します。忘れてはならないのがアンケートは1つの文書であり、有効化したい部分をステップごとに指示しなければならないことです。これは QuerySave エージェントのセクションの1つです。

Select Case pass...
   Case "5":
   If (lotusname = "" Or Trim(doc.Emailaddress(0)) ="")Then
     doc.pass ="0"
     doc.passRegistration ="false"
   Else
     doc.passRegistration ="true"
     doc.pass ="2"
   End If
   Print |[| + vPath(0) +|/0/| + Cstr(doc.universalid)+|!EditDocument]|

Lotusname は文書上の Name フィールドにセットされます。Print ステートメントはユーザーが現在入力中の文書へのリンクです。有効化が失敗すると pass フィールドが 0 に、passRegistration が false にセットされます。このケースでは、何が間違っているかの説明に注目した上で、ユーザーはステップ1をやり直さなければなりません。

Validation failed message

有効化が成功するとアンケート・セクションが表示されます(これは I am not at Lotusphere ホットスポットだということを忘れずに)。アンケートは参加者とそうでない人も同じものを利用するので、コンファレンスに参加している場合の進み方を見てみましょう。ステップ1のもう1つのホットスポットである I am at Lotusphere ホットスポットのコードです。

@SetField("AtLotusSphere";"yes");
@SetField("pass";"4");
@Command([FileSave]);
@Command([FileCloseWindow])

同じ有効化エージェントが呼ばれるのですが、今回は、コードの別のセクションに注目します。

Case "4":
   If (lotusname = "" Or Trim(doc.Emailaddress(0)) ="") Then
     doc.pass ="0"
     doc.passRegistration ="false"
   Else
     doc.passRegistration ="true"
     doc.pass ="1"
   End If
   Print |[| + vPath(0) +|/0/| + Cstr(doc.universalid)+|!EditDocument]|

再び名前と電子メール・アドレスが有効化されました。有効化に成功すると pass フィールドは1にセットされます。pass フィールドを1にセットすることで、ステップ2で利用する、コンファレンス参加者だけが見ることのできる画面を表示します。
 
上に戻る
 
ステップ2: コンテストにエントリーする
ステップ2はコンテストにエントリーするための段階です。

Screen for step 2

ここでも文書が再び保存され、pass フィールドが何を有効化するかをエージェントに指示します。
  • フィールドが空白でないこと
  • 有効な Notes.net コンテスト番号が含まれていること
  • コンテスト番号がすでに登録されていないこと
ステップ2のページの Continue ホットスポットの式です。

@SetField("pass";"2");
@Command([FileSave]);
@Command([FileCloseWindow])

ここでも文書が保存され、pass フィールドが何を有効化するかをエージェントに指示します。

Case "2":
   If(doc.AtlotusSphere(0) = "yes") Then
     If CanRegister(lotusname,lotusnumber) = "True"Then
       doc.PassRegistration = "True"
     Else
       doc.PassRegistration ="false"
       doc.pass = "1"
     End If
       If notused(lotusname,lotusnumber,s) ="True" Then
       doc.notused ="no"
     Else
       doc.notused ="yes"
       doc.pass ="1"
     End If
   End If
   Print |[| + vPath(0) +|/0/| + Cstr(doc.universalid)+|!EditDocument]|

2つ目のパスの初めに CanRegister 関数が呼び出されます。

Function CanRegister(lotusname As String,lotusnumber As String) As String
   Dim firststring As String
   Dim rest As String
   Dim smallnumber As String
   Dim largenumber As String
   firststring = Left(lotusnumber,1)
   rest = Right(lotusnumber,6)
   Passes = "Continue"
   smallnumber ="2"
   largenumber ="1"
   Select Case firststring
   Case "Q","q"
     smallnumber ="111000"
     largenumber = "112000"
   Case "R","r"
     smallnumber ="121000"
     largenumber = "122000"
   Case "S","s"
     smallnumber ="131000"
     largenumber = "132000"
   Case "T","t"
     smallnumber ="141000"
     largenumber = "142000"
   Case "U","u"
     smallnumber ="151000"
     largenumber = "152000"
   Case "V","v"
     smallnumber ="161000"
     largenumber = "162000"
   Case "W","w"
     smallnumber ="171000"
     largenumber = "172000"
   Case "X","x"
     smallnumber ="181000"
     largenumber = "182000"
   Case "Y","y"
     smallnumber ="191000"
     largenumber = "192000"
   Case "Z","z"
     smallnumber ="201000"
     largenumber = "202000"
   Case "B","b"
     Dim temp As String
     temp = Ucase(rest)
     rest = temp
     smallnumber = "NN1000"
     largenumber ="NN1021"
   Case Else
     smallnumber ="2"
     rest ="1"
   End Select
   If (smallnumber <= rest And rest <= largenuber And
   Len(lotusnumber)=7) Then
     CanRegister ="True"
   Else
     CanRegister = "False"
   End If
End Function

コンテスト番号は特定の参加者と関連付けされていなかったため、番号と参加者を結びつける方法がありませんでした。有効化するために、番号はリスト中の番号と組み合わされます。コンテスト番号は1つの文字とこれに続く6桁の番号から構成されています。初めの文字によって6桁の番号の範囲が決まります。番号は無効な場合、無効な番号エラーとともにユーザーはステップ2に残ります。今一度、print ステートメントがユーザーを正しいセクションに導きます。

Step 2 validation

番号が正しい場合は notused 関数が呼び出されます。この関数はその番号がすでに使用されていないかを特定するもので、参加者が2回以上コンテストにエントリーできないようにしてくれるのです。

Function notused (lotusname As String, lotusnumber As String, s As notessession) As String
   Dim db As notesdatabase
   Dim view As notesview
   Set db = s.currentdatabase
   Set view = db.getview("byregid")
   Dim doc As notesdocument
   Set doc = view.getdocumentbykey(Ucase(lotusnumber))
   If doc Is Nothing Then
     notused = "True"
   Else
     notused = "False"
   End If
End Function

登録番号がすでに使用されている場合、ユーザーは Lotusphere の Iris Developers Lab にいる Notes.net チームのメンバーを見つけて有効な登録番号をもらわなければなりません。非常に小さい確立ではありますが、誰かが他人の番号を入力してしまう可能性も少なからずあるので、私たちが柔軟に対応することで参加者がコンテストにエントリーできるようにしたかったのです。
 
上に戻る
 
ステップ3: アンケート
すべての有効化の終了後、ユーザーがアンケートに記入する用意ができました。前と同じようにcase ステートメントの後ろにある print ステートメントが正しいセクションを表示します。このケースではアンケートになるわけです。

Screen for step 3 -survey

ユーザーはいろいろな質問に答えながらアンケートの記入を進めます。アンケートの一番下には Submit ホットスポットがあります。このホットスポットの式は次の通りです。

@SetField("pass";"3"):
@SetField("Submitted";"Yes");
@SetField("showall";"yes");
@SetField("validatenow";"no");
@Command([FileSave]);
@Command([FileCloseWindow])

これは pass 3 で私たちに関係する、コードの有効化の部分です。

Case "3":
   doc.pass ="2"
   doc.Can_Read ="[Readers]"
   Set item = doc.getfirstitem("Can_Read")
   item.IsReaders = True
   Print |[| + vPath(0) + |/ThanksSurvey?Openform]|

一度文書が送信されると、特定のユーザーのみ送信されたアンケートを見ることができるように Readers フィールドがセットされます。このケースの「特定のユーザーは」 Notes.net チームです。ユーザーは最後の挨拶のページに導かれます。
上に戻る
 
受賞者を選ぶ
これまでに私たちは Lotusphere の参加者や他の人たちがどのようにしてアンケートに記入し、どのようにして Notes.net コンテストにエントリーするかを見てきました。次に、私たちが受賞者をどう選んでいたかを見ていきましょう。

Notes.net チームの誰かが1日1回エージェントを実行し、ランダム数字を使って各日の受賞者を選んでいました。1日 16 人の受賞者がいるわけですから、16 のランダム数字が選ばれます。なんらかの理由でコンテストの受賞者に権利がなくなった場合は、この受賞者は削除され、新しい受賞者をリストの1番下に追加することができます。

これがどのように実現されているか、Contest Entries と Daily Winners ビューを見ながら考察してみましょう。

Contest Entries ビュー
Contest Entries ビューは次のセクション式を持っています。

SELECT HasWon ="0" & AtlotusSphere ="yes" & Submitted ="Yes" & Form != "welcomepage" & Form != "winnerslist"

ビューには Lotusphere に参加した人のうち、賞をもらっていない人のアンケートが表示されます。これは 16 人の受賞者を選ぶために使われます。[Pick Winner] ボタンが Pick Winner エージェントを呼びだし、1からビュー内にある文書の数の間の数字をランダムに選び出します。もし 1,543 文書あるとすれば、エージェントは1から 1,543 の間の数字をランダムに選ぶわけです。そして文書にフラグを付けて受賞者の1人とし、Contest Entries ビューからその文書を削除し、ビューを更新、そして全プロセスをあと 15 回繰り返します。受賞者が何を受賞するかを特定するため、受賞の順番も重要になります。

ここにエージェントのコードがあります。

Sub Initialize
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim view As NotesView
   Dim doccoll As notesdocumentcollection
   Dim doccount As Integer
   Dim x As Integer
   Dim doc As NotesDocument
   Dim dateTime As New NotesDateTime( "" )
   Call dateTime.SetNow
   Set db = session.CurrentDatabase
   Set view = db.GetView( "Admin" ) ' put the name of your view here
   For x = 1 To 16
     Set doccoll = view.getalldocumentsbykey("0")
     doccount = doccoll.count
     Randomize
     i=Int( (doccount-1)* Rnd+1)
     Set doc = view.GetNthDocument( i )
     doc.haswon ="1"
     doc.datewon = dateTime.dateonly
     doc.numberchosen = x
     doc.randomnumber = i
     Call doc.save(False,False) 
   Next
   Call view.refresh
End Sub

Daily Winners ビュー
Daily Winners ビューは受賞日時にしたがって受賞者を表示します。このセクション式は次の通りです。

SELECT form = "Survey" &HasWon ="1" & Form != "welcomepage" & Form != "winnerslist"

Daily Winners view

何らかの理由により受賞者をリストから外されなければならない場合は、Notes.net のメンバーが、その文書を選択し [Remove from Contest] ボタンをクリックすることで、その受賞者を外すことができます。このボタンのコードは次の通りです。

Sub Initialize
   Dim s As New notessession
   Dim db As notesdatabase
   Dim doccoll As notesdocumentcollection
   Dim doc As notesdocument
   Dim entry As NotesViewEntry
   Dim datewon As String
   Dim view As notesview
   Dim vc As NotesViewEntryCollection
   Dim x As Integer
   Dim doccount As Integer
   Set db = s.currentdatabase
   Set doccoll = db.unprocesseddocuments
   doccount = doccoll.count
   Set doc = doccoll. getfirstdocument
   datewon = doc.datewon(0)
   While Not(doc Is Nothing)
     doc.Haswon ="never"
     doc.AtlotusSphere ="no"
     Call doc.save(False,False)
     Set doc = doccoll.getnextdocument(doc)
   Wend
   'Call doccoll.removeall(True)
   Set view = db.getView("winners")
   Call view.refresh()
   Set vc = view.GetAllEntriesByKey(datewon)
   Set entry = vc.GetFirstEntry()
   Set doc = entry.Document
   x = 1
   While Not(entry Is Nothing)
     doc.numberchosen = x
     Call doc.save(False,False)
     Set entry = vc.getnextentry(entry)
     If Not(entry Is Nothing) Then
       Set doc = entry.Document
       x = x+1
     End If
   Wend
   Call view.refresh()
End Sub

このスクリプトは、選択した文書を not at Lotusphere としてフラグを立て、コンテストから外すものです。これにより文書は受賞者リストから外され、Survey ビューにのみ表示されるようになります。他の受賞者は、削除された文書の数に応じてリストの上位へと上がります。例えば、10 番目の受賞者が外された場合、11 番目の受賞者が 10 番目に、12 番目の受賞者が 11 番目に、と続くわけです。

最終的に私たちは [Pick replacement winners] ボタンを使って受賞者が 16 人になるまで選び続けます。このエージェントは、何人の受賞者を追加するかを決定し、追加の受賞者を選び、彼らを受賞者リストに追加します。

その他のビュー
Contest Entries と Daily Winners ビューの他には、Survey ビューは記入済みのすべてのアンケートを表示し、Not Submitted ビューは記入され始めたが送信されなかった文書をリストアップし、Welcome ビューは Notes.net Lotusphere Contest ウェルカム・ページを表示し、Winners List ビューには Notes.net 上で各日の受賞者を表示するために利用された文書が含まれます。

Daily winners posting
 
上に戻る
 
実際のデータベースの実行
Lotusphere の期間中、1,500 以上の参加者がコンテストにエントリーしました。私たちは各日 16 人の受賞者を選び、名前を Notes.net や Iris Developer's Lab に掲載しました。Lotusphere と Iris の Notes.net チーム・メンバーはコンテストをモニターし、毎日円滑に審査が進むよう努力したのです。


著者について
ジェイソン・ラウンズベリーはロータスのビジネス・パートナーである Knowledge Resource Group で働いています。
 
上に戻る