スクリプトを用いた主キーの拡張

最終更新日: 2022年11月10日
R8 | R9

レポートモデル内の「ステータス」項目によって、次のルールが適用されるものとします。

新規顧客
N2111001 (1桁目:N, 2〜5桁目:年月, 6〜8桁目:001...999連番)
既存顧客
E2111001 (1桁目:W, 2〜5桁目:年月, 6〜8桁目:001...999連番)

このように、区分毎に連番を用意します。

図1に新規顧客のレポート登録を、図2に既存顧客のレポート登録の例を示します。いずれも連番は001となっており、独立して管理されます。

ステータス「新規」選択時の主キー値
ステータス「既存」選択時の主キー値

定義方法

  1. 「レポート」モデルを用意します。定義は次の通りです。
    主キー項目「ID」は文字列型とします。
    レポートモデル
  2. 主キー項目「ID」の、主キーの詳細設定はクリアします。
    主キーの詳細設定を行わない
  3. 「ID」項目は入力画面では隠し項目・読込専用項目とします。
    これによって主キーですが入力なし(自動設定)を実現できます。
    隠し項目・読込専用の設定
  4. 「ステータス」モデルの初期値を次の通り定義します。「新規」はID 1を、「既存」はID 2をそれぞれ割り当てます。
    ステータスモデルの初期値

順序を定義する

区分毎の連番を用意するため、Wagbyが用意した順序テーブル "seq" に独自の順序 "report_seq1" と "report_seq2" を登録します。それぞれ開始番号を "1" とします。

  1. 独自の DDL を発行するために、$(DEVHOME)/customize/webapp/WEB-INF/export/conf/initdb_ex.xml を用意します。(図7)
    ※exportフォルダならびに export/conf フォルダは手動で作成してください。
    initdb_ex.xmlを新規作成する
  2. initdb_ex.xmlの内容は次の通り記述します。
    initdb_ex.xmlの内容
    <?xml version="1.0" encoding="UTF-8"?>
              <sql group="data"
                    acceptcommand="sql sql-create-after" denycommand="all"
                    tablename="seq">
                INSERT INTO &quot;seq&quot; VALUES('report_seq1',1);
                INSERT INTO &quot;seq&quot; VALUES('report_seq2',1);
              </sql>
            

    ビルド後は以下に配置されます。(*1)
    wagbyapp/webapps/wagby/WEB-INF/export/conf/initdb_ex.xml

    ここでは順序テーブル "seq" を使いましたが、お使いのデータベースが順序の仕組みをもっている場合、CREATE SEQUENCE で順序を作成するとよいでしょう。(Oracle, PostgreSQL, SQL Server 2012 は順序を提供しています。)

    ワンポイント

    このようにinitdb_ex.xmlは、sql要素中に独自のDDLを記述することができます。Wagbyによるデータベース作成時に、順序やビューの作成など、独自のDDLを発行できます。[関連ページ:インポートとエクスポート機能活用ガイド(R9) > 設定ファイル > 拡張ファイル initdb_ex.xml]

    注意

    テーブル名を囲むダブルクォートの有無などは、ご利用になるデータベースによって異なります。

スクリプトを実装する

「画面 > スクリプト」を開きます。新規登録時のスクリプトコードを作成します。
これは新規登録処理の最後に呼び出されますので、主キーの値をセットするのに都合のよいポイントです。

主キー生成のためのコード

    var CommonService = Java.type("jp.jasminesoft.jfc.app.CommonService");

    var seq;
    var prefix;
    print(report);
    if (report.status == 1) {    
        /* 順序の使い分け */
        /* CommonServiceはWagbyが提供するクラス */
        /* p はWagbyが提供するオブジェクト */
        seq = CommonService.getSeq(p, "report_seq1");
        prefix = "N";
    } else if (report.status == 2) {
        seq = CommonService.getSeq(p, "report_seq2");
        prefix = "E";
    }
    /* デバッグ用 print("seq="+seq+",prefix="+prefix);*/
    var pkey = prefix;
    /* new Date() は JavaScript のオブジェクトを利用 */
    var today = new Date();
    /* String() は JavaScript のオブジェクトを利用 */
    var year = String(today.getFullYear());
    var month = String(today.getMonth()+1);
    /* ExcelFunctionはWagbyが提供するクラス */
    /* ゼロ詰めにし、年部分の右2桁を取得する */
    pkey = pkey + ExcelFunction.RIGHT(ExcelFunction.PADDING("0",2,year),2);
    /* ゼロ詰めにし、月部分の右2桁を取得する */
    pkey = pkey + ExcelFunction.RIGHT(ExcelFunction.PADDING("0",2,month),2);
    /* ゼロ詰めにし、順序部分の右3桁を取得する */
    pkey = pkey + ExcelFunction.RIGHT(ExcelFunction.PADDING("0",3,String(seq)),3);
    /* reportモデルのreportid項目が文字列型の主キー */
    print("pkey="+pkey);
    report.reportid = pkey;
  
  • RIGHT 関数は、文字列の右からN桁までを取り出します。
  • PADDING 関数は、文字列に指定文字を詰めて、切り出します。
CREATE SEQUENCE で順序を作成した場合、CommonService.getSeq ではなく CommonService.getSequence を使ってください。