- ベストアンサー
Notes/Dominoでアクセスカウンタを実現する方法
- DominoDesignerで文書の作成登録、閲覧が完成した後、文書ごとの開かれた回数を取得するアクセスカウンタの作り方について説明します。
- 新規文書フォームにカウント用のフィールドとカウント数表示用のフィールドを追加し、QueryOpenメソッドでカウンタの値を処理する方法を解説します。
- QueryOpenの時点ではCounterが認識されないため、新規作成の文書の場合にエラーが発生します。このエラーを解決するためには他のメソッドを利用する必要があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
・・・すいません。No1です。駄目な回答をしてしまったようで。 申し訳ないので、自分の仕事をほっといて、ちと検証してみました。 結論としては、例のif文をelseで処理を分けずに、QueryOpenとPostopenに分割して記述する。 QueryOpenには Dim doc As NotesDocument Dim CounT As String Set doc = source.Document If Not IsNewDoc Then CounT = doc.Counter(0) CounT = Cstr(Cint(CounT)+1) doc.Counter = CounT Call doc.save(ture,true) End if PostOpenには dim doc As NotesDocument Dim CounT As String Set doc = source.Document if doc.Counter(0) = "" then end if doc.Counter="0" End if というように、カウントアップはQueryOpen。 新規文書だったときの最初のフィールド生成はPostOpenで行う。 これでうまくカウントアップされました。うちの環境では。 あと、この質問とは直接関係はないのですが・・・。 ご存知かも知れませんが、ドミノ懇談室というページがあります。 http://ncdomino.notescons.gr.jp/ ノーツに関する質問を行うことが出来る掲示板です。 (ユーザ登録が必要ですが。) 検索すればヒントが見つかるかもしれません。 また、ノーツで仕事する上では、かなりの情報源となりますので ご紹介しておきます。
その他の回答 (1)
- Swordline
- ベストアンサー率42% (291/688)
まず、エラーの「オブジェクト変数がありません」は docというNotesdocumentクラスに何もセットされていない状態で Counterフィールドに値をセットしようとして発生してます。 解決方法ですが、まず、QueryOpenではなくPostOpenに記述します。 で、ソースを下記のように修正してみてください。 <修正前> (前略) If IsNewDoc Then doc.Counter="0" ★ Else (以下略) <修正ソース> (前略) If IsNewDoc Then source.FieldSetText("Counter","0") 'この一行が修正箇所です。 Else (以下略) これで、セットされるかもしれません。 うちの環境で似たようなことやってみて出来たんで・・・。
お礼
ありがとうございます。 確かに、docに値が入っていませんでした。 アドバイスいただいたとおりやってみましたが、 PostOpenでやると、 新規文書でも、IsNewDocがFalseになってしまい、FieldSetTextが実行されません。 (QueryOpenの時点ではIsNewDocはTrueでした。) また、よろしければ、新規ではなく、既存文書を開いた場合のカウントアップ(Elseのほうです。)もお教えいただけるとうれしいです。 よろしくお願いします。
補足
補足です。 おっしゃっていただいたとおり、PostOpenで実現することを考え、以下のようにコードを書き直しました。 すると、新規の時はうまくいったのですが、ビューから文書を開くときに 「FieldSetTextは編集モードでおこなってください。」 というエラーを受けてしまいます。 閲覧されただけでカウントアップするようにしたいのですが、なにかいい方法はありますでしょうか。 よろしくお願いいたします。 Sub Postopen(Source As Notesuidocument) Dim session As New NotesSession Dim doc As NotesDocument Dim Number As Integer Dim workStr As String Set db = Session.CurrentDatabase Set doc = source.Document workStr=source.FieldGetText("Counter") If workStr = "" Then Number = 1 Else Number = Cint(workStr) + 1 End If Call source.FieldSetText("Counter",Cstr(Number)) ★ Call doc.save(False,False) End Sub
お礼
お手数おかけしました! 確かにQueryOpenとPostOpenにわけるといいんですね・・・ ありがとうございます。 お手数おかけしました。 ドミノ懇談室、とても活用できそうです。ご紹介いただいてありがとうございました!