投稿

7月, 2013の投稿を表示しています

今年もGeneXusインターナショナルミーティングが開催されます。#GX23

イメージ
今年もGeneXusインターナショナルミーティングがウルグアイにて開催されます。

イベント用Webサイトもオープンしました。



今年は9月30日から10月2日の3日間です。上記Webサイトからミーティング参加の登録、ホテルの予約も行えます。私も先ほど登録しました。



GeneXusで生成されるJOINの種類

イメージ
前回までで「開発者は項目属性名のみ指定する → GeneXusがアクセスするテーブル・JOINする項目を推論する」というお話しをしました。

SQLという観点で「GeneXusってOUTER JOINはできないよね?」という質問をよく受けます。そこで今回はGeneXusでのJOINに関するお話しです。

具体的なJOINの指定方法の前に、まずはGeneXusにおける基本的なJOINの考え方についてです。

1.GeneXusにおけるJOINの考え方
一般的にJOINは以下の種類があります。

内部結合(INNER JOIN)外部結合(LEFT JOIN / RIGHT JOIN / FULL OUTER JOIN)

GeneXusにも外部結合は存在します。但し、ベーステーブル・拡張テーブルの考え方が前提になるため、リレーションの方向に依存します。どういう事でしょうか? 下記のデータモデルを見てください。



ベーステーブルと拡張テーブルの特定方法

イメージ
前回のエントリーで「ベーステーブルと拡張テーブルとは何か?」というお話しをしましたが、今回はGeneXusはどうやってベーステーブルや拡張テーブルを特定するのか?というお話しです。

推論のプロセスとしては
まずGeneXusが出力したデータモデルが前提となります。
そして、開発者が指定した項目属性群をインプットとして、データモデルから拡張テーブルの候補をピックアップします。
それら拡張テーブルの候補の中から、最小セットの拡張テーブルを選択します。


具体的な例で順を追って説明します。(以下のデータモデルを前提とした時)




【News】株式会社クリエティブキャスト主催 3社合同GeneXusセミナーが開催されました

イメージ
株式会社クリエティブキャスト主催  販売店3社合同GeneXusセミナー「GeneXusの?を!に 事例から学ぶGeneXus活用のヒント」が開催されました。



 私も参加してきましたので簡単ではありますが写真も交えてご紹介します。

ベーステーブルと拡張テーブルって何?

イメージ
今回の話はGeneXusを扱うに当たって、一番基本となる考え方です。逆に言うと「ベーステーブルと拡張テーブルって何?」という質問に答えられない人はGeneXusを使っていても理解しているとは言えません。

GeneXusにおいては開発者はアクセスするテーブルを直接指定する事はありません(できません)。指定するのは項目属性名のみで、その項目属性が「どのテーブルに属していて?」「どのテーブルとをJOINする必要があるのか?」はGeneXusが推論します。その推論の基礎となっているのがベーステーブルと拡張テーブルという考え方です。

ベーステーブルとは GeneXusがデータベースにアクセスする時に(実際には生成するSQL文としての)起点となるテーブルの事を指します。

拡張テーブルとは ベーステーブルを起点とした時にアクセス可能な範囲(実際には生成するSQL文としてJOIN可能な範囲のテーブル)を言います。
又、拡張テーブルにはベーステーブルも含まれます。

拡張テーブルかどうかの判断基準はベーステーブルから見て「n→1の関係(リレーション)」のテーブルです。逆にベーステーブルから見て「1→nの関係」は拡張テーブルではありません。


例えば、以下のデータモデルを前提とした時に



GeneXusにおけるロック・排他制御

GeneXusにおいてデータベース更新処理(INSERT/UPDATE/DELETE)が可能なオブジェクトはトランザクションとプロシージャのみです。

データベース更新処理としてはロックと排他が重要な制御になってきますが、GeneXusでの仕様は以下の通りです。

トランザクションオブジェクト1)ロック

書き込み処理の直前にSELECTを実行しますが、その時のモードがLOCKモードになります。( Oracleだとfor update no wait指定/SQLServerだと WITH (UPDLOCK)指定 )もし、ロックが失敗した場合(既に他のユーザーにロックされていた場合)はエラーが返されます。
2)排他制御

トランザクションオブジェクト内で独自の排他制御が実装されています。レコードをLoad時(SELECT時)のデータを全て保持しておき、書き込みの直前のSELECT(上記ロック時)で取得した項目と全項目付け合わせをします。一項目でも差があれば他の誰かが変更を加えたと判断し排他エラーが返ります。= 楽観的排他一般的には更新回数や更新タイムスタンプ項目を設け、その項目を用いた比較で排他制御を実装するのが一般的だと思いますが、GeneXusの場合はトランザクション=テーブルではないのでストラクチャーで定義されている全項目の比較になります。

プロシージャオブジェクト1)ロック

for eachによる更新処理にて、条件項目および更新対象項目がベーステーブルにある場合は、UPDATE/DELETE文が生成されます。for eachによる更新処理にて、条件項目および更新対象項目がベーステーブル以外にもある場合は、SELECT文(条件指定用+ロック用)とUPDATE/DELETE文が生成されます。この場合は、トランザクションと同様にロックモードでのSELECTになります。


2)排他制御

排他制御は盛り込まれていません。アプリケーションの仕様として開発者が実装する必要があります。

悲観的排他が必要な場合は、独自に設計し実装する必要があります。