商品受注を想定したアプリケーションです。
本サンプルアプリケーションは、ホストアクセスAPI経由でホストに接続を行い、ホストに対して入力データを通知します。また、在庫照会を行うことによりホストからのデータを取得し、画面に表示します。
ログオン画面
入力されたユーザIDとパスワードを使用し、ホストとの接続を行います。
業務メニュー画面
選択された業務種別をホストに通知します。
商品登録画面
入力された情報をホストに通知し、登録結果を表示します。
在庫照会画面
ホストから在庫照会結果を取得し、結果を表示します。
顧客名・担当者名・受注日に検索条件を指定することで、特定の在庫照会結果が取得できます。
アプリケーションのホストアクセス部のソースコード(IhasAPIWrapper.java)について説明します。サンプルアプリケーションのソース全体については添付のソースコードを参照してください。また、本サンプルアプリケーションではホストアクセス部で発生した例外は呼び出し元で取得し、ユーザにエラー情報として通知しています。サンプルアプリケーション作成の際は、各処理に応じて適した例外処理は記載するようにしてください。
ホストアクセスを行うためのクラスです。
本クラスには、ホストアクセスAPI経由でホストにアクセスするためのメソッドが実装されています。
/* * @(#)IhasAPIWrapper.java 1.00 2008/06/06 * * Interstage Host Access Service(IHAS) * COPYRIGHT FUJITSU LIMITED 2008. * */ package order2; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Vector; //IHAS関連 import com.fujitsu.interstage.has.api.Session; import com.fujitsu.interstage.has.api.Screen; import com.fujitsu.interstage.has.api.FieldSnapshot; import com.fujitsu.interstage.has.api.Field; import com.fujitsu.interstage.has.api.IHASException; import com.fujitsu.interstage.has.api.IHASErrorCode; import com.fujitsu.interstage.has.api.Position; /** * ホストアクセス用クラス. * IHAS APIを使用し、ホストとの通信を行います。 * * @author FUJITSU LIMITED * @version v10.0.0.1 */ public class IhasAPIWrapper { /** * コンストラクタ. */ public IhasAPIWrapper() { } // メンバ変数 /** セッションクラスオブジェクト. */ private Session session; /** スクリーンクラスオブジェクト. */ private Screen screen; /** * ホストログオン処理. */ public final void logon(final String userId, final String userPw) throws IHASException { …詳細は別途説明するため省略… } /** * 切断処理. */ public final void disconnect() throws IHASException { …詳細は別途説明するため省略… } /** * 切断処理. */ public final int errorDisconnect() { …詳細は別途説明するため省略… } /** * 業務メニューの選択. */ public final void selectMenu(final String menuNum) throws IHASException { …詳細は別途説明するため省略… } /** * 商品登録処理. */ public final void input(final InputBean inputBean, final ResultBean resultBean) throws IHASException { …詳細は別途説明するため省略… } /** * 在庫照会処理. */ public final void output(final SearchBean searchBean, final ListBean listBean) throws IHASException { …詳細は別途説明するため省略… } /** * 在庫照会処理の実行. */ public final void execOutput(final SearchBean searchBean) throws IHASException { …詳細は別途説明するため省略… } /** * 在庫照会結果の取得. */ public final void getOutputData(final ListBean listBean) throws IHASException { …詳細は別途説明するため省略… } /** * PF8キーの送信. */ public final void sendAidPF8() throws IHASException { …詳細は別途説明するため省略… } }
ホストへのログオン処理を行うメソッドです。
本メソッドはホストへの接続後、ホストのログオン画面を待ち合わせます。ログオン画面の待ち合わせ後、ユーザIDとパスワードを設定し、[Enter]キーの実行を行います。[Enter]キーの実行により、業務メニュー画面に画面が遷移します。
/** * ホストログオン処理. * * ホストへのログオン処理を行います。 * @param userId ユーザIDを指定します。 * @param userPw ユーザIDのパスワードを指定します。 * @throws IHASException IHAS APIの例外 */ public final void logon(final String userId, final String userPw) throws IHASException { session = new Session(); // 接続 // connectのパラメタには運用管理コンソールで設定した接続情報名、 // または、グループ名を指定してください。 session.connect("PATH000"); // Screenの参照を取得 screen = session.screen(); // ログオン画面の待ち合わせ screen.waitString("INTERSTAGE HOST ACCESS SERVICE"); // ↑
// ログオン画面の待ち合わせをホスト画面上の文字列
// “INTERSTAGE HOST ACCESS SERVICE”を待ち合わせる
// ことで行います。
// フィールドスナップショットの取得 FieldSnapshot fs = screen.getFieldSnapshot(); // ユーザID入力フィールドへユーザIDを設定 fs.setFieldString("ユーザID:", 1, userId); // ↑
// ユーザIDを設定します。「ユーザID:」フィールドの隣が
// 入力フィールドとなるためオフセット位置を1で指定して
// 値を設定します。
// パスワード入力フィールドへパスワードを設定 fs.setFieldString("パスワード:", 1, userPw); // 実行アテンションの送信 fs.submit(); // ↑
// フィールドに設定した値をホストに通知します。
}
ホストからの切断を行うメソッドです。
本メソッドは、正常時の切断処理に使用します。
/** * 切断処理. * * ホストへの切断処理を行います。 * @throws IHASException IHAS APIの例外 */ public final void disconnect() throws IHASException { session.disconnect(); }
IhasAPIWrapper.errorDisconnect()
ホストからの切断を行うメソッドです。切断処理で発生したホストアクセスAPIの例外は通知しません。
本メソッドは、処理異常時の切断処理に使用します。
/** * 切断処理. * * ホストへの切断処理を行います。 * 切断処理での発生した例外を通知しません。 * @return 実行結果 */ public final int errorDisconnect() { int ret = IHASErrorCode.IHASERROR_NOERROR; try { session.disconnect(); } catch (IHASException ihasException) { ret = ihasException.getErrorCode(); return ret; } return ret; }
実行する業務メニューをホストに送信するメソッドです。
業務メニュー画面を待ち合わせます。業務メニュー画面の待ち合わせ後、ホストに業務番号を通知します。
業務番号の通知により指定した業務画面に遷移します。
/** * 業務メニューの選択. * * 実行する業務メニューの指定を行います。 * @param menuNum メニュー番号を指定します。 * @throws IHASException IHAS APIの例外 */ public final void selectMenu(final String menuNum) throws IHASException { // 業務メニュー画面の待ち合わせ // (業務メニュー画面に一意のIDが存在しないため複数の文字列を // 確認することにより特定の画面と判断します) // ↑
// ホスト画面の1行目に一意のIDが存在しない場合の
// 画面待ち合わせ処理です。
// フィールドスナップショットの取得 FieldSnapshot fs = screen.getFieldSnapshot(); // ホスト業務メニュー画面は2行目に文字列”業務メニュー画面”、
// 17行目に文字列”業務番号を入力してください”が存在する画面を
// 想定しています。
// 各ホストアプリではホスト画面にあった行数、文字列を設定する
// 必要があります。
// ↓
// ホスト画面上の2行目以降に文字列"業務メニュー"が存在するか確認 Position chkPos = new Position(2, 1); fs.getField(chkPos, "業務メニュー"); // ホスト画面上の17行目以降に文字列"業務番号を入力してください"が存在するか確認 chkPos.setPositon(17, 1); fs.getField(chkPos, "業務番号を入力してください"); // フィールドに文字列を設定 fs.setFieldString("業務番号:", 1, menuNum); // 実行アテンションの送信 fs.submit(); }
商品登録情報をホストに送信するメソッドです。
商品登録画面を待ち合わせます。商品登録画面の待ち合わせ後、商品登録情報を設定し、ホストに通知します。
また、ホストから返される商品登録結果を取得します。
/** * 商品登録処理. * * ホストに対し商品登録処理を行います. * @param inputBean InputBeanクラスを指定します. * @param resultBean ResultBeanクラスを指定します. * @throws IHASException IHAS APIの例外 */ public final void input(final InputBean inputBean, final ResultBean resultBean) throws IHASException { // 商品登録画面の待ち合わせ // (商品登録画面に一意のIDが存在しないため複数の文字列を // 確認することにより特定の画面と判断します) // フィールドスナップショットの取得 FieldSnapshot fs = screen.getFieldSnapshot(); // ホスト画面上の2行目以降に文字列"商品登録"が存在するか確認 Position chkPos = new Position(2, 1); fs.getField(chkPos, "商品登録"); // ホスト画面上の7行目以降に文字列"受注番号:"が存在するか確認 chkPos.setPositon(7, 1); fs.getField(chkPos, "受注番号:"); // 受注番号入力フィールドへ受注番号を設定 fs.setFieldString("受注番号:", 1, inputBean.getOrderNo()); // 顧客名入力フィールドへ顧客名を設定 fs.setFieldString("顧客名 :", 1, inputBean.getCustomer()); // 担当者名入力フィールドへ担当者名を設定 fs.setFieldString("担当者名:", 1, inputBean.getCharge()); // 受注日入力フィールドへ受注日を設定 Date date = inputBean.getOrderDate(); if (date != null) { DateFormat dfyear = new SimpleDateFormat("yyyy"); DateFormat dfmonth = new SimpleDateFormat("MM"); DateFormat dfday = new SimpleDateFormat("dd"); fs.setFieldString("受注日 :", 1, dfyear.format(date)); fs.setFieldString("受注日 :", 3, dfmonth.format(date)); fs.setFieldString("受注日 :", 5, dfday.format(date)); } // 備考入力フィールドへ備考を設定 fs.setFieldString("備考 :", 1, inputBean.getNotes()); // 実行アテンションの送信 fs.submit(); // 画面更新のため再度フィールドリストを取得します。 fs = screen.getFieldSnapshot(); // 商品登録結果メッセージはホスト画面上の
// 19行、19桁に固定で表示されます。
// ↓
// 商品登録結果の解析 Position pos = new Position(19, 19); String resultMsg = fs.getFieldString(pos); // 商品登録成功時はメッセージ”正常に登録されました。”
// が表示されます。
// ↓
if (resultMsg.equals("正常に登録されました。")) { // 登録成功 resultBean.setResultCode(0); resultBean.setResultMsg(resultMsg); resultBean.setErrorMsg(""); resultBean.setOrderNo(fs.getFieldString("受注番号", 1)); resultBean.setCustomer(fs.getFieldString("顧客名", 1)); resultBean.setCharge(fs.getFieldString("担当者名", 1)); resultBean.setOrderDate(fs.getFieldString("受注日", 1) + "/" + fs.getFieldString("受注日", 3) + "/" + fs.getFieldString("受注日", 5)); resultBean.setNotes(fs.getFieldString("備考", 1)); // 登録成功時は再度登録画面へ fs.submit(Screen.AID_PF2); } else { // 登録失敗 resultBean.setResultCode(1); resultBean.setResultMsg(resultMsg); // 詳細エラーメッセージを取得 Position errorMsgPos = new Position(20, 19); String errorMsg = fs.getFieldString(errorMsgPos); resultBean.setErrorMsg(errorMsg); } }
在庫照会処理を行うメソッドです。
検索条件画面を待ち合わせます。検索条件画面の待ち合わせ後、検索条件を設定し、ホストに通知します。検索条件の通知後、ホストから返される検索条件に従った在庫照会結果を取得します。
/** * 在庫照会処理. * * ホストに対し在庫照会処理を行います。 * @param searchBean SearchBeanクラスを指定します。 * @param listBean ListBeanクラスを指定します。 * @throws IHASException IHAS APIの例外 */ public final void output(final SearchBean searchBean, final ListBean listBean) throws IHASException { // 検索条件画面の待ち合わせ // (検索条件画面に一意のIDが存在しないため複数の文字列を // 確認することにより特定の画面と判断します) // フィールドスナップショットの取得 FieldSnapshot fs = screen.getFieldSnapshot(); // ホスト画面上の2行目以降に文字列"検索条件"が存在するか確認 Position chkPos = new Position(2, 1); fs.getField(chkPos, "検索条件"); // ホスト画面上の7行目以降に文字列"顧客名 :"が存在するか確認 chkPos.setPositon(7, 1); fs.getField(chkPos, "顧客名 :"); // 在庫照会処理の実行 execOutput(searchBean); // 在庫照会結果の取得 getOutputData(listBean); }
在庫照会を行う検索条件をホストに送信するメソッドです。
/** * 在庫照会処理の実行. * * 在庫照会リストの取得条件を入力パラメタとして設定し、 * 取得条件に従った在庫照会処理を実行します。 * @param searchBean SearchBeanクラスを指定します。 * @throws IHASException IHAS APIの例外 */ public final void execOutput(final SearchBean searchBean) throws IHASException { // フィールドスナップショットの取得 FieldSnapshot fs = screen.getFieldSnapshot(); // 顧客名入力フィールドへ顧客名を設定 fs.setFieldString("顧客名 :", 1, searchBean.getCustomer()); // 担当者名入力フィールドへ担当者名を設定 fs.setFieldString("担当者名:", 1, searchBean.getCharge()); // 受注日(開始)入力フィールドへ受注日を設定 Date dateFrom = searchBean.getFromDate(); if (dateFrom != null) { DateFormat dfyear = new SimpleDateFormat("yyyy"); DateFormat dfmonth = new SimpleDateFormat("MM"); DateFormat dfday = new SimpleDateFormat("dd"); fs.setFieldString("受注日 :", 1, dfyear.format(dateFrom)); fs.setFieldString("受注日 :", 3, dfmonth.format(dateFrom)); fs.setFieldString("受注日 :", 5, dfday.format(dateFrom)); } // 受注日(開始)入力フィールドへ受注日を設定 Date dateTo = searchBean.getFromDate(); if (dateTo != null) { DateFormat dfyear = new SimpleDateFormat("yyyy"); DateFormat dfmonth = new SimpleDateFormat("MM"); DateFormat dfday = new SimpleDateFormat("dd"); fs.setFieldString("~ ", 1, dfyear.format(dateTo)); fs.setFieldString("~ ", 3, dfmonth.format(dateTo)); fs.setFieldString("~ ", 5, dfday.format(dateTo)); } // 実行アテンションの送信 fs.submit(); }
IhasAPIWrapper.getOutputData()
ホストから在庫照会結果を取得するメソッドです。
在庫照会画面を待ち合わせます。在庫照会画面の待ち合わせ後、在庫照会結果を取得します。在庫照会結果はテーブル形式のデータとして通知されるため、テーブル内の在庫照会結果がなくなるまで取得処理を繰り返します。
/** * 在庫照会結果の取得. * * 在庫照会リストを取得します。 * @param listBean ListBeanクラスを指定します。 * @throws IHASException IHAS APIの例外 */ public final void getOutputData(final ListBean listBean) throws IHASException { FieldSnapshot fs; // 在庫照会リスト ArrayList<RecordBean> listData = new ArrayList<RecordBean>(); // 在庫照会メッセージ String listMsg; int errorCode = IHASErrorCode.IHASERROR_NOERROR; // 在庫照会画面の取得 for (;;) { // 在庫照会画面の待ち合わせ // (在庫照会画面に一意のIDが存在しないため複数の文字列を // 確認することにより特定の画面と判断します) // フィールドスナップショットの取得 fs = screen.getFieldSnapshot(); // ホスト画面上の2行目以降に文字列"在庫照会"が存在するか確認 Position chkPos = new Position(2, 1); fs.getField(chkPos, "在庫照会"); // ホスト画面上の7行目以降に文字列"項目"が存在するか確認 chkPos.setPositon(7, 1); Field fieldText = fs.getField(chkPos, "項目"); // 在庫照会メッセージはホスト画面上の
// 4行、10桁に固定で表示されます。
// ↓
// 在庫照会メッセージの取得 Position posMsg = new Position(4, 10); listMsg = fs.getFieldString(posMsg); // 在庫照会リストの取得 // (在庫照会リストを表示するテーブルフォーマットは // 固定であり、項目数は12行となります) // "項目"の行、桁位置の取得 int fieldRow = fieldText.getPos().getRow(); int fieldCol = fieldText.getPos().getCol(); // ホスト画面上の在庫照会リストはヘッダ行+項目数12行の
// table型データとなります。
// ↓
// 1画面分の在庫照会データの取得 for (int i = 0; i < 12; i++) { Position position = new Position(fieldRow + (i + 1), fieldCol); Field fieldNum = fs.getField(position); // 在庫照会データの確認 // 在庫照会データが存在しない場合は項目が" "として表示される if (!fieldNum.getString().equals(" ")) { // 項目ごとのデータを設定 int index = fieldNum.getIndex(); RecordBean orderBean = new RecordBean(); orderBean.setOrderNo(fs.getField(index + 1).getString()); orderBean.setOrderDate(fs.getField(index + 2).getString()); orderBean.setCustomer(fs.getField(index + 3).getString()); orderBean.setCharge(fs.getField(index + 4).getString()); orderBean.setNotes(fs.getField(index + 5).getString()); listData.add(orderBean); } else { // 在庫照会データが存在しない break; } } // 次画面が存在する場合は内部的にホスト画面めくりを実施し、
// 次画面の在庫照会データを取得します。
// ↓
// 次画面の確認 try { // 次画面の確認はホスト画面上の23行に文字列”次へ”が
// 存在することで確認します。
// ↓
// 文字列"次へ"を検索 Position pos = new Position(23, 1); fs.getField(pos, "次へ"); } catch (IHASException ihasException) { errorCode = ihasException.getErrorCode(); // 文字列"次へ"が見つからない場合は検索画面へ遷移 if (errorCode == IHASErrorCode.IHASERROR_NOT_FOUND) { // PF2の送信(検索画面へ) fs.submit(Screen.AID_PF2); } else { throw ihasException; } break; } // PF7の送信(次画面へ) fs.submit(Screen.AID_PF7); } // ListBeanへデータ格納 Vector<RecordBean> v = new Vector<RecordBean>(); for (int i = 0; i < listData.size(); i++) { RecordBean orderBean = (RecordBean) listData.get(i); v.add(orderBean); } listBean.setList(v); listBean.setListMsg(listMsg); listBean.setErrorMsg(""); }
ホストに対し[PF8]キーの送信を行います。
/** * PF8キーの送信. * * @throws IHASException IHAS APIの例外 */ public final void sendAidPF8() throws IHASException { // フィールドスナップショットの取得 FieldSnapshot fs = screen.getFieldSnapshot(); // PF8の送信 fs.submit(Screen.AID_PF8); }