2.3.4 ユーザ追加処理のカスタマイズ

審査業務ステップ内の審査作業(承認業務ステップの一つ前の作業)で帳票の[承認]ボタンをクリックしたときに,BLC_INBOX_TのNMITEM2カラムに提供価格の合計が設定されるようにします。

ユーザ追加処理をカスタマイズする手順を次に示します。

参考
カスタマイズ前の「販売契約稟議EUR」では,BLC_INBOX_TのNMITEM1カラムには,[相談]ボタンをクリックしたときに相談元が格納されるようになっています。
<この項の構成>
(1) ファイルのコピーとオープン
(2) ユーザ定義クラスのクラス名とコンストラクタ名の変更
(3) 提供価格の合計を設定するタイミングの決定
(4) メソッドのカスタマイズ(XMLから取得する方法)
(5) メソッドのカスタマイズ(EURFormのgetvalueメソッドから取得する方法)

(1) ファイルのコピーとオープン

カスタマイズの作業では,SampleConsultationEUR_1_userServerSideClass.javaを直接編集するのではなく,SampleConsultationEUR_1_userServerSideClass.javaをコピーして名称を変更し,このファイルを編集していきます。

ファイルのコピーからオープンまでの手順を次に示します。

操作手順

  1. 次のフォルダにあるSampleConsultationEUR_1_userServerSideClass.javaをコピーし,任意のフォルダに保存します。
    <BLSGのインストールディレクトリ>¥data¥usersource
  2. コピーしたファイルの名称を「Custom_SampleConsultationEUR_1_userServerSideClass.java」に変更します。
  3. EclipseなどでCustom_SampleConsultationEUR_1_userServerSideClass.javaを開きます。
    Custom_SampleConsultationEUR_1_userServerSideClass.javaを編集できるようになります。

(2) ユーザ定義クラスのクラス名とコンストラクタ名の変更

クラス名とコンストラクタ名を変更する手順を次に示します。

操作手順

  1. クラス名とコンストラクタ名を次のように「Custom_SampleConsultationEUR_1_userServerSideClass」に変更します。

    //サンプルソース(ご参考)
    public class Custom_SampleConsultationEUR_1_userServerSideClass extends SampleConsultationEUR_1_Class {

     //コンストラクタ
     public Custom_SampleConsultationEUR_1_userServerSideClass(){
     }
    ・・・

    太字部分が,変更部分です。
  2. 変更内容を保存します。

(3) 提供価格の合計を設定するタイミングの決定

ユーザ定義クラス(Custom_SampleConsultationEUR_1_userServerSideClass)は,帳票クラス(SampleConsultationEUR_1_Class)を継承して,BLCEURFormBaseクラスのメソッドをオーバーライドしています。このため,BLCEURFormBaseクラスのどのメソッドを使用するかを決定することで,提供価格の合計を設定するタイミングを決定します。

ここではボタンをクリックしたタイミングで処理を実行させたいため,ufsv_addEURButtonPreparation(ボタンDB更新前処理)メソッドを使用します。

参考
  • 帳票クラスは,「帳票の生成」時,BLSGによって生成されます。「SampleConsultationEUR_1_Class」は,マニュアル「uCosminexus 電子フォームワークフロー システム構築ガイド」に従って作成したときに,BLSGが生成した帳票クラスです。
  • 帳票クラス名(SampleConsultationEUR_1_Class)は,BLSGで帳票定義を作成する際に設定する帳票IDから決定されます。
    このため,「帳票の生成」時,帳票IDを変更(帳票定義を新たに作成するなど)し,ユーザ追加処理として,「Custom_SampleConsultationEUR_1_userServerSideClass」を使用する設定をした場合,「Custom_SampleConsultationEUR_1_userServerSideClass」が継承する帳票クラスを「SampleConsultationEUR_1_Class」から変更したあとの帳票クラスに変更する必要があります。
    帳票IDと帳票クラス名の対応を次に示します。

    図2-9 帳票IDと帳票クラス名の対応

    [図データ]

(4) メソッドのカスタマイズ(XMLから取得する方法)

ufsv_addEURButtonPreparation(ボタンDB更新前処理)メソッドを次のようにカスタマイズします。

if("審査-審査".equals(befpi.getInfo(befpi.BEF_NODENAME)) && "ID_WICOMPLETE".equals(befpi.getInfo(befpi.BEF_ACCEPTID))){
         //フォームデータの取得
         String l_strFormData = befpi.getInfo(befpi.BEF_EURFORMDATA);
         
         //DOMオブジェクトの生成
         DocumentBuilderFactory l_dbfObj = null;
         DocumentBuilder l_dbObj = null;
       
         StringReader l_srReader = null;
         InputSource l_isSource = null;
       
         Document l_doc = null;
       
         l_srReader = new StringReader(l_strFormData);
         l_isSource = new InputSource((Reader)l_srReader);
       
         l_dbfObj = DocumentBuilderFactory.newInstance();
         l_dbObj = l_dbfObj.newDocumentBuilder();
         l_doc =l_dbObj.parse(l_isSource);

         //提供価格の取得
         NodeList l_nodeList = null;
         Node l_nodeWork = null;
         Node l_nodeChildWork = null;
       
         String l_str = null;
       
         // 指定されたメンバ名(タグ名)のノードリストを取得
         l_nodeList = l_doc.getElementsByTagName("提供合計");
       
         if(l_nodeList.getLength() == 1){
             // 1個存在した場合
             l_nodeWork = l_nodeList.item(0);
           
             // 子ノードを取得
             l_nodeChildWork = l_nodeWork.getFirstChild();
           
             if(l_nodeChildWork != null &&
                 l_nodeChildWork.getNodeType() == Node.TEXT_NODE){
                 // 子ノードが存在,かつノード種別がTextの場合
                 l_str = l_nodeChildWork.getNodeValue();
             }
         }else{
             // 存在しない or 複数存在
             // error
         }

         
         befpi.setInfo(befpi.BEF_ATTRNUM,"2");
         befpi.setInfo(befpi.BEF_ATTRDATA+"2",l_str);
}

なお,コンパイルを通すには,次のパッケージをインポートする必要があります。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

ufsv_addEURButtonPreparationメソッドのカスタマイズの詳細を以降で説明します。

(a) 提供価格の合計を設定する条件の決定

(3)で決定したメソッド(ボタンをクリックしたタイミングで呼ばれるメソッド)に,審査作業の[承認]ボタンがクリックされたときに提供価格の合計をデータベースに追加するよう,条件文を設定します。条件判定には,BLCEURFormProcessInfoクラス(SampleConsultationEUR_1_Class.javaでの変数名は「befpi」)のgetInfoメソッドを使用します。

条件文の設定内容を次に示します。

カスタマイズの内容を次に示します。

if("審査-審査".equals(befpi.getInfo(befpi.BEF_NODENAME))
&& "ID_WICOMPLETE".equals(befpi.getInfo(befpi.BEF_ACCEPTID))){
}

(b) 提供価格の合計の取得

提供価格の合計の取得は,次の三つの部分に分かれます。

それぞれについて説明します。

フォームデータの取得
フォームデータを取得するには,BLCEURFormProcessInfoクラス(SampleConsultationEUR_1_Class.javaでの変数名はbefpi)のgetInfoメソッドを使用します。
getInfoメソッドの引数にbefpi.BEF_EURFORMDATAを指定して,フォームデータを取得できるようにします。フォームデータには送信ユニットを文字列化したデータが格納されています。
カスタマイズの内容を次に示します。

String l_strFormData = befpi.getInfo(befpi.BEF_EURFORMDATA);

DOMオブジェクトの生成
フォームデータからDOMオブジェクトを生成します。
カスタマイズの内容を次に示します。

//DOMオブジェクトの生成
DocumentBuilderFactory l_dbfObj = null;
DocumentBuilder l_dbObj = null;
       
StringReader l_srReader = null;
InputSource l_isSource = null;
     
Document l_doc = null;
     
l_srReader = new StringReader(l_strFormData);
l_isSource = new InputSource((Reader)l_srReader);
       
l_dbfObj = DocumentBuilderFactory.newInstance();
l_dbObj = l_dbfObj.newDocumentBuilder();
l_doc =l_dbObj.parse(l_isSource);

提供価格の合計の取得
DOMオブジェクトから提供価格の合計を取得するには,getElementsByTagNameメソッドの引数にタグ名を指定します。指定するタグ名は,帳票作成時に指定したメンバ名になります。
帳票作成時に指定したメンバ名を次に示します。

図2-10 帳票作成時に指定したメンバ名

[図データ]
ここでは,「提供合計」をgetElementsByTagNameメソッドの引数に指定します。
カスタマイズの内容を次に示します。

//提供価格の取得
NodeList l_nodeList = null;
Node l_nodeWork = null;
Node l_nodeChildWork = null;

String l_str = null;

// 指定されたメンバ名(タグ名)のノードリストを取得
l_nodeList = l_doc.getElementsByTagName("提供合計");

if(l_nodeList.getLength() == 1){
   // 1個存在した場合
   l_nodeWork = l_nodeList.item(0);
  // 子ノードを取得
   l_nodeChildWork = l_nodeWork.getFirstChild();

   if(l_nodeChildWork != null &&
       l_nodeChildWork.getNodeType() == Node.TEXT_NODE){
         // 子ノードが存在,かつノード種別がTextの場合
         l_str = l_nodeChildWork.getNodeValue();
   }
}else{
   // 存在しない or 複数存在
   // error
}

(c) BLC_INBOX_TのNMITEM2カラムへの設定

提供価格の合計をNMITEM2カラムへ設定するには,BLCEURFormProcessInfoクラス(SampleConsultationEUR_1_Class.javaでの変数名はbefpi)のsetInfoメソッドを使用します。

カスタマイズの内容を次に示します。

befpi.setInfo(befpi.BEF_ATTRNUM,"2");
befpi.setInfo(befpi.BEF_ATTRDATA+"2",l_str);

(5) メソッドのカスタマイズ(EURFormのgetvalueメソッドから取得する方法)

ufsv_addEURButtonPreparation(ボタンDB更新前処理)メソッドを次のようにカスタマイズします。

if("審査-審査".equals(befpi.getInfo(BLCEURFormProcessInfo.BEF_NODENAME)) && "ID_WICOMPLETE".equals(befpi.getInfo(BLCEURFormProcessInfo.BEF_ACCEPTID))){

     // EFormModelオブジェクトを取得
     EFormModel efModel = befpi.getEFormModel();
     // EFormModelInstanceオブジェクトを生成
     EFormModelInstance efModelinst = efModel.getModelInstance();

     // 提供合計を取得
     String l_str = efModelinst.getValue("root/提供合計");

     befpi.setInfo(BLCEURFormProcessInfo.BEF_ATTRNUM,"2");
     befpi.setInfo(BLCEURFormProcessInfo.BEF_ATTRDATA+"2",l_str);

}

なお,コンパイルを通すには,次のパッケージをインポートする必要があります。

import jp.co.Hitachi.soft.EURForm.EFormModel;
import jp.co.Hitachi.soft.EURForm.EFormModelInstance;

ufsv_addEURButtonPreparationメソッドのカスタマイズの詳細を以降で説明します。

(a) 提供価格の合計を設定する条件の決定

(4) メソッドのカスタマイズ (XMLから取得する方法)」の「(a) 提供価格の合計を設定する条件の決定」を参照してください。

(b) 提供価格の合計の取得

提供価格の合計の取得は,次の二つの部分に分かれます。

それぞれについて説明します。

EFormModelInstanceオブジェクトの生成
EformModelInstanceオブジェクトを生成するには,BLCEURFormProcessInfoクラス(SampleConsultationEUR_1_Class.javaでの変数名はbefpi)のgetEFormModelメソッドから取得した,EFormModelオブジェクトのgetModelInstanceメソッドを使用します。
カスタマイズの内容を次に示します。

EFormModel efModel = befpi.getEFormModel();
EFormModelInstance efModelinst = efModel.getModelInstance();

提供価格の合計の取得
EformModelInstanceオブジェクトから提供価格の合計を取得するには,getValueメソッドの引数にメンバパスを指定します。指定するメンバパスは,帳票作成時に指定したメンバパスになります。
帳票作成時に指定したメンバパスを次に示します。

図2-11 帳票作成時に指定したメンバパス

[図データ]
ここでは,「root/提供合計」をgetValueメソッドの引数に指定します。
カスタマイズの内容を次に示します。

String l_str = efModelinst.getValue("root/提供合計");

(c) BLC_INBOX_TのNMITEM2カラムへの設定

(4) メソッドのカスタマイズ (XMLから取得する方法)」の「(c) BLC_INBOX_TのNMITEM2カラムへの設定」を参照してください。