開発Blog

データベースの登録、更新、削除メソッドをカスタマイズする

投稿日:


※下記内容は、過去のintra-mart(Ver4.3以前)に関する内容です。
最新のintra-martでは、異なる情報であることがありますので、ご注意ください。


データベースを操作するプログラムを作る際に意外と知られていないのが、フレームワークの API,Module.databaseを使ったときにどのようなSQLが実際作られているのかという点です。 Module.database.selectの場合は直接SELECT文を引数に渡すので気にならないのですが、Module.databaseオブ ジェクトの、insert,update,removeメソッドの場合はどうでしょう?Module.databaseオブジェクトの、 insert,update,removeメソッドによって生成されるSQL文を変更する方法を記述します。

以下、Module.database.insertメソッドを例に説明をしていきますが、update,removeメソッドについても同様です。まず、何もカスタマイズしていない状態での動作について説明します。

Module.database.insertメソッドが実行されるとInformationサーバ/unit/library /im_default_sql.js ファイルに記述されているgetSqlForDatabaseInsert関数が呼び出されます。
この関数が、実際にSQL文を生成している部分になります。
(このような関数を、以下、SQL生成ロジックと呼びます。)
ここで作成されたSQL文が、そのままデータベースへ渡されます。

例)//ファンクションコンテナ内
var objIns = new Object();
objIns.clm_1 = "カラム1";
Module.database.insert("test_tbl",objIns,"DEFAULT");*** DBへ渡されるSQL文 ***
insert into test_tbl (clm_1) values('カラム1')

このgetSqlForDatabaseInsert関数は、以下の手順でシステムに登録されています。

1.Applicationサーバの起動
2.Informationサーバ/init.jsの実行
3.Informationサーバ/unit/library/init.jsの実行
4.Informationサーバ/unit/library/im_default_sql.jsの読み込み
5.Informationサーバ/unit/library/im_default_sql.jsファイルの先頭に記述してある

Module.database.setInsertSQLメソッドにより、同ファイル内のgetSqlForDatabaseInsert関数がシステ ムに登録される。
(Module.database.setInsertSQLメソッドについてはAPIリストを参照して下さい。) 
データベースや、そのデータベースでのデータ型によっては、デフォルトで生成されるSQL文ではまずい場合もあります。そのときは、以下の方法でデフォル トの動作を変更することができます。

1)Informationサーバ/unit/library/im_default_sql.jsファイルを直接編集する方法Information サーバ/unit/library/im_default_sql.jsファイルのgetSqlForDatabaseInsert関数を直接編集して下 さい。その際、引数と戻り値は変更することはできません。
編集後、Applicationサーバの再起動が必要です。 

2)自作の関数を登録する方法
Informationサーバ/unit/library/im_default_sql.jsファイルを参考に、新しくファイルを作成して下さい。 Module.database.setInsertSQLメソッドは、Module.database.setInsertSQLメソッドが記述されて いるファイルと同じファイル中にある関数しか登録できませんので、必ずModule.database.setInsertSQLメソッド
とSQL生成ロジックは同じファイルに記述して下さい。
出来上がったファイルは、includeメソッドを利用して読み込んで下さい。
読み込む場所、タイミングに制約はありません。(Informationサーバ/init.jsにincludeメソッドを追記して Applicationサーバ起動時に読み込むようにしなければならないということはありません。)

例)
//SQL生成ロジックの登録
Module.database.setInsertSQL(getSqlForDatabaseInsert);//SQL生成ロジック定義
function getSqlForDatabaseInsert{
}SQL生成ロジックの引数は、Module.database.insertメソッドに渡された引数がそのまま渡されます。
※SQL生成ロジックの引数
//=============================================================================
// データベース更新アクセス INSERT 文構築関数
// 【 入力 】sTable: 挿入表名
// oValue: 挿入データ(オブジェクト)
// sName : 接続参照名称
// 【返却値】INSERT 文(文字列)
// 【 備考 】第2引数はオブジェクト形式です。
// プロパティ名 = カラム名
// そのプロパティ名の中のデータが挿入データになっています。
//=============================================================================
function getSqlForDatabaseInsert(sTable, oValue, sName) {SQL文生成処理return SQL文
} 
注意点
・SQL生成ロジック中でDebug.browseメソッドを使用することはできません。デバッグには、Debug.printメソッドなどを使用して下 さい。
・SQL生成ロジックの引数と戻り値は変更することはできません。 
また、接続するデータベースごとにSQL生成ロジックを変更することも可能です。

1)SQL生成ロジックの引数を利用する方法
SQL生成ロジックの最後の引数にDB接続参照名が渡されるので、SQL生成ロジック内で、DB接続参照名ごとに処理を分岐させることができます。

2)Module.database.setInsertSQLメソッドを利用する方法
SQL生成ロジックを登録する際、Module.database.setInsertSQLメソッドの第二引数にDB接続参照名を指定しておくと、指定 したDB接続参照名を持つDBに対してModule.database.insertメソッドを発行したとき、そのSQL生成ロジックが実行されます。 
実際に生成されたSQL文の確認方法としては、Applicationサーバの設定ファイルimart.iniでデータベースログ出力を ON(LOG_DATABASE=ON)にすると、データベースログファイルに、実際に出力された
SQL文が書き込まれますので、それによって確認することができます。

-開発Blog
-

執筆者:

関連記事

no image

多言語対応について

最近、日英中以外の言語を増やしたいというお問い合わせを受けることが多くなってきましたので、その方法等をまとめさせて頂きます。 intra-martにおける多言語対応とは? intra-mart Ver …

no image

Formaでのスクリプト開発生産性向上

先日開催されました技術者交流会にて、クライアントサイドスクリプトを利用したFormaDesignerの画面開発が難しいという声を多くいただきました。 そこで、今回のブログ記事では、交流会の場で挙がった …

no image

トラブル時の現状把握に必要な情報

※下記内容は、過去のintra-mart(Ver4.3以前)に関する内容です。 最新のintra-martでは、異なる情報であることがありますので、ご注意ください。 大規模システムが増加するに従い、弊 …

no image

Forma関数で条件式を書く

IM-FormaDesignerの画面アイテム「関数」を利用して式を記述できますが、まもなくリリース予定のパッチ2よりAND演算・OR演算の論理演算関数や比較演算子を使えるようになります。 これにより …

no image

EWS2017 「業務への適用イメージがすぐに湧く!  魔法の業務ロジック作成ツール『IM-LogicDesigner』実用例 10本勝負!」講演内容のご紹介

この記事では、EWS2017 Technology Track「業務への適用イメージがすぐに湧く!  魔法の業務ロジック作成ツール『IM-LogicDesigner』実用例 10本勝負!」での講演内容 …