ドミノの機能を使用したストアド・プロシージャ

トリガーなどで使うことを念頭において、データをわたすとドミノのデータベースに文書を作成して、リンクを(承認などのために)担当者に送る、といったストアド・プロシージャを作成してみました。
Java を使ったストアド・プロシージャの基本的なことについてはこちらを参照してください。

今回のテーマは

といったところですね。


UDB 上でドミノの機能を使用するためには、こちらで紹介したような処理が必要です。

まず、最初にロジックを見てみましょう。

リソースバンドルから接続サーバー名やユーザー名を取得し、与えられたデータをもとに文書を作成し、そのドキュメントリンクを作ってメールする、といった一連の処理です。(リソースバンドルの使い方についてはこちらを参照してください)

Document mail = database.createDocument();
System.out.println("another Document created");

  mail.replaceItemValue("Subject", "新規登録のお知らせ");
  mail.replaceItemValue("Form", "Memo");
  mail.replaceItemValue("Sendto", sendto);
  System.out.println("replaceItemValues ok");

  RichTextItem body = mail.createRichTextItem("Body");
  System.out.println("createRichTextItem ok");

    body.appendText("以下の会社が登録されました:");
    System.out.println("appendText ok");
    body.addNewLine(2);
    System.out.println("addNewLine ok");
    // body.appendDocLink(database, database.getTitle(), "データベースへのリンク");
    // System.out.println("appendDoclink ok");
    body.addNewLine();
    System.out.println("addNewLine ok");

    // body.appendDocLink(document, "会社名: " + custid + " " + custname, "該当文書へのリンク");

    body.appendDocLink(document, "会社名: " + custid + " " + custname);
    System.out.println("appendDoclink ok");

  // mail.setSaveMessageOnSend(false);
  System.out.println("all set");

  mail.send(sendto);
  System.out.println("Document sent");

リソースバンドルからは サーバー名/ユーザー名/パスワード/メールの送り先 を取得しています。

ResourceBundle props = ResourceBundle.getBundle("server");

String server = props.getString("server");
String user = props.getString("user");
String password = props.getString("password");
String sendto = props.getString("sendto");

これがリソースバンドルとして取得するプロパティファイルの内容 (server.properties) です。これらの情報の変更に関しては、これを変更するだけでクラス自体の再コンパイルなどはいらないわけですね。

server=asdomino
user=Admin
password=PASSWORD
sendto=Admin

セッションの取得、データベースの取得、ビューの取得までのながれはおなじみだと思いますので解説は省略します。

ストアド・プロシージャで使用する場合でも、UDF で使用する場合でもロジック自体のテストは単体で終えてから、データベースへの配置を行なうようにします。デバッグがわけわからなくなるのと、データベースサーバー自体の Java VM をおかしくしてしまったりすることがあるからです。じゅうぶん気をつけてください。

今回はこんなテストプログラムを使用してロジックを検証しました。

import lotus.domino.*;
import java.sql.*;
import java.io.*;
import java.util.*;

public class TestFunction {

public static void main(String[] args) {

  try {
    TestFunction tf = new TestFunction();
    tf.RegistCustomer ("888", "テスト", "葛飾区", "新宿", 100);
  }
  // catch (NotesException ne) {}
  catch (SQLException se) {}
  catch (Exception e) {}

}

public static void RegistCustomer (String custid, String custname, String addr1, String addr2, int intsales)
  throws SQLException, Exception {

  try {
    ResourceBundle props = ResourceBundle.getBundle("server");

    String server = props.getString("server");
    String user = props.getString("user");
    String password = props.getString("password");
    String sendto = props.getString("sendto");

    Session session = NotesFactory.createSession(server, user, password);
    System.out.println("Connected");

    Database database = session.getDatabase("", "UDBTest.nsf");
    System.out.println("got Database");

    Document document = database.createDocument();
    document.replaceItemValue("Form", "CustForm");
    document.replaceItemValue("CustID", custid);
    document.replaceItemValue("CustName", custname);
    String addr = addr1.trim() + " " + addr2;
    document.replaceItemValue("CustAddr", addr);
    Double sales = new Double(intsales);
    document.replaceItemValue("Sales", sales);
    document.save();
    System.out.println("Document saved");

    Document mail = database.createDocument();
    System.out.println("another Document created");
    mail.replaceItemValue("Subject", "新規登録のお知らせ");
    mail.replaceItemValue("Form", "Memo");
    mail.replaceItemValue("Sendto", sendto);
    System.out.println("replaceItemValues ok");
    RichTextItem body = mail.createRichTextItem("Body");
    System.out.println("createRichTextItem ok");
    body.appendText("以下の会社が登録されました:");
    System.out.println("appendText ok");
    body.addNewLine(2);
    System.out.println("addNewLine ok");
    // body.appendDocLink(database, database.getTitle(), "データベースへのリンク");
    // System.out.println("appendDoclink ok");
    body.addNewLine();
    System.out.println("addNewLine ok");
    // body.appendDocLink(document, "会社名: " + custid + " " + custname, "該当文書へのリンク");
    body.appendDocLink(document, "会社名: " + custid + " " + custname);
    System.out.println("appendDoclink ok");
    // mail.setSaveMessageOnSend(false);
    System.out.println("all set");
    mail.send(sendto);
    System.out.println("Document sent");

    document.recycle();
    mail.recycle();
    session.recycle();
  }
  catch (NotesException ne) {}
  // catch (SQLException se) {}
  catch (Exception e) {}

  }
}

目新しいところでは文書リンクの作成ですね。

リッチテキストアイテムを作成し、appendDocLink メソッドを使用します。

メソッドのシグネチャにはいくつかの種類があり、以下のようなかたちだと

body.appendDocLink(document, "会社名: " + custid + " " + custname);

こんなかんじになります。(一番下の行も見てくださいね。カーソルはリンクにおいた状態です)

以下のようなシグネチャだと

body.appendDocLink(document, "会社名: " + custid + " " + custname, "該当文書へのリンク");

こんなかんじの結果になります。

微妙にサイズが違いますね。ちょっとだけ大きい方が、最後に紹介した方です。

リンクをクリックすると文書が開きます。

こちらがデータベースのビューから見たところです。

テストのすんだプログラムからメソッドを移行して、ストアド・プロシージャを作成します。
デバッグ用の System.out.println は必要ないので、すべて削除します。

import lotus.domino.*;
import java.sql.*;
import java.io.*;
import java.util.*;

public class DominoStoredProcs {

public static void RegistCustomer (String custid, String custname, String addr1, String addr2, int intsales)
  throws SQLException, Exception {

  try {
    ResourceBundle props = ResourceBundle.getBundle("server");

    String server = props.getString("server");
    String user = props.getString("user");
    String password = props.getString("password");
    String sendto = props.getString("sendto");

    Session session = NotesFactory.createSession(server, user, password);

    Database database = session.getDatabase("", "UDBTest.nsf");

    Document document = database.createDocument();
    document.replaceItemValue("Form", "CustForm");
    document.replaceItemValue("CustID", custid);
    document.replaceItemValue("CustName", custname);
    String addr = addr1.trim() + " " + addr2;
    document.replaceItemValue("CustAddr", addr);
    Double sales = new Double(intsales);
    document.replaceItemValue("Sales", sales);
    document.save();

    Document mail = database.createDocument();
    mail.replaceItemValue("Subject", "新規登録のお知らせ");
    mail.replaceItemValue("Form", "Memo");
    mail.replaceItemValue("Sendto", sendto);
    RichTextItem body = mail.createRichTextItem("Body");
    body.appendText("以下の会社が登録されました:");
    body.addNewLine(2);
    // body.appendDocLink(database, database.getTitle(), "データベースへのリンク");
    // System.out.println("appendDoclink ok");
    body.addNewLine();
    // body.appendDocLink(document, "会社名: " + custid + " " + custname, "該当文書へのリンク");
    body.appendDocLink(document, "会社名: " + custid + " " + custname);
    // mail.setSaveMessageOnSend(false);
    mail.send(sendto);

    document.recycle();
    mail.recycle();
    session.recycle();
  }
  catch (NotesException ne) {}
  // catch (SQLException se) {}
  catch (Exception e) {}

  }
}

以前と同じ手順でストアドプロシージャを作成していきます。

対話型 SQL を使って確認してみます。

指定した通りの文書が作成されています。

確認メールもきていますね。

メールの内容はこんなかんじです。

リンクをクリックすると該当の文書にリンクします。

[Top Pageに戻る]

Ads by TOK2