現在ノーツデータベースの中には、前回作成したフォームを使用して作成された文書が入っています。
今度はこれを(得意先マスターと)同じような各フィールドを持った別のファイルに転送する、ということをしてみましょう。
前回に先取り的に使用してしまいましたが、ノーツデータベースの中の文書を取得してくるためにビューを作成しました。
RDB でもよく効率のよいプログラムアクセスのためにビューを使用することがあります。AS/400的に言うと、読み込み用の論理ファイルを作成する、といったかんじです。
ビューの作成で「ビュー名」を指定してから、「検索条件の追加」をクリックします。
「検索条件」を変更して、フォームを指定します。
さらに表示するフィールドを選んでいきます。

エージェントの作成の手順は今までとまったく同じです。
「プロジェクトの編集」での jar ファイルのコピーも忘れずに実行してください。
コンパイルが成功したら、スケジュールして実行させてください。
以前ご紹介した Java 1.1で JDBC 2.0を使う でのやり方を使っています。
Java エージェントはドミノの Java VM で稼動します。こちらでも触れましたが、ドミノ R5 の Java VM は
Java 1.1 です。
実は、ここのエージェントで RDB に INSERT
を実行する時に、JDBC 2.0 での拡張機能である
addBatch という後でまとめて INSERTステートメントを実行してくれる、という機能を使用したかったのです。
ドミノの住所のフィールドが1つなのを、住所1、住所2 に分割しなくてはならないのですが、それは前回 2つの RDB カラムをくっつけてしまっているからなので、その時のロジックの逆をやっています。
import lotus.domino.*;
import java.sql.*;
import com.ibm.db2.jdbc.app.*;
public class JavaAgent extends AgentBase {
DB2Connection con = null;
int num = 0;
Document document = null;
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
Database database = agentContext.getCurrentDatabase();
View view = database.getView("All");
ViewEntryCollection viewEntryCollection = view.getAllEntries();
ViewEntry viewEntry = viewEntryCollection.getFirstEntry();
// (Your code goes here)
connectToAS400();
DB2PreparedStatement stmt = (DB2PreparedStatement) con.prepareStatement("INSERT INTO QEOL.TOKMSP2 (TKBANG, TKNAKJ, TKADR1, TKADR2, TKNURI) VALUES (?, ?, ?, ?, ?)");
while (viewEntry !=null) {
document = viewEntry.getDocument();
System.out.println("doc OK");
String text1 = document.getItemValueString("CustID");
String text2 = document.getItemValueString("CustName");
String text3 = document.getItemValueString("CustAddr");
int index = text3.indexOf(" ");
String text4 = text3.substring(0, index);
String text5 = text3.substring((index + 1), (text3.length() - index));
int number = document.getItemValueInteger("Sales");
document.recycle();
stmt.setString(1, text1);
stmt.setString(2, text2);
stmt.setString(3, text4);
stmt.setString(4, text5);
stmt.setInt(5, number);
stmt.addBatch();
num++;
System.out.println( num + " Rows has been inserted.");
viewEntry = viewEntryCollection.getNextEntry();
System.out.println("ve OK");
}
System.out.println("exit loop");
int[] updates = stmt.executeBatch();
con.commit();
System.out.println("commit");
stmt.close();
con.close();
//viewEntry.recycle();
//viewEntryCollection.recycle();
view.recycle();
database.recycle();
session.recycle();
System.out.println("All resources are freed.");
} catch(Exception e) {
e.printStackTrace();
}
}
public void connectToAS400() {
String url = "jdbc:db2://";
String system = "localhost";
String user = "USER";
String password = "PASSWORD";
try {
DriverManager.registerDriver(new com.ibm.db2.jdbc.app.DB2Driver());
System.out.println("Driver registerd.");
con = (DB2Connection) DriverManager.getConnection(url + system, user, password);
System.out.println("got connected.");
con.setAutoCommit(false);
System.out.println("Set AutoCommit Successful.");
}
catch (SQLException ex) {
System.out.println("could not get a connection.");
ex.printStackTrace();
return;
}
System.out.println("connected.");
return;
}
}
スケジュールでの実行に先立って、iSeries上の転送先になるテーブルの内容を見てみます。
中身は空です。
スケジュールされたエージェントが実行されます。
この時は INSERT を行なう度にメッセージを出すようにしておいたので、そのメッセージが出ています。最後に終了時のメッセージも確認できます。
再度、iSeries上のテーブルの内容を確認してみましょう。
先のノーツデータベースの文書と同じ内容の行が入っているのが確認できます。
より正統派的には、ちゃんとひとつずつ INSERT
を行なう方法もあります。
こちらの方は、"DB2"とか"AS400JDBC"とか頭についた JDBC
クラスを使用しなくてもいいですし、「プロジェクトの編集」で db2_classes.jar
や jt400.jar をデータベースに追加しなくてもすみます。(その場合は、サーバーの
notes.ini の JavaUserClasses= で指定します)
import lotus.domino.*;
import java.sql.*;
import com.ibm.db2.jdbc.app.*;
public class JavaAgent extends AgentBase {
DB2Connection con = null;
int num = 0;
Document document = null;
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
Database database = agentContext.getCurrentDatabase();
View view = database.getView("All");
ViewEntryCollection viewEntryCollection = view.getAllEntries();
ViewEntry viewEntry = viewEntryCollection.getFirstEntry();
// (Your code goes here)
connectToAS400();
DB2PreparedStatement stmt = (DB2PreparedStatement) con.prepareStatement("INSERT INTO QEOL.TOKMSP2 (TKBANG, TKNAKJ, TKADR1, TKADR2, TKNURI) VALUES (?, ?, ?, ?, ?)");
while (viewEntry !=null) {
document = viewEntry.getDocument();
System.out.println("doc OK");
String text1 = document.getItemValueString("CustID");
String text2 = document.getItemValueString("CustName");
String text3 = document.getItemValueString("CustAddr");
int index = text3.indexOf(" ");
String text4 = text3.substring(0, index);
String text5 = text3.substring((index + 1), (text3.length() - index));
int number = document.getItemValueInteger("Sales");
document.recycle();
stmt.setString(1, text1);
stmt.setString(2, text2);
stmt.setString(3, text4);
stmt.setString(4, text5);
stmt.setInt(5, number);
int updateCounts = stmt.executeUpdate();
num = num + updateCounts;
System.out.println( num + " Rows has been inserted.");
viewEntry = viewEntryCollection.getNextEntry();
System.out.println("ve OK");
}
System.out.println("exit loop");
con.commit();
System.out.println("commit");
stmt.close();
con.close();
view.recycle();
database.recycle();
session.recycle();
System.out.println("All resources are freed.");
} catch(Exception e) {
e.printStackTrace();
}
}
public void connectToAS400() {
String url = "jdbc:db2://";
String system = "localhost";
String user = "USER";
String password = "PASSWORD";
try {
DriverManager.registerDriver(new com.ibm.db2.jdbc.app.DB2Driver());
System.out.println("Driver registerd.");
con = (DB2Connection) DriverManager.getConnection(url + system, user, password);
System.out.println("got connected.");
con.setAutoCommit(false);
System.out.println("Set AutoCommit Successful.");
}
catch (SQLException ex) {
System.out.println("could not get a connection.");
ex.printStackTrace();
return;
}
System.out.println("connected.");
return;
}
}
|
|