昨年の投稿で「Google Chromeを業務用Webアプリケーションプラットフォームとして使用するためのTips」というエントリーを書きました。当ブログ内でのアクセスランキングでも人気投稿になっています。
実際にChromeを使ってみた結果としては、いい事ばかりではありませんでした。このブログでエントリーを書いた責任として、事の顛末もちゃんと記しておきたいと思います。
Google Chromeを業務システム用プラットフォームとして使った場合の問題点・困った事としては以下の様な事がありました。
ツールが全ての問題を解決してくれるわけではない。 でも、ツールは本来人がやらなくても良い作業を効率的に行ってくれる。 そして、人は人にしかできない事により注力すべき。 つまり、それがクリエイティビティ(創造性)。 システム開発におけるクリエイティビティを高めるお手伝いをしています。
2014年2月21日金曜日
2013年8月28日水曜日
オプションに関するTips
2013年6月13日木曜日
データベーステーブル作成・再編成にてよく使うオプション
データベーステーブル作成およびデータベース再編成処理時によく使うオプション(プロパティの設定)をご紹介します。
概要
データストアプロパティにある「Declare referential integrity」プロパティはデータベースに参照整合性(DBMSの制約)を作成する/しないの指定が可能です。
設定値
備考
例えば、プロパティをYes→Noに変更し、データベーステーブルの作成を行った場合、再編成プログラムはテーブルをDrop→Createしますが、参照整合性が既にあるとテーブルをDropできません。この場合は、Yes→Removeを選択する事により、既存の参照整合性も削除されます。
出典 : http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Declare+Referential+Integrity+Property,
概要
データストアプロパティにある「Generate comment on statements」プロパティはテーブル及びカラムのコメント作成を指定できます。
設定値
例
出典 : http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Generate+COMMENT+ON+Statements+Property,
概要
「Enable national language support」プロパティは文字列データ型(Char/VarChar)でのマルチバイト対応が指定できます。
バージョンによってプロパティの場所が違います。
設定値
備考
Noを指定してもマルチバイトキャラクターは保存可能です。但し、DB上は桁数=バイト数、画面上は桁数=文字数と異なるため、画面上では入力可能な桁数の文字列がデータベース保存時に桁あふれでエラーとなる場合が出てきます。
どちらの設定を選択するかは設計ポリシーに依存します。但し、バージョン・項目属性・ドメインの各レベルで指定可能なので、全体指定と個別指定が可能です。
例) 全体指定はマルチバイト対応とし、個別にマルチバイト非対応とする。(バージョンプロパティではYes、必要に応じて任意の項目属性またはドメインプロパティではNoとする)
エボリューション2アップグレード3からはプロパティ値変更時、データベース再編成対象になります。それより前のバージョンでは、プロパティ値を変更しただけではデータベース再編成対象になりません。データベーステープルを再作成して下さい。
出典 : http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Enable+National+Language+Support+Property,
1.Declare referential integrity
対象- 言語 : .NET、Java、Ruby
- DBMS: SQLServer,Oracle,PostgreSQL,MySQL, DB2 UDB for iSeries,iSeries native, Informix
概要
データストアプロパティにある「Declare referential integrity」プロパティはデータベースに参照整合性(DBMSの制約)を作成する/しないの指定が可能です。
![]() |
| データストアプロパティ |
設定値
- Yes(既定値) :参照整合性が作成されます。(データベーステーブル作成、再編成時)
- No : 参照整合性は作成されません。(データベーステーブル作成、再編成時)
- Remove :参照整合性は作成されません。(データベーステーブル作成、再編成時) 但し、既に参照整合性がある場合は削除されます。
備考
例えば、プロパティをYes→Noに変更し、データベーステーブルの作成を行った場合、再編成プログラムはテーブルをDrop→Createしますが、参照整合性が既にあるとテーブルをDropできません。この場合は、Yes→Removeを選択する事により、既存の参照整合性も削除されます。
出典 : http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Declare+Referential+Integrity+Property,
2.Generate comment on statements
対象- インターフェイス : Web
- DBMS: Oracle,DB2 UDB,DB2 for iSeries,PostgreSQL(エボリューション1以降)
概要
データストアプロパティにある「Generate comment on statements」プロパティはテーブル及びカラムのコメント作成を指定できます。
設定値
- Yes : COMMENTステートメントを生成します。(データベーステーブル作成、再編成時)
- No(既定値) : COMMENTステートメントを生成しません。(データベーステーブル作成、再編成時)
例
CREATE TABLE TestPropGenCom (TestCod smallint NOT NULL , TestDesc CHAR(50) NOT NULL , PRIMARY KEY(TestCod))
COMMENT ON TABLE TestPropGenCom IS 'Test property Generate comments on'
COMMENT ON COLUMN TestPropGenCom.TestCod IS 'Test Code'
COMMENT ON COLUMN TestPropGenCom.TestDesc IS 'Test Description'
出典 : http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Generate+COMMENT+ON+Statements+Property,
3.Enable national language support
対象- 言語 : .NET、Java、Ruby
- DBMS: SQLServer,Oracle,MySQL, DB2 UDB,DB2 for iSeries,
概要
「Enable national language support」プロパティは文字列データ型(Char/VarChar)でのマルチバイト対応が指定できます。
バージョンによってプロパティの場所が違います。
- バージョンXはデータストアプロパティ
- エボリューション1以降はバージョン、項目属性、ドメインプロパティ
![]() |
| バージョンプロパティ |
設定値
- Yes:マルチバイトキャラクター対応(Char/VarCharの桁数=文字数)
- No(既定値):マルチバイトキャラクター非対応(Char/VarCharの桁数=バイト数)
備考
Noを指定してもマルチバイトキャラクターは保存可能です。但し、DB上は桁数=バイト数、画面上は桁数=文字数と異なるため、画面上では入力可能な桁数の文字列がデータベース保存時に桁あふれでエラーとなる場合が出てきます。
どちらの設定を選択するかは設計ポリシーに依存します。但し、バージョン・項目属性・ドメインの各レベルで指定可能なので、全体指定と個別指定が可能です。
例) 全体指定はマルチバイト対応とし、個別にマルチバイト非対応とする。(バージョンプロパティではYes、必要に応じて任意の項目属性またはドメインプロパティではNoとする)
エボリューション2アップグレード3からはプロパティ値変更時、データベース再編成対象になります。それより前のバージョンでは、プロパティ値を変更しただけではデータベース再編成対象になりません。データベーステープルを再作成して下さい。
出典 : http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Enable+National+Language+Support+Property,
2013年6月3日月曜日
Google Chromeを業務用Webアプリケーションプラットフォームとして使用するためのTips
直接GeneXusのTipsではありませんが、Google ChromeをWebアプリケーションプラットフオームとして使用する場合に考慮したい事が何点かあります。
- 当該Webアプリケーション起動(表示)した時に必ずChromeとする。又、ブラウザのディフォルト起動設定を変更しない。
- アドレスバーやタブを表示させない
- 自動アップデートを禁止にする
2013年5月29日水曜日
Webアプリケーションでのキーボード制御系Tips
通常のWebアプリケーションだとあまりニーズはありませんが、業務系Webアプリケーション、特に旧来のホスト系やC/S(クライアント/サーバー)系システムからWebアプリへの移行だと(あるいはそういったシステムを使いなれた人達からのリクエストでは)レガシーなキーボード制御を要求される場合があります。GeneXusでの対応可・不可も含めて紹介します。
GeneXusにはジェネレーターのプロパティに「Field exit」プロパティがあり、以下が選択できます。
1.Enterキーでフォーカス移動したい
HTMLの標準ではEnterキーはFormのSubmitつまりサーバーへのデータ送信です。しかし、ホスト・C/S系だと(特にテンキーを使って操作する場合は)Enterキーでフォーカス移動が主流です。GeneXusにはジェネレーターのプロパティに「Field exit」プロパティがあり、以下が選択できます。
2013年5月9日木曜日
64bit版Windowsで.NET Webアプリケーションを実行する時の注意事項
正確にはGeneXusのTipsではありませんが、最近も問い合わせをもらう事が多かったのでブログに書いておきます。
GeneXusでC#ジェネレーターを使用する場合は、生成されるWebアプリケーションはASP.NETとなり、実行環境はIISとなります。
この時、OSが64bit版Windowsを使用している場合、32bit用ワーカープロセスの設定を行わないとアプリケーションを実行する事ができません。これはGeneXusが生成するのが32bitアプリケーションのためです。
切り替える為のコマンドは以下の通りです。
IIS管理コンソール→アプリケーションプール→「Classic .NET AppPool」→詳細設定にて、「32ビットアプリケーションの有効化」をTrueに変更します。
GeneXusでC#ジェネレーターを使用する場合は、生成されるWebアプリケーションはASP.NETとなり、実行環境はIISとなります。
この時、OSが64bit版Windowsを使用している場合、32bit用ワーカープロセスの設定を行わないとアプリケーションを実行する事ができません。これはGeneXusが生成するのが32bitアプリケーションのためです。
1.IIS6の設定
IIS6では32bit/64bitのどちらかでしか動作できません切り替える為のコマンドは以下の通りです。
cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1
※1.パラメター値:1が32bit/0が64bit指定
2.IIS7の設定
IIS7はアプリケーションプール毎に32bitの有効/無効の指定が可能です。IIS管理コンソール→アプリケーションプール→「Classic .NET AppPool」→詳細設定にて、「32ビットアプリケーションの有効化」をTrueに変更します。
2013年4月30日火曜日
変数を条件に指定するローカル式に注意
前回はFor eachコマンド+ローカル式を使うシーンにて二つのベーステーブル間にリレーションが有る無しで生成結果が違ってくる事を書きました。今回はリレーションが無いデータモデルでの別な注意点についてです。
テーブル間にGeneXusが認識するリレーションが無いデータモデルで、ローカル式の条件に変数を利用する場合として以下の様な記述が考えられます。(基本は明示的に条件を指定する事です)
一見問題なさそうに見えますが、実際には国別の顧客数はカウントされず、カウントの結果は全て0件になります。(CountryテーブルにCountryId=0のレコードが無い場合)
何故でしょうか?
テーブル間にGeneXusが認識するリレーションが無いデータモデルで、ローカル式の条件に変数を利用する場合として以下の様な記述が考えられます。(基本は明示的に条件を指定する事です)
For each
&CountryId = CountryId
&CountryName = CountryName
&CustomerCount = Count( CustomerName,
CustomerCountryId = &CountryId )
Endfor
一見問題なさそうに見えますが、実際には国別の顧客数はカウントされず、カウントの結果は全て0件になります。(CountryテーブルにCountryId=0のレコードが無い場合)
何故でしょうか?
2013年4月25日木曜日
For eachの中のローカル式
For eachの中にローカル式を記述する時、For eachのベーステーブルとローカル式のベーステーブル間にリレーションが無い場合は注意が必要です。
例) 国別に顧客数をカウント
1.リレーションがある場合
1-1.データモデル国マスタと顧客マスタで1対nのリレーションがあるモデルです。
![]() |
| Country(国)トランザクションの定義 |
![]() |
| Customer(顧客)トランザクションの定義 項目属性名の先頭にあるアイコンが上矢印になっています。 これは外部キー項目である事を表しています。 |
2013年4月15日月曜日
記述量を減らし変化に対応しやすくする
プロシージャで記述する時、GeneXusの特性を知っているとコード量も減り、変化にも対応し易くなる事があります。
例えば、あるテーブルから特定のレコードを抽出し、その値を元に新たなレコードを追加したい場合、SQLではSELECTとINSERTを組み合わせます。
例えば、あるテーブルから特定のレコードを抽出し、その値を元に新たなレコードを追加したい場合、SQLではSELECTとINSERTを組み合わせます。
INSERT INTO TABLE_A (COLMUN1,COLMUN2,COLMUN3,COLMUN4....)
SELECT 'KeyValue',COLMUN2,COLMUN3,’NewValue'....
FROM TABLE_A WHERE COLMUNn = 'xxxxx';
2013年4月12日金曜日
テーブルの項目の並び順を変更するには?
物理テーブル上の項目属性の並び順は、GeneXus IDE上では変更する事が出来ません。GeneXusは物理的な項目の並びを意識しない思想なので、項目を追加した場合は物理テーブルの最後尾カラムとして追加されます。
とはいえ、データ移行やテーブルの直接メンテナンスなど、人が目で見てデータを操作する場合は、論理的な並び順に準拠して欲しいものです。
![]() |
| トランザクションとテーブルオブジェクトの比較。 後から追加した「CustomerPhoto(顧客写真)」がトランザクションでは顧客TELの前に位置しているが テーブルオブジェクトではカラムの最後尾に追加されている。 |
項目の並び順をトランザクションと揃えたい場合(論理的な並び順に変更したい場合)は以下の方法を使います。
2013年4月1日月曜日
サーバー上のファイルをダウンロードさせる方法
これは以前書きました「PDFをダウンロードさせる方法」の応用編です。
PDFをブラウザ表示ではなくファイルダウンロードさせたい場合、PDFを作成する機能=PDFプロシージャを実装し、ダウンロードさせるための記述を追加する事により実現しました。ダウンロードさせたいファイルがサーバー上に既にある場合はどうしたらよいでしょうか?
PDFをブラウザ表示ではなくファイルダウンロードさせたい場合、PDFを作成する機能=PDFプロシージャを実装し、ダウンロードさせるための記述を追加する事により実現しました。ダウンロードさせたいファイルがサーバー上に既にある場合はどうしたらよいでしょうか?
2013年3月29日金曜日
エラー(Exception)のハンドリング方法 Webアプリ(Java)編
GeneXusではデータベースI/O時の予期せぬエラー(SQLException)はError_Handlerルールがサポートされていますが(エラー(Exception)のハンドリング方法 DB編を参照)、アプリケーション上の予期せぬエラー(Exception)はサポートされていません。
これはアプリケーション上の予期せぬエラー(nullポインタや0割りなどは)はバグの範疇でありデバッグした上でのリリースが前提となる。という事と、GeneXus言語としては昨今のExceptionを利用した論理的なエラーを通知する仕組みをサポートしていないためです。
(ジェネレート対象となる言語にCOBOLやRPGといったExceptionをサポートしていない言語があるため)
これはアプリケーション上の予期せぬエラー(nullポインタや0割りなどは)はバグの範疇でありデバッグした上でのリリースが前提となる。という事と、GeneXus言語としては昨今のExceptionを利用した論理的なエラーを通知する仕組みをサポートしていないためです。
(ジェネレート対象となる言語にCOBOLやRPGといったExceptionをサポートしていない言語があるため)
2013年3月27日水曜日
エラー(Exception)のハンドリング方法 DB編
データベースI/O時に発生する予期しないエラー(SQLException)をハンドリングするにはError_Handerルールを使用します。各オブジェクト(トランザクション/プロシージャ/Webパネル)に以下の内容を定義します。
2013年3月26日火曜日
HTMLヘッダーにあれこれ直接追加したいとき
現在GeneXusのメインのジェネレーターはWebジェネレーター(C#/Java/Ruby)です。すなわち実行時の画面はHTMLになるわけですが、GeneXusで標準に生成されるHTMLにないコード(タグ)を独自に埋め込みたい場合があります。例えば、HTML Document typeやMetaタグ、独自のJavaScriptなど。そういった場合のTipsです。
2013年3月12日火曜日
ファイルオブジェクトを活用しよう
GeneXusを使っていると外部のファイルを追加するケースがあります。例えば、独自に作成したJavaScriptファイルやJQueryなどのJavaScriptライブラリ、Log4j.jarなどの各言語ごとのライブラリ、静的なHTMLファイルなどなど。
この外部で作成したファイルをどうやって管理・デプロイしていますか?恐らくファイル自体の管理(バージョン管理)はSubVersionなどのバージョン管理ツールを使っていると思いますが、GeneXusが生成・コンパイルしたファイルとのマージ・デプロイは手作業ではないでしょうか?
こんな時に便利なのがファイルオブジェクトです。ファイルオブジェクトはその名の通り、外部で作成したファイルをそのままオブジェクトとしてナレッジベースの中に格納します。
この外部で作成したファイルをどうやって管理・デプロイしていますか?恐らくファイル自体の管理(バージョン管理)はSubVersionなどのバージョン管理ツールを使っていると思いますが、GeneXusが生成・コンパイルしたファイルとのマージ・デプロイは手作業ではないでしょうか?
こんな時に便利なのがファイルオブジェクトです。ファイルオブジェクトはその名の通り、外部で作成したファイルをそのままオブジェクトとしてナレッジベースの中に格納します。
2013年3月10日日曜日
ローカル式の挙動に関するあれこれ
GeneXusのコードの中には、記述してあるコードの順序と実際に動作する時の順序(生成されるソースコードの順序)が違っているケースがあります。具体的にはFor eachを使わないローカル式がそれにあたります。
又、Newコマンドの外側でfor each以外のループ処理をしている場合(例えば、カウンタやコレクションによるforコマンド)、1回目のループでは未設定、2回目のループでは1回目の式で取得した値がセットされるという、ループ処理がずれた結果になります。
ケース1と2の対処としては、ローカル式を使用する部分をサブルーチンに分割する事により、明示的に処理の順序を指定することが可能です。
ケース1
ケース2
ケース1.ローカル式の条件に変数を使用している場合
あるコードブロック内にて変数の初期化後にローカル式がある場合、ローカル式が先に評価されるため、条件内の変数が未設定の状態で実行されます。&CustomerId = 1
&Count = Count( InvoiceDate, CustomerId = &CustomerId )
//Countが先に評価されコンディション内の&CustomerIdの値は初期状態
ケース2.Newコマンド内にローカル式を記述した場合
Newコマンド(つまりInsert)が先に評価され、ローカル式の実行はInsertの後になります。結果として、ローカル式の結果をセットしている項目属性は未設定の状態で保存されます。又、Newコマンドの外側でfor each以外のループ処理をしている場合(例えば、カウンタやコレクションによるforコマンド)、1回目のループでは未設定、2回目のループでは1回目の式で取得した値がセットされるという、ループ処理がずれた結果になります。
New
Attribute1 = &val1
Attribute2 = Max( Attribute2, Attribute1 = &val1) + 1
Attribute3 = &val3
Endnew
ケース3.BC(ビジネスコンポーネント)を使ったInsertにローカル式を記述した場合
これは例外ケースです。BCの操作はDBアクセスと認識されないため(DBに対するI/OはBC内に隠蔽かされている為)、ローカル式が先に評価され、取得した値を元にBCを使ったインサートが実行されます。この場合は見た目と同じ挙動になります。&BC.Attribute1 = &val1
&BC.Attribute2 = Max( Attribute2, Attribute1 = &val1)
&BC.Attribute3 = &val3
&BC.Save()
ケース1と2の対処としては、ローカル式を使用する部分をサブルーチンに分割する事により、明示的に処理の順序を指定することが可能です。
ケース1
&CustomerId = 1
Do ‘GetCountInvoice’ //サブルーチン呼び出し
//ローカル式をサブルーチン化
Sub ‘GetCountInvoice’
&Count = Count( InvoiceDate, CustomerId = &CustomerId )
EndSub
ケース2
New
InvoiceId = &InvoiceId
Do ‘GetMaxDetailId’ //サブルーチン呼び出し
InvoiceDetailId = &max + 1
ProductId = &ProductId
//ローカル式をサブルーチン化
Sub ‘GetMaxDetailId’
&max = Max( InvoiceDetailId, InvoiceId = &InvoiceId )
EndSub
2013年2月19日火曜日
帳票で強制的に改ページを行う
帳票(PDFプロシージャ)で強制的に(ロジックで)改ページを行う場合は、「Eject」コマンドを使います。
例えば、送り状(Invoice)を印刷するプロシージャにて、送り状Idごとに改ページする場合は、以下のように記述します。
例えば、送り状(Invoice)を印刷するプロシージャにて、送り状Idごとに改ページする場合は、以下のように記述します。
For each order InvoiceId
Print pb_Invoice_Header
For each
Print pb_Invoice_Detail
Endfor
Print pb_Invoice_Footer
Eject //改行コマンド
Endfor
2013年2月18日月曜日
PDFをファイルダウンロードさせる方法
GeneXusで帳票(PDF)を実装するにはプロシージャオブジェクトを使用しますが、ディフォルトだと生成されたPDFはブラウザ内に表示されます(IEの場合)。又、この場合画面遷移が発生してしまうので元の画面が消えてしまいユーザーが戸惑う事にもなります。
生成されたPDFをブラウザ内に表示するのではなく、ファイルとしてダウンロードさせるには以下のような記述を追加する事で実現可能です。
生成されたPDFをブラウザ内に表示するのではなく、ファイルとしてダウンロードさせるには以下のような記述を追加する事で実現可能です。
.net環境でのログ出力方法
GeneXusは標準でアプリケーションログの出力機能が搭載されていません。システムを開発する上でログ出力は必須の機能ですので、.net環境におけるログの出力方法を以下にまとめました。
前提としては、Webアプリケーション(web.configに設定を記述)ですが、バッチ処理等にも応用できます(client.exe.configに設定を記述)。
[追記] 「log4net出力設定のON」の部分、ジェネレーターのプロパティ設定を追記しました。(2013.2.26)
[追記] 「log4net出力設定のON」の部分、ジェネレーターのプロパティ設定を追記しました。(2013.2.26)
2010年2月13日土曜日
データベース・リバース・エンジニアリング・ツール(DBRET)で文字化け
Ver.XとEvolution1のデータベース・リバース・エンジニアリング・ツール(以下DBRET)を使って、日本語のデスクリプション項目を持ったテーブルを取り込むと、文字化けするという問題が存在します。
◆リバース結果のテーブルオブジェクト

◆リバース結果のトランザクションオブジェクト

解決策としては、GeneXusに付属しているDBRETではなく、単体で起動するDBRETを使用します。
ダウンロードはこちらから。
インストール後、スタートメニューから「Database Reverse Engineering Tool 1.3」を起動します。

単体のアプリケーションとして起動しますが、画面・使い方はGeneXusに付属するものと同じです。

リバースした情報はxpzファイルとして保存します。
その後、xpzファイルをターゲットのナレッジベースにインポートすれば、データビュー、トランザクション、データストアが取り込まれます。
◆リバース結果のテーブルオブジェクト
◆リバース結果のトランザクションオブジェクト
解決策としては、GeneXusに付属しているDBRETではなく、単体で起動するDBRETを使用します。
ダウンロードはこちらから。
インストール後、スタートメニューから「Database Reverse Engineering Tool 1.3」を起動します。
単体のアプリケーションとして起動しますが、画面・使い方はGeneXusに付属するものと同じです。
リバースした情報はxpzファイルとして保存します。
その後、xpzファイルをターゲットのナレッジベースにインポートすれば、データビュー、トランザクション、データストアが取り込まれます。
登録:
投稿 (Atom)











