項目属性名の変更にはご注意を

GeneXus教育をしていてよく見受けられるGeneXusビギナーが陥る操作ミスとして、項目属性名の変更があります。


1.項目属性名の変更方法

項目属性の登録作業はトランザクションオブジェクトでのストラクチャーエディタで項目属性を追加する事ですが、一旦登録した項目属性の名称を変更する時にストラクチャーエディタ上でダイレクトに変更してはいけません。

トランザクションのストラクチャー(Structure)エディタ上で
項目属性名を直接変更してみる



ストラクチャエディタ上で直接項目属性名を変更すると一見名前が変更されたように感じますが、実際には新しい名前の項目属性が登録されます。

CustomerNameをCustomerNmに変更直後の状態
タイプとデスクリプションが初期状態になっている

「表示(V)」メニュー→「項目属性一覧(A)」で項目属性一覧を表示させると、ナレッジベースに登録されている全ての項目属性が一覧できます。(トランザクションオブジェクトを保存するまで項目属性は保存されません)


項目属性一覧画面で確認すると名前を変更したはずの「CustomerName」が存在し、且つ、変更後の「CustomerNm」も存在します。CustomerNmに関してはタイプがNumeric(4.0)、デスクリプションが英名と初期値状態になっています。

ストラクチャーエディタで「直接名前を変更する」行為は見た目上変更しているように見えますが、「GeneXusとしては新しい項目属性を登録する」という操作になります。


それでは項目属性の名前を変更したい場合はどうしたらよいでしょうか?
名前を変更する場合は、プロパティウインドウから変更します。




2.項目属性とトランザクションの関係

ちなみに、項目属性は何処に定義・保持されているのでしょうか?
実はKBの中には項目属性データベースがあり、トランザクションの定義からは独立して存在しているのです。トランザクションストラクチャーはあくまでも参照として項目属性を保持しているに過ぎません。


なぜなら、項目属性が物理的に何処に位置するかは、定義されている全てのトランザクションを分析し、且つ、正規化処理を行った結果として出力されるテーブルオブジェクト=データモデルで初めて明らかになるからです。
たとえ、あるトランザクションからある項目属性が削除されたとしても、それがイコールナレッジベースで不必要になったとは判断出来ないのです。


3.まとめ

項目属性を追加する場合トランザクションオブジェクトのストラクチャーエディタで定義(項目属性一覧からは出来ない)
項目属性名を変更する場合プロパティウインドウにて変更
項目属性を削除する場合項目属性一覧から削除。但し、一つでも他のオブジェクトから参照されている場合は削除できない


4.注意事項


  • トランザクションのストラクチャー上で名称変更すると、新しい項目属性の登録になる
  • トランザクションのストラクチャーから項目属性を削除すると、トランザクションからの参照を削除するのみで、ナレッジベースから項目属性を削除するわけではない



Tips1:項目属性一覧でのフィルタリグ


項目属性一覧ウインドウでのフィルタリングは基本的に前方一致検索です。しかし、語尾に「,」(カンマ)を付加する事で部分一致検索も可能になります。

パターンに「name」と入力したところ。一致する項目属性は無い。

「name」の語尾にカンマを付加したところ。部分一致検索結果となる。


又、同様に通常だと名前(項目属性名=英名)が検索対象ですが、カンマを付加する事でデスクリプションも検索対象になります。

パターンに「名」と入力したところ
項目属性名は日本語名を設定できないので検索結果は0件

「名」の語尾にカンマを付加したところ
デスクリプションも検索対象となり該当データが表示される


※オブジェクト一覧(「表示(V)」メニュー→「オブジェクト一覧(O)」)のフィルタリングも同様の仕様です。



Tips2:項目属性の削除


項目属性をナレッジベースから削除したい場合、トランザクションのストラクチャーで削除するだけでは不十分です。これは上記とおり、項目属性はトランザクションから独立してナレッジベース内で管理されているためです。つまり、トランザクションから項目属性を削除しても、項目属性データベースには残ったままとなります。



項目属性をナレッジベースから物理的に削除したい場合は、「項目属性一覧」ウインドウから削除します。




注意点としては、ナレッジベースは全てのオブジェクト・項目属性のクロスリファレンス(相互参照情報)を持っています。他のオブジェクトからの参照が残っている場合は削除できません。

他のオブジェクトから参照されていると削除できない


どんなオブジェクトから参照されているのか? を調べるには該当する項目属性やオブジェクトを右クリック→「参照」を選択するとリファレンスウインドウが表示され、参照元・参照先の双方が確認できます。




コメント

このブログの人気の投稿

データプロバイダーを使いこなそう - 応用編その4 スケジューラー 補足編

HTMLヘッダーにあれこれ直接追加したいとき

GeneXusにおけるWebアプリケーションセキュリティ対策 - OWASP 2010 Top10 Security Risks in GeneXus Applications