開発者ガイド
Magic eDeveloper V9 Plus

Magic Software Japan K.K.

本マニュアルに記載の内容は、将来予告なしに変更することがあります。これらの情報について MSE（Magic Software Enterprises Ltd.）および MSJ（Magic Software Japan K.K.）は、いかなる責任も負いません。
本マニュアルの内容につきましては、万全を期して作成していますが、万一誤りや不正確な記述があったとしても、MSE および MSJ はいかなる責任、債務も負いません。
MSE および MSJ は、この製品の商業価値や特定の用途に対する適合性の保証を含め、この製品に関する明示的、あるいは黙示的な保証は一切していません。
本マニュアルに記載のソフトウェアは、製品の使用許諾契約書に記載の条件に同意をされたライセンス所有者に対してのみ供給されるものです。同ライセンスの許可する条件のもとでのみ、使用または複製することが許されます。当該ライセンスが特に許可している場合を除いては、いかなる媒体へも複製することはできません。
ライセンス所有者自身の個人使用目的で行う場合を除き、MSE または MSJ の書面による事前の許可なしでは、いかなる条件下でも、本マニュアルのいかなる部分も、電子的、機械的、撮影、録音、その他のいかなる手段によっても、コピー、検索システムへの記憶、電送を行うことはできません。
サードパーティ各社商標の引用は、MSE および MSJ の製品に対するコンパチビリティに関しての情報提供のみを目的としてなされるものです。
本マニュアルにおいて、説明のためにサンプルとして引用されている会社名、製品名、住所、人物は、特に断り書きのないかぎり、すべて架空のものであり、実在のものについて言及するものではありません。
Magic は Magic Software Enterprises Ltd. のイスラエルその他の国での商標または登録商標です。
Magic eDeveloper、Magic Client および Magic Application Server は Magic Software Japan K.K. の商標です。
Pervasive.SQL は Pervasive Software, Inc. の商標です。
Microsoft および FrontPage は、Microsoft Corporation の登録商標です。また、Windows, WindowsNT および
ActiveX は Microsoft Corporation の商標です。
Oracle は Oracle Corporation の登録商標です。
一般に、会社名、製品名は各社の商標または登録商標です。
MSE および MSJ は、本製品の使用またはその使用によってもたらされる結果に関する保証や告知は一切していません。この製品のもたらす結果およびパフォーマンスに関する危険性は、すべてユーザが責任を負う
ものとします。
この製品を使用した結果、または使用不可能な結果生じた間接的、偶発的、副次的な損害（営利損失、業務中断、業務情報の損失などの損害も含む）に関し、事前に損害の可能性が勧告されていた場合であっても、MSE および MSJ、その管理者、役員、従業員、代理人は、いかなる場合にも一切責任を負いません。

第一版 2003 年 11 月 28 日 Version 9.4 SP1a
第二版 2004 年 3 月 31 日 Version 9.4 SP1b
第三版 2004 年 6 月 30 日 Version 9.4 SP3
第四版 2005 年 7 月 29 日 Version 9.4 SP3c

Copyright 2003 Magic Software Enterprises Ltd.and Magic Software Japan K.K. All rights reserved.

はじめに
本書は、Magic eDeveloper V9Plus の開発者を対象としたノウハウ集です。
Magic eDeveloper V9Plus を使用してアプリケーションを開発する上での様々なヒントを掲載しております。
Magic eDeveloper V9Plus は、様々なパラメータを設定して行きながらアプリ
ケーションを開発していくものですが、そのパラメータの詳細については、『リファレンス』を参照してください。
また、Magic eDeveloper V9Plus 独自の用語で説明している場合があります
が、意味については、『Magic 用語集』を参照してください。
Magic eDeveloper V9Plus でのアプリケーション開発を行う上で、OS、ネット
ワーク、インターネット、データベースなどの様々な知識が必要になりますが、これらのことはすでにご理解されていることを前提に説明している場合もございますので、必要に応じて関連する技術文献等参考にしながらお読み
頂くようお願いいたします。

目次
はじめに ........................................................................................................................... iv

1Magic の環境設定
アプリケーションの定義 ............................................................................................... 2
Magic の起動 ........................................................................................................................ 2
新しいアプリケーションの作成 ....................................................................................... 2
アプリケーションの特性の設定 ....................................................................................... 3

動作環境の動的な変更 ................................................................................................... 4
SQL データベースの定義 ............................................................................................... 5
オープンクライアント環境の設定 ................................................................................... 5
SQL データベース用ゲートウェイをロードする........................................................... 5
SQL データベースを使用できるように Magic の環境を設定する .............................. 6
SQL データベースへの接続確認....................................................................................... 6

CTL ファイル名の変更 ................................................................................................... 6
Magic の多言語サポートの設定 .................................................................................... 7
Magic の多言語サポート .................................................................................................... 7
言語変換ファイルの作成 ................................................................................................... 7
言語の設定 ........................................................................................................................... 8

基本色の定義 ................................................................................................................... 8
基本色定義の変更 ............................................................................................................... 9
前景色と背景色の変更 ....................................................................................................... 9
基本色定義の保存 ............................................................................................................... 9

フォントの定義 ............................................................................................................... 10
フォント定義の変更 ........................................................................................................... 10
フォント定義の保存 ........................................................................................................... 10

Magic のバージョン確認 ................................................................................................ 10
再利用可能なアプリケーションオブジェクトの定義 ............................................... 11
モデルの特性の定義 ........................................................................................................... 11

継承／継承解除 ............................................................................................................... 12
オブジェクトの定義 ........................................................................................................... 12
継承解除 ............................................................................................................................... 12
再継承 ................................................................................................................................... 13

論理名の定義 ................................................................................................................... 13
論理名の定義 ....................................................................................................................... 13
論理名の使用 ....................................................................................................................... 14

デフォルト値／ NULL 値の定義 ................................................................................... 14
NULL 計算値の設定............................................................................................................ 15

アプリケーション独自の外部ファイル使用 ............................................................... 15
外部ファイルの定義 ........................................................................................................... 15

キーボード割付 ............................................................................................................... 16
アクション名 ....................................................................................................................... 16
キー割付の変更 ................................................................................................................... 16

ウィンドウのタイトル変更 ........................................................................................... 16
アプリケーション起動時の環境設定 ........................................................................... 17
開発者ガイドMagic eDeveloper V9 Plusiプログラムの自動実行 ........................................................................................................17
動作環境の取得 ....................................................................................................................17

2 データ定義モデルの定義 ................................................................................................................... 22
データテーブル中の行を重複不可に設定 ................................................................... 22
ユニークインデックスの定義 ............................................................................................22
インデックスセグメントの定義 ........................................................................................23
インデックス特性の定義（SQL データベースの場合）.................................................23

SQL データベースにおける指定順序でのレコード抽出 ........................................... 23
インデックスと位置の定義 ................................................................................................24
インデックスの選択 ............................................................................................................24［ソート］テーブルの設定 ..................................................................................................24
ORDER BY 句の使用 ...........................................................................................................25

テーブル間の自動リンク ............................................................................................... 25
外部キーの定義 ....................................................................................................................25
参照テーブルを含んだプログラムの作成 ........................................................................26

データ構造の変化を防止 ............................................................................................... 26
開発モードでのテーブル変換の規制 ................................................................................27
存在チェックの設定 ............................................................................................................27
DBMS デフォルト値の設定................................................................................................27
データベースのデフォルト値の設定 ................................................................................27
テーブルのデフォルト値の設定 ........................................................................................28
オーナー名の定義 ................................................................................................................28

カラム特性の変更 ........................................................................................................... 28
テーブルリポジトリを使用したデフォルトの割当て ....................................................29
定義取得ユーティリティを使用した割当て ....................................................................29
SQL タイプオプションを利用した割当て .......................................................................29
SQL データベースに対する SQL タイプオプション......................................................30

テーブルの物理定義の変換 ........................................................................................... 30
定義取得ユーティリティの使用 ................................................................................... 31
テーブルのロード ................................................................................................................31

変換後のテーブル構造の復旧 ....................................................................................... 31
データビューへのアクセス ........................................................................................... 32
仮想ユニークキーの追加 ............................................................................................... 32
APG を使用したテーブルのデータ操作 ...................................................................... 33
テーブルリポジトリから直接印刷 ............................................................................... 33
APG によるプログラム作成 ......................................................................................... 34

3 データビューの作成
プログラムやデータビューの定義 ............................................................................... 38
メインテーブルの定義 ........................................................................................................38
リンクの定義 ........................................................................................................................38
変数項目の定義 ....................................................................................................................39
SQL の SELECT 文..............................................................................................................39

ii

結果セットの定義 ........................................................................................................... 39
開発者ガイドMagic eDeveloper V9 Plus

メインテーブルのインデックス選択 ................................................................................40
範囲の定義 ............................................................................................................................40
位置付式の定義 ....................................................................................................................41
Magic SQL WHERE 句の定義 .............................................................................................41
DB SQL Where 句の定義 .....................................................................................................42

DB テーブルの設定 ......................................................................................................... 43［DB テーブル］テーブルへのアクセス ...........................................................................43

レコード順序の動的な変更 ........................................................................................... 43
レコード表示順序の変更 ....................................................................................................44
インデックス（式）の使用 ................................................................................................44

ソート順序の追加 ........................................................................................................... 44
ソート／一時用データベースの選択 ................................................................................45
仮想キーの使用 ....................................................................................................................45
データテーブルの共有制御 ................................................................................................45
アクセスモードの使用 ........................................................................................................45
共有モードの使用 ................................................................................................................46
テーブルモードの定義 ........................................................................................................46
テーブル共有の相互作用 ....................................................................................................46

データビューのキャッシュ ........................................................................................... 47
メインテーブルのキャッシュの設定 ................................................................................47
リンクテーブルのキャッシュの設定 ................................................................................47キャッシュ範囲の設定 ........................................................................................................48

不必要なリンクの最小化 ............................................................................................... 48
リンクコマンドの条件欄 ....................................................................................................48
リンク条件の動作 ................................................................................................................48

埋め込み SQL の使用 ...................................................................................................... 49
SQL SELECT 文の定義........................................................................................................49
データ操作言語（DML）の定義 .......................................................................................50
ストアド・プロシージャーの実行 ....................................................................................50

位置付と範囲指定 ........................................................................................................... 50
ポジションの特徴 ................................................................................................................51
ポジションを使用したプログラム ....................................................................................51

4 基本的なプログラミング
APG を使った単純なプログラム .................................................................................. 54
テーブルリポジトリからの作成 ........................................................................................54
プログラムリポジトリからの作成 ....................................................................................55

グローバル変数の定義 ................................................................................................... 55
メインプログラムの実行制御 ....................................................................................... 56
アプリケーション・イベントの定義 ........................................................................... 56
イベントの定義 ....................................................................................................................57
ハンドラの定義 ....................................................................................................................57

プログラムの終了条件 ................................................................................................... 57
プログラムの終了 ................................................................................................................58［イベント実行］コマンドの使用 ......................................................................................58

ブックマーク ................................................................................................................... 59
ブックマークの使用 ............................................................................................................59

iii

開発者ガイドMagic eDeveloper V9 Plus

データ操作の制限 ........................................................................................................... 60
タスク特性の項目設定 ........................................................................................................60［オプション］メニューの制限 ..........................................................................................61［オプション］メニューの無効化 ......................................................................................61
カーソル操作の制御 ............................................................................................................61
データ操作の禁止 ................................................................................................................61

タスク終了後のウィンドウ表示 ................................................................................... 62［タスク特性］ダイアログの使用 ......................................................................................62

イベント処理の利用例 ................................................................................................... 63
タスクツリーの操作 ....................................................................................................... 64
タスクの追加 ........................................................................................................................64
タスクの削除 ........................................................................................................................64
タスクの移動 ........................................................................................................................64
タスクの複写 ........................................................................................................................66
タスク名の変更 ....................................................................................................................66
親タスクの作成 ....................................................................................................................66

5 オンラインタスクの作成
タスクの初期モード ....................................................................................................... 68［初期モード（式）］の使用 ................................................................................................68式を使用する上での注意点 ................................................................................................68

選択プログラムの作成 ................................................................................................... 68
選択プログラムの作成 ........................................................................................................69
選択プログラムをカラムに割り付ける ............................................................................69
選択プログラムの実行 ........................................................................................................70

コンテキストメニューの定義 ....................................................................................... 71
コンテキストメニュの追加 ................................................................................................71
プログラムにコンテキストメニューを定義 ....................................................................72

データビューの変更の自動的保存 ............................................................................... 72［タスク制御］の［強制レコード後処理］を使用 ..........................................................72［項目更新］コマンドの［中止］パラメータを使用 ......................................................73
ユーザイベントの［強制終了］を使用 ............................................................................73

ユーザステップの再確認 ............................................................................................... 74
コントロールモデルの利用 ........................................................................................... 74
モデルの継承パターン ........................................................................................................74
ユーザイベントの定義 ........................................................................................................75
パターン A: コントロールに直接設定する ......................................................................75
パターン B：コントロールモデルを継承する ................................................................75
パターン C：項目の設定内容を継承させる ....................................................................76
パターン D：コントロールモデル→変数項目→ボタンへ継承 ....................................76
パターン E：項目モデル→変数項目→ボタンへ継承 ....................................................76
パターン F：ボタンモデル→項目モデル→変数項目→ボタンへ継承.........................77
モデルの削除方法 ................................................................................................................77

6 ブラウザタスクの作成
Web アプリケーションの開発環境設定 ....................................................................... 80
Magic のインストール.........................................................................................................80iv

開発者ガイドMagic eDeveloper V9 Plus

Web サーバの設定 ...............................................................................................................80
インターネットリクエスタの設定 ....................................................................................81
MRB の起動 ..........................................................................................................................81
Magic エンジンの設定.........................................................................................................82

簡単な Web アプリケーションの作成 .......................................................................... 83
ブラウザタスクの作成 ........................................................................................................83
ブラウザフォームの定義 ....................................................................................................83
HTML コントロールの定義................................................................................................84

HTML テンプレートファイル ....................................................................................... 85
HTML テンプレートファイルの作成................................................................................86
HTML テンプレートファイルの使用................................................................................86

HTML コントロール ....................................................................................................... 86
HTML コントロールの定義................................................................................................87
APG を使用したコントロールの作成 ...............................................................................87
項目のドラッグ＆ドロップ ................................................................................................87
HTML コントロールの追加................................................................................................88
HTML コントロールへのデータの関連付け....................................................................88
HTML コントロール特性の定義........................................................................................88
コントロールのスタイル指定 ............................................................................................88
コントロールのクラス指定 ................................................................................................89

テーブルコントロールの定義 ....................................................................................... 89
HTML テーブルコントロールの作成................................................................................90
テーブルの［明細行］特性の設定 ....................................................................................90

スクロール処理の改善 ................................................................................................... 91
チャンクサイズの設定 ........................................................................................................91
キャッシュのリセット ........................................................................................................91

１：ｎ のブラウザタスク .............................................................................................. 91
親タスクと拡張ビュータスクの作成 ................................................................................92
サブフォームの定義 ............................................................................................................92
サブフォームの再計算 ........................................................................................................93

HTML オーサリングツールの使用 ............................................................................... 93
HTML オーサリングツールの登録....................................................................................93
オーサリングツールの起動 ................................................................................................93
HTML ファイルの編集........................................................................................................93
HTML ファイルの独自編集................................................................................................94

特定のフレームでのブラウザタスク ........................................................................... 94
ブラウザクライアントでのタスクモード ................................................................... 95
VCR ツールバーの定義 .................................................................................................. 95
モジュールのクライアント配置の設定 ....................................................................... 96
同一フレームに２つのブラウザタスク ....................................................................... 96
IFRAME の使用 ............................................................................................................... 97
HTML ファイルの設定........................................................................................................97
Magic 側に組みこむ.............................................................................................................98

その他コントロールの使用 ........................................................................................... 98
HTML ファイルの設定........................................................................................................98
Magic 側に組みこむ.............................................................................................................99

エラーメッセージ用ページの作成 ............................................................................... 100v

HTML ファイルの作成........................................................................................................100

開発者ガイドMagic eDeveloper V9 Plus

MGREQ.INI の設定 ..............................................................................................................102
表示例 ....................................................................................................................................102
動作環境エラーのカスタマイズ ........................................................................................103

外部イベントの利用 ....................................................................................................... 103
HTML ファイルの作成........................................................................................................103

JavaScript の呼び出し ...................................................................................................... 105
JavaScript の定義 ..................................................................................................................105
JavaScript の起動を定義する ..............................................................................................105

7 トランザクションとリカバリー
ロックフェーズの短縮 ................................................................................................... 108
トランザクション開始 – レコード前処理の前 ................................................................108
トランザクション開始 – タスク前処理の前 ....................................................................108
トランザクション開始 – グループ ....................................................................................109
遅延トランザクションエラーの処理 ................................................................................109

トランザクション失敗時の動作 ................................................................................... 109
定義済みエラーの対応設定 ................................................................................................110
エラーハンドラの定義 ........................................................................................................110
エラー対応方法の定義 ........................................................................................................110
エラー発生時の処理の定義 ................................................................................................111
エラーメッセージの表示制御 ............................................................................................111
エラー情報の取得用関数 ....................................................................................................112「任意」エラーハンドラの定義 ..........................................................................................112［伝播］特性の設定 ..............................................................................................................112

データベースへの動的ログイン ................................................................................... 113
データベース制約違反の対応 ....................................................................................... 113
NULL 値の送信 ................................................................................................................ 114
MS-SQL Server 一時テーブル ........................................................................................ 115
ローカル一時テーブル ........................................................................................................115
グローバル一時テーブル ....................................................................................................115

各 nn レコードでトランザクションをコミットする ................................................. 115

8 アプリケーションのセキュリティ
ユーザの作成 ................................................................................................................... 118
スーバーバイザでのログオン ............................................................................................118
グループの作成 ....................................................................................................................118
ユーザ ID の作成..................................................................................................................119
ユーザ情報の取得 ................................................................................................................119
グループ／ユーザ／権利の追加 ........................................................................................119

実行モードでのログインユーザの変更 ....................................................................... 120
システムへのログオン ........................................................................................................120
ログオン関数の使用 ............................................................................................................120
ログオン方法の指定 ............................................................................................................121

ユーザやグループへの権利の割当て ........................................................................... 121

vi

権利の作成 ............................................................................................................................121
ユーザグループへの権利の割付け ....................................................................................122
ユーザへの権利の割当て ....................................................................................................122

開発者ガイドMagic eDeveloper V9 Plus

開発モードでの認証システム ....................................................................................... 122
リポジトリへの権利の割当て ............................................................................................123

アプリケーションに対するアクセス権の定義 ........................................................... 123
CTL アクセスキーの定義 ...................................................................................................124
ユーザへの CTL アクセスキーの割り当て ......................................................................124

アプリケーション保護機能の改善 ............................................................................... 124
公開使用権利アクセスキーの定義 ....................................................................................124
ユーザに公開使用権利アクセスキーを割り当てる：.....................................................125

アプリケーションの全ての操作に対するアクセスの許可 ....................................... 125
スーパー権利キーの定義 ....................................................................................................125
ユーザにスーパ権利キーを割り当てる：.........................................................................125

ワークグループ開発を１人のユーザに制限する ....................................................... 125
強制 MVCS 設定キーの定義...............................................................................................125［強制 MVCS 設定キー］をユーザに割り当てる.............................................................126

データテーブルの暗号化 ............................................................................................... 126
データの暗号化 ............................................................................................................... 126
暗号化の種類 ........................................................................................................................126
対称キー暗号化による暗号／複合化 ................................................................................127
非対称キー暗号化による暗号／複合化 ............................................................................127
Magic と外部アプリケーション間でのデータの暗号化.................................................129

9 高度なプログラミング
チョイスコントロールの設定 ....................................................................................... 132
データコントロールの設定 ................................................................................................132
選択項目リストの使用 ........................................................................................................132

マージ出力 ....................................................................................................................... 133
HTML タグの使用................................................................................................................133
複数行データのマージ ........................................................................................................135

１：ｎ のリレーションのプログラム .......................................................................... 135
１：ｎ のプログラムの作成 ...............................................................................................135
１：ｎ リレーションでのデータ整合性の維持 ...............................................................136

フォーム表示の保存と再使用 ....................................................................................... 137
フォームテンプレート ........................................................................................................137
フォームテンプレートの保存 ............................................................................................137
フォームテンプレートの読込 ............................................................................................138

論理名の使用 ................................................................................................................... 138
イメージプッシュボタンのデザイン ........................................................................... 138
イメージボタンの設計 ........................................................................................................138
イメージボタンの表示 ........................................................................................................139

モーダルウィンドウに設定 ........................................................................................... 139
子タスクのレベルからプログラムを終了 ................................................................... 139
イベントの［伝播］特性の利用 ........................................................................................140

テーブルのレコード合計の計算 ................................................................................... 140
カーソルの変更 ............................................................................................................... 141
電子メールの送受信 ....................................................................................................... 142
コントロールハンドラの利用 ....................................................................................... 144
vii

開発者ガイドMagic eDeveloper V9 Plus

コントロール検証の利用 ....................................................................................................144

ツリーコントロールの定義 ........................................................................................... 144
ツリー化するテーブルの概要 ............................................................................................145
ツリー表示プログラムを作成 ............................................................................................145
ツリーにアイコンを表示させる ........................................................................................145
ツリーのルートを指定する ................................................................................................146

メモリテーブルの保存 ................................................................................................... 146
Magic 終了時.........................................................................................................................146
Magic 起動時.........................................................................................................................147

ウィンドウの分割 ........................................................................................................... 147
ユーザ定義開発メニュー ............................................................................................... 147
ツールアプリケーションの動作概要 ................................................................................148
事前定義ファイルの作成 ....................................................................................................148
ツールアプリケーションの作成 ........................................................................................148
メニューの定義 ....................................................................................................................149

プログラムの関数化 ....................................................................................................... 149
条件判定用プログラム ........................................................................................................150
呼び出しプログラム ............................................................................................................150

ファントムタスク ........................................................................................................... 150
ハンドラに処理コマンドを移動する ................................................................................151

10 印刷の実行
APG を使用した簡単な印刷プログラム ...................................................................... 154
印刷プログラムの作成 ........................................................................................................154

簡単な印刷プログラムの作成 ....................................................................................... 154
帳票のデータビューの定義 ................................................................................................155
入出力ファイルの設定 ........................................................................................................155
帳票フォームのデザイン ....................................................................................................155［データ出力］コマンドの使用 ..........................................................................................155

ページヘッダとフッタの定義 ....................................................................................... 156
子タスク間での入出力ファイルの共有 ....................................................................... 156
子タスク間で同じ入出力ファイルを使用 ........................................................................156

プログラム間での入出力ファイルの共有 ................................................................... 157
プログラム間で１つの入出力ファイルを使用 ................................................................157

入出力ファイルの出力先の指定方法 ........................................................................... 157
Windows 印刷ダイアログ....................................................................................................157
入出力ファイルの式定義 ....................................................................................................158
デフォルトプリンタの設定 ................................................................................................158

印刷プレビューの使用 ................................................................................................... 159
複数の帳票の作成 ........................................................................................................... 159
長さの異なる複数行のテキスト印刷 ........................................................................... 159
テーブルの行数の制御 ................................................................................................... 160
子タスク内でのテーブル印刷 ....................................................................................... 160
画面に表示されたデータの印刷 ................................................................................... 160
データ出力ウィザードを実行する ....................................................................................161
スタイルをカスタマイズする ............................................................................................162

viii

開発者ガイドMagic eDeveloper V9 Plus

11 アプリケーションのメニュー
プルダウンメニューメニューの定義 ........................................................................... 166
ツールバーの表示制御 ................................................................................................... 166［メニュー定義］テーブルでの定義 ..................................................................................166
メニュー関数による制御 ....................................................................................................166

ヘルプの関連付け ........................................................................................................... 167
デフォルトコンテキストメニューの定義 ................................................................... 168
デフォルトのコンテキストメニューの定義 ....................................................................168

コンテキストメニューへのイメージの関連付け ....................................................... 168
プログラムに対するコンテキストメニューの定義 ................................................... 168
パラメータを使用したプログラムの実行 ................................................................... 169
メニューにプログラムを自動的に追加 ....................................................................... 169
ショートカットキーの定義 ........................................................................................... 170
ショートキー（組み合わせキー）の定義 ................................................................... 170

12 アプリケーションのヘルプ
内部ヘルプ、自動ヘルプ、ツールチップの設計 ....................................................... 174
Windows 形式ヘルプの設計 ........................................................................................... 174
URL ヘルプの設計 .......................................................................................................... 175

13Magic のユーティリティ
アプリケーションのマルチプラットフォーム化 ....................................................... 178
開発環境 ................................................................................................................................178
実行環境 ................................................................................................................................178

アプリケーションのドキュメント化 ........................................................................... 178
ドキュメントモードの実行 ................................................................................................179

クロスリファレンスの使用 ........................................................................................... 179
クロスリファレンスの実行 ................................................................................................180
クロスリファレンス結果の削除 ........................................................................................180
クロスリファレンス結果の保存と印刷 ............................................................................180
最大登録数の変更 ................................................................................................................181

アプリケーションの整理 ............................................................................................... 181
フォルダの作成 ....................................................................................................................181
ブックマークの使用 ............................................................................................................182
コメントの使用 ....................................................................................................................182

14Magic コンポーネント
コンポーネントの作成 ................................................................................................... 184
コンポーネントのロード ............................................................................................... 184
コンポーネントの組み込み ........................................................................................... 185
コンポーネントの選択 ........................................................................................................185

アプリケーション間でのイベント共有 ....................................................................... 185
ix

コンポーネントアプリケーションの保守 ................................................................... 186
開発者ガイドMagic eDeveloper V9 Plus

動作環境コンポーネントの追加 ........................................................................................186
コンポーネントへのヘルプ情報の割り当て ....................................................................186
オブジェクトの移行 ............................................................................................................187

コンポーネントを登録しない外部アプリケーション ............................................... 187
コンポーネントを登録しないで外部アプリケーションのプログラムを呼び出すには：187

コンポーネント側からホスト側のイベントを実行する ........................................... 188
コンポーネント側からホスト側のイベントを実行させるには：.................................188

15 外部アプリケーションとの接続
OS コマンドの使用 ......................................................................................................... 190［ウェイト］パラメータ ......................................................................................................190［表示］パラメータ ..............................................................................................................190［戻り値］パラメータ ..........................................................................................................190
トラブルシューティング ....................................................................................................190

DDE の使用 ...................................................................................................................... 191
ファイルを開く ....................................................................................................................191
特定のセルにデータを書き込む ........................................................................................191
特定のセルのデータを読み込む ........................................................................................191
ファイルを閉じる ................................................................................................................191

DLL の呼び出し .............................................................................................................. 191
ウィンドウのタイトル変更 ................................................................................................191
アイコンの変更 ....................................................................................................................193
WAV ファイルの再生 .........................................................................................................194

OLE オートメーションの利用 ...................................................................................... 195
変数の定義 ............................................................................................................................195
Excel を起動する ..................................................................................................................196
セルに値を設定する ............................................................................................................197
ワークブックを開く ............................................................................................................198
Excel の終了 ..........................................................................................................................198

16 アプリケーションパーティショニング
パーティショニングの設定 ........................................................................................... 202
アプリケーションの分散 ....................................................................................................202
分散されたアプリケーションの動作の仕組みを確認する ............................................202
Magic アプリケーションの定義.........................................................................................202
サーバ側のセットアップ ....................................................................................................203
クライアントのセットアップ ............................................................................................203
パーティショニングの設定 ................................................................................................204

MRB 情報の取得 ............................................................................................................. 204
リモートプログラムの実行 ........................................................................................... 205
Magic モジュールの分散化 ............................................................................................ 205
インストール方法 ................................................................................................................206
各構成毎の設定内容 ............................................................................................................206

17 パフォーマンスの向上
DBMS オプティマイザーの操作 ................................................................................... 210x

開発者ガイドMagic eDeveloper V9 Plus

ヒントの優先付け ................................................................................................................210
ヒントの例 ............................................................................................................................210

RDBMS 側での設定 ........................................................................................................ 211
DBMS の機能を使用したパフォーマンス向上策............................................................211
その他のパフォーマンス向上策 ........................................................................................212

頻繁に使用されるデータテーブルへのアクセス ....................................................... 213
常駐テーブルの利用 ............................................................................................................213
テーブルキャッシュの利用 ................................................................................................213

18 実行環境
フラットファイルの作成と使用方法 ........................................................................... 216
Magic フラットファイルの作成.........................................................................................216
フラットファイルで実行 ....................................................................................................216

マルチスレッド環境の設定 ........................................................................................... 217
同時処理スレッド数の制限 ................................................................................................217
複数のアプリケーションにリクエストを送信する ........................................................217

マルチスレッド環境の管理 ........................................................................................... 217
Magic のスレッドの監視.....................................................................................................218
アプリケーションサーバの起動と停止 ............................................................................218

単一コンテキスト環境の設定 ....................................................................................... 218
ランタイムコンテキスト ....................................................................................................219
Magic.ini と INIPut 関数.......................................................................................................219
スレッドにより共有されるリソース ................................................................................219
外部プログラムの使用 ........................................................................................................219
Ctx 関数 .................................................................................................................................219

19 バッチタスクの作成
簡単なバッチプログラムの作成 ................................................................................... 222
バッチタスクの実行制御 ............................................................................................... 222
実行確認のメッセージボックス ........................................................................................222
タスク終了条件 ....................................................................................................................222
イベント可の設定 ................................................................................................................223

バッチプログラムのイベントハンドリング ............................................................... 223
イベントトリガの定義 ........................................................................................................224
ハンドラの定義 ....................................................................................................................224

終了しないプログラム ................................................................................................... 225
レコード削除プログラム ............................................................................................... 225
初期モード（D = 削除）.......................................................................................................225
レコード削除（Yes）............................................................................................................226
埋め込み SQL 文 ..................................................................................................................226

入出力プログラムの作成 ............................................................................................... 226

20J2EE との連携
J2EE サーバーのインストール ...................................................................................... 230
Interstage ................................................................................................................................230

xi

開発者ガイドMagic eDeveloper V9 PlusWebSphere .............................................................................................................................231
WebLogic 6 ............................................................................................................................231
WebLogic 5.1 .........................................................................................................................231
Sun J2SDK EE .......................................................................................................................232
JBoss.......................................................................................................................................232
Sun One ..................................................................................................................................232

EJB サーバサポートの有効化 ........................................................................................ 233
Proxy EJB の作成 ............................................................................................................. 233
Proxy EJB の実行 ............................................................................................................. 234
J2EE サーバーの為の URL リソースの設定.....................................................................234
J2EE サーバーの起動...........................................................................................................236
Deployment Tool の起動.......................................................................................................236
Proxy EJB の実行..................................................................................................................237
テストアプリケーションを実行して EJB 連携を確認 ...................................................241
J2EE サーバーの停止...........................................................................................................242
Magic アプリケーションサーバーの高度な設定.............................................................243

Magic から EJB を呼び出す ........................................................................................... 244
環境設定 ................................................................................................................................244

Java コンポーネントジェネレータによるプログラムの作成 ................................... 249
JCG を起動する ....................................................................................................................249
EJB を指定する ....................................................................................................................249
コンポーネントを作成する ................................................................................................250

Java クラスへのアクセス方法 ....................................................................................... 251
Java 環境の設定 ....................................................................................................................251
Java クラスの内容を取得する............................................................................................252
Java クラスのインスタンスを作成する............................................................................255
Java 変数の読込 ....................................................................................................................256
Java のメソッドを呼び出す................................................................................................258

付録 ................................................................................................................................... 260
主な Interstage のコマンド ..................................................................................................260
PetStore を実行する場合の環境設定例 .............................................................................261

21Web サービス対応
動作環境 ........................................................................................................................... 264
Web サービス を呼び出す（RPC 形式）....................................................................... 264
WSDL.....................................................................................................................................264
コール Web サービスの定義 ..............................................................................................264
コール Web サービスの実行 ..............................................................................................265

Web サービス を呼び出す（ドキュメント形式）........................................................ 266
参照する Web サービスの概要 ..........................................................................................266
コール Web サービスの定義 ..............................................................................................267
入力パラメータ用コンポーネントアプリケーションの定義........................................269
出力パラメータ用コンポーネントアプリケーションの定義 ........................................270
入力パラメータの設定処理の定義 ....................................................................................270
出力パラメータの取得処理の定義 ....................................................................................271
コール Web サービスの実行 ..............................................................................................273
配列項目の扱い方 ................................................................................................................274xii

Web サービスのプロバイダの構築 ............................................................................... 275
開発者ガイドMagic eDeveloper V9 Plus

環境設定 ................................................................................................................................275
プログラムの作成 ................................................................................................................275

プロバイダ用プログラムの作成（ドキュメント形式）............................................. 276
作業概要 ................................................................................................................................277
入出力 XML データ形式の決定 .........................................................................................277
入出力データ用 XSD を作成する ......................................................................................277
入力 XML 解析用のプログラム作成 .................................................................................279
出力 XML データ作成用のプログラム作成 .....................................................................281
Web サービスの公開用プログラムを作成 .......................................................................283
WSDL の作成........................................................................................................................283
プロバイダとして実行 ........................................................................................................286
DIME を使用した添付ファイルの処理.............................................................................287

22COM 対応
COM コンポーネントを呼び出す（ActiveX オブジェクト）..................................... 292
COM コンポーネントの指定..............................................................................................292
フォームの定義 ....................................................................................................................292
参照処理 ................................................................................................................................293
中断処理 ................................................................................................................................294
処理中のステータス表示処理 ............................................................................................294
処理終了時のステータス表示処理 ....................................................................................295
多次元配列データを渡す ....................................................................................................296

COM コンポーネントを呼び出す（OLE オブジェクト）.......................................... 297
COM コンポーネントの指定..............................................................................................298
各処理用の Magic プログラム............................................................................................298
コレクションへのアクセス ................................................................................................303

DCOM コンポーネントを呼び出す .............................................................................. 306
DCOM コンポーネント側の設定 .......................................................................................306
クライアント側の Magic アプリケーションの設定........................................................308

Magic アプリケーションの COM コンポーネント化 ................................................. 309
Magic アプリケーションの作成.........................................................................................309
Proxy COM の作成 ...............................................................................................................309
Visual Basic から Magic アプリケーションを呼び出す ..................................................311

Magic アプリケーションのリモート COM コンポーネント化 ................................. 312
Proxy COM の作成 ...............................................................................................................312
Visual Basic からリモート Magic アプリケーションを呼び出す ..................................313

23 データの受け渡し
Magic からクリップボードへデータを渡す ................................................................ 316
キーボード操作による処理 ................................................................................................316
Magic 関数による処理.........................................................................................................316

クリップボードのデータを Magic に渡す ................................................................... 317
キーボード操作による処理 ................................................................................................317
Magic 関数による処理.........................................................................................................317

Magic で作成したデータを Excel で参照する ............................................................. 317
DDF ファイルの作成 ...........................................................................................................317
Excel 側で参照する ..............................................................................................................319

xiii

開発者ガイドMagic eDeveloper V9 Plus

Excel のワークシートを Magic で参照する ................................................................. 319
データソースの登録 ............................................................................................................319
Magic 側で参照する.............................................................................................................320

Magic で出力した XML データを Excel で読み込む .................................................. 320
データ出力ウィザードで作成されるスキーマ ................................................................321
テーブルに対応した XSD ファイルを作成する ..............................................................322
XCG でアクセス用のプログラムを作成する...................................................................323
Excel とのデータ連携を確認する......................................................................................324

Excel で作成した XML データを Magic で読み込む .................................................. 324
Excel のワークシートを XML ファイルで出力する .......................................................325
Magic で XML データを読み込む ......................................................................................326

24 メッセージの送受信
Magic のメッセージングモジュールをインストールする ........................................ 328
Magic から MSMQ へメッセージを送信する .............................................................. 329
MSMQ からメセージを受信する .................................................................................. 330
Magic から MSMQ へトランザクションメッセージを送信する .............................. 332
MSMQ のトランザクションメッセージを受信する .................................................. 333
Magic と JMS 間のメッセージの送受信 ....................................................................... 334
メッセージングコンポーネントの場所を変更する ................................................... 337

25 ドラッグ & ドロップ機能の利用
Magic から外部アプリケーションにデータをドラッグする .................................... 340
外部アプリケーションから Magic にデータをドラッグする ................................... 340
エディットコントロールの使用 ........................................................................................340
RTF コントロールとして配置された BLOB 項目の使用 ...............................................340

ドラッグ & ドロップのマウスポインタの外観の定義 .............................................. 341「ドラッグ開始」ハンドラの定義 ......................................................................................341
アクション処理コマンドで DragSetCrsr 関数を実行 ......................................................341

複数のコントロールを一緒にドラッグする ............................................................... 341
ユーザ定義フォーマットを使用したドラッグ & ドロップ ...................................... 342
テーブル間での複数のレコードをドラッグする ....................................................... 343
ユーザインタフェースの作成 ............................................................................................343
２つのハンドラを定義する ................................................................................................343
２つのリンクコマンドを定義する ....................................................................................344

26 ブロックループ処理コマンド
１つの処理ブロックを繰り返し実行させる ............................................................... 346
繰り返し回数の監視 ....................................................................................................... 346

27 リストボックスの利用
リストボックスから複数の項目を選択させる ........................................................... 350
リストボックスを配置したプログラムを作成する ........................................................350

xiv

開発者ガイドMagic eDeveloper V9 Plus

選択内容を入力するハンドラを作成する ........................................................................350
マルチ選択リストボックスのチェック ............................................................................351

文字列以外のデータの取得 ........................................................................................... 351

28 バッファの処理
構造体の作成 ................................................................................................................... 354
Magic からバッファを送る ............................................................................................ 355
その他の構造体の例 ............................................................................................................357

29 マージ Web アプリケーション
機能の比較 ....................................................................................................................... 360
基本的なマージ Web アプリケーション ...................................................................... 360
表示するテーブルの内容 ....................................................................................................360
HTML ファイルの作成........................................................................................................360
マージプログラムの作成 ....................................................................................................361
タスク定義 ............................................................................................................................362
マージプログラムの実行 ....................................................................................................362

ファイルの配置 ............................................................................................................... 363
HTML ファイル....................................................................................................................363
その他のファイル ................................................................................................................364

Cookie の使用 ................................................................................................................... 364
Cookie の書き込み ...............................................................................................................364
Cookie の読み込み ...............................................................................................................365

セッション管理 ............................................................................................................... 366
セッション管理の必要性 ....................................................................................................366
セッション管理の方法 ........................................................................................................366

コンテキスト管理 ........................................................................................................... 367
コンテキスト管理の有効化 ................................................................................................367
コンテキスト管理プログラム ............................................................................................368
クライアントの認証 ............................................................................................................368

排他制御 ........................................................................................................................... 370
排他制御の必要性 ................................................................................................................370
実装方法の例 ........................................................................................................................370

SSL による暗号化 ........................................................................................................... 371
サーバ証明書の作成とインストール ................................................................................371
クライアント証明書の作成とインストール ....................................................................374
Magic から SSL サーバにアクセスする............................................................................377

ファイルのアップロード ............................................................................................... 378
HTML ページよりアップロードする................................................................................378

30XML ファイルの出力
概要 ................................................................................................................................... 382
データ形式と XML データの関係 ................................................................................ 383
単純なテーブル ....................................................................................................................383
1 対 N の関係のテーブル ....................................................................................................383

xv

開発者ガイドMagic eDeveloper V9 Plus

マージプログラムの作成 ............................................................................................... 384
テンプレートファイル ........................................................................................................384
プログラム ............................................................................................................................385
XML データのチェック ......................................................................................................386
XML データの BLOB 化 .....................................................................................................386
UTF-8 にエンコードする必要がある場合 ........................................................................386

XML 出力の応用 ............................................................................................................. 387
ReportsMagic と組み合わせた印刷処理プログラム ........................................................387
スタイルシート（XSL）による表示のカスタマイズ ....................................................390

改訂履歴第２版 ................................................................ ａ
第 3 版 ................................................................. ａ
第 4 版 ................................................................ ａxvi

開発者ガイドMagic eDeveloper V9 Plus

1

Magic の環境設定

Magic で使われる特性パラメータには、あらかじめデフォルト値が設定されていますが、この値は変更することができます。この変更により、開発環境や実行環境の動作仕様が変化します。デフォルト値は、通常［ 設定］メニューから各設定用のテーブルを開いて変更しますが、環境設定ファイルを直接編集して変更することもできます。

この章では以下のことについて説明いたします。
アプリケーションの定義

2 ページ

動作環境の動的な変更

4 ページ

SQL データベースの定義

5 ページ

CTL ファイル名の変更

6 ページ

Magic の多言語サポートの設定

7 ページ

基本色の定義8 ページ

フォントの定義

10 ページ

Magic のバージョン確認

10 ページ

再利用可能なアプリケーションオブジェクトの定義

11 ページ

継承／継承解除

12 ページ

論理名の定義13 ページ

デフォルト値／ NULL 値の定義

14 ページアプリケーション独自の外部ファイル使用

15 ページウィンドウのタイトル変更

16 ページアプリケーション起動時の環境設定

17 ページ

開発者ガイドMagic eDeveloper V9 Plus1

第 1 章 - Magic の環境設定

アプリケーションの定義
Magic の起動
Magic eDevloper をインストールすると、Magic ディレクトリには２つのエンジンファイ
ルがコピーされます。Mgrntw.exe は実行用、Mggenw.exe は開発用で、開発を行うには後者を実行します。
ここでは、以下の内容について説明します。
• 新しいアプリケーションの作成• アプリケーション特性の設定

新しいアプリケーションの作成
V9Plus には、［新規アプリケーションウイザード］という機能を利用してスケルトンアプ
リケーションを作成することができます。

［新規アプリケーションウイザード］を実行する :1. ［ファイル］メニューより［新規作成］をクリックすると［新規アプリケーション
ウイザード］が起動されます。
2. ［アプリケーションのタイプ］欄で作成するアプリケーションのタイプを選択します。
•

E= 空のアプリケーション……［アプリケーション］テーブルへの登録処理を行います。

•

X=XML コンポーネント……［アプリケーション］テーブルへの登録処理を行い、XML コンポーネントウィザード（XCG）を起動します。

•

J=Java コンポーネント……［アプリケーション］テーブルへの登録処理を行い、Java コンポーネントウィザード（JCG）を起動します。

3. 以下のパラメータを指定します。この設定に基づいて［アプリケーション］テーブ
ルへの登録処理が実行されます。
•

アプリケーションの名前……任意のアプリケーション名を入力します。

•

アプリケーションデータベース……コンボボックスより選択できます。

•

CTL ファイル……アプリケーションのファイル名を入力します。ここでダブル
クリックすることで［フォルダの参照］ダイアログが開きファイルを作成する
場所を指定できます。

4. ［OK］をクリックすると［アプリケーション］テーブルに登録されます。
［アプリ
ケーションのタイプ］欄で「X=XML コンポーネント」や「J=Java コンポーネント」
が選択された場合、XCG や JCG が実行されます。
XCG については、『リファレンス』の 17 章「XML コンポーネントジェネレータ」
を参照してください。JCG については、16 章「Java との連携」を参照してください。
［新規アプリケーションウイザード］でアプリケーションを登録した場合、［アプリケー
ションテーブル］の［識別子］には、自動的に 2 桁のコードが入ります。

2

開発者ガイドMagic eDeveloper V9 Plus

アプリケーションの定義

アプリケーションを定義する :1. ［設定］メニューより［アプリケーション］をクリックして［アプリケーション］
テーブルを開きます。
2. ［名前］カラムにアプリケーションの名前を入力します。30 桁まで入力できます。
この名前は、アプリケーションの開発または実行の際、ステータス行に表示されます。アプリケーションの名前は、重複がないように注意してください。同じ名前を入力することはできますが、開発や保守、実行の際に混乱が生じることになります。
コンマは、MAGIC.INI ファイルの区切り文字として予約されています。このため、アプリケーションの名前にはコンマは使えません。
3. ［識別子］カラムにアプリケーションの識別子として使用する 2 文字の半角英数字を指定します。
アプリケーションに関連するファイル名が明示的に指定されない場合は、ここで指定した識別子をもとにデフォルト値が決まります。この識別子が使われるファイルとしては、Magic アプリケーションファイル（ppCTL.MCF ）やデータファイル（ppnnn.DAT ）などがあります。（pp：識別子）［識別子］カラムには、すべてのアプリケーションファイル（以後 CTL ファイルと呼びます。）が作成されるデフォルトの場所（ディレクトリのパス）を指定することもできます。この場所を指定しなかった場合は、CTL ファイルはすべて、Magic 起動時の作業フォルダに置かれていると判断されます。
4. ［CTL ファイル］カラムに CTL ファイル名を指定します。
ここには、CTL ファイル名と格納場所を指定します。CTL ファイルには、リポジ
トリを含め、そのアプリケーションに関連する要素のすべてが格納されます。それ
ぞれのアプリケーションには固有の CTL ファイルが存在します。この欄を空白にしたときは、CTL ファイルの名前は ppCTL.MCF （デフォルト名）となります。ここで「pp」は［識別子］のカラムで入力した 2 文字のコードを示しています。ここからズームすると Windows の「ファイルを開く」ダイアログが表示されます。
5. ［データベース］カラムにデータベースを指定します。
ここには、CTL ファイルを格納する DB テーブルを定義します。［設定／データ
ベース］で定義されたデータベースを指定できます。デフォルトは、［動作環境］の［デフォルトデータベース］に定義された値になります。
データベースを変更する場合、ここからズームして［ データベース一覧］が開き、アプリケーションで使用できるデータベースを選択します。この欄に［Unknown ］と表示されているときには、定義されたデータベースに対応するゲートウェイモ
ジュールが読み込まれていないことを示しています。この状態でアプリケーションを開くことはできません。
6. ［OK］をクリックします。
7. ［アプリケーション］テーブルに登録されると、［ファイル］メニューからアプリ
ケーションを開くことができるようになります。

アプリケーションの特性の設定
アプリケーションの特性には、［アプリケーション特性］と［CTL 特性］の２つがあります。
• ［アプリケーション］特性……アプリケーションの動作設定をアプリケーションの外部環境（Magic.ini ファイル）で指定する特性値です。
• ［CTL］特性……アプリケーションの動作設定をアプリケーションの内部（CTL ファイル）で指定する特性値です。

開発者ガイドMagic eDeveloper V9 Plus3

第 1 章 - Magic の環境設定［アプリケーション特性］を設定する：［アプリケーション］テーブルで設定したいアプリケーションの上にカーソルを置き、Ctrl+P を押すかマウスの右クリックで［特性］を選択します。

［CTL 特性］を設定する：
開発モードでアプリケーションを開いている状態で、［ファイル］メニューから［CTL 特性］を選択し、［CTL 特性］ダイアログを開きます。
設定の詳細については『リファレンスマニュアル』の 2 章「設定」を参照してください。

動作環境の動的な変更
Magic の動作環境を動的に変更するには、コマンドラインオプション、INIPut 関数、権利関数などを使用します。

Magic のコマンドラインオプション
コマンドラインオプションを使うことで、特定のセッションで固有の Magic の動作設定
を 行 う こ と が で き ま す。コ マ ン ド ラ イ ン オ プ シ ョ ン で 使 用 で き る パ ラ メ ー タ は、MAGIC.INI ファイルで使用できるパラメータと同じです。コマンドラインオプションで指定した値は、MAGIC.INI ファイルの値より優先されます。
設定の詳細については『リファレンスマニュアル』の 2 章「設定」を参照してください。

INIPut コマンド
INIPut コマンドを使用することで、実行中のアプリケーションから Magic の設定を変更することができます。関数のパラメータにて、MAGIC.INI 更新の有無を指定することができます。
設定の詳細については『リファレンスマニュアル』の 2 章「設定」を参照してください。

権利関数
Magic の実行中に実行権利の追加や削除を行うことができます。セキュリティの変更に関する権利関数には以下のものがあります。これらの関数を利用する場合は、アプリケー
ションに対する管理者権限が必要です。
• UserAdd ……ユーザを追加します。
• UserDel ……ユーザを削除します。
• GroupAdd ……ユーザをグループに追加します。
• RightAdd……ユーザに権利を割付けます。

4

開発者ガイドMagic eDeveloper V9 Plus

SQL データベースの定義

設定の詳細については『リファレンスマニュアル』の 8 章「関数」と 13 章「使用権利」を参照してください。

SQL データベースの定義
Magic はいくつかの SQL データベースを使用することが可能です。Magic はオープンク
ライアントを利用して SQL データベースを使用することができます。
ここでは Oracle 8i を例に挙げてオープンクライアントとの接続定義の方法を説明します。他の SQL の場合もほとんど同じです。
ここでは、以下の内容について説明します。
• オープンクライアント環境の設定• SQL データベースに接続するための Magic 側の設定
• Magic の動作環境の設定• SQL データベースへの接続確認

オープンクライアント環境の設定
オープンクライアント環境を設定する :• Magic の準備• 特定のデータベースに対応する Magic SQL ゲートウェイの準備。例えば Oracle の場合
は、「Mgora8.dll 」が必要です。
• データベースの準備。Oracle の場合、クライアントコンピュータ上に「Oracle 8i Client」
をインストールしておく必要があります。
• データベースサーバの準備。Oracle の場合、Oracle サーバをサーバ上にインストール
しておく必要があります。

SQL データベース用ゲートウェイをロードする
SQL データベース用の Magic ゲートウェイをロードする：
通常は、インストール時に Oracle ゲートウェイをインストールするように選択すること
でロードできる状態になります。
1. Mgora8.dll ファイルが Magic のディレクトリにあることを確認してください。
2. Magic.ini ファイルを編集します。
［MAGIC_GATEWAYS］セクションの「MGDB13」の前のセミコロンを削除します。
3. Magic を実行します。
4. プルダウンメニューの［ヘルプ／ MAGIC 情報］を実行することで、Magic がロードしているモジュールの内容を確認することができます。ここで、Oracle ゲートウェ
イがロードされていることを確認してください。もしロードされていない場合はMagic.ini ファイルの編集した行が正しく Mgora8.dll のファイルを指定しているか確認してください。

開発者ガイドMagic eDeveloper V9 Plus5

第 1 章 - Magic の環境設定

SQL データベースを使用できるように Magic の環境を設定する
SQL データベースに対応した Magic の環境設定を行う：
1. アプリケーションを閉じた状態で、［設定］メニューの［データベース］をクリック
して［データベース］テーブルを開きます。
2. 新しい行を作成します。
3. 新しい名前を入力します。
4. ［DBMS］カラムからズームして、［DBMS 一覧］から DBMS を選択します。例では、「ORACLE」を選択します。
5. Ctrl+P を押して［データベース特性］ダイアログを開きます。
6. ［ログオン］タブで［データベースサーバ］を入力します。これは Oracle のエイリアスです。次に［ユーザ名］と［パスワード］を入力します。
7. ［OK］をクリックします。

SQL データベースへの接続確認
Magic と SQL データベース間の接続を確認する：
1. アプリケーションを開きます。
2. テーブルリポジトリを開きます。
3. リポジトリテーブルのヘッダ行にカーソルを置き、［オプション］メニューから［定義取得］を実行します。Magic がデータベースに対して接続できていない場合は、エラーメッセージが表示されます。

CTL ファイル名の変更
アプリケーションを作成すると、Magic はデフォルトの CTL ファイル名として「識別子」＋「CTL.MCF」というファイル名を割り当てます。この名前を変更するには以下のようにします。

CTL ファイル名を変更する :1. ［設定］メニューから［アプリケーション］テーブルを開きます。
2. ［CTL ファイル］カラムにパスをつけたファイル名を入力するか、ズームしてファ
イルを選択します。
CTL ファイル名にパスが指定されていない場合、Magic エンジンの作業フォルダに作成されます。［データベース］カラムに指定されたデータベースに［位置］の定義がある場合は、そのフォルダ上に作成されます。

6

開発者ガイドMagic eDeveloper V9 Plus

Magic の多言語サポートの設定

Magic の多言語サポートの設定
Magic の多言語サポート
Magic には多言語サポート機能が用意されています。これは、変換ファイルを使用してテキスト文字列を変換するものです。この機能を利用して、いずれかの言語向けに作成したアプリケーションを別の言語向けのアプリケーションとして提供することができます。
ただし、Magic の多言語サポートには、次のような制限があります。
• Windows 版の Magic でのみサポートされます。
• テキストが左から右に入力される言語でのみ有効です。
ここでは、以下の内容について説明します。
• 言語変換ファイルの作成• デフォルト言語の設定

言語変換ファイルの作成
多言語サポートには、変換ファイルが必要です。変換ファイルは開発時にアプリケーショ
ンに入力する文字列と変換後の文字列が記録されています。各言語用の個別の変換ファイルが必要です。
変換ファイルのソースファイル（ テキストファイル）を次の形式で作成します。
• １ 項目につき２ 行•

各行は（CR/LF）が終端• ２ 行目は、１ 行目の変換テキスト• １ 行の最大長は 32000 文字
変換ファイルのフォーマットの例です。この例では開発時は日本語で文字列を入力し、実行時には英語での表示を行わせる場合を想定しています。
Numeric
数値型
Date
日付型
Time
時刻型
Alpha
文字型
Memo
メモ型
Blob
Blob 型
Logical
論理型…
各文字列は異なる行に記述します。ファイルの最後には空行を残しておく必要があります。
言語変換ファイル作成ユーティリティ（MLS_BLD.EXE ）を使用して、最終的な言語変換ファイルを作成します。
（Windows の DOS プロンプトから、以下のように実行します。
）
MLS̲BLD ＜入力ファイル名＞＜出力ファイル名＞ :開発者ガイドMagic eDeveloper V9 Plus7

第 1 章 - Magic の環境設定•< 入力ファイル名 >……変換ファイルのソースファイル•< 出力ファイル名 >……作成される言語ファイル。この言語ファイルを言語テー
ブルの変換ファイルとして使用します。

言語の設定
デフォルト言語を設定する：
1. ［設定］メニューから［言語］をクリックし、［言語］テーブルを開きます。
2. ［名前］カラムにユニークな名前を指定し、［変換ファイル］カラムに言語変換ファイルの名前をフルパス付きで入力します。
3. ［設定］メニューから［動作環境］をクリックし、［動作環境］ダイアログを開き、［外部参照］タブをクリックします。
4. ［デフォルト言語］欄でズームして使用したい言語を選択します。 この設定は実行／開発の両モードで有効です。

プログラム内で言語を設定する：
1. 言語を動的に設定するには、SetLang 関数を使用します。
GetLang 関数では、現在使用中の言語を確認することが可能です。
詳細については『リファレンスマニュアル』の 2 章「設定」と 8 章「関数」を参照してください。

多言語サポート機能はプログラム内のテキスト文字列の表示のみの対象となり、データの内容は変更されません。チョイスコントロールの場合、［選択項目リスト］や［選択表示リスト］の指定内容は変換対象となりますが、［ソーステーブル］が指定された場合の［表示項目］の内容は変換されません。

基本色の定義基本色テーブルでは、初期値として 100 の項目について前景と背景の色が設定されています。1 〜 100 番までの色は、基本的にシステムで予約されている色です。これらを変更した場合、Magic のテーブルやダイアログの色に影響がでるの注意してください。
アプリケーションが使用する色は、できるだけ 101 番以降に追加して使用してください。
ここでは以下の内容について説明しています。
• 基本色定義の変更• 前景色と背景色の変更• 基本色定義の保存

8

開発者ガイドMagic eDeveloper V9 Plus

基本色の定義

基本色定義の変更
各項目の前景と背景の色を設定します。1 番から 100 番までは Magic によって用途が固定されていますので、色の変更をするときは慎重に行う必要があります。ユーザが追加
登録した場合、［動作環境］ダイアログの［デフォルト色］欄で設定されている番号の色を複写します。［デフォルト色］欄が「0」の場合、システム予約色が用いられ、［前景］
は「ウィンドウ内の文字」、［背景］は「ウィンドウの背景」となります（1 番の設定内
容と同じになります）。

前景色と背景色の変更
前景色と背景色を変更する：
1. 色を変更する場合、変更する［前景］カラムまたは［背景］カラムにカーソルを置きズームを実行し、［基本色定義］ダイアログをオープンします。ダイアログの左上部には基本色が一覧表示されていますので、ここから基本となる色をクリックして選択します。選択すると、その色が太い境界線で囲まれます。
2. 選択した色に対して、赤、緑、青、色合、濃さ、輝度 の各数値を変更して色の調整を行えます。
［基本色定義］ダイアログのタイトルバーには、基本色テーブルのカレ
ント行の名前 と前景または背景が表示されます。また、［基本色定義］ダイアログには［システム色］コンボボックスがあり、Windows のシステムで使用している色を設定できます。

基本色定義の保存
基本色定義の変更を保存する：
1. 基本色テーブルで Enter キーを押下すると色の変更が確定されます。変更後の設定
は、基本色定義ファイルに保存されます。Magic が使用する基本色定義ファイルは、［動作環境］ダイアログの［外部参照］タブの［ 基本色定義ファイル］欄で指定します。このファイルのデフォルト名は clr_std.jpn ですが、名前を変更することで複数作成し使用することもできます。
2. 基本色テーブルで行った変更は、次に Magic を起動したときに有効になります。ただし、［ファイル保存］ダイアログの［即時有効］欄を「Yes」にした場合には変更が直ちに有効になります。
• 前景色と背景色に同じ色を選択しないように注意してください。その場合、文字が読めなくなります。
• ［ファイル保存］ダイアログで［ファイル名］を変更することで、基本色定義ファイルを現在使用しているものとは別のファイルに保存することもできます。このファイルの内容を有効にするには、［動作環境］ダイアログか［CTL 特性］で［基本色定義ファイル］の指定を変更してください。
• ［CTL 特性］の［基本色定義ファイル］に基本色定義ファイル名を指定すること
で、アプリケーション毎に基本色定義ファイルを使い分けることができます。

開発者ガイドMagic eDeveloper V9 Plus9

第 1 章 - Magic の環境設定

フォントの定義
フォントテーブルでは、Magic およびアプリケーションで使用するフォントを設定します。100 番までが Magic で予約されており、101 番以降ユーザが項目を追加することができます。項目の中には、「基本ダイアログ項目」、「基本ダイアログタイトル」、「標準プッ
シュボタン」、「ステータスライン」など、あらかじめフォントが定義されているものもありますが、大多数はユーザによる定義が可能です。フォントテーブルの登録数に制限はありません。
フォントテーブルのデータは［動作環境］ダイアログで設定されたフォント定義ファイルに保存されます。
ここでは以下の内容について説明しています。
• フォント定義の変更• フォント定義の保存

フォント定義の変更
フォントの名前とフォントを変更する：
1. ［フォント定義］テーブルで、目的のフォントをダブルクリックし、［フォント定義］ウィンドウを開きます。
2. ［フォント］、［フォントスタイル］、［サイズ］、［Orientaiion］（傾き）、［文字飾り］
を指定します。
3. ［OK］をクリックします。

フォント定義の保存
フォント定義を保存する：
1. フォントテーブルで Enter キーを押下するとフォントの変更が確定されます。変更
後の設定は、フォント定義ファイルに保存されます。Magic で使用するフォントファ
イルは、［動作環境］ダイアログ［外部参照］タブの［フォント定義ファイル］欄で指定します。このファイルのデフォルト名は fnt_std.jpn ですが、名前を変更することで複数作成し使用することができます。
• ［ファイル保存］ダイアログで［ファイル名］を変更することで、フォント定義
ファイルを現在使用しているものと別のファイルに保存することができます。このファイルの内容を有効にするには、［動作環境］ダイアログか［CTL 特性］で［フォント定義ファイル］の指定を変更してください。
• ［CTL 特性］の［フォント定義ファイル］にフォント定義ファイル名を指定すすることで、アプリケーション毎にフォント定義ファイルを使い分けることができます。

Magic のバージョン確認
Magic エンジンのバージョンを表示させる：• ［ヘルプ／ Magic 情報］を実行して、［Magic 情報］ダイアログを表示します。

10

開発者ガイドMagic eDeveloper V9 Plus

再利用可能なアプリケーションオブジェクトの定義• コマンドラインでバージョンオプションをつけて Magic を起動します。
開発版では : mggenw version
実行版では : mgrntw version
ウィンドウが開き、Magic のバージョンが表示されます。

再利用可能なアプリケーションオブジェクトの定義
Magic ではアプリケーション全体で使用できるオブジェクトとして、モデルを定義する
ことができます。
モデルは、オブジェクトの一連の特性が定義されているプロトタイプで、開発者はモデルリポジトリで定義されているモデルを参照して新しいオブジェクトを定義することができます。オブジェクトにモデルが関連づけられた場合、オブジェクトの特性はモデルから「継承」されます。モデルを定義することができるオブジェクトとしては、次のものがあります。
• 項目• コントロール• フォーム• ヘルプ
モデルに定義されている特性の値が変更されると、そのモデルを継承しているすべてのオブジェクトの特性値に自動的に反映されます。
項目モデルの［スタイル］特性に、指定したコントロールに関連するコントロールモデ
ルを割り当てることができます。
例えば、［GUI 表示］に「エディット」と定義されている場合、右側のダイアログボタン
をクリックするとエディットコントロールに対応した特性シートが表示され、ここでモデルを指定することができます。

モデルの特性の定義
モデルの特性を定義する：
1. 下記のいずれかの方法でモデルリポジトリを開きます。
•

Shift+F1 を押す• ［ワークスペース］メニューから「モデル」を選択する• ［ナビゲータ］ペインから「モデル」を選択する
2. F4 を押して１行作成します。
3. ［名前］カラムにモデル名を入力します。
4. ［クラス］カラムにモデルのクラスを選択します。選択肢には「ヘルプ」、「項目」、「ブラウザ」、「GUI 表示」、「GUI 出力」、「HTML」、「フレームセット」、「HTML マージ」があります。
5. 選択したクラスに関連した型を指定します。
（例：項目クラスに文字型の属性を指定する、など）

開発者ガイドMagic eDeveloper V9 Plus11

第 1 章 - Magic の環境設定
6. ［特性］シートを開き、オブジェクトの特性を変更します。
モデルを使用することにより、アプリケーション全体を通じての一環性が保たれ、メンテナンス性が向上します。

継承／継承解除
個々のモデルの特性の値を、継承されたデフォルトの値ではなく、別の値に定義しなおすことができます。特性値を再定義すると、関連付けられているモデルの現在の特性値
または更新された特性値が継承されなくなります。継承が「解除された」特性値は、［継承設定］ボタンで継承を設定し直すことができます。これらの設定の違いは、フォントや色で識別できます。
オブジェクトを定義する際には、同じクラスのモデルから全ての属性を継承することもできますが、個別に属性の継承を解除して値を変更したり、再度継承することもできます。
ここでは以下の内容について説明しています。
• オブジェクトの定義• 継承解除• 再継承

オブジェクトの定義
オブジェクトを定義する：（例：変数またはカラムを定義する場合）
1. ［特性］シートを開きます。
2. ［モデル］欄で作成したオブジェクトと同じクラスのモデルを選択することができます。モデルを選択することによって、新たに作成したオブジェクトに対してモデルの特性が継承されます。

継承解除
継承を解除する：
特性値の継承を解除するには、以下のどちらかの操作を行います。
• 属性の値を変更すると、継承が解除されます。
• 各特性欄左側のボタンをクリックして「×」から「＋」にします。

継承設定

12

継承解除

開発者ガイドMagic eDeveloper V9 Plus

論理名の定義

再継承
再継承する：
1. 再継承したい特性にカーソルを移動します。
2. 特性名の先頭のボタンをクリックすると「＋」マークが「×」マークに変わり、継承が再構築されます。
• モデルと継承関係にあるなしは、特性値の色とフォントで判断できます。この色（#44,#45）とフォント（#34,#35）は、任意に変更できます。
• アプリケーションの保守性を高めるために、継承を解除するのではなく、別のモデルを作成して継承させることを推奨いたします。

論理名の定義論理名を使用することで、アプリケーションの動作環境やアクセスするファイルの名前やパス名を外部環境で定義することができます。これによって、インストール環境を意識することなくアプリケーションを開発することができます。
論理名は、アプリケーションの外部にある Magic.ini ファイルの中に保存されており、複数のアプリケーション間で共有することが可能です。
ここでは以下の内容について説明しています。
• 論理名の定義• 論理名の使用

論理名の定義論理名を定義する：
1. ［設定］メニューから［論理名］を選択します。
2. ［名前］欄に論理名として使用する名前を入力します。
（例：MyPath）
3. ［実行名］欄で論理名が持つ値を入力します。
（例： C:¥Program Files¥Magic¥）

INIPut（）関数を使用して論理名を定義する：
アプリケーション内で INIPut（）関数を使用するには、式に INIPut 関数を記述した［アクション］コマンドを実行します。
（例）
INIPut（'[MAGIC̲LOGICAL̲NAMES]MyPath=C:¥Program Files¥Magic¥','TRUE'LOG）
2 番 目 の パ ラ メ ータは、Magic.ini ファイルを更新するかどうかを指定します。
’FALSE’LOG と指定した場合、Magic.ini ファイルは更新されず、実行時の Magic のインスタンスでのみ有効な指定になります。

開発者ガイドMagic eDeveloper V9 Plus13

第 1 章 - Magic の環境設定

論理名の使用
論理名を使用することで、外部ファイルをアクセスするようなアプリケーションを異なった動作環境で動作させることができます。また、INIPut 関数を使用することで切り換えることができます。

論理名を使用する：• 例えば、Magic のインストール先が以下のような論理名として定義されているものとします。
•

名前：MyPath•

実行名：C:¥Program Files¥Magic¥

このような場合、Magic のインストール先にある Sample.txt にアクセスするには、以下の式で指定することができます。
%MyPath%Sample.txt• また以下のような式を使用して参照することもできます。
INIGet（'[MAGIC_LOGICAL_NAMES]MyPath'）&'Sample.txt'
またはTranslate（’MyPath’）&'Sample.txt'

論理名をネストする
論理名は他の論理名とネストして使用することができます。
例：•

論理名：MyAppPath•

実行名：%MyPath%MyAppDir¥

この場合、実際のパス名は C:¥Program Files¥Magic¥MyAppDir¥になります。

SQL プログラムで使用する
SQL データベースを使用する場合、以下の設定にも論理名を使用することができます。
• データベース特性•

データベースサーバ

•

ユーザ名

•

パスワード

• テーブル特性•

オーナ名• インデックス特性•

DB インデックス名

デフォルト値／ NULL 値の定義

14

ユーザがレコードを作成した後に、項目に特定の値を入力しない場合、デフォルト値や
NULL 値が設定されます。このようなデフォルト値をあらかじめ定義したり、NULL 値をどのように扱うかを指定することができます。これらの値はデータベーステーブルの実データにも反映されます。

開発者ガイドMagic eDeveloper V9 Plus

アプリケーション独自の外部ファイル使用

デフォルト値と NULL 値を設定する：
アプリケーションのデフォルト値とデフォルトの NULL 表示文字列を設定するには、
Magic.ini の ［MAGIC_DEFAULTS］セクションで定義してください。これらの設定は、Magic.ini ファイルの変更のみで行います。動作環境ダイアログではできません。この設
定がない場合は、Magic 内のデフォルト値を使用します。
Magic.ini 内で指定できるキーワードは以下の通りです。
［MAGIC_DEFAULTS］
DefaultDate = ［date value］
NullAlphaDisplay = ［string value］
NullNumericDisplay = ［string value］
NullLogicalDisplay = ［string value］
NullDateDisplay = ［string value］
NullTimeDisplay = ［string value］
NullMemoDisplay = ［string value］
NullBlobDisplay = ［string value］
DefaultDate の書式は、日付モードに依存します。

NULL 計算値の設定
NULL 値を含む式の計算をどのように扱うかを指定するには、［CTL 特性］ダイアログの［スタートアップ］タブの［NULL 計算］欄で以下のように指定します。
• N=Null にする……計算結果も NULL になります。
• D= デフォルト……計算結果は、カラム特性または変数項目特性の［NULL 計算値］の値をもとに計算されます。

アプリケーション独自の外部ファイル使用
Magic はアプリケーションの動作を定義する、「基本色定義ファイル」、「フォント定義
ファイル」、「HTML スタイル定義ファイル」、などの外部ファイルを使用します。デフォルトとして Magic が用意しているファイルは Magic.ini ファイル中で指定するようになっています。また、アプリケーション固有の外部ファイルを使用することも可能です。

外部ファイルの定義
エンドユーザが Magic のデフォルトの基本色やフォントを変更してもアプリケーションが常に同じ外部ファイルを参照するようにすることで、アプリケーションの動作を常に同じに保つことができます。

アプリケーション独自の外部ファイルを定義する：
1. アプリケーションを開いている状態で Shift+F9 を押すか［ファイル］メニューから［CTL 特性］を選択します。
2. ［外部参照ファイル］のタブを開きます。
3. 各設定欄にこのアプリケーションで使用する外部ファイルのファイル名を入力しま

開発者ガイドMagic eDeveloper V9 Plus15

第 1 章 - Magic の環境設定
す。
• ［インターネット開発ファイルルート］と［通貨変換ファイル］以外の項目からはズームしてそのファイルの定義内容を確認することができます。
• 論理名を外部ファイルのパス名やファイル名に使用することができます。

キーボード割付
キーボード割付テーブルでは、Magic で使用される内部イベントとキー操作が関連付けられています。この設定を変更することでキー操作によって発生するイベントを変更することができます。

アクション名キーボード割付テーブルに表示されるアクション名は、CONST ファイルに依存します。
［動作環境］ダイアログの［外部参照ファイル］タブの［CONST ファイル］で指定されているファイル名によって以下のように表示が変わります。
• Mgconstw.eng …… 英語表記になります。
• Mgconstw.jpn …… Ver8.2 と互換表記になります。
• Mgconstw.jp2 …… Windows の標準的な表記に近づけています。
アプリケーションのリポジトリ出入力を行う場合、アクション名が出力時と入力時で合っていない場合、正常に入力できませんので注意してください。
本ドキュメントはこれ以降、”Mgconstw.jp2” を使用することを前提にしてアクショ
ン名を表記します。

キー割付の変更
キー割付を変更する：
1. キー割付を変更する場合、変更する［アクション］名に対応する［キー］カラムにカーソルを置きズームを実行し、［キー設定］ダイアログをオープンします。ここで、関連付けるキーを押します。キー表示が変更されたら［OK］をクリックします。
2. ［ステータス］欄にカーソルを移動させ、ズームを実行します。カーソルが［キーボード状態］欄に移動したら、#1 〜 #4 の欄のどれかにマウスか Tab キーでカーソ
ルを移動させ、ズームを実行します。
3. ［状態一覧］が表示されるので、キー割付が有効になる状態を選択して［選択］をクリックします。

ウィンドウのタイトル変更
実行版でのウィンドウタイトルを変更する：［動作環境］の［実行時のカスタムコピーライト］を指定して、実行版におけるタイトル
バーを変更することができます。このオプションは実行版エンジンでのみ有効で実行中は変更できません。

16

開発者ガイドMagic eDeveloper V9 Plus

アプリケーション起動時の環境設定
Windows の API を使用して変更することもできます。具体的なやり方は、第 15 章「外部アプリケーションとの接続」の「ウィンドウのタイトル変更」を参照してください。

アプリケーション起動時の環境設定
Magic アプリケーションのメインプログラムを利用することで、Magic アプリケーション
起動時に自動的にプログラムを起動したり、独自の環境設定を行ったりすることができます。
メインプログラムのタスク前処理に処理コマンドを定義すると、アプリケーション起動
時にこの処理が実行され、タスク後処理に処理コマンドを定義することで、アプリケー
ション終了時にこの処理が実行されます。
ここでは以下の内容について説明しています。
• 指定したプログラムを自動的に起動する• 動作環境情報を取得するプログラムの自動実行
Ver.8x 以前までは、［動作環境］ダイアログの［開始プログラム］パラメータにプログラ
ム番号を指定することで、アプリケーション起動時に自動的にプログラムを実行させることができました。
Ver9 以降はこのパラメータはなくなりました。同じような処理を実現する場合、メインプログラムのタスク前処理でコールプログラム処理コマンドを定義してください。

動作環境の取得
アプリケーションを実行する際、実行環境（OS のバージョンやホスト名など）をあらか
じめ取得する必要がある場合があります。このような時は、メインプログラムで取得処理を実行しメインプログラムで定義された変数（グローバル変数）に格納することで実現できます。

PC のコンピュータ名を取得するには：Windows の API である「GetComputerNameA」を呼び出すことで、PC のコンピュータ名を取得できます。
1. 変数を定義します。
名前

型

書式

ComputerName

A= 文字

30

ReturnN= 数値

3N

2. タスク前処理にコールユーザ PRC 処理コマンドを定義して、以下のパラメータを設
定します。
式：

@kernel32.GetComputerNameA

パラメータ：‘AL4’
変数「ComputerName」
30
変数「Return」

規：開発者ガイドMagic eDeveloper V9 Plus

STDCAL

17

第 1 章 - Magic の環境設定実行すると、変数「ComputerName」に PC のコンピュータ名が返ります。

OS の情報を取得するには：Windows の API である「GetVersionExA」を呼び出すことで、実行している OS の情報を取得することができます。この API は、構造体で値を返すのでバッファを使用します。
1. 変数を定義します。
名前

型

書式

Buffer

B=BLOB

Size

N= 数値

10N

MajorVersion

N= 数値

10N

MinorVersion

N= 数値

10N

BuildNumber

N= 数値

10N

PlatformId

N= 数値

10N

CSDVersion

A= 文字

128

ReturnN= 数値

3N

2. 以降は全てタスク前処理に定義します。アクション処理コマンドでバッファ（変数「Buffer」）の初期化の処理を定義します。
BufSetNum ('J'VAR,1,148,2,4) （注：「148」固定です。）
BufSetNum ('J'VAR,5,0,2,4)
BufSetNum ('J'VAR,9,0,2,4)
BufSetNum ('J'VAR,13,0,2,4)
BufSetNum ('J'VAR,17,0,2,4)
BufSetAlpha ('J'VAR,21,Fill（Chr(32),128）,2,128,'FALSE'LOG)（注：128 バイト分をスペースで埋めています。）
3. コールユーザ PRC 処理コマンドを定義して、以下のパラメータを設定します。
式：@kernel32.GetVersionExA

パラメータ：‘T4’
変数「Buffer」
変数「Return」

規：

STDCAL

4. 項目更新コマンドでバッファの内容を取り出す処理を定義します。
MajorVersion ……BufGetNum ( 変数「Buffer」,5,2,4)MinorVersion ……BufGetNum ( 変数「Buffer」,9,2,4)
BuildNumber ……BufGetNum ( 変数「Buffer」,13,2,4)PlatformId …… BufGetNum ( 変数「Buffer」,17,2,4)
CSDVersion ……BufGetAlpha ( 変数「Buffer」,21,1,128,'FALSE'LOG)
5. 出力した情報をもとに以下のように判定できます。

18

OS

MajorVersion

MinorVersion

BuildNumber

PlatformId

Windows98

4

10

1998

1

Windows98 SE

4

10

2222

1

Windows ME

4

90

3000

1

Windows NT 3.5

3

51

-

2

Windows NT 4.0

4

0

1381

2

Windows 2000

5

0

2195

2

開発者ガイドMagic eDeveloper V9 Plus

アプリケーション起動時の環境設定
Windows XP

5

1

2600

2

Windows 2003 Server

5

2

3790

2

• 変数「CSDVersion」には、Service Pack 名などのような追加情報が返ります。
•

BuildNumber は、出荷時期やアップデートの内容によって変わる場合があります。

バッファを使用した構造体のアクセス方法については、第 28 章「バッファの処理」
も参照してください。

OS の環境変数を取得するには：Windows の API である「GetEnvironmentVariableA」を呼び出すことで、実行している OSの環境変数を取得することができます。
1. 変数を定義します。
名前

型

書式

Environment_Name

A= 文字

256

Value

A= 文字

256

ReturnN= 数値

3N

2. コールユーザ PRC 処理コマンドを定義して、以下のパラメータを設定します。
式：@kernel32.GetEnvironmentVariableA

パラメータ：‘AA44’
変数「Environment_Name」
変数「Value」
40
変数「Return」

規：

STDCAL

変数「Environment_Name」に環境変数名を入力して実行すると、変数「Value」にこの変数の実際の値が返ります。

開発者ガイドMagic eDeveloper V9 Plus19

第 1 章 - Magic の環境設定［このページは意図的に空白にしています .］20

開発者ガイドMagic eDeveloper V9 Plus

2

データ定義

ここでは、DBMS の物理テーブルにアクセスするために 、Magic 内でデータテーブルを作成する手順を説明します。
テーブルを作成する上での共通オブジェクトとして、まずモデルを作成します。これを元にテーブルを構成していきます。最後に、作成したデータテーブルを利用して物理テー
ブルにアクセスするプログラムを作成していきます。

この章では以下のことについて説明いたします。
モデルの定義22 ページ

データテーブル中の行を重複不可に設定

22 ページ

SQL データベースにおける指定順序でのレコード抽出

23 ページ

テーブル間の自動リンク

25 ページ

データ構造の変化を防止

26 ページ

カラム特性の変更

28 ページテーブルの物理定義の変換

30 ページ

定義取得ユーティリティの使用

31 ページ

変換後のテーブル構造の復旧

31 ページ

データビューへのアクセス

32 ページ

仮想ユニークキーの追加

32 ページAPG を使用したテーブルのデータ操作

33 ページ

テーブルリポジトリから直接印刷

33 ページAPG によるプログラム作成

34 ページ

開発者ガイドMagic eDeveloper V9 Plus21

第 2 章 - データ定義

モデルの定義項目モデルを定義する：
1. Shift+F1 を押すか［ワークスペース］メニューからモデルリポジトリを開きます。
2. F4 を押して１行作成します。
3. ［名前］カラムにモデルの名前を入力します。
4. ［クラス］カラムでは、「F= 項目」を選択します。
5. ［型］カラムで型を選択します。（例：「A= 文字」）
6. Ctrl+P を押すか［編集］メニューから［特性］を選択し、作成したモデルの特性を確認／変更します。

データテーブル中の行を重複不可に設定
データテーブルの行を重複不可にするにはユニークインデックスを使用します。
セグメントとは、インデックスを構成するカラムの集まりです。インデックスには通常１つ以上のセグメントが定義されます。インデックス中の各セグメントの昇順または降順の指定を元に行の順序がソートされます。
SQL データベースの場合、インデックスは実インデックスおよび、仮想インデックスとして定義することができます。
• 実インデックス ……インデックスはデータベース中に作成されます。これによってデータベースはより効率的にデータにアクセスでき、パフォーマンスの向上に役立ちます。
• 仮想インデックス ……インデックスが仮想的に定義され、データベース中には作成されません。またデータベース中に重複行が作成されるのを防止することも行いません。仮想インデックスは、アプリケーション特有のインデックスとして利用することができます。
MS-SQL Server などのいくつかの SQL データベースではテーブル作成時に１つのユニー
クインデックスをクラスタ化できます。これは物理データがインデックス順に保存されるようになり、このインデックスを使用してのアクセスは高速になります。クラスタ化
できるインデックスは１つだけです。
ここでは以下の内容について説明します。
• テーブルへのユニークインデックスの定義• インデックスセグメントの定義• インデックス特性の定義

ユニークインデックスの定義
テーブルに対してカラムを定義した後で、以下の手順に従います。

テーブルにユニークなインデックスを定義する：
1. テーブルリポジトリで、［インデックス］カラムを選択します。
インデックスが画面の下半分に表示されます。
2. カーソルをインデックスのセクションへ移動し、F4 を押して１行作成します。
3. ［名前］カラムにインデックス名を入力します。

22

開発者ガイドMagic eDeveloper V9 Plus

SQL データベースにおける指定順序でのレコード抽出
4. ［タイプ］欄を「U= 重複不可」（デフォルト）に設定します。

インデックスセグメントの定義
セグメントを定義する：
1. カーソルを［セグメント］欄へ移動し、F4 を押してインデックスのセグメントを追加します。
2. 右側に表示されているテーブルの［カラム一覧］にズームします。
3. カラムを選択し、［OK］をクリックします。
4. 各セグメントごとに［順］カラムで「A=昇順」（デフォルト）か「D=降順」を選択します。

インデックス特性の定義（SQL データベースの場合）
インデックス特性を定義する：
1. インデックス上で Ctrl+P を押して［インデックス特性］ダイアログを開きます。
［SQL］タブをクリックします。
2. ［DB インデックス名］欄に、SQL データベースに識別させるインデックス名を入力します。
3. ［タイプ］欄で「R= 実キー」か「V= 仮想キー」を選択します。
4. MS-SQL Server の場合、［クラスタ化］欄で「No 」（デフォルト）または「Yes」 を選択します。
「Yes」が選択された場合、テーブル作成時に重複不可のインデックス
が SQL データベース内にクラスタ化されて作成されます。

SQL データベースにおける指定順序でのレコード抽出
データを取り出す順序は、アプリケーション側でのデータの処理結果に影響を及ぼす場
合があります。SQL データベースを Magic で扱う場合、以下の機能を使用することで順序を定義することができます。
• テーブルのインデックス• タスクの［ソート］テーブル• SQL 特有の ORDER BY 句「SQL 特有の ORDER BY 句」を使用する方法は、埋め込み SQL タスクにおいてのみ有効です。
それ以外の方法は、インデックスの設定、または［ソート］テーブルに定義された項目に応じて最初に実行されます。
タスクの［インデックス］と、［ソート］テーブルを両方設定して実行した場合、ORDERBY 句は［ソート］テーブルの設定からのみ作成されます。
［ソート］テーブルの項目が重複可の場合、Magic は更に「位置」セグメントを追加します。
ここでは以下の内容について説明します。
• インデックスと位置の定義• インデックスの選択

開発者ガイドMagic eDeveloper V9 Plus23

第 2 章 - データ定義• ［ソート］テーブルの設定• ORDER BY 句の使用

インデックスと位置の定義
テーブルデータの特定のレコード（行）を取得するためには、レコードの位置付けのた
めのインデックスが必要です。

テーブルの位置インデックスを定義する：
1. テーブルにインデックスを定義します。
2. ［テーブル特性］の［SQL］タブで、以下のいずれかの位置を定義します。
•

D= デフォルト …… Magic 独自のデフォルト値をテーブルの位置インデックスとして使用します。

•

U= 重複不可インデックス ……［インデックス］特性に設定された重複不可イ
ンデックスを使用します。できるだけ短いインデックスを指定してください。

•

R=Row ID …… 行番号位置（レコードに RowID のあるデータベースのみ）を使用します。

3. 「U= 重複不可インデックス」を選択した場合、［インデックス］欄からズームし、インデックスを選択します。

インデックスの選択
抽出順序を定義する最も一般的な方法です。タスクが使用するメインテーブルのインデックスを指定することで、抽出順序が制御できます。

タスク内でインデックスを選択する：
1. プログラムリポジトリからレコード抽出を行うタスクを開きます。
2. Ctrl+P を押すか［編集］メニューから［特性］を実行し、［タスク特性］ダイアロ
グを開きます。
3. ［特性］タブで［メインテーブル］を選択します。
4. ［インデックス］欄にインデックス番号を入力するか［インデックス一覧］から選択します。
5. ［OK］をクリックします。

［ソート］テーブルの設定
インデックスの定義内容以外の順番で抽出順序を変更する場合は、タスクの［ソート］
テーブルを使用します。

タスクの［ソート］テーブルを設定する：
1. プログラムリポジトリからレコード抽出を行うタスクを開きます。
2. Ctrl+S を押すか［タスク環境］メニューから［ソート］を選択します。
3. F4 を押して［ソートセグメント］テーブルに１行作成します。
4. 項目のカラムを入力するか、ズームして選択します。複数のカラムを使用してソー24

開発者ガイドMagic eDeveloper V9 Plus

テーブル間の自動リンク
トする場合は、同じようにして［ソートセグメント］にカラムを追加します。
5. ［ソートタイプ］欄で、「ユニーク」か「インデックスに依存」のどちらかを設定します。
6. テーブルのインデックス定義に関わらずソートを重複不可にするには、「ユニーク」
を選択します。

ORDER BY 句の使用
RDBMS の ORDER BY 句を直接指定して、DBMS サーバのソート機能を利用することができます。埋め込み SQL タスクでのみ利用できます。

Magic で ORDER BY 句を使用する：
1. メインテーブルが定義されていないタスクをオープンし、Ctrl+Q を押すか［タスク環境］メニューから［SQL コマンド］を選択し、［SQL コマンド］ダイアログを開きます。
2. ［データベース選択］の［データベース］欄にカーソルを移動し、ズームしてデー
タベースを選択します。
3. ［結果データベース］の選択はオプションです。
4. ORDER BY 句と共に有効な SQL コマンドを入力します。
5. ［APG］ボタンをクリックしてプログラムを作成します。
• 変数および、リンクカラム（結合リンクを除く）に対してのソートは避けてください。
• SQL コマンドオプションはメインテーブルが定義されていないタスクで有効です。

テーブル間の自動リンク
データモデルのリレーションは外部キーなどの参照整合性によって保たれています。
外部キーとは、あるテーブルで主キーまたは主キーと同等にユニーク制約のあるキーを参照する列または列のセグメントのことをいいます。参照テーブルと関連付けるセグメ
ントは、外部キーとして定義されます。
定義取得ユーティリティーを使用すると、Magic はデータベース中に定義されている外部キーを取得します。したがって、定義取得を行うときには参照されているテーブルから先に取得するようにしてください。
ここでは以下の内容について説明します。
• 外部キーの定義• 参照テーブルを含んだプログラムの作成

外部キーの定義
外部キーを定義する：
1. Shift + F2 を押すか［ワークスペース］メニューから［テーブル］を選択し、テーブ
ルリポジトリを開きます。
2. ［外部キー］カラムにカーソルを移動すると、［外部キー］テーブルが表示されま

開発者ガイドMagic eDeveloper V9 Plus25

第 2 章 - データ定義
す。カーソルを［外部キー］テーブルに移動します。
3. ［外部キー］テーブルに１行追加し、［名前］カラムに任意の名前を入力します。
4. ［参照テーブル］カラムでズームして、参照テーブルを選択します。
5. ［参照キー］カラムでズームして、キーを選択します。
6. ［DB に作成］欄を「オン」にすると、データベースに外部キーが作成されます。作
成しない場合は、「オフ」にしてください。
7. 現在のテーブルの［名前］カラムからズームして外部キーの［カラム］テーブルに移動します。
8. ［カラム］テーブルには、指定した参照キーに対応して行が追加されます。
9. ［カラム］でズームし、［項目一覧］から対応させる項目を選択します。
10. 全てのセグメントに対して同様の操作を繰り返します。

参照テーブルを含んだプログラムの作成
参照テーブルを含んだプログラムを作成する：
1. Shift + F2 を押すか［ワークスペース］メニューから［テーブル］を選択し、テーブ
ルリポジトリを開きます。
2. 外部キーが定義されたテーブルを選択します。
3. ［オプション］メニューから［APG］を選択します。
4. ［リンク］欄からズームし、［外部キー一覧］を開きます。
5. 外部キーを個別に選択するか［全ての外部キーを選択］欄をマークして、［OK］をクリックします。
6. ［APG］ダイアログの［OK］をクリックします。

データ構造の変化を防止
Magic は独自のデータオブジェクトを管理する様々な DBMS にアクセスして、独自にテー
ブルリポジトリを管理しています。データ構造はMagicからでも外部のDBMSのユーティリティからでも変更することが可能です。ここでは Magic からのデータ構造の変化を防止する方法を説明します。
以下のパラメーターはデータ構造を制御するのに役立ちます。
• 開発モードでのテーブル変換 …… Magic がテーブル構造の変更を可能にするかどうかを定義します。
• テーブルの存在チェック ……Magic がテーブルにアクセスするたびに存在チェックを行うかどうか定義します。
• オーナー名 …… テーブルまたはビューのオーナー
ここでは以下の内容について説明します。
• 開発モードでのテーブル変換の規制• 存在チェックの設定• DBMS デフォルト値の設定• データベースデフォルト値の設定

26

開発者ガイドMagic eDeveloper V9 Plus

データ構造の変化を防止• テーブルのデフォルト値の設定• テーブルのオーナ名の設定

開発モードでのテーブル変換の規制
開発モードでのテーブル変換を規制する：
1. アプリケーションを閉じた状態で、［設定］メニューから［データベース］を選択します。
2. データベースを選択します。
3. Ctrl+P で［データベース特性］ダイアログを開き、［オプション］タブを開きます。
4. ［開発モードでのテーブル変換］のチェックボックスを「オフ」に設定します。

存在チェックの設定［テーブルの存在チェック］を「オフ」に設定しておくと、Magic はテーブルがデータベース中に既に存在すると仮定して動作します。したがって、ユーザは Magic からテーブルを作成することはできなくなります。

DBMS デフォルト値の設定
DBM 特性やデータベース特性、テーブル特性には共通なパラメータがあります。これらのデフォルト値は継承関係にあります。
例えば、テーブル特性は、使用するデータベースの特性値をデフォルト値として継承します。また、データベース特性は、そのデフォルト値を定義された DBMS の特性から取得します。

DBMS のデフォルト値を設定する：
1. アプリケーションを閉じた状態で、［設定］メニューから［DBMS］を選択します。
2. 目的の DBMS を選択します。
3. Ctrl+P を押して［DBMS 特性］ダイアログを開きます。
4. ［DBMS の設定］の欄で［テーブルの存在チェック］のチェックボックスを「オフ」に設定します。
DBMS の存在チェックを外すことで、今後その DBMS を使用して作成されるデータベースのデフォルト値の設定が可能になります。

データベースのデフォルト値の設定
データベースのデフォルト値を設定する：
1. アプリケーションを閉じた状態で、［設定］メニューから［データベース］を選択します。
2. データベースを選択します。
3. Ctrl+P を押して［データベース特性］ダイアログを開き、［オプション］タブを開きます。

開発者ガイドMagic eDeveloper V9 Plus27

第 2 章 - データ定義
4. ［テーブルの存在チェック］のチェックボックスを「オフ」に設定します。

テーブルのデフォルト値の設定
テーブルのデフォルト値を設定する：
1. アプリケーションの［テーブルリポジトリ］を開きます。
2. テーブルを選択し、［テーブル特性］ダイアログを開きます。
3. ［SQL］タブをクリックし、［テーブルの存在チェック］を「N=No」に設定します。

オーナー名の定義
データベースの全てのオブジェクトは「データベース」、「オーナー名」、「テーブル」の組み合わせでできています。ユーザはアクセス権があるオブジェクトのみにアクセスできます。
特定のテーブルに対してオーナー名を定義し、アクセスを制限することが可能です。

テーブルのオーナー名を定義する：
1. アプリケーションの［テーブルリポジトリ］を開きます。
2. テーブルを選択し、［テーブル特性］ダイアログを開きます。
3. ［SQL］タブを開き［オーナー名］を入力します。

カラム特性の変更
モデルやテーブルのカラム特性にて SQL データベースに保存されるフィールド属性を変更することができます。ここで説明する特性のいくつかは SQL テーブルについてのみ有効です。
Magic のカラムが SQL データベースに追加されたとき、Magic のカラム特性へのデフォ
ルトは SQL の特定のデータタイプが割当てられます。特定のカラム特性に対しては、いくつかのデフォルトの SQL タイプが存在します。Magic はカラムの型、書式、特定のRDMBS などによりデフォルトの SQL タイプを割当てます。
SQL データベース内にテーブルが既に存在する場合は、定義取得ユーティリティを使用
してテーブル定義をデータベースから取得することができます。Magic はカラムの特性
を SQL データベース内のデータタイプに応じて割当てます。
何らかの理由でデフォルトの割当てをしない場合、異なる SQL タイプを割当てることも可能です。定義取得の際に、希望する項目特性が定義されない場合も、後から変更することが可能です。
ここでは以下の内容について説明します。
• テーブルリポジトリを使用したデフォルトの割当て• 定義取得ユーティリティを使用した割当て• SQL タイプオプションを使用した割当て• SQL データベースに対する SQL タイプオプション

28

開発者ガイドMagic eDeveloper V9 Plusカラム特性の変更

テーブルリポジトリを使用したデフォルトの割当て
テーブルのカラムを割当てる：
1. テーブルリポジトリでテーブルを選択し、［カラム］欄でズームします。
2. 変更するカラムを選択します。
3. Ctrl+P を実行するか、［ワークスペース］メニューから［特性シート］を選択してカラム特性を表示します。
4. カラム特性を変更します。

定義取得ユーティリティを使用した割当て
SQL データベース内にテーブルが既に存在しており、Magic でそのテーブル定義を使用
したい場合、定義取得ユーティリティを使用すると RBDMS からテーブル定義を取得して、Magic のテーブルリポジトリに定義することが可能です。Magic はデータベース中のカラム定義から型や書式、格納方法を決定します。SQL データタイプとデータサイズからデフォルトのマッピングを行います。デフォルトのマッピングは種類の異なる SQL
データベースごとに異なる場合があります。
定義取得を実行した後は、タイプには SQL データタイプが指定されます。
しかし、データベース中の情報によっては開発者は調整を必要とすることがあります。
いくつかのケースを示します。
• LONG RAW、イメージ、テキストのデータタイプはサイズが定義されていないため、書式のカラムは開発者が入力するよう空欄のままで残されます。
• LONG RAW、イメージ、テキストはメモ型と Blob 型で使用される可能性があります。
定義取得後に必要に応じて変更を行ってください。
• MS-SQL Server では、バイナリデータタイプはいくつかの属性で使用されます。定義
取得後にデフォルトの設定を変更してください。
• テーブルの定義取得を行うと、Magic は数値型のカラムを Float 型として定義します。
必要に応じて整数型に変更してください。

SQL タイプオプションを利用した割当て異なるデータタイプを割当てる：
1. ［カラム特性］シートで、［SQL］セクションの［タイプ］にカーソルを置きます。
2. 項目が空欄であれば、Magic はその SQL データベースに割当てられたデフォルト値
を使用していることになります。
3. データタイプを入力します。
例えば文字型のカラム（サイズ１）は VARCHAR（1）としてデフォルトで割り付けられています。
ここを CHAR（1）と入力することにより、SQL データベース内で CHAR（1）として割当てられるようになります。

開発者ガイドMagic eDeveloper V9 Plus29

第 2 章 - データ定義

SQL データベースに対する SQL タイプオプション
下記の表はデフォルトの割り付けを変更するときの例です。
例

対応

Magic の日付型が、SQL のDATE タイプに割当てられている。

0 値を含んだ日付を許可するためには、タイプ
フィールドで CHAR（8）を指定することによりストリングのフィールドとして日付を格納してください。

MS-SQL Server の中のインデックスに論理型のカラムを含めたい。

記憶形式を変更してください。論理型のデフォル
トは Integer Logical です。Magic は、bit data タイプ
で設定します。しかし、MS-SQL では bit フィー
ルドをインデックスに使用することを許可していません、したがって、String Logical を選択します。
これで、MS-SQL Server では、binary data タイプとしてマッピングします。

MS-SQL Server で、1 カラ
ムで日付と時間を表示したい。

サイズ 23 の文字型カラムに DATETIME を定義す
るか、サイズ 16 の文字型カラムにSMALLDATETIME の記憶形式を定義します。

SQL データベースの種類によるデフォルトのデータタイプ割り付けについては『リファレンスマニュアル』の 25 章「SQL に関する考慮事項」を参照してください。

テーブルの物理定義の変換
テーブルの構造を変更したいときや、テーブルを異なるデータベースに移動させる必要があるとき、Magic のテーブル構造の変換ユーティリティを使用します。

テーブルの物理的定義を変換する：
1. テーブルリポジトリで目的のテーブルを選択し、テーブルの構造やデータベースを変更します。
2. テーブルを閉じようとすると、変換するかどうかのダイアログが表示されます。こ
こで「Yes」を選択すると実際のテーブルが変換されます。
「No」を選択するとテーブル定義が物理データと合わなくなりテーブルのデータや内容へのアクセスができなくなる場合があります。
3. バックアップの確認ダイアログが開きます。
「Yes」を選択すると古いレコードとテー
ブル構成が保存されます。
これにより、後で作業を元の戻すことができます。テーブルは 「??BCK###」という名前でバックアップされます。「??」はアプリケーションの識別子で ### はテー
ブル番号です。
4. データ変換の際に使用するインデックスを選択します。
変換元と変換先のデータベースや OS の仕様によっては、テーブル名やカラム名などの書式に互換性が取れない場合があります。使用するデータベースや OS の仕様を考慮して作業を行ってください。

30

開発者ガイドMagic eDeveloper V9 Plus

定義取得ユーティリティの使用

定義取得ユーティリティの使用
SQL データベースにアプリケーションデータが格納されている場合、他のアプリケー
ションで作成したこれらのテーブルを Magic で読み込んで使用することが可能です。

テーブルのロード
１つのテーブルに対して定義取得を実行する：
1. テーブルリポジトリを開きます。
2. １行作成します。
3. ［データベース］欄でアクセスするデータベースを指定します。
4. ［DB テーブル］欄に既存のテーブル名を入力します。
5. ［オプション］メニューから［定義取得］を選択します。
［定義取得］ダイアログが開き、自動的に閉じます。テーブルにカラムやインデックス、外部キーが追加されます。

２つ以上のテーブルに対して定義取得を実行する：
1. テーブルリポジトリを開きます。
2. テーブルのタイトル行にカーソルを置き、［オプション］メニューから［定義取得］を選択します。
定義取得実行のダイアログが表示されます。
3. ［データベース］欄からズームして、定義が格納されているデータベースを選択します。
4. ［タグテーブル］欄でテーブルの選択方法を指定します。
選択肢は以下の通りです。
•

A= 全て

•

S= 選択

•

N= なし

［S= 選択］を選択した場合は、［テーブル選択一覧］が開きます。
5. ［テーブル選択一覧］でテーブルを選択します。Space キーを押し［選択］カラムに「V」が表示されると選択された状態になります。［選択］ボタンをクリックすると［定義取得］ダイアログに戻り、選択したテーブルの数が、［テーブル］欄に表示されます。
6. ［OK］を押して定義取得を実行します。選択したテーブルがテーブルリポジトリに追加されます。

変換後のテーブル構造の復旧
テーブルの物理データを変換した後に、変換時に作成したバックアップテーブルから変更する前の物理データテーブル構造を復旧する必要があるときは、次のように行います。

変換したデータテーブルを復旧する：
1. テーブルリポジトリに新しいエントリを作成します。

開発者ガイドMagic eDeveloper V9 Plus31

第 2 章 - データ定義
2. ［データベース］欄に復旧したいデータベースを選択します。
3. ［DB テーブル］カラムには「??BCK###」という名前でバックアップしたテーブル
を指定します。
4. ［オプション］メニューから定義取得を実行します。
5. 変更後のデータ構造をもつテーブルにカーソルを移動します。［オプション］メ
ニューから［検索と置換］を選択します。
［検索と置換］ダイアログが表示されたら［置換］欄に復旧したテーブル番号を指定します。
6. ［OK］をクリックするとクロスリファレンス処理が実行され、テーブルを使用しているプログラムを検索します。
7. 検索処理が終了すると置換処理の確認ダイアログが表示されます。一度に変換する
場合は［全て置換］、１つ１つ確認しながら置換する場合は、［置換］をクリックします。
定義と同様にデータも復旧したいときは、DB マネージャーを使用してバックアップテー
ブルから内容をコピーすることをすることを推奨します。テーブル名は 「??BCK###」というフォーマットで保存されています。
このバックアップテーブル名を変更するか、データをコピーすることでデータの復旧ができます。

データビューへのアクセス
Magic は、テーブル定義にアクセスするのと同様にビューにアクセスすることができます。
ビューは仮想データベースオブジェクトとして定義され、１つまたは複数のテーブルのビューを見ることができます。
ビューは実際のインデックスを含んでいるわけではありませんので、ユニークな仮想キーを定義する必要があります。

ビュー定義にアクセスする：
1. ［テーブルリポジトリ］で１行作成します。
2. ［データベース］欄でデータベースを選択します3. ［DB テーブル］欄に取得する DB テーブル名を入力します。
4. ［オプション］メニューから定義取得を実行します。
5. Ctrl+P を押して［テーブル特性］ダイアログを開きます。
［SQL］タブをクリックして［テーブルのタイプ］欄で［V= ビュー］を選択します。

仮想ユニークキーの追加
仮想ユニークキーを追加する：
1. テーブルリポジトリでテーブルを選択し、［インデックス］カラムでズームします。
2. 新しい行を作成し、インデックス名を入力します。
3. ［セグメント］欄へズームし、新しい行を作成します。
4. 右側に表示されたカラムテーブルからインデックスセグメントになるカラムを選択
し、［セグメント］欄を抜けます。

32

開発者ガイドMagic eDeveloper V9 Plus

APG を使用したテーブルのデータ操作
5. Ctrl+P を押して［インデックス特性］ダイアログを開き、［SQL］タブをクリックします。
6. ［タイプ］欄で［V= 仮想キー］を選択し、変更を保存します。

APG を使用したテーブルのデータ操作
APG(Automatic Program Generator) を使用することで、Magic でテーブルのデータを簡単にアクセスすることができます。

APG を使用してデータにアクセスする：
1. ［テーブルリポジトリ］で目的のテーブルを選択します。
2. Ctrl+G を押し［APG］タブで［処理モード］を「E= 実行」にし、［オプション］には「B= 照会」を選択します。
3. ［選択カラム数］欄からズームして［カラム選択一覧］を開きます。
4. ［カラム］欄を修正して表示する順序を変更することができます。カラムを選択しないようにするには［カラム］欄に「0」を入力します。
5. ［スタイル］タブを選択して「L= ライン」モードか「S= スクリーン」モードを選択します。また［表示スタイル］を「3= 立体」か「2= 平面」のどちらかを選択をすることも可能です。
6. ［OK］をクリックします。

テーブルリポジトリから直接印刷
ここではプリンタ、テキストファイル、または画面にテーブル内容を出力する方法を説明します。

APG で印刷処理を行う：
1. テーブルリポジトリで出力したいテーブルを選択し、Ctrl+G を押してAPGを起動します。
2. ［オプション］欄で「P= 印刷」を選択します。
3. ［選択カラム数］欄からズームして、［カラム］欄に印刷したいカラムの順番を指定
してください。「0」を入力するとこのカラムは出力されなくなります。
4. ［テキストファイル］欄で出力先を指定します。
•

テキストファイルに出力する場合 …… ファイルのパスとファイル名を入力します。ファイル名を指定したときのみ Magic はファイルを出力します。

•

コンソールに出力する場合 …… この欄に ’console’ と入力します。

•

プリンタに出力する場合 …… この欄に［プリンタ］テーブルに登録したプリン
タ名を入力します。

5. ［スタイル］タブで「L= ライン」モードか「S= スクリーン」モードを選択し、［OK］

開発者ガイドMagic eDeveloper V9 Plus33

第 2 章 - データ定義
をクリックします。
• ［スタイル］タブの［スタイル］欄で、表示方法を平面か立体のどちらかを選択することができます。また［タイトルバー］を選択することで、見出しを出力することができます。
• また、［モデルを使用］欄に、GUI 出力フォームのモデルを指定することができます。
• テーブルリポジトリの 0 行目で APG を実行すると、「A= 全て／ S= 複数選択／
N= なし」を実行対象として選択できます。

APG によるプログラム作成
ここではアプリケーションのデータにアクセスする為の照会用、印刷用、入出力用、Web用の基本的なプログラムの作成方法について説明します。

単一テーブルからのプログラムを作成する：
1. テーブルリポジトリからテーブルを選択し、Ctrl+G を押して APG を起動します。
2. ［処理モード］で「G= 作成」を選択し、［オプション］で以下のように選択します。
•

B= 照会 …… テーブル内容を表示するオンラインプログラムを作成します。

•

P= 印刷 …… テーブル内容を印刷するバッチプログラムを作成します。

•

E= 出力 …… テーブル内容をテキスト出力するバッチプログラムを作成します。

•

I= 入力 …… 「E= 出力」で出力したテキストファイルを入力するバッチプログ
ラムを作成します。

•

N=Inet …… テーブル内容を HTML 形式で表示するバッチプログラムを作成します。

•

R= ブラウザ ……テーブル内容を表示するブラウザクライアントプログラムを作成します。

3. ［オプション］指定に応じて要求される APG パラメータを入力します。例えば「N=Inet」や「R= ブラウザ」を選択している場合はインターネット用のパラメータを入力する必要があります。
APG ダイアログの詳細は、『リファレンス』の 19 章「APG」を参照してください。

4. ［OK］をクリックするとプログラムリポジトリに作成されたプログラムが追加されます。

APG で複数のプログラムを作成する：
1. テーブルリポジトリのタイトル行にカーソルを置き、Ctrl+G を実行します。テーブ
ルのチェックを実行した後、［APG］ダイアログが開きます。
2. ［APG］ダイアログの［タグテーブル］欄で「A= 全て」、または「S= 選択」を選択します。

34

3. 「S= 選択」を指定した場合は、［選択テーブル］欄でズームして APG でプログラムを作成するテーブルを選択します。スペースキーを押下し、［選択］欄に「V」が表示された場合が選択状態となります。
［選択］ボタンをクリックして［テーブル選開発者ガイドMagic eDeveloper V9 Plus

APG によるプログラム作成
択］ウィンドウを閉じます。
4. ［処理モード］を「G= 作成」に変更します。
5. 必要に応じて［オプション］などの他の APG パラメータを変更してください。
6. ［OK］をクリックすると作成処理が実行され、プログラムリポジトリに作成されたプログラムが追加されます。

開発者ガイドMagic eDeveloper V9 Plus35

第 2 章 - データ定義［このページは意図的に空白にしています。］

36

開発者ガイドMagic eDeveloper V9 Plus

3

データビューの作成

この章ではタスクのデータビューを説明します。Magic のタスクはデータベースエンジ
ンにあらかじめ決められた機能を実行させるルールの集まりです。各Magicタスクはデー
タベースから選択したレコードとそのカラムに対する処理を行います。メインテーブルとリンクテーブルから選択され、範囲によって制限された論理レコード群が、タスクのデータビューになります。

この章では以下のことについて説明いたします。
プログラムやデータビューの定義

38 ページ

結果セットの定義

39 ページ

DB テーブルの設定

43 ページ

レコード順序の動的な変更

43 ページ

ソート順序の追加

44 ページ

データテーブルの共有制御

45 ページ

データビューのキャッシュ47 ページ

不必要なリンクの最小化

48 ページ

埋め込み SQL の使用

49 ページ

位置付と範囲指定

50 ページ

開発者ガイドMagic eDeveloper V9 Plus37

第 3 章 - データビューの作成

プログラムやデータビューの定義
Magic のタスクはアプリケーションデータベースから選択したレコードセットと変数によって機能します。メインテーブルもしくはリンクテーブルから選択したカラムがタス
クの実項目と呼ばれます。
実項目は、［ メイン］テーブルまたは［リンク］テーブルから選択したカラムです。タ
スクがオープンしたレコード内に格納されているカラムが実項目として表示されます。
１レコードごとに処理することができます。
タスク実行中に一時的に特定の情報を格納する場合は、［変数項目］テーブルと呼ばれる、スクラッチメモリー領域から選択した変数項目を定義できます。
［変数項目］テーブ
ルは、［タスク環境／変数項目］を選択すると編集できます。
実項目と変数項目がタスクの論理レコードです。タスクのデータビューとはこの論理レコードをタスク範囲で制限したものです。
ここでは以下の内容について説明します。
• メインテーブルの定義• リンクの定義• 変数項目の定義• SQL の SELCT 文

メインテーブルの定義
プログラムのメインテーブルを選択する：
1. プログラムリポジトリでプログラムからズームして［タスク定義］ウィンドウを開きます。
2. Ctrl+P を実行して［タスク特性］を開きます。
3. ［特性］タブの［メインテーブル］欄でズームしてテーブルを選択します。
メインテーブルを選択すると、Magic は自動的に最初のインデックスを選択します。
Magic はこのインデックスをソート用として使用します。
4. インデックスが複数あるときは、［インデックス］欄からズームすることによってインデックスを変更できます。
5. テーブルを選択した後は、［セレクト］コマンドで使用するカラムを選択することが可能です。
［セレクト］コマンドは［レコードメイン］と［ハンドラ］レベルでのみ使用できます。

リンクの定義Magic の［リンク］コマンドはデータベーステーブル間の１：１のリレーションを確立します。
現在のタスクのメインテーブルのレコードは、他のデータベーステーブルのリンク条件に対応するただ１つのレコードにリンクされます。
リンクは以下のように確立できます。
• リンクテーブル中に条件に該当するデータが存在するかどうか確認します。
• リンクテーブルから選択されたカラムで、レコードのデータビューを拡張し、照会、修正、または登録をすることが可能です。

38

開発者ガイドMagic eDeveloper V9 Plus

結果セットの定義
リンクはデータビューの一部なので、［リンク］コマンドはタスクの［レコードメイン］
レベルでのみ使用できます。
リンクには「照会」、
「登録」、
「書込」、
「結合」、および「外部」の 5 つのタイプがあります。「結合」リンクは SQL データベースのみで使用できます。

変数項目の定義
タスク実行中に、処理結果を保持したり、処理状態を記憶して以降の処理の条件判別時に使用したりするなど、一時的に特定の情報を保存しておく場合があります。この目的のために変数項目を定義することができます。
［変数項目］テーブルは、Ctrl+V を実行するか、［タスク環境］メニューから［変数項目］
を選択することで開きます。
変数テーブルはテーブルリポジトリの［カラム］テーブルと同様の使い方ができますが、このテーブル中で行の作成や削除はできません。タスクの［レコードメイン］レベルで［セレクト］コマンドを定義する際に「V= 変数」を指定すると自動的に変数テーブル中に作成されます。
［セレクト］コマンドを定義する際に「P= パラメータ」を指定するとパラメータ項目を定義することができます。パラメータ項目は、変数項目と同じような使い方ができます
が、基本的には、他のプログラムから呼び出される場合のパラメータとして使用してください。

SQL の SELECT 文
Magic の埋め込み SQL サポート機能を使用すると、開発者は明示的に SQL 文を DBMSに送ることができます。そして Magic はそれらの SQL 文の結果を処理します。
SELECT 文はデータベースからデータを取得し、テーブルとして返します。SELECT 文に指定されているカラムは取得したいデータベースカラム名です。

結果セットの定義
結果セットにはプログラムやタスクで指定された基準によって選択されたデータが含まれています。データビューは、タスクに定義されたメインテーブルのインデックスをデフォルトとしてソートされます。結果セットの選択基準として、レコードメインを使用するか、タスクの［範囲／位置付］ダイアログを使用するかを指定できます。
• レコードメインで［範囲］を指定することができます。
• ［範囲／位置付］ダイアログで［範囲式］や［位置付式］を定義することができます。
• SQL データベースを使用すると、［範囲／位置付］ダイアログで Magic SQL 文と DB
SQL 句を使用することができます。
•

Magic SQL 文 …… SQL データベースを使用して遅延トランザクションを使用する場合、Magic 実行エンジンが SQL 文に翻訳する Magic 式を書くことができます。

•

DB SQL 句 …… SQL データベースを使用していて物理トランザクションを使用する場合、SQL テーブルカラムと変数項目の範囲を指定するのに SQL 文を使用できます。

ここでは以下の内容について説明します。
• メインテーブルのインデックス選択• 範囲の定義

開発者ガイドMagic eDeveloper V9 Plus39

第 3 章 - データビューの作成• 位置付式の定義• Magic SQL Where 句の定義
• DB Where 句の定義

メインテーブルのインデックス選択
メインテーブルのインデックスを定義し、そのインデックスセグメントを利用して範囲／位置付け処理を実行することが最も処理を早くする方法です。

メインテーブルからインデックスを選択する：
1. ［タスク特性］ダイアログの［特性］タブを選択します。
2. ［インデックス］欄からズームしてインデックスを選択します。

範囲の定義
範囲はタスクのデータビューを定義する１つの方法です。範囲を指定するには次の２つの方法があります。
• レコードメインの［セレクト］コマンドの［範囲］欄• タスクメニューからアクセスする［範囲／位置付］ダイアログ（Ctrl+H）の範囲式［レコードメイン］での定義
レコードメインでセレクトコマンドの［範囲］パラメータを利用するのがもっとも簡単な方法です。ただし、複雑な範囲式を指定することはできません。
• ［範囲］欄には、最大値と最小値を設定する２つの設定欄があります。範囲定義の内容に応じて範囲式を指定してください。例えば、最大値のみ指定した場合、指定された範囲値以下のレコードが全て抽出されます。
• 範囲式に CndRange 関数を使用することで条件に応じて範囲値の有効／無効を指定することができます。
例）CnaRange（A,10）という式を最大範囲値に指定した場合•

A=’True’ の場合、「10」が最大値として有効になります。

•

A=’False’ の場合、最大値は指定されていないものとして動作します。

［範囲／位置付］ダイアログでの定義［範囲式］を指定することで範囲の条件を再設定することが可能です。また、より複雑で動的な範囲条件にも対応します。
• 範囲式が「True」と評価されると、その行はデータビューに組み込まれます。
• 範囲式が「False」と評価されると、その行はスキップされます。
• 範囲式が指定されていないとき（0 なっているとき）は範囲式は常に「True」と評価されます。

範囲式が必要な場合：• 抽出条件がデータの値に依存するために、タスクの初期化時点では条件を決定できない場合• ［セレクト］コマンドの範囲の上限と下限という条件だけでは指定できない場合

40

開発者ガイドMagic eDeveloper V9 Plus

結果セットの定義

位置付式の定義
位置付はタスク開始時にデータビューを特定の位置から開始する場合に使用します。オンラインタスクでのみ有効です。
タスクが開始されるとき、Magic は初期レコードから位置付式が「True」を評価されるまでスキャンを行います。
行が取得され、カーソルがそこに位置付けられます。ユーザは矢印キーでその行からデー
タビューの範囲内で自由に移動できます。
位置付の値は次の２カ所で指定できます。
• レコードメインの［セレクト］コマンドの［位置付］欄• ［範囲／位置付］ダイアログの［位置付式］欄［レコードメイン］での定義
レコードメインでセレクトコマンドの［位置付］カラムを利用するのがもっとも簡単な方法です。ただし、複雑な範囲式を指定することはできません。
• ［位置付］欄には、最大値と最小値を設定する２つの設定欄があります。位置付定義の内容に応じて位置付式を指定してください。例えば、最大値のみ指定した場合、使用するインデックスの並び順に応じて指定された位置付値以下のレコードでの最大値（または最長値）で位置付けが行われます。
• 位置付式に CndRange 関数を使用することで条件に応じて位置付値の有効／無効を指定することができます。
例）CnaRange（A,10）という式を最大位置付値に指定した場合•

A=’True’ の場合、「10」が最大値として有効になります。

•

A=’False’ の場合、最大値は指定されていないものとして動作します。

［範囲／位置付］ダイアログ［位置付式］を指定することで位置付けの条件を再設定することが可能です。また、より複雑で動的な位置付け条件にも対応します。
• 位置付式が「True」と評価されると、カーソルは条件に該当する最初の行にパークします。
• 位置付式が「False」と評価されると、Magic はパークせず次の行を検索します。
• 位置付式が指定されていない場合、常に「True」と評価されます。
［位置付式］はタスクの初期化時点で有効でない変数の値を位置付けに使用するときに有効です。
［位置付式］で使用されている全ての変数の値は、タスクの初期化時に評価されます。
その時点ではパラメータか親以上のタスクの変数しか評価できません。開始行が見つからない場合、Magic はエラーメッセージを表示し、カーソルは最初の行にパークします。

Magic SQL WHERE 句の定義
SQL Where 句を定義する：
1. タスクの［範囲／位置付］のダイアログボックスを開きます。
2. ［SQL Where 句］タブをクリックします。

開発者ガイドMagic eDeveloper V9 Plus

41

第 3 章 - データビューの作成［Magic SQL］式は遅延トランザクションにおいて SQL Where のレンジ機能を実行します。これには Magic のエンジンが翻訳した式も含まれます。
3. ［式］欄からズームして、式テーブルを開きます。
展開された式は SQLWhere 句全文に追加されます。
Magic は式を各 SQL データベースの種類に応じて最適な文法に翻訳します。例えば、
Magic SQL 式
G<Date（）, for a Customer Contact Date field
は実行環境では次のように表現されます。
•

MS-SQL Server の場合
CAST （CONVERT （CHAR, Customer_Contract_Date, 112）AS DATETIME）< CAST （CONVERT （CHAR, GETDATE（）, 112）AS DATETIME）•

Oracle の場合
TO_DATE（Customer_Contract_Date, ‘DD-MON-YY’）< TO_DATE（SYSDATE, ‘DD-MON-YY’）

DB SQL Where 句の定義
DB SQL Where 句を 定義する：
1. タスクの［範囲／位置付］ダイアログボックスを開きます。
2. ［SQL Where 句］タブを開きます。
［DB SQL］欄は SQL のメインテーブルで物理トランザクションを使用しているときのみ有効です。（遅延／ネスト遅延のトランザクション下では、この項目は使用できなくなっています。Magic SQL 式使用してください。）SQL の文法に従って範囲を指定します。範囲は Magic Where 句に追加され、全文が表示されます。
3. ［DB SQL］欄からズームして使用可能な項目のリストを表示します。メインテーブ
ルと結合テーブルの実項目は DB カラム名に置き換えられます。変数項目と他の実
項目はそれらの値で置き換えられます。

図 3-1 項目一覧

42

選択した変数を指定します。項目の記述方法としては、次の 2 種類があります。

開発者ガイドMagic eDeveloper V9 PlusDB テーブルの設定•

項目の番号（A、B、C など）の先頭に「:」記号を付けて記述
項目が、メインテーブルまたはジョインテーブルのカラムの場合、この方式を使います。項目名は、データベースのカラム名に置き換えられます。メインテーブルまたは
ジョインテーブルのカラムでない場合、データ型に従って値に変換されます。カラムの型が文字型の場合、Magic により後続のスペースが削除されるとともに引用符が追加されます。

•

項目の番号（A、B、C など）の先頭に「@:」記号を付けて記述
項目が、メインテーブルやジョインテーブルのカラムでなく、型が文字の場合、この方法を使います。この場合、カラムが値に置き換えられるます。また、Magic により引用符が追加されることはありません。

［Where 句の全体表示］をクリックすると、SQL 文全体が表示されます。この WHERE 句
は、Magic により生成された SQL ステートメントで使われます。表示される内容は、次の通りです。
• レコードメインにより生成された WHERE 句……範囲式も表示されます。
• SQL WHERE 句……AND 句を使い、カッコで囲まれて表示されます。レコードメイ
ンの範囲に追加されます。
•

BOLB 型とメモ型は SQL 範囲の中では使用できません。

• Magic は SQL 文の文法チェックは行いません。SQL 文にシンタックスエラーが発生した場合、RDBMS はエラーメッセージが発生します。

DB テーブルの設定［DB テーブル］テーブルは、タスクで使用する DB テーブルのパラメータを編集したり、確認したりする場合に使用します。また他のテーブルをタスク開始時にオープンしておくためにも使用します。
［式］カラムでは実行時にデータベーステーブルの物理名として評価される式を指定できます。
式には論理名が使用できます。指定された名前によって［テーブルリポジトリ］で定義されているテーブル名から切り換えられます。

［DB テーブル］テーブルへのアクセス［DB テーブル］テーブルにアクセスする：
1. ［タスク環境］メニューから［DB テーブル］を選択します。
2. ［テーブル］カラムからズームします。
［テーブル一覧］が表示されるのでここで選択することで変更できます。

レコード順序の動的な変更
メインテーブルのデフォルトインデックスは、インデックステーブルの最初に定義されたものです。特定のインデックスを選択することによって、タスクにおけるデータビュー
レコード取得の順序を指定することができます。また、［インデックス］欄の式を使用することにより、さらに柔軟な使用が可能です。

開発者ガイドMagic eDeveloper V9 Plus43

第 3 章 - データビューの作成
ここでは以下の内容について説明します。
• レコード表示順序の変更• インデックス（式）の使用

レコード表示順序の変更
レコードの表示順序を変更する：
1. プログラムリポジトリでプログラムを選択し、［タスク定義］ウィンドウへズームします。
2. Ctrl+P を実行し、［タスク特性］ダイアログの［特性］タブを開きます。
3. メインテーブルの［インデックス］欄は「0」のままにしておきます。
インデックスの［式］欄には、［式］テーブルで定義した式が参照されるように指定します。

インデックス（式）の使用
インデックス（式）を使用する場合、以下の点に注意してください。
• 式を評価した結果は、選択したメインテーブルの有効なインデックス番号であることが必要です。実行環境においてはインデックスの動的指定に使用する式が有効でない
場合や、式が指定されていない場合、インデックス番号「0」（物理レコード順）をデ
フォルトとして動作します。
• インデックスの式の評価は、タスクが開始された直後で変数が評価される前に行われます。定数ではなく変数による式をインデックスに使用する場合には、パラメータとして受け取った変数か、親タスクの変数を使用する必要があります。使用できない変数によるインデックス式は「0」として評価されます。
式でインデックス番号を使用するときやプログラム内で動的に変更させたい場合は、
KEY リテラルを使用して、インデックス番号を明示的に指定する必要があります。
例えば、nn 番のインデックスを指定する場合は、次のように入力します。
‘nn’ KEY

ソート順序の追加
タスクの始めにメインテーブルのレコードを順序付ける一時的なソートインデックスを定義するときには、［ソート］テーブルで行います。
［タスク環境／ソートテーブル］を選択して、［ソート］テーブルにアクセスします。
［ソート］テーブルには、以下の様な表示のある複合ウィンドウが表示されます。
• ウィンドウの左側にセグメントエリア• ウィンドウの右側に［項目一覧］
左側のセグメントエリアから［項目一覧］にズームし必要な項目を選択します。
ここでは以下の内容について説明します。
• ソート／一時用データベースの選択• 仮想キーの使用

44

開発者ガイドMagic eDeveloper V9 Plus

ソート順序の追加

ソート／一時用データベースの選択
ソートファイルは［動作環境］ダイアログで定義されている［ソート／一時用データベース］を使用して作成されます。

ソート／一時用データベースを選択する：
1. ［設定］メニューから［動作環境］を選択します。
2. ［動作設定］タブを選択します。
3. ［ソート／一時用データベース］にカーソルを移動します。
4. ［データベース一覧］にズームして、データベース名を選択します。このデータベー
スはソートテーブルや埋め込み SQL の結果テーブルのような一時用な保存先として必要なデータベースとなるものです。
例えば、メモリを使用した高速な ISAM データベースは良いパフォーマンスをもたらします。
［データベース］テーブルの［位置］パラメータが指定されている場合は、その一位置にファイルが作成されます。

仮想キーの使用
ソートインデックスを定義するのにデータベーステーブル中に定義する必要はありません。［インデックス特性］ダイアログの［SQL］タブにある［インデックスタイプ］を「R= 実キー」の代わりに「V= 仮想キー」を設定すること以外、通常のインデックスの定義と全く同じです。
これによって、インデックス定義は Magic の内部にのみ定義されていることになります。

データテーブルの共有制御
多数のワークステーションやインスタンスによって共有されているデータは、同時に１つ以上のアクセスを受けないような同期処理を必要とします。プロセスがテーブルに対して行う処理は次のとおりです。
• 読取……プロセスはテーブルを更新することはありません。
• 書込……プロセスはテーブルを更新する場合があります。読取りも可能です。
ここでは以下の内容について説明します。
• アクセスモードの使用• 共有モードの使用• テーブルモードの定義• テーブル共有の相互作用

アクセスモードの使用
アクセスモード とは、テーブルで実行する処理の種類を意味します。
プロセスがテーブルにアクセスする前に、実行する動作モードを定義しておくことにより、テーブルに対して適切なコントロールを実施することができます。このように組み込まれた自動制御によってアクセスを許可するかどうか決定されます。

開発者ガイドMagic eDeveloper V9 Plus45

第 3 章 - データビューの作成
しかし、並行する２つのプロセスのアクセスモードが競合を起こす場合をあらかじめ予
想することはできません。したがって、次に示す共有モードを使用することになります。

共有モードの使用
共有の設定はマルチユーザ環境で使用されます。これは同時に実行されている他のタス
クがどのようにテーブルにアクセスするかを決定します。データベースアクセスモードの定義に際しては、共有モードも定義しておく必要があります。共有モードは他のプロ
セスにどのアクセスモードを許可するかを指定します。
共有アクセスを禁止するには共有モードを「N= なし」（テーブルロック）に設定します。
これは他のプロセスはテーブルにアクセスできないことを示します。

テーブルモードの定義
タスクの［DB テーブル］テーブルでアクセスモードと共有モードを指定します。
［DB テーブル］テーブルには下記の２つカラムがあります。
• アクセス•

W= 書込……「読込／書込」（デフォルト）•

R= 読込……「読込」のみ• 共有•

W= 書込……「読込／書込」（デフォルト）•

R= 読込……「読込」のみ•

N= なし……どのようなモードであってもテーブルの共有を許可しないことを表します。

テーブル共有の相互作用
下記の図は同じテーブルを開く２つのタスクの共有の仕組みを示したものです。プラス（+）マークは、共有可能 でマイナス （‑）はモードが排他状態であることを示します。
プロセス A
アクセスモード

読込

共有

読込

読込

+

+

-

-

-

-

書出

+

+

-

+

+

-

なし

-

-

-

-

-

-

読込

-

+

-

-

-

-

書出

-

+

-

-

+

-

なし

-

-

-

-

-

-

読込
プロセス B
書出

書出
書出

なし

読込

書出

なし

図 3-2 有効なアクセス／共有モード

例えば :プロセス A がテーブルを R/R（アクセス＝ R、共有＝ R）モードで開いている場合 、プ
ロセス B は同じテ−ブルを R/R または R/W で開くことが可能です。
プロセス A がテーブルを R/W で開いている場合、プロセス B は同じテーブルを R/R、R/
W、W/R、または W/W のモードで開くことが可能です。

46

開発者ガイドMagic eDeveloper V9 Plus

データビューのキャッシュプロセス A がテーブルを R/N モードで開いている場合、プロセス B はどんなモードであってもテーブルを開くことはできません。

データビューのキャッシュ
メインテーブルとリンクテーブルに対してMagicキャッシュを使用することができます。
キャッシュは主に、同じデータに何回もアクセスする必要があるときに使われます。
キャッシュを使用することによりディスク I/O を軽減し、パフォーマンスの向上が期待できます。メインテーブルをキャッシュする機能は次の２つのレベルで実現されています。
• テーブル特性 （メインテーブル、リンクテーブルのデフォルト値）• タスク特性
リンクテーブルのキャッシュは、タスクメニューから［DB テーブル］（Ctrl+D）を選択することによって実現します。
Magic キャッシュ機能を使用することにより、一時的なデータの不整合が生じる可能性があります。
ここでは以下の内容について説明します。
• メインテーブルのキャッシュの設定• リンクテーブルのキャッシュの設定• キャッシュ範囲の設定

メインテーブルのキャッシュの設定
メインテーブルのキャッシュを設定する：
テーブル特性の場合 :1. テーブルリポジトリを開く
2. キャッシュしたいテーブルを選択する
3. ［テーブル特性］を開く
4. ［キャッシュ範囲］の欄で「D= 位置とデータ」または「P= 位置」を選択します。
（行の位置のみ）

タスク特性の場合 :1. プログラムリポジトリを開きます。
2. ［タスク特性］の［拡張］タブを開きます。
3. ［キャッシュ範囲］欄で値を指定します。
［テーブル特性］と同じにする場合は、「T=
テーブル特性に依存」を指定します。

リンクテーブルのキャッシュの設定
タスク中のリンクテーブルのキャッシュの指定は、［DB テーブル］テーブルで行います。

開発者ガイドMagic eDeveloper V9 Plus47

第 3 章 - データビューの作成

リンクテーブルのキャッシュを設定する：
1. プログラムリポジトリを開きます。
2. ［DB テーブル］テーブルにズームします。
3. キャッシュを有効／無効にしたいリンクテーブルを選択します。
4. ［キャッシュ］カラムで「Yes」 または 「No」を選択します。
［テーブル特性］の設定になっています。

デフォルト値はキャッシュ範囲の設定［キャッシュ範囲］のパラメータは「P= 位置のみ」、「D= 位置とデータ」、および「N= なし」のいずれかの値になります。
• P= 位置のみ ……キャッシュは取得した行の位置のみを保持します。これはテーブルがメインテーブルとして使用されたときにのみ有効です。この場合、ユーザが逆向きにスクロールすると、行はその物理位置に従って再取得されます。
• D= 位置とデータ …… 位置に加えて、Magicっは実際の行のデータも保持します。その行を再取得した場合、キャッシュに保持されている古いデータが取得されます。
• N= なし …… キャッシュは行いません。

不必要なリンクの最小化
リンクコマンドの条件欄
処理コマンドの［条件］欄を使用して、リンクの条件を設定することができます。この
カラムはユーザに「Yes ／ No ／式」でリンクの条件を定義することを可能にします。この項目は論理型の式であることが必要です。リンク条件は Magic がレコードを取得するかどうかを指定します。

リンク条件の動作
リンク条件：False
リンク条件が「False」と評価されたとき、リンクを失敗したときのような動作になります。
• ［リンク］コマンド内になる全てのカラムはデフォルト値を返します。
• リンクの戻り値は「False」となります。
• ［項目更新］コマンドは条件が「True」と評価されるまで、実行されません。
• レコード後処理の時点でリンク条件が「False」となっているとき、レコード前処理で論理レコードに組み込まれたリンクレコードに対する更新は無視されます。

登録リンク
登録リンクでは、リンク失敗になるケースはありませんが、リンク条件が「False」と評価された場合、次のような動作になります。
• リンクは新しいレコードを作成しません。
• リンク条件が「True」を評価され、レコード後処理まで「True」を評価され続けない
かぎり、代入や更新の動作は行われません。

48

開発者ガイドMagic eDeveloper V9 Plus

埋め込み SQL の使用• リンク条件に関わらず、代入や更新の動作はデータビューには反映されます。
• レコード後処理の時点で、リンク条件が「False」と評価されると、新しいレコードに対するいかなる更新も無視され、新しいレコードは作成されません。

計算• リンク条件はデータビューの作成時点でレコード毎に評価されます。
• リンク条件はレコード閲覧時にレコード前処理でも計算処理が実行されます。

再計算• レコード前処理の開始時からレコード後処理の終了時まで、条件式に使用している変数に変化があった場合、リンク条件の再計算が行われます。

埋め込み SQL の使用
SELECT ステートメントが複雑な場合、埋め込み SQL を使用すると RDBMS サーバ側で行の結合や抽出を行うため、処理速度が速くなります。Magic のタスクのデータビューに指定する行の数も減ります。
またネットワークトラフィックが軽減されるため、クライアント／サーバ環境ではシス
テムの効率が上がります。
埋め込み SQL は、異なる DML（Insert、Update、Delete）操作を実行するために使用できます。
埋め込み SQL では、単一の SQL ステートメントを使用して複数の行の更新や削除が可能です。トランザクションもシンプルで済みます。
実行時の処理がデータ定義言語（DDL）に関する処理や、一時的な処理の場合、埋め込
み SQL を使用して処理を行うことができます。例えば、RDBMS に一時テーブルを作成するときに使用できます。
埋め込み SQL コマンドは、データベースのストアドプロシジャを実行する場合にも使用できます。

ここでは以下の内容について説明します。
• SQL の SELECT 文の定義
• SQL の DML の定義• ストアドプロシージャーの実行
以下の例では Oracle データベースの Scott ユーザを例にとって説明いたします。

SQL SELECT 文の定義
SQL SELECT 文を定義する：
1. プログラムリポジトリを開きます。
2. プログラムを作成しプログラム名を付けます。
3. ［タスク特性］へズームし、オンラインであるデフォルトへ移動します。
4. ［タスク環境］メニューの［SQL コマンド］を選択します。
5. ［データベース］欄で必要なデータベースを選択します。
結果データベースは同じデータベースである必要があります。したがって、同じも開発者ガイドMagic eDeveloper V9 Plus49

第 3 章 - データビューの作成のを選択するか空欄のままにしておきます。
6. SQL コマンドを入力します。Magic の［アシスト］ボタンはクエリーを作成するのに役立ちます。また APG は戻り値が分かっているときに使用できます。
例 : SELECT ENAME, JOB,SAL FROM SCOTT.EMP GROUP BY JOB, ENAME,SAL
HAVING SAL > 1000

データ操作言語（DML）の定義
DML を定義する：
1. プログラムリポジトリを開きます。
2. プログラムを作成します。
3. ［タスク特性］を開き、バッチタスクに設定します。
4. ［タスク環境］メニューの［SQL コマンド］を開きます。
5. ［データベース］欄で必要なデータベースを開きます。
6. データ操作文（ DML）を記述します。この例では更新を例に挙げています。
UPDATE SCOTT.EMP SET COMM=1000

ストアド・プロシージャーの実行
ストアド・プロシージャーを実行する：
1. Oracle SQL*Plus などの RDBMS ツールを使用して、データベース中にストアド・
プロシージャーを作成します。
2. Magic にてプログラムリポジトリを開きます。
3. 新しいプログラムを作成します。
4. ［タスク特性］でタスクタイプをバッチに設定します。
5. ［タスク環境］メニューから［SQL コマンド］を開きます。
6. ［データベース］欄で必要なデータベースを開きます。
7. ［SQL コマンド］欄で EXEC コマンドを以下のように入力します。
exec プロシージャ名（パラメータ）
8. 以下の例のようにパラメータはカンマで区切って入力する必要があります。
EXECUPD_EMP（:1,’:2’）
Magic はタスク前処理を行うよりも先に SQL コマンドを実行します。詳細は『リファレンスマニュアル』の 25 章「SQL に関する考慮事項」を参照してください。

位置付と範囲指定
メインテーブルのデータの範囲と位置付の方法は、セレクトコマンドの［範囲］カラムと［位置付］カラム、［範囲／位置付］ダイアログの［範囲式］と［位置付式］で指定しますが、ここでは［ポジション］を使用した位置付けと範囲指定の方法を説明いたします。

50

開発者ガイドMagic eDeveloper V9 Plus

位置付と範囲指定

ポジションの特徴
ポジション」は、今までの［範囲］と［位置付］パラメータを補完するパラメータです。
このため、その用途によって使い分けることが必要です。
［範囲］と［位置付］パラメー
タに対する［ポジション］の特徴は以下の通りです。
• 範囲／位置付の値が、データベースやカラムの型に依存しない BLOB データなので、仕様が同じでデータベースやテーブル定義の異なるプログラムの変更点が少ない。
• 範囲や位置付の項目が多くても、１つの BLOB 項目で制御することができる。
• ［方法］欄で「F= このポジションから開始する」を指定した場合、複数の項目をあわせて１つの範囲開始を指定することが容易に実現できます。SQLデータベースの場合、
パフォーマンスの向上が期待できます。
• Errposiotion 関数を使用すると、バッチ処理で予期できないエラーのあったレコード位置を格納しておくことができます。
ただし、次の点には注意してください。
• BLOB データなので、値を直接指定することができません。したがって、Currpositon
関数や Errposiotion 関数を格納するためのタスクが必要になります。
• 範囲データ抽出のための方法として「O= このポジションで絞り込む」を指定する場
合、範囲データの最大値と最小値に異なる値を指定することができません。

ポジションを使用したプログラム
ポジションを使用した簡単なプログラム例を紹介します。同じテーブルをメインテーブ
ルとした親子タスク（プログラム）を作成します。

親タスクのポジションを子タスクに渡す
1. メインテーブルを設定した子タスクの［範囲／位置付］ダイアログの［ポジション］
欄にズームして式テーブルに「Currposition(1)」を定義します。
2. ［範囲／位置付］ダイアログの［方法］欄には３種類の選択肢からいずれか１つを選択します。
3. 親タスクからズームアクションで子タスクが起動するように定義します。
このようなプログラムの場合、子タスクを起動すると［方法］欄によって以下のように動作します。
• O= このポジションで絞り込む……親タスクのカレントレコードと同じレコードのみ
表示されます。
• F= このポジションから開始する……親タスクのカレントレコード以降のレコードが表示されます。
• L= このポジションに位置付ける……全てのレコードが表示され、親タスクのカレン
トレコードと同じレコードに位置付けされます。

子タスクのポジションを親タスクに渡す
1. メインテーブルを設定した親タスクに BLOB 型の変数を定義します。
2. ［範囲／位置付］ダイアログの［ポジション］に、変数項目を指定した式番号を設定します。
3. ［範囲／位置付］ダイアログの［方法］に３種類の選択肢からいずれか１つを選択します。
4. 子タスクは、［タスク特性］ダイアログで［選択テーブル］を「Yes」に設定します。

開発者ガイドMagic eDeveloper V9 Plus51

第 3 章 - データビューの作成
レコード後処理で、親タスクの変数項目を Currposition(0) で更新します。
5. 親タスクのタスク前処理で子タスクを起動するようにします。
このプログラムを実行させると、プログラム起動時に子タスクも起動されます。Enter
キーで子タスクが終了すると子タスクのカレントレコードのポジションが親タスクに渡
ります。

52

開発者ガイドMagic eDeveloper V9 Plus4

基本的なプログラミング

この章ではタスクの様々なオブジェクトと、プログラムやタスクの作成、編集について
基本的なことを説明します。

この章では以下のことについて説明いたします。
APG を使った単純なプログラム

54 ページグローバル変数の定義

55 ページメインプログラムの実行制御

56 ページアプリケーション・イベントの定義

56 ページプログラムの終了条件

57 ページ

ブックマーク59 ページ

データ操作の制限

60 ページ

タスク終了後のウィンドウ表示

62 ページ

イベント処理の利用例

63 ページ

タスクツリーの操作

64 ページ

開発者ガイドMagic eDeveloper V9 Plus

53

第 4 章 - 基本的なプログラミング

APG を使った単純なプログラム
APG（Automatic Program Generator）はテーブルリポジトリやプログラムリポジトリのエントリからプログラムを作成することができます。
APG は次のような目的のプログラムを作成します。
• データ入力とメンテナンス用のオンラインプログラム• データベースのデータを OS のテキストファイルへ出力するバッチプログラム• テキストファイルからデータベースへデータを入力するバッチプログラム• 印刷プログラム• Web プログラム（HTML 結果画面、HTML 入力画面、ブラウザタスク）［APG］ダイアログには以下のタブがあります。
•

APG

•

スタイル

•

インターネット

ここでは以下の内容について説明します。
• テーブルリポジトリからのプログラム作成• プログラムリポジトリからのプログラム作成

テーブルリポジトリからの作成
テーブルリポジトリからプログラムを作成する：
1. テーブルリポジトリのテーブルにカーソルを置きます。
2. Ctrl+G を押すか［オプション］メニューから［APG］を選択し、［APG］ダイアロ
グを開きます。
3. APG のパラメータを設定して［OK］をクリックします。

複数テーブルからプログラムの作成／実行を行う：
1. カーソルをテーブルリポジトリのタイトル行へ移動します。
2. ［オプション］メニューから［APG］を選択し、［APG］ダイアログを開きます。
［APG］ダイアログを開く前にテーブルリポジトリ全体のチェック処理が実行されます。テーブルの定義内容に問題があった場合はメッセージペインにエラー内容が表示され、［APG］ダイアログは開きません。
3. デフォルト設定のまま実行するか、実行する前に以下のオプションを選択します。

［APG］タブの設定項目• タグテーブル……テーブルの選択方法•

A= 全部…全てのテーブルが APG の対象となります。

•

S= 選択…選択されると、［テーブル選択］ウィンドウが表示されるので、下記の選択方法を参考にテーブルを選択してください。

•

N= なし…このオプションを選択すると APG はプログラムを作成しません。

• 選択テーブル……選択されたテーブル数を表示します。

54

開発者ガイドMagic eDeveloper V9 Plus

グローバル変数の定義• 処理モード……APG の処理モードです。
•

E= 実行…プログラムを実行します。

•

G= 作成…プログラムを作成します。

• オプション……（これらの説明は前述のオプションの説明欄を参照してください。）
•

Q= 照会

•

E= 出力

•

I= 入力

•

P= 印刷

複数のテーブルから Web プログラムを作成することはできません。

テーブルを選択する：
1. ［タグテーブル］欄で「S= 選択」を選びます。
［テーブル選択］リストが開きます。
2. 選択したいテーブルを選び、Space キーを押すと、右側の［選択］カラムに選択マークが表示されます。選択が終わりましたら、［選択］ボタンをクリックして確認してください。
［選択テーブル］欄には選択したテーブルの数が表示されます。
3. 選択した各テーブルについて、Magic はプログラムを作成します。

プログラムリポジトリからの作成
プログラムリポジトリでプログラムを作成する：
1. プログラムリポジトリを開いて Ctrl+G を押し、［APG］ダイアログを開きます。
2. ［オプション］欄で作成したいプログラムのタイプを選択します。
プログラムリポジトリから作成したときは［処理モード］が表示されません。

3. カーソルを［メインテーブル］欄へ移動し、［テーブル一覧］へズームして選択します。

グローバル変数の定義
実行モードでアプリケーションを開くと、自動的にメインプログラムが実行されます。
ここで定義されている変数はグローバル変数といい、アプリケーション内のプログラム間で共有することができます。
下記のいずれかの方法でグローバル変数を定義することが可能です。
• ［セレクト］コマンドで変数項目を定義します。
• ［リンク］コマンドでテーブルをリンクし、テーブル中の実項目を［セレクト］コマ
ンドで定義します。
メインプログラム内で定義したリンクテーブルのレコードを更新することはできません。またいかなるロックやトランザクション関係のコマンドも使用できません。

開発者ガイドMagic eDeveloper V9 Plus

55

第 4 章 - 基本的なプログラミング
親タスクで定義された変数を子タスクで更新しても再計算されません。このため、メインプログラムで定義した変数を更新しても、この変数を使用して代入やリンクで使用している全てのプログラムでは再計算が実行されません。
グローバル変数と同じようにアプリケーション間でデータを共有するには、以下の方法もあります。
• SetParam と GetParam の関数を使用します。
• INIPut と INIGet 関数を使用します。この場合、異なるインスタンスの間で MAGIC.INI
を介して共有することが可能です。

メインプログラムの実行制御
メインプログラムは実行モードに入ったときに自動的に実行されます。実行モードでア
プリケーションを終了するときや、開発モードから実行モードに切り替わった場合（その逆の場合）でもメインプログラムが再実行されます。Magic の実行モードとは以下のような状態をいいます。
• 実行エンジンでアプリケーションが実行している状態• プログラムが開発版エンジンで実行されていて、実行モードで起動された状態• プログラムが開発版エンジンで実行されていて、アプリケーションが開発モードから実行モードに切替られた状態（Ctrl+T）• プログラムが開発版エンジンで実行されていて、プログラムが F7 キーによって実行された状態
RunMode 関数を使用して、メインプログラムの実行を制御できます。
1. RunMode 関数を使用した条件式をもとに実行する処理コマンドを記述します。
2. RunMode 関数で認識できる状態は以下のとおりです。
•

最初のスレッド …… RunMode()=‑1•

実行エンジン …… RunMode()=0•

実行モードで起動 …… RunMode()=1•

実行モードに切替 （Ctrl+T）…… RunMode()=2•

開発モード（F7）…… RunMode()=3RunMode 関数の条件は、式が使用できるところならどこにでも使用可能です。

アプリケーション・イベントの定義
Magic Ver.9 では、CTL イベントテーブル（Shift+F8）が削除されました。替わりに、ア
プリケーションレベルのイベントを定義する必要のあるときは、メインプログラムの中で定義するようになりました。

アプリケーション・イベントを定義する：
1. メインプログラムの［イベント］テーブル（Ctrl+K）にイベントを定義します。
2. そのイベントに対するハンドラを定義します。

56

開発者ガイドMagic eDeveloper V9 Plus

プログラムの終了条件

イベントの定義
イベントを定義する：
1. プログラムリポジトリからメインプログラムを選択しズームします。
2. ［タスク環境］メニューから［ユーザイベント］を選択します。
（または Ctrl+K ）3. １行追加し、名前を付けます。
4. ［タイプ］を選択します。デフォルトは「S= システム」です。
5. ［トリガ］カラムからズームして、トリガを設定します。トリガはイベントタイプ
によって設定内容が変わります。
•

S= システム…［キー設定］ダイアログでショートカットキーを選択します。

•

I= 内部…アクション一覧からアクションを選択します。

•

T= タイマー…時間を設定します。

•

N= 式…式を定義します。

6. ［強制終了］のオプションを選択し、［OK］をクリックします。
7. ［OK］を押してタスク画面に戻ります。
メインプログラムでイベントを定義すると、全てのプログラムで使用することができます。ただし、プログラム中からこれらを変更したり削除することはできません。

ハンドラの定義
メインプログラムでのハンドラの定義は、プログラムにおける［ハンドラ］レベルの定義とほぼ同様ですが、下記の項目に関して異なる部分があります。
• メインプログラムのハンドラ定義には「C= コントロール」は存在しません。
• 通常のハンドラ定義にはない「G= グローバル」という［スコープ］オプションがあります。
タスク定義の［スコープ］カラムでは、以下の３つの値が選択できます。
•

T= タスク……ハンドラはタスク内のイベントに対して実行されます。アプリ
ケーションイベントには適切ではありません。

•

S= サブツリー……ハンドラはタスク内と全ての子タスク内のイベントに対して実行されます。アプリケーションイベントの場合は、そのアプリケーション
内でのみ有効です。

•

G= グローバル……コンポーネント化したアプリケーションでグローバルに設定されたハンドラが、ホストアプリケーションで有効となります。

プログラムの終了条件
デフォルトの設定では終了のアクション、例えば Esc キーを発行すると、オンラインプ
ログラムは終了します。
• メインテーブルが設定されているバッチタスクでは、範囲指定されている全てのレ
コードの処理が終わると終了します

開発者ガイドMagic eDeveloper V9 Plus57

第 4 章 - 基本的なプログラミング• メインテーブルが設定されていないバッチプログラムは、以下に述べる終了条件を指定しないと無限ループとして回り続けます。

プログラムの終了
プログラムに終了条件を設定する：
1. タスクの画面から Ctrl+P を押して［タスク特性］を開きます。
2. ［タスク終了条件］欄で次のオプションを選択します。この条件がタスクを終了させる条件となります。
•

No （デフォルト）

•

Yes

•

式（式を選択します。）

3. ［チェック時期］欄でチェック時期を設定します。選択肢は :•B= 前置…… 終了条件はレコード前処理に入る前にチェックされます。

•

A= 後置…… 終了条件はレコード後処理が終わった後にチェックされます。

•

I= 即時……各処理の前にチェックされます。

• 条件が Yes（「True」）と評価されれば、タスクは終了します。終了条件を設定していないときは、オンラインタスクは「クローズ」または「終了」のイベントを受け取るか Esc キーが押された場合に終了します。
• バッチタスクでメインテーブルを設定していないときは、終了条件を必ず設定してください。そうでないと Magic のタスクは無限ループに入り、応答しなくなります。メインテーブルがあるときは、範囲内の全てのレコードに対する処理が終わるとタスクが終了します。
プログラムを終了する別の方法としては、「終了」のアクションをタスク内で発行することです。

［イベント実行］コマンドの使用
Magic Ver.9 から新たに追加された［イベント実行］コマンドは、タスク内のどの実行レベルからでもイベントを発行することができます。このコマンドを使用し、「終了」の内部イベントを発行してタスクを終了することや、タスク内のイベントを処理することが可能です。
このコマンドには、［ウェイト］の設定があります。これにより Magic がイベントを処理するまで全てのタスクの処理を一時中断するか、イベントを発行しても処理を続けるかどうか指定します。
また、パラメータ項目を使用して、イベントハンドラにパラメータを渡すことが可能です。

［イベント実行］コマンドを使用する：
1. プログラムリポジトリでプログラムを選択します。
2. タスクのレコードメインへズームし、［処理テーブル］へ移動します。
3. ［イベント実行］コマンドを選択します。
4. ［名前］カラムへ移動し、［イベント］ダイアログへズームします。

58

開発者ガイドMagic eDeveloper V9 Plus

ブックマーク
5. イベントタイプを選択します。
「システム」、「内部」、「ユーザ」、「公開イベント」が選択可能です。
イベントタイプ

ズーム先

使用方法

S= システム［キー設定］ダイアログ

キー操作によるイベントをトリガにする場合I= 内部［アクション一覧］

Magic の内部イベントをトリガにする場合

U= ユーザ［イベント一覧］

イベントテーブルで定義した
ユーザイベントをトリガにする
場合

P= 公開イベント ［式］テーブル

メインプログラムの［イベント］
テーブルに登録されている［公開イベント名］を指定する場合

イベント処理でタスクを終了させる：
Magic Ver.9 より以前のバージョンでは、アクションを発行する場合に以下のような関数を使用していました。
KbPut（’ 終了 ’ACT）または KbPut（‘ESC’KBD）
上記の例では、KbPut 関数を使用してアクションを発行することでタスクを終了させます。
Magic Ver.9 で同じ処理を実行するには、以下のような方法があります。
• あるタスクレベルに［アクション］コマンドを定義し上記のように KbPut 関数を実行します。このコマンドを実行すると、タスクを終了します。
• ある項目からズームすると［イベント実行］コマンドが実行するように定義し、このコマンドの実行イベントとして「終了」を設定します。
• フォームにプッシュボタンを配置し、実行イベントとして「’ 終了 ’ACT」を定義します。
できるだけ KbPut 関数の使用を避けることを推奨します。これは［キーボード休止
秒数］に影響し、望まない動作を引き起こす可能性があるからです。また、ブラウザ
クライアントプログラムでは、KbPut 関数は使用できません。
Magic Ver9 では［イベント実行］コマンドを使用することを推奨します。
［イベント実行］
コマンドでは［ウェイト］パラメータを使用することもできます。
変数項目をタスク終了のフラグとして、［タスク終了条件］欄で使用することも可能です。

ブックマークナビゲータは新しく追加された機能で、開発画面の様々な場所へ移動することができます。また特定のオブジェクトに容易にアクセスするためにブックマークを設定しておくことが可能です。ブックマークは CTL ファイル内に保存され、［ナビゲータ］ペインを通して使用できます。

ブックマークの使用
アプリケーションのどのオブジェクトにも、ブックマークを定義することができます。

開発者ガイドMagic eDeveloper V9 Plus59

第 4 章 - 基本的なプログラミング

ブックマークを登録する：
1. ［オプション］メニューから［ブックマーク］を選択するか、Ctrl+B を押します。
［ブックマーク］ダイアログが開きます。
2. ［ブックマーク］ダイアログでブックマーク名を入力し、［OK］をクリックします。

ブックマークを付けた場所に移動する：
1. Alt+F1 を押して［ナビゲータ］ペインを開きます。
2. コンボボックスより［ブックマーク］を選択すると、現在登録されているブックマー
クのリストが表示されます。
3. 必要なブックマークを選択しダブルクリックすると、目的のオブジェクトにカーソルが移動します。
ブックマークは全てのユーザで共有できます。したがって、各ブックマークには、それがどこを指しているのか他のユーザに理解しやすい名前をつけるようにしてください。

データ操作の制限
オンラインプログラムで、エンドユーザにデータの操作を制限したい場合があります。
例えば次のような場合です。
• データの更新を禁止したい場合• 画面上の表示内容の変更を禁止したい場合• 画面そのものへの変更を禁止したい場合• ユーザによる不特定な変更を禁止したい場合
ここでは以下の内容について説明します。
• タスク特性の項目設定• ［オプション］メニューの制限• ［オプション］メニューの無効化• カーソル操作の制限• データ操作の禁止

タスク特性の項目設定［初期モード］を選択する：
1. ［タスク特性］の［特性］タブを開き、タスク開始時のモードを選択します。デフォ
ルトは修正モードになっています。
ここで選択されたモードがユーザがプログラムを実行したときのモードとなります。
2. ［初期モード］を式で指定したいときは［式］のオプションを使用します。
これによりプログラム内で動的に初期モードを変更することが可能です。例えば次の例です。
IF （TDepth（）>1,’Q’MODE,’M’MODE）

60

定義されたタスクがルートになる場合は修正モードで、他のプログラムからコール開発者ガイドMagic eDeveloper V9 Plus

データ操作の制限
されたときは照会モードで起動します。

［オプション］メニューの制限
初期モードが設定されていても、エンドユーザは［オプション］メニューでモードを切り替えることが可能です。したがって、照会モードで起動しても修正モードや登録モードに切り替えることが可能です。
［オプション］メニューを使用すれば、エンドユーザは以下のことが可能です。
• レコードの位置付け• レコードの範囲指定• タスクのメインテーブルにアクセスするインデックスの変更• ユーザが定義した条件でのレコードのソート
また、設定で許可されていれば、［編集］メニューを使用して、データベースからレコードを削除することも可能です。
いろいろなケースで、開発者はこれらの動作をエンドユーザに行わせたくない場合があります。［タスク特性］ダイアログで、これらを制御することが可能です。

［オプション］メニューの無効化
エンドユーザの［オプション］メニューへのアクセスを禁止するには、［タスク制御］ダ
イアログの［メニュー使用］欄を「No」に設定するか、式で「False」になる条件を設定します。これにより、修正、照会、削除、位置付け、範囲、インデックスの変更ができなくなります。

カーソル操作の制御
ユーザによるカーソルの移動を制御する：
1. タスクのレコードメインにおいて、［セレクト］コマンドの［条件］カラムを使用します。これにより、特定の項目にのみカーソルを移動し、変更を許可することが可能となります。
2. この［条件］欄を「Yes」、「No」、または論理値を返す式を設定します。条件が「No」
または「False」と評価されたときは、カーソルをその項目に移動することができません。
3. 別の方法としては、タスクのメインフォームを開き、コントロール特性の［有効］
欄に「False」になる条件式を設定することで、カーソルがパークできなくなります。

データ操作の禁止
データ操作を禁止する方法には、フォーム上のコントロールに対する制限とタスクがオープンするテーブルのオープンモードを指定する方法があります。

フォーム上のコントロールを制御する：
1. Ctrl+U を押して、メインフォームを開きます。
2. 入力を制限したいコントロールにカーソルを置き、［コントロール特性］シートを開きます。

開発者ガイドMagic eDeveloper V9 Plus61

第 4 章 - 基本的なプログラミング
3. ［入力］セクションの［修正許可］欄を「No」または「False」と評価される式を設定します。これによって、Magic はエンドユーザによる修正を禁止し、照会モードのように動作します。

テーブルのオープンモードを制御する：
1. Ctrl+D を押して、［DB テーブル］テーブルを開きます。
2. ［アクセス］カラムを「R= 読込」に設定します。これにより、テーブルへの書込みを防止します。読込モードでオープンされたテーブルを更新した場合、エラーが発生しタスクはアボートされます。

タスク終了後のウィンドウ表示
アプリケーションによっては、タスク終了後もデータを表示させる必要のある場合があります。

タスクを終了してもウィンドウを閉じないようにする：
1. Ctrl+C を押して［タスク制御］ダイアログを開きます。
2. ［ウィンドウ消去］欄で 「No」を選択します。
これによってプログラムやタスク終了後も最後のウィンドウを表示したままになります。
「Yes」に設定した場合は、タスク終了時に画面は消去されます。

［タスク特性］ダイアログの使用
タスクやプログラムのウィンドウを表示したままにしておくもう１つの方法は、タスクの終了条件をコントロールしてタスクを終了させないようにすることです。これは［タスク特性］ダイアログで行います。

タスクやプログラムの終了時期を制御する：
1. Ctrl+P を押して［タスク特性］ダイアログを開きます。
2. ［タスク終了条件］で「No」を選択するか、「False」になる式を定義します。
3.

［チェック時期］欄を設定します。選択肢は以下の通りです。
•

B= 前置…… 終了条件はレコード前処理に入る前にチェックされます。

•

A= 後置…… 終了条件はレコード後処理が終わった後にチェックされます。

•

I= 即時……各オペレーションの前にチェックされます。

4. 条件が Yes（「True」）と評価されるまでタスクはオープンし続けます。終了条件を設定していないときは、オンラインタスクは「クローズ」または「終了」のイベントを受け取るか Esc キーが押された場合に終了します。
5. バッチタスクでメインテーブルを設定していないときは、終了条件を必ず設定してください。そうでないと Magic のタスクは無限ループに入り、応答しなくなります。
メインテーブルがあるときは 範囲内の全てのレコードに対する処理が終わるとタスクが終了します。

62

開発者ガイドMagic eDeveloper V9 Plus

イベント処理の利用例

イベント処理の利用例
イベントを利用した例として、レコード削除処理で確認メッセージを出さないようにするプログラムを紹介します。
エンドユーザがレコードを削除するときの確認が不要な場合があります。プログラムの作り方によっては、このような仕組みを実現することも可能です。

レコード削除時の確認メッセージを出さないようにする：
1. ［タスク定義］でハンドラ を作成します。
2. ［イベント ］欄でズームし、［イベント］ダイアログを開きます。
3. ［イベントタイプ］で「S= システム」を選択し、［イベント］欄からズームして［キー設定］ダイアログを開きます。F3 キーを押してイベントに割当てます。
4. ［処理テーブル］で F4 を押して１行作成し、コマンドリストから［コール］コマン
ドを選択します。
5. F4 をもう一度押してもう１行作成し、［イベント実行］コマンドを選択します。
6. 内容の項目でズームして［イベントダイアログ］を開き、イベントは「I= 内部」を設定します。
［イベント］欄からズームして［アクション一覧］を開き、「前行」を選択します。
［選択］ボタンをクリックしてイベントダイアログへ戻ります。
［OK］
を選択します。
［ウェイト］カラムは「No」に設定します。
7. もう一度 F4 を押して行を作成し、［イベント実行］コマンドを選択します。
8. 内容の項目でズームして［イベント］ダイアログを開き、イベントは「I= 内部」を設定します。
［イベント］欄からズームして［アクション一覧］を開き、「ビュー再表示」を選択します。
［選択］ボタンをクリックして［イベント］ダイアログへ戻ります。［OK］を選択します。
［ウェイト］カラムは「No」に設定します。
9. #4 の［コール］コマンドで起動されるタスクを作成します。Ctrl+P を押して［タスク特性］ダイアログを開きます。
［タスクタイプ］は「B= バッチ」を選択します。
［初期モード］は「D= 削除」を選択します。
［タスク終了条件］は「Yes」に設定します。
［チェック時期］は「A= 後置」を選択します。
［メインテーブル］は、親タスクと同じテーブルを指定します。
［タスク制御］ダイアログで［メニュー使用］を「No」にします。
レコードメインの［処理テーブル］に移動して、インデックスのセグメントカラム
を［セレクト］コマンドで定義します。
［範囲］欄の大小にそれぞれ、親タスクで定義している同じテーブルの同じカラムを指定します。
10. ［OK］をクリックします。
以上のようにすることで、F3 キーを押すとレコード削除タスクが実行され、確認ダイア
ログを表示しないで現在のレコードが削除されます。

開発者ガイドMagic eDeveloper V9 Plus

63

第 4 章 - 基本的なプログラミング

タスクツリーの操作
Magic のプログラムを構成するタスクは、ナビゲータペイン上でツリー表示されます。タ
スクの追加、選択、削除、移動、複写などの操作はこのタスクツリー上で行うことができます。

図 4-1 タスクツリー

ここでは、プログラムリポジトリから特定のプログラムにズームしてからの タスクツ
リー上での以下の操作について説明いたします。
• タスクの追加• タスクの削除• タスクの移動• タスクの複写• タスク名の変更• 親タスクの作成

タスクの追加追加したいタスクの親タスクのアイコンを右クリックします。コンテキストメニューの［行作成（R）］を選択するか、F4 キーを押下します。
［タスク特性］ダイアログガ表示されるので、ここからタスクの定義処理を行って下さい。

タスクの削除削除したいタスクのアイコンを右クリックします。コンテキストメニューの［行削除成（I）］を選択するか、F3 キーを押下します。
［確認］ダイアログが表示され、「はい（Yes）」
を選択すると削除されます。
削除タスクの子タスクも全て削除されます。

タスクの移動タスクの移動は、２つの方法があります。

64

開発者ガイドMagic eDeveloper V9 Plus

タスクツリーの操作

コンテキストメニューを利用する場合
移動したいタスクのアイコンを右クリックします。コンテキストメニューの［切り取り（T）］を選択します。移動したいタスクの親タスク上にカーソルを移動し、コンテキスト
メニューの［貼り付け（T）］を選択します。以下のサブメニューが表示されるのでどれかを選択します。

図 4-2 タスクの貼付• サブツリー貼付け……カーソルのあるタスクの子タスクとして貼り付けます。
• 別のツリーに貼付……カーソルのあるタスクの兄弟のタスクとして貼り付けます。
• 上書登録……カーソルのあるタスクを上書きします。
移動するタスクの全てのサブタスクも移動されます。

ドラッグ & ドロップ機能を利用する場合
移動したいタスクのアイコンを右クリックします。マウスを右クリックした状態で移動したい親タスクのアイコンにドラッグ & ドロップします。（移動するタスクが透過表示されます。）

図 4-3 タスクのドラッグ & ドロップ開発者ガイドMagic eDeveloper V9 Plus65

第 4 章 - 基本的なプログラミング

タスクの複写複写したいタスクのアイコンを右クリックします。コンテキストメニューの［切り取り（T）］を選択します。複写したいタスクの親タスク上にカーソルを移動し、コンテキスト
メニューの［貼り付け（T）］を選択します。
他のプログラムに貼り付けることもできます。

タスク名の変更
変更したいタスクのアイコンを右クリックします。コンテキストメニューの［ツリー編集（D）］を選択するとタスク名が変更できる状態になります。
（タスク特性で変更することもできます。）

親タスクの作成
親タスクを作成したいタスクのアイコンを右クリックします。コンテキストメニューの［親タスク作成（P）］を選択するとそのタスクの上位にタスクが作成され、［タスク特性］
ダイアログが表示されます。タスクが子タスクの場合、既存の親タスクとそのタスクの間にタスクが追加されます。

図 4-4 親タスクの作成

66

開発者ガイドMagic eDeveloper V9 Plus

5

オンラインタスクの作成

この章ではオンラインタスクとその作成方法について解説いたします

この章では以下のことについて説明いたします。
タスクの初期モード

68 ページ

選択プログラムの作成

68 ページ

コンテキストメニューの定義

71 ページ

データビューの変更の自動的保存

72 ページ

ユーザステップの再確認

74 ページ

コントロールモデルの利用

74 ページ

開発者ガイドMagic eDeveloper V9 Plus67

第 5 章 - オンラインタスクの作成

タスクの初期モード
タスク特性には、［初期モード］というパラメータがあります。この指定内容によってタスクの起動時の状態（照会モード、修正モードなど）が定義できます。この指定は、式を用いて動的に指定することも可能です。
ここでは以下の内容について説明します。
• ［初期モード（式）の使用• 式を使用する上での注意点［初期モード（式）］の使用［初期モード（式）］を選択する：
1. ［タスク特性］ダイアログを開きます。
2. ［特性］タブの［初期モード］の［式］欄へカーソルを移動します。これにより、式の指定が可能になります。
3. 式番号を入力するか、ズームして式テーブルから選択します。この式は実行モードにおいて初期モードを決定する場合に使用されます。

式を使用する上での注意点
初期モードはタスクの実行が開始されてすぐに評価されます。この段階ではタスクの変数はまだ使用できません。したがって、式に変数を使用する場合はパラメータとして受け取ったものか、親タスクの変数である必要があります。
初期モードを動的変更に使用するための式が有効なものでない場合、エラーメッセージが表示され、エンドユーザにタスク終了を通知します。
初期モードの式では、モードを表す文字と MODE リテラルを使用してモードを指定します。この MODE リテラルの前の文字がチェックされてモードとして指定されます。MODE
リテラルの前の文字が無効な文字であった場合、その文字は自動的に削除されます。
MODE リテラルは内部表現の形で格納されます。

選択プログラムの作成
ユーザフレンドリーなデータ入力アプリケーションでは、データを入力する際に、ある項目でズームをし、一覧テーブルから値を選択することがあります。
［コール］コマンドでプログラムやタスクをコールし、パラメータを受け渡しすることにより、このような機能を組み込むことが可能ですが、別な方法として、選択プログラムをを作成して、項目から起動するように設定することもできます。この場合、容易にテーブルからデータを選択することができるようになります。
ここでは以下の内容について説明します。
• 選択プログラムの作成• 選択プログラムをカラムに割り付ける• 選択プログラムの実行

68

開発者ガイドMagic eDeveloper V9 Plus

選択プログラムの作成

選択プログラムの作成［タスク特性］の［選択プログラム］特性を有効にすることで、Enter キー（または、「選択」アクション）を押すとレコードの修正を行わなくてもレコード後処理を通過してタスクを終了するようになります。この動作を利用して項目の選択プログラムを作成できます。これは、ユーザが意図的にそれを選択し、他のインスタンスの選択を無視する場
合に限り有効です。
以下に示す選択プログラムの例は、パラメータを受け取り、ユーザからの選択処理（「選択」アクション）が実行された場合に値を返し、選択されなかった（「終了」アクション）場合に元の値を返します。

選択プログラムを作成する：
1. プログラムリポジトリに１行作成しプログラム名を入力します。
2. ズームして［タスク定義］ウィンドウを開きます。新規のタスクの場合は、自動的に［タスク特性］ダイアログを開きます。
3. ［タスクタイプ］を「O= オンライン」に設定し、［メインテーブル］欄でズームして使用するテーブルを選択します。
4. ［高度な設定］タブをクリックして、［選択テーブル］欄を「Yes」に設定します。
実行時に「True」になる式を指定することも可能です。［OK］をクリックします。
5. タスクの［レコードメイン］レベルでセレクトコマンドでパラメータ項目を定義します。パラメータ項目の型と書式はこのプログラムを呼び出するプログラムのパラメータまたは、選択プログラムを割り付けるカラムと一致していなければいけません。選択プログラムとして、カラムに割り付ける場合は、パラメータは一つしか渡せません。
通常、メインテーブルのインデックス（ユニークインデックス）のセグメント項目と同じになります。
6. セレクトコマンドでメインテーブルのカラムを定義します。
7. ［タスク環境］メニューから［フォーム］を選択して［フォーム］リポジトリを開き、ズームして［フォーム］エディタを開きます。
8. ［コントロール］パレットからテーブルをフォームに配置し、［項目］パレットから
メインテーブルのカラムをテーブルに配置します。
9. ［コントロール］パレットからプッシュボタンをフォームに配置します。プッシュ
ボタンの［コントロール特性］シートを開き、［実行イベント］欄に「I= 内部イベン
ト」／「選択」を定義します。もう１つ別のプッシュボタンを配置し、同じように「I= 内部イベント」／「終了」を定義します。
10. ［レコード後処理］レベルに項目更新コマンドを定義して、パラメータ項目にテー
ブルのカラムの値を入力するようにします。
11. 別のプログラムからこのプログラムを呼び出し、パラメータの値が渡され、戻り値が返されることを確認してください。

選択プログラムをカラムに割り付ける
Magic では、選択プログラムを特定のカラムに関連付けることができます。そのためには、下記のオブジェクトで、選択プログラムを指定する必要があります。
•

モデル特性

•

カラム特性

•

変数特性

開発者ガイドMagic eDeveloper V9 Plus69

第 5 章 - オンラインタスクの作成•

コントロール特性

モデルに対して選択テーブルを関連付けた場合、そのモデルを使用している全てのカラ
ムやコントロールに対して、自動的に選択プログラムを関連付けられます。
［カラム／変数特性］や［コントロール特性］で選択テーブルの定義を変更すると、変更内容が有効になります。
［カラム特性］でカラムに対して選択プログラムが割当てられているときは、そのカラムが使用しているコントロールに対して、自動的に選択プログラムが割当てられます。
［コ
ントロール特性］で選択テーブルの定義を変更すると、変更内容が有効になります。

モデル特性
1. モデルリポジトリを開きます。
2. Ctrl+P を押すか［ワークスペース］メニューの［特性シート］を選択して、［特性］
シートを開きます。
3. ［入力］セクションの［選択プログラム］にカーソルを置きます。
4. ［プログラム一覧］にズームしてプログラムを指定します。
5. ［起動モード］の設定で、プログラムがどのようにコールされるかを指定します。
指定内容によって以下のように動作します。
•

B= 前置……プログラムを呼び出すにはズームアクションが必要になります。プ
ログラムを終了するとカーソルはパークしたカラム上に位置付けられます。

•

A= 後置……プログラムを呼び出すにはズームアクションが必要になります。プ
ログラムを終了するとカーソルは次のパーク可能カラム上に位置付けられます。

•

P= 自動……選択プログラムはカラムにパークした際に自動的に起動されます。
プログラムを終了するとカーソルはパークしたカラム上に位置付けられます。

カラム特性
1. テーブルリポジトリの［カラム］からズームして、Ctrl+P を押して［カラム特性］
シートを開きます。
2. モデル特性の説明の #3 から #5 までの手順に従います。

プログラムの変数特性
1. 変数の［セレクト］コマンドからズームし、Ctrl+P を押して［変数特性］シートを開きます。
2. モデル特性の説明の #3 から #5 までの手順に従います。

コントロール特性
1. ［フォーム一覧］からズームして、［コントロール］パレットを表示します。
2. コントロールを選択してパレットへ配置します。Ctrl+P を押して［コントロール特性］シートを開きます。
3. モデル特性の説明の #3 から #5 までの手順に従います。

選択プログラムの実行
選択プログラムを使用するには、通常はカラムにプログラムを割り当てます。

70

開発者ガイドMagic eDeveloper V9 Plus

コンテキストメニューの定義
カラムに［選択プログラム］が関連付けられていると、そのカラムは自動的にズーム可能なカラムとなります。
実行環境では、選択プログラムは以下のように動作します。
• カラムに関連付けられた選択プログラムが起動します。その際にカラムの値がパラメータとして渡されます。
• エンジンは選択プログラムを通常のオンラインタスクとして起動しますが、終了方法
が通常と異なります。

エンドユーザによって「選択」アクションが発行された場合
1. レコードメインを終了します。
2. レコード後処理を実行します。
（レコード後処理にパラメータに対する項目更新を定義します。）
3. タスクを終了し、選択された値によって元のカラムが更新されます。

エンドユーザによって「終了」アクションが発行された場合
1. エンジンは値を更新しないでタスクを終了させます。

コンテキストメニューの定義
Magic Ver.9 では２つの標準メニューが提供されていますが、これとは別に、メニューリ
ポジトリにアプリケーションに対応したコンテキストメニューを追加定義することが可能です。このコンテキストメニューを［タスク特性］の［ショートカットメニュー］に指定することで、プログラム実行中にコンテキストメニューとして表示させることができます。
［ショートカットメニュー］オプションはオンラインタスクでのみ有効です。

ここでは以下の内容について説明します。
• コンテキストメニューの追加• プログラムにコンテキストメニューを定義する

コンテキストメニュの追加
コンテキストメニューを追加する：
1. メニュー リポジトリで１行作成してメニュー名を入力します。
2. ［メニュー定義］画面にズームして１行作成します。
3. ［タイプ］欄でメニューのタイプを選択します。
4. メニューのタイプに応じて以下のように指定します。
•

P= プログラム …［パラメータ］欄でズームすることで関連づけるプログラムを選択することができます。

•

E=OS コマンド…［パラメータ］欄でズームすることで実行した OS コマンド
（プログラム実行名）を選択することができます。

•

V= イベント…［パラメータ］欄でズームすることで、システムイベントや内部イベント、ユーザイベントを選択することができます。

開発者ガイドMagic eDeveloper V9 Plus71

第 5 章 - オンラインタスクの作成•

L= ライン…何も指定する必要はありません。

•

M= メニュー…［パラメータ］欄でズームすることで、サブメニューを登録することができるようになります。

プログラムにコンテキストメニューを定義
プログラムにコンテキストメニューを定義する：
1. メニューを定義したいプログラムにズームします。
2. ［タスク特性］ダイアログ（Ctrl+P）を開いて、［高度な設定］タブをクリックしてください。
3. ［ショートカットメニュー］欄からズームして［メニュー一覧］を開きます。
4. 表示させるメニューを選択して、［OK］をクリックしてください。メニュー番号が設定欄に表示されます。
実行時は、該当するタスクが実行している状態でエンドユーザが右クリックすると指定したコンテキストメニューが表示されます。定義されていないタスクの場合は、Magic の
デフォルトのコンテキストメニューが表示されます。

データビューの変更の自動的保存
Magic ではデータベースに対して更新処理が行われるのは、レコード後処理を通るときのみです。
バッチタスクではレコード毎にレコード後処理を通りますが、オンラインタスクではユーザが１つ以上の実項目に何らかの変更を加えたときのみ、自動的にレコード後処理を通るようになります。ユーザが修正を行わない場合はレコードを更新する必要が無く、レコード後処理を通る必要もないからです。
しかし、ユーザが変更を行わない場合でも、エンジンがレコード後処理を必ず通るように設定することが可能です。
ここでは以下の内容について説明します。
• ［タスク制御］の［強制レコード後処理］を使用• 項目更新コマンドの［中止］を使用• ユーザイベントの［強制終了］を使用［タスク制御］の［強制レコード後処理］を使用
ユーザが項目を更新しなくてもエンジンがレコード後処理を通るようにするには以下のようにします。
1. プログラムを選択し、［タスク定義］にズームします。
2. ［タスク環境］メニューから［タスク制御］ダイアログを開きます。
3. ［オプション］タブにある［強制レコード後処理］を「Yes」に設定します。式を指定することでこの指定を動的に変更することができます。

72

開発者ガイドMagic eDeveloper V9 Plus

データビューの変更の自動的保存［項目更新］コマンドの［中止］パラメータを使用［止］パラメータは項目更新の実行後、［編集／取消］（F2）コマンドをユーザに対して有効にするかどうかを指定するものです。レコードメインで［止］パラメータを「No」にした項目更新が定義されていると、ユーザによるレコードの更新処理が無くてもレコー
ド後処理を通ることになります。この動作を利用して以下のようにプログラムを作成します。
1. タスク定義へ移動します。
2. レコードメインで１行作成してセレクトコマンドを定義して更新用のダミーの変数
項目を定義します。（型は文字型か数値型にします。書式は任意です。）
3. レコードメインの先頭に１行作成して、項目更新コマンドを定義します。#2 で定義した変数項目を任意の値で更新するように指定します。ここで、［止］パラメータを「No」に指定します。
これにより、レコードの更新操作を行わなくてもレコードを移動したり、タスクを終了した場合に必ずレコード後処理を通るようになります。
項目更新コマンドの［止］パラメータは、以下のような機能があります。
• ［止］が「Yes」（デフォルト）に設定されているとき、エンドユーザは［編集／取消］（F2）コマンドを使用して、現在のレコードとデータビューの内容をリセットし、デー
タの更新を行わずに元の状態に戻すことが可能です。
• ［止］が「No」のときは、［編集／取消］（F2）コマンドは使えなくなります。したがって、ユーザはデータビューに対して加えられた変更を取り消すことはできません。
タスクのレベルが［レコード後処理］の場合、通常、この欄は「No」にしておきます。このレベルでは［更新項目］コマンドの値を元に戻すと、データの整合性が保てなくなることがあるためです。親タスクのレコードデータビューのデータを変更する処理では、一般に、ユーザによる更新の取消を禁止します。これで子タスクのレコー
ドがすでに書き込まれているのに、ユーザによって親タスクの更新が取り消されるという不都合を防ぐことができます。
複数の子タスクを使用して親タスクのデータビューの項目を更新する場合でも、いずれかの子タスクの［項目更新］コマンドの［止］欄を「No」にしておくだけで、ユーザによる更新の取消を防ぐことができます。

ユーザイベントの［強制終了］を使用
ハンドラが実行される前にレコードを書きこんでおく必要がある場合があります。その場合、エンジンはレコード後処理を通りレコードの更新をしてからハンドラの処理を実行する必要があります。
［イベント］テーブルの［強制終了］カラムを「R= レコード」に設定し、このイベント
をトリガとしたハンドラが定義されている場合、イベントがトリガされると直ちにレ
コード後処理を実行します。
［強制終了］の設定だけでは、レコード後処理は通過しません。ユーザがレコードを更新したか、または前述の２つの設定を行っている場合のみ通過します。

ユーザイベントの［強制終了］を設定する：
1. プログラムを選択し、［タスク定義］にズームします。
2. ［タスク環境］メニューから［ユーザイベント］を選択し、［イベント］テーブルを開きます。
3. １行作成し、名前を入力します。

開発者ガイドMagic eDeveloper V9 Plus73

第 5 章 - オンラインタスクの作成
4. ［強制終了］欄を「R= レコード」に設定します。
5. ［タスク定義］で１行作成し、このイベントを使用したハンドラを定義します。
これによって、イベントが発行されると、レコード後処理が実行され、その後にこのイベントをトリガとしたハンドラの処理が実行されます。

ユーザステップの再確認
通常、Magic に組み込まれている確認メッセージは削除の確認メッセージのみですが、下記の確認メッセージが［タスク制御］ダイアログの設定で追加できます。
• 更新確認• キャンセル確認

確認メッセージを使用する：
1. プログラムからズームし［タスク定義］を開きます。
2. ［タスク環境］メニューから［タスク制御］を選択し、［タスク制御］ダイアログを開きます。
3. ［オプション］タブを開きます。
•

更新確認……この項目を「Yes」に設定するか評価が「True」となる式を設定す
ると、登録や修正動作を実行すると［確認］ダイアログが表示されます。
例えば、式を使用して登録モードのときだけこの動作を有効にするには次のように設定します。
Stat（0,'C'MODE）•

キャンセル確認……この項目を「Yes」に設定するか評価が「True」となる式を設定すると、現在のレコードの更新をキャンセルすると［確認］ダイアログが表示されます。このダイアログで「はい（Y）」を選択するとレコード内容は、更新前の値に戻されます。
「いいえ（N）」を選択するとレコード内の新しい値が保存されます。

コントロールモデルの利用
フォーム上に配置するコントロールの特性値をモデルリポジトリに登録することで、フォームの保守性が高くなります。
ここでは、［プッシュボタン］コントロールを例に取り、プッシュボタンを押したとき発行されるイベントを設定する方法を、モデルと継承を使ったパターンで説明します。

モデルの継承パターン
コントロールの特性を設定するには以下の方法があります。
• 直接設定する。
• コントロールモデルから継承する。
• 文字型項目に［プッシュボタン］コントロールを関連付け、［GUI 表示形式］（オンラ
インタスクの場合）、［ブラウザ表示形式］（ブラウザタスクの場合）から継承する。
（データ継承）項目をモデル化する場合もありますので、コントロールの特性を継承させるためのパ
ターンは以下の６通りあることになります。

74

開発者ガイドMagic eDeveloper V9 Plus

コントロールモデルの利用

パターン

A

B

コントロール
モデル

C

設定

D
設定

項目モデル
項目

コントロール

設定

項目モデ
ル継承

E

F
設定

設定

モデル
継承

設定

コント
ロールモ
デル継承

項目モデ
ル継承

項目モデ
ル継承

データ
継承

データ
継承

データ
継承

データ
継承

ユーザイベントの定義
モデルから参照できるユーザイベントは、メインプログラムに定義されたユーザイベン
ト（または、コンポーネントで定義されたイベント）だけです。またこのイベントはア
プリケーション内の全てのプログラムで使用できます。

ユーザイベントを定義する
1. メインプログラムを開きます。
2. Ctrl+K で［ユーザイベント］テーブルを開きます。
3. １行作成し、［名前］カラムにはユニークな名前を、［タイプ］カラムには「N= なし」を設定します。

パターン A: コントロールに直接設定する
もっとも単純な方法です。フォーム上にある［プッシュボタン］コントロールの［実行イベント］からズームしてイベントを設定します。この方法では継承関係はありません。

パターン B：コントロールモデルを継承する
開発手順は以下の通りです。
1. コントロールモデルの［実行イベント］にイベントを設定します。
2. フォーム上にある［プッシュボタン］コントロールでは、［モデル］特性にこのモデルを割り当てます。

コントロールモデルを定義する
1. ［モデル］リポジトリを開きます。
2. １行作成し以下のようにモデルを作成します。
•

名前……ユニークな名前•

クラス……D=GUI 表示•

型……P= プッシュボタン

3. Ctrl+P で［特性］シートを開き、［実行イベント］欄でズームします。
［イベント］ダ
イアログが表示されます。
4. ［イベントタイプ］欄では「U= ユーザ」を、［イベント］欄でズームしてユーザイ

開発者ガイドMagic eDeveloper V9 Plus75

第 5 章 - オンラインタスクの作成
ベントを選択します。

コントロールにモデルを割り当てるには
1. フォームエディタを開きます。
2. ［プッシュボタン］コントロールを配置し、Ctrl+P で［特性］シートを開きます。
3. ［モデル］欄のをクリックして、コントロールモデルを選択します。

パターン C：項目の設定内容を継承させる
開発手順は以下の通りです。
1. データ（変数）項目に［プッシュボタン］コントロールを割り当てます。項目の［GUI 表示］特性を設定します。
2. フォームエディタでこの項目をドロップすると、プッシュボタンとして配置されます。

変数項目にコントロールを割り当てるには
1. 文字型の変数項目を定義します。
2. Ctrl+V で［変数］テーブルを開き、Ctrl+P で［特性］シートを開きます。
3. ［スタイル］セクションの［GUI 表示］欄で▼ボタンをクリックして「P= プッシュボタン」に変更します。

をクリックして［コントロール特性］シートを開きます。

4. ［実行イベント］欄でズームしてイベントを設定します。

パターン D：コントロールモデル→変数項目→ボタンへ継承
これは、以下の２段階の継承により実現されます。
• コントロールモデルから、項目への継承• 項目から、フォーム上の［プッシュボタン］コントロールへの継承
開発手順は以下の通りです。
1. コントロールモデルの［実行イベント］にイベントを設定します。
2. データ（変数）項目に［プッシュボタン］コントロールを割り当てます。項目の［GUI 表示］特性の［モデル］特性でをクリックして、モデルを割り当てます。

3. フォームエディタでこの項目をドロップすると、プッシュボタンとして配置されます。

パターン E：項目モデル→変数項目→ボタンへ継承
これは、以下の２段階の継承により実現されます。
• 項目モデルから変数項目への継承• 項目から、フォーム上の［プッシュボタン］コントロールへの継承
開発手順は以下の通りです。
1. 文字型の項目モデルに［プッシュボタン］コントロールを割り当てます。項目の76

開発者ガイドMagic eDeveloper V9 Plus

コントロールモデルの利用［GUI 表示］特性の［実行イベント］特性にユーザイベントを割り当てます。
2. データ（変数）項目に項目モデルを割り当てます。
3. フォームエディタでこの項目をドロップすると、プッシュボタンとして配置されます。

項目モデルにコントロールを割り当てるには
1. 文字型の項目モデルにカーソルを置き、Ctrl+P で［特性］シートを開きます。
2. ［スタイル］セクションの［GUI 表示］欄で▼ボタンをクリックして「P= プッシュボタン」に変更します。

をクリックして［コントロール特性］シートを開きます。

パターン F： ボタンモデル→項目モデル→変数項目→ボタンへ継承
これは、継承のパターンをすべて使う方法で、以下の３つの継承関係により実現されます。
• コントロールモデルから項目モデルへの継承• 項目モデルから項目への継承• 項目から、フォーム上の［プッシュボタン］コントロールへの継承
開発手順は以下の通りです。
1. コントロールモデルの［実行イベント］にイベントを設定します。
2. 文字型の項目モデルに［プッシュボタン］コントロールを割り当てます。項目の［GUI 表示］特性の［モデル］特性にコントロールモデルを割り当てます。
3. データ（変数）項目に項目モデルを割り当てます。
4. フォームエディタでこの項目をドロップすると、プッシュボタンとして配置されます。

モデルの削除方法
モデルとオブジェクトが継承関係にある状態で、モデルを削除すると継承されている特性値が消えてしまいます。モデルを削除する必要がある場合は、オブジェクトとの継承関係を事前に外して下さい。

特性値を残してモデルを削除するには
1. 削除したいモデルでクロスリファレンスを実行します。
2. 該当するオブジェクトの［特性］シートを開きます。
3. ［モデル］欄の開発者ガイドMagic eDeveloper V9 Plus

ボタンをクリックします。

77

第 5 章 - オンラインタスクの作成
4. 以下のような確認ダイアログが表示されます。「はい」をクリックします。

図 5-1 継承解除の確認

継承か解除された特性値は色が変更されます。

図 5-2 継承時

図 5-3 継承解除後

5. この状態でモデルを削除します。削除しても特性値は変わりません。

78

開発者ガイドMagic eDeveloper V9 Plus

6

ブラウザタスクの作成

この章では Magic Ver.9 の新機能であるブラウザタスクについて解説いたします。

この章では以下のことについて説明いたします。
Web アプリケーションの開発環境設定

80 ページ

簡単な Web アプリケーションの作成

83 ページHTML テンプレートファイル

85 ページHTML コントロール

86 ページ

テーブルコントロールの定義

89 ページ

スクロール処理の改善

91 ページ

１：ｎ のブラウザタスク

93 ページHTML オーサリングツールの使用

93 ページ

特定のフレームでのブラウザタスク

94 ページ

ブラウザクライアントでのタスクモード

95 ページ

VCR ツールバーの定義

95 ページモジュールのクライアント配置の設定

96 ページ

同一フレームに２つのブラウザタスク

96 ページ

IFRAME の使用

97 ページ

その他コントロールの使用

98 ページ

エラーメッセージ用ページの作成

100 ページ

外部イベントの利用

103 ページ

開発者ガイドMagic eDeveloper V9 Plus79

第 6 章 - ブラウザタスクの作成

Web アプリケーションの開発環境設定
Web アプリケーションを構築するには、Magic エンジン、Web ブラウザ、Web サーバ、イ
ンターネットリクエスタ、Magic Request Broker（以下 MRB と略します。）が必要です。
下記に説明する手順は単一マシン上で開発環境を作成する場合を想定していますが、一般的に Web アプリケーションの実行環境はこれらのモジュールを異なるマシン上に分散して配置します。
各モジュールについての詳細は『リファレンスマニュアル』の 20 章「分散アプリ
ケーションアーキテクチャ」などを参照してください。

Web アプリケーションを実行するには、Web ブラウザが必要です。Web ブラウザを使用
して Magic アプリケーションサーバに接続します。Web ブラウザはブラウザタスクのイ
ンタフェースとして機能します。Web ブラウザから Magic アプリケーションに接続する
ためには Web サーバもインストールしておく必要があります。また、マシンには TCP/IP
プロトコルが必要です。
ブラウザタスクを利用する場合は、マイクロソフト社の Internet Explore 5.5SP1 以上が必要です。また、OS によっては、Java VM を別途インストールする必要があります。
ここでは以下の内容について説明します。
• Magic のインストール• Web サーバの設定• インターネットリクエスタの設定• MRB の起動
• Magic エンジンの設定

Magic のインストール
Magic eDeveloper および、Magic Application Server のインストール作業過程で、全ての必要なモジュールが自動的にインストールされ、Web アプリケーションの実行に必要な設定がなされます。必要に応じて以降に説明する設定処理を行ってください。

Web サーバの設定
Web サーバの設定をする：
1. Web サーバに、仮想ディレクトリ（エイリアス）を作成します。
2. インターネットリクエスタ用のエイリアスは以下のように設定します。
物理パスは、下記のファイル群のあるディレクトリへのパスを指定します。Magic
を標準でインストールした場合、Magic のインストール先の Scripts サブフォルダに
これらのファイルがインストールされます。

80•

Mgrqgnrc9x.dll•

Mgrqhttp9x.dll•

Mgrqispi9x.dll （Microsoft Web サーバの場合）•

Mgrqcgi9x.exe （その他の Web サーバの場合）•

Mgreq.ini

開発者ガイドMagic eDeveloper V9 Plus

Web アプリケーションの開発環境設定
インストール処理でのデフォルトのエイリアス名は「Magic94Scripts」ですが、変更することも可能です。
「実行」の権限を設定します。
3. Java アプレット用のエイリアスは以下のように設定します。
物理パスは、下記のファイル群のあるディレクトリへのパスを指定します。Web
サーバとしマイクロソフト社の IIS がインストールされているのであれば、Magic
を標準でインストールした場合、IIS のホームディレクトリにこれらのファイルがインストールされます。
•

MGBC9##_##J.CAB、MGBC9##_##JS.CAB•

MGBC9##_##J.JS•

MGBCL9##_##JPN.CAB•

MGBCCOM9.CAB

インストール処理でのデフォルトのエイリアス名は ”Magic94Java” ですが、変更することも可能です。
「読込」の権限を設定します。
Web サーバが Internet Infoamtion Service（以下 IIS と略します。）の場合、Magic のインストール時に動作環境の設定処理は自動的に行われます。しかし、IIS 以外の場
合（例えば、Apache など）は、インストール先の指定先の取得やエイリアスの作成
はインストーラでは行うことはできません。この場合は、Magic をカスタムモードでインストールし、インストール先を指定してインストールした後、エイリアスの登録処理を手動で行って頂く必要があります。

インターネットリクエスタの設定
インターネットリクエスタを設定する：
インターネットリクエスタが接続する MRB を指定するには、以下のように変更します。
1. Mgreq.ini ファイルの MessagingServer の欄で MRB の TCP のポート番号を指定します。
デフォルトの設定は、V9 Plus の場合「3300」です。これは同じマシンのポート
3300 番を表しています。（ポート番号は、Magic のレビジョンによって変わる場合があります。）
2. もし、MRB が異なるマシン上にあるときは、「ホスト名／ポート番号」という書式で指定しなければなりません。例えば次のようにします。
MessagingServer=Machine_name/3300
3. MRB が使用しているポート番号が分からないときは、MRB の作業ディレクトリにある Mgrb.ini に設定されている BrokerPort の設定を確認してください。

MRB の起動MRB を起動する：
ショートカットより MRB を起動します。MRB が起動されていない状態で、Magic エン
ジンが起動された場合、MRB が自動的に起動されます。
Magic のインストール先にある、MGRQMRB.EXE を実行することでも可能です。MRB
がサービスで起動された場合は、Windows のタスクバーにアイコンが表示されません。

開発者ガイドMagic eDeveloper V9 Plus81

第 6 章 - ブラウザタスクの作成

MRB の設定の詳細については、『リファレンスマニュアル』の 20 章「分散アプリ
ケーションアーキテクチャ」を参照してください。

Magic エンジンの設定
Magic エンジンを設定する：
アプリケーションサーバとしてリクエストを受け付けるようにするには、Magic エンジンを以下の手順で設定しておきます。
1. Magic を実行します。
2. ［設定］メニューで［サーバ］テーブルを開き、Magic エンジンが接続する MRB を定義します。
インストール時のデフォルトの場合、「Default Broker」の設定が使用されます。
3. ［環境設定］ダイアログの［アプリケーションサーバ］タブで下記の設定を行います。
• ［アプリケーションサーバとして動作］を「Yes」に設定します。（デフォルト）• ［メッセージサーバ］欄からズームして MRB（デフォルトは「Default Broker」）
を選択します。
• ［HTTP リクエスタ］に Web サーバに応じたリクエスタの名前と位置（エイリアス）を設定します。
例：IIS を使用する場合は：/Magic94Scripts/mgrqispi94.dll• ［Web ドキュメントパス］にブラウザクライアントのモジュールファ
イル（MGBC9##-##J.CAB、MGBC9##-##JS.CAB, MGBC9##-##J.JS）が存在する
物理パスを指定します。
• ［Web ドキュメントパスの別名］に、Web サーバで定義された［Web ドキュメン
トパス］のエイリアスを指定します。
• ［Web オーサリングツール］欄でズームし、使用する HTML オーサリングツール
を指定します。ブラウザフォームを編集する場合に、このツールが起動されます。
• ［ブラウザクライアントのキャッシュパス］とそのエイリアスである［ブラウザ
クライアントのキャッシュエイリアス］も指定します。（Web サーバ上にも同名のエイリアスを定義してください。）
4. Magic エンジンを上記の設定で実行します。ステータスバーには、「AP サーバ」と表示されていることを確認してください。

ブラウザタスクを実行する：
1. 既存のテーブルから APG を実行し、［処理モード］を「G= 作成」、
［オプション］を「R= ブラウザ」に指定してブラウザタスクを作成します。
2. プログラムリポジトリへ戻り、F7 で作成されたプログラムを実行します。
3. デフォルトの Web ブラウザが開き、エンジンは実行モードになりブラウザタスクを実行する明示的なリクエストがインターネットリクエスタを通してエンジンに送信
されます。

82

開発者ガイドMagic eDeveloper V9 Plus

簡単な Web アプリケーションの作成

ブラウザからプログラムをコールする：
1. Web ブラウザより以下のような URL を指定します。
http://［ホスト名］/［リクエスタの場所］/［リクエスタ名］?appname=［アプリケーション名］&prgname=［公開プログラム名］

簡単な Web アプリケーションの作成
ここでは照会モードで簡単な対話型の Web アプリケーションを作成する方法を説明します。
下記のステップは APG を使用すれば自動で行うことも可能ですが、ここではステップごとに設定方法を解説いたします。
ここでは以下の内容について説明します。
• ブラウザタスクの作成• ブラウザフォーム特性の設定• HTML コントロールの設定

ブラウザタスクの作成
ブラウザタスクを作成する：
1. Web アプリケーションを開発する前に、前述の開発環境を確認してください。
2. テーブルリポジトリにブラウザタスクで表示するテーブル（例：商品テーブル ）を作成します。
3. プログラムリポジトリを開いて１行作成します。
［タスク特性］を開いて、［タスクタイプ］を「R= ブラウザ」に設定します。
4. ［メインテーブル］に #2 で作成したテーブルを指定し、［セレクト］コマンドで必要なメインテーブルのカラムを定義します。
例：
•

商品番号

•

商品名

•

商品タイプ

•

単価

•

在庫数

5. ［フォーム］テーブルを開きます。
6. Ctrl+P を押して、ブラウザフォームの［特性］シートを開きます。
以下ブラウザフォームやコントロールの設定を行います。

ブラウザフォームの定義
ブラウザフォームの特性を定義する：
1. ブラウザフォームで使用する HTML ファイルを作成します。Magic は、このファイ
ルに Magic のデータをマージすることで Web ページを表示させます。

開発者ガイドMagic eDeveloper V9 Plus83

第 6 章 - ブラウザタスクの作成
例：テーブル形式で表示する HTML です。
<html><body >
<form name = ""><table id="table" border="1"><tr><td> 商品番号 </td><td> 商品名 </td><td> 商品タイプ </td><td> 単価 </td><td> 在庫数 </td>
</tr>
<tr>
<td><input type=text size="5" name="item̲no"></td><td><input type=text size="20" name="item̲name"></td><td><input type=text size="1" name="type"></td><td><input type=text size="10" name="price"></td><td><input type=text size="7" name="stock"></td></tr></table></form></body></html>HTML ファイル内の「id」タグや「name」タグをもとに Magic は、コントロール名を取得します。
2. ［特性］シートを開き、下記の特性を設定します。
•

HTML ファイル名……#1 で作成した HML ファイルを指定します。

HTML コントロールの定義
HTML コントロールを定義する：
1. フォームテーブルからズームして、［HTML コントロール］テーブルを開きます。
2. ［HTML コントロール］テーブルでは、HTML ファイルに定義されているテーブル
を含む各コントロールを登録し、項目をそれぞれのコントロールへ関連付けます。
3. コントロールを登録するには、［HTML タグ追加］ボタンをクリックして、［HTMLコントロール一覧］を開きます。この一覧には HTML ファイルに定義されたコント
ロールで、［HTML コントロール］テーブルにまだ定義されていないコントロールが表示されます。
4. 追加したいコントロールにカーソルを移動して、［選択］をクリックします。
［HTML
コントロール一覧］が閉じ、［HTML コントロール］テーブルにコントロールが追加されます。
5. ［HTML コントロール名］欄は、自動的に名前が入力され、［タイプ］欄には、コントロールのタイプが定義されます。この名前は、HTML ファイル内の名前と同じでなければならないので変更しないでください。
6. 対応する項目を各コントロールに関連付けます。
［項目］カラムからズームして項目を選択できます。
7. ［特性］シートを開き、各コントロールの特性を指定します。テーブルコントロー
ルの場合、［明細行］を必ず指定してください。ここには数値を入力し、テーブルの何行目を明細行として繰返し表示するか指定します。
8. ［HTML エディタ］をクリックすると HTML オーサリングツールが起動され、HTML

84

開発者ガイドMagic eDeveloper V9 Plus

HTML テンプレートファイル
ファイルを開きます。必要に応じて HTML ファイルを修正することができます。
9. ［HTML コントロール］テーブルを閉じて、フォーム特性の［繰返し行数］を指定します。この特性は、［HTML コントロール］テーブルにテーブルコントロールが定義されている場合のみ有効になります。テーブルコントロールの［明細行］を繰り返し表示する行数を指定します。
これで、基本的なブラウザタスクは完成です。
10. プログラムリポジトリで F7 を押して実行します。

図 6-1 簡単な Web アプリケーション

HTML テンプレートファイル
Magic では簡単な操作で自動的にブラウザタスクを作成することが可能です。この場合、Magic でデータビューとブラウザタスクのインタフェースを作成します。ブラウザタス
クに割当てられている HTML ファイルのインタフェースは、あらかじめ作成してあるHTML テンプレートファイルを基に作成することが可能です。
テンプレートを使用して作成されたファイルの書式（背景やスタイルシートの使用など）
はこのテンプレートが基になるので、インタフェースに統一感を与えることができます。
Magic は既存のブラウザタスクを基にブラウザフォームのインタフェースのみを自動作成することも可能です。
ここでは以下の内容について説明します。
• HTML テンプレートファイルの作成• HTML テンプレートファイルの使用

開発者ガイドMagic eDeveloper V9 Plus85

第 6 章 - ブラウザタスクの作成

HTML テンプレートファイルの作成
HTML テンプレートファイルを作成する：
1. 次の基本的な HTML タグを含むことが必要です。
<html><body></body></html>

この HTML ファイルのタグ構成が最低限必要です。Magic はこのテンプレートをもとに、ブラウザタスクのインタフェース用 HTML ファイルを作成します。
2. 上記の HTML ファイルをもとに、HTML オーサリングツールを使用して、背景を追加したり、HTML タグを追加したりしてテンプレートファイルを編集してください。
3. Magic の VCR ツールバーと呼ばれるイメージを配置することも可能です。これを使用すればデータビューの照会が容易になります。
（VCR ツールバーについては、95
ページを参照してください。）

HTML テンプレートファイルの使用
以下に HTML テンプレートファイルを使用するときの手順を示します。

テーブルリポジトリで APG を実行 （Ctrl+G）する場合 :1. ［処理モード］を「G= 作成」に設定します。
2. ［オプション］を「R= ブラウザ」に設定します。
3. ［HTML ファイル名］に作成する HTML ファイルの名前を入力します。テーブル名をもとにデフォルトのファイル名が表示されますが、ファイル名が競合しないようにしてください。
4.［テンプレートファイル名］に、作成したテンプレートファイルの名前を指定します。
5. ［OK］をクリックするとプログラムが作成されます。
［HTML ファイル名］で指定したファイルがすでに存在する場合は、上書き確認のダイアログガ表示されます。
別のプログラムで使用していると思われる場合は、［HTML ファイル名］を変更してください。

フォームテーブルで APG を実行 （Ctrl+G）する場合 :1. ［HTML ファイル名］に作成する HTML ファイルの名前を入力します。
2. ［テンプレートファイル名］に、作成したテンプレートファイルの名前を指定します。
3. ［OK］をクリックすると HTML ファイルとフォームが作成されます。
最後に使用したテンプレートファイル名が保持されます。これ以降に同じテンプレー
トファイルを使用して APG を実行する場合は、改めて入力し直す必要はありません。

HTML コントロール
86

Magic のブラウザタスクのインタフェースは、独立した外部の HTML ファイルとして保存されています。

開発者ガイドMagic eDeveloper V9 Plus

HTML コントロール
インタフェースは、Magic アプリケーションファイルの外部にあるため、Magic のオブジェクトとの関連付けを行う必要があります。
ここでは以下の内容について説明します。
• HTML コントロールの定義• APG を使用したコントロールの作成• 項目のドラッグ＆ドロップ• HTML コントロールの追加• HTML コントロールへのデータの関連付け• HTML コントロール特性の定義

HTML コントロールの定義
HTML コントロールの定義方法の概要は前述していますが、ここでは［HTML コントロー
ル一覧］の設定内容を詳しく説明いたします。

HTML コントロールを定義する：
1. ブラウザタスクのフォームからズームし、［HTML コントロール一覧］を開きます。
2. ［HTML コントロール一覧］では、HTML フォーム上のオブジェクトに Magic のオ
ブジェクトを割り当てる処理を行います。以下のパラメータを指定します。
•

HTML コントロール名……HTML ファイル内に定義されたコント
ロール名です。HTML ファイルの「name」タグで指定された名前以外は無効に
なります。

•

式……HTML ファイル内に定義されたコントロール名を動的に指定するための式•

タイプ……HTML コントロールのタイプを指定します。これにより最適な特性シートが選択される為、必ず正しい設定を行う必要があります。

•

項目……HTML コントロールに関連付けられる Magic の項目を指定します。

•

式……項目を指定しない場合、HTML コントロールにデータとして関連付けられる式を指定します。

APG を使用したコントロールの作成
APG を使用してブラウザフォームを作成した場合は、HTML コントロールは自動的に作成され、［HTML コントロール］テーブルに定義されています。

項目のドラッグ＆ドロップ
Magic の［項目］パレットからオーサリングツールへドラッグ＆ドロップを行った場合
は、［HTML コントロール］テーブルには対応するエントリが自動的に作成されます。
オーサリングツールによっては、この機能は使用できない場合があります。

開発者ガイドMagic eDeveloper V9 Plus87

第 6 章 - ブラウザタスクの作成

HTML コントロールの追加
HTML ファイル中にあるコントロールを［HTML コントロ−ル］テーブルに追加することができます。

HTML コントロールを追加する：
1. ［HTML タグ追加］ボタンをクリックし、［HTML コントロール一覧］を開きます。
ここには、HTML ファイルに定義されていて、［HTML コントロール］テーブルに選択されていない全ての HTML コントロールが表示されます。また、ここではそれらの名前とタイプも同時に設定されます。
2. ［選択］ボタンをクリックしてコントロールを追加します。
3. 複数のコントロールをマルチマーキングで指定することも可能です。

HTML コントロールへのデータの関連付け
HTML コントロールにデータを関連付ける：
1. ［項目］欄でズームして HTML コントロールに関連付ける項目を選択します。
これにより HTML コントロールを関連付けた項目のコントロールとして使用することが可能になります。
2. ［項目］欄を使用しないで、［式］欄に式を割り当てることもできます。

HTML コントロール特性の定義［HTML コントロール］テーブルで割付けた各コントロールは、［特性］シートを開いて各設定を行うことができます。
色、フォント、サイズなどは式を使用してのみ設定することが可能です。

これらの特性は、HTML ファイル側で初期値が設定されていても、アプリケー
ション側で変更することができます。

コントロールのスタイル指定
ブラウザタスクでは、スタイルシート（CSS）で指定する書式情報をコントロール特性で指定することもできます。スタイル指定を利用して IME の制御を行うこともできます。

コントロールのスタイル指定を行う：
スタイルシートでは、以下のように書式を指定します。
< タグ style=" プロパティ名 : 値 ; プロパティ名 : 値 ;…">
例えば、背景を栗色、文字を白色に指定する場合は以下のようになります。
< タグ style="background:maroon;color:white;">同じ設定をブラウザフォームの特定のコントロールに対して行うには、以下のようにします。

88

開発者ガイドMagic eDeveloper V9 Plus

テーブルコントロールの定義
1. ［HTML コントロール］テーブル上で、指定したいコントロールにカーソルを置き［特性］シートを開きます。
2. ［表示］セクションの［デフォルトスタイル］欄でズームし、［スタイル］テーブルを開きます。
3. ［スタイル］テーブルに２行追加し以下のように設定します。
名前式background'maroon'color'white'コントロールに IME 制御指定を行う：
エディットコントロールで IME 制御の指定を行うには、［スタイル］テーブルに以下のように設定します。
• 名前……ime-mode• 式……以下のパラメータを式で指定します。
•

auto… 自動（何も指定しない場合と同じ）•

active … IME をオンにする。

•

inactive … IME をオフにする。

•

disabled … IME 制御を無効にする。

コントロールのクラス指定
ブラウザタスクでは、使用する HTML ファイルに定義されたクラス名を使用してコント
ロールの書式を指定することもできます。

コントロールのクラス指定を行う：
1. HTML ファイルに以下のようなクラスを定義します。
<STYLE TYPE="text/css"><!‑‑.red { color: red; }.blue { color: blue; }.green { color: green; }.size { font‑size: 10pt; }‑‑></STYLE>/* 文字色を赤に指定 *//* 文字色を青に指定 *//* 文字色を緑に指定 *//* 文字サイズを 10 ポイントにする */2. ［HTML コントロール］テーブル上で、指定したいコントロールにカーソルを置き［特性］シートを開きます。
3. ［表示］セクションの［デフォルトクラス］欄でズームし、［式］テーブルを開きます。
4. ［式］テーブルに以下の式を設定します。
'size blue'
指定されたコントロールは、10 ポイントの青色で表示されます。

テーブルコントロールの定義
テーブルコントロールを定義することでデータを一覧表示させることができます。

開発者ガイドMagic eDeveloper V9 Plus89

第 6 章 - ブラウザタスクの作成
ここでは以下の内容について説明します。
• HTML テーブルコントロールの作成• テーブルの［明細行］特性の定義

HTML テーブルコントロールの作成
HTML テーブルを作成してコントロールを割当る：
1. オーサリングツールを使用して、HTML テーブルコントロールを作成します。
2. Magic が認識できるようにテーブルコントロールに ID を付加します。
例:<table border="1" id="'My_Table" >3. カラムのタイトル行にタイトルを記入します。
4. 明細行に指定した行に入力と表示用のコントロールを貼り付けます。
オーサリングツールによっては、Magic の［項目］パレットから HTML テーブルへ
ドラッグ＆ドロップを行うこともできます。
5. ［HTML コントロール］テーブルで、追加した入力コントロールを定義し、タスクの項目を割付けます。
［項目］パレットからドラッグ＆ドロップで指定した場合は、［HTML コントロール］
テーブルへ自動的に登録されます。
6. ［HTML タグ追加］ボタンをクリックして、残っている HTML コントロールを表示します。その中に作成したテーブルもあります。
テーブルコントロールは［タイプ］カラムに「テーブル」と表示されています。
7. テーブルコントロールを選択し、［HTML コントロール］テーブルへ登録します。

テーブルの［明細行］特性の設定
テーブルの［明細行］特性を設定し、表示行を指定する：
1. ［HTML コントロール］テーブル上で、テーブルコントロールの［特性］シートを開きます。
2. ［明細行］欄に、データを繰返し表示させる行番号を指定します。この行より上にある全ての行はヘッダと認識されます。
3. ［フォーム特性］にある［繰返し行数］欄を指定します。ここに指定された数字の回数だけ、Magic は自動的に明細行を繰返し表示します。明細行よりも下にある全ての行はフッタと認識されます。
テーブルヘッダやフッタのセルにテーブルのカラムを割り当てたコントロールを配置させた場合、カーソルの置かれているレコードの値のみ表示されます。

90

開発者ガイドMagic eDeveloper V9 Plus

スクロール処理の改善

スクロール処理の改善
ブラウザタスクでは Web ブラウザ上でデータビューを簡単にスクロールすることができます。通常、新たなデータを表示するには Magic アプリケーションサーバを経由してデー
タベースからレコードを取得してくる必要があります。Magic アプリケーションサーバ
との通信が多くなると、ブラウザタスクのパフォーマンスが低下する場合があります。
スクロール中のブラウザタスクのパフォーマンス低下を防ぐには、以下のようにする必要があります。
• 表示されている数よりも大きな数のレコードデータをブラウザクライアントへ送信します。
• ブラウザクライアントがアプリケーションサーバを呼ぶ回数をできるだけ減らします。
ここでは以下の内容について説明します。
• チャンクサイズの設定• キャッシュのリセット

チャンクサイズの設定
チャンクサイズ（式）とは？
［チャンクサイズ（式）］特性は、スクロールによって発生したリクエスト毎に何レコー
ドのデータをブラウザクライアントへ送信するかを指定します。この値は、［フォーム特性］の［繰返し行数］より大きな値を指定してください。

チャンクサイズを設定する：
数値型の値を返す式を設定します。この値がチャンクサイズとなります。この式は、ブラウザタスクの実行時に１回だけ評価されます。
例えば、チャンクサイズが「100」のとき、実際の表示行数に関らず、Magic はブラウザ
クライアントに最初の 100 レコード分のデータを送信します。
この場合、最初の 100 レコード分のデータはキャッシュに保存されているので、101 レ
コード以降のアクセスがない限り通信処理は実行されません。
ユーザが 100 レコード目以上のレコードにスクロールした際には、ブラウザクライアン
トは自動的に Magic アプリケーションサーバにリクエストを送信し、次のレコードを取得します。
新たに取得したレコードはキャッシュに追加されます。これにより、トラフィックを発生させないで最初の 200 レコード分のスクロールが可能になります。

キャッシュのリセット
テーブル先頭／末尾への位置付けなどの非連続スクロールがあると、クライアントではキャッシュがクリアされ、目的のレコードが取得され、キャッシュに保存されます。

１：ｎ のブラウザタスク
１つの HTML インタフェースで複数の Magic タスクを実行する場合があります。これは１：ｎ のリレーションを実現する際に広く用いられる方法です。１つのタスクは親タス
クで、もう１つのタスクは親タスクの各レコード毎の明細情報を扱う子タスクになります。

開発者ガイドMagic eDeveloper V9 Plus91

第 6 章 - ブラウザタスクの作成
Magic のサブフォームコントロールを使用することで、２つのデータビューを１つのHTML インタフェース定義に実現することができます。
ここでは以下の内容について説明します。
• 親タスクと子タスクの作成• サブフォームの定義• サブフォームの再計算

親タスクと拡張ビュータスクの作成
親タスクと子タスクを作成する :1. １：ｎ の１の部分となる親のデータビューを表示するブラウザタスクを作成します。
作成方法については前述の「簡単な Web アプリケーションの作成」（P. 83）を参照
してください。
2. １：ｎ の ｎ の部分となる明細データビューの表示と操作を行う子タスク（プログラム）を作成します。子タスクを作成する上で、以下の条件が必要です。
•

子タスクのブラウザフォームが使用する HTML ファイルは、親タスクと同じものを使用します。

•

この既存の HTML ファイルに必要な全ての HTML コントロール（必要であればテーブルコントロールも）を追加します。

3. 新たに追加した子タスク用の HTML コントロールが、既存のコントロールと名前が重複しないようにしてください。重複したコントロールがあった場合 HTML ファイ
ルを変更し、［HTML コントロール］テーブルを更新してください。
4. 子タスクでは、親タスクからパラメータを受け取るためのパラメータ項目を定義します。このパラメータ項目を使用して子タスクで処理するレコードの範囲条件を指定します。
5. パラメータ項目は、サブタスクでの再計算にも使用されます。

サブフォームの定義
サブフォームの作成と特性の設定を行う：
1. 親タスクに戻り、ブラウザフォームから［HTML コントロール］テーブルを開きます。
2. ［HTML コントロール］テーブルで１行作成し、サブフォームコントロールを定義します。任意の名前を付けてください。
3. ［コントロール特性］シートを開き、以下の特性を設定します。
•

接続先 ……拡張ビューとして作成したタスクのタイプを定義します。
「P= プログラム」か、「S= サブタスク」を選択します。

•

プログラム／タスク番号 ……プログラム番号またはタスク番号を入力します。
ズームして一覧から選択することもできます。

•

パラメータ ……［パラメータ一覧］へズームして必要なパラメータを設定します。このパラメータは子タスクで範囲や代入式に使用されます。

4. これで１：ｎ のブラウザタスクができました。親タスクに戻り実行してみてください。

92

開発者ガイドMagic eDeveloper V9 Plus

HTML オーサリングツールの使用

サブフォームの再計算
サブタスクに渡されたパラメータの値に変化があった場合、サブフォームはビューを再計算／再表示します。
サブフォームの再計算／再表示が行われると、必ずサブタスクのタスク後処理とタスク
前処理が実行されます。ただし、フォーカスは親タスクに残ったままになります。
項目として渡されたパラメータのみがビューの再計算を行うきっかけとなります。式として渡されたパラメータに変化があっても再計算は行われません。

HTML オーサリングツールの使用
Magic のブラウザタスクのインタフェースの定義と編集は、サードパーティーの HTMLオーサリングツールを使用して行います。
ここでは以下の内容について説明します。
• HTML オーサリングツールの登録• オーサリングツールの起動• HTML ファイルの編集• HTML ファイルの独自編集

HTML オーサリングツールの登録
Magic でオーサリングツールを使用する場合、あらかじめ登録しておく必要があります。

オーサリングツールを登録する：
1. ［環境設定］ダイアログの［アプリケーションサーバ］タブの［Web オーサリングツール］欄で、ツールの場所と実行ファイル名を指定します。
Magic のインストール時にインストーラがデフォルトの HTML オーサリングツールを検出し、上記の設定を行います。

オーサリングツールの起動HTML オーサリングツールを起動する：
1. フォームテーブルのブラウザフォームからズームし、［HTML コントロール］テーブ
ルを開きます。
2.［HTML エディタ］ボタンをクリックして、HTML オーサリングツールを起動します。
3. フォーム特性の［HTML ファイル］で定義された HTML ファイルがオープンされ、編集することができます。

HTML ファイルの編集
ここでは、HTML ファイルの編集処理を中心にしてブラウザフォームの編集方法を説明します。

開発者ガイドMagic eDeveloper V9 Plus93

第 6 章 - ブラウザタスクの作成

HTML ファイルを編集する：
1. Magic でコントロールとして使用したい任意のオブジェクトを作成し名前を付けます。（name=''XXX''）
2. NAME 属性をサポートしていないオブジェクト、例えばテーブルなどは、ID 属性を使用します。
3. HTML ページでは FORM オブジェクトは１つだけ作成してください。
4. HTML ファイルにはカスケード・スタイル・シート （CSS）、Java スクリプト、Java
アプレット、Active-X などを含めることもできます。
HTML ファイルに登録したオブジェクトを Magic アプリケーションのデータ項目に割り当てるには、その名前を［HTML コントロール］テーブルに登録する必要があります。
登録方法については前述の「HTML コントロールの定義」（P.86）を参照してください。

項目のドラッグ＆ドロップを行う：
1. Magic からオーサリングツールを起動します。
［項目］パレットがフローティングウィンドウとして、オーサリングツールの手前に開きます。
2. このパレットから項目を HTML ファイル上へ直接ドラッグ＆ドロップします。
項目を貼り付けると、Magic は項目特性の［スタイル／ブラウザ形式（テーブル）］の特性に応じたコントロールを自動で作成します。このコントロールには項目名と同じ名前が付けられます。Magic の項目名に HTML コントロール名として使用できない文字が使用されている場合は「_」に置き換えられます。また、既に同じ名前の HTML コントロールが存在する場合は、その名前に番号が連結されたものがコントロール名として割り当てられます。
さらに、Magic は貼り付けたコントロールを［HTML コントロール］テーブルに追加します。
ドラッグ＆ドロップは以下のオーサリングツールでのみ使用できます。
•

Microsoft® FrontPage™（バージョンによっては、できない場合があります。
）

HTML ファイルの独自編集
Magic ではオーサリングツールとの連携が可能ですが、HTML ファイルは外部ファイルとして存在するため、Magic の有無に関らず、外部のオーサリングツールで直接作成／
編集することが可能です。

特定のフレームでのブラウザタスク
ユーザはコール元のタスクが開いているウィンドウとは別のウィンドウに、ブラウザタ
スクを開くように指定することができます。

ブラウザタスクからタスクを起動する：
1. メインのブラウザタスクに［コール］コマンドを作成します。
2. コールするブラウザタスクのプログラム／タスク番号を指定します。
3. ［コール特性］ダイアログを開き、［出力先フレーム］欄に表示したいウィンドウか
フレーム名を入力します。

94

開発者ガイドMagic eDeveloper V9 Plus

ブラウザクライアントでのタスクモード
4. タスクを実行します。
［コール］コマンドが実行されるたびに、新しいブラウザタスクが指定された名前のウィンドウやフレームで開きます。

ブラウザクライアントでのタスクモード
ブラウザタスクでは基本的な照会、修正、登録のタスクモードがサポートされています。
例えばデータ入力、修正、削除は修正モードでは許可されていますが、照会モードでは許可されません。
ブラウザタスクの初期モードは［タスク特性］で設定します。
1. プログラムからズームして［タスク定義］を開きます。
2. Ctrl+P を押して［タスク特性］ダイアログを開きます。
3. ［初期モード］欄で、「修正」、「登録」、あるいは「照会」を選択します。
これらのモードをプログラム実行中に変更する場合は、以下の内部イベントを使用しま
す。
• 修正
• 登録
• 照会
•

タスクモードをイベントで切り替える場合は、［イベント実行］コマンドが使用できますが、［ウェイト］欄を「No」に設定する必要があります。

•

イベントのトリガをボタンやショートカットに割り当てることもできます。
イベントが複数のプログラムで使用される場合は、ハンドラをメインプログラムに定義
し、全ての異なるタスクからトリガを起動できるようにしておくと便利です。

VCR ツールバーの定義
VCR コントロールというエンドユーザにデータビューへの簡単な操作を提供するイ
メージファイルが使用できます。これを VCR パネルイメージと呼びます。このパネルはWeb アプリケーション用です。
VCR イメージを下記に示します。このファイルは jpg ファイル形式で提供され、「Web ドキュメントパス」で指定される場所に mgvcr.jpg というファイル名でインストールされています。

VCR イメージを HTML インタフェースに挿入するには、以下のようにします。
1. HTML オーサリングツールを使用して、HTML イメージタグを作成します。
2. イメージタグのソースが正しく mgvcr.jpg ファイルを指していることを確認します。
名前は MG_VCR である必要があります。
例：<img src= "/Magic94Java/mgvcr.jpg" name = "MG̲VCR">
3. ブラウザクライアントはこのイメージを名前で識別し、自動的に VCR イメージとして扱います。
この他にも、次の４つのツールバーを提供しています。

開発者ガイドMagic eDeveloper V9 Plus95

第 6 章 - ブラウザタスクの作成• MG_EDIT ……「行作成」、「行削除」、「取消」のイベントを発行します。（mg_edit.jpgというファイル名でインストールされます。）• MG_CANCEL……「キャンセル」のイベントを発行します。（同 mg_cancel.jpg ）• MG_EXIT……「終了」のイベントを発行します。（同 mg_exit.jpg ）• MG_QUIT……「取消終了」のイベントを発行します。（同 mg_quit.jpg ）また、オリジナルの VCR イメージを作成することも可能です。もし、デフォルトのイ
メージファイルでなく、オリジナルの VCR イメージを使用する場合は、イメージが Magicの各イベントに対応するアイテムを含んでいることを確認してください。
例えば MG_VCR の場合、イメージは横方向に６等分され、それぞれに６つのイベントが割り当てられます。この場合は、６等分されたことが分かるようなイメージを用意する必要があります。

モジュールのクライアント配置の設定
ブラウザクライアントモジュールの主要部分である Java アプレットは、ブラウザにロードされる必要がありますが、これには時間がかかります。Magic のアプリケーションサー
バは、この Java アプレットモジュールをクライアント側に配置する機能があります。これにより、最初にアプレットがロードされると、それはクライアントマシン上に残ります。ブラウザタスクが実行される際にこのモジュールが要求された場合は、サーバからロードするのではなく、クライアント上のモジュールから取得されるようになります。

モジュールのクライアントへの配置を行う：
1. ［設定］メニューから［動作環境］を選択します。
2. ［アプリケーションサーバ］タブをクリックします。
3. ［ブラウザクライアントモジュールのクライアントへの配置］を 「Yes」に設定します。「No」に設定するとこの機能は無効になります。
「Yes」に設定した場合は、エンドユーザはブラウザの確認ダイアログで確認を行う必要があります。
ブラウザクライアント Java モジュールは署名されています。これはエンドユーザに対してこのモジュールが改ざんされたものではないことを証明するものです。

同一フレームに２つのブラウザタスク
Web ブラウザベースのアプリケーションを作成する際には、ユーザインタフェースを維持するためにフレームセットを使用することが一般的です。通常はナビゲータと呼ばれるメインのワーク画面を含むいくつかのフレームに画面が分割されます。下記の手順はどのようにブラウザタスクから他のブラウザタスクをコールし、コール元と同一フレー
ム上に開くかを説明したものです。
簡単なフレームセットを含む HTML ファイルを用意する必要があります。下記は一例です。
<html><head><title>Query</title></head><frameset rows="100,*"frameborder="0" framespacing="0" border="0"><frame name="NavigatorFrame"src="/Magic9Demo/tf̲start.html" scrolling="no"marginwidth="0" marginheight="0" noresize frameborder="0">96

開発者ガイドMagic eDeveloper V9 PlusIFRAME の使用<frameset cols="122, *" frameborder="0" framespacing="0" border="0"><frame name="LogoFrame" src="/Magic94Scripts/
mgrqispi94.dll?APPNAME=Magic̲9̲Demo&PRGNAME=prog̲A" scrolling="no" marginwidth="0"
marginheight="0" noresize frameborder="0"><frame name="MainFrame" scrolling="yes" marginwidth="0" marginheight="0" noresize
frameborder="0" src="/Magic9Scripts/Magic9Demo/HTML̲Pages/Welcome.html"></frameset><noframes></noframes></frameset><frameset></frameset></html>上記の例では単純な２画面のフレームがあり、１つは簡単な HTML ファイルを表示し、もう１つのフレームからはブラウザタスクをコールしています。
この例では「prog_A」 がメインフレームのプログラムで、その中に「prog_B」をコールするボタンが配置されています。このプログラムも同様にメインフレーム内に開かれるものです。
1. アプリケーションのメインプログラムで［タスク環境］メニューから［イベント］
テーブルを開きます。イベントを作成して［名前］欄に「Call prog_B」と入力し、［タイプ］カラムでは「N= なし」を選択し［OK］をクリックします。
2. メインプログラムで新しいハンドラを作成し、ハンドラの［処理］テーブルにコー
ルコマンドを作成し、プログラムを選択します。コールするプログラムには「prog_B」
を選択します。
3. Ctrl+P を押して［コール特性］ダイアログを開き、［出力先フレーム］に「MainFrame」と入力し［OK］をクリックします。
4. 「prog_A」内でボタンに対応するハンドラを作成します。
［イベント］欄でズームして［イベント］ダイアログを開きます。
5. ［イベントタイプ］では「I= 内部」を選択し、［イベント］欄でズームして［アクション一覧］を開きます。「クリック」を選択し［OK］をクリックします。
6. ［処理］テーブルで［イベント実行］コマンドを作成します。
7. ［内容］カラムでズームして［イベント］ダイアログを開き、［イベントタイプ］では「U= ユーザ」を選択します。［イベント一覧］からは、メインプログラムで作成したイベント「Call prog_B」を選択します。

IFRAME の使用
IFRAME は「Inline Frame」の略です。IFRAME を使用すると、フレームセットのようにウィンドウを水平・垂直に分割する形式だけではなく、ウィンドウの中に独立して表示される形式のインラインのフレームを作成することができます。
HTML ファイル内に <IFRAME> タグが設定されている場合、Magic は、IFRAME コント
ロールとして認識し、表示特性を Magic のプログラム側で制御することができます。

HTML ファイルの設定<IFRAME> タグは、<BODY> 〜 </BODY> 内に設定します。src 属性でフレーム内に表示する内容（HTML ファイル）を指定します。name 属性でフレームに名前を付けること
で、Magic から HTML コントロール名として認識されます。
<BODY >...

開発者ガイドMagic eDeveloper V9 Plus97

第 6 章 - ブラウザタスクの作成<iframe src="/Magic94Scripts/Sample/Child.htm" name="sample" width="200" height="150">
この部分はインラインフレームを使用しています。
</iframe>...
</BODY><IFRAME> 〜 </IFRAME> の間には <IFRAME> に対応していないブラウザに表示する内容を記述します。

Magic 側に組みこむ
HTML ファイルに <IFRAME> タグが組みこまれている場合、ブラウザ形式フォームの［HTML コントロール］テーブルで［HTML タグ追加］ボタンをクリックすると、IFRAMEの名前が表示されます。カーソルを置いてダブルクリックすると［HTML コントロール］
テーブル追加されます。
［コントロール特性］を指定する式を定義することで、実行時の表示が上書きされます。

図 6-2IFRAME 表示

その他コントロールの使用
その他（OPAQUEU）コントロールは、決まったコントロールではありません。HTML
ファイル上の全てのコントロールがその他コントロールとなります。通常のエディット
コントロールやボタンコントロールなども「その他」に割り当てることができまが、Magicのコントロールに対応しないタグの表示を制御する場合に使用します。
その他（OPAQUEU）コントロールには、name 属性が定義されたあらゆるタグを割り当てることができます。このタグに対して、項目や式を割り当てることはできません。単にコントロール特性によって表示内容を変更することだけが可能です。
ここでは、ActiveX オブジェクトが配置されてた HTML ファイル内を使用し、このオブジェクトの表示を制御するプログラムの作成方法を説明いたします。

HTML ファイルの設定
ActiveX オブジェクトとして、Windows の「カレンダーコントロール」を配置します。このコントロールに、name 属性を追加します。
<BODY>...
<p><object classid="clsid:8E27C92B‑1264‑101C‑8A2F‑040224009C02" id="Calendar1"
name="Calender"><param name="̲Version" value="524288"><param name="̲ExtentX" value="7620">

98

開発者ガイドMagic eDeveloper V9 Plus

その他コントロールの使用<param name="̲ExtentY" value="5080"><param name="̲StockProps" value="1"><param name="BackColor" value="‑2147483633"><param name="Year" value="2004"><param name="Month" value="12"><param name="Day" value="6"><param name="DayLength" value="0"><param name="MonthLength" value="0"><param name="DayFontColor" value="0"><param name="FirstDay" value="1"><param name="GridCellEffect" value="1"><param name="GridFontColor" value="10485760"><param name="GridLinesColor" value="‑2147483632"><param name="ShowDateSelectors" value="‑1"><param name="ShowDays" value="‑1"><param name="ShowHorizontalGrid" value="‑1"><param name="ShowTitle" value="‑1"><param name="ShowVerticalGrid" value="‑1"><param name="TitleFontColor" value="10485760"><param name="ValueIsNull" value="0"></object></p>...
</BODY>

Magic 側に組みこむ<OBJECT> タグに対応した Magic のコントロールがないため、［HTML コントロール一
覧］には該当する名前（例では、「Calender」）が表示されません。手動で入力する必要があります。

［その他］コントロールを追加するには：
1. ［HTML コントロール］テーブルに１行追加します。
2. ［HTML コントロール名］カラムに name 属性の値（「Calender」）を入力します。
3. ［タイプ］カラムを「O= その他」にします。
［コントロール特性］を指定する式を定義することで、実行時の表示を変更することができます。

図 6-3ActiveX オブジェクトの表示

開発者ガイドMagic eDeveloper V9 Plus99

第 6 章 - ブラウザタスクの作成

オブジェクトの内容によって、コントロール特性が有効にならないものがあります。

エラーメッセージ用ページの作成
Magic で開発された Web 対応アプリケーションでは、システム上の問題などでエラーが発生した場合、独自のエラーメッセージ画面を表示させます。

図 6-4 デフォルトのエラーメッセージ画面

ここでは、このエラー画面をカスタマイズする方法を説明いたします。以下の手順で行います。
1. HTML ファイルの作成
2. MGREQ.INI の修正

HTML ファイルの作成
エラー情報を表示するための HTML ファイルをオーサリングツールで作成します。
HTML ファイルの内容は任意ですが、<input> タグの name 属性に専用の値を指定することで、Magic のシステム情報を表示させることができます。<input> タグは、以下のような書式で設定します。
<input type="text" name="MG_Server" size="32">
使用できる name 属性の値は以下の通りです。
名前表示される情報

MG_Server

メッセージングサーバ（MRB）が実行されているサーバのアドレス「ホスト名 / ポート番号」の形式で表示されます。

100

MG_Application

Magic のアプリケーション名

MG_Program

Magic のプログラム公開名

MG_ErrorCode

エラーコードMG_ErrorText

エラー情報

MG_User

ユーザ名

開発者ガイドMagic eDeveloper V9 Plus

エラーメッセージ用ページの作成

input タグの変更
入力不可にする
input タグはデフォルトではエディットコントロールとして表示されます。表示専用で境界線も表示させないようにするには、以下のようにします。
<input type="text" name="MG_Server" size="32" readonly style="border:none;">

非表示にする
input タグを表示しないで、JavaScript などで利用する場合は以下のようにします。
<input type="hidden" name="MG_User">HTML ファイルの例<html><head><title>System Busy</title><meta http‑equiv="Content‑Type" content="text/html; charset=Shift̲JIS"><style>input {border:none;}</style></head><body><p align="center"><font size="5"> システムビジー </font></p><hr><p> 現在システムが大変混雑しています。</p><p> 数分後に再びご訪問ください。</p><p> いつまでもこの状態の場合には、<a href="mailto: webmaster@MyCompany.co.jp"> システム管理者 </A>に次の情報を添えてをご連絡ください :</p><table border="0" width="880"><tr><td width="284">
サーバ名：
</td>
<td width="582"><input type="text" name="MG̲Server" size="32">
</td>
</tr>
<tr>
<td width="284">
アプリケーション名：</td><td width="582"><input type="text" name="MG̲Application" size="32">
</td>
</tr>
<tr>
<td width="284">
プログラム名：</td><td width="582"><input type="text" name="MG̲Program" size="32">
</td>
</tr>
<tr>
<td width="284">
エラーコード：</td>

開発者ガイドMagic eDeveloper V9 Plus101

第 6 章 - ブラウザタスクの作成<td width="582"><input type="text" size="32" name="MG̲ErrorCode">
</td>
</tr>
<tr>
<td width="284">
エラー内容：</td><td width="582"><input type="text" name="MG̲ErrorText" size="80">
</td>
</tr>
</table><input type="hidden" name="MG̲User"></body></html>MGREQ.INI の設定
インターネットリクエスタからの要求に対して MRB や Magic エンジンからの応答がなかったり、エラーが返った場合に作成した HTML ファイルを表示させるように指定します。
MGREQ.INI ファイルの［DefHtml］キーワードに HTML ファイルを指定します。以下の例は、Magic の Web ドキュメントパスに「System_Busy.htm」という名前のファイル名で配置した場合を示しています。
［REQUESTER_ENV］...
DefHtml = http://MyServer/Magic94Java/System_Busy.htm
MGREQ.INI の変更内容を有効にするには、Web サーバを再起動する必要があります。

表示例
エラーメッセージをカスタマイズさせた実行例は以下のようになります。HTML ファイ
ルを任意に変更することで独自の画面を表示させることができます。

102

開発者ガイドMagic eDeveloper V9 Plus

外部イベントの利用
図 6-5 カスタマイズされたエラー画面

動作環境エラーのカスタマイズ
ブラウザクライアントは、Java または、.NET を利用して動作します。このためクライア
ント側に以下の環境がインストールされている必要があります。
• Java で動作させる場合…… Microsoft VM for Java• .NET で動作させる場合…… Microsoft .NET Framework
どちらで動作させるかは、Magic の動作環境の設定で決まります。
詳細は、『リファレンス』の第２章「環境設定」を参照してください。

対応するフレームワークがインストールされていない場合、Magic は［動作環境］の［アプリケーションサーバ／ブラウザクライアント環境エラー URL］で設定されたファイルを表示しようとします。
このメッセージ用の HTML をあらかじめアクセスできる場所に配置しておく必要があり
ます。

設定例：
/Magic94Java/Browser_Client_Tech_err.htm
この場合、Web ドキュメントパスで指定されたフォルダ内に「Browser_Client_Tech_err.htm」という HTML ファイルを置いてください。
［ブラウザクライアント環境エラー URL］の設定が空白の場合、Magic の［Web ド
キュメントパス］で指定されたフォルダの内容を表示しようとします。
ここで使用する HTML ファイルでは、name 属性をもとにシステム情報を取得することはできません。

外部イベントの利用
HTML ページ内で MGExternalEvent（）関数を実行すると、Magic プログラム内で「外部イベント」として受け取ることができます。その際、関数内に指定したパラメータをイ
ベントハンドラで取得することもできます。
この機能を利用した簡単な例として、前述の「簡単な Web アプリケーションの作成」で作成したプログラムをもとに、プッシュボタンによって外部イベントを呼び出し、
Windows ダイアログを表示させる方法を説明いたします。以下の手順で行います。
1. HTML ファイルの作成
2. Magic プログラムの修正

HTML ファイルの作成
３つのプッシュボタンを配置し、それぞれに外部イベントを実行させるように設定します。各外部イベントには異なったパラメータを指定します。
</table> タグ後にプッシュボタン用のタグを配置します。HTML ファイルの内容は任意ですが、<input> タグの name 属性に専用の値を指定することで、Magic のシステム情報を表示させることができます。<input> タグは、以下のような書式で設定します。

開発者ガイドMagic eDeveloper V9 Plus103

第 6 章 - ブラウザタスクの作成<HTML><BODY >
<form name = ""><table id="Table" border="1"><tr><td> 商品番号 </td><td> 商品名 </td><td> 商品タイプ </td><td> 単価 </td><td> 在庫数 </td>
</tr>
<tr>
<td><input type=text size="5" name="Item̲No" ></td><td><input type=text size="20" name="Item̲Name"></td><td><input type=text size="1" name="Type"></td><td><input type=text size="10" name="Price"></td><td><input type=text size="7" name="Stock"></td></tr></table></form><input type="button" value="External1" name="External1"
onClick="MGExternalEvent('A');" > &nbsp; &nbsp;<input type="button" value="External2" name="External2"
onMouseover="MGExternalEvent('B');" >&nbsp;&nbsp;</BODY></HTML>

これにより以下のように動作します。
• 「External1」のプッシュボタンをクリックすると、MGExternalEvent が実行されパラメータとして「A」が渡されます。
• 「External1」のプッシュボタンをマウスカーソルが通過すると、MGExternalEventが実行されパラメータとして「B」が渡されます。

Magic プログラムの修正［外部イベント］ハンドラを作成する
1. ［タスク定義］ウィンドウで１行追加し、以下のように定義します。
•

レベル ……「H= ハンドラ」•

イベント …… 「I= 内部」／「外部イベント」

2. 処理テーブルには以下のように処理コマンドを定義します。
1. セレクトコマンドで変数を定義します。（変数名「Parameter」、文字型、書式「1」）2. エラーコマンドを３つ定義してメッセージダイアログを表示させます。メッセージ
内容と条件は以下の通りです。
メッセージ

条件

External1 が起動されました .

変数「Parameter」=’A’

External2 が起動されました .

変数「Parameter」=’B’

メッセージ内容は、式で定義しても［内容］カラムに直接入力してもどちらでもかまいません。

プログラムの実行
プログラムを実行するとテーブルの下にプッシュボタンが表示されます。このプッシュ
ボタンをクリックすると以下のように動作します。

104• 「External1」をクリックすると「External1 が起動されました .」というメッセージダイ
アログが表示されます。

開発者ガイドMagic eDeveloper V9 Plus

JavaScript の呼び出し• 「External2」をマウスカーソルが通過すると「External2 が起動されました .」というメッセージダイアログが表示されます。

JavaScript の呼び出し
JavaScript は、HTML 内に埋め込むことのできるスクリプト言語です。ブラウザタスクでは、HTML ファイル内に JavaScript を記述することでこれを呼び出すことができます。
JavaScript で関数を宣言した場合以下の２通りの方法で呼び出すことができます。
• HTML ファイル内で関数を呼び出す。
• Magic の CallJS 関数で呼び出す。
ここでは、同じ JavaScript の関数を２通りの方法で呼び出す例を紹介します。

JavaScript の定義
新しいウインドウを開いて、パラメータで指定した URL を表示させる関数を定義しま
す。HTML ファイルに以下のように記述します。
<SCRIPT LANGUAGE="JavaScript">function newwindow(http) {window.open(http)}</SCRIPT>JavaScript の起動を定義する
HTML ファイル内で関数を呼び出す。
ボタンを配置して、クリックしたら関数（newwindow）を実行するようにするには、HTML
ファイルに以下のように記述します。
<FORM METHOD="post"><p><INPUT TYPE="button" VALUE="Java Scripts を実行 " ONCLICK="newwindow('http://
www.magicsoftware.co.jp')"></p></FORM>

Magic の CallJS 関数で呼び出す
同様にボタンを配置して、クリックしたら Magic のユーザイベントを発生させ、イベン
トハンドラ内で CallJS 関数を実行します。
1. HTML ファイルに以下のように記述します。
<FORM METHOD="post"><p><INPUT TYPE="button" VALUE="Magic のイベントで Java Scripts を実行 " name="JavaScripts"></p></FORM>

2. ［ユーザイベント］に「JavaScript」という名前のイベントを定義します。
3. テーブル HTML コントロールテーブルに HTML タグ「JavaScripts」を定義します。
（［タイプ］は、「P= プッシュボタン」になってます。）［実行イベント］特性に、ユーザイベント「JavaScript」割り当てます。

開発者ガイドMagic eDeveloper V9 Plus105

第 6 章 - ブラウザタスクの作成
4.

［タスク定義］ウィンドウでハンドラを追加し、ユーザイベント「JavaScript」を割り当てます。

5. イベントハンドラの［処理テーブル］にアクション処理コマンドを定義します。以下の式を設定します。
CallJS ('newwindow','http://www.magicsoftware.co.jp')
どちらの方法でもボタンをクリックした時の結果は同じになります。

106

開発者ガイドMagic eDeveloper V9 Plus

トランザクションとリカバリー

7

トランザクションとはデータの整合性を維持する為に使用されるデータプロセス技術です。１つの単位としてコミット（完了してディスクに書き込む）したり、アボート（中断）されます。予約処理や入金確認などの作業がこういったトランザクションの例です。
トランザクションの詳細については『リファレンスマニュアル』の 11 章「データ管理」、25 章「SQL に関する考慮事項」を参照してください。

この章では以下のことについて説明いたします。
ロックフェーズの短縮

p.108

トランザクション失敗時の動作

p.109

データベースへの動的ログイン

p.113

データベース制約違反の対応

p.113

NULL 値の送信

p.114

MS-SQL Server 一時テーブル

p.115

各 nn レコードでトランザクションをコミットする

p.115

開発者ガイドMagic eDeveloper V9 Plus107

第 7 章 - トランザクションとリカバリー

ロックフェーズの短縮
トランザクションはデータの整合性を保つために行われます。Magic の遅延トランザク
ションは、全てのデータ操作（DM）ステートメントをキャッシュに保存します。DM ス
テートメントはトランザクションモードに応じて１つのステップで送信されます。
遅延トランザクションはトランザクション時間を短縮し、パフォーマンスを向上させます。
遅延トランザクションには３つのモードがあります。
• レコード前処理の前 …… 更新はレコードレベルで集計され、レコード後処理の後でデータベースへ送信されます。
• タスク前処理の前 …… 更新はタスクレベルで集計され、タスク後処理の後でデータベースに送信されます。
• グループ（グループレベルを使用するバッチタスクでのみ有効）…… 更新はグループレベルで集計され、所定の変数の値が変わったときにデータベースへ送信されます。
ここでは以下の内容について説明します。
• トランザクション開始特性−レコード前処理の前• トランザクション開始特性−タスク前処理の前• トランザクション開始特性−グループ• 遅延トランザクションエラーの処理

トランザクション開始 – レコード前処理の前「レコード前処理の前」にトランザクション開始を定義した場合、Magic では以下のことを行います。
• レコードのフェッチ前にトランザクションをオープンします。
• レコード後処理でデータを更新した後でのみトランザクションはコミットされます。
• サブタスクを含む、オープンとコミット間のすべての処理がトランザクションの対象となります。

レコード前処理の前にトランザクション開始を定義する：
1. プログラムリポジトリでオンラインプログラムを開きます。
2. ［タスク特性］を開きます。
3. ［拡張］タブをクリックして下記のように設定します。
•

トランザクションモード……「D= 遅延」•

トランザクション開始……「P= レコード前処理の前」

4. ［OK］をクリックします。
Magic のフローモニターでゲートウェイのチェックボックスをオンにしておくと、全ての更新がレコード後処理の後に一回づつ行われていることが確認できます。

トランザクション開始 – タスク前処理の前「タスク前処理の前」にトランザクション開始を定義した場合、Magic では以下のことを
行います。

108

開発者ガイドMagic eDeveloper V9 Plus

トランザクション失敗時の動作• タスク後処理後に、トランザクションをオープンします。
• データを更新した後でのみトランザクションはコミットされます。
• サブタスクを含む、オープンとコミット間のすべての処理がトランザクションの対象となります。

タスク前処理の前にトランザクション開始を定義する：
1. プログラムリポジトリでバッチプログラムを開きます。
2. ［タスク特性］を開きます。
3. ［拡張］タブをクリックして下記のように設定します。
•

トランザクションモード……「D= 遅延」•

トランザクション開始……「T= タスク前処理の前」

4. ［OK］をクリックします。

トランザクション開始 – グループ
「グループ」は、バッチプログラムで、タスク定義にグループ項目が定義されている場合のみ指定できます。

グループレベルでのトランザクション開始を定義する：
1. プログラムリポジトリでバッチプログラムを開きます。
2. ［タスク特性］を開きます。
3. ［拡張］タブをクリックして下記のように設定します。
•

トランザクションモード……「D= 遅延」•

トランザクション開始……「G= グループ」

4. ［項目］欄からズームしてグループ項目を選択します。
5. ［OK］をクリックします。

遅延トランザクションエラーの処理
個々の遅延トランザクションはそれぞれキャッシュを持っています。
遅延トランザクションでデータベースを更新する際にエラーが発生した場合、エラーハ
ンドラを使用してエラー対応を行うことができます。

トランザクション失敗時の動作
Magic ではエラー失敗時のデフォルト動作を２種類定義しています。
• R= 復旧 …… Magic は現在のデータビューを保持し、可能な場所で現在のタスクに留まります。復旧のオプションはエラー発生後、エンドユーザに復旧と作業の継続を許可します。
• A= アボート…… Magic は現在のトランザクションをロールバックし、現在のデータビューを破棄し、トランザクションが発生したタスクをアボートします。ユーザは復旧を行うことはできません。

開発者ガイドMagic eDeveloper V9 Plus109

第 7 章 - トランザクションとリカバリー
Magic のデフォルト動作が適用できないときは、発生する異なるエラーに対し、エラー
ハンドリング機能を使用して動作を変更することができます。
Magic のエラーハンドリング機能は、エラー検出時に定義されたエラーハンドラを検索します。エラーが検出されると、対応するハンドラに定義された［コール］や［エラー］などの処理コマンドが実行されます。また、Magic はハンドラの［対応］欄に記述されたエラー処理動作も実行します。
［対応］欄にはエラーハンドラ処理後のアクションを選択します。
ここでは以下の内容について説明します。
• 定義済みエラーの対応設定• エラーハンドラの設定• エラー対応方法の定義• エラー発生時の処理の定義• データベースエラーの上書き• エラー情報の取得用関数• 「任意」エラーハンドラの定義• ［伝搬］特性の定義

定義済みエラーの対応設定
定義済みエラーの対応方法を設定する：
1. プログラムを開きます。
2. ［タスク特性］の［拡張］タブを開きます。
3. ［エラー発生時］欄で「R= 復旧」、または「A= アボート」を選択します。

エラーハンドラの定義
エラーハンドラを定義する：
1. プログラムの［タスク定義］を開きます。
2. タスク後処理の下に１行作成します。
3. ［レベル］カラムで「H= ハンドラ」を選択します。
4. ［イベント］カラムでズームして［イベント］ダイアログを開きます。
5. ［イベントタイプ］で「R= エラー」を選択します。
6. ［イベント］欄でズームし、［エラー一覧］の中からハンドルするエラーを選択します。
7. ［タスク定義］の［詳細］カラムで［対応］を選択します。

エラー対応方法の定義［対応］欄はエラーハンドラ実行後の対応方法を定義します。
エラーハンドラの実行後には 6 つの対応方法が選択できます。
• S= タスク特性に依存 ……［タスク特性］に設定されているアクションを実行します。
• A= アボート …… タスクをアボートしてトランザクションをロールバックします。

110

開発者ガイドMagic eDeveloper V9 Plus

トランザクション失敗時の動作• B= ロールバックして再起動 ……［タスク特性］の［タスクタイプ］欄、および［トランザクション開始］欄の設定によって動作が異なります。
タスクタイプ

トランザクション開始

動作

オンライン

レコード前処理の前

カーソルはトランザクションを開始したレコードに留まります。

タスク前処理の前

カーソルはトランザクションを開始したレコードに留まり、最初のレコードに位置付けます。

レコード前処理の前

次のレコードに進みます。

タスク前処理の前

タスクをアボートします。

ブラウザ

バッチ

• R= 自動的にリトライする ……処理が自動的にリトライされます。
• U= ユーザがリトライする ……自動的にロールバックされず、エラーが発生したレ
コード上にカーソルが置かれた状態で制御がエンドユーザに返されます。
• I= 無視する …… エラーをスキップして次レコードの処理へ続行します。
詳細は、『リファレンスマニュアル』の 11 章「データ管理」を参照してください。

エラー対応方法を選択する：
1. ［タスク定義］の［ハンドラ］レベルで［詳細］カラムにカーソルを移動します。
2. ［対応］欄のコンボボックスから対応方法を選択します。

エラー発生時の処理の定義
エラーが発生し、エラーハンドラが起動された場合の処理を定義します。

エラー時の処理を定義する：
1. ［ハンドラ］レベルの行の［処理］カラムでズームし、処理テーブルへ移動します。
2. 行を追加して、エラー対応のための処理コマンドを定義します。

エラーメッセージの表示制御
Magic は通常、エラー発生時にエラーメッセージを表示します。エラーメッセージは、一般の SQL のコマンドに対して表示されるものと同じです。
エラーハンドラや ［動作環境］の設定を使用して、メッセージの表示を制御することができます。

エラーハンドラを使用して制御する：
1. ［ハンドラ］レベルの行の［詳細］カラムで［メッセージ］欄を指定します。
•

Yes……エラーメッセージが表示されます。

•

No……エラーメッセージは表示されません。

2. 「No」に指定し、処理テーブルでエラー処理コマンドを定義することでエラーメッ
セージを上書きすることができます。

開発者ガイドMagic eDeveloper V9 Plus111

第 7 章 - トランザクションとリカバリー［動作環境］を使用してデータベースエラーの表示を制御する：
1. ［設定］メニューで［動作環境］ダイアログを開きます。
2. ［動作設定］タブの［メッセージの詳細表示］オプションを適切な設定にします。
•

Yes…… Magic はエラーメッセージ全文を表示します。

•

No ……エラーメッセージは表示されません。

エラーに関する情報は Magic の関数を使用して取得することができます。これらの情報を用いて、プログラム中で次に行う処理を決定することが可能です。

エラー情報の取得用関数
エラーメッセージに関しての情報を取得するために、下記の Magic 関数が用意されています。
• ErrTableName• ErrDatabaseName• ErrDbmsCode• ErrDbmsMessage• ErrMagicName• ErrPosition
エラーハンドラが実行されるとき、その中に定義されているこれらの関数が評価されます。処理中にこれらの関数を使用してエラーについての情報を表示したり、次のステッ
プで情報を使用することが可能です。

「任意」エラーハンドラの定義
エラータイプに 「任意」を指定すると、発生したあらゆるエラーに対してハンドラを実行することができます。一旦エラーが検出された後、下位のタスクのエラーハンドラを実行するかどうかを［スコープ］の設定を使用して決定します。

「任意」エラーハンドラを定義する：
1. プログラムリポジトリを開き［タスク定義］へズームします。
2. タスク後処理の下に１行作成します。
3. ［レベル］カラムで「H= ハンドラ」を選択します。
4. ［イベント］カラムでズームして［イベント］ダイアログを開きます。
5. ［イベントタイプ］でエラーを選択します。
6. ［イベント］欄でズームし、［エラー一覧］の中からハンドルするエラーを選択します。デフォルトは「任意」になっています。

［伝播］特性の設定
イベントをより上位にあるイベントへ伝播することができます。伝播を「Yes」に設定す
ると、ハンドラの実行後、イベントがまだハンドルされていないかのようにハンドラの検索が続けられ、他のイベントハンドラが実行されます。
• Yes …… イベントを次の［ハンドラ］レベルに渡します。

112

開発者ガイドMagic eDeveloper V9 Plus

データベースへの動的ログイン• No …… イベントは次の［ハンドラ］レベルに渡されず、そのハンドラの実行をもってイベントは破棄されます。

伝播の設定を行う：
1. ［タスク定義］の［ハンドラ］レベルでカーソルを［伝播］カラムへ移動します。
2. Yes ／ No を設定します。
Magic がエラーを検出し、エラーハンドラが実行されたとき、［伝播］カラムが「Yes」に設定されていると、Magic は上位のタスクの（同じエラーに対して定義された）エラー
ハンドラを実行します。
「任意」に対するエラーハンドラがタスクレベル１（子タスク）で定義され、実行された
場合、［伝播］が「Yes」に設定されていれば、タスクレベル 0（親タスク）に定義された
エラーハンドラも実行されます。

データベースへの動的ログイン
データベースで作業しているとき、ログインユーザを変更し、別のユーザでアプリケー
ションに入る必要がある場合があります。しかし、データベースへのログインは接続中は変更されません。ユーザログインを変更するには、接続を閉じ、新しいユーザ名とパスワードを使用して再接続を行う必要があります。

アプリケーション内でデータベースとの接続を閉じる：
1. ［設定］メニューから［論理名］を選択し、［論理名］テーブルを開きます。
2.

F4 を 押 し て、新しい論理名「DB_USER」を作成します。さらに１行追加し、「DB_PASSWORD」という論理名も追加します。

3. ［設定］メニューから［データベース］を選択し（アプリケーションを一旦閉じる
必要があります。）［ データベース特性］ダイアログボックスを開きます。［ログオン］タブの［ユーザ名］欄には 「%DB_USER%」、［パスワード］欄には「%DB_PASSWORD%」と記入します。
これらの論理名は INIPut 関数を使用して変更できます。
データベースとの接続を閉じるには次の関数を使用します。
DbDiscnt（database name）
次にタスクがデータベースに接続する際には、新しいユーザ名とパスワードを使用して接続が確立されます。

データベース制約違反の対応
データベースの整合性を維持するために、重複キーや外部キーといったデータベースの制限が設けられています。これらの制約違反があった場合、データベースはエラーメッ
セージを送信し、このエラーをトリガにして Magic のエラーハンドラが起動されます。
エンドユーザにエラー発生原因の解決をさせるには、このエラートリガを使用する必要があります。以下にこの方法を説明します。
この例は SQL データベースに関連するものです。

1. オンラインタスクを作成します。

開発者ガイドMagic eDeveloper V9 Plus113

第 7 章 - トランザクションとリカバリー
2. タスクに新しいハンドラを定義します。
［イベント］欄でズームし［イベント］ダイ
アログを開きます。［イベントタイプ］には「R= エラー」を選択します。
3. ハンドラの［処理］テーブルで１行作成し［コールタスク］コマンドを定義します。
さらにもう１行作成して［イベント実行］コマンドを定義します。
4. コールタスクの「0」と表示されているところからズームし、［サブタスク一覧］を開きます。F4 を押して新しい子タスクを定義します。このタスクはスクリーンモードで定義してください。
5. ［タスク環境］メニューの［範囲／位置付］を選択します。
［ポジション］欄に「ErrPosition()」という式を入力します。この式はエラーが発生した位置を返す関数です。［方法］欄では「O= このポジションで絞り込む」を選択します。
エラーが発生したとき、このタスクがコールされ、ユーザは問題のあるレコードを修正できるようになります。ユーザが子タスクを終了するときにこの修正は保存されます。
更新済みのレコードを表示させるには画面を再表示する必要があります。これは「ビュー
再表示」のイベントを使用することで実現できます。
1. 親タスクのハンドラで作成した［イベント実行］コマンドに戻ります。
2. ［内容］カラムからズームして［イベント］ダイアログを開きます。
3. ［イベントタイプ］で「I= 内部」、［アクション一覧］には「ビュー再表示」を選択し［OK］をクリックします。
4. ［ウェイト］欄は「No」に設定します。

NULL 値の送信
SQL データベースはカラム中に NULL 値を保持することが可能です。ここでは、NULL
表現を正しく設定する方法を説明します。

NULL 値の表現を定義する：
1. ［CTL 特性］ダイアログを開き、［スタートアップ］タブを選択します。
2. ［NULL 計算］欄では、以下の２通りの設定が可能です。
•

N=NULL にする•

D= デフォルト

「D= デフォルト」に設定していて NULL 関数を使用した場合、関数の結果は項目のデフォ
ルト値となり NULL にはなりません。
例えば、数値項目で範囲を NULL から NULL と指定した場合、NULL はゼロに置き換えられ、全てのレコードが表示されます。
「N=NULL にする」に設定した場合は、実際に NULL 値が使用され、期待していた動作が行われます。
この動作は式においてのみ有効です。NULL を DB SQL WHERE 句で使用した場合、実際の NULL 値が常に使用されます。

114

開発者ガイドMagic eDeveloper V9 Plus

MS-SQL Server 一時テーブル

MS-SQL Server 一時テーブル
一時テーブルは MS-SQL Server によって自動的に作成されるテーブルで、作業終了時に削除されるものです。
一時テーブルには次の２種類があります。
• ローカル一時テーブル• グローバル一時テーブル

ローカル一時テーブル
ローカル一時テーブルは、現セッションの間だけ参照することができます。現セッションの終了時には自動的に削除されます。一時テーブルの名前は先頭に１つの「#」が付いています。（例：# テーブル名）

グローバル一時テーブル
グローバル一時テーブルは、全てのセッションで参照することができます。これらはそのテーブルを作成したセッションの終了時に自動的に削除され、他のタスクからそれを参照することはできなくなります。
タスクとテーブルの関連付けは、１つの Transact-SQL 文の有効期間内でのみ保持されます。これは一時テーブルが実際に参照されセッションが作られた最後の Transact-SQL 文の完了をもって、一時テーブルが削除されることを意味します。
グローバル一時テーブルの名前は先頭に２つの「#」がついています。
（例：## テーブル名）
MS-SQL Server は CREATE 文を発行したデータベースにかかわらず、自動的にグローバルとローカルの一時テーブルを TempDB 中に作成します。
一時テーブルはそれがスコープ外になると自動的に削除されますが、DROP TABLE コマ
ンドで明示的に削除することもできます。
一時テーブルで作業をするときは、以下の事項に注意してください。
• ローカル一時テーブルは子タスク内には作成できません。作業用にローカル一時テー
ブルを作成する場合は、親タスクの DB テーブルに定義する必要があります。
グローバル一時テーブルを使用することもできます。
• SQL コマンドタスクを使用してローカル一時テーブルを参照することはできません。
その場合はグローバル一時テーブルを使用する必要があります。

各 nn レコードでトランザクションをコミットする
大量のレコードを挿入したり更新したりするようなバッチタスクでは、大きなトランザ
クションをまとめてコミットするより、少しずつコミットするような方法が推奨されます。

トランザクション間隔を制御する：
1. レコードメインに変数項目を追加します。
2. 作成した変数項目に対するグループレベルを作成します。
3. レコード後処理で、この変数項目に対する項目更新を「Counter(0) MOD n = 0」を条件に実行するように定義します。
（n は、トランザクションをコミットさせるレコー

開発者ガイドMagic eDeveloper V9 Plus

115

第 7 章 - トランザクションとリカバリー
ド数）
4. ［タスク特性］ダイアログの［拡張］タブの［トランザクション開始］欄に「G= グ
ループ」を設定し、［項目］欄には、変数項目を指定します。
5. プログラムを実行すると、n レコードごとにトランザクションがコミットされ、新しいトランザクションがオープンされます。

116

開発者ガイドMagic eDeveloper V9 Plus

アプリケーションのセキュリティ

8

この章では Magic のユーザ認証システムについて説明いたします。権利を割当てることで、開発環境や実行環境でのプログラム実行、メニュー選択、その他のオブジェクトへのアクセスの制限を行います。
さらに、グループを定義し権利を割り当てることで、管理しやすくすることができます。
Magic の認証システムは、使用しているデータベースのデータテーブルへのアクセス制
限やデータ暗号化などのセキュリティ機能を利用することもできます。

この章では以下のことについて説明いたします。
ユーザの作成118 ページ

実行モードでのログインユーザの変更

120 ページ

ユーザやグループへの権利の割当て

121 ページ

開発モードでの認証システム

122 ページ

アプリケーションに対するアクセス権の定義

123 ページ

アプリケーション保護機能の改善

124 ページ

アプリケーションの全ての操作に対するアクセスの許可

125 ページ

ワークグループ開発を１人のユーザに制限する

125 ページ

データテーブルの暗号化

126 ページ

データの暗号化

126 ページ

開発者ガイドMagic eDeveloper V9 Plus117

第 8 章 - アプリケーションのセキュリティ

ユーザの作成Magic ではアプリケーションに対するユーザを定義することができます。ユーザ ID は
Magic アプリケーション内でユーザの権利を確認する場合に用いられます。Magic を起動
すると［ログオン］ダイアログが表示されますので、ここで「ユーザ ID」と「パスワード」を入力する必要があります。入力値は［ユーザ ID］テーブルに照会され、ユーザの権利を決定します。
ユーザ ID とパスワードが一致しないときは、エラーメッセージが表示され、ダイアログが再び表示されます。
ユーザ ID とパスワードが一致したときは、ユーザの権利が確定されます。ユーザ ID とパスワードは、開発時と実行時の両方の機能に関係します。
［ログオン］ダイアログは「Magic 日付」のパラメータへのアクセスも提供します。
「SUPERVISOR」のユーザ ID（パスワード無し）は Magic でのデフォルトで定義されています。この ID はアプリケーション全体においてフルアクセス権があります。ただし、個別に権利が設定されている場合、その権利キーが必要になります。
ここでは以下の内容について説明します。
• スーパバイザでのログオン• ユーザグループの作成• ユーザ ID の作成• ユーザ情報の取得• グループ／ユーザ／権利の追加

スーバーバイザでのログオン
スーパーバイザでシステムにログオンする：
1. ［設定］メニューから、［ログオン］を選択し、［ログオン］ダイアログを表示します。
2. ［ユーザ ID］欄に「SUPERVISOR」と入力し［パスワード］欄にパスワードを入力
し、［OK］をクリックします。
デフォルトでは、「SUPERVISOR」ユーザにはパスワードが定義されていませんので、以降の「ユーザ ID の作成」での説明を参考にパスワードを設定してください。

グループの作成
グループを作成して権利を関連付ける :1. 「SUPERVISOR」でログオンします。
2. ［設定］メニューから、［ユーザグループ］を選択し、［ユーザグループ］テーブルを開きます。
3. １行作成して新しいユーザグループを定義します。
4. ［権利］カラムでズームして、［権利：グループ名］テーブルを開き１行作成します。
5. ［アプリケーション］のボタンを押し、グループ権利を定義するアプリケーション
を選択します。
6. ［キー］カラムでズームして［公開権利一覧］を開きます。権利キーを選択します。

118

開発者ガイドMagic eDeveloper V9 Plus

ユーザの作成
7. ステップ #4 から #6 を各アプリケーションに対して繰り返します。
［公開権利一覧］で権利を選択するためには、アプリケーション内の権利リポジトリ
で、あらかじめ公開権利が定義されている必要があります。「権利の作成」（121 ページ）を参照してください。

ユーザ ID の作成
新しいユーザ ID を作成し、グループと権利を割当てる :1. 「SUPERVISOR」でログインします。
2. ［設定］メニューから［ユーザ ID］を選択し、［ユーザ ID］テーブルを開き、１行作成して新しいユーザを作成します。
3. 「ユーザ ID」と「名前」を入力します。
4. ［パスワード］カラムからズームして、［パスワード］ウィンドウを開きます。8 文
字までのパスワードを入力します。再入力を要求されますので、再度同じパスワー
ドを入力します。
5. ［権利］カラムからズームして、［権利：ユーザ名］テーブルを開き、１行作成します。
6. ［アプリケーション］のボタンをクリックし、ユーザの権利を定義するアプリケー
ションを選択します。
7. ［キー］カラムからズームして、［公開権利一覧］を開き、権利キーを選択します。
Magic に登録されている各ユーザに対してステップ #5 から #7 を繰り返します。
8. ［ユーザ ID］テーブルの［グループ］カラムからズームして、［グループ : ユーザ名
一覧］を開き、グループを選択します。
［設定］メニューから［動作環境］ダイアログの［システム］タブを開きます。
［パスワード入力］と［日付入力］の欄が「Yes」に設定されていれば、Magic はデフォルトでユー
ザ ID とパスワードの入力を要求するようになります。
「権利を作成する」（121 ページ）を参照してください。

ユーザ情報の取得
下記の関数はログインユーザの情報を取得する場合に使用されます。
• Rights() ……ユーザが与えられた権利を持っているか否かを照会します。ユーザが権利を持っているときは「True」を返します。
• User() …… 現在のログオンユーザを返します。
• Logon() ……ユーザは現在のアプリケーションにログオンすることができます。

グループ／ユーザ／権利の追加
下記の関数を使用すると、グループやユーザをシステムに追加したり、ユーザに権利を追加したりすることができます。
• UserAdd() ……アプリケーション内からユーザを登録します。
• RightAdd() ……アプリケーション内からユーザに権利を追加します。

開発者ガイドMagic eDeveloper V9 Plus

119

第 8 章 - アプリケーションのセキュリティ• GroupAdd() ……アプリケーション内からユーザにグループを割付けます。
「SUPERVISOR」ユーザのみがこの関数を使用することができます。

実行モードでのログインユーザの変更
Magic ではアプリケーションにアクセスできるユーザを定義することができます。
デフォ
ルトユーザとして「SUPERVISOR」が用意されています。
「SUPERVISOR」でログオンしてユーザを作成し、アプリケーションに対するユーザの権利を制限します。
MVCS を使用しているときは必ずログインする必要があります。
実行環境でログオンユーザを変更することもできます。これにより特定の状況でユーザを変更でき、アプリケーションからの退出と再ログインを可能にします。ステータスバーの表示にて現在のログオンユーザを確認できます。
プログラム内でユーザを認識するには、User 関数を使用します。

ここでは以下の内容について説明します。
• システムへのログオン• Logon 関数の使用• ログオン方法の指定

システムへのログオン
ユーザ ［XX］としてシステムにログオンする :1. ［設定］メニューから［ログオン］を選択し、［ログオン］ウィンドウを開きます。
2. ［ユーザ ID］を入力します。ユーザ ID は必ず入力する必要があります。パスワー
ドが定義されている場合は、［パスワード］も必要です。
［日付］はオプションです。

ログオン関数の使用
ログオン関数を使用する：
1. Magic プログラムを作成します。
2. タスク前処理でズームし、［処理テーブル］へ移動します。
3. ［アクション］コマンドを定義します。式テーブルにズームして Logon 関数を定義します。
例 : Logon（”CARL”, “PASS321”）……「CARL」がユーザ ID で「PASS321」がパスワードです。

120

4. プログラムを実行します。選択したユーザ名が有効になっていることを確認してください。このユーザは Magic が終了するか、他のユーザに切り替えられるまで有効です。
現在ログオンしているユーザ名は画面下部のステータス行に表示されます。

開発者ガイドMagic eDeveloper V9 Plus

ユーザやグループへの権利の割当て

ログオン方法の指定［動作環境］ダイアログの［システムログオン］の指定によってログオン方法を変更することができます。以下のパラメータを指定することができます。
• N= なし……前述の「システムへのログオン」の操作が必要です。
• U= ユーザ名……ログオンダイアログを開くと［ユーザ ID］欄には、OS にログインした時のユーザ ID が表示されます。
• D=Active ディレクトリ……クライアント PC が Windows のドメインにログオンされている場合、そのユーザで自動的に Magic にログオンされます。Active ディレクトリに登録されたグループと Magic 側のグループを照合し同じグループがあれば、そのグループで権利認証を行います。
• L=LDAP…… ログオンダイアログを開いてユーザ ID とパスワードを入力すると［動作環境］ダイアログで指定された LDAP サーバへのログオンを行います。LDAP サー
バにユーザが登録されていないとログオンできません。権利認証はグループで行います。

ユーザやグループへの権利の割当て
Magic アプリケーションは権利を識別します。処理に必要な権利がユーザに割当てられていれば、そのユーザはその処理を行うことが許可されます。
権利はユーザやグループに割当てることができます。
権利リポジトリでは、アプリケーションに定義された全ての権利の名前とキーが登録されています。権利リポジトリを編集する権限をもっているユーザは以下の通りです。
• 権 利 リ ポ ジ ト リ に 登 録 さ れ た キ ー を 持 っ て い る「SUPERVISOR」ユ ー ザ。
「SUPERVISOR」ユーザは、権利の登録はできますが、登録した権利のキーを持っていない場合は、以降の保守ができません。
• ［CTL 特性］の［セキュリティ］タブにある、［スーパー権利キー］を持つユーザ。
［スーパー権利キー］が指定されている場合、「SUPERVISOR」ユーザであってもそのキーを持っていないとアクセスできません。
他のユーザは、キーを持っている権利に限って照会のみ可能となっています。
許可されない利用を防ぐには、各オブジェクトごとに権利キーを設定してください。

ここでは以下の内容について説明します。
• 権利の作成• ユーザグループへの権利の割当て• ユーザへの権利の割当て

権利の作成
権利を作成する：
1. 「SUPERVISOR」でログオンします。
2. 設定するアプリケーションを開きます。
3. ［ワークスペース］メニューから［権利］を選択するか、Shift+F5 を押して権利リ
ポジトリを開きます。

開発者ガイドMagic eDeveloper V9 Plus121

第 8 章 - アプリケーションのセキュリティ
4. １行作成します。
5. ［名前］カラムに任意の名前を付けます。
6. 「キー」を権利に割付けます。
「キー」とは権利を特定するためのコードネームです。
7. 権利を公開権利として参照できるようにする場合は、［公開］欄を「Yes」に、それ以外の場合は「No」に設定します。
8. 権利をコンポーネント化しアプリケーション外から使用できるようにする場合は、［公開権利名］にユニークな名前を入力します。
9. ［OK］をクリックしてアプリケーションを閉じます。

ユーザグループへの権利の割付け
ユーザグループに権利を関連付ける：
1. 「SUPERVISOR」でログオンします。
2. ［設定］メニューから［ユーザグループ］を選択します。
3. １行作成してグループ名を入力します。
4. ［権利］カラムでズームし、１行作成して「権利キー」を追加します。
5. 公開権利の場合は、［公開権利一覧］から必要な権利を選択できます。
タスクやプログラムで異なった処理を実行させるには、Rights 関数を使用した条件式を使用します。

ユーザへの権利の割当て
ユーザに権利を関連付ける：
1. 「SUPERVISOR」としてログオンします。
2. ［設定］メニューから［ユーザ ID］を選択します。
3. 権利を与えるユーザを選択します。
4. ［権利］カラムからズームして、「権利キー」を選択します。
5. ［グループ］欄からズームして［グループ一覧］を開き、グループを選択します。
6. ［OK］をクリックしてエントリを保存します。

開発モードでの認証システム
Magic はユーザの操作を制御するための認証システムを持っています。Magic の認証シス
テムは、アプリケーションの開発者やシステムのスーパーバイザに対して Magic のオブジェクトへのアクセスを制限します。認証システムは、それらの制御を権利設定とユー
ザ ID の組み合わせで行います。
権利は錠前に対する鍵と考えることができます。グループを使用することで特定クラスのユーザにアプリケーションの特定部分へのアクセスを許可することができます。スーパーバイザは、各ユーザに対して権限のある操作のみ実行できるように権利を割当てることができます。

122

ここでは以下の内容について説明します。

開発者ガイドMagic eDeveloper V9 Plus

アプリケーションに対するアクセス権の定義• リポジトリへの権利の割当て

リポジトリへの権利の割当て［権利設定］ダイアログは、様々なアプリケーションオブジェクトに対して許可されている操作の設定／確認を行う場合に使用します。この操作は開発時と実行時共に使用できます。例えば開発者が何かの操作（例：テーブル内に行を追加するなど）を行おうとした際には、その開発者が対応する操作権限を持っている場合にのみ操作を実行することができます。
モデル、テーブル、プログラム、ヘルプ、メニューのリポジトリまたは CTL 特性で、オプションメニュから権利設定を選択すると、権利設定ダイアログを開くことができます。
設定できる権利には以下のものがあります。
• 照会権利……権利を持っているユーザに対してエントリを見ることを許可します。
• 修正権利……権利を持っているユーザに対してエントリを更新することを許可します。
• 削除権利……権利を持っているユーザに対してエントリを削除することを許可します。
• 登録権利……権利を持っているユーザに対して新しいエントリを登録することを許可します。
• 実行／ APG 権利…… 権利を持っているユーザに対して APG を使用することやプログ
ラムリポジトリからプログラムを実行することを許可します。
実行／ APG 権利はモデル、ヘルプ画面、メニューリポジトリでは使用できません。
削除、登録、実行／ APG 権利は CTL 特性では使用できません。

Magic の各リポジトリに権利を割当てる：
1. 「SUPERVISOR」としてログオンします。
（アプリケーションに［スーパー権利キー］
が割り当てられている場合は、そのキーを持ったユーザでログオンします。）
2. 任意のリポジトリの先頭にカーソルを位置付けるか、［オプション］メニューから［権利設定］を選択するか F9 を押します。
権利設定ダイアログが開きます。
3. 「照会」、「修正」、「削除」、「登録」、「実行／ APG」の権利を割付けます。
ダイアログに表示されている各操作には、権利番号を入力するかズームして［利用可能権利一覧］から選択します。
ダイアログ中の権利を１つでも持っている開発者やユーザは下記のことが可能となります。
•

ダイアログ中の許可されている権利の参照•

許可されている権利のエントリへの異なる権利の割付け／削除

アプリケーションに対するアクセス権の定義［CTL 特性］ダイアログで CTL アクセスキーを定義し、そのキーをユーザの［権利］リ
ポジトリでユーザに設定することにより、アプリケーションへのアクセスを制限できます。CTL アクセスキーの保有者だけが、そのアプリケーションにアクセスできます。

開発者ガイドMagic eDeveloper V9 Plus123

第 8 章 - アプリケーションのセキュリティ

CTL アクセスキーの定義
CTL アクセスキーを定義する：
1. 「SUPERVISOR」としてログオンします。
2. ［開発］モードでアプリケーションをオープンします。
3. ［ファイル／ CTL 特性］を選択して、［CTL 特性］ダイアログにアクセスします。
4. ［セキュリティ］タブで、［CTL アクセスキー］欄にコード名を入力します。

ユーザへの CTL アクセスキーの割り当て
ユーザへ CTL アクセスキーを割り当てる：
1. 「SUPERVISOR」としてログオンします。
2. ［設定／ユーザ ID］を選択して、［ユーザ ID］テーブルにアクセスします。
3. 選択したユーザの［使用権利］欄からその［権利］リポジトリの使用権利にズームします。
4. ［CTL 特性］ダイアログの［セキュリティ］タブで［CTL アクセスキー］欄に入力したコードと同じコードを、［キー］欄に、入力します。
CTL アクセスキーを定義しユーザに設定すると、そのアクセスキーを設定されていない
ユーザは、［CTL 特性］ダイアログの［セキュリティ］タブで［CTL アクセスキー］欄を参照することができなくなります。

アプリケーション保護機能の改善
公開使用権利アクセスキーを定義すると、アプリケーションのセキュリティを向上させることができます。このキーを所有しないスーパーバイザは、特定のアプリケーション
でどのキーにどの使用権利が関連しているかを見つけだすことができません。
［ユーザ
ID］テーブルの［使用権利］欄からズームすると、このキーを所有しないスーパーバイ
ザは、所定のキーに関連した使用の権利についての記述のある［使用権利名］欄を見ることができないだけでなく、［使用権利］の全一覧に［キー］欄からズームすることもできなくなります。
スーパーバイザは、［権利］テーブに対して公開権利アクセスキーをキー入力で定義できますので、あらかじめ公開権利アクセスキーを知っておく必要があります。

公開使用権利アクセスキーの定義
公開権利キーを定義する：
1. 「SUPERVISOR」としてログオンします。
2. ［開発］モードでアプリケーションをオープンします。
3. ［ファイル／ CTL 特性］を選択して、［CTL 特性］ダイアログにアクセスします。
4. ［セキュリティ］タブで、［公開権利キー］欄にコード名を入力します。

124

開発者ガイドMagic eDeveloper V9 Plus

アプリケーションの全ての操作に対するアクセスの許可

ユーザに公開使用権利アクセスキーを割り当てる：
ユーザに公開使用権利アクセスキーを設定する手順は、前述の CTL アクセスキーと同じです。
［公開権利アクセスキー］を定義した場合、そのアクセスキーを設定されていないユーザ
は、［CTL 特性］ダイアログで［公開使用権利アクセスキー］欄を参照することができません。

アプリケーションの全ての操作に対するアクセスの許可
スーパー権利キーをユーザに設定すると、そのユーザは開発と実行の両方の目的でアプ
リケーションの操作のすべてに対する全使用権利を保有するようになります。したがって、スーパー権利キーの所有者は、個々のアプリケーション操作に対する個別の使用権利を保有する必要はありません。

スーパー権利キーの定義
スーパー権利キーを定義する：
1. 「SUPERVISOR」としてログオンします。
2. ［開発］モードでアプリケーションをオープンします。
3. ［ファイル／ CTL 特性］を選択して、［CTL 特性］ダイアログにアクセスします。
4. ［セキュリティ］タブで、［スーパー権利キー］欄にコード名を入力します。

ユーザにスーパ権利キーを割り当てる：
ユーザにスーパー権利キーを設定する手順は、前述の CTL アクセスキーと同じです。
スーパー権利キーを設定すると、スーパー使用権利キーを保有していない人は、［CTL 特性］ダイアログで［スーパー使用権利キー］欄を参照することができません。

ワークグループ開発を１人のユーザに制限する［ワークグループ開発］のためのアクセスを特定の１人のユーザに制限する目的で強制MVCS 設定キーを設定することができます。
強制 MVCS 設定キーを持っていないユーザは、［アプリケーション特性］の［MVCS 無
効］欄が［Yes］に設定されているアプリケーションをオープンすることができません。

強制 MVCS 設定キーの定義
強制 MVCS 設定キーを定義する：
1. 「SUPERVISOR」としてログオンします。
2. ［開発］モードでアプリケーションをオープンします。
3. ［ファイル／ CTL 特性］を選択して、［CTL 特性］ダイアログにアクセスします。
4. ［セキュリティ］タブで、［強制 MVCS 設定キー］欄にコード名を入力します。

開発者ガイドMagic eDeveloper V9 Plus125

第 8 章 - アプリケーションのセキュリティ［強制 MVCS 設定キー］をユーザに割り当てる
ユーザに強制 MVCS 設定キーを設定する手順は、前述の CTL アクセスキーと同じです。
［強制 MVCS 設定キー］を設定した場合、そのキーを保有していないユーザは、［CTL 特性］ダイアログで［強制 MVCS 設定キー］欄を参照できなくなります。

データテーブルの暗号化使用する DBMS が暗号化機能をサポートしている場合、この機能を利用して暗号化させることができます。暗号化されたテーブルを参照するには、アクセスキーが必要になります。

テーブルを暗号化するには：テーブルリポジトリを開き、該当するテーブルにカーソルを移動します。
［編集］／［特性］（Ctrl+P）を実行し［テーブル特性］ダイアログを開きます。以下の値を設定します。
• アクセスキー……テーブルにアクセスするためのパスワードを入力します。Pervasive.SQL の場合、「オーナ名」に該当します。
• テーブル暗号化……データ内容を暗号化するかどうかを指定します。

データの暗号化
Magic の暗号化関数は、汎用的な暗号化アルゴリズムを使用しています。この関数を利用することで、データベース内のデータだけでなく、アプリケーションサーバ上との間の通常のデータも暗号化することができます。また、暗号化キーがあれば、外部のアプ
リケーションとの間で暗号データのやり取りも可能です。

暗号化の種類暗号化の方法にはいろいろな種類がありますが、大きく分けて「対称キー暗号化」と「非対象キー暗号化」があります。

対称キー暗号化
暗号化と複合化を同じキーで行ないます。このため、暗号化する側と複合する側で同じキーを持つ必要があります。
このキーが外部に渡ればアクセスできることになります。

非対象キー暗号化
暗号化と複合化で異なるキーを使用します。暗号化するには、「公開キー」と呼ばれるキーを使用します。複合するキーは「秘密キー（または、個人キー）」を使用します。
この場合、「秘密キー」さえ外部に漏れなければ、データの内容を保護することができます。
この「公開キー」と「秘密キー」は、決まったアルゴリズムを元にペアで作成されたものを使用します。

126

開発者ガイドMagic eDeveloper V9 Plus

データの暗号化

対称キー暗号化による暗号／複合化
RC2（Ron’s Code 2）という暗号方式を例に暗号化／複合化を行います。RC2 には、４つのモードがサポートされています。デフォルトは CBC（Cipher Block Chaining Mode）です。

変数とイベントの定義
次の４つの変数を定義します。
• 入力用文字列……Blob 型（リッチエディット）• 暗号化用文字列……Blob 型（リッチエディット）• 複合化用文字列……Blob 型（リッチエディット）• キー用文字列……Blob 型（リッチエディット）
次の２つのユーザイベントを定義します。
• 暗号化
• 複合化
これらの変数とイベントを割り当てたプッシュボタンをメインフォームに配置します。

暗号化処理の定義「暗号化」イベントのハンドラを作成し、項目更新処理コマンドを定義します。
• 更新項目……変数「暗号化用文字列」• 式……Cipher （5, 変数「入力用文字列」, 変数「キー用文字列」,’CBC’）

複合化処理の定義「複合化」イベントのハンドラを作成し、項目更新処理コマンドを定義します。
• 更新項目……変数「複合化用文字列」• 式……DeCipher （5, 変数「暗号化用文字列」, 変数「キー用文字列」,’CBC’）

動作確認
変数「入力用文字列」と変数「キー用文字列」に適当な文字列を入力して「暗号化」ボ
タンをクリックすると、変数「暗号化用文字列」に暗号化された文字列が返ります。
「複合化」ボタンをクリックすると、変数「複合化用文字列」に暗号化される前の文字列が返ります。
暗号化と複合化でキーが異なる場合は、元の文字列が返りません。

非対称キー暗号化による暗号／複合化
RSA という暗号方式を例に暗号化／複合化を行います。この場合は、暗号化用／複合化のためのキーをあらかじめ作成する必要があります。

キーの作成
RSA のキーを作成するには、外部のライブラリを使用する必要があります。以下は、XML形式のキーファイルを作成する C# のプログラム例です。
using System;
using System.Security.Cryptography;
using System.IO;

開発者ガイドMagic eDeveloper V9 Plus127

第 8 章 - アプリケーションのセキュリティ
using System.Text;
namespace RSAEncryption{/// <summary>/// Summary description for Class1.
/// </summary>class Class1{/// <summary>/// The main entry point for the application.
/// </summary>[STAThread]static void Main(string[] args){
RSACryptoServiceProvider rsa;
rsa = new RSACryptoServiceProvider(1024);
RSAParameters result = new RSAParameters();
result = rsa.ExportParameters(true);
String xml = rsa.ToXmlString(true);byte[] plainBytes = Encoding.ASCII.GetBytes(xml.ToCharArray());
FileStream instream = new FileStream("RsaKeyPrivate.xml", FileMode.Create);
instream.Write(plainBytes, 0, plainBytes.Length);
instream.Close();result = rsa.ExportParameters(false);
xml = rsa.ToXmlString(false);
plainBytes = Encoding.ASCII.GetBytes(xml.ToCharArray());
instream = new FileStream("RsaKeyPublic.xml", FileMode.Create);
instream.Write(plainBytes, 0, plainBytes.Length);
instream.Close();}}}このプログラムを実行すると、「RsaKeyPublic.xml」という公開キーと「RsaKeyPrivate.xml」という秘密キーが作成されます。

変数とイベントの定義
次の４つの変数を定義します。
• 入力用文字列……Blob 型（リッチエディット）• 暗号化用文字列……Blob 型（リッチエディット）• 複合化用文字列……Blob 型（リッチエディット）• 暗号化キー用文字列……Blob 型（リッチエディット）• 複合化キー用文字列……Blob 型（リッチエディット）
次の２つのユーザイベントを定義します。
• 暗号化
• 複合化
これらの変数とイベントを割り当てたプッシュボタンをメインフォームに配置します。

暗号化処理の定義「暗号化」イベントのハンドラを作成し、２つの項目更新処理コマンドを定義します。
1. 公開キーを変数「暗号化キー用文字列」に入力します。

128•

更新項目……変数「暗号化キー用文字列」•

式……File2Blb （'RsaKeyPublic.xml'）

開発者ガイドMagic eDeveloper V9 Plus

データの暗号化
2. 公開キーで暗号化を行います。
•

更新項目……変数「暗号化用文字列」•

式……Cipher （9, 変数「入力用文字列」, 変数「暗号化キー用文字列」,’’）

複合化処理の定義「複合化」イベントのハンドラを作成し、２つの項目更新処理コマンドを定義します。
1. 秘密キーを変数「複合化キー用文字列」に入力します。
•

更新項目……変数「複合化キー用文字列」•

式……File2Blb （'RsaKeyPrivate.xml'）

2. 公開キーで暗号化を行います。
•

更新項目……変数「複合化用文字列」•

式……Cipher （9, 変数「暗号化用文字列」, 変数「複合化キー用文字列」,’’）

動作確認
変数「入力用文字列」に適当な文字列を入力して「暗号化」ボタンをクリックすると、変数「暗号化用文字列」に暗号化された文字列が返ります。
「複合化」ボタンをクリックすると、変数「複合化用文字列」に暗号化される前の文字列が返ります。
複合化処理で「秘密キー」を使用しても元の文字列が返りません。

Magic と外部アプリケーション間でのデータの暗号化
Magic と外部アプリケーション間でのデータは、キーが提供されていれば暗号化してやり取りできます。
ここでは、OpenSSL(http://www.infoscience.co.jp/technical/openssl/) を使用した暗号化と複合化の例を示します。openssl はコマンドラインプログラムです。コマンドプロンプトを起動して実行します。
また、公開キーと秘密キーは、openssl で作成する Pem 形式のものを使用します。

キーの作成
秘密キー
「RsaKeyPrivate.pem」という名前の秘密キーファイルが作成されます。
openssl genrsa -out RsaKeyPrivate.pem 1024

公開キー
公開キーは秘密キーをもとに作成されます。
以下のコマンドで、「RsaKeyPrivate.pem」という名前の公開キーファイルが作成されます。
openssl rsa -inform PEM -outform PEM -in RsaKeyPrivate.pem -out RsaKeyPublic.pem pubout

暗号化
公 開 キ ー を 使 用 して「Original Data.txt」というテキストファイルを暗号化し、「Encrypted Data.dat」に出力する例です。

開発者ガイドMagic eDeveloper V9 Plus129

第 8 章 - アプリケーションのセキュリティ
openssl rsautl -encrypt -in "Original Data.txt" -inkey RsaKeyPublic.pem"Encrypted Data.dat"-pubin -out

複合化
秘 密 キ ー を 使 用 して「Encrypted Data.dat」というテキストファイルを暗号化し、「Decrypted Data.dat」に出力する例です。
openssl rsautl -decrypt -in "Encrypted Data.dat" -inkey RsaKeyPrivate.pem -out
"Decrypted Data.dat"

130

開発者ガイドMagic eDeveloper V9 Plus9

高度なプログラミング

この章では、エンドユーザがアプリケーションを使用する時に、利便性を向上させる機能について説明いたします。

この章では以下のことについて説明いたします。
チョイスコントロールの設定

132 ページ

マージ出力

133 ページ

１：ｎ のリレーションのプログラム

135 ページ

フォーム表示の保存と再使用

137 ページ

論理名の使用138 ページ

イメージプッシュボタンのデザイン

138 ページ

モーダルウィンドウに設定

139 ページ

子タスクのレベルからプログラムを終了

139 ページ

テーブルのレコード合計の計算

140 ページ

カーソルの変更

141 ページ

電子メールの送受信

142 ページ

コントロールハンドラの利用

144 ページ

ツリーコントロールの定義

144 ページ

メモリテーブルの保存

146 ページ

ウィンドウの分割

147 ページ

ユーザ定義開発メニュー

147 ページ

プログラムの関数化

149 ページ

開発者ガイドMagic eDeveloper V9 Plus131

第 9 章 - 高度なプログラミング

チョイスコントロールの設定
チョイスコントロールには、リストボックス、コンボボックス、ラジオボタン、タブがあります。これらは、選択肢を定義しておくことで実行時にユーザにその選択肢の中から値を選択させることができます。
この選択肢をテーブルのデータから取得させるように設定されたものをデータコント
ロールといいます。データコントロールを使用することでテーブルのデータの内容に基づいて選択肢を動的に指定することができます。
ここでは、コンボボックスを例にして、チョイスコントロールの定義方法を説明します。
ここでは以下の内容について説明します。
• データコントロールの設定• 選択項目リストの利用

データコントロールの設定
コンボボックスをデータコントロールにする：
1. オンラインプログラムを開き、Ctrl+U で、メインフォームを開きます。
2. ［コントロール］パレットでコンボボックスを選択し、フォームにドラッグ＆ドロッ
プします。
3. Ctrl+P を押してコンボボックスの［特性］シートを開きます。
4. コンボボックス特性の［詳細］セクションにある以下の特性を指定します。
•

ソーステーブル……テーブルリポジトリでのテーブル番号。ズームして［テーブル一覧］を開き選択できます。

•

表示項目……表示するカラム番号。ズームして［項目一覧］から選択できます。

•

リンク項目……取得するカラム番号。ズームして［項目一覧］から選択できます。

•

インデックス……ソートに使用するテーブルのインデックス番号。ズームして［インデックス一覧］から選択できます。

•

範囲……ソーステーブルからリンクされるレコードの範囲を指定できます。
ズームして［項目範囲］ダイアログを開きます。

Magic エンジンは、ソーステーブルを開き、範囲指定されたレコードの表示項目とリンク項目を取得します。表示項目を元に画面上は表示されますが、実際に取得される値は、リンク項目になります。

選択項目リストの使用
ソーステーブルがオープンできなかったときや定義されていないとき、値が無効なとき
は、［選択項目リスト］特性が使用されます。これは、Ver9.4SP1 以前の［ラベル］特性に該当します。選択肢となる文字列をカンマ区切りで指定します。
［選択項目リスト］特性の内容と異なる内容で表示したい場合は、［選択表示リスト］特性に値を指定してください。この場合、［選択項目リスト］特性で指定された値と同じ順
序と数で指定してください。

設定例• 選択項目リスト：White,Blue,Pink,Red,Yellow• 選択表示リスト：白 , 青 , 桃 , 赤 , 黄

132

開発者ガイドMagic eDeveloper V9 Plus

マージ出力
この場合、実行時の表示は 「白 , 青 , 桃 , 赤 , 黄」の順で表示されます。
「青」を選択した場合、「Blue」が返ります。

各選択肢に対して他のコントロールとの間で親子リンクを設定することができます。この場合は、Shift キーを押しながらフォームに表示されている選択肢をクリックして対応する選択肢を選び、その状態で他のコントロールの親になるように親子リンクを設定し
ます。

マージ出力
Magic を Web 環境で使用しているとき、Magic は HTML ファイルを作成します。Magic
は HTML 全体を作成することも、既存の外部テンプレートファイルにマージ出力することも可能です。テンプレートファイルは Magic が認識できる特別なタグを持ったテキス
トファイルです。Magic は特定の［トークン前付符号］と［トークン後付符号］を使用
したタグを認識します。タグには２種類あります。名前タグ（値をマージする）と論理タグです。
テンプレートファイルとして、HTML ファイル、テキストファイルなどが使用できます。
外部テンプレートファイルと Magic のマージ出力機能を使用することで、柔軟なファイ
ル出力処理が可能になります。
ここでは以下の内容について説明します。
• HTML タグの使用• HTML マージオプションの選択• タグ値の定義• HTML マージタスクのコントロールの定義• 複数行データのマージ

HTML タグの使用［タグテーブル］を使用して、テンプレートファイルのタグにデータを関連付けることができます。
［データ出力］コマンドによって HTML マージ形式のフォームを出力すると、タグと出力データは、マージ機能へ送られます。タグがテンプレート内に見つからない場合は、それらは無視されます。
マージ機能に送られたデータの後についている全ての空白はトリミングされます。
HTML タグを使用するには、以下の手順を実行します。
• テンプレートファイルの作成• HTML マージプログラムの作成• タグ値の定義• HTML マージプログラムのタスク制御の定義

テンプレートファイルを作成する：
テンプレートファイルは、テキストエディタや HTML ファイルのオーサリングツールなどを使用して作成します。

開発者ガイドMagic eDeveloper V9 Plus133

第 9 章 - 高度なプログラミング
HTML ファイルとして出力する場合は、HTML の書式に準じて記述する必要があります
が、ここでは簡単なテキストファイルとして出力することを想定したマージファイルを作成します。
<!$MGREPEAT><!$MG_number> <!$MGIF_IsEven>Even<!$MGELSE>Odd<!$MGENDIF><!$MGENDREPEAT>
上記のタグは以下の意味を示しています。
• <!$MGREPEAT> 〜 <!$MGENDREPEAT> ：このタグの間の内容がレコード数分繰り返されます。
•<!$MG_number> ：タグ「number」に対応する値が出力されます。

•<!$MGIF_IsEven> 〜 <!$MGELSE> 〜 <!$MGENDIF>：タグ「IsEven」に対応する値が 「True」の場合を条件にした If/Else 文です。

マージタグについての詳細は、『リファレンス』の 10 章「出力フォーム」を参照してください。

HTML マージプログラムを作成する：
1. プログラムを作成し、［タスク特性］を開きます。
2. ［タスクタイプ］で「B= バッチ」を選択します。
3. ［タスク環境］メニューから［入出力ファイル］を選択します。
4. １行作成し、ファイル名を入力します。
5. ［メディア］カラムで「F= ファイル」を、［アクセス］カラムで「W= 書出」を選択します。［式／項目］カラムでズームして出力ファイル名を式で指定します。
6. Ctrl+F を押して［フォーム］テーブルを開き、１行作成し、［インタフェースタイ
プ］には , 「M=HTML マージ形式」を選択します。
上記の操作が完了したら、タグ値の定義を行ってください。

タグ値の定義する：
1. HTML マージフォームの行から Ctrl+P を押して［フォーム特性］シートを開きます。
2. ［HTML ファイル］欄にテンプレートファイル名を入力します。
3. ［タグテーブル］欄からズームして［タグテーブル］を開きます。
4. ［新しいタグを選択］をクリックし、必要とするタグを選択します。（例では、「number」と「IsEven」がタグ名として表示されます。）
5. タグの値を（項目または式で）指定します。
上記の操作が完了したら、HTML マージプログラムのタスク制御を定義してください。

HTML マージプログラムのタスク制御を定義する：
1. ［タスク定義］でレコード後処理へ移動し、１行作成します。
2. ［データ出力］コマンドを定義します。
3. ［データ出力］コマンド行の２番目のパーク欄でズームして［フォーム一覧］を開き、前述で作成したマージフォームを選択します。

134

4. ［ファイル］欄でズームし、［入出力ファイル一覧］を開き前述で作成したファイル

開発者ガイドMagic eDeveloper V9 Plus

１：ｎ のリレーションのプログラム
を選択します。
5. Ctrl+C を押して［タスク制御］を開きます。
6. ［OK］をクリックします。

複数行データのマージ［複数行編集］が「Yes」に設定されたエディットコントロールによって入力されたデー
タには、改行コード（CR/LF）が含まれている場合があります。このコードが含まれているデータをそのままマージデータとして使用することはできません。一旦、「<BR>」という文字に置き換える必要があります。

複数行データをマージデータに定義する：
1. HTML マージフォームの行から Ctrl+P を押して［フォーム特性］シートを開きます。
2. ［タグテーブル］欄からズームして［タグテーブル］を開きます。
3. ［新しいタグを選択］をクリックし、必要とするタグを選択します。
4. ［式］カラムから［式］テーブルにズームして、以下のようにタグの値を指定します。
REPSTR（データ項目 ,CHR(13)&CHR(10), '<BR>'）

１：ｎ のリレーションのプログラム
リレーショナルデータベースシステムでよく使われるリレーションには、次の２つがあります。
• １：１…… Magic への組み込みは［リンク］コマンドを使用します。これにより、タ
スク内部でメインテーブルの現在の行とリンクテーブルの特定行のリレーションを確立します。
• １：ｎ…… Magic への組込みは親子タスク構造で実現します。１：ｎ のリレーション
は、１つのテーブルの各行が他のテーブルの複数行に対応しているときに存在します。マッチングのプロセスはキーとなるカラムをインデックスに定義していると効率が良くなります。
以下、受注アプリケーションを例にとってこれらのリレーションについて説明いたします。
• このアプリケーションは、受注データを受注テーブルと受注明細テーブルで管理します。
• 顧客テーブルの各行が一人の顧客を表します。受注テーブルの各行は特定顧客に関連付けられた受注データを表します。
• 顧客番号が両方のテーブルにインデックスとして定義されていることで、顧客テーブ
ルの各行は受注テーブルの複数行と関連付けられています。
ここでは以下の内容について説明します。
• １：ｎ のプログラムの作成• １：ｎ リレーションでのデータ整合性の維持

１：ｎ のプログラムの作成
下記に受注入力画面で、１：ｎ のプログラムを作成する方法を説明いたします。
最初に親タスクを作成します：

開発者ガイドMagic eDeveloper V9 Plus135

第 9 章 - 高度なプログラミング
1. 受注テーブルをメインテーブルとしたオンラインタスクを作成します。
2. 必要な項目を選択します。
3. スクリーンモードでフォームを作成します。
次に子タスクを作成します：
1. 受注明細テーブルをメインテーブルとしたオンラインタスクを作成し、必要な項目を選択します。
2. 受注番号の項目の［範囲］欄に親タスクの受注番号で指定します。
3. 受注番号の［代入］欄には［範囲］欄に入力した式と同じ式を指定します。
4. ［タスク制御］ダイアログ（Ctrl+C）を開いて、［オプション］タブの［ウィンドウ消去］を「No」に設定します。
5. ［タスク特性］ダイアログ（Ctrl+P）を開いて［タスク終了条件］から［式］テー
ブルにズームし、「Level（1）=’RP’」と定義します。
［チェック時期］には「I= 即時」を選択します。
6. ラインモードでフォームを作成します。
7. 子タスクを作成したら、親タスクの２箇所でそれをコールするように設定します。
•

レコード前処理•

レコードメイン#5 の［タスク終了条件］により、レコード前処理で起動されたタスクは、ウィンドウ表示を残したまま即終了します。これによって親タスクの受注データが変わるたびに明細データも連動して表示されるようになります。
子タスクを別のプログラムとすることも可能です。この場合は、親タスクの項目を直接参照することができないため、パラメータを渡すようにする必要があり、以下のような修正が必要です。
1. 子プログラムで、［セレクト］コマンドでパラメータ項目を定義し、受注番号を受け取るようにします。
2. パラメータ項目を使用して受注番号の範囲と代入を指定します。
3. 親プログラムでのコールコマンドでは、受注番号をパラメータとして指定します。

１：ｎ リレーションでのデータ整合性の維持
親レコード（受注テーブル）が削除された場合の対応：
親レコードの削除時に、対応する明細テーブルも削除するようにするには以下のようにします。
1. 親タスクに別の子タスクを追加します。
2. ［タスク特性］ダイアログ（Ctrl+P）を開き、［タスクタイプ］を「B= バッチ」、［初期モード］には「D= 削除」を設定します。［メインテーブル］には、明細テーブルを指定します。
3. 受注番号の項目のみ［セレクト］コマンドで定義し、親タスクの受注番号を［範囲］欄に指定します。
4. 親タスクのレコード後処理で、この子タスクをコールするように指定します。［条件］欄には 「Stat（0,’D’MODE）」と指定します。

136

開発者ガイドMagic eDeveloper V9 Plus

フォーム表示の保存と再使用

受注入力が中断された場合の対応：
受注データの登録処理おいて、明細データを登録後に、受注データの入力画面に戻り F2
キー（編集／キャンセル）で受注データの登録処理を中断した場合、受注データの入力
内容は書き込まれませんが、明細データは書き込まれてしまうという問題が発生する場
合があります。このような問題に対応するため遅延トランザクションを利用します。
（以下の設定内容は、デフォルト値ですので通常は設定し直す必要はありません。）
1. 親タスクの［タスク特性］の［拡張］タブを開き、［トランザクションモード］を「D= 遅延」に指定します。
2. 子タスクの［タスク特性］の［拡張］タブを開き、［トランザクションモード］を「P= 親と同一」に指定します。
これにより、親タスクでのデータ更新処理がコミットされるまで明細データは更新されません。

フォーム表示の保存と再使用
Magic フォームのテンプレートを使用して、各フォームに統一感を出すことができます。
ここでは以下の内容について説明します。
• フォームテンプレート• フォームテンプレートの保存• フォームテンプレートの読込

フォームテンプレート
現在のフォームをテンプレートとしてファイルに保存することができます。デフォルトのファイル拡張子は MFT（Magic Form Template）です。テンプレートには全てのコント
ロールと下記以外のコントロール特性が保存されます。
• コントロール名• 式• データ• 選択プログラム
上記の特性はテンプレートがロードされたときには空欄として設定されます。
既存のフォーム上にテンプレートをロードした場合、全てのフォーム設定が上書きされます。さらにフォーム上にある全てのコントロールは削除されます。
フォームテンプレートは、GUI、テキスト、HTML、フレームセット形式フォームで有効です。同一のフォーム形式のテンプレートのみ読み込むことができます。

フォームテンプレートの保存
テンプレートファイルを保存する：
1. ［ファイル］メニューから［テンプレートの書込］を選択します。
2. ファイル名を入力して保存します。

開発者ガイドMagic eDeveloper V9 Plus137

第 9 章 - 高度なプログラミング

フォームテンプレートの読込
既存のフォームテンプレートを読み込む：
1. フォームエディタに入ります。
2. ［ファイル］メニューから［テンプレートの読込］を選択します。
3. 読込後は、各コントロールの特性値を設定します。

論理名の使用
論理名を定義するときに他の論理名を使用することができます。
例えば次のような場合です。
Path = c:¥myApp¥
Images = %Path%images
関数で論理名に対応する実行名を取得する場合、使用する関数によって結果が異なりますので注意してください。
• INIGet（‘［MAGIC_LOGICAL_NAMES］Images’）使用すると、「%Path%Images」という値が取得されます。
• Translate（‘%Images%’）を使用すると、「c:¥myApp¥Images」という値が取得されます。

イメージプッシュボタンのデザイン
プッシュボタンコントロールには、以下の３つのタイプが指定できます。
• プッシュボタン……通常のボタン• イメージボタン……イメージファイルとして表示されるボタン• ハイパースタイル……Web のハイパーリンクに似ている下線の付いたテキストが表示されます。
ここでは、イメージボタンの定義方法について以下の内容で説明します。
• イメージボタンの設計• イメージボタンの表示

イメージボタンの設計
イメージボタンには 4 つの状態があり、それぞれにイメージを作成し１つのファイルに合成する必要があります。

イメージボタンの状態• フォーカス……カーソルがパークしている状態• 選択……クリックされている状態• 無効 ……ボタンが無効である状態• デフォルト……上記以外の通常の状態
1 つのイメージを自動的に４つに分割して表示します。このことを考慮しないイメージを割り当てると、ボタンが正常動作していない印象を与えます。

138

開発者ガイドMagic eDeveloper V9 Plus

モーダルウィンドウに設定

イメージボタンの表示
Magic プログラム中でイメージボタン定義するには以下のようにします。

プッシュボタンに項目を関連付ける場合 :項目に指定するイメージファイル名を変えることで、ボタンイメージを実行時に変更することができます。
1. 文字型変数項目を定義します。書式のサイズはイメージファイルのフルパス名が入る長さが必要です。
2. 変数に対する［特性］シートの［スタイル］セクションで［GUI 表示］欄で「P=プッシュボタン」を定義し、［コントロール特性］で［ボタンスタイル］に「I= イ
メージボタン」を選択します。
3. レコードメインで、変数の［代入］欄にはイメージファイルのフルパス名を入力します。論理名も使用できます。
4. メインフォーム上にこの変数を配置します。

項目を関連付けない場合 :1. フォームエディタでメインフォームを開き、［コントロール］パレットよりプッシュ
ボタンを配置します。
2. プッシュボタンコントロールの［特性］シートを開き、［ボタンスタイル］に「I= イ
メージボタン」を設定します。
3. ［デフォルトイメージファイル］にイメージファイルのフルパス名を入力します。
論理名も使用できます。

モーダルウィンドウに設定
モーダルウィンドウとは、現在のウィンドウを閉じるまでは他のウィンドウをクリック
できないウィンドウです。

タスクのウィンドウをモーダルに設定する：
1. フォームテーブルを開きます。（Ctrl+F）
2. メインフォームの［フォーム特性］を開きます。（Ctrl+P）
3. ［モーダルウィンドウ］欄を「Yes」に設定します。（または「True」と評価される式を代入します。）

子タスクのレベルからプログラムを終了［終了］アクションは現在のタスクレベルを終了します。下位のタスクにいる場合、［終了］アクションを実行すると１つ上位のタスクに戻ります。ここでは、イベントを発行することで下位のタスクからプログラムを終了させる方法を説明いたします。
イベントトリガに対する処理をハンドラと呼びます。ハンドラ内にはイベントが発生した場合の処理を記述することができます。ハンドラの特性の１つに「伝播」特性があります。これにより上位タスクに同じイベントトリガを使用したハンドラが定義されている場合、そのハンドラ処理を実行します。
ここでは以下の内容について説明します。

開発者ガイドMagic eDeveloper V9 Plus

139

第 9 章 - 高度なプログラミング• イベントの［伝播］特性の利用

イベントの［伝播］特性の利用
以下のような親子タスクを作成します。
1. 親タスクのイベントテーブル（Ctrl+K）に以下のようなイベントを登録します。
•

名前：プログラムを終了•

タイプ：N= なし•

トリガ：（指定しません）

2. 親タスクのタスク定義に［ハンドラ］レベルを登録し、イベントにユーザイベントの「プログラムを終了」イベントを登録します。［伝播］欄は「No」にします。
［ハンドラ］レベルの処理テーブルに［イベント実行］コマンドを登録し、内部イベ
ントの「終了」を定義します。
3. 子タスクのタスク定義にも #2 と同様に［ハンドラ］を定義し、「プログラムを終了」
イベントを定義します。ここでは、［伝播］欄を「Yes」にします。
［ハンドラ］レベルの処理テーブルに［イベント実行］コマンドを登録し、内部イベ
ントの「終了」を定義します。
4. 子タスクのメインフォームにプッシュボタンを配置して、［実行イベント］特性に、「プログラムを終了」を割り当てます。
これで、子タスクのプッシュボタンをクリックすると、親タスクも終了します。子タス
クの［ハンドラ］レベルの［伝播］欄を「No」にすると、子タスクのみ終了します。

テーブルのレコード合計の計算
画面に表示されているテーブルの指定したレコードの合計値を計算したい場合があります。このようなことは、テーブルのマルチマーキング機能と Magic の関数を組み合わせることで実現できます。
製品番号と価格の２つのカラムをもつテーブルがあると仮定します。いくつかの製品価格の合計を計算する場合は、このレコードをマルチマーキングで指定して、合計を計算するハンドラを実行します。
（F9 キーでこのハンドラが実行されることを前提に説明します。
）

テーブルの選択レコードの合計を計算する：
すでにテーブル表示のタスクができているものとします。F9 キー（システムイベント）
に対するハンドラを作成します。このハンドラに以下の処理を定義します。
1. 数値型の変数項目を定義します。この変数は、計算処理で使用されます。
2. 変数項目に対する初期化用の項目更新処理を定義します。更新される値は、「0」です。更新処理の条件は、MMCurr(0)=1 です。この関数は、マークした最初のレコードに対してのみ実行されます。
3. この変数に対する項目更新を実行します。更新値は、変数項目と製品価格を加算した値です。
4. エラーコマンドを定義して、’ 合計は、’&Str(A,’##’)&’ です。’ （A は、変数項目）を表示させるようにします。このコマンドが実行される条件は、
MMCurr(0)=MMCount(0) にします。これによって、最後の選択レコードの処理が終了した時点で合計値が表示されます。

140

開発者ガイドMagic eDeveloper V9 Plus

カーソルの変更

カーソルの変更
SetCrsr 関数を使用して、プログラム動作中のカーソルの形状を変更することができます。

カーソルの形状を変更する：
1. アクション処理コマンドを定義します。
2. アクション処理コマンドに SetCrsr(n) 関数を設定します。
この関数は、カーソル形状を決定する数値のパラメーターを指定します。
指定できる値と対応するカーソルの形状は次のとおりです。
パラメータ

形状

1

標準の矢

2

砂時計

3

手

4

標準の矢印と砂時計

5

十文字

6

矢印と疑問符

7

アイビーム

8

禁止

9

四方向矢印

10

斜め両方矢印11

上下両方向矢印

12

斜め両方向矢印

13

左右両方向矢印

14

上向き矢印

表示例

表示されるカーソルイメージは、OS の設定によって変わります。

開発者ガイドMagic eDeveloper V9 Plus141

第 9 章 - 高度なプログラミング

電子メールの送受信
Magic のメール関数を使用して、電子メールの送受信を行うプログラムを作成することができます。

Magic アプリケーションから電子メールを送信する：
1. 「送信」アクション（ユーザアクション）に対するハンドラを作成します。
2. ハンドラに数値型の変数（N6）を定義します。この変数項目には、「メール接続エ
ラーコード」という名前を指定します。
3. 「メール接続エラーコード」変数に以下の式で項目更新処理を実行します。
MailConnect(1,SMTP_Server_Name,’’,’’)
MailConnect 関数には、以下のようなパラメータを指定します。
MailConnect ( タイプ , サーバ , ユーザ ID, パスワード )パラメータ：

タイプ：サーバタイプ（数値）• 1 …… SMTP サーバ
サーバ：SMTP サーバのアドレス（文字列）
ユーザ ID：メールボックスに対するユーザ ID
パスワード：メールボックスに対するパスワード（SMTP サーバに接続する場合、通常ユーザ ID やパスワード
は指定しません。）

この関数を呼ぶことで、メールサーバへの接続を行います。接続に失敗した場合、エラーコードが返ります。このエラーコードは、MailError 関数を通すことによりどのようなエラーなのかを判断する情報を取得することができます。
4. 「メール送信エラーコード」という別の変数項目（N6）を定義します。
5. 「メール送信エラーコード」変数を以下の関数で項目更新します。
MailSend (From, To, Cc, Bcc, 件名 , 本文 , ファイル名 , …)
パラメータ：

From：送信元のアドレス（文字列）
To：送信先のアドレス（カンマ区切りで複数指定可）
Cc：CC アドレス（カンマ区切りで複数指定可）
Bcc：BCC アドレス（カンマ区切りで複数指定可）
件名：メールの件名（文字列）
本文：メールの本文（文字列）
ファイル名：添付ファイルのファイル名（複数指定可）

戻り値：

送信処理の結果が数値で返ります。
• 0……送信成功• 負数……送信失敗（エラーコード）

MailError 関数を使用することで、エラーコードからエラーの原因を確認することができます。

Magic アプリケーションで電子メールを受信する：
1. 「受信」アクション（ユーザアクション）に対するハンドラを作成します。

142

2. ハンドラに数値型の変数（N6）を定義します。この変数項目は、「メール接続エラー

開発者ガイドMagic eDeveloper V9 Plus

電子メールの送受信コード」と呼びます。
3. 「メール受信数」変数に以下の式で項目更新処理を実行します。
MailConnect(2,POP3_Server_Name,’’,’’)
MailConnect 関数は、以下のようなパラメータを持ちます。
MailConnect ( タイプ , サーバ , ユーザ ID, パスワード )パラメータ：

タイプ：サーバタイプ（数値）• 2…… POP3 サーバ• 3…… IMAP サーバ
サーバ：POP3 または IMAP サーバのアドレス（文字列）
ユーザ ID：メールボックスに対するユーザ ID
パスワード：メールボックスに対するパスワード

この関数を呼ぶことで、POP3/IMAP サーバへの接続を行います。接続に失敗した
場合、エラーコード（負数）が返ります。接続に成功した場合メールボックス内にあるメールの数が返ります。
4. メールの受信は項目毎に異なる関数を実行する必要があり、対応する変数項目を定義します。例えば以下の関数を実行します。
•

MailMsgFrom (Index) …… メールの送信元のアドレス（文字列）が返ります。

•

MailMsgSubj (Index) …… メールの件名（文字列）が返ります。

•

MailMsgText (Index) …… メールの本文（文字列）が返ります。
パラメータ：

Index：メールボックス内のメールのインデックス番号

mailto スキームを使用して電子メールを送信する
PC に電子メールクライアント用ソフトウェアがインストールされており、このメールク
ライアントがデフォルトの Web ブラウザに関連付けられている場合、mailto スキームを利用することができます。
（通常は、Web ページにリンクして使用するものを Magic プログラムから呼び出します。）
OS コマンドで以下のような式を指定します。
'mailto:'&Trim (A)&'?cc='&Trim (B)&'&bcc='&Trim (C)&'&subject='&Trim(D)&'&body='&Trim (E)'
上記の式で指定される各項目は以下の通りです。
•

A …… TO（宛先）アドレス•

B …… CC アドレス•

C …… BCC アドレス•

D …… 件名•

E …… メッセージ

このプログラムを実行すると、メールクライアントが起動され指定された内容が設定されます。
メッセージ内に改行コードが入っていてもメールクライアントには渡らないので、
メールクライアント側で調整する必要があります。

開発者ガイドMagic eDeveloper V9 Plus143

第 9 章 - 高度なプログラミング

コントロールハンドラの利用
タスク定義にはコントロールハンドラを定義することができます。ここに処理を定義することで、コントロール間のカーソル移動で処理実行させることができます。これにより、レコードメインにはセレクトやリンクコマンドのみを定義するだけでよくなり、プ
ログラムが非常に見やすくなります。
コントロールハンドラの詳細については、『リファレンス』の 5 章「Magic アプリ
ケーションエンジン」を参照してください。

ここでは、コントロール検証についての利用方法について説明いたします。

コントロール検証の利用
カーソルが指定されたコントロールから移動したり、高速モードでコントロールを通過した場合に、［コントロール検証］ハンドラが実行されます。このハンドラでコントロー
ルの内容をチェックするための処理を定義できます。

コントロール検証を定義する：
1. タスク定義で１行追加します。［レベル］カラムを「C= コントロール」にします。
2. ［イベント］カラムで、「V= 検証」を指定します。
3. ［詳細］カラムの［コントロール］欄でズームすると［コントロール一覧］が表示されます。メインフォームに登録されたコントロールの［コントロール名］特性が設定されているものが表示されます。
4. 対応する処理テーブルに処理コマンドを定義します。
このハンドラに［エラー］コマンドを定義することで以下のような場合にエラーメッセー
ジを表示させることができます。
• レコードを修正後に、他のレコードにカーソルを移動したり、タスクを終了した場合• カーソルが該当するコントロールにある状態で、別のコントロールにカーソルを移動した場合

コントロール検証を無効化する：
ハンドラに条件を設定することで、無効化することができます。
1. メインフォームのキャンセル用プッシュボタンの［コントロール名］特性に「キャンセル」と入力します。
2. コントロール検証ハンドラの［有効］欄からズームして式テーブルに入り以下の条
件式を定義します。
CtrlName () <>’ キャンセル ’
これで、キャンセルボタンを押した場合は、コントロール検証ハンドラの処理は実行されません。カーソルの移動やこのプッシュボタンを使用しない終了処理の場合は、処理が実行されます。

ツリーコントロールの定義
144

ツリーコントロールを使用すると、レコード間に親子関係のある DB テーブルの内容をツリー表示させることができます。

開発者ガイドMagic eDeveloper V9 Plus

ツリーコントロールの定義

ツリー化するテーブルの概要
ツリー表示するテーブルには親子関係を表すためのカラム（ノード ID、親 ID）が必要です。例えば、以下のようなレコードのあるテーブルを考えます。
ノード ID

親 ID

表示項目

C1

親1

C2

親2

C3

親3

C4

親4

R1

C1

子1

R2

C2

子2

R3

C3

子3

R4

C4

子4

P1

R1

孫1

P2

R2

孫2

P3

R2

孫3

P4

R4

孫4

図 9-1 ツリー表示

この場合、ノード ID「Cx」のレコードは、ノード ID「Rx」の親になり、ノード ID「Rx」
は、ノード ID「Px」の親になります。このテーブルをツリー表示させると右側のようになります。

ツリー表示プログラムを作成
以下の手順でテーブルの内容をツリー表示するプログラムを作成します。
1. 前述のテーブルをメインテーブルとしたオンラインプログラムを作成します。
［セレクト］処理コマンドで、３つのカラムを定義します。
2. メインフォームを開きます。フォームにツリーコントロールを配置します。
3. ツリーコントロールのコントロール特性を開き、以下の特性値を指定します。
•

ノード ID……カラム「ノード ID」•

親の ID……カラム「親 ID」•

表示項目……カラム「表示項目」

ツリーにアイコンを表示させる
ツリーコントロールの各ノードにアイコンを表示させることができます。この場合、以下のようなイメージファイルを事前に作成する必要があります。イメージは、16 × 16
（ピクセル）のイメージを結合させたものです。

開発者ガイドMagic eDeveloper V9 Plus

145

第 9 章 - 高度なプログラミング
図 9-2 ツリー用アイコンイメージの例

このイメージファイル名をツリーコントロールの［画像一覧ファイル名］に指定します。
これにより、以下のコントロール特性欄でズームするとアイコン一覧が表示され、選択することができます。
• 展開表示画像インデックス• 縮小表示画像インデックス• パーク展開表示画像インデックス• パーク縮小表示画像インデックス

ツリーのルートを指定する
特定のノードをルートとしたツリー表示を行う場合は、コントロール特性の［ルート値］
を使用します。
例えば、［ルート値］を「C2」と指定した場合、以下のように表示されます。

図 9-3 ルート値の指定

この場合、指定されたルート値は表示されません。ルート値を表示させるには、［ルートの表示］特性を「Yes」にします。これによって以下のように表示されます。

図 9-4 ルートを表示させる

メモリテーブルの保存
メモリテーブルは、Magic エンジンのインスタンスが終了した時点で内容が削除されまが、メモリテーブルの内容をファイルに保存することで Magic エンジンを再起動した後にメモリテーブルの内容を利用することができます。
ここでは、メモリテーブルの内容を保存する手順と、保存された内容を復元する手順を説明します。

Magic 終了時
タスク後処理に以下の処理を定義します。
1. メモリテーブルの内容を Blob 項目に格納する。（MtblGet 関数を使用）
2. Blob 項目をファイル化する。（Blb2File 関数を使用）

146

開発者ガイドMagic eDeveloper V9 Plus

ウィンドウの分割

Magic 起動時
タスク前処理に以下の処理を定義します。
1. ファイルの内容を Blob 項目に格納する。（File2Blb 関数を使用）
2. Blob 項目をメモリテーブルに展開する。（MtblSet 関数を使用）

ウィンドウの分割
親タスクと子タスクの表示を１つのウィンドウで表示させる場合、V9Plus SP1 までは、
子ウィンドウという機能で実現していました。V9Plus SP3 からは、この他に親タスクのフォームを分割し、片方のフォームに子タスクの内容を表示させることができるようになりました。これにより子タスクの表示内容の配置が楽になります。
プログラムの基本的な作成方法は同じですが、メインフォームの設定方法が以下のように異なります。必要に応じて使い分けて下さい。
子ウィンドウウィンドウ分割

親タスクのフォーム特性不要［分割］セクション

子タスクのフォーム特性［入力］セクション［入力］セクション

子ウィンドウ
タイトルバー

分割子ウィンドウ

分割線

表示されない（ラインコント
ロールを配置することで表示
可）

表示される

開発時の位置調整

必要（配置どおりに表示される）不要（分割フォームに収まるように調整される）

複数分割

可（複数の子タスクを子ウィンドウとして表示させることが可能）

不可（２分割のみ）

不可（タイトルバーを表示させている場合は、子タスクのウィンドウを移動させることができる）

可（分割位置を変更できる）

設定

ウィンドウ分割
初期表示
分割割合
分割位置

動作

実行時の
分割サイズ変更

子タスクのフォームを分割することで複数分割させることは可能

ユーザ定義開発メニュー
ユーザ定義開発メニューには、Magic が開発モードの時に表示されるメニューです。ここにツール用の Magic アプリケーションを組みこむことで、アプリケーションの開発中に呼び出すことができます。また、ツール用アプリケーションの起動時と終了時に起動
もとの Magic アプリケーションを操作することができます。

開発者ガイドMagic eDeveloper V9 Plus147

第 9 章 - 高度なプログラミング
ここでは、簡単なツール用アプリケーションの作成と組み込み方法について説明いたします。このアプリケーションは、起動元のアプリケーションのテーブルリポジトリの一覧を表示します。テーブル名を変更して終了すると終了時にカーソルがあるテーブル名が変更され、更に APG が実行されます。

ツールアプリケーションの動作概要
1. 開発モードの Magic エンジンから起動された場合、事前定義ファイルの指定にもとづき、起動元のアプリケーションのテーブルリポジトリに対するドキュメント出力
処理を実行します。出力される書式は以下のようにします。
（この処理は、Magic の自動処理機能を使用します。）|$|Tbl|$| テーブル番号 |$| テーブル名 |$|2. この後、ツールアプリケーションが起動されます。起動されたアプリケーションは、出力されたファイルを読み込みテーブル一覧を作成します。
3. アプリケーションの終了時に、更新されるテーブルの番号とテーブル名をもとに事後処理用の定義ファイルを作成します。
4. ツールアプリケーション終了後、事後処理用の定義ファイルをもとにテーブル名が変更され、APG が実行されます。

事前定義ファイルの作成
事前定義ファイルとして、以下のような内容のテキストファイルを作成します。
Document,(FilePath)MyWizardInput.tmp,Repository=T InternalValues=Y
IncludeComponents=Y TemplateFile=(FilePath)MyWizard̲doc.tpl
この指定により、MyWizard̲doc.tpl ファイルをテンプレートとしたドキュメント出力処理が自動的に実行され、テーブルリポジトリの内容がテキスト（MyWizardInput.tmp）出力されます。
この時のテンプレート（MyWizard̲doc.tpl）は以下のようにします。
#section File̲table
D￨$￨Tbl￨$￨%obj̲idx,5%￨$￨%File̲Name, 30%￨$￨#End File̲table
テンプレートのキーワードについては、『リファレンス』の第 9 章の「ドキュメント
テンプレート機能」を参照してください。

ツールアプリケーションの作成
ツールアプリケーションは以下の機能を組み合わせます。

出力されたテーブル情報の読込
アプリケーション起動前に作成されたテーブル情報（MyWizardInput.tmp）を読み込み
テーブルを作成します。出力ファイルは、「|$|」がトークンとなっているため、StrToken関数を使用して文字列を取得することができます。

テーブル情報の表示

148

読み込まれたテーブル情報を表示します。

開発者ガイドMagic eDeveloper V9 Plus

プログラムの関数化

事後定義ファイルの作成
アプリケーション終了時に事後定義ファイルを作成します。以下は、定義ファイルを作成する場合の式テーブルの例です。
Simulate,WIN=TBL̲REP#'&Trim (Str (E,'4'))&';TXT='&Trim (F)&';KEY=Ctrl+G;KEY=Enter•

E：テーブル番号を表す項目のシンボル名•

F：テーブル名を表す項目のシンボル名

この定義ファイルにより、ツールアプリケーション終了後に以下の処理が実行実行されます。
• 指定されたテーブル番号に位置付かれます。（WIN=TBL̲REP#nn）• テーブル名を入力します。（TXT=XXXXXX）• APG を実行します。（KEY=Ctrl+G;KEY=Enter）

アプリケーションの MFF 化作成した Magic アプリケーションを MFF 化します。ユーザ定義開発メニューで実行できる Magic アプリケーションは、MFF 化されたものだけです。

メニューの定義
上記で準備された内容を有効にするために、Magic.ini ファイルにメニューを登録します。
以下は登録例です。
アプリケーション終了時に事後定義ファイルを作成します。以下は、定義ファイルを作成する場合の式テーブルの例です。
[TOOLS̲MENU]
MyMenu =A,MyWizard,,%MyWizardDir%MyWizard.mff,,%MyWizardDir%MyWizard̲pre.opr,%MyWizardDir%MyWizard̲post.opr,ImageFor = B ToolNumber = 60
ToolGroup = 1•

MyWizard……表示されるメニュー名•

MyWizard.mff……アプリケーションファイル名•

MyWizard_pre.opr……事前定義ファイル名•

MyWizard_post.opr……事後定義ファイル名•

ImageFor = B ToolNumber = 60 ToolGroup = 1……ツールバーとプルダウンメ
ニューの両方に表示されます。ツールバーのイメージと位置が指定されます。

プログラムの関数化
CallProg 関数を利用することで、Magic プログラムを Magic の関数のように扱うことができます。
ここでは、簡単な条件式の判定を Magic プログラムで行い、その結果を呼び出し側のプ
ログラムの実行条件にする例を説明します。以下の２つのプログラムを作成します。
• 条件判定用プログラム• 呼び出しプログラム

開発者ガイドMagic eDeveloper V9 Plus149

第 9 章 - 高度なプログラミング

条件判定用プログラム
1. 以下のタスクを作成します。
•

タスクタイプ …… バッチ•

タスク終了条件 …… Yes•

チェック時期 …… B= 前置

2. レコードメインで以下のパラメータを定義します。
•

Parameter1 …… 数値型（3）•Parameter2 …… 数値型（3）3. ［タスク特性］の［戻り値］にて以下の式を指定します。
Parameter1>Parameter2

呼び出しプログラム
1. 以下のタスクを作成します。
•

タスクタイプ …… オンライン

2. レコードメインで以下の変数を定義します。
名前

型

書式

Argument1

N= 数値

3N

Argument2

N= 数値

3N

3. ［イベント］テーブルにユーザイベントを定義します。このユーザイベント使用するイベントハンドラを作成します。［処理テーブル］に以下の処理を定義します。
処理コマンド

内容

モード

条件

エラー

Argument1 が大きい

W= 警告

式＃１

エラー

Argument2 が大きい

W= 警告

式＃２

式テーブルには以下の式を定義します。
•

式＃１：CallProg ('2'PROG,Argument1,Argument12）•

式＃２：NOT（CallProg ('2'PROG,Argument1,Argument12）'2'PROG は、「条件判定用プログラム」を示します。
4. プログラムのメインフォームには、２つの変数とユーザイベントを定義したプッ
シュボタンコントロールを配置します。
5. このプログラムを実行して、Argument1 及び Argument2 に数値を入力し、プッシュ
ボタンをクリックすると入力内容に基づいてメッセージダイアログが表示されます。

ファントムタスク「ファントムタスク」とは、1：n のリレーションのプログラムにおいて［ウィンドウ消去］を「No」に設定したタスクです。（135 ページで紹介済み。）これにより、子タスクが終了してもウィンドウ表示が残るようになります。

150

開発者ガイドMagic eDeveloper V9 Plus

ファントムタスク
Ver9 までは、ファントムタスクを実現するためにはレコードメインで子タスクを呼ぶよ
うに定義する必要がありました。V9Plus では、ハンドラで子タスクを呼び出すように指定することができます。
Magic のプログラムでは、レコードメインにセレクトまたはリンク以外の処理コマン
ドを定義しないように推奨しています。旧バージョンの Magic アプリケーションを移行する際もできるだけハンドラに処理を移すようにしてください。
ここでは、135 ページで紹介した「1:n のプログラム」において子タスクを起動している処理をレコードメインからハンドラへ移動する手順について説明いたします。

ハンドラに処理コマンドを移動する
1. ［タスク定義］ウィンドウに１行追加し、以下のように定義します。
•

レベル …… C= コントロール•

イベント …… Y= 検証•

詳細 …… 項目「受注番号」に対応するメインフォームのコントロール名

2. レコードメインのコール処理コマンドが定義された行にカーソルを移動します。マウスで右クリックを実行します。コンテキストメニューが表示されるので、「切り取り（T）」を選択します。
3. 作成したハンドラの［処理テーブル］にカーソルを移動し（テーブルのタイトル行がカーソル位置になります。）、マウスで右クリックを実行します。コンテキストメ
ニューが表示されるので、「貼り付け（A）」を選択します。
レコードメインに定義されていたコール処理コマンドがハンドラに移動されます。
どのコントロールに対するコントロールハンドラを定義するかによって動作が変わります。親タスクで最後にパークするコントロールを使用してください。これは、キー
ボードでカーソルを移動する処理を実行した場合、カーソルの移動途中で子タスクに行かないようにするためです。

開発者ガイドMagic eDeveloper V9 Plus151

第 9 章 - 高度なプログラミング［このページは意図的に空白にしています。］

152

開発者ガイドMagic eDeveloper V9 Plus

印刷の実行10

この章では Magic での印刷に関する事項を説明します。
詳細については『リファレンス』の 10 章「出力フォーム」を参照してください。

この章では以下のことについて説明いたします。
APG を使用した簡単な印刷プログラム

154 ページ

簡単な印刷プログラムの作成

154 ページ

ページヘッダとフッタの定義

156 ページ

子タスク間での入出力ファイルの共有

156 ページ

プログラム間での入出力ファイルの共有

157 ページ

入出力ファイルの出力先の指定方法

157 ページ

印刷プレビューの使用

159 ページ

複数の帳票の作成

159 ページ

長さの異なる複数行のテキスト印刷

159 ページ

テーブルの行数の制御

160 ページ

子タスク内でのテーブル印刷

160 ページ

画面に表示されたデータの印刷

160 ページ

開発者ガイドMagic eDeveloper V9 Plus153

第 10 章 - 印刷の実行

APG を使用した簡単な印刷プログラム
APG（Autometic Program Generator）を使用すると帳票プログラムを簡単に作成できます。
ここでは、基本的な構造のタスクを作成し、さらにより複雑な機能を組み込む手順を説明します。
APG にアクセスするには、以下のどちらかの方法があります。
• ［オプション］メニューの［APG］をクリックする• Ctrl+G を押す。

印刷プログラムの作成
ここでは、APG を使用して印刷プログラムを作成する方法について説明します。

APG のパラメータを設定する：
1. テーブルリポジトリの希望するテーブル上で Ctrl+G を押します。
2. APG ダイアログの［処理モード］を指定します。リポジトリにプログラムを作成するときは［G= 作成］モードを選択し、実行のみの場合は［E= 実行］モードを選択します。
3. ［オプション］欄では、［P= 印刷］を指定します。
4. ［選択カラム数］でズームして［カラム選択］を開き、カラムの出力順に［カラム］
カラムに番号を指定します。「0」を設定するとカラムは出力されません。
5. ［プログラム名］欄に任意の名前を付けます。この名前は APG によってプログラムを作成する際のプログラム名となります。
6. ［テキストファイル］欄に帳票の出力先を指定します。ファイルの場合はファイル
名を、プリンタの場合は［設定／プリンタ］で登録されているプリンタ名を指定します。

目的のスタイルを選択する：
1. APG ダイアログの［スタイル］タブで帳票の外観を選択することができます。
［表示モード］欄でテーブル形式の「L= ライン」または１ページ１レコードの形式の「S= スクリーン」のどちらかを指定できます。作成モードで APG を実行した場合は、後から出力フォーマットを編集することができます。
2. APG ダイアログの［スタイル］欄で、「3= 立体」または「2= 平面」のどちらかの外観を選択します。
既に GUI 出力フォームのモデルが作成されている場合は、［モデルを使用］欄からモデルを選択して使用することも可能です。
3. 帳票のヘッダとしてタイトルバーを出力する場合は、［タイトルバー］のチェックボックスをチェックします。

簡単な印刷プログラムの作成
ここでは、APG を使用しないで帳票出力プログラムを作成する手順について説明します。
以下のことについて説明します。

154

開発者ガイドMagic eDeveloper V9 Plus

簡単な印刷プログラムの作成• 帳票のデータビューの定義• 入出力ファイルの設定• 帳票フォームのデザイン• ［データ出力］コマンドの使用

帳票のデータビューの定義
帳票のデータビューを定義する：
1. バッチタスクを作成します。メインテーブルを選択し、レコードメインで［セレクト］コマンドを使用して、カラムを選択します。
2. 必要に応じて変数項目を定義します。初期値は、代入式で値を設定することで指定できます。
バッチタスクのレコードメインでは、［セレクト］コマンドと［リンク］コマンドのみ使用できます。

入出力ファイルの設定
入出力ファイルを設定する：
1. ［入出力ファイル］テーブル（Ctrl+I）を開き、１行作成します。
2. ［メディア］カラムは「G=GUI 形式プリント」を選択します。ユーザにプリンタを選択させるときは、［ダイアログ］欄を「Yes」に設定します。印刷プレビューを使用したいときは、Ctrl+P で［入出力特性］を開き［印刷プレビュー］を「Yes」に設定します。

帳票フォームのデザイン
帳票フォームをデザインする：
1. Ctrl+F を押してフォームテーブルを開きます。
2. 新しいフォームを作成します。［インタフェースタイプ］は「G=GUI 形式」、［クラス］は「1」、［区分］は「D= 明細」に設定します。
3. カーソルを［名前］の欄に置き、フォームにズームします。空のフォームが開きます。
4. テーブルコントロールを配置し、各項目をテーブルへ配置します。
5. テキストコントロールやエディットコントロールをヘッダとしてテーブルの上に配置します。Owner()、Date()、等の関数を使用したり、タイトル文字を指定します。これは各ページの先頭に表示されます。必要であれば、テーブルの下にフッタを追加することもできます。

［データ出力］コマンドの使用
下記の手順はレコードを取得して所定のフォーマットで出力する処理の手順です。各レ
コード毎に情報をプリンタへ出力する必要があります。

開発者ガイドMagic eDeveloper V9 Plus155

第 10 章 - 印刷の実行
1. レコード後処理のハンドラに［データ出力］コマンドを追加します。
2. ［出力フォーム］には「2」を選択し、［ファイル］には「1」を選択します。
（前述の説明で作成された入出力ファイルと帳票フォームです。）［頁］の欄は「A= 自動」
を設定します。これはヘッダの印刷は Magic により管理されることを意味します。
ヘッダ付きのテーブルでは、同じフォームを出力していても、Magic はテーブルの上に配置されているコントロールをヘッダとみなします。これらは最初のレコードの情報で全ページに印刷されます。２つ目以降のレコードについては、該当するレコード情報だ
けが出力されます。

ページヘッダとフッタの定義
会社のロゴや日付など、各ページにヘッダとフッタを印刷することが必要な場合があります。Magic では固定ヘッダとフッタのブロックを定義することができます。

帳票に固定ヘッダ／フッタを定義する：
1. Ctrl+F で［フォーム］テーブルを開き、新しい GUI 出力フォームを２つ作成します。
•

最初のエントリは［区分］を「H= ページヘッダ」に設定します。

•

次のエントリは［区分］を「F= ページフッタ」に設定します。

これらのフォームは明細フォームで作成したヘッダ（フッタ）とは異なり、各ペー
ジで他の全てのフォームが印刷される前（後）に出力されます。
2. Ctrl+I で［入出力ファイル］テーブルを開き、Ctrl+P で［入出力特性］ダイアログを開きます。
［ページヘッダ］欄と［ページフッタ］欄にこれらのフォームを設定します。
Magic はヘッダ／フッタフォームを印刷する前に、「ページヘッダ」と「ページフッタ」という内部イベントを自動的に発行します。これを利用してハンドラを作成し、フォー
ムに配置した項目の計算を実行することができます。

子タスク間での入出力ファイルの共有
ここでは複数の子タスク間で１つの入出力ファイルを共有する方法を説明します。
複雑な帳票では複数のタスクによる作業が必要な場合があります。帳票に必要な情報を関連する複数のテーブルから取得する必要がある場合、テーブルの処理には複数のタスクが必要です。
例えば、請求書を印刷する場合には２つのタスクを作成することになります。１つはヘッダで１つは明細です。２つのタスクは同じ出力ファイルを定義しなければなりません。
タスク前処理の前に、エンジンはテーブルに定義されている入出力ファイルをオープンします。それらはタスク後処理の完了後、クローズされます。
全てのタスクで１つの入出力ファイルを使用するためには、それを共有できる場所に定義する必要があります。

子タスク間で同じ入出力ファイルを使用
タスク間で共有できる入出力ファイルを定義する：
1. 親タスクで［入出力ファイル］テーブルを定義します。
2. 子タスクで［入出力ファイル］テーブルを開くと、上位のタスクで定義したエント

156

開発者ガイドMagic eDeveloper V9 Plus

プログラム間での入出力ファイルの共有
リが表示され、子タスクでも使用することができます。
親タスクで入出力ファイルを定義した後は、子タスクで出力先をそのエントリを選択するだけで使用できます。
［データ出力］コマンドの［ファイル］欄でこの入出力ファイル
を指定します。

プログラム間での入出力ファイルの共有
ここでは、複数のプログラムから１つの入出力ファイルを共有する方法を説明いたします。
子タスクの場合と異なり、プログラム間では入出力テーブルを直接参照することができません。全てのプログラムで１つの入出力ファイルを使用するためには、それを共有できるように入出力ファイルを定義する必要があります。

プログラム間で１つの入出力ファイルを使用
異なったプログラムで同じ入出力ファイルを使用する：
1. 実行ツリーの先頭プログラムに共有する入出力ファイルを定義します。
複数のプログラムから使用できる入出力ファイルを定義するには、それを上位のプ
ログラム内に定義する必要があります。
2. コール先のプログラムの入出力ファイルにて上位プログラムの入出力ファイルを参照する設定を行います。
この２つの入出力ファイルのリンクは［入出力特性］の［使用する入出力名］特性で行われます。コール先プログラムの［使用する入出力名］欄にコール元プログラムの「入出力ファイル名」を式で定義します。
同じ入出力ファイル名を使用すると、エンジンは新しいファイルをオープンせず、
既にオープンされている指定ファイルに出力するようになります。

入出力ファイルの出力先の指定方法
ここでは、帳票プログラムの実行時に出力先を指定できるようにするための方法について説明します。
以下のことについて説明します。
• Windows 印刷ダイアログ• 入出力ファイルの式定義• デフォルトプリンタの設定

Windows 印刷ダイアログ
エンドユーザが帳票の帳票の出力先を指定したい場合、印刷実行時に印刷ダイアログを表示させるようにすることが最も簡単な方法です。この指定は、入出力テーブルの［メディア］カラムが「G=GUI 形式プリント」のときのみ有効です。

プリンタを選択させるようにする：
1. ［入出力ファイル］テーブルの［ダイアログ］カラムを「Yes」もしくは「True」の値を返す論理型の式を設定します。
この場合、入出力ファイルに出力する前に、エンジンが Windows の印刷ダイアログ

開発者ガイドMagic eDeveloper V9 Plus

157

第 10 章 - 印刷の実行を開き、プリンタの選択、部数や印刷方向などの特性を指定できるようになります。
2. ダイアログで必要な特性を選択し、［OK］をクリックすると印刷が開始されます。

入出力ファイルの式定義［入出力ファイル］テーブルの［式］カラムには OS のファイル名を使用することができます。ここには「サーバ名」、「パス」、「ファイル名」と「論理式」を使用することができます。この式はタスク起動時に評価されるため、［入出力テーブル］が定義されたタスク内で動的に変更することはできません。上位タスクで式に関連する値を決め、パラメー
タで渡すようにする必要があります。ファイル名を使用する代わりに、次のような予約語を使用できます。
「Console」、「LPT1」、「LPT2」、「LPTn」
また、［プリンタ］テーブルに定義されたプリンタ名を指定することもできます。エンジンはこの式に従って、出力先を切り替えます。

プログラムで出力先を指定するには：
1. ［プリンタ］テーブルを以下のように設定します。
名前キュー

Printer1

A 社プリンタ

Printer2

B 社プリンタ

Printer3¥¥ServerName¥C 社プリンタ［キュー名］カラムには、ローカルプリンタ（TCP/IP ポート接続も含みます。）の場合、OS に登録されている名前を設定します。プリントサーバ経由で接続されているプリンタの場合は、「¥¥ プリントサーバ名 ¥ プリンタ名」の形式で指定します。
2. オンラインタスクを作成し、プリンタ名を入力する変数を定義します。メインフォー
ムには、変数をエディットコントロ−ルとして配置します。
3. サブタスクを作成し、印刷プログラムとして処理を定義します。
［入出力ファイル］
テーブルに１行追加して、以下のように設定します。
•

名前……任意•メディア……G=GUI 形式プリンタ•

プリンタ……任意•式／項目……［式］テーブルに親タスクの変数項目（プリンタ名）を定義します。

親タスクでプリンタ名（例では、「Printer1」、「Printer2」、「Printer3」のどれか）を指定してサブタスクを実行させることで、対応するプリンタに出力を切り替えることができます。
変数項目を使用しなくても、SeParam/GetParam 関数を使用したグローバルパラメータ経
由でのやり取りでも指定できます。

デフォルトプリンタの設定
アプリケーション実行中のデフォルトプリンタを一時的に変更すると出力先を切り替えることもできます。この場合、印刷処理時に毎回ダイアログを出す必要はありません。
この指定は、GUI 出力でのみ Magic エンジンを終了させるまで有効になります。

158

開発者ガイドMagic eDeveloper V9 Plus

印刷プレビューの使用

デフォルトプリンタを設定する：
1. ［ファイル］メニューから［プリンタの設定］を選択すると、プリンタダイアログが表示されます。
このダイアログで出力するプリンンタや印刷方向などのを指定することで、デフォルトの出力特性を変更することができます。
2. 設定の変更後、［OK］をクリックします。

印刷プレビューの使用
ここでは入出力ファイルの印刷プレビューを説明します。印刷プレビューを使用することで、帳票出力の内容を画面で確認することができます。
印刷プレビューを実行させるには、以下の３つの方法があります。
• ［入出力特性］の［印刷プレビュー］のオプションを「Yes」に設定します。
• ［入出力ファイル］テーブルの［式］カラムでファイル名代わりに "Console” と設定します• ［タスク制御］で［メニュー使用］を「Yes」に設定し、実行時に確認ダイアログが出た際（印刷開始前）に Ctrl+I を実行します。［入出力ファイル］テーブルが開くので上記の設定のどちらかを行います。

複数の帳票の作成
ここではクラスが 1 以上で自動ページの［データ出力］コマンドと、１つのプログラム
内で複数の帳票レイアウトを定義する方法を説明します。
• １つの帳票のフォーマットを定義する場合、通常は同一クラスのフォームを３種類（ヘッダ、明細、フッタ）定義することになります。
• ［データ出力］コマンドで［頁］を「A= 自動」に設定していると、Magic は自動的に同じクラスのヘッダをページ毎に印刷します。
• ページヘッダとページフッタが［入出力ファイル］特性に設定されているときは、それらが先に印刷され、次いで同じクラスのヘッダが印刷されます。
• フォームテーブルには「ヘッダ」、「フッタ」、「明細」の順序でフォームを定義する必要があります。
帳票に複数のレイアウトが必要な場合で、自動ヘッダ／フッタ機能を使用する場合、別のクラス（>=1）のフォームを作成してください。

長さの異なる複数行のテキスト印刷
ここでは複数行指定されたエディットコントロールの印刷について説明します。
帳票をデザインするとき、テキストを印刷するのに必要な長さを推測することが難しい
場合があります。
このため、テキスト全文を表示する可変長のコントロールとフォームを作成する必要があります。複数行指定されたエディットコントロールを使用することで、データ量に応じて出力されるコントロールのサイズを変更させることができます。

可変サイズのフォームに可変長のコントロールを定義する：
1. ［フォーム特性］で、［フォーム拡大］欄を「O=1 ページ」か「M= 複数ページ」に

開発者ガイドMagic eDeveloper V9 Plus

159

第 10 章 - 印刷の実行設定します。このパラメータは GUI 形式のフォームが複数行のエディットコント
ロールに合わせて拡大するかどうかを指定します。
2. 「O=1 ページ」にすると、複数行コントロールはコントロール内にテキスト全文が含まれるようにサイズが調整されます。フォームも１ページ内に複数行コントロー
ルが収まるようにサイズを拡大します。
3. GUI 形式フォームで「M= 複数ページ」にすると、エディットコントロールは Magicのヘッダ／フッタ機構を使用して複数ページに出力されます。
4. フォームエディタでエディットコントロールの特性を開き、［複数行編集］を「Yes」に選択します。

テーブルの行数の制御
印刷に使用する用紙のサイズによって、帳票の大きさを変える場合があります。これは各ページに印刷される行数を制御することで実現できます。

フォームを定義する：
各ページに 10 レコード（固定）を表示するようにするには、以下のようにします。
1. テーブルコントロールを指定し、［テーブル特性］で、［固定サイズテーブル］の特性を「Yes」に設定します。
2. テーブルの行数を用紙に出力されるべき実際の数に設定します。
3. 最後のページでは、行が 10 行に満たないときは、Magic は 10 行になるまで自動的に空の行を追加します。これにより、テーブルの下に印刷される内容は常に同じ場所に印刷されることになります。
テーブルの行数は、帳票フォームのサイズを考慮して指定してください。もしこれを無視して、１ページに収まらないような行数を指定した場合、１ページには１レコードしか出力されません。

子タスク内でのテーブル印刷
ここでは親タスクからサブタスクを複数回コールして、１つのテーブルを印刷する方法を説明します。

サブタスクで１つのテーブルを印刷する：
1. Magic.ini ファイルの ［MAGIC_SPECIALS］セクションで“ClosePrintedTablesInSubtasks” の設定を使用します。
2. ”ClosePrintedTablesInSubtasks” が存在しないか「Yes」に設定されていれば、Magic は子タスクに入る毎にテーブルを閉じます。
3. 設定が「No」のときは、テーブルは開いたままになり、印刷出力は１つの連続したテーブルになります。

画面に表示されたデータの印刷
オンラインタスクの実行中に画面に表示されたデータを印刷したい場合があります。この場合、以下のような方法があります。

160

開発者ガイドMagic eDeveloper V9 Plus

画面に表示されたデータの印刷• 画面のハードコピーを取る• 専用の印刷プログラムを作成する• データ出力ウィザードを実行する
ここでは、データ出力ウィザードを使用した印刷処理について説明します。データ出力
ウィザードは、画面に表示されたデータビューをテキストファイルや HTML ファイル、XML ファイルに出力するユーティリティです。
HTML ファイルに出力してブラウザで表示させ、ページ印刷を実行することでデータビューを印刷させることができます。
ただし、以下のような制限があります。
• タスクがビューとして取得したレコードが全て出力されます。
• テーブル形式で出力されます。
• メインテーブルが定義されたタスクでのみ有効です。
テンプレートファイルを指定することで、表示／印刷の書式をカスタマイズすることができます。
ここでは、データ出力ウィザードを使用した HTML ファイルの出力方法とその書式のカ
スタマイズ方法について説明します。

データ出力ウィザードを実行する
データ出力ウイザードを有効にするには：
1. 出力させたいオンラインプログラムを開きます。
2. ［タスク制御］ダイアログ（Ctrl+C）を開きます。
3. ［モード］タブの［データ出力ウィザード］を「Yes」にします。

データ出力ウイザードを起動するには：
1. オンラインプログラムを実行します。
2. ［オプション／データ出力］（Ctrl+C）を実行します。
3. ［データ出力ウイザード］のダイアログが開きます。以下のようにパラメータウィ
設定します。
•

タイプ……H=HTML ファイル•

ファイル名……任意の html ファイル名•

アクション……O= ファイルの作成とオープン［テンプレート］の指定は別途説明します。必須ではありません。
［アクション］欄を「P= ファイルの作成と印刷」に設定した場合、画面表示されず印刷されます。
4. ［次へ］をクリックすると出力するカラムを指定できます。出力したくないカラム
は、［カラムの番号］を「0」にします。
5. ［終了］をクリックすると、HTML ファイルが作成されブラウザに表示されます。
（出力されるファイルの拡張子に関連付けられるアプリケーションガ実行されます。）

開発者ガイドMagic eDeveloper V9 Plus161

第 10 章 - 印刷の実行
6. ブラウザのツールバーの印刷ボタンをクリックすることで印刷されます。

図 10-1 デフォルトの HTML 表示

スタイルをカスタマイズする
テンプレートを指定することで表示スタイルをカスタマイズすることができます。テン
プレートには、次に説明する独自のタグを指定することができます。

<MGTABLE> タグ
テーブルの表示スタイルをクラスで定義する場合、どのように割り当てるかを指定します。行とカラムのスタイルを指定するクラスの定義を行うことができます。
• RowStyle……各行毎にスタイルクラスを指定するか同じにするかを指定します。
• ColumnStyle……各カラム毎にスタイルクラスを指定するか同じにするかを指定します。

例１<MGTABLE RowStyle=Equal ColumnStyle=Equal>
各行（MG_ROW）とカラム（MG_TITLE）のスタイルは同じクラスで指定されます。この場合、実行時に以下のような HTML ファイルが出力されます。

162<table border="1" width="100%" class="MG̲TABLE"><THEAD><tr><td width="25%" class="MG̲TITLE"> タイトル１ </td>...
<td width="25%" class="MG̲TITLE"> タイトル１ </td></tr></THEAD><TBODY><tr class="MG̲ROW"><td width="25%" class="MG̲DATA1"> データ１ </td>...
<td width="25%" class="MG̲DATA9"> データ１ </td></tr>〜<tr class="MG̲ROW"><td width="25%" class="MG̲DATA1"> データ n</td>...
<td width="25%" class="MG̲DATA9"> データ n</td></tr></TBODY>

開発者ガイドMagic eDeveloper V9 Plus

画面に表示されたデータの印刷</table><MG_ROW> と <MG_TITLE> のクラスを定義することで、テーブルの行と列のスタイルを指定できます。

例２<MGTABLE RowStyle=ALL ColumnStyle=ALL>
各行（MG_ROWn）とカラム（MG_TITLEn）のスタイルは異なるクラスで指定されます。
この場合、実行時に以下のような HTML ファイルが出力されます。
<table border="1" width="100%" class="MG̲TABLE"><THEAD><tr><td width="25%" class="MG̲TITLE1"> タイトル１ </td>...
<td width="25%" class="MG̲TITLEn"> タイトル１ </td></tr></THEAD><TBODY><tr class="MG̲ROW1"><td width="25%" class="MG̲DATA1"> データ１ </td>...
<td width="25%" class="MG̲DATA9"> データ１ </td></tr>〜<tr class="MG̲ROWn"><td width="25%" class="MG̲DATA1"> データ n</td>...
<td width="25%" class="MG̲DATA9"> データ n</td></tr></TBODY></table>テ ー ブ ル の 行 と 列 のスタイルを指定する場合、<MG_ROW1> 〜 <MG_ROWn> と<MG_TITLE1> 〜 <MG_TITLEn> を定義することで異なったスタイルで表示することができます。
また、以下のクラスが自動的に挿入されます。あらかじめテンプレートにこのクラスを定義することで、より細かくスタイルを設定できます。
• MG_TABLE……テーブル全体のスタイルを指定します。<MG_ROW> や <MG_TITLE>のスタイルが定義されない場合、このスタイルが有効になります。
• MG_DATA1……各セルのスタイルを指定します。このクラスが定義されている場合
は、こちらが優先されます。

システム情報用のタグ
Magic アプリケーションの情報などを自動的に出力するタグとして以下のものがあります。
• <MGOwner>……［動作環境］の［オーナ名］を出力します。
• <MGDate>……実行時のシステム日付を出力します。
• <MGUser>……Magic のログインユーザを出力します。
• <MGCAPTION>……実行中のタスク名を出力します。

これらの設定を考慮したテンプレートの例を以下に示します。
<html><head><STYLE TYPE="text/css"><!‑‑.MG̲HEADER { color: blue;font‑size: 24;font‑weight: 900;text‑align:center }開発者ガイドMagic eDeveloper V9 Plus163

第 10 章 - 印刷の実行.MG̲TABLE { background‑color: yellow;color: black; font‑size: 9pt;border:medium;
border‑color:black;border:solid;border‑collapse:collapse; }.MG̲TITLE { color: blue;font‑size: 10pt;font‑weight: 900; }.MG̲ROW { color: green; font‑size: 11pt;font‑weight: 400; }‑‑></STYLE><title>Sample</title></head><body><p class="MG̲HEADER"><MGCAPTION></p><MGOWner> <Div Align="right"><MGDate></Div><MGTABLE RowStyle=Equal ColumnStyle=Equal><p><MGUser></p></body></html>

このテンプレートを使用すると以下のような HTML ファイルになります。

図 10-2 カスタマイズされや HTML 表示

164

開発者ガイドMagic eDeveloper V9 Plus

アプリケーションのメニュー

11

この章ではアプリケーションのメニューの定義方法を説明します。開発者はメニューの表示内容、アクセス制御、サイズやフォーマットを設定できます。メニューのフォーマッ
トには、プルダウンメニューとコンテキストメニューがあります。
この章では以下のことについて説明いたします。
プルダウンメニューメニューの定義

166 ページ

ツールバーの表示制御

166 ページ

ヘルプの関連付け

167 ページ

メニューにプログラムを自動的に追加

169 ページ

デフォルトコンテキストメニューの定義

168 ページ

コンテキストメニューへのイメージの関連付け

168 ページ

プログラムに対するコンテキストメニューの定義

168 ページ

パラメータを使用したプログラムの実行

169 ページ

メニューにプログラムを自動的に追加

169 ページ

ショートカットキーの定義

170 ページ

ショートキー（組み合わせキー）の定義

170 ページ

開発者ガイドMagic eDeveloper V9 Plus

165

第 11 章 - アプリケーションのメニュー

プルダウンメニューメニューの定義
Magic は新しいアプリケーションに対してデフォルトのプルダウンメニューを作成します。各アプリケーションに対してこれらは１つだけ定義できます。

メニューを定義する：
1. ［ナビゲータ］ペインからメニューリポジトリを開きます。
2. デフォルトのプルダウンメニューからズームして［メニュー定義］テーブルを開きます。
3. エントリを追加／削除します。

ツールバーの表示制御
スーパーバイザはログインユーザの権利設定を行うことができます。ユーザに権利がないとき、プルダウンメニューは無効になります。
MnuEnable 関数と MnuShow 関数を使用して、プログラムの実行時に動的にメニュー表示を変更することも可能です。
ここでは以下のことについて説明します。
• ［メニュー定義］テーブルでの定義• メニュー関数による制御［メニュー定義］テーブルでの定義［メニュー定義］テーブルで使用権利を設定する：
1. ［ナビゲータ］ペインで権利リポジトリを選択します。
2. 権利リポジトリで権利を登録します。
3. ［設定］メニューから［ユーザ ID］を選択し、定義した権利のキーを適切なユーザに割り当てます。
4. ［ナビゲータ］ペインでメニューリポジトリを選択します。
5. 「プルダウンメニュー」か「ポップアップメニュー」を選択し、ズームして［メニュー定義］テーブルを開きます。
6. Ctrl+P を押します。
7. ［メニュー特性］ダイアログの［特性］タブを開き、［権利］欄でズームします。
8. ステップ #1 で定義した権利を設定します。
9. ［OK］をクリックします。
10. 他のメニューに対してステップ#5から#9を繰り返して適切な権利設定を行います。

メニュー関数による制御
MnuEnable と MnuShow 関数を使用して、ユーザから見える実行環境でのメニューを変更することができます。

166

開発者ガイドMagic eDeveloper V9 Plus

ヘルプの関連付け

メニューの有効／無効化を設定する：
MnuEnable 関数を使用して、プログラム実行中にメニューの有効／無効を切り替えることができます。ただしメニューに権利設定されている場合、その権利に制限されます。

メニューの表示／非表示を設定する：
MnuShow 関数を使用して、プログラム実行中にメニューの表示／非表示を切り替えることができます。ただし、メニューに権利設定されている場合、メニューに対する権利に制限されます。

ヘルプの関連付け
メニューに内部ヘルプ、Windows ヘルプ、自動ヘルプを関連付けることができます。

メニューに内部ヘルプや Windows ヘルプを関連付ける：
1. ヘルプリポジトリでヘルプを定義しておきます。
2. ［ナビゲータ］ペインでメニューリポジトリを開きます。
3. 「プルダウンメニュー」か「ポップアップメニュー」でズームし、［メニュー定義］
テーブルを開きます。
4. Ctrl+P を押して［メニュー特性］を開きます。
ヘルプが関連付けられるのはメニューのタイプが「システム」、「プログラム」、「イベント」、「OS コマンド」のときだけです。
5. ［特性］タブの［ヘルプ画面］欄でズームします。
6. ヘルプを選択して関連付けます。個々の指定できるのは、内部ヘルプと Windows ヘ
ルプだけです。
7. ［選択］をクリックします。
8. 他のエントリにもヘルプを関連付けるときはステップ #4 から #7 を繰り返します。

メニューに自動ヘルプを関連付ける：
1. ヘルプリポジトリで自動ヘルプを定義しておきます。
2. ［ナビゲータ］ペインでメニューリポジトリを開きます。
3. 「プルダウンメニュー」か「ポップアップメニュー」でズームし、［メニュー定義］
テーブルを開きます。
4. Ctrl+P を押してメ［ニュー特性］を開きます。
ヘルプが関連付けられるのはメニューのタイプが「システム」、「プログラム」、「イベント」、「OS コマンド」のときだけです。
5. ［特性］タブの［自動ヘルプ］欄でズームします。
6. 自動ヘルプを選択して関連付けます。
7. ［選択］をクリックします。
8. 他のエントリにもヘルプを関連付けるときはステップ #4 から #7 を繰り返します。

開発者ガイドMagic eDeveloper V9 Plus167

第 11 章 - アプリケーションのメニュー

デフォルトコンテキストメニューの定義
新しいアプリケーションに対して、Magic はデフォルトのコンテキストメニューを作成
します。これは空の状態で作成されますが、削除することはできません。アプリケーショ
ンには複数のコンテキストメニューを作成することができますが、デフォルトのコンテ
キストメニューは１つだけです。

デフォルトのコンテキストメニューの定義
デフォルトのコンテキストメニューを定義する：
1. ［ナビゲータ］ペインでメニューリポジトリを選択します。
2. 「ポップアップメニュー」を選択し、［メニュー定義］テーブルにズームします。
3. エントリを追加したり削除したりします。

コンテキストメニューへのイメージの関連付け
コンテキストメニューは、実行環境でユーザがマウスの右ボタンをクリックしたときに表示されます。ここではコンテキストメニューエントリのイメージを定義する方法を説
明いたします。

イメージを定義する：
1. ［ナビゲータ］ペインからメニューリポジトリを選択します。
2. 「ポップアップメニュー」を選択するか、または、１行追加して［メニュー名］を入力します。［メニュー定義］テーブルにズームします。
3. イメージを追加したいエントリで Ctrl+P を押します。
4. ［メニュー特性］の［イメージ］タブを開き、［イメージ場所］欄で「M= メニュー」
を選択します。
5. ビットマップファイルか Magic 内部イメージを選択します。
• ビットマップイメージを使用するには、［ボタンイメージ］の項目からズームして、BMP ファイルを指定します。
• Magic 内部イメージを使用するには、［イメージ番号］の項目からズームして、表示されているイメージの中から選択します。
6. ［OK］をクリックして［メニュー特性］ダイアログに戻ります。
7. ［OK］をクリックして［メニュー定義］テーブルに戻ります。

プログラムに対するコンテキストメニューの定義
コンテキストメニュー（ショートカットメニュー）は、実行環境でユーザがマウスの右ボタンをクリックしたときに表示されます。ここではコンテキストメニューをプログラ
ムに関連付ける方法を説明いたします。

コンテキストメニューを作成する：
1. ［ナビゲータ］ペインからメニューリポジトリを選択します。

168

2. １行作成し（メニュータイプは「C= ショートカットメニュー」と表示されます。
）、

開発者ガイドMagic eDeveloper V9 Plus

パラメータを使用したプログラムの実行［メニュー名］を入力します。
3. ［メニュー定義］テーブルにズームして、メニュー内容を設定します。

コンテキストメニューをプログラムに定義する：
1. ［ナビゲータ］ペインでプログラムリポジトリを選択します。
2. コンテキストメニューを割付けたいプログラムでズームして［タスク特性］（Ctrl+P）を開きます。
3. ［高度な設定］タブの［ショートカットメニュー］からズームして［メニュー一覧］を開きます。
4. ステップ #2 で定義したコンテキストメニューを選択します。
5. ［OK］をクリックして［タスク特性］ダイアログに戻ります。
6. ［OK］をクリックして変更を確定します。
「デフォルトコンテキストメニュー」は、［タスク特性］には定義できませんが、何も登録されていない場合「デフォルトコンテキストメニュー」が表示されます。

パラメータを使用したプログラムの実行
メニューからプログラムをコールする際にパラメータを渡す方法について説明します。

パラメータを設定する：
1. ［ナビゲータ］ペインからメニューリポジトリを選択します。
2. 「プルダウンメニュー」か「ポップアップメニュー」を選択し、［メニュー定義］
テーブルへズームします。
3. ［タイプ］が「P= プログラム」のエントリで Ctrl+P を押します。
パラメータを指定できるのは「P= プログラム」指定されたメニューのみです。

4. ［特性］タブの［パラメータ］欄でズームし、［パラメータ］テーブルを開きます。
5. プログラムに渡すパラメータを、メインプログラムに定義したグローバル変数で設定します。
6. ［OK］をクリックして［メニュー特性］ダイアログに戻ります。
7. ［OK］をクリックして変更を確定します。

メニューにプログラムを自動的に追加
複数のプログラムをメニューに追加することができます。メニューリポジトリ上か、［メ
ニュー定義］テーブルで「M= メニュー」と定義されたメニュー上で［オプション／フォー
ム自動作成］（Ctrl+G）を実行することで可能です。

メニューにプログラムを複数登録する：
1. ［ナビゲータ］ペインからメニューリポジトリを選択します。

開発者ガイドMagic eDeveloper V9 Plus

169

第 11 章 - アプリケーションのメニュー
2. メニューリポジトリで新しいエントリを作成するか、既存のエントリでズームして［メニュー定義］テーブルを開き、［タイプ］カラムを「M= メニュー」にしたエントリを作成します。
3. Ctrl+G を押して［メニューフォーム作成］ダイアログを開きます。
4. プログラム番号を入力するか、ズームして［プログラム一覧］から選択して、プログラムの範囲を指定します。
5. ［OK］をクリックしてメニューリポジトリへ戻ります。

ショートカットキーの定義
キーボードを使用してメニューのエントリを指定するには二通りの方法があります。１
つはマウスでの選択と同じ手順で選択する方法、もう１つはキーの組み合わせで特定のメニューを起動するショートカットキーです。

ショートカットキー用の文字を指定する：
1. ［ナビゲータ］ペインからメニューリポジトリを選択します。
2. メニューリポジトリで新しいエントリを作成するか、既存のエントリでズームして［メニュー定義］を開き、メニューエントリを作成します。
3. ［ユーザメニュー名］欄に「 &（アンパーサント）」をショートカットキーにする
文字の前に挿入します。
例えば「編集（&I）」と指定すれば、メニューが表示されている状態でユーザが「i 」のキーを押したときメニュー上の「編集」オプションが選択されます。
4. ［OK］をクリックしてメニューリポジトリへ戻ります。

ショートキー（組み合わせキー）の定義「プルダウンメニュー」でのみ有効なこのキーを定義すると、２つのキーを組み合わせて押すことで、Magic の実行時にいつでも機能を呼び出せることができます。

ショートキーを定義する：
1. ［ナビゲータ］ペインからメニューリポジトリを選択します。
2. 「プルダウンメニュー」を選択し、［メニュー定義］テーブルにズームします。
3. 定義したいメニュー項目の［ショートキー］カラムでズームすると［キー設定］ダ
イアログが表示されます。ここで、定義したいキーを押します。
（設定できるキー
は、１つまたは、２つのキーを同時に押した状態です。）［OK］をクリックすると［メニュー定義］テーブルに戻り、登録されたキーが［ショートキー］カラムに表示されます。
4. Magic を実行モードにした状態で定義したキーを押して確認してください。同じ
キーの組み合わせがすでに別の機能に割当てられている場合があります。このような場合は、#1 からやり直して、キーの組み合わせを変更してください。

170

開発者ガイドMagic eDeveloper V9 Plus

ショートキー（組み合わせキー）の定義

この手順は下記のメニューエントリタイプに対応します。
•

プログラム

•

OS コマンド•

イベント

メニュータイプが「M= メニュー」と「L= ライン」の場合は指定できません。

開発者ガイドMagic eDeveloper V9 Plus

171

第 11 章 - アプリケーションのメニュー［このページは意図的に空白にしています。］

172

開発者ガイドMagic eDeveloper V9 Plus

アプリケーションのヘルプ

12Magic アプリケーション内に、エンドユーザ向けのヘルプを組み込むことができます。
これによって、プログラム中のさまざまな場所でユーザの操作をサポートするヘルプを表示することができます。ヘルプの割り当ては、カラム、タイプ、フォーム、コン
トロール、またはメニューに対して行うことができます。
ヘルプについての詳細は、『リファレンス』の 12 章「エンドユーザメニュー＆ヘルプ」を参照してください。

この章では以下のことについて説明いたします。
内部ヘルプ、自動ヘルプ、ツールチップの設計

174 ページ

Windows 形式ヘルプの設計

174 ページ

開発者ガイドMagic eDeveloper V9 Plus

173

第 12 章 - アプリケーションのヘルプ

内部ヘルプ、自動ヘルプ、ツールチップの設計
内部ヘルプ、自動ヘルプ、ツールチップは、Magic のアプリケーションファイル内にヘ
ルプテキストが格納されます。

内部ヘルプ、自動ヘルプ、ツールチップを定義する：
1. ［ワークスペース］メニューでヘルプを選択し、ヘルプリポジトリを開きます。
2. １行作成して任意の名前を付けます。
3. ［タイプ］カラムでヘルプタイプを選択します。（内部、自動、ツールチップ）
4. ［名前］カラムでズームすると［特性］シートが表示されます。
［テキスト］欄で表示したいテキストを入力します。
5. オブジェクトにヘルプを関連付ける場合は、フォームやカラム、モデル、コントロー
ルなどのオブジェクトの［特性］シートの、［ヘルプ画面］、［自動ヘルプ］、［ツール
チップ］の各欄から［ヘルプ一覧］にズームし作成したヘルプを選択します。
カラムがモデルに関連付けられている場合、モデルに定義されているヘルプの指定が継承されます。カラム特性でこの指定を変更しない限り継承関係が継続されます。

Windows 形式ヘルプの設計
Windows 形式ヘルプは、Windows の Help ビューアで表示される外部のヘルプファイルです。例えば Magic 自体に添付されているヘルプファイルがその例です。Windows 形式ヘ
ルプファイルは専用のオーサリングツールで作成します。
Windows 形式ヘルプは内部ヘルプと同じようにモデル、カラム、フォーム、プログラムなどに関連付けることが可能です。
アプリケーションに対する全ての Windows 形式ヘルプは、１つの Windows ヘルプファイ
ル中に保存することができます。Windows の Help ビューアには目次、検索機能があり、ヘルプが起動された場所に応じて特定のヘルプを表示することができます。一旦ヘルプ
トピックが表示されると、エンドユーザはここから他のトピックの検索を行うことができます。

Windows 形式ヘルプを定義する：
1. ヘルプリポジトリを開きます。
2. １行作成し、任意の名前を付けます。［タイプ］カラムでは「W=Windows 形式」を選択します。
3. ［ヘルプ特性］にズームします。
4. ［詳細］セクションの［ヘルプファイル名］欄に Windows ヘルプファイルのファイ
ル名を入力します。
5. ［ヘルプコマンド］を選択します。
6. ［キー値］を入力します。

174

開発者ガイドMagic eDeveloper V9 Plus

URL ヘルプの設計

Windows 形式ヘルプには、HTML ヘルプを指定することもできますが、［ヘルプコマ
ンド］の指定は以下の２つに制限されます。

• C= コンテキスト• K= キーワードで検索• Q= 終了

URL ヘルプの設計
URL ヘルプは、ブラウザタスクにだけ有効なヘルプで、Web ブラウザから F1 キーを押したときに開くブラウザページを指定します。

URL ヘルプを定義する：
1. ヘルプリポジトリを開きます。
2. １行作成し、任意の名前を付けます。
［タイプ］カラムでは「U=URL」を選択します。
3. ［ヘルプ特性］にズームします。
4. ［詳細］セクションの［URL］欄に表示したい Web ページの URL を入力します。

開発者ガイドMagic eDeveloper V9 Plus

175

第 12 章 - アプリケーションのヘルプ［このページは意図的に空白になっています。］

176

開発者ガイドMagic eDeveloper V9 Plus

Magic のユーティリティ

13

Magic ではアプリケーションの開発、修正、メンテナンス、移行に役立つ様々なユー
ティリティを用意しています。

この章では以下のことについて説明いたします。
アプリケーションのマルチプラットフォーム化

178 ページ

アプリケーションのドキュメント化

178 ページ

クロスリファレンスの使用

179 ページ

アプリケーションの整理

181 ページ

開発者ガイドMagic eDeveloper V9 Plus177

第 13 章 - Magic のユーティリティ

アプリケーションのマルチプラットフォーム化
Magic フラットファイル（MFF）を使用すると、データベースに依存しない Magic アプ
リケーションの実行が可能となります。アプリケーションはバイナリファイルとして作成され、ユーザのシステム中の任意の場所に保存可能です。
ここでは以下のことについて説明します。
• 開発環境• 実行環境開発環境
開発環境で Magic アプリケーションの MFF を作成する：
1. アプリケーションを開きます。
2. ［ファイル］メニューから［MFF 形式で保存］を選択します。
3. MFF の名前を指定し、保存します。
これで MFF が作成されました。MFF をアプリケーションを実行するディレクトリ
へ移動してください。

実行環境
MFF 化された Magic アプリケーションを実行する：
1. ［設定］メニューから［アプリケーション］を選択し、［アプリケーション］テーブ
ルを開きます。
2. １行作成し、アプリケーションを登録します。
3. Ctrl+P を押して［アプリケーション特性］ダイアログを開きます。
4. ［フラットファイルで実行］のチェックボックスを「有効」にします。
5. ［OK］をクリックします。
6. ［CTL ファイル名］カラムに MFF 化した CTL ファイルの名前をフルパスで指定してください。
（論理名も使用できます。）ここが空白の場合は、［識別子］+「CTL.MFF」
がファイル名として認識されます。
［データベース］カラムの指定は意味を持ちません。
MFF は、（コンポーネントやユーザ定義開発ツールの場合を除いて）開発版のエンジ
ンではオープンできません。

アプリケーションのドキュメント化
Magic にはドキュメント出力機能が用意されています。この機能を使用して、各リポジ
トリや CTL 特性の情報をテキスト出力することができます。開発者は、これらをアプリ
ケーションの仕様書として利用することができます。

178

開発者ガイドMagic eDeveloper V9 Plusクロスリファレンスの使用
ドキュメント出力機能は、ドキュメントテンプレートファイルを使用して出力内容を決定します。デフォルトのドキュメントテンプレートファイルとして DOC_ STD. JPN と
DOC_ EXT. JPN が用意されています。DOC_ EXT. JPN は全てのデータアイテムが入った
ドキュメントを作成し、DOC_ STD. JPN は、概要を作成します。
ドキュメントテンプレートファイルを用意した後、リポジトリ出力ユーティリティをドキュメントモードで実行し、ドキュメントを作成します。テンプレートファイルを変更することで任意の書式で出力することができます。

ドキュメントモードの実行
ドキュメントテンプレートファイルを定義する：
1. ［設定］メニューから［動作環境］を開き、［外部参照］タブをクリックします。
2. ［ドキュメントテンプレートファイル］欄にカーソルを移動し、ドキュメントテン
プレートのファイル名を入力します。

ドキュメント出力ユーティリティを実行する：
1. アプリケーションを開き、Shift+F10 を押すか［ファイル］メニューから［リポジト
リ入出力］を選択し、［リポジトリ入出力］ダイアログを開きます。
2. ［操作］欄で「D= 仕様書出力」を選択します。［リポジトリタイプ］欄でドキュメント化したい Magic のオブジェクトを選択します。
テンプレートファイルには、選択したオブジェクトのセクションが定義されていることが必要です。
3. コンポーネントの要素のうち、特定の範囲の要素を指定したい場合、［開始番号］と［終了番号］の各欄からズームして範囲を指定します。
4. ［ファイル名］の欄に「出力ファイル名」を入力します。
このファイルにドキュメントが出力されます。この欄にはアプリケーション識別子
をもとにしたデフォルトのファイル名が自動的に挿入されます。ファイル名にパスが付かない場合は、Magic 起動時の作業フォルダ上に作成されます。
5. ［OK］をクリックすると出力処理が実行されます。ドキュメントテンプレートの内容がチェックされ、書式エラーが見つかった場合、エラーメッセージが表示され、処理がこの時点で中断されます。
6. ドキュメントを作成したいオブジェクトが他にもある場合、［リポジトリタイプ］欄に戻り、再度選択します。
ドキュメント作成中に、Esc を押すと処理が中断されます。

クロスリファレンスの使用
Magic のクロスリファレンス・ユーティリティを使用すると、モデル、カラム、プログ
ラムなどが使用されている場所の情報を取得することができます。例えば特定のカラム、インデックス、テーブルなどが使用されているプログラムの一覧が必要なときなどにクロスリファレンスは役立ちます。Magic のクロスリファレンス・ユーティリティは下記のオブジェクトタイプの情報を検索できます。

開発者ガイドMagic eDeveloper V9 Plus

• モデル

• テーブル• カラム• インデックス• プログラム• ヘルプ画面• 権利• メニュー179

第 13 章 - Magic のユーティリティ• イベント• コンポーネント•式• フォーム• 入出力項目
クロスリファレンスの結果は［ナビゲータ］ペインの［クロスリファレンス］ペインに表示されます。また印刷することもできます。検索結果は削除可能です。
ここでは以下のことについて説明します。
• クロスリファレンスの実行• クロスリファレンス結果の削除• クロスリファレンス結果の保存と印刷• 最大登録数の変更

クロスリファレンスの実行
クロスリファレンスを実行する：
1. 各リポジトリでオブジェクトのエントリを選択し、Ctrl+X を押します。［クロスリファレンス］ダイアログが表示されます。
2. 検索したいリポジトリを選択します。必要に応じてリポジトリのフォルダや行番号の範囲を指定することで検索対象を絞り込むことができます。
3. ［OK］をクリックします。
結果は［ナビゲータ］ペインの［クロスリファレンス］ペインに表示されます。
4. 結果のエントリをクリックすると、［ワークスペース］ペインに対応するリポジトリが開かれ、エントリに位置付けされます。

クロスリファレンス結果の削除
クロスリファレンスの結果を削除する：
1. ［クロスリファレンス］ペインで削除するリファレンス結果を選択します。
2. F3 を押すか［編集］メニューかマウスの右クリックで表示されるコンテキストメ
ニューから［行削除］を選択して結果を削除します。

クロスリファレンス結果の保存と印刷
クロスリファレンス結果を保存する：
1. ［クロスリファレンス］ペインで保存するリファレンス結果を選択します。
2. ［ファイル］メニューから［クロスリファレンスの結果］を選択し、［結果を保存］を選択すると、結果がテキスト形式で保存されます。

クロスリファレンス結果を印刷する：
1. ［クロスリファレンス］ペインで印刷するリファレンス結果を選択します。
2. ［ファイル］メニューから［クロスリファレンスの結果］を選択し、［結果を印刷］を選択すると［プリンタ一覧］が表示されます。

180

開発者ガイドMagic eDeveloper V9 Plus

アプリケーションの整理
3. 出力したいプリンタを選択すると指定されたプリンタに結果が出力されます。

最大登録数の変更
検索結果の最大登録数を変更する：［ナビゲータ］ペインに表示されるクロスリファレンス結果のツリーの最大登録数は、以下のようにして変更できます。
1. ［設定］メニューから［動作環境］を開きます。
2. ［動作設定］タブを開きます。
3. ［クロスリファレンス結果の最大登録数］に登録できる最大数を設定します。
クロスリファレンスの検索結果は、Windows の「マイ ドキュメント」にバイナリ形式で作成されます。このため、通常は Windows にログオンするユーザによって実際に作成されるフォルダは異なります。

アプリケーションの整理
Magic にはプリケーションを整理するための機能として、以下のものが用意されています。
• アプリケーションのオブジェクトを分類するフォルダ• 特定のエントリに直接アクセスするブックマーク• アプリケーション内容を記述するコメント• 異なるアプリケーション間でコードの一部を再利用するコンポーネント
ここでは以下のことについて説明します。
• フォルダの作成• ブックマークの使用• コメントの使用

フォルダの作成
オブジェクトを種別毎のフォルダにまとめると、プログラムがわかりやすくなります。

フォルダを作成する：
1. プログラム、テーブル、モデル、ヘルプ、コンポーネントの各リポジトリを［ナビゲータ］ペインで選択します。
2. F4 を押すか［編集］メニューから［行作成］を指定して新しいフォルダを作成します。
3. フォルダに名前を付けます。（例：「レポート用」など）
4. ステップ #2 と #3 を繰り返して別のフォルダを作成します。
5. リポジトリへ戻り、各オブジェクトに対してフォルダを選択します。
オブジェクトにフォルダを指定すると、各フォルダ毎に連番になるように、テーブル上の番号が変更されます。

開発者ガイドMagic eDeveloper V9 Plus

181

第 13 章 - Magic のユーティリティ

ブックマークの使用
頻繁にアクセスするオブジェクトがある場合、そのオブジェクトにブックマークを登録することで簡単に位置付けを行うことができます。

オブジェクトに対して、ブックマークを作成する：
1. 目的のオブジェクトを選択します。
2. ［オプション］メニューから［ブックマーク］を選択するか、Ctrl+B を押します。
［ブックマーク］ダイアログが表示されます。
3. ブックマークに任意の名前を付けます。
4. ［OK］をクリックします。

ブックマークに位置付ける：
1. ［ナビゲータ］ペインで［ブックマーク］を選択します。
2. 目的のブックマークを選択し、ズームするかマウスでダブルクリックします。

コメントの使用
アプリケーションの各オブジェクトに対してコメントを定義することができます。コメントが定義されたオブジェクトは、テーブル番号の色が変更されます。

オブジェクトに対してコメントを追加する：
1. タスク、テーブル、レコード前処理など、目的のアイテムを選択します。
2. F10 を押すか［編集］メニューから［コメント］を選択します。
3. ［コメント］ダイアログが表示されます。ここにコメントを入力し、［OK］をクリッ
クします。

オブジェクトのコメントを参照する：
各オブジェクトに位置付けして F10 を押すことで［コメント］ダイアログを表示できま
すが、コメントを参照するだけであれば、［コメント］ペインを表示させるだけで十分です。
1. ［ワークスペース］メニューから［コメント］を選択するか、Alt+F10 を押すと［コメント］ペインが表示されます。
2. コメントが登録されているオブジェクトにカーソルを置くと［コメント］ペインにコメントが表示されます。ここは表示だけで入力はできません。

182

開発者ガイドMagic eDeveloper V9 Plus

Magic コンポーネント

14

Magic Ver9 ではアプリケーションオブジェクトをコンポーネントとして定義し、他のア
プリケーションの一部として使用することができます。
コンポーネントとは、インタフェースを含んだ Magic アプリケーションです。このイン
タフェースを使用することで、アプリケーションはホストアプリケーションとして、コンポーネントアプリケーションのオブジェクトを参照したり、プログラムを実行したりすることができます。このインタフェース用のファイルを Magic コンポーネントインタ
フェース（MCI）ファイルと呼びます。
以下のオブジェクトに対してコンポーネントを作成することができます。
• モデル• テーブル• プログラム• ヘルプ• 権利• イベント• 動作環境

この章では以下のことについて説明いたします。
コンポーネントの作成

184 ページ

コンポーネントのロード

184 ページ

コンポーネントの組み込み

185 ページ

アプリケーション間でのイベント共有

185 ページ

コンポーネントアプリケーションの保守

186 ページ

コンポーネントを登録しない外部アプリケーション

187 ページ

コンポーネント側からホスト側のイベントを実行する

188 ページ

開発者ガイドMagic eDeveloper V9 Plus183

第 14 章 - Magic コンポーネント

コンポーネントの作成
コンポーネントを作成する：
1. コンポーネントを作成するアプリケーションを開きます。［コンポーネント］メ
ニューから［Magic インタフェース］を選択します。
Magic インタフェースビルダ（以下 MIB と略します。）が起動されます。MIB では、テーブルが上下に分割されて表示されます。
2. 上のテーブルにカーソルがある状態で F4 を押して１行作成し、コンポーネントの名前を入力します。
3. 選択したいオブジェクトのカラムにカーソルを置き［追加］ボタンをクリックします。コンポーネントとして追加可能なオブジェクトの一覧が表示されます。（［アプリケーション名］の表示が起動元のアプリケーションの名前と同じ場合のみ［追加］ボタンは有効になります。）
4. 追加したいオブジェクトの［選択］カラムをチェックして、［OK］をクリックします。（［全て選択］をクリックすると全てのオブジェクトが選択されます。）
公開名が登録されているオブジェクトのみ表示されます。

MCI ファイルを作成する：
1. ［オプション］メニューから［インタフェースファイル作成］を選択するか Ctrl+Iを押し、［インタフェース］ダイアログを開きます。
2. ［ファイル名］に「MCI ファイル名」を入力します。
3. ［OK］をクリックするとコンポーネントインタフェースファイルが作成されます。
4. MIB を終了するには、［ファイル］メニューから［閉じる］をクリックします。

コンポーネントのロード
コンポーネントを使用することで、アプリケーションはコンポーネントアプリケーショ
ンのオブジェクトを利用することができます。

コンポーネントをロードする：
1. コンポーネントを使用するアプリケーションを開きます。
2. ［ナビゲータ］ペインからコンポーネントリポジトリを開きます。
3. リポジトリに１行作成します。
4. F5 キーまたは［オプション］メニューから［読込／再読込］を選択します。
［ファ
イルを開く］ダイアログが開きます。
5. 目的の MCI ファイルを選択します。
コンポーネントがロードされ、アプリケーション内で使用可能となります。

ロードしたコンポーネントを確認する：
コンポーネントリポジトリで、ロードしたコンポーネントの内容を確認することができ
ます。

184

開発者ガイドMagic eDeveloper V9 Plus

コンポーネントの組み込み
1. コンポーネントを使用するアプリケーションを開きます。
2. ［ナビゲータ］ペインからコンポーネントリポジトリを開きます。
3. 参照したいコンポーネントにカーソルを置きズームします。
［コンポーネント項目］
テーブルが表示されます。
［コンポーネント項目］テーブルは、リポジトリ毎のタブで表示されます。
4. 表示行にカーソルを置きズームすると詳細が表示されます。

コンポーネントの組み込み
コンポーネントをロードしたアプリケーションで選択一覧を開いたとき、ウィンドウ上部の表示の［表示］リストを利用して選択肢を絞り込むことができます。
• 全て …… 現在のアプリケーションとコンポーネントの両方のオブジェクトが選択可能です。表示されるコンポーネントのオブジェクト名の前には、コンポーネント名が追加されます。
• 同一 CTL …… 現在のアプリケーションのオブジェクトのみ選択可能になります。
• コンポーネント名 …… 指定したコンポーネントに登録されているオブジェクトのみ選択可能になります。

コンポーネントの選択
コンポーネントテーブルを選択する :1. プログラムリポジトリを開き、F4 で１行作成します。
2. Ctrl+G で APG を実行します。
3. ［メインテーブル］でズームすると［テーブル一覧］が表示されます。ここには、現在のアプリケーションのテーブルとコンポーネントのテーブルが表示されます。
コンポーネントのテーブルは別の色で表示されます。
［表示］欄でコンポーネントを指定することで、選択肢として表示されるテーブル
を絞り込むことができます。
4. メインテーブルとしてコンポーネントテーブルを選択します。

アプリケーション間でのイベント共有
コンポーネントアプリケーションのメインプログラム内にグローバルスコープを定義したイベントハンドラは、ホストアプリケーションで発行されたイベントを処理することができます。
イベントハンドラが検索されるパスは常に下記の順になります。
1. 検索の開始点は、イベントが発行されたタスクです。その後、タスクツリーをメイ
ンプログラムまでさかのぼって検索されます。
2. その後、ロードしているコンポーネントとそのメインプログラムが検索されます。
ただし、ここではグローバルスコープとして定義されているものしか検索されません。
グローバルスコープとして定義されているホストアプリケーションのイベントハン
ドラは、コンポーネントタスクのハンドラとして扱われます。
プログラムコールで起動されたコンポーネントプログラムにイベントハンドラが定義されている場合も、グローバルなハンドラとして扱われます。このプログラムが実開発者ガイドMagic eDeveloper V9 Plus

185

第 14 章 - Magic コンポーネント
行されている時にイベントが発生した場合、コンポーネントプログラムのハンドラが実行されます。

コンポーネントアプリケーションの保守
コンポーネントを作成するとき、そのコンポーネントで使用されていた動作環境の情報を含めておく必要があります。コンポーネントにこれらの情報がないと、ホストアプリ
ケーション環境に影響されてしまうことになります。
実行環境では、コンポーネントがロードされると、データベース、DBMS、サーバ、サービス、論理名などのコンポーネントアプリケーションの環境特性がホストアプリケー
ションの Magic.ini の各セクションに追加されます。
ホストアプリケーションからコンポーネントを削除しても、Magic.ini に追加された特性は削除されません。
MIB で新しいコンポーネントを作成するとき、動作環境の設定値を含めることが可能です。この場合、それらの値は MCI ファイルの中に保存され、ホストアプリケーションにロードされたときにホスト側の動作環境に取り込まれます。
コンポーネント特性には、ヘルプファイル（Windows ヘルプまたは、HTML ヘルプ）のファイル名を指定することができます。ヘルプファイルを指定することで、コンポーネントに対する情報をユーザに提供することができます。

動作環境コンポーネントの追加
コンポーネントに動作環境の情報を追加する：
1. ［コンポーネント］メニューから［Magic インタフェース］を選択して MIB を起動します。
2. 該当するコンポーネントの行の［動作環境］カラムからズームして［動作環境］テーブルを開きます。
3. 追加したい設定項目のタブをクリックし、［追加］ボタンをクリックして、各タブの［選択一覧］を開きます。
4. 追加したい項目の［選択］カラムを チェックして［OK］をクリックします。設定
内容がコンポーネントに追加されます。
5. ［オプション］メニューから［MCI ファイル作成］を選択し、コンポーネントを
MCI ファイルとして保存します。

コンポーネントへのヘルプ情報の割り当て
コンポーネントの内容を確認するためのヘルプ情報をコンポーネントに割り当てることができます。コンポーネントに対して Windows ヘルプを割り当て、各オブジェクトにキーワードを指定することで、ホストアプリケーションから該当するオブジェクトのヘルプトピックを表示させることができます。

コンポーネントにヘルプを割り当てる：
1. ［コンポーネント］メニューから［Magic インタフェース］を選択して MIB を起動
します。

186

2. 該当するコンポーネントの行にカーソルを置いた状態で Ctrl+P を実行し、［コンポー開発者ガイドMagic eDeveloper V9 Plus

コンポーネントを登録しない外部アプリケーション
ネント特性］ダイアログを開きます。
［Help ファイル名］欄にオープンするヘルプ
ファイルの名前を指定します。
［Help キー］欄には、コンポーネントリポジトリ上
でF1キーを押した時に表示されるヘルプトピックを参照するためのキーワードを指定します。
3. 各リポジトリのオブジェクト毎に［Help キー］を指定することができます。ここには、各オブジェクトの詳細表示で F1 キーを押した時に表示されるヘルプトピックを参照するためのキーワードを指定します。

オブジェクトの移行
コンポーネントを使用して作成されたオブジェクト（例えば、コンポーネントモデルを使用したテーブルや、コンポーネントテーブルを使用したプログラム）をリポジトリの入出力機能を使用して別のアプリケーションに組み込む場合は、以下のような注意が必要です。

コンポーネントを使用したオブジェクトを移行する：
1. 組込先のアプリケーションにコンポーネントを登録します。この場合、リポジトリ
出力するアプリケーション側のコンポーネント番号と入力するアプリケーション側のコンポーネント番号を同じにする必要があります。
2. 元のアプリケーション側でリポジトリ入出力機能を使用してオブジェクトを出力します。
3. 入力先のアプリケーション側でオブジェクトを入力します。

コンポーネントを登録しない外部アプリケーション
コンポーネントを登録しない状態で、他のアプリケーションのプログラムを呼び出すことができます。

コンポーネントを登録しないで外部アプリケーションのプログラムを呼び出すには：
呼び出される側のアプリケーションと呼び出す側のアプリケーションで以下のように設定します。

呼び出されるアプリケーション側
呼び出されるアプリケーション側は、プログラムに公開プログラム名を設定するだけす。

呼び出すアプリケーション側［コール公開プログラム］処理コマンドを使用します。設定は以下の通りです。
1. 処理テーブルで［コール］を指定します。
2. 次のパーク位置で「B= 公開プログラム」を選択します。
3. ３番目のパーク位置でズームすると［コール公開プログラム］ダイアログが表示されます。ここで３つのパラメータを指定します。MFF を呼び出す場合は、［データ
ベース名］は指定する必要はありません。

開発者ガイドMagic eDeveloper V9 Plus187

第 14 章 - Magic コンポーネント

コンポーネント側からホスト側のイベントを実行する
コンポーネントアプリケーションからホストアプリケーションに登録されたイベントを実行させることができます。

コンポーネント側からホスト側のイベントを実行させるには：呼び出される側のアプリケーションと呼び出す側のアプリケーションで以下のように設定します。

ホストアプリケーション側
メインプログラムのユーザイベントテーブルを開きます。実行させたいイベントの［公開イベント名］に任意の名前を指定します。また、［公開］カラムのチェックボックスを「オン」にします。

コンポーネントアプリケーション側［イベント実行］処理コマンドを使用します。設定は以下の通りです。
1. 処理テーブルで［イベント実行］を指定します。
2. 次のパーク位置でズームすると［イベント］ダイアログが表示されます。
3. ［イベントタイプ］で「P= 公開イベント」を選択します。
4. ［イベント］で［式］テーブルにズームして公開イベント名を指定します。条件式にすることで実行するイベントを動的に変更することもできます。

188

開発者ガイドMagic eDeveloper V9 Plus

外部アプリケーションとの接続

15

Magic は DDE（Dynamic Data Exchange）、OLE オートメーション、または DLL をコールしたり、
［OS］コマンドを使用して第３世代言語プログラムを起動することが可能です。

この章では以下のことについて説明いたします。
OS コマンドの使用

190 ページ

DDE の使用191 ページ

DLL の呼び出し191 ページ

OLE オートメーションの利用

195 ページ

その他、接続するアプリケーションに応じて以下を参照して下さい。
• Java アプリケーション……第 20 章「J2EE との連携」• Web サービス……第 21 章「Web サービス対応」• COM……第 22 章「COM 対応」

開発者ガイドMagic eDeveloper V9 Plus

189

第 15 章 - 外部アプリケーションとの接続

OS コマンドの使用［OS］コマンドを使用すると、外部のプログラムやスクリプトファイルを Magic から実行することが可能です。これには［OS］コマンドで実行する式を定義して使用します。
Magic はコマンドを OS に送信します。コマンドはコマンドラインから外部プログラムをコールするときのコマンド（Windows NT/2000 であれば cmd.exe）と同じパラメータを指定することができます。
式の例をいくつか示します。
•

notepad list.txt …… ノートパッドで、list.txt を開きます。

•

external.bat output.log …… output.log というファイルをパラメータに指定して、
enternal.bat というバッチファイルを実行します。

ここでは以下のことについて説明します。
• ［ウェイト］パラメータ• ［表示］パラメータ• ［戻り値］パラメータ• トラブルシューティング［ウェイト］パラメータ［ウェイト］欄によって、Magic が外部プログラムの終了を待つかどうかの設定を行います。
• 「No」に設定されているときは、Magic は外部プログラムの終了を待ちません。
• 「Yes」に設定されているときは、外部プログラムの実行が終わるまで Magic は次の処理を行いません。

［表示］パラメータ［画］欄は外部プログラムのウィンドウ表示サイズを指定します。有効な選択肢は以下のとおりです。
• N= 通常 …… OS のデフォルト値です。
• H= なし …… ウィンドウを表示しません。
• X= 最大化 …… ウィンドウが最大サイズになります。
• M= 最小化 …… ウィンドウ表示されず、タスクバーにアイコンが表示されます。

［戻り値］パラメータ［戻］欄はオプションです。外部プログラムからの数値型の戻り値を受け取ります。戻り
値がゼロ以上であれば、外部プログラムは Magic によって正常に実行されたことを示し、番号の意味は外部プログラムの仕様に依存します。戻り値が負の数のとき、コマンドが失敗したことを示します。これは誤ったプログラム名やパス名を指定してしまった場合などが考えられます。

トラブルシューティング［OS］コマンドからの外部プログラムからの実行に問題があるときは、全く同じコマン
ドをコマンドラインインタフェースから試みてみてください。

190

開発者ガイドMagic eDeveloper V9 Plus

DDE の使用• Windows の場合……コマンドプロンプト／ DOS ボックスを使用します。
• UNIX の場合…… xterm や telnet のようなターミナルエミュレータを利用します。

DDE の使用DDE（Dynamic Data Exchange）を使用することで、DDE サーバ機能を持つアプリケー
ションとデータのやり取りができます。
Magic が DDE を利用する場合、DDE 関数を使用します。DDE 関数での詳細なパラメー
タの内容は各 DDE サーバ側の使用に依存します。ここでは、MS-Excel を例にとって説明します。
Excel は、すでに起動されているもの（OS コマンドで起動できます。）として説明します。

ファイルを開く
Excel のワークブックを開く場合、以下のコマンドを実行します。
DDExec ('Excel','System','','[Open(" ファイル名 ”)]')

特定のセルにデータを書き込む
ワークブックの最初のワークシートの指定したセルにデータを書き込む場合は、以下のコマンドを実行します。
DDEPoke ('Excel',” ファイル名 ”, セルの座標 , 書き込む値 )特定のセルのデータを読み込む
ワークブックの最初のワークシートの指定したセルのデータを読み込む場合は、以下のコマンドを実行します。
DDEGet ('Excel',” ファイル名 ”, セルの座標 , 最大データ長 )ファイルを閉じる
Excel のワークブックを閉じる場合、以下のコマンドを実行します。
DDExec ('Excel','System','','[Close(" ファイル名 ”)]')DLL の呼び出しdll ファイルで提供されているプログラムを Magic から呼び出すには、CallDLL 関数やUDF を使用します。
ここでは、同じ処理を CallDLL を使用した場合と UDF を使用した場合でのプログラム方法を比較して説明いたします。どれも Windows の API を呼び出します。

ウィンドウのタイトル変更
ウィンドウのタイトルを変更するには、User32.dll の GetParent でウィンドウのハンドルを取得し、そのハンドル値を使用して SetWindowTextA を呼び出します。

開発者ガイドMagic eDeveloper V9 Plus

191

第 15 章 - 外部アプリケーションとの接続

CallDLL を使用して変更する：
1. ［レコードメイン］レベルで以下の変数を定義します。
シンボル名

名前

型

書式

目的

A

WorkSpace

N= 数値

8

Magic のワークスペースのハンドル値の格納用

B

Window

N= 数値

8Magic ウィンドウのハン
ドル値の格納用

C

Title

A= 文字

30

表示するタイトルバーの格納用

2. Ctrl+K で［イベント］テーブルを開き、以下のようにイベントを定義します。
•

名前：Window タイトル変更•

タイプ：N= なし

3. ［タスク定義］でハンドラを作成し、［イベント］には、#2 で作成した、「Window
タイトル変更」イベントを割り当てます。
4. ハンドラの処理テーブルに以下の処理を定義します。
• ［項目更新］コマンドで変数項目 A を以下の式で更新します。
CallDLLS（'USER32.GetParent','44',WINHWND （0））• ［項目更新］コマンドで変数項目 B を以下の式で更新します。
CallDLLS （'USER32.GetParent','44',A）• ［アクション］コマンドを定義し、以下の式を指定します。
CallDLLS （'USER32.SetWindowTextA','4A4',B,C）
5. メインフォームに項目 C（タイトル入力用）とプッシュボタンを配置します。プッ
シュボタンの［実行イベント］特性には、「Window タイトル変更」イベントを割り当てます。

UDP を使用して変更する：
1. 変数とイベントを CallDLL の場合と同じように定義します。
2. ［タスク定義］でハンドラを作成し、［イベント］には、「Window タイトル変更」イ
ベントを割り当てます。
3. ハンドラの処理テーブルに以下の内容で、３つの［コール］コマンドを定義します。
コールタイプは、「U= ユーザ PRC」で、［規］カラムには、「STDCALL」と指定します。
•

ユーザ PRC の式……'@USER32.GetParent'［パラ］欄でズームして［パラメータ］テーブルを開き以下のように指定します。
項目

式
nn

‘44’

nn

WINHWND(0)

A
•

192

ワークスペースのハンドル値

ユーザ PRC の式……'@USER32.GetParent'［パラメータ］テーブルを開き以下のように指定します。
項目

•

説明

式

説明

nn

‘44’

A

ワークスペースのハンドル値

B

ウィンドウのハンドル値

ユーザ PRC の式……'@USER32.SetWindowTextA'

開発者ガイドMagic eDeveloper V9 PlusDLL の呼び出し［パラメータ］テーブルを開き以下のように指定します。
項目

式

説明

nn

‘4A4’

B

ウィンドウのハンドル値C

タイトルバーの名前

4. メインフォームに項目 C（タイトル入力用）とプッシュボタンを配置します。プッ
シュボタンの［実行イベント］特性には、「Window タイトル変更」イベントを割り当てます。

アイコンの変更表示されるアイコンを変更するには、User32.dll の GetParent でウィンドウのハンドルを取得し、Shell32.dll の ExtractIconA でアイコンファイルのハンドルを取得、これらのハン
ドル値を使用して User32.dll の SendMessageA を呼び出します。

CallDLL を使用して変更する：
1. ［レコードメイン］レベルで以下の変数を定義します。
シンボル名

名前

型

書式

目的

A

WorkSpace

N= 数値

8

Magic のワークスペースのハンドル値の格納用

B

Window

N= 数値

8Magic ウィンドウのハン
ドル値の格納用C

IConFile

A= 文字

260

表示するアイコンファイ
ル名の格納用D

IconHandle

N= 数値

8

アイコンのハンドル値の格納用

2. Ctrl+K で［イベント］テーブルを開き、以下のようにイベントを定義します。
••

名前：アイコンの変更
タイプ：N= なし

3. ［タスク定義］でハンドラを作成し、［イベント］には、#2 で作成した、「アイコンの変更」イベントを割り当てます。
4. ハンドラの処理テーブルに以下の処理を定義します。
• ［項目更新］コマンドで変数項目 A を以下の式で更新します。
CallDLLS（'USER32.GetParent','44',WINHWND （0））• ［項目更新］コマンドで変数項目 B を以下の式で更新します。
CallDLLS （'USER32.GetParent','44',A）• ［項目更新］コマンドで変数項目 D を以下の式で更新します。
CallDLLS（'shell32.ExtractIconA','4A44',0,C,0）• ［アクション］コマンドを定義し、以下の式を指定します。
CallDLLS（'USER32.SendMessageA','44444',B,128,1,D）
5. メインフォームに項目 C（アイコンファイル入力用）とプッシュボタンを配置します。プッシュボタンの［実行イベント］特性には、「アイコンの変更」イベントを割り当てます。

UDP を使用して変更する：
1. 変数とイベントを CallDLL の場合と同じように定義します。

開発者ガイドMagic eDeveloper V9 Plus

193

第 15 章 - 外部アプリケーションとの接続
2. ［タスク定義］でハンドラを作成し、［イベント］には、「アイコンの変更」イベン
トを割り当てます。
3. ハンドラの処理テーブルに以下の内容で、４つの［コール］コマンドを定義します。
コールタイプは、「U= ユーザ PRC」で、［規］カラムには、「STDCALL」と指定します。
•

ユーザ PRC の式……'@USER32.GetParent'［パラ］欄でズームして［パラメータ］テーブルを開き以下のように指定します。
項目

式

説明

nn

‘44’

nn

WINHWND(0)A•

ユーザ PRC の式……'@USER32.GetParent'［パラメータ］テーブルを開き以下のように指定します。
項目•

ワークスペースのハンドル値

式

説明

nn

‘44’

A

ワークスペースのハンドル値

B

ウィンドウのハンドル値

ユーザ PRC の式……'@shell32.ExtractIconA'［パラメータ］テーブルを開き以下のように指定します。
項目

式

説明

nn

‘4A44’nn0C

アイコンファイル名
nn

D
•

0
アイコンのハンドル値

ユーザ PRC の式……'@USER32.SendMessageA'［パラメータ］テーブルを開き以下のように指定します。
項目

式

説明

nn

‘44444’B

D

ウィンドウのハンドル値
nn

128

nn

1
アイコンのハンドル値

4. メインフォームに項目 C（アイコンファイル入力用）とプッシュボタンを配置します。プッシュボタンの［実行イベント］特性には、「アイコンの変更」イベントを割り当てます。

WAV ファイルの再生
WAV ファイルの再生処理を実行するには、winmm.dll の PlaySoundA を呼び出します。
ここでは、下記の手順は winmm.PlaySoundA 関数（Windows の API）を使用して Magic ア
プリケーション内で WAV ファイルの処理を実行する手順です。

CallDLL を使用して再生する：
1. ［アクション］コマンドで下記の式を入力します。
CallDLLS（'winmm.PlaySoundA','A480','c:¥path¥MsgSent.wav',0, 131072）

194

開発者ガイドMagic eDeveloper V9 Plus

OLE オートメーションの利用c:¥path¥MsgSent.wav は WAV ファイルをフルパスで表しています。PlaySoundA 関数には下記の三つのパラメータを渡します。
•

再生される WAV ファイルを指定する文字列•

ロードされるべきリソースを含んだ、実行可能ファイルのハンドラ。ディスク
上のファイルを指定するときはこの項目は Null である必要があります。

•

最初のパラメータがファイル名であるかどうかを特定するフラグ。
「131072」（Hex 0x20000）は snd_filename に対するフラグです。

UDP を使用して再生する：
1. ［コール］コマンドを定義します。コールタイプは、「U= ユーザ PRC」で、［規］カ
ラムには、「STDCALL」と指定します。
•

ユーザ PRC の式……'@winmm.PlaySoundA'［パラ］欄でズームして［パラメータ］テーブルを開き以下のように指定します。
項目

式

説明

nn

‘A480’

nn'c:¥path¥MsgSent.wav'

nn

0

nn

131072

OLE オートメーションの利用
OLE オートメーションは、OLE オブジェクトの機能や属性を外部からアクセス可能にした機能です。Magicは、UDPを使用してOLEオートメーションを利用することができます。
ここでは、OLE オートメーション機能を利用して、Excel を制御するいくつかの例を列挙
します。

変数の定義
一連の処理を行うための変数項目を以下のように定義します。
変数名

型

書式

Excel Application Object

N= 数値

10

Workbook collection Object

N= 数値

10

Workbook Object

N= 数値

10

Sheets collection Object

N= 数値

10

Worksheet Object

N= 数値

10

Range Object

N= 数値

10

Excel Cell

A= 文字

4

Data

A= 文字

100

FileName

A= 文字

100

ErrorCode

N= 数値

2

WorkSheetNo

N= 数値

2

開発者ガイドMagic eDeveloper V9 Plus

195

第 15 章 - 外部アプリケーションとの接続

Excel を起動する
Excel を起動して新規のワークブックを表示させるには、以下の UDP を実行します。

Excel のオブジェクトを取得する関数：'@mg_ocx.objectLoad'

パラメータ：'AAL4''''Excel.Application'
変数「Excel Application Object」
変数「ErrorCode」

変数「Excel Application Object」には、オブジェクトのインスタンス番号が返ります。

ワークブックのコレクションを取得する関数：'@mg_ocx.PropGet'

パラメータ：'4AAL4'
変数「Excel Application Object」'Workbooks''o'
変数「Workbook collection Object」
変数「ErrorCode」

変数「Workbook collection Object」には、オブジェクトのインスタンス番号が返ります。

ワークブックを作成する
関数：'@mg_ocx.MethodCall'

パラメータ：'4AAL4'
変数「Workbook collection Object」
'Add'
'o'
変数「Workbook Object」
変数「ErrorCode」

変数「Workbook Object」には、オブジェクトのインスタンス番号が返ります。

196

開発者ガイドMagic eDeveloper V9 Plus

OLE オートメーションの利用

ワークシートのコレクションを取得する関数：'@mg_ocx.PropGet'

パラメータ：'4AAL4'
変数「Workbook Object」'Sheets''o'
変数「Sheets collection Object」
変数「ErrorCode」

変数「Sheets collection Object」には、オブジェクトのインスタンス番号が返ります。

ワークシートを指定する
関数：'@mg_ocx.PropGet'

パラメータ：'4AAL4'
変数「Sheets collection Object」'Item''o4'
変数「Worksheet Object」
変数「WorkSheetNo」
変数「ErrorCode」

変数「Worksheet Object」には、変数「WorkSheetNo」で指定されたワークシートのオブジェクトのインスタンス番号が返ります。

Excel を表示する
関数：'@mg_ocx.PropSet'

パラメータ：'4AA44'
変数「Excel Application Object」'Visible''2'
1
変数「ErrorCode」

セルに値を設定する
セルに値を設定する場合、範囲のオブジェクトを取得して、そのオブジェクトに対して値を設定します。

開発者ガイドMagic eDeveloper V9 Plus

197

第 15 章 - 外部アプリケーションとの接続

範囲のオブジェクトを取得する関数：'@mg_ocx.PropGet'

パラメータ：'4AALA4'
変数「Worksheet Object」'Range'‘oA’
変数「Range Object」
変数「Excel Cell」
変数「ErrorCode」

変数「Range Object」には、変数「Excel Cell」で指定された範囲のオブジェクトのインス
タンス番号が返ります。

値を設定する関数：'@mg_ocx.PropSet'

パラメータ：'4AAA4'
変数「Range Object」'Value'‘A’
変数「Data」
変数「ErrorCode」

変数「Excel Cell」で指定したセルに、変数「Data」の値が書き込まれます。

ワークブックを開く
既存のワークブックを開く場合、上述の「Excel を起動する」の「ワークブックを作成する」の代わりに以下の処理を実行します。

指定したワークブックを開く関数：'@mg_ocx.MethodCall'

パラメータ：'4AALA4'
変数「Workbook collection Object」'Open''oA'
変数「Workbook Object」
変数「FileName」
変数「ErrorCode」

変数「FileName」で指定したワークブックを開きます。

Excel の終了
Excel を終了させるには、Quit メソッドを実行後、各オブジェクトのインスタンスを開放します。Quit メソッドを実行しただけの場合は、プロセスが残ったままになります。

198

開発者ガイドMagic eDeveloper V9 Plus

OLE オートメーションの利用

Excel を終了する関数：'@mg_ocx.MethodCall'

パラメータ：'4AA4'
変数「Excel Application Object」'Quit''M'
変数「ErrorCode」

オブジェクトを開放する
すべてのオブジェクトに対して、'@mg_ocx.objectRelease' を実行します。
関数：'@mg_ocx.objectRelease'

パラメータ：'L4'（オブジェクトのインスタンス番号が格納されている変数 ）
変数「ErrorCode」

開発者ガイドMagic eDeveloper V9 Plus

199

第 15 章 - 外部アプリケーションとの接続［このページは意図的に空白にしています。］

200

開発者ガイドMagic eDeveloper V9 Plus

アプリケーション
パーティショニング

16

Magic は異なるコンピュータ間の環境下で相互運用することができます。相互運用性とは、Magic アプリケーションをマルチ・データベース、マルチ・プラットフォーム、マルチ・ネットワークの環境下でのデータ処理が行えることを意味します。ユーザは、全ての Magic アプリケーションに共通するインタフェースを使用して、色々な DBMS にア
クセスし、データの照会や更新を行うことができます。
アプリケーションパーティショニングという言葉は、ネットワーク上にある複数のコンピュータ間にアプリケーションを分散するアプリケーション開発のプロセスを意味しま
す。
最も単純なケースでは、１台の PC 上で複数の Magic のインスタンスが起動され、クライアントアプリケーションとサーバアプリケーションが実行されるものです。この場合、クライアントアプリケーションからのリクエストを受けてサーバアプリケーションが処理を実行することになります。
この構成を複数の PC 上に展開させることで、アプリケーションのロジックを複数のサーバ上に分散させることができます。

この章では以下のことについて説明いたします。
パーティショニングの設定

202 ページ

MRB 情報の取得

204 ページ

リモートプログラムの実行

205 ページ

Magic モジュールの分散化

205 ページ

メッセージングを利用することもできます。第 24 章「メッセージの送受信」を参照して下さい。

開発者ガイドMagic eDeveloper V9 Plus

201

第 16 章 - アプリケーション パーティショニング

パーティショニングの設定
どのアプリケーションをサーバ側（リモートエンジン）で実行させるか、どのアプリケー
ションをクライアント側（ローカルエンジン）で実行させるかを選択する必要があります。
サーバ側のアプリケーションは、基本的にバックグラウンドで実行するように定義します。Magic のパーティショニング設定を行うには下記の設定が必要です。
1. アプリケーションを分散します。
2. 分散されたアプリケーションの動作の仕組みを確認します。
3. アプリケーションを定義します。
4. サーバをセットアップします。
5. クライアントをセットアップします。
6. パーティショニングを使用します。

アプリケーションの分散
Magic では、１つのクライアントと複数のサーバ間でアプリケーションロジックを分散させて処理することができます。アプリケーションの分散とは、アプリケーションの一部をサーバ上で、別の一部をクライアントで実行することを言います。
クライアント側に Magic eDeveloper （または、Magic Client）をインストールし、サーバ側の PC へ Magic Application Server をインストールする必要があります。なお、バックグ
ラウンドで実行できるのはバッチタスクのみです。

分散されたアプリケーションの動作の仕組みを確認する
サーバ側では、MRB（Magic Request Broker）が実行されていて、Magic エンジンが MRBを認識できる設定になっている必要があります。クライアント側の Magic は、サービスに対して公開プログラムの実行を要求する［コールリモート］コマンドを発行します。
リクエストはサーバ側の Magic に送信され、実行されます。
リクエストには２つのタイプがあります。
• 同期リクエスト …… クライアントはサーバがリクエストの処理を完了するまで待ちます。
• 非同期リクエスト …… クライアントはリクエストをサーバに送信した後、そのまま処理を続け、リクエスト処理の終了を待つことはありません。
［コールリモート］コマンドでは［ウェイト］欄でリクエストのタイプを指定します。
（Yes = 同期 , No = 非同期） MRB はクライアントからのリクエストをサーバに送信する役目があります。
サーバとクライアントは同じ MCF を使用することも、異なる MCF を使用することも可能です。

Magic アプリケーションの定義
サーバ側のアプリケーションが、リクエストを受け付けるプログラムを実行するようにするには、プログラムに公開名を設定する必要があります。

202

開発者ガイドMagic eDeveloper V9 Plus

パーティショニングの設定

サーバ側のセットアップ
Magic のインストール処理では、アプリケーションサーバとして動作する上でのデフォ
ルト値が設定されます。以下の説明は、MRB を別の PC 上で実行させるなどのデフォル
トの設定とは運用環境が異なる場合に行ってください。

サーバ側をセットアップする：
1. ［サーバ］テーブルに以下の内容で接続する MRB を定義します。
•

名前……任意の名前•

サーバタイプ……Magic Request Broker•

サーバアドレス……ポート番号／ MRB が実行しているサーバ名（例：3300/
ServerName）

2. Ctrl+P で［サーバ特性］ダイアログを開き、［パスワード］欄に MRB の Supervisor
パスワードを設定します。
この値は、MRB の実行モジュール（MGrqmrb.exe）と同じディレクトリ内にある
Mgrb.ini ファイルの［MRB_ENV］セクションの PasswordSupervisor の値と同じにしてください。この部分にはシークレット名を使用することができます。
3. ［動作環境］の［アプリケーションサーバ］タブで、［アプリケーションサーバとして動作］を「Yes」に設定します。
［メッセージサーバ］に［サーバ］テーブルで登録したサーバ名を設定します。
4. 必要に応じて以下の設定も行ってください。
• ［システム］タブの［デフォルトアプリケーション］に Magic 起動時にロードされるアプリケーションを登録することで、Magic エンジン起動時に指定されたア
プリケーションが読み込まれるようになります。
• ［アプリケーションサーバ］タブの［アプリケーションサーバはアプリケーショ
ンを変更可］を「No」に設定すると、一旦ロードした MCF を切り替えないようにすることができます。
• ［システム］タブの［アプリケーション起動モード］を「B= バックグラウンド」に設定することで、Magic をバックグラウンドモードで起動させることができます。

クライアントのセットアップ
クライアント側をセットアップする：
1. ［サーバ］テーブルにサーバ側が接続している MRB を設定します。設定内容は、サーバ側のセットアップと同じです。［名前］は任意に指定できます。
2. ［サービス］テーブルで、サーバ側で実行するアプリケーション情報として以下の内容を登録します。
• ［名前］欄にはユニークな名前を入力してください。
• ［サーバ］カラムに［サーバ］テーブルに登録したメッセージサーバ（MRB）を設定します。
• ［リモートアプリケーション］欄にサーバ側の Magic の［アプリケーション］テー
ブルに登録されているアプリケーション名を入力します。
3. ［コールリモート］コマンドの［リモートコール］ダイアログで、［サービス］を選択し、起動するプログラムの「公開プログラム名」や［戻り値］などのパラメータを設定します。

開発者ガイドMagic eDeveloper V9 Plus203

第 16 章 - アプリケーション パーティショニング

パーティショニングの設定
クライアント側がリモートコールを実行する前に、サーバ側の MRB が起動していることが必要です。MRB 側で、自動的に Magic エンジンを起動するように設定することで、事前に Magic エンジンを実行させる必要がなくなります。サーバ側の Mgrb.ini ファイルを
以下のように設定してください。
［MRB̲ENV］
AutoLoad = Background,1....
[MRB̲EXECUTABLES̲LIST]
Background = MGRNTW.EXE /ApplicationStartup=B,F:¥magic¥,,,1「AutoLoad」で設定するパラメータは以下の通りです。
AutoLoad =［MRB_EXECUTABLES_LIST］で実行するエントリ名 , エンジンの最大数［MRB_EXECUTABLES_LIST］セクションで設定するパラメータは以下の通りです。
エントリ名 = ＜コマンド＞ , ＜作業フォルダ＞ , ＜ユーザ名＞ , ＜パスワード＞ , ＜MRB 起動時に実行される回数＞
これでクライアント側からのリモートコールを実行することができます。

MRB 情報の取得
コマンドラインリクエスタ（Mgrqcmdl.exe：Windows 用、Mgrqcmdl：Linux 用）を使用
して MRB の状態を確認することが可能です。パラメータの組み合わせにより、MRB に対して状態表示やリクエストの送信を行うことができます。
• MRB に接続された Magic エンジンの一覧表示
mgrqcmdl –query=rt
現在 MRB に接続されているエンジンの一覧が表示されます。
• Magic エンジンがサービスするアプリケーションの一覧表示
mgrqcmdl –query=app• MRB が受信したリクエストの履歴表示
mgrqcmdl –query=log
リクエストは降順（MRB か受信した最後のリクエストが一番上）で表示されます。
•

リクエスト番号の範囲を指定することができます。
mgrqcmdl –query=log=100-90•

１つのアプリケーションに対するリストのみ表示できます。
mgrqcmdl –query=log（app_name）• 処理待ちのリクエストのの一覧表示
mgrqcmdl –query=queue

204

開発者ガイドMagic eDeveloper V9 Plus

リモートプログラムの実行

リモートプログラムの実行
ここでは、コマンドラインリクエスタを使用してリモートアプリケーションのプログラ
ムを実行する方法について説明します。コマンドラインリクエスタは、MRB に接続された Magic エンジンに対して［コールリモート］コマンドと同じようにプログラムを実行させることができます。

リモートプログラムを実行する：
1. リモートプログラムを実行させる必要最低限のパラメータは、以下の通りです。
•

アプリケーション名：-appname=my_appl•

公開プログラム名：-prgname=my_remote_prg

この場合、以下のように指定します。
mgrqcmdl ‑appname=my̲appl prgname=my̲remote̲prg
2. アプリケーションに対するユーザ名とパスワードを指定する場合は、以下のパラメータを使用します。
•

ユーザ名：–username=my_user•

パスワード：–password=my_pass

3. リモートプログラムの出力がリクエスタのとき、以下のパラメータを使用して結果ファイルの名前を指定できます。
‑filename=request.out
4. リモートプログラムに渡すパラメータとグローバル変数を指定する場合は、以下のパラメータを使用します。
•

パラメータ：-arguments=…
例：mgrqcmdl ‑appname=my̲appl prgname=my̲remote̲prg ‑arguments=‑AXXX,‑
Nnnn
この例では、文字列 「XXX」と数値「nnn」を渡しています。

•

グローバル変数：–variables=…
例：mgrqcmdl ‑appname=my̲appl prgname=my̲remote̲prg‑variables=XXXX=nnnnn
この例では、グローバル変数「XXX」に「nnn」を設定して渡しています。Magic
アプリケーション側で、GetParame(‘XXX’) を実行することで「nnn」という値を取得できます。

5. リクエストの優先度（0 〜 9）を指定するには、以下のパラメータを使用します。数値が低くなるほど優先度は高くなります。
‑priority=5
キューに溜まっているリクエストは、優先度の高い順に処理されます。

Magic モジュールの分散化
デフォルトで Magic をインストールした場合は、インターネットリクエスタや MRB は、
Magic と同じ PC にインストールされます。しかし、これらのファイルを別々の PC に分散してインストールして運用することもできます。ここでは、このような場合のインス
トール内容について説明いたします。

開発者ガイドMagic eDeveloper V9 Plus

205

第 16 章 - アプリケーション パーティショニング

インストール方法
MRB やインターネットリクエスタを個別にインストールするには：
MRB やインターネットリクエスタを Magic とは別にインストールするには、コンポーネントのインストール処理を実行します。

各構成毎の設定内容
インストールするモジュールの構成毎に、設定内容を説明します。

インターネットリクエスタと MRB を同じ PC

図 16-1 リクエスタと MRB が同じ PC• インターネットリクエスタと MRB がインストールされた PC のホスト名を「INET-PC」とします。
• この PC の C ドライブを「C_DRIVE」という名前の共有フォルダとします。共有フォ
ルダには、Magic 側の PC からアクセスできるように権利設定を行います。
• Magic.ini ファイルを以下のように設定します。
[MAGIC̲ENV]
MessagingServer = ANOTHER̲PC
WebDocumentPath = ¥¥INET‑PC¥C̲DRIVE¥Inetpub¥wwwroot
InternetDispatcherPath = /Magic94Scripts/mgrqispi94.dll
WebDocumentAlias = /Magic94Java
CTLCacheFilesPath = ¥¥INET‑PC¥C̲DRIVE¥Program Files¥Magic¥AppServer¥
Browser̲Client̲Cache[MAGIC̲SERVERS]
ANOTHER̲PC = INET‑PC/3300,,password,0,,1

206

開発者ガイドMagic eDeveloper V9 Plus

Magic モジュールの分散化

インターネットリクエスタのみ別の PC

図 16-2 リクエスタのみ別の PC• インターネットリクエスタがインストールされた PC のホスト名を「INET-PC」、Magicと MRB がインストールされている PC のホスト名を「MAGIC-PC」とします。
• 「INET-PC」の C ドライブを「C_DRIVE」という名前の共有フォルダとします。共有
フォルダには、Magic 側の PC からアクセスできるように権利設定を行います。
• Magic.ini ファイルを以下のように設定します。
[MAGIC̲ENV]
MessagingServer = Default Broker
WebDocumentPath = ¥¥INET‑PC¥C̲DRIVE¥Inetpub¥wwwroot
InternetDispatcherPath = /Magic94Scripts/mgrqispi94.dll
WebDocumentAlias = /Magic94Java
CTLCacheFilesPath = ¥¥INET‑PC¥C̲DRIVE¥Program Files¥Magic¥AppServer¥
Browser̲Client̲Cache[MAGIC̲SERVERS]
Default Broker = 3300,,password,0,,1• INET_PC のインターネットリクエスタがインストールされているフォルダ内にあるMgreq.ini ファイルを以下のように設定します。
[REQUESTER̲ENV]
MessagingServer =MAGIC‑PC/3300

開発者ガイドMagic eDeveloper V9 Plus

207

第 16 章 - アプリケーション パーティショニング

インターネットリクエスタと MRB を別の PC

図 16-3 全て別の PC• インターネットリクエスタがインストールされた PC のホスト名を「INET-PC」、インストールされている PC のホスト名を「MAGIC-PC」、MRB がインストールされている PC のホスト名を「MRB-PC」とします。
• 「INET-PC」の C ドライブを「C_DRIVE」という名前の共有フォルダとします。共有
フォルダには、Magic 側の PC からアクセスできるように権利設定を行います。
• 「MAGIC-PC」の Magic.ini ファイルを以下のように設定します。
[MAGIC̲ENV]
MessagingServer = MRB̲PC
WebDocumentPath = ¥¥INET‑PC¥C̲DRIVE¥Inetpub¥wwwroot
InternetDispatcherPath = /Magic94Scripts/mgrqispi94.dll
WebDocumentAlias = /Magic94Java
CTLCacheFilesPath = ¥¥INET‑PC¥C̲DRIVE¥Program Files¥Magic¥AppServer¥
Browser̲Client̲Cache[MAGIC̲SERVERS]MRB̲PC = MRB‑PC/3300,,password,0,,1• 「INET-PC」のインターネットリクエスタがインストールされているフォルダ内にあるMgreq.ini ファイルを以下のように設定します。
[REQUESTER̲ENV]
MessagingServer =MRB‑PC/3300

208

開発者ガイドMagic eDeveloper V9 Plus

パフォーマンスの向上

17

この章では Magic のパフォーマンスを向上させる機能について説明します。

この章では以下のことについて説明いたします。
DBMS オプティマイザーの操作

210 ページ

RDBMS 側での設定

211 ページ

頻繁に使用されるデータテーブルへのアクセス

213 ページ

開発者ガイドMagic eDeveloper V9 Plus

209

第 17 章 - パフォーマンスの向上

DBMS オプティマイザーの操作
Magic は、DBMS ヒントを使用して DBMS オプティマイザーを操作することができます。
Magic ではオプティマイザーの動作や特性を変更したり操作するために、DBMS にヒントを送る機能をサポートしています。
ここでは以下のことについて説明します。
• ヒントの優先付け• ヒントの例

ヒントの優先付け
Magic は、以下のオブジェクトに対してヒントを設定することができます。
• インデックス• テーブル• データベース
優先順位は、インデックス、テーブル、データベースの順です。したがって、インデックスとテーブルの両方にヒントが存在するとき、インデックスのヒントが DBMS に送信されます。
例として、FORCE_INDEX ヒントを各特性に設定したときの効果を示します。
• インデックス特性……指定したインデックスにのみ適用されます。
• テーブル特性……テーブル中の全てのインデックスに適用されます。
• データベース特性……データベース中の全てのテーブルの全てのインデックスに適用されます。
ヒントは DBMS オプティマイザーの動作を変える手段で、重大な影響があるため、特別な注意をもって使用する必要があります。
ヒントは以下のような特性を指定することができます。
• SQL 文に対する最適化アプローチ• SQL 文に対するコストベース・アプローチのゴール• SQL 文によりアクセスされるテーブルのアクセスパス• 結合（ジョイン）文に対する結合順序• 結合文中の結合操作• アクセスされているテーブルに設定されるロック• 使用される分離レベル

ヒントの例
データベース :• Oracle:/*+ FIRST̲ROWS */• MS‑SQL Server:
FASTFIRSTROWSERIALIZABLE

210

開発者ガイドMagic eDeveloper V9 PlusRDBMS 側での設定

テーブル :• Oracle:/*+ ROWID */• MS‑SQL Server:
HOLDLOCKLOOPMERGEFORCE ORDER

インデックス :• Oracle:/*+ （INDEX table index̲name）• MS‑SQL Server:
INDEX = index̲name
別の方法として、下記のような SQL コマンドを使用して、セッションのパラメータを恒常的に変える方法もあります。（Oracle の場合の例）：
ALTER SESSION SET OPTIMIZER_GOAL = FIRST_ROWSRDBMS 側での設定
ここでは、パフォーマンス向上に使用できる特定の DBMS 機能を Magic から使用する方法と、DBMS に影響する Magic の機能について説明します。
下記の DBMS の機能が Magic のプログラム内で使用できます。
• 埋め込み SQL 文• データベース・ビューの使用• DBMS ストアド・プロシージャ−• RDBMS ソート
また、以下の機能も有効です。
• ［テーブルの存在チェック］パラメータ•

ノンユニークキー•

範囲式

DBMS の機能を使用したパフォーマンス向上策
パフォーマンスを向上させるには、前述の Magic がサポートする DBMS 機能の組み込みを検討する必要があります。

埋め込み SQL 文• 下記のような DDL 文
INSERT into TABLE1 select * from TABLE2

開発者ガイドMagic eDeveloper V9 Plus

211

第 17 章 - パフォーマンスの向上• 下記のような集合関数
SELECT sum（FIELD1）,AVG（FIELD2）from TABLE1• 下記のような大規模な UPDATE/DELETE
DELETE from TABLE1 where

データベース・ビュー
ビューは、１つまたは複数の結合テーブルの範囲付けされたレコードです。ビューは単なる定義であり、データベース容量を必要としません。ビューには関数の集合関数、計算項目、結合テーブルを含めることが可能です。

ストアド・プロシージャ
ストアド・プロシージャは、Magic によって実行可能な手続き的な SQL コードです。ス
トアド・プロシージャにはカーソルハンドリング、DML、DDL などの SQL コードを含めることが可能です。

RDBMS ソート
RDBMS は Magic よりはるかに高速にデータのソートを行うことができます。このため、Magic は下記の場合に RDBMS ソートをリクエストします。
• Magic インデックスが使用されているとき。
• Magic ソートがメインテーブルや結合リンクテーブルの複数の項目にわたって定義されているとき。
その他のケースでは、Magic はソートを内部的に実行します。

その他のパフォーマンス向上策
パフォーマンスを向上する上で、以下の内容についても見直しを行い、アプリケーショ
ンにおける効果を確認することも必要です。

テーブルの存在チェック［テーブルの存在チェック］のオプションを使用すると、Magic はオープンする全てのテーブルに対して存在チェックを行います。この動作には時間がかかるため、テーブルが存在していることが分かっているときは、この設定が本当に必要かどうかを検討すべきです。

ノンユニークキーの Magic インデックス
Magic がノンユニークキーのインデックスをメイン／リンクテーブルのインデックスとして使用している場合、DBMS に送信する ORDER BY 句の最後にテーブルのポジションが追加されます。この規則はオンラインタスクのメインテーブルと全てのリンクテーブ
ルに適用されます。
テーブルのポジションのセグメントを含む ORDER BY 句は、パフォーマンスを低下させる場合があります。これは、照会するデータに対応する DBMS インデックスが存在しないときに問題となります。

212

開発者ガイドMagic eDeveloper V9 Plus

頻繁に使用されるデータテーブルへのアクセス

範囲式
Magic は DBMS から取得した全てのレコードに対して、データビューに含まれるかどうか判定する為に、範囲式を使用して評価します。そのためには、全てのレコードがクライアントに到達する必要があり、これによってパフォーマンスを低下させる場合があります。Magic SQL WHERE 句または DB SQL WHERE 句を使用するとこの問題を解決できます。クライアントは処理に必要なデータビューに属するレコードだけを返すように
DBMS にリクエストできます。

頻繁に使用されるデータテーブルへのアクセス
常駐テーブルの利用
Magic は、テーブルエントリを常駐テーブルとして定義させることができます。これによりテーブルのデータは、あらかじめメモリにロードされます。
開発者とユーザは、テーブルを常駐させるかどうかを指定することができます。
テーブルが異なるタスクによって何回も繰返しアクセスされるとき、開発者はそのデー
タをあらかじめロードするかどうか選択できます。テーブルリポジトリの［テーブル特性］でデータのロードのタイミングをアプリケーションオープン時か、テーブルオープ
ン時のどちらかにするかを指定できます。
通常この設定は、データの変更がまれにしか起こらないと推測される場合に使用します。

テーブルを常駐テーブルに指定する：
1. テーブルリポジトリを開き、Ctrl+P を押して［テーブル特性］ダイアログを開きます。
2. ［高度な設定］タブの［常駐］欄を「I= 即時」、または「D= 利用時」に設定します。
テーブルをあらかじめロードしておくと、データの読み出しはクライアントのメモリに対して実行されます。DBMS 中のテーブル自体は、ロード時を除いてアクセスされることはありません。
開発版を使用している場合、アプリケーションを実行モードに切り替えたときにテーブ
ルはロードされ、開発モードに戻るときに開放されます。

実行モード移行時にテーブルのメモリへのロードを防止する：［動作環境］の［動作設定］タブの［常駐テーブル読込］を「No」に設定します。
このフラグは、ユーザが全ての常駐テーブルのロードを防止するの場合にも使用できます。
SQL DBMS を使用した場合、テーブルのタイプとして「ビュー」を定義することができます。このテーブルを常駐テーブルにすることで、テーブルの一部だけや、特定のカラムだけ、または結合テーブルを常駐させるといったような利用ができます。

テーブルキャッシュの利用
テーブルのデータをメモリにキャッシュすることで、データアクセスのパフォーマンス
を向上させる方法もあります。キャッシュは、Magic プログラムが DBMS から読み込んだデータをメモリ上に保存する機能です。キャッシュを利用することで、ディスクアク
セスやネットワークへのアクセスが減りパフォーマンス向上に有効となります。
ただし、書込処理が頻繁に行われるような場合、キャッシュ内容と整合性が取れなくな
る場合があります。

開発者ガイドMagic eDeveloper V9 Plus213

第 17 章 - パフォーマンスの向上
タスクでのキャッシュの設定方法は、メインテーブルとリンクテーブルで異なります。

メインテーブルのキャッシュを有効にする：
1. プログラムを開き、Ctrl+P を押して［タスク特性］ダイアログを開きます。
2. ［拡張］タブの［キャッシュ範囲］欄を設定します。設定内容には以下のものがあります。
•

P= 位置 ……キャッシュはフェッチしたレコードの位置に関する情報を保持します。次に後方スクロールを行うと、レコードの物理的な位置が読み込まれ、データが再びフェッチされます。

•

D= 位置とデータ…… 位置のほかに、レコードの実際のデータがキャッシュされます。事前にフェッチされているデータを読み込む場合には、キャッシュにすでに保存されている値が表示されます。

•

N= なし……キャッシュは行われません。

•

T= テーブル特性に依存……［テーブル特性］の［キャッシュ範囲］の指定に依存します。（［テーブル特性］の［キャッシュ範囲］にも、「P= 位置」、「D= 位置とデータ」、「N= なし」のパラメータがあります。）

リンクテーブルのキャッシュを有効にする：
1. プログラムを開き、Ctrl+D を押して［DB テーブル］テーブルを開きます。
2. リンクテーブルの［キャッシュ］カラムを「Yes」に指定するとキャッシュが有効に
なります。

214

開発者ガイドMagic eDeveloper V9 Plus

実行環境

18

Magic を実際の運用環境で実行する場合、それに適した環境を設定する必要があります。
この章では実行環境の全体像を説明いたします。実行環境は、パフォーマンスを最適化するために正しく設定されている必要があります。

この章では以下のことについて説明いたします。
フラットファイルの作成と使用方法

216 ページ

マルチスレッド環境の設定

217 ページ

マルチスレッド環境の管理

217 ページ

単一コンテキスト環境の設定

218 ページ

開発者ガイドMagic eDeveloper V9 Plus215

第 18 章 - 実行環境

フラットファイルの作成と使用方法
Magic フラットファイル （MFF）を使用すると、データベースに依存しないアプリケー
ションファイルを実行することが可能になります。Magic アプリケーションは、圧縮されたバイナリ形式ファイルで保存されます。MFF は実行目的のみに使用されるもので、修正することはできません。Magic はいかなるデータベースゲートウェイも経由せずにMFF に直接アクセスします。
ここでは以下のことについて説明します。
• Magic フラットファイルの作成• フラットファイルで実行

Magic フラットファイルの作成
MFF を作成する：
1. 開発モードで CTL ファイル（MCF）を開きます。
2. ［ファイル］メニューから［MFF 形式で保存］を選択すると［名前を付けて保存］
ダイアログが開きます。
3. MMF のファイル名を付けて保存します。

フラットファイルで実行
MFF を使用してアプリケーションを実行するには、２つの方法があります。
• ［アプリケーション特性］を変更して、アプリケーションを開く• コマンドラインパラメータを指定して Magic を実行する［アプリケーション特性］で指定する：
1. ［アプリケーション］テーブルでフラットファイルを指定したアプリケーションを選択します。
2. ［編集］メニューで［特性］を選択し、［アプリケーション特性］ダイアログを開きます。
3. ［フラットファイルで実行］のオプションを「有効」にします。
4. ［OK］をクリックします。
MFF は実行版エンジンでのみ動作することができます。アプリケーションのファイ
ル名が指定されていない場合、アプリケーションの識別子を元にファイル名が決められます。

コマンドラインパラメータで指定する：
Magic 起動時のコマンドラインパラメータを以下のように指定することで、MFF をロードします。
mgrntw /MFF=<flat MCF file name>216

開発者ガイドMagic eDeveloper V9 Plus

マルチスレッド環境の設定

マルチスレッド環境の設定
Magic は、マルチスレッドで動作させることにより同時に複数ユーザにサービスを提供することができます。各リクエストに対して、Magic は新しくスレッドを生成します。
Magic のエンジンをマルチスレッドで動作させるには、以下の２つの方法があります。
• Magic エンジンをバックグラウンドモードで実行させる。
• ［動作環境］の［アプリケーションサーバ］タブの［フォアグラウンドでのコンテキ
スト管理］パラメータを「B= バックグラウンドエンジンと同じ」に設定する。
Web アプリケーションでは、スレッドはブラウザクライアントからのリクエストを受信して処理を行っている間だけ存在します。
ここでは、バックグラウンドモードで実行させることを前提にマルチスレッド環境での実行環境を説明します。

バックグラウンドモードにする：
1. ［設定］メニューから［動作環境］ダイアログを開き、［システム］タブを開きます。
2. ［アプリケーション起動モード］を「B= バックグラウンド」に設定します。
3. Magic を再起動します。

同時処理スレッド数の制限
同時処理スレッド数を制限する：
1. ［設定］メニューから［動作環境］を開きます。
2. ［アプリケーションサーバ］のタブで［最大並行リクエスト数］欄にゼロ以外の値を設定します。
値がゼロのときは、制限がないことを意味します。
上記設定の他、同時処理化可能なリクエストの数は次の２つの要素で制限されます。
• ライセンス……発行ライセンスのスレッド数を上回る数のスレッドを生成することはできません。
• OS の制限……これは主にリソースの制限が考えられます。

複数のアプリケーションにリクエストを送信する
複数の（異なる）Magic アプリケーションに対するリクエストを扱うには、各アプリケー
ションに対して Magic エンジンを起動する必要があります。
１つの Magic アプリケーションサーバの全てのスレッドは、同じアプリケーションに対してのみ実行可能です。

マルチスレッド環境の管理
ここでは、マルチスレッド環境の監視と管理の方法について以下の内容で説明いたします。
• Magic のスレッドの監視開発者ガイドMagic eDeveloper V9 Plus217

第 18 章 - 実行環境
• アプリケーションサーバの起動と停止

Magic のスレッドの監視
Magic のスレッドを監視する：
1. タスクバーの MRB アイコン上で右クリックしてポップアップメニューを開きます。
（MRB がサービスで起動されている場合は、アイコンが表示されません。この場合の監視処理は、eDeveloper Monitor を使用してください。）
2.「Display Enterprise Servers」を選択します。MRB のモニタウィンドウが表示されます。
１つの行が各 Magic エンジンを表しています。括弧内の数字は左から、「実行中のスレッド数（Current Threads）」、「起動してからの最大同時処理スレッド数（PeakThreads）」、「最大スレッド数（Max Threads）」、「現在のコンテキスト数（Current
Contexts）」、「処理リクエスト数（Requests Served）」を表します。
最大スレッド数はライセンス制限、もしくは最大並行リクエスト数の設定の少な
いほうの数字で、これ以上の数のリクエストを同時処理することはできません。
この場合、リクエストは MRB のリクエストキュー内でサーバ側のスレッドが空くのを待ちます。
eDeveloper Monitor（MGRQMonitor.exe）を実行することで、より詳しい情報を表示することができます。
OS が提供するツールを使用してスレッド数のモニタを行うことも可能です。例えば
Windows NT/2000 では、タスクマネージャーを使用することができます。
（スレッド表示は、オプションです。）外部ツールでモニタできるスレッド数は、リクエストを処理しているスレッド数よりも大きな数字が表示されますが、これは Magic の初期化の際にいく
つかのスレッドを予約するためです。
Magic の RqRtInf 関数を使用してアプリケーションの下記の情報を取得することができます。
•

現在の動作中のスレッド数•

最大スレッド数•

アプリケーションサーバが起動してからの最大の同時処理スレッド数

アプリケーションサーバの起動と停止
Magic アプリケーションサーバを起動する：• Magic の RqExe 関数を使用します。

Magic アプリケーションサーバを停止する：• Magic の RqRtTrm 関数を使用してアプリケーションをシャットダウンすることができます。論理型のパラメータを使用して、サーバを直ちにシャットダウンするか、現在処理中のリクエストの処理完了を待つかを指定できます。

単一コンテキスト環境の設定
ここでは単一コンテキストでの環境設定の方法について、以下の内容で説明いたします。
• ランタイムコンテキスト

218

開発者ガイドMagic eDeveloper V9 Plus

単一コンテキスト環境の設定• Magic.ini と INIPut 関数• スレッドにより共有されるリソース• 外部プログラムの使用方法 （UDF/UDP）• Ctx 関数ランタイムコンテキスト
Magic アプリケーションサーバは、以下のものを管理しています。
• コンテキスト……タスクの起動要求を発行したクライアントの情報• タスクのトランザクション内で操作されたデータ
各ランタイム・コンテキストは独立したメモリ領域を持っています。

Magic.ini と INIPut 関数
各ランタイムコンテキストは、Magic.ini ファイルを独立したメモリ領域に保存しています。特定のコンテキストでの INIPut 関数では、強制書込みのフラグを使用して明示的に指定する場合を除いて、Magic.ini ファイルには書き込まれません。
INIPut （<assignment>,<force write>）（デフォルト ‑ N）
［動作環境］で Magic.ini ファイルを常駐するように設定しているときは、INIPut 関数による変更はメモリ内でのみ行われます。

スレッドにより共有されるリソース
DBMS 接続とプリンタや入出力ファイルなどの外部デバイスは、スレッド間で共有されます。各コンテキスト単位での DBMS 接続はありません。また Magic は可能な限り再使用を行います。プリンタやファイルなどの外部デバイスへのアクセスは、OS により管理されます。

外部プログラムの使用
UDF/UDP といった外部プログラムは、マルチスレッドに対応している必要があります。
これは、複数のスレッドにより同時使用される可能性があるからです。

Ctx 関数下記の関数を使用して、Magic コンテキストマネージャーの照会を行うことができます。
• CtxGetAllName…… 実行可能なコンテキストのリスト• CtxGetID…… コンテキスト ID• CtxNum…… アクティブなコンテキスト数• CtxProg ……コンテキストのトップレベルプログラム数• CtxStat……コンテキスト状態• CtxSize…… コンテキストのメモリーサイズ• CtxLstUse ……前回のコンテキスト起動からの秒数

開発者ガイドMagic eDeveloper V9 Plus219

第 18 章 - 実行環境

［このページは意図的に空白にしています。］

220

開発者ガイドMagic eDeveloper V9 Plus

バッチタスクの作成

19

バッチタスクは通常、ユーザとの対話無しに実行されます。したがって、タスクのロジッ
クは自動的に実行されます。
この章ではバッチタスクのいくつかの使用方法、設定の変更とその結果について説明いたします。

この章では以下のことについて説明いたします。
簡単なバッチプログラムの作成

222 ページ

バッチタスクの実行制御

222 ページ

バッチプログラムのイベントハンドリング

223 ページ

終了しないプログラム

225 ページ

レコード削除プログラム

225 ページ

入出力プログラムの作成

226 ページ

開発者ガイドMagic eDeveloper V9 Plus

221

第 19 章 - バッチタスクの作成

簡単なバッチプログラムの作成
バッチプログラムは、テーブルの更新や帳票作成など、自動で処理を行いたい場合に使用します。バッチプログラムは、ユーザとの対話的無しに実行されます。タスクのロジッ
クは、タスクの各部分のコマンドと特性に定義された式によって制御されます。
バッチタスクの［レコードメイン］レベルには、タスクロジックを記述することはできません。ただし、リンクが実行されるかどうかを決定するリンク条件は記述可能です。
レコードメインは、タスクのデータビューを定義する場所で、データビューの範囲指定
や、登録モードの場合は項目の代入値を定義します。

バッチタスクの実行制御
ここでは、バッチタスクの開始前に確認ダイアログを表示させる方法や、バッチタスクの終了を制御する方法を説明します。
ここでは以下のことについて説明します。
• 実行確認のメッセージボックス• タスク終了条件

実行確認のメッセージボックス
バッチタスクでは、実行開始時にユーザにプロセスの実行を確認するメッセージボック
スを表示させることができます。メッセージボックスは、［タスク制御］の［メニュー使用］の設定により表示させることができます。

タスク開始時にメッセージボックスを表示させる：
1. プログラムリポジトリからズームして［タスク定義］を開きます。
2. ［タスク］メニューから［タスク制御］を選択し、［タスク制御］ダイアログを開きます。
3. ［メニュー使用］の特性を「Yes」設定します。
［メニュー使用］特性を「Yes」に設定し、タスク実行時に確認メッセージが表示されている状態の時、［オプション］メニューにて以下の操作を行うことができます。
• 範囲……レコードの範囲指定（ウィンドウが表示されてる場合のみ有効）• インデックス……インデックスの変更• ソート……レコードのソート• 入出力ファイル……入出力ファイルの切替（入出力ファイルが定義されてる場合のみ有効）
これらの各設定は［タスク制御］ダイアログで無効化することができます。

タスク終了条件
バッチタスクは、以下のいずれかの要因が発生した場合に終了します。
• 指定されたメインテーブルの指定レコードの処理が終了した場合• ［タスク終了条件］が「True」と評価された場合• ユーザが Esc キーを押した場合• タスクの実行を終了させるイベントが発生した場合

222［タスク終了条件］は、［チェック時期］特性の指定内容に基づいて評価されます。

開発者ガイドMagic eDeveloper V9 Plus

バッチプログラムのイベントハンドリング
この設定は、［メインテーブル］が定義されていない場合に必要です。メインテーブルが選択されていないときは、［タスク終了条件］が「True」と評価されるまでタスクは無限ループとして実行されます。

タスクの終了条件を設定する：
1. プログラムリポジトリからズームして、［タスク定義］を開きます。
2. Ctrl+P を押して［タスク特性］ダイアログを開きます。
3. ［タスク終了条件］を「Yes」に設定します。
4. ［チェック時期］に下記のいずれかを設定します。
•

B= 前置 （デフォルト）

•

A= 後置

•

I= 即時

イベント可の設定
バッチタスクは、定義されたロジックを自動的に実行します。通常、ユーザはタスクの処理に干渉することはありません。しかし、以下のようにしてバッチ処理の続行を中断することができます。

ユーザからのイベントを有効にする：
1. プログラムリポジトリからズームして、［タスク定義］を開きます。
2. Ctrl+P を押して［タスク特性］ダイアログを開きます。
3. ［イベント可］欄を「Yes」に設定します。これによって、ユーザが Esc キーを押す
ことで処理を中止させることができます。
［イベント可］の設定が「False」と評価されたときは、内部、システム、ユーザ、タイマー、式イベントのいずれのトリガもスタックから呼び出されず、いずれのイベントハ
ンドラも実行されません。このため、バッチ処理にユーザが干渉できなくなります。

バッチプログラムのイベントハンドリング
バッチタスクのロジックは、タスク前処理、タスク後処理、レコード後処理、および、
各ハンドラに定義することができます。
バッチタスクでは、全てのタイプのイベントをトリガできます。トリガされたイベント
に対するハンドリングの動作は、タスクと環境設定に依存します。
環境設定用のパラメータには、以下のものがあります。
• バッチイベント間隔（［動作環境］ダイアログ）• レコードイベント間隔（［タスク制御］ダイアログ）• イベント可（［タスク特性］ダイアログ）
イベントは、ユーザによる実行や［イベント実行］コマンドによりトリガを発生させることができます。
ここでは以下のことについて説明します。
• イベントトリガの定義• ハンドラの定義

開発者ガイドMagic eDeveloper V9 Plus

223

第 19 章 - バッチタスクの作成

イベントトリガの定義
イベントの定義方法は、オンラインタスクと同じです。

イベントトリガを定義する：
1. ［タスク定義］で、レコード後処理かタスク後処理の下に１行作成して［レベル］
欄には「H= ハンドラ」を定義します。
2. ［イベント］欄でズームして［イベント］ダイアログを開きます。
3. 下記のイベントタイプから１つ選択します。
•

S= システム …… キーボード押下•

I= 内部 …… ［アクション一覧］にある Magic アクション•

U= ユーザ …… ユーザが定義するイベント•

T= タイマー …… タイマー間隔•

E= 式 …… 式の評価によるトリガ•

R= エラー …… データベースから取得したエラー

ハンドラの定義
各ハンドラは、その特性によって以下のような設定が可能です。
• ハンドラの［レベル］を「C= コントロール」に設定• ハンドラの［スコープ］の定義• イベントの［伝播］の定義• ハンドラ処理の［有効］条件の設定
ハンドラには、各種の処理コマンドを組み合わせたロジックを定義することでできます。

下記のいずれかの方法でイベントを発行できます。
• キーボード押下 （Ctrl+Y、F4 など）によって、システムイベントが発行されます。
• ［イベント実行］コマンドによってシステム、内部、ユーザタイプのイベントを発行することができます。
［ウェイト］欄を「Yes」に設定すると処理を同期させることができます。また［イベント実行］コマンドは、ハンドラにパラメータを渡すことが可
能です。

イベント可
［タスク特性］ダイアログで設定します。この設定には「Yes」、「No」または「式」が設定でき、タスク開始時に一度だけ評価されます。
この項目が「No」または「False」と評価されるとき、トリガされたイベントはイベント
キューから渡されることはなく、イベントハンドラは実行されません。

バッチイベント間隔（ミリ秒）［動作環境］ダイアログの［システム］タブで設定します。
この間隔はミリ秒で定義します。イベントキューに蓄えられたトリガは、この時間間隔で渡されます。

224

開発者ガイドMagic eDeveloper V9 Plus

終了しないプログラム

レコードイベント間隔
この設定は、［タスク制御］ダイアログの［オプション］タブで定義します。この間隔はレコード数です。イベントキューに蓄えられたトリガは、ここで設定された数のレコードが処理される毎に渡されます。この設定は、式で数値を指定します。
式はタスク開始時に一度だけ評価されます。
［レコードイベント間隔］と［バッチイベント間隔］の両方に「0」より大きい数が設定されているときは、両方の条件が AND（論理積）で評価されます。

終了しないプログラム
無限ループのバッチタスクを作成したい場合は、以下の設定を行います。
1. ［タスク特性］ダイアログで［メインテーブル］が定義されていないことを確認します。
2. ［タスク終了条件］を「No」にするか、「False」と評価される式を定義します。これによりタスクの実行は終了されません。
3. ［イベント可］を「No」にするか、「False」と評価される式を定義します。これによりユーザがタスクの実行を終了させるトリガの実行を無効にします。

レコード削除プログラム
大量のレコードを自動的に削除できるようにするには、下記のいずれかの方法を用いたバッチプログラムを作成します。
• ［初期モード］を［D= 削除］に設定• ［タスク制御］ダイアログの［レコード削除］欄を「Yes」にするか「True」と評価される式に設定• データベースから大量のレコードを削除するように指示したダイレクトSQL文を使用
削除されるデータビューを定義するには、下記のいずれかの方法を使用します。
• レコードメインの範囲式を使用• ［タスク環境］メニューから［範囲／位置付］ダイアログを開き［範囲式］を使用• ［タスク環境］メニューから［範囲／位置付］ダイアログを開き［SQL Where 句］タ
ブで SQL 文を定義
ここでは以下のことについて説明します。
• 初期モード（D= 削除）• レコード削除（Yes）• 埋め込み SQL 文

初期モード（D = 削除）［タスク特性］ダイアログの［初期モード］を「D= 削除」に指定した場合、タスクは、各レコードごとにレコード後処理を削除モードで１回通過するだけの動作になり、取得されたレコードはデータベースから削除されます。削除されるレコードは、メインテー
ブルから取得されたレコードのみで、リンクテーブルから取得されたレコードは削除されません。

開発者ガイドMagic eDeveloper V9 Plus

225

第 19 章 - バッチタスクの作成

レコード削除（Yes）［タスク制御］ダイアログの［レコード削除］欄に「Yes」、「No」、または「式」が設定できます。この欄は、各レコードが取得され処理される毎に評価されます。条件が「True」のときに削除されるレコードは、メインテーブルから取得されたレコードのみで、リンクテーブルから取得されたレコードは削除されません。
［初期モード］が「D ＝削除」のときとの違いは、各レコード毎に行われる処理です。
［タスク制御］の［レコード削除］欄の設定では、各レコードに対してレコードループが２回実行されます。最初のループは修正モードで実行され、２回目のループで実際に削除処理が実行されます。
［初期モード］が「D ＝削除」の方が処理速度は高速ですが、範囲を指定して大量のレ
コード削除を実行するような場合は、インデックスを有効に利用してください。
大量のレコードに対し、削除以外の処理を行い、その後にそれらのレコードを削除した
いような場合、［タスク制御］の［レコード削除］欄を「Yes」に設定してください。
この特性は、オンラインタスクでも定義できます。

埋め込み SQL 文SQL タスクとして、タスク内に SQL 文を埋め込んで実行させることができます。
埋め込み SQL 文は、使用しているデータベースの仕様に沿ったものである必要があります。書式はデータベースの種類によって異なっている場合があります。
SQL 文に WHERE 句を指定することにより、削除するレコードの範囲を指定することができます。WHERE 句の定義がインデックスによって指定できるかどうかはデータ−ベースに依存します。

入出力プログラムの作成
入出力プログラムを使用することで、テキストファイルのデータをアプリケーションのテーブルに入力したり、テーブルのレコードをテキストファイルに出力することができます。

入出力プログラムを作成する：
1. テーブルリポジトリで入出力プログラムを作成するテーブルを選択します。
2. ［オプション］メニューから［APG］を選択するか、Ctrl+G を押します。
3. ［処理モード］には［G= 作成］を選択します。
4. ［オプション］の項目には作成するプログラムに応じて「I= 入力」または「E= 出力」を選択します。
• 「E= 出力」を選択すると、テーブル中のデータをテキストファイルに出力するプ
ログラムが作成されます。
• 「I= 入力」を選択すると、テキストファイル中のデータが DB テーブルへ読み込
まれるプログラムが作成されます。

226

開発者ガイドMagic eDeveloper V9 Plus

入出力プログラムの作成
5. ［選択カラム数］欄でズームして、入出力プログラムに必要な項目を選択します。
選択された項目だけが処理に使用されます。デフォルトでは全ての項目が選択されます。
6. ［プログラム名］欄には、プログラムリポジトリに作成される「プログラム名」を入力します。
7. ［テキストファイル］欄には、入出力に使用する「テキストファイル名」を入力します。この項目からズームして選択することもできます。この項目には論理名を使用することも可能です。

開発者ガイドMagic eDeveloper V9 Plus

227

第 19 章 - バッチタスクの作成［このページは意図的に空白にしています。］

228

開発者ガイドMagic eDeveloper V9 Plus

J2EE との連携

20

Magic は、J2EE と連携するための２つの機能を提供します。
• EJB サーバ機能……J2EE アプリケーションから、Magic アプリケーションをEnterprise Java Beans(EJBs) として呼び出す機能を提供します。Java 環境下で動作している Java クライアントは、Magic のプログラムを EJB のメソッドと同様に実行することができます。実行は EJB と Magic を連携するための EJB（以下、Proxy EJB と表記します。）を介して行われます。EJB インタフェースビルダ（以下、EIB と略します。）
は、Proxy EJB を生成する機能を提供します。
• EJB クライアント（コール EJB）機能……Magic アプリケーションから、EJB を呼び出す機能を提供します。

この章では以下の手順について説明いたします。
J2EE サーバーのインストール

230 ページ

EJB サーバサポートの有効化

233 ページ

Proxy EJB の作成

233 ページ

Proxy EJB の実行

234 ページ

Magic から EJB を呼び出す

244 ページ

Java コンポーネントジェネレータによるプログラムの作
成

249 ページ

Java クラスへのアクセス方法

251 ページ

付録

260 ページ。
J2EE との連係機能は、日本語版では Interstage Application Server Plus DeveloperV5.0(V5.0L20) および、V6.0（V6.0L10）でのみ確認しています。その他の J2EE サー
バはサポート対象外ですInterstage は、富士通株式会社の登録商標です。
WebSphere は、IBM Corporation の登録商標です。
WebLogic は、BEA Systems, Inc. の登録商標です。
JBoss は、Marc Fleury 氏の所有する登録商標です。
Sun One および Java は、Sun Microsystems, Inc の所有する登録商標です。

開発者ガイドMagic eDeveloper V9 Plus229

第 20 章 - J2EE との連携

J2EE サーバーのインストール
ここでは下記の J2EE サーバーのインストール方法について説明いたします。
• Interstage Application Server （以下 Interstage と略します。）• WebSphere Application Server （以下 WebSphere または WAS と略します。）• WebLogic Server 6 （以下 WebLogic 6 と略します。）• WebLogic Server 5.1（以下 WebLogic 5.1 と略します。）• Sun J2SDK EE (Java2 Software Development Kit Enterprise Edition)• JBoss• Sun One Application Server 7（以下 Sun One と略します。）

Interstage
1. Interstage をインストール（サーバ簡易インストール）します。これによって、J2EE、CORBA、JMS、SOAP、JBK などがすべてインストールされます。
（例：c:¥interstage、
C:¥APW¥JBK3¥jdk）
2. 以下の環境変数が、インストールによって設定されます。
•

IS_HOME=c:¥interstage（インストール時の設定による）•

JAVA_HOME=C:¥APW¥JBK3¥jdk（インストール時の設定による。Java SDK のイ
ンストールディレクトリでも可）•

IS_J2EEAPF=%IS̲HOME%¥J2EE¥var¥deployment（Interstage の実行用ディレクト
リ）•

CLASSPATH=CLASSPATH=C:¥Interstage¥J2EE¥lib¥isj2ee.jar;C:¥APW¥JBK3¥clas
ses;C:¥APW¥classes¥apworks13.jar;C:¥Program
Files¥Common
Files¥FujitsuXML¥xmlpro.jar;C:¥Program
Files¥Common Files¥FujitsuXML¥xmltransx.jar;C:¥Program
Files¥Common Files¥FujitsuXML¥xmltrans.jar;C:¥Interstage¥ODWIN¥etc¥class¥ODjava2.jar;C:¥Interstage¥eswin¥lib¥esnotifyjava2.jar;
C:¥Interstage¥jms¥lib¥fjmsprovider.jar;C:¥Interstage¥F3FMsoap¥lib¥issoap.jar;C:¥Interstage¥F3FMsoap¥lib¥issoapsec.jar;C:¥INTERS 1¥F3FMUD 1¥lib¥fjuddi4j.jar;C:¥INTERS 1¥F3FMUD 1¥lib¥isplugin.jar;

CLASSPATH の設定にスペースが入ると Intertsgae コマンドが正しく動作しない場合があります。スペースが入らないように編集してください。
（例）• × C:¥Program Files¥Common Files¥FujitsuXML¥• ○ C:¥Progra 1¥Common 1¥FujitsuXML¥
3. 環境変数を設定します。
•

MG_J2EE_HOME……%IS̲HOME%•

CLASSPATH……（次のパスを追加します）%JAVA̲HOME%¥jre¥lib¥ext¥mgejbgnrc.jar

4. ORB の指定
クライアントアプリケーションを実行するための環境設定として、使用する ORBを選択します。
環境設定方法は、プロパティ情報を記述したテキストファイル（ファイル名：
orb.properties）を作成し、以下のディレクトリに格納してください。

230•

JDK を使用している場合 ： %JAVA̲HOME%¥jre¥lib

開発者ガイドMagic eDeveloper V9 Plus

J2EE サーバーのインストール•

JRE を使用している場合 ： %JAVA̲HOME%¥lib［orb.properties の内容］
org.omg.CORBA.ORBClass=com.fujitsu.ObjectDirector.CORBA.ORB
org.omg.CORBA.ORBSingletonClass=com.fujitsu.ObjectDirector.CORBA.SingletonORB
javax.rmi.CORBA.StubClass=com.fujitsu.ObjectDirector.rmi.CORBA.StubDelegateImpl
javax.rmi.CORBA.UtilClass=com.fujitsu.ObjectDirector.rmi.CORBA.UtilDelegateImpl
javax.rmi.CORBA.PortableRemoteObjectClass=com.fujitsu.ObjectDirector.rmi.CORBA.Po
rtableRemoteObjectDelegateImpl

WebSphere
1. WebSphere をインストールします。例：c:¥was¥appserver
2. 環境変数を設定します。
•

WAS_HOME……c:¥was¥appserver（インストール時の設定による）•

JAVA_HOME……%WAS̲HOME%¥java•

MG_JAVA_HOME……%MG̲J2EE̲HOME%¥Java•

J2EE_HOME……%WAS̲HOME%•

MG_J2EE_HOME……c:¥was¥appserver•

PATH……（次のパスを追加します）%JAVA̲HOME%¥bin;J2EE̲HOME%¥bin

WebLogic 6
1. WebLogic 6 をインストールします。例：c:¥bea
2. 環境変数を設定します。
•

WL_HOME……c:¥bea（インストール時の設定による）•

MG_JAVA_HOME……c:¥bea¥jdk131•

J2EE_HOME……%WL̲HOME%•

MG_J2EE_HOME……c:¥bea¥wlserver6.1•

PATH……（次のパスを追加します）%JAVA̲HOME%¥bin;%WL̲HOME%¥bin;•

MG_CLASSPATH……（次のパスを追加します）%JAVA̲HOME%¥jre¥lib¥ext¥mgejbgnrc.jar;%MG̲J2EE̲HOME%¥lib¥weblogic.jar

WebLogic 5.1
1. Java2 SDKVer1.3.0 以上を Sun Microsystems のサイトなどからダウンロードし、インストールします。（例 c:¥jdk1.3）
2. WebLogic 5.1 をインストールします。（例 c:¥weblogic）
3. 環境変数を設定します。
（c:¥weblogic¥SetEnv.cmd を実行することでこの設定になります）•

MG_JAVA_HOME……c:¥jdk1.3（インストール時の設定による）•

WL_HOME……c:¥weblogic（インストール時の設定による）•

MG_J2EE_HOME……%WL̲HOME%•

PATH……（次のパスを追加します）%WL̲HOME%¥bin;%JAVA̲HOME%¥bin•

JDK_CLASSES……

開発者ガイドMagic eDeveloper V9 Plus

231

第 20 章 - J2EE との連携
%JAVA̲HOME%¥lib¥tools.jar;%JAVA̲HOME%¥jre¥lib¥rt.jar•

MG_CLASSPATH……（次のパスを追加します）%MG̲JAVA̲HOME%¥jre¥lib¥ext¥mgejbgnrc.jar;%MG̲J2EE̲HOME%¥lib¥weblogicau
x.jar

Sun J2SDK EE
1. Java SDK Ver1.3.0 以上をダウンロードし、インストールします。
（例 c:¥jdk1.3）
2. J2SDKEE Ver1.2.1 以上を Sun Microsystems のサイトなどからダウンロードし、インストールします。
（例 c:¥j2sdkee1.3）
3. 環境変数を設定します•

JAVA_HOME……c:¥jdk1.3•

J2EE_HOME……c:¥j2sdkee1.3•

PATH……（次のパスを追加します）%JAVA̲HOME%¥bin;%J2EE̲HOME%¥bin;

JBoss
1. Java SDK Ver1.3.0 以上をダウンロードし、インストールします。
（例 c:¥jdk1.3）
2. JBoss 2.4.4 以上を JBoss Group のサイトからダウンロードし、インストールします。
（例 c:¥jboss‑2.4.4）
3. 環境変数を設定します•

J2EE_HOME……c:¥JBoss‑2.4.4•

MG_J2EE_HOME……%J2EE̲HOME%•

JAVA_HOME……c:¥jdk1.3•

MG_JAVA_HOME……%JAVA̲HOME%•

CLASS_PATH……（次のパスを追加します）
JBOSS2 の場合：
%JAVA̲HOME%¥jre¥lib¥ext¥mgejbgnrc.jar;%MG̲J2EE̲HOME%¥lib¥ext¥jboss‑
j2ee.jar
JBOSS3 の場合：
%JAVA̲HOME%¥jre¥lib¥ext¥mgejbgnrc.jar;%MG̲J2EE̲HOME%¥server¥default¥lib¥ext¥jboss‑j2ee.jar•

PATH……（次のパスを追加します）%JAVA̲HOME%¥bin;

4. %J2EE̲HOME%¥lib¥ext に Magic のインストールディレクトリ内にある mgejbgnrc.jar
ファイルをコピーしてください。（このファイルがないと Deploy できません。）•%JAVA_HOME%\bin;%J2EE_HOME%\bin;

Sun One
1. Java2 SDK Ver1.4.0 以上をダウンロードし、インストールします。
（例 c:¥j2dk1.4）
注：Sune One ApplicationServer には、Java の SDK も含まれていますが、ここのJRE を利用すると Magic が正常に動作しない場合があるため別途 SDK をインストー

232

開発者ガイドMagic eDeveloper V9 PlusEJB サーバサポートの有効化
ルしてください。
2. Sun One をインストールします。
（例 c:¥Sun¥AppServer7）
3. 環境変数を設定します•

J2EE_HOME……c:¥Sun¥AppServer7•

MG_J2EE_HOME……%J2EE̲HOME%•

JAVA_HOME……%J2EE̲HOME%¥JDK•

MG_JAVA_HOME……%JAVA̲HOME%•

CLASSPATH……（次のパスを追加します）%J2EE̲HOME%¥lib¥appserv‑ext.jar•

MG_CLASSPATH……%J2EE̲HOME%¥lib¥appserv‑ext.jar•

PATH……（次のパスを追加します）%JAVA̲HOME%¥bin;%J2EE̲HOME%¥bin;

Magic eDeveloper または Magic Application Server のインストール時に J2EE モジュールを選択すると、mgejbgnrc.jar ファイルを %JAVA̲HOME%¥jre¥lib¥ext にコピーします。コピー
されなかった場合は、EIB のビルド処理が失敗します。このような場合、Magic のインス
トールディレクトリ内にある mgejbgnrc.jar ファイルを手動でコピーしてください。

EJB サーバサポートの有効化
Magic と EJB サーバとの連携を有効にするには以下のようにします。
1. Magicインターネットリクエスタ用ディレクトリにあるMgreq.iniファイルを編集し、［REQUESTER_ENV］セクションに Gateway = 5 というパラメータを追加します。
2. Magic の［動作環境］ダイアログの［アプリケーションサーバーとして動作］を「Yes」に設定し、フォアグラウンドモードで起動します。
3. 上記の設定によって EJB サーバとの連携が可能になります。
バックグラウンドモードで Magic を起動する場合は、Gateway=1（MRB）の設定のみでEJB サーバからのリクエストが有効になります。
また、以下のパラメータを有効にすることで、J2EE 用と Magic リクエスタ用に動作ライ
センスを配分できます。
［MAGIC_MESSAGING_GATEWAYS］
MGSRVR05=,,,,MaxThreads=20%
この例では、ライセンスの 20% は、J2EE 用になり、残りの 80% が内部のメッセージ用に利用できます。アプリケーションサーバが 5 スレッドのライセンスを使用している場
合、1 スレッド分は J2EE 用に、4 スレッドが Magic のリクエスト処理用としてリクエス
トを受け付けることができるようになります。

Proxy EJB の作成
EIB を使用して Proxy EJB を作成することができます。以下にその手順を示します。
1. アプリケーションの［コンポーネント］メニューから［EJB インタフェース］を選択します。
2. コンポーネントの名前を入力します。
3. ［プログラム］カラムにカーソルを移動し、［追加］ボタンをクリックし、EJB メ
ソッドとして使用するプログラムを選択します。

開発者ガイドMagic eDeveloper V9 Plus

233

第 20 章 - J2EE との連携
4. ［パラメータ／戻り値］カラムからズームして、パラメータと戻り値を EJB 内で定義される Java タイプに変更します。
5. ［オプション］メニューから［設定］を選択し使用する J2EE サーバを選択します。
6. ［オプション］メニューから［JAR ファイル作成］を選択し Proxy EJB を作成します。
［プログラム一覧］では、バッチプログラムしか選択できません。

Proxy EJB の実行
EIB は EJB 用の JAR ファイルを作成します。このファイルは Magic のインストールフォ
ルダの下の Components¥EJB フォルダに J2EE サーバ毎に作成されます。
EIB は、テスト用に <BeanName>_test_app.ear というファイル名のテストアプリケーショ
ンを生成します。このアプリケーションは作成されたProxyEJB を含んでいます。EJBサー
バ機能のテスト用として実行したり修正したりすることができます。
以下は Magic で作成した Proxy EJB を実行するための手順です。
1. J2EE サーバーの為の URL リソースを設定します。
2. J2EE サーバーを起動します。
3. Deployment Tool を起動します。
4. Proxy EJB を実行します。
5. テストアプリケーションを実行して EJB 連係を確認
1. Magic アプリケーションサーバを起動します。
2. テストアプリケーションを実行します。
各トピックについて、下記の J2EE サーバーのタイプ別に分けて説明いたします。
•

Interstage•

WebSphere•

WebLogic 6•

WebLogic 5.1•

Sun J2SDK EE

•

JBoss

•

Sun One

J2EE サーバーの為の URL リソースの設定
Interstage<Magic Dir>¥Components¥EJB¥<Bean̲name>¥Interstage に作成された jndi.properties というファイルを、%JAVA̲HOME%¥jre¥lib にコピーします。

WebSphere
1. 管理コンソールを起動します。
Windows の［スタート］メニューの［IBM WebSphere］を選択し、［Application Server
Vxx］から［管理コンソール］を選択します。

234

2. 左側のフレームで以下の順番で選択します。

開発者ガイドMagic eDeveloper V9 Plus

Proxy EJB の実行•

WAS4.0 の場合•

1. WebSphere Administrative Domain
2. リソース
3. URL プロバイダ
4. Default URL Provider
5. URL
WAS5.0 の場合

1. リソース
2. URL プロバイダ
3. 右側のフレームから［Default URL Provider］をクリックします。
4. ［追加プロパティ］の［URL］をクリックします。
5. 右側のフレームで［新規作成］ボタンをクリックして、下記のデータを入力します。
•

名前……MagicURL•

JNDI 名……url/MagicURL•

説明……任意•スペック……http://localhost:1500

6. ［OK］をクリックします。
7. ［保管］をクリックし、［保管］のチェックボックスをオンにして、［OK］をクリッ
クします。

WebLogic 6
1. %WL̲HOME%¥config¥mydomain¥config.xml を開き、URL リソースを（１つまたは複数）追加します。
2. 例 :<WebServerURLResource="url.MagicURL=http://localhost:1500url.MagicURL2=http://
localhost:1501 DefaultWebApp = "DefaultWebApp̲myserver"
LogFileName = "./config/mydomain/logs/access.log"LoggingEnabled="true"
Name="myserver"/>

WebLogic 5.1
1. %WL̲HOME%¥weblogic.properties を開き、URL リソースを追加します。
例 :weblogic.httpd.URLResource.url.MagicURL = http://localhost:1500

Sun J2SDK EE
URL リソースを設定する必要はありません。

JBoss<Magic Dir>¥Components¥EJB¥<Bean̲name>¥JBoss に作成された jndi.properties とい う
ファイルを、%JAVA̲HOME%¥jre¥lib にコピーします。

Sun One
URL リソースを設定する必要はありません。

開発者ガイドMagic eDeveloper V9 Plus235

第 20 章 - J2EE との連携

J2EE サーバーの起動
Interstage
DOS プロンプトより以下のコマンドを実行します。
isstartWebSphere［スタート］→［プログラム］→［IBM WebSphere］→［Application Server Vxx］→［サーバの始動］

WebLogic 6［スタート］→［プログラム］→［BEA WebLogic］→［WebLogic Server 6.0］→［Start Default
Server］

WebLogic 5.1
DOS プロンプトより以下のコマンドを実行します。
cd %WL̲HOME%
SetEnv.cmd
StartWebLogic.cmd

Sun J2SDK EE• Ver1.3
DOS プロンプトより以下のコマンドを実行します。
j2ee ‑verbose• Ver1.4［スタート］→［プログラム］→［Sun Microsystems］→［J2EE 1.4 SDK］→［Start Default
Server］

JBoss
1. DOS プロンプトより以下のコマンドを実行します。
CD %J2EE̲HOME%¥binrun.batSun One［スタート］→［プログラム］→［Sun ONE Application Server 7］→［Start Application
Server］

Deployment Tool の起動
Interstage
1. ［スタート］→［プログラム］→［INTERSTAGE］→［J2EE］→［J2EE Deployment ツール］

236

開発者ガイドMagic eDeveloper V9 Plus

Proxy EJB の実行（deploy.bat を使用するため、実際は使用する必要はありません。）

WebSphere
1. ［スタート］→［プログラム］→［IBM WebSphere］→［Application Server Vxx］→［アプリケーション・アセンブリー・ツール］

WebLogic 6
1. ［スタート］→［プログラム］→ ［BEA WebLogic］→ ［WebLogic Server 6.0］→［Start Default Console］
2. 左側のパネルで :［mydomain］→ ［Deployments］→ ［EJB］

WebLogic 5.1［スタート］→［プログラム］→ ［WebLogic 5.1.0］→ ［Ejb Deployer］

Sun J2SDK EEDOS プロンプトより以下のコマンドを実行します。
Deploytool

JBoss（Deployment Tool はありません。）

Sun One［スタート］→［プログラム］→［Sun ONE Application Server 7］→［Start Admin Console］

Proxy EJB の実行
J2EE サーバーでテストアプリケーションを実行する場合は、テストアプリケーションを実行可能な状態にする必要があります。

Interstage<Magic Dir>¥Components¥EJB¥<Bean̲name>¥Interstage に作成された deploy.bat を実行してください。必要に応じて、このバッチファイルを修正して実行します。
このスクリプトは、以下の処理を行います。
1. FJebeProperties.xml (EJB Deployment Descriptor) を %IS̲HOME%¥EJB¥etc にコピーします。
FJebeProperties.xml ファイルは、JMS や URL、JDBC のような EJB によって使用されるリソースを定義するものです。Magic が作成する EJB は、このファイルを使用
して Magic と接続します。
%IS̲HOME%¥EJB¥etc にすでにこのファイルある場合、追加コピーされます。その場
合は、<MagicDir>¥Components ¥EJB ¥<Bean̲name>¥Interstage に作成されている
FJebeProperties.xml ファイル の内容を修正します。
•

修正前

開発者ガイドMagic eDeveloper V9 Plus237

第 20 章 - J2EE との連携<?xml version="1.0" encoding="UTF‑8"?><!DOCTYPE fujitsu‑ebe‑definition SYSTEM 'fujitsu‑ebe‑
definition.dtd'><fujitsu‑ebe‑definition><ejb><group‑name>Petstore</group‑name><jndi‑name>TheAccount</jndi‑name><res‑entry><res‑ref‑name>jdbc/EstoreDataSource</res‑ref‑name><datasource‑name>PetStoreDataSource</datasource‑name></res‑entry></ejb></fujitsu‑ebe‑definition><?xml version="1.0" encoding="UTF‑8"?><!DOCTYPE fujitsu‑ebe‑definition SYSTEM 'fujitsu‑ebe‑
definition.dtd'><fujitsu‑ebe‑definition><ejb><group‑name>MagicBean</group‑name><jndi‑name>EjbSample</jndi‑name><res‑entry><res‑ref‑name>url/MagicURL</res‑ref‑name><datasource‑name>http://localhost:1500</datasource‑name></res‑entry></ejb></fujitsu‑ebe‑definition>•

修正後<?xml version="1.0" encoding="UTF‑8"?><!DOCTYPE fujitsu‑ebe‑definition SYSTEM 'fujitsu‑ebe‑
definition.dtd'><fujitsu‑ebe‑definition><ejb><group‑name>Petstore</group‑name><jndi‑name>TheAccount</jndi‑name><res‑entry><res‑ref‑name>jdbc/EstoreDataSource</res‑ref‑name><datasource‑name>PetStoreDataSource</datasource‑name></res‑entry></ejb><ejb><group‑name>MagicBean</group‑name><jndi‑name>EjbSample</jndi‑name><res‑entry><res‑ref‑name>url/MagicURL</res‑ref‑name><datasource‑name>http://localhost:1500</datasource‑name></res‑entry></ejb></fujitsu‑ebe‑definition>

2. Client<Bean_name>Properties.xml （J2EE クライアント名変換ファイル）を%IS̲HOME%¥J2EE¥etc にコピーします。
3. isdeployb コマンドを使用して EJB をデプロイします。実行中の EJB を置き換える必要がなければ、EJB 毎にデプロイされます。
実行中の EJB を置き換える必要がある場合、以下のようにコマンドを実行します。
lsdeployb ‑replace ‑e NONSERVER <Bean_name>
4. EJB を開始します。起動方法はバージョンによって異なります。
•

238

Interstage V5.0 の場合
ejbstarteb コマンドを使用して EJB を開始します。

開発者ガイドMagic eDeveloper V9 Plus

Proxy EJB の実行
ejbstarteb <Bean_name>•Interstage V6.0 の場合
管理コンソールで起動します。

Interstage サーバを再起動する場合は、各 EJB 毎にこのコマンドを実行して EJB を開始し直す必要があります。
デプロイ中にエラーが発生した場合は、コマンドプロンプトの出力と Interstage イベント
ログ (%IS̲HOME%¥EJB¥var¥FJEJBconsole) を確認してください。

WebSphere
アプリケーション・アセンブリーツール（AAT）上で以下の処理を行います。
1. ［既存］タブをクリックし、［参照］ボタンをクリックして下記のファイルを開きます。
<Magic Dir>¥Components¥ejb¥<Bean̲Name>¥Websphere¥<Bean̲Name>̲test̲app.ear
2. ［ファイル］メニューから［デプロイメント用のコードを生成］をクリックします。
3. 以下のように［デプロイされたモジュールのロケーション］を指定します。
<Magic Dir>¥Components¥¥ejb¥<Bean̲Name>¥Websphere¥Deployed̲<Bean̲Name>̲test̲app.ear
4. ［すぐに作成］ボタンをクリックします。
管理コンソールから以下の設定を行いアプリケーションをインストールします。
1. 左側のフレームより以下のように選択します。
WAS4.0 の場合：
［WebSphere Administrative Domain］→ ［ノード］→ < サーバ名 > → ［エンタープラ
イズ・アプリケーション］
WAS5.0 の場合：
［アプリケーション］→［エンタープライズアプリケーション］
2. ［インストール］ボタンをクリックし、［ローカルパス］欄の［参照］ボタンをクリックして ATT によって作成されたファイルを選択します。

<Magic Dir>¥Components¥¥ejb¥<Bean̲Name>¥Websphere¥Deployed̲<Bean̲Name>̲test̲app.ear
3. WAS4.0 の場合は、［次へ］を 3 回クリックします。WAS5.0 の場合は、［次へ］を 7回クリックします。
4. ［終了］をクリックします。
5. ［保管］リンクをクリックして構成ファイルの変更内容を保存します。
6. ［エンタープライズアプリケーション］にインストールした Bean 名が追加されたことを確認してください。また、状態表示を示すアイコンが実行状態になっていることを確認してください。
7. WAS4.0 の場合、
［アプリケーションサーバー］の［Default Server］を開き、［モジュー
ルの可視性］は、「Application」になることを確認します。
8. WebSphere を再起動します。
WAS にインストールされたアプリケーションは、%WAS̲HOME%¥installedApps¥< アプ
リケーション名 >.ear に展開されます。ソースを確認したい場合は、この下のファイ
ルを確認してください。

開発者ガイドMagic eDeveloper V9 Plus239

第 20 章 - J2EE との連携

WebLogic 6
デフォルトコンソールでインストールする新しい EJB を選択します。
1. 新しい EJB をインストールするには、次のように選択します。

<Magic Dir>¥Components¥ejb¥<bean name>¥sun¥<bean̲name>.jar
2. ［Upload］をクリックします。

WebLogic 5.1<Magic Dir>¥Components¥ejb¥<bean̲name>¥weblogic のディレクトリから次の作業を行います。
1. 開発サイトから、各 EJB に対して WLrebuild5.cmd を一度実行します。
2. Ejb Deployer から以下のように選択します。
File → Open → (<bean name>_deployable.jar)、Tools → Deploy
3. サーバーを有効にします。
Servers → Add

Sun J2SDK EE
Deploy Tool から以下の処理を実行します。
1. ［File］メニューから［Open］を選択します。
2. ［Open Object］ダイアログから以下のファイルを選択して［Open Object］をクリックします。（Ver1.4 の場合、［Open Module］です。）<Magic Dir>¥Components¥ejb¥<bean name>¥sun¥<bean̲name>̲test̲app.ear
3. 正常に読み込まれた場合、ツリー表示の Files¥Application の下にされます。この Bean 名にカーソルを置きます。

Bean 名が追加

4. ［Tool］メニューから［Deploy］を選択します。
［Deploy］ダイアログの、［Return
Client Jar］ボックス を有効にします。
（ファイル名やパス名を変更しないでください。）
5. ［Next］をクリックします。（Ver1.4 の場合、［OK］をクリックすると Deploy 処理が実行され、#6 は表示されません。）
6. ［JNDI Name］ダイアログで［Next］をクリックします。
7. ［Review］ダイアログで［Finish］をクリックします。Deploysy 処理が実行されます。正常に終了した場合［OK］をクリックしてダイアログを閉じます。

JBoss• JBoss2 の場合<Magic Dir>¥Components¥EJB¥<Bean̲name>¥JBoss に作成された deploy.bat を実行します。これにより、<Magic Dir>¥Components¥EJB¥<Bean̲name>¥
JBoss に作成された <EJB 名 >.jar というファイルが、%MG̲J2EE̲HOME%¥Deploy にコピーされます。
• JBoss3 の場合

240<Magic Dir>¥Components¥EJB¥<Bean̲name>¥JBoss に作成された <EJB 名 >.jar というファイルを、%J2EE̲HOME%¥Server¥Default¥Deploy にコピーします。

開発者ガイドMagic eDeveloper V9 Plus

Proxy EJB の実行

Sun One
管理コンソールからから以下の処理を実行します。
1. 左側のフレームから以下を選択します。
［アプリケーションサーバインスタンス］→［サーバ名］→［アプリケーション］→［EJB モジュール］
2. ［配備］をクリックします。
3. ［ファイルパス］欄に EIB で作成された <Magic Dir>¥Components¥
EJB¥<Bean̲name>¥SunOne に作成された <EJB 名 >.jar というファイルを指定します。
4. ［了解］をクリックします。
5. 確認画面が表示されたら［OK］をクリックします。

テストアプリケーションを実行して EJB 連携を確認
Magic のアプリケーションサーバエンジンが実行されていることを確認してください。
以下の .bat ファイルを実行することで、ここまでに作成した client JAR が起動されます。
Interstage<Magic Dir>¥Components¥ejb¥<bean̲name>¥interstage¥ClientTest.bat

WebSphere 4.0<Magic Dir>¥Components¥ejb¥<bean̲name>¥websphere¥ClientTest.bat

WebSphere 5.0<Magic Dir>¥Components¥ejb¥<bean̲name>¥websphere¥ClientTest5.bat

WebLogic 6<Magic Dir>¥Components¥ejb¥<bean̲name>¥weblogic¥ClientTest6.bat

WebLogic 5.1<Magic Dir>¥Components¥ejb¥<bean̲name>¥weblogic¥ClientTest5.bat

Sun J2SDK
EE1.3<Magic Dir>¥Components¥ejb¥<bean̲name>¥sun¥ClientTest.bat

JBoss2<Magic Dir>¥Components¥ejb¥<bean̲name>¥JBoss¥ClientTest.bat ※２

Sun One<Magic Dir>¥Components¥ejb¥<bean̲name>¥Sun One¥ClientTest.bat※1

テストに失敗するようであれば、コマンドに JVM へのパラメ−タを追加する必要があります。
（Interstage の JVM パラメータについては、246 ページの JVM_ARGS の説明を参照
してください。）※１：J2DKEE 1.4 の場合、以下のコマンドを実行してください。
appclient -client <Bean Name>_test_appClient.jar<Bean Name>_test_appClient.jar は、DeployTool によって作成された Jar ファイルです。
※２：JBoss3 の場合、ClientTest.bat を以下の赤字のように変更してください。
......
:forj2eehome@if "%J2EE̲HOME%"=="" goto noj2eehome@set CLIENTTEST̲J2EE̲HOME=%J2EE̲HOME%¥Client@goto executeclient:noj2eehome@set CLIENTTEST̲J2EE̲HOME=%MG̲J2EE̲HOME%¥Client@goto executeclient:executeclient
set PATH=%J2EE̲HOME%¥bin;%CLIENTTEST̲JAVA̲HOME%¥bin;%PATH%
set CPATH=.;%J2EE̲HOME%¥server¥default¥lib¥jboss.jar;%CLIENTTEST̲J2EE̲HOME%¥jboss‑j2ee.jar;%CLIENTTEST̲J2EE̲HOME%¥jnp‑
client.jar;%J2EE̲HOME%¥server¥default¥lib¥mgejbgnrc.jar;MagicClient.jar
set CPATH=%CPATH%;%CLIENTTEST̲J2EE̲HOME%¥jboss‑transaction‑client.jar

開発者ガイドMagic eDeveloper V9 Plus

241

第 20 章 - J2EE との連携
%CLIENTTEST̲JAVA̲HOME%¥bin¥java ‑classpath "%CPATH%" MagicClient@endlocal

J2EE サーバーの停止
Interstage
DOS プロンプトより以下のコマンドを実行します
isstop (isstop -f で強制終了 )WebSphere［スタート］→［プログラム］→［IBM WebSphere］→［Application Server Vxx］→［Application
Server の停止］

WebLogic 6
1. WebLogic Server 6.0 → StartDefaultConsole
2. 左側の Administration Console のドメインツリーからサーバーを選択します。
3. Monitoring General tab のページから Shutdown this server のリンクをクリックします。

WebLogic 5.1
Windows のサービスから停止します。

Sun J2SDK EE• Ver1.3
DOS プロンプトより以下のコマンドを実行します。
J2ee -stop• Ver1.4［スタート］→［プログラム］→［Sun Microsystems］→［J2EE 1.4 SDK］→［Stop Default
Server］

JBoss
DOS プロンプトより以下のコマンドを実行します
CD %J2EE_HOME%\bin
shutdown.bat

Sun One［スタート］→［プログラム］→［Sun Microsystems］→［Sun ONE Application Server 7］→［Stop Application Server］

242

開発者ガイドMagic eDeveloper V9 Plus

Proxy EJB の実行

Magic アプリケーションサーバーの高度な設定
複数の Magic アプリケーションサーバーを使用する：
EJB が MagicAppservers = mgurl1,mgurl2, のように複数のアプリケーションサーバーを使用する設定の場合は、下記のように設定してください。
1. 全てのアプリケーションサーバーが同じ Magic.ini を使用している場合、［MAGIC_COMMS］セクションの［TCP/IP］で連続した範囲を設定します。
（例 :1500-1501）
2. それ以外の場合は、それぞれ別の Magic.ini ファイルの［MAGIC_COMMS］セクションの［TCP/IP］でアプリイケーション毎に異なる１つのポートを指定してください。（例 : 1500）

Interstage
1. deploy.bat を実行する前に以下の修正を行ないます。
（これは２つの Magic アプリケー
ションサーバーを使用する場合の例です。）
ejb¥<bean̲name>¥Interstage¥<bean̲name>.jar の中の、ejb-jar.xml を編集します。
•

修正前<description>Magic Application Servers</description><env‑entry‑name>MagicAppservers</env‑entry‑name><env‑entry‑type>java.lang.String</env‑entry‑type><env‑entry‑value>MagicURL</env‑entry‑value>•

修正後<description>Magic Application Servers</descriptin><env‑entry‑name>MagicAppservers</env‑entry‑name><env‑entry‑type>java.lang.String</env‑entry‑type><env‑entry‑value>MagicURL1,MagicURL2</env‑entry‑value>•

修正前<resource‑ref id="ResourceRef̲1"><res‑ref‑name>url/MagicURL</res‑ref‑name><res‑type>java.net.URL</res‑type><res‑auth>Container</res‑auth></resource‑ref>•

修正後<resource‑ref id="ResourceRef̲1"><res‑ref‑name>url/MagicURL1</res‑ref‑name><res‑type>java.net.URL</res‑type><res‑auth>Container</res‑auth></resource‑ref><resource‑ref id="ResourceRef̲2"><res‑ref‑name>url/MagicURL2</res‑ref‑name><res‑type>java.net.URL</res‑type><res‑auth>Container</res‑auth></resource‑ref>2. ejb¥<bean̲name>¥Interstage¥FJebeProperties.xml を編集します。
•

修正前<res‑entry><res‑ref‑name>url/MagicURL</res‑ref‑name><datasource‑name>http://localhost:1500</datasource‑name></res‑entry>•

修正後<res‑entry><res‑ref‑name>url/MagicURL1</res‑ref‑name>

開発者ガイドMagic eDeveloper V9 Plus

243

第 20 章 - J2EE との連携
<datasource‑name>http://localhost:1501</datasource‑name></res‑entry><res‑entry><res‑ref‑name>url/MagicURL2</res‑ref‑name><datasource‑name>http://localhost:1502</datasource‑name></res‑entry>

3. Magic.ini の［MAGIC_COMMS］セクションの［TCP/IP］で連続した範囲を設定します。（1501-1502）
4. 2 つの Magic エンジンをバックグラウンドで実行します。
（各エンジンは、ポート番
号 1501 および、1502 をアクセスします。）

異なる PC 上の Magic アプリケーションサーバを呼び出す
J2EE サーバと Magic アプリケーションサーバが異なるマシン上で実行されている場合
は、以下のように設定します。

Interstage
1. %IS_HOME%\EJB\etc\FJebeProperties.xml を以下のように修正します。
•

修正前<res‑entry><res‑ref‑name>url/MagicURL</res‑ref‑name><datasource‑name>http://localhost:1500</datasource‑name></res‑entry>•

修正後<res‑entry><res‑ref‑name>url/MagicURL</res‑ref‑name><datasource‑name>http://<ComputerName or IP>:1500</datasource‑
name></res‑entry>

2. 変更後、以下のコマンドで EJB を再起動してください。
ejbdstopeb <EJB Name>
ejbdstarteb <EJB Name>

Magic から EJB を呼び出す
Magic アプリケーションから EJB を呼び出す手順を説明いたします。
説明の中で <Bean_name> は、実際の EJB 名、<Magic Dir> は、Magic のインストールディ
レクトリを表します。
Magic が生成する Proxy EJB に沿って、J2EE アプリケーションクライアントの DD ファ
イルは、Client <Bean_name>DD.xml 、J2EE アプリケーションクライ
アント名前変換ファイルは、Client<Bean_name>Properties.xml という表記で説明されてい
ます。

環境設定
InterStage
1. InterStage のサービスが実行され、EJB がデプロイ／実行されていることを確認してください。
2. 2 つの XML ファイルを配置します。

244

開発者ガイドMagic eDeveloper V9 Plus

Magic から EJB を呼び出す•

J2EE アプリケーションクライアント Deployment Descripter ファイル
（Client <Bean_name>DD.xml）
このファイルは、EJB にアクセスするために必要な情報（EJB Home や EJB
Remote クラス）が含まれています。このファイルは、パスの通ったディレクト
リ（Magic のインストールディレクトリ）に配置します。

•

J2EE アプリケーションクライアント名前変換ファイル（Client<Bean_name>Properties.xml）
このファイルは、EJB 名と JNDI 名のマッピング用に使用されます。このファ
イルは、%IS̲HOME%¥J2EE¥etc に置いてください。

3. Magic アプリケーションが複数の EJB に接続する必要がある場合、EJB の情報を結合さ せた XML ファイルを作成します。例えば、2 つの EJB（「EjbSample」と「DemoBean」にアクセスする場合は、以下のようにします。）•

Client<Bean_name>DD.XML ファイル<ejb-ref> セクションを追加します。
<?xml version="1.0" encoding="UTF‑8"?><!DOCTYPE application‑client PUBLIC "‑//Sun Microsystems, Inc.//DTD J2EE
ApplicationClient1.3//EN" "http://java.sun.com/dtd/application‑client̲1̲3.dtd"><application‑client><display‑name>display</display‑name><description>description</description><description>EjbSample EJB</description><ejb‑ref><description>EjbSample Information</description><ejb‑ref‑name>JNDI̲EjbSample</ejb‑ref‑name><ejb‑ref‑type>Session</ejb‑ref‑type><home>magic.EjbSampleHome</home><remote>magic.EjbSample</remote></ejb‑ref><ejb‑ref><description>DemoBean Information</description><ejb‑ref‑name>ejb/DemoBean</ejb‑ref‑name><ejb‑ref‑type>Session</ejb‑ref‑type><home>EJBDemo.DemoBeanHome</home><remote>EJBDemo.DemoBean</remote></ejb‑ref></application‑client>•

Client<Bean_name>Properties.XML ファイル
<client> セクションを追加します。
<?xml version="1.0" encoding="UTF‑8"?><!DOCTYPE fujitsu‑ebe‑definition SYSTEM 'fujitsu‑ebe‑definition.dtd'><fujitsu‑ebe‑definition><client><ejb‑ref‑entry><ejb‑ref‑name>JNDI̲EjbSample</ejb‑ref‑name><jndi‑name>EjbSample</jndi‑name></ejb‑ref‑entry></client><client><ejb‑ref‑entry><ejb‑ref‑name>ejb/DemoBean</ejb‑ref‑name><jndi‑name>DemoBean</jndi‑name></ejb‑ref‑entry></client></fujitsu‑ebe‑definition>

4. Magic.ini の［MAGIC_JAVA］セクションを設定します。ここには、3 つのキーワー
ドがあります。

開発者ガイドMagic eDeveloper V9 Plus245

第 20 章 - J2EE との連携•

JAVA_HOME
この指定は不要です。（通常は、OS の環境変数として設定します。）•

CLASSPATH
ここには、EJB が実行する上で必要な jar ファイルやパスを指定します。通常は、以下を指定します。
•

C:¥Interstage¥EJB¥lib¥fjcontainer32.jar•

C:¥Interstage¥ODWIN¥etc¥class¥ODjava2.jar•

C:¥Interstage¥J2EE¥lib¥isj2ee.jar
これらの 3 つの jar ファイルは、J2EE クライアントアプリケーションがEJB にアクセスする上で必要なものです。

•

Interstage V5.0 の場合
C:¥Interstage¥J2EE¥var¥deployment¥deployed¥distribute¥<EJB name>•Interstage V6.0 の場合
C:¥Interstage¥J2EE¥var¥deployment¥ijserver¥<IJServer
Name>¥distribute¥<jar file name>
このディレクトリには、J2EE クライアントアプリケーションがアクセスする EJB（Home/Remote インタフェース）が含まれています。複数の EJB と接続する必要がある場合、接続する全てのディレクトリを指定してください。
Interstage V6.0 で IJServer を使用して配備する場合は、以下の注意が必要です。
•

IJServer 作成時に、IJServer タイプに「Web アプリケーションと EJB
アプリケーションを別 JavaVM で運用」を選択してください。

•

配布先のパスはC:¥Interstage¥J2EE¥var¥deployment¥ijserver¥<IJServer
Name>¥distribute¥<jar file name> となります。

•<IJServer Name> は、IJServer の名前を表します。<jar file name> は、配置した jar ファイル名のピリオド「.」をアンダーバー「_」に変換した形で指定してください。

論理名を使用することはできません。

•

JVM_ARGS
ここには、JMS への設定内容が含まれます。Interstage では以下の設定を必ず行ってください。

246•‑Dcom.fujitsu.interstage.j2ee.DeploymentDescriptorClient=<FullPath>Client<Bean̲name>DD.xml
この設定は、前述の Client<Bean̲name>DD.XML ファイルの位置を指定します。

•‑DEBEproperties=Client<Bean_name>Properties.xml
Client<Bean̲name>Properties.XML ファイル名を指定します。このファイ
ルは、%IS̲HOME%¥J2EE¥etc に配置されていることが前提です。

•‑Djava.naming.factory.initial=com.fujitsu.interstage.j2ee.jndi.
InitialContextFactoryForClientjndi.properties（%JAVA̲HOME%¥jre¥lib¥jndi.properties）ファイルに設定された JNDI の設定内容をそのまま記述します。

•‑Dorg.omg.CORBA.ORBClass=com.fujitsu.ObjectDirector.CORBA.ORB•‑Dorg.omg.CORBA.ORBSingletonClass=com.fujitsu.Object
Director.CORBA.SingletonORB

開発者ガイドMagic eDeveloper V9 Plus

Magic から EJB を呼び出す•‑Djavax.rmi.CORBA.StubClass=com.fujitsu.ObjectDirector.rmi.
CORBA.StubDelegateImpl•‑Djavax.rmi.CORBA.UtilClass=com.fujitsu.ObjectDirector.rmi.
CORBA.UtilDelegateImpl•‑Djavax.rmi.CORBA.PortableRemoteObjectClass=com.fujitsu.
ObjectDirector.rmi.CORBA.PortableRemoteObjectDelegateImpl
上記の ORB(Object Request Broker) の設定は、%IS̲HOME%¥EJB¥etc¥orb.properties ファイルの内容をそのまま記述します。

•‑Dorg.omg.CORBA.ORBInitialHost=localhost•‑Dorg.omg.CORBA.ORBInitialPort=8002
ORB の追加設定です。もし、J2EE サーバ PC と同じ PC 上で J2EE クライアントが実行しない場合、「localhost」の代わりに J2EE サーバのホスト名を指定してください。

Magic.ini の例（Interstage V6.0 の場合）
[MAGIC̲JAVA]
JAVA̲HOME=
CLASSPATH=C:¥INTERSTAGE¥J2EE¥var¥deployment¥ijserver¥EjbSam+ple¥distrtibute¥EjbSample̲jar̲client.jar;+
C:¥INTERSTAGE¥J2EE¥var¥deployment¥deployed¥distribute¥DemoBean;+c:¥INTERSTAGE¥EJB¥lib¥fjcontainer32.jar;+c:¥INTERSTAGE¥ODWIN¥etc¥class¥ODjava2.jar;+c:¥INTERSTAGE¥J2EE¥lib¥isj2ee.jar;
JVM̲ARGS=‑+
Dcom.fujitsu.interstage.j2ee.DeploymentDescriptorClient=c:¥Client+
MagicDD.xml ‑DEBEproperties=ClientMagicProperties.xml ‑+Djava.naming.factory.initial=com.fujitsu.interstage.j2ee.jndi.InitialCont+
extFactoryForClient +‑Dorg.omg.CORBA.ORBClass=com.fujitsu.ObjectDirector.CORBA.ORB ‑+Dorg.omg.CORBA.ORBSingletonClass=com.fujitsu.ObjectDirector.CORBA.Singlet+
onORB +
‑Djavax.rmi.CORBA.StubClass=com.fujitsu.ObjectDirector.rmi.CORBA.StubDele+
gateImpl +‑Djavax.rmi.CORBA.UtilClass=com.fujitsu.ObjectDirector.rmi.CORBA.UtilDeleg+
ateImpl +‑Djavax.rmi.CORBA.PortableRemoteObjectClass=com.fujitsu.ObjectDirector.rm+
i.CORBA.PortableRemoteObjectDelegateImpl +‑Dorg.omg.CORBA.ORBInitialHost=localhost +‑Dorg.omg.CORBA.ORBInitialPort=8002

J2EESDK 1.3
Magic.ini の［MAGIC_JAVA］セクションを以下のように設定します。
[MAGIC̲JAVA];JAVA̲HOME=
CLASSPATH=.¥;C:¥jdk1.3.1¥jre¥lib¥ext¥mgejbgnrc.jar;C:¥j2sdkee1.3¥lib¥j2ee.j+
ar;C:¥j2sdkee1.3¥repository¥<Hostname>¥applications¥<EJB̲JarFileName>
JVM̲ARGS=‑Djava.compiler=NONE ‑Djava.naming.factory.initial=com.sun.enterpr+
ise.naming.SerialInitContextFactory ‑Djava.naming.provider.url=iiop://local+
host:1050 java.naming.factory.url.pkgs=com.sun.enterprise.naming<EJB_JarFileName> は、デプロイされた EJB の jar ファイル名かデプロイ時に作成されたクライアント用 jar ファイルの名前を表します。

J2EESDK 1.4
Magic.ini の［MAGIC_JAVA］セクションを以下のように設定します。

開発者ガイドMagic eDeveloper V9 Plus247

第 20 章 - J2EE との連携
[MAGIC̲JAVA];JAVA̲HOME=
CLASSPATH=.¥;C:¥Sun¥AppServer¥lib¥j2ee.jar;C:¥jdk1.3.1¥jre¥lib¥ext¥mgejbgnr+
c.jar;C:¥Sun¥AppServer¥domains¥domain1¥applications¥j2ee‑apps¥<EJB̲JarFileName>
JVM̲ARGS=‑Djava.compiler=NONE ‑Djava.naming.factory.initial=com.sun.jndi.co+
snaming.CNCtxFactory ‑Djava.naming.provider.url=iiop://localhost:3700 +java.naming.factory.url.pkgs=com.sun.enterprise.naming

JBoss 2
Magic.ini の［MAGIC_JAVA］セクションを以下のように設定します。
[MAGIC̲JAVA];JAVA̲HOME=
CLASSPATH=.¥;C:¥jboss2.4.4¥lib¥ext¥jboss.jar;C:¥jboss2.4.4¥client¥
jnp‑client.jar;C:¥jboss2.4.4¥deploy¥<EJB̲JarFileName>
JVM̲ARGS=‑Djava.compiler=NONE ‑Djava.naming.factory.initial=org.jnp.interfa+
ces.NamingContextFactory ‑Djava.naming.provider.url=localhost:1099 +‑Djava.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

JBoss 3
Magic.ini の［MAGIC_JAVA］セクションを以下のように設定します。
[MAGIC̲JAVA];JAVA̲HOME=
CLASSPATH=.¥;C:¥jboss‑3.2.5¥server¥default¥lib¥jboss.jar;+C:¥jboss‑3.2.5¥+
client¥jboss‑j2ee.jar;C:¥jboss‑3.2.5¥client¥jnp‑client.jar;+C:¥jboss‑3.2.5¥server¥default¥deploy¥<EJB̲JarFileName>
JVM̲ARGS=‑Djava.compiler=NONE ‑Djava.naming.factory.initial=org.jnp.interfa+
ces.NamingContextFactory ‑Djava.naming.provider.url=localhost:1099 +‑Djava.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

WAS4.0Magic.ini の［MAGIC_JAVA］セクションを以下のように設定します。
[MAGIC̲JAVA];JAVA̲HOME=
CLASSPATH=.¥;C:¥WebSphere¥AppServer¥lib¥websphere.jar;C:¥WebSphere¥AppServer¥inst
alledApps¥<Deployed̲EJB̲Name>.ear¥<Deployed̲EJB̲Name>.jar
JVM̲ARGS=‑Djava.compiler=NONE ‑Djava.naming.factory.initial=com.ibm.websphe+
re.naming.WsnInitialContextFactory ‑Dserver.root=C:¥WebSphere¥AppServer +‑Dcom.ibm.CORBA.BootstrapHost=localhost

WAS5.0Magic.ini の［MAGIC_JAVA］セクションを以下のように設定します。
[MAGIC̲JAVA];JAVA̲HOME=
CLASSPATH=.¥;C:¥Program Files¥WebSphere¥AppServer¥lib¥namingclient.jar;C:¥P+
rogram Files¥WebSphere¥AppServer¥lib¥ecutils.jar;C:¥Program Files¥WebSphere+¥AppServer¥+properties;C:¥Program Files¥WebSphere¥AppServer¥installedApps¥+<Host Name>¥<Deployed̲EJB̲Name>.ear¥<Deployed̲EJB̲Name>.jar
JVM̲ARGS=‑Djava.compiler=NONE ‑Djava.naming.factory.initial=com.ibm.websphe+
re.naming.WsnInitialContextFactory

Sun One
Magic.ini の［MAGIC_JAVA］セクションを以下のように設定します。
[MAGIC̲JAVA];JAVA̲HOME=

248

開発者ガイドMagic eDeveloper V9 Plus

Java コンポーネントジェネレータによるプログラムの作成
CLASSPATH=.¥;C:¥Sun¥AppServer7¥domains¥domain1¥server1¥applications¥+
j2ee‑modules¥<EJB ModuleName>¥<EJB̲FineName>;+C:¥Sun¥AppServer7¥domains¥domain1¥server1¥applications¥j2ee‑apps¥<Enterprise
Application Name>¥<EJB̲FineName>
JVM̲ARGS=‑Djava.compiler=NONE ‑Djava.naming.factory.initial=com.sun.jndi.co+
snaming.CNCtxFactory‑Djava.naming.provider.url=iiop://localhost:3700

指定するクラスパスは、Deploy 先によって異なります。Admin Console にて「エンタープライズアプリケーション」として Deploy されたモジュールは j2ee-apps サブ
フォルダに、「EJB モジュール」として Deploy されたモジュールは j2ee-modules サブ
フォルダに展開されます。
CLASSPATH には、デプロイされた EJB の Jar ファイルを含めてください。パスに論理名
や環境変数名は使用できません。

Java コンポーネントジェネレータによるプログラムの作成
Java コンポーネントジェネレータ（以下、JCG と略します。）を使用することで、EJB に
アクセスするプログラムを作成することができます。

JCG を起動する
1. 空のアプリケーションをオープンします。
2. ［コンポーネント］メニューの［Java インタフェース］を実行します。
3. JCG の起動画面が表示されます。

EJB を指定する
1. JCG の起動画面より、EJB を選択します。
2. ［EJB 名］と［JNDI プロパティ］の入力欄が表示されます。
3. ［EJB 名］には、「<Bean_name>」と入力します。
例：EibSample
4. ［JNDI プロパティ］には、J2EE サーバに応じた値を指定します。
•

Interstage の場合……<EJB Home class path> を指定します。
例：EJBHome=magic/EjbSample•

Interstage 以外の場合……指定する必要はありません。

開発者ガイドMagic eDeveloper V9 Plus249

第 20 章 - J2EE との連携

図 20-1 EJB の指定

5. ［次へ］をクリックすると EJB 内のメソッドがツリー表示されます。

図 20-2 クラスの指定

6. 「<Bean_name>」にカーソルが位置付けされている状態で［次へ］をクリックします。
Magic.j2ee.MagicException も表示されますが、Magic の内部で使用するものですの
で、指定しないでください。

コンポーネントを作成する
1. コンポーネント用の出力ファイルのパスとファイル名を指定するダイアログが表示されます。（通常は変更する必要がありません。）［OK］をクリックします。

250

2. 完了のダイアログが表示されます。［完了］ボタンをクリックします。

開発者ガイドMagic eDeveloper V9 Plus

Java クラスへのアクセス方法
3. 出力ファイルのリポジトリ入力の実行確認のダイアログが表示されます。入力する
場合は、［Yes］をクリックします。
リポジトリ入力を実行するとメインプログラムが上書きされます。メインプログラムに定義されている内容が消えてしまうのでご注意ください。
4. リポ ジトリ 入力が実行されると、EJB のインスタンス作成を行うプログラム（EJBCreate 関数を使用します）と EJB 内のメソッドを呼び出すプログラム（JCall 関数を使用します）が作成されます。

Java クラスへのアクセス方法
ここでは、Java のクラスにアクセスする方法を説明いたします。

Java 環境の設定
ここでは、Java の環境設定について説明いたします。この設定は、Magic で Java のクラスを呼び出す際に必要です。

必要な Java ソフト
Java の実行モジュールを PC で動作させるには、Java 実行環境 (JRE) をインストールする必要があります。
Java での開発には、Java ソフトウェア 開発キット (SDK) が必要です。この中には、Java
コードをコンパイルするために必要なツールや、いくつかのユーティリティ、JRE が含
まれています。
EJBExplore 関数のような Magic の Java 関数や、JCG を使用する場合は、Java SDK が必要です。

システム全体の設定
Java の SDK や JRE をインストールした場合、JAVA_HOME という環境変数を設定する必要があります。ここには、JRE/SDK のメインディレクトリを設定します。

例：JAVA̲HOME = C:¥Java¥j2re141
Magic の Java 関数を使用する場合は、PATH 環境変数に以下の値を追加してください。
• JRE の場合 : %JRE̲HOME%¥bin¥client• SDK の場合 : %SDK̲HOME%¥jre¥lib¥clientJava のクラスパスの設定
実行したい Java コードが複数のディレクトリ上に、複数のファイルで存在する場合があります。
通常、複数の Java クラスは、Zip 形式の Jar(Java archive) ファイルにパッケージ化されています。
Java の実行環境は、クラスパスを使用して位置付けされます。Java のクラスパスは、ディレクトリや Jar ファイルの一覧が含まれます。

開発者ガイドMagic eDeveloper V9 Plus

251

第 20 章 - J2EE との連携
環境変数の CLASSPATH を使用することで、システム全体のクラスパスを定義することができます。
CLASSPATH の値は、以下のように表すことができます。
CLASSPATH = C:\Java_classes\;C:\my_jars\service1.jar
MAGIC.INI の [MAGIC_JAVA] セクションに CLASSPATH を設定することで、Magic での使用に限定したクラスパスを定義することができます。
CLASSPATH の区切り文字には、Windows の場合は、セミコロン (;) が、Unix や iSeries の場合は、コロン (:) が使用されます。
この件についての詳細は、Java2 SDK のドキュメントを参照してください。

JVM 引数の設定
Javaコードを実行する場合、Javaの実行環境に設定情報を追加するためにJVM(Java Virtual
Machine) への引数を指定することができます。
Java コードを実行する場合、Java コマンドの -D フラグを使用することで情報を渡すことができます。
Magic 環境で JVM へ引数を渡す場合は、MAGIC.INI の [MAGIC_JAVA] セクションで
JVM_ARGS に引数を指定してください。

例：
JVM̲ARGS=‑Djava.compiler=NONE +‑Djms.properties=C:¥j2sdkee1.3.1¥config¥jms̲client.properties

Java クラスの内容を取得する
ここでは、Java クラスの内容を取得する方法について説明いたします。

Java クラスとは ?
Java のオブジェクトは、変数やメソッドを持っています。例えば、rectangle クラスのオブジェクトは、calculateArea() メソッドだけでなく長さと幅の変数を持っています。Java クラス(rectangle)は、あるタイプの全てのオブジェクトのひな形またはテンプレートといえます。Java クラス内の変数やメソッドを、Magic の Java 関数 (JCreate, JGet, JCall, etc.) を使用してアクセスすることができます。
Java 開発者は、スタティック変数やスタティックメソッドを定義することができます。
スタティック変数は、このクラスを参照している全ての Java オブジェクトによって共有されます。スタティック変数やスタティックメソッドにアクセスするには、クラス名 +ドット（.）の後に変数名やメソッド名を指定します。
例えば、java.io.File クラスのスタティック変数である separator にアクセスする場合、”java.io.File.separator” （または、”File.separator”）と記述します。

JExplore 関数の使用
Magic の JExplore 関数は、クラス定義を参照し、クラスの構造を記述した XML 出力を作
成します。

252

開発者ガイドMagic eDeveloper V9 Plus

Java クラスへのアクセス方法
JExplore 関数には、パラメータとして文字列を 1 つ渡します。このパラメータは、“Java.lang.StringBuffer” というように Javaクラスの名前を指定します。XML出力は大きなサイズになります（文字項目の最大値以上になる場合があります）。このため、戻り値はBlob 型の項目を使用します。JExplore 関数で更新された BLOB 項目は、GUI 表示フォー
ムに「リッチエディット」コントロールとして表示することができます。
JExplore 関数を使用するには、Java2 SDK をあらかじめインストールする必要があります。詳細は、「Java クラスへのアクセス方法」の説明を参照してください。

Javap ユーティリティの使用
javap ユーティリティ（Java2 SDK に含まれています。）を使用することでも、クラス定義を参照することができます。構文は以下の通りです。
javap -s <class name>例：
javap ‑s java.lang.StrigBuffer

出力例
以下に JExplore 関数の出力例を示します。
JExplore("java.lang.StringBuffer")<?xml version="1.0" encoding="UTF‑8"?><ClassMetaData xmlns:xsi="http://www.w3.org/2001/XMLSchema‑instance"><Classes><Class name="java/lang/StringBuffer" abstract="N" interface="N"><Dependencies><Extends><ClassName>java.lang.Object</ClassName></Extends><Implements><ClassName>java.io.Serializable</ClassName><ClassName>java.lang.CharSequence</ClassName></Implements></Dependencies><Structure><Constructors><Constructor idx="1"><Signature>(I)V</Signature><Parameters><Parameter idx="1"><name></name><type>int</type></Parameter></Parameters><Throws></Throws></Constructor><Constructor idx="2"><Signature>(Ljava/lang/String;)V</Signature><Parameters><Parameter idx="1"><name></name><type>java.lang.String</type></Parameter></Parameters><Throws></Throws></Constructor><Constructor idx="3"><Signature>()V</Signature><Parameters>

開発者ガイドMagic eDeveloper V9 Plus

253

第 20 章 - J2EE との連携</Parameters><Throws></Throws></Constructor></Constructors><InstanceMethods><Method idx="1"><name>toString</name><Signature>()Ljava/lang/String;</Signature><Parameters></Parameters><Throws></Throws></Method><Method idx="2"><name>append</name><Signature>(C)Ljava/lang/StringBuffer;</Signature><Parameters><Parameter idx="1"><name></name><type>char</type></Parameter></Parameters><Throws></Throws></Method>…
</InstanceMethods><StaticMethods></StaticMethods><InstanceVariables></InstanceVariables><StaticVariables><Variable idx="1" final="Y"><name>serialVersionUID</name><Signature>J</Signature></Variable></StaticVariables></Structure></Class></Classes></ClassMetaData>

以下は、コマンド javap -s java.lang.StringBuffer の出力結果です。
Compiled from: StringBuffer.java.
public final class java/lang/StringBuffer extends java.lang.Object implements ja
va.io.Serializable, java.lang.CharSequence {static final long serialVersionUID;/* J */
public java/lang/StringBuffer();/* ()V */public java/lang/StringBuffer(int);/* (I)V */public java/lang/StringBuffer(java.lang.String);/* (Ljava/lang/String;)V */public synchronized int length();/* ()I */public synchronized int capacity();/* ()I */…

クラスパスが設定された Java クラスのみ参照できます。詳細は、「Java クラスへのアクセス方法」の説明を参照してください。

254

開発者ガイドMagic eDeveloper V9 Plus

Java クラスへのアクセス方法
JExplore 関数は、XML のスキーマファイル（JExplore.xsd）を、<MagicDir>¥support ディ
レクトリに作成します。

Java クラスのインスタンスを作成する
Java クラスを使用するには、最初にクラスのインスタンス（オブジェクト）を作成する必要があります。
JCreate 関数は、Java クラスのインスタンスを作成し、このインスタンスのハンドルを返します。ハンドルは、BLOB 項目に格納してください。
Java では、オブジェクトを生成する際にコンストラクタと呼ばれる初期化処理が必ず実行されます。各クラスは、少なくとも 1 つのコンストラクタを持っています。シグニチャ
によってコンストラクタを区別することができます。
例えば、”java.lang.StringBuffer” クラスのコンストラクタの場合、”Java -s” コマンドを実行すると、以下のような結果が出力されます。
…
public java.lang.StringBuffer();/* ()V */public java.lang.StringBuffer(int);/* (I)V */public java.lang.StringBuffer(java.lang.String);/* (Ljava/lang/String;)V */…

java.lang.StringBuffer には、3 つのコンストラクタ（java.lang.StringBuffer メソッド）があります。
• 入力なし（シグニチャ :”()V”）• int 型の入力パラメータを 1 つもつ（シグニチャ :”(I)V”）• String 型の入力パラメータを 1 つもつ（シグニチャ :”(Ljava/lang/String;)V”）
Java のコンストラクタには戻り値がなく、Java オブジェクトを初期化するだけの機能を持ちます。“V”(Void) は、メソッドが値を返さないことを示しています。
JCreate 関数は、複数のパラメータを指定します。最初はクラス名で、２番目はコンスト
ラクタのシグニチャです。これ以降の追加パラメータは、コンストラクタへの入力パラ
メータになります。
例えば、空の String Buffer オブジェクトを作成するには、以下のようにします。
JCreate('java.lang.StringBuffer','()V')
String オブジェクトを使用して初期化する場合は、以下のようにします。
JCreate('java.lang.StringBuffer','(Ljava/lang/String;)V','My String')
Magic の Java 関数の実行中にエラーが発生した場合、JExceptionOccured 関数によってエラーが発生したかどうかを確認することができ、JExceptionText 関数でエラー内容を確認することができます。
間違ったシグニチャを指定した場合、Magic は正しいメソッドを呼び出すことができず、
以下のようなエラーメッセージを表示します。
java.lang.NoSuchMethodError: <init>
入力項目の数が正しくない場合は、以下のようなエラーメッセージを表示します。
java.lang.Exception: Incompatible signature and number of arguments!

開発者ガイドMagic eDeveloper V9 Plus

255

第 20 章 - J2EE との連携
Java オブジェクトの参照内容を格納した BLOB 項目を表示するには、リッチエディット
コントロールを使用します。JCreate 関数で項目を更新すると、Java クラスとインスタン
ス ID が表示されます。
以下にシグニチャの一覧を示します。

Java VM タイプのシグニチャ
シグニチャ

Java 言語でのデータ型

Z

boolean

B

byte

C

char

S

short

I

int

J

long

F

float

D

doubleL fully-qualifiedclass;fully-qualified-class[ typetype[]( arg-types ) ret-type

method type

例えば、Prompt.getLine メソッドに以下のシグニチャがあるとします。
(Ljava/lang/String;)Ljava/lang/String;
Prompt.getLine には、String オブジェクトのパラメータが１つあり、メソッドの戻り値もString であることを示しています。
また、Callbacks.main メソッドに以下のシグニチャがあるとします。
([Ljava/lang/String;)V
Callbacks.main メソッドのシグニチャには、String オブジェクトのパラメータが１つあり、メソッドの戻り値は、void であることを示しています。
配列タイプは、前のかぎ括弧 ([) に続く配列要素のタイプによって表します。
クラスパスが設定された Java クラスのみ参照できます。詳細は、「Java クラスへのアクセス方法」の説明を参照してください。
Magic は、いくつかの自動変換処理を実行します。例えば、文字列は Java の String オブジェクトに変換し、数値データは適切な Java の数値データ型（int や long 、Double）に変換します。

Java 変数の読込
ここでは、Java 変数の値を読み込む方法について説明いたします。

インスタンス変数の値の読込
Java では、クラスのメンバ変数としてスタティック変数と非スタティック変数（インスタンス変数）を定義できます。クラス変数は特定のクラスの全オブジェクトで共有されますが、インスタンス変数は各オブジェクトごとに保持されます。

256

開発者ガイドMagic eDeveloper V9 Plus

Java クラスへのアクセス方法
Magic では JGet 関数を使用して、インスタンス変数の値を取得することができます。JGet関数を使用するには、Java オブジェクトに対する参照が必要です。また、変数のシグネ
チャを指定する必要もあります。
例えば、’ java.until.Vector’ というクラス（オブジェクトの保存ベクトルに対応したクラス）のインスタンス変数メンバを読み出してみます。
‘javap -s java.until.Vector’ の出力結果は以下のようになります。
…
protected int elementCount;/* I */…
public synchronized boolean add(java.lang.Object);/* (Ljava/lang/Object;)Z */…

‘elementCount’ は、int 型のメンバ変数です。また、メソッド：add() は、ベクトルに Java
オブジェクトを追加する機能を持っています。
JGet 関数では、複数のパラメータを指定します。１番目は、読み込みたい変数をもつ Java
オブジェクトの参照情報です。２番目は変数名、３番目は、変数のシグニチャです。
変数の値を読み込むには、JGet 関数の戻り値で Magic の変数を項目更新するようにしてください。変数の型は、メソッドの戻り値の型に依存します。関数が、Java オブジェク
トを返すものであれば、BLOB 型の変数を使用してください。
次の例では、Java の Vector オブジェクトの参照情報を作成し、ベクトルに String オブジェ
クトを追加し、ベクトル内の要素の数（変数：elementCount）を読み込みます。
1. オンラインプログラムを新規に作成し、以下の変数を定義します。
•

A …… 変数名 =’J_Vector object’、型 = BLOB•

B …… 変数名 =’J_String object’、型 = BLOB•C …… 変数名 =’ 要素数 ’、型 = 数値、書式 =’5’•

D …… 変数名 =’ 送信ボタン ’ ( プッシュボタン用 )2. 変数 ’J_Vector object’ の代入欄に以下の式を定義します。
JCreate ('java.util.Vector','()V')
3. 変数 ’J_String object’ の代入欄に以下の式を定義します。
JCreate ('java.lang.String','(Ljava/lang/String;)V','ABCDEFG')
4. プッシュボタンのイベントに対応したハンドラに以下の処理を定義します。
•

アクションコマンドで以下の式を定義します。
JCall (A,'addElement',' (Ljava/lang/Object;)V',B)•

項目更新コマンドで、変数 ’ 要素数 ’ に以下の式を定義します。
JGet (A,'elementCount','I')

解説 :1. 変数 ’J_Vector object’ は、空の Vector オブジェクトで初期化されます。
2. 変数 ’J_String object’ は、’ABCDEFG’ という値を持った String オブジェクトで初期化されます。
3. 変数 ’ 要素数 ’ は、Vector オブジェクト内の要素数（値 =1）によって更新されます。
JCreate 関 数 と 同 様 に、Magic の Java 関数の実行中にエラーが発生した場合、JExceptionOccured 関数は「True」を返し、JExceptionText 関数は、エラーの内容を表すテ
キストを返します。

開発者ガイドMagic eDeveloper V9 Plus257

第 20 章 - J2EE との連携指定したシグニチャが正しくない場合、Magic は、正しいメソッドを呼び出すことがで
きず、以下のようなエラーが表示されます。
java.lang.NoSuchMethodError: <method name>
パラメータの数とシグニチャが合っていない場合、以下のエラーを表示します。
java.lang.Exception: Incompatible signature and number of arguments!

スタティック変数の値の読込
スタティック変数を読み込む方法は、インスタンス変数を読み込む場合とほぼ同じです。
この場合、JGetStatic 関数を使用します。
例えば、java.lang.Integer クラス（Int 型の数値データを格納しています）のスタティック
変数を読む場合は以下のようにします。
javap -s java.lang.Integer は以下のように出力されます。
…
public static final int MAX̲VALUE;/* I */…

MAX_VALUE は、java.lang.Integer クラスのスタティック変数です。
JGetStatic 関数には、いくつかのパラメータを指定します。１番目は、クラス名と変数名
をドット（.）で連結した文字列です。２番目は、変数のシグニチャです。
例：JGetStatic(‘java.lang.Integer.MAX_VALUE’,’I’)
Java では、privete 定義された変数にはアクセスできません。

Magic はいくつかの自動変換を行います。例えば、文字型データは Java のString オブジェクトに変換され、数値型データは書式に応じた Java のデータ型（int、long、double など）に変換されます。

Java のメソッドを呼び出す
ここでは、Java のメソッドを呼び出す方法について説明いたします。

インスタンスメソッドを呼び出す
Java のコードは、Java オブジェクトのメソッドを呼び出すことで実行されます。Java のメソッドは、Magic の関数のようなものです。いくつかのパラメータを渡し、戻り値が１
つ返ります。
Java のプログラムでは、同じクラスの全てのオブジェクトで共有されるスタティックメ
ソッドとして定義することもできます。
Java メソッドを呼び出すには、最初に Java オブジェクトを作成します。
（または、既存の参照情報を取得します。）次に、呼び出すメソッドを決め、シグニチャを確認します。
以下の例は、’java.lang.StringBuffer’ クラスのいくつかのメソッドを実行するものです。
javap -s java.lang.StringBuffer は以下のように出力されます。
...
public synchronized int length();/* ()I */...
public synchronized java.lang.StringBuffer insert(int, java.lang.

258

開発者ガイドMagic eDeveloper V9 Plus

Java クラスへのアクセス方法
String);/* (ILjava/lang/String;)Ljava/lang/StringBuffer; */‘length()’ メソッドには、パラメータがなく、int 型の戻り値が返ります。
‘insert()’ メソッドには、シグニチャ’ì(ILjava/lang/String;)Ljava/lang/StringBuffer’ というシグニチャで int 型と String 型の２つのパラメータがあり、StringBuffer という Java オブジェ
クトを返します。
JCall 関数には、次のパラメータを指定します。１番目は、メソッドを実行する Java オブジェクトの参照情報です。２番目はメソッド名、３番目はメソッドのシグニチャです。
この後には、コンストラクタに渡すパラメータを指定します。
メソッド呼び出しの結果を格納するには、JCall 関数の戻り値で Magic の変数を更新します。変数の型は、メソッドの戻り値のデータ型に依存します。メソッドが Java オブジェ
クトを戻す場合は、変数は BLOB 型にしてください。
次の例では、StringBuffer オブジェクト（’ABCDEFG’ という文字列で初期化されます。）の参照情報を作成し、長さを参照し、’ABCDEFG’ という値をもつ新規の ’StringBuffer ’ オ
ブジェクトを取得するために ’insert’ メソッドを呼び出しています。
1. オンラインプログラムを新規に作成し、以下の変数を定義します。
•

A …… 変数名 =’StringBuffer object’、型 = BLOB•

B …… 変数名 =’String length’、型 = 数値、書式 =’5’•

C …… 変数名 =’Another StringBuffer’、型 = BLOB•

D …… 変数名 =’ 送信ボタン ’ ( プッシュボタン用 )2. 変数 ’StringBuffer object’ の代入欄に以下の式を定義します。
JCreate ('java.lang.StringBuffer','(Ljava/lang/String;)V','ABCDEFG')
3. プッシュボタンに対応したハンドラに以下の処理を定義します。
•

項目更新コマンドで、変数 ’String length’ に以下の値を定義します。
JCall(A,'length','()I')•

項目更新コマンドで、変数 ’Another StringBuffer’ を以下の値で更新します。
JCall (C,'insert','(ILjava/lang/String;)Ljava/lang/StringBuffer;',3,'123')•

エラーコマンドで変数 ’Another StringBuffer’ の内容を表示表示させます。

解説：
1. 変数’StringBuffer object’は、‘ABCDEFG’という文字列をもつ’StringBuffer object ‘で初期化されます。
2. 変数 ’String length’ に文字列の長さ「7」が返ります。
3. String Buffer’ABCDEFG’ の位置「3」から「123」という文字列を挿入する ’StringBuffer’ メソッドが実行されます。この結果として、「ABC123DEFG」が返ります。
JCreate 関数と同様に、Magic の Java 関数の実行中にエラーが発生した場合、JExceptionOccured 関数は「True」を返し、JExceptionText 関数は、エラーの内容を表すテ
キストを返します。
指定したシグニチャが正しくない場合、Magic は正しいメソッドを呼び出すことができず、以下のようなエラーが表示されます。
java.lang.NoSuchMethodError: <method name>
パラメータの数とシグニチャが合っていない場合、以下のエラーを表示します。
java.lang.Exception: Incompatible signature and number of arguments!

開発者ガイドMagic eDeveloper V9 Plus259

第 20 章 - J2EE との連携

スタティックメソッドを呼び出す
スタティックメソッドを呼び出す方法は、インスタンスメソッドとだいたい同じです。
この場合は、JCallStatic 関数を使用します。
JCallStatic 関数のパラメータには次のものがあります。１番目は、クラス名とメソッド名
をドット（.）で結合させた文字列です。２番目は、スタティックメソッドのシグニチャです。これ以降は、メソッドに渡すパラメータを指定します。
例えば、’java.lang.Integer’ クラスの ’toHexString’ というメソッドを呼び出す場合は以下のようにします。この場合のシグニチャは以下の通りとします。
public static java.lang.String toHexString(int);/* (I)Ljava/lang/String; */以下の式を実行することでメソッドを呼び出すことができます。
JCallStatic('java.lang.Integer.toHexString','(I)Ljava/lang/String;',16) (the result should be thealpha'10')
Magic はいくつかの自動変換を行います。例えば、文字型データは Java の String オ
ブジェクトに変換され、数値型データは書式に応じた Java のデータ型（int、long、
double など）に変換されます。

付録
ここには Interstage を使用する上での参考情報を記載します。

主な Interstage のコマンド
J2EE サーバの起動-isstart

J2EE サーバの停止-isstop（強制終了する場合は、-isstop -f）

配備済みの EJB の一覧表示-odlistns

サーバの状態表示-isstat

Deployment ツールの実行［スタート］→［プログラム］→［INTERSTAGE］→［J2EE］→［J2EE Deployment ツール］

Jar の再配備を行う際に使用します。

260

開発者ガイドMagic eDeveloper V9 Plus

付録

配備された EJB の情報を表示する
ejbcustx ツールを使用することで表示されます。

ejbcustx
1. メニューから［ファイル］→［EJB アプリケーションの実行環境定義を開く］を選択します。
2. ［EJB アプリケーション一覧］より 選択します。

PetStore を実行する場合の環境設定例
ここでは、PetStore アプリケーションを Magic アプリケーションからアクセスする場合を例にとって、環境設定のファイルを記載いたします。
Magic から EJB へアクセスする場合（J2EE アプリケーションクライアント）に必要な環
境設定は、以下の３つの設定ファイルによって行われます。
• Magic.ini• クライアント DD（例：ClientPetStoreDD.xml）• 名前変換ファイル ( 例：ClientPetStoreProperties.xml)
この例では、２つの EJB（TheCatalog、TheCart）を呼び出すように指定しています。

MAGIC.INI[MAGIC̲JAVA]
JAVA̲HOME=
CLASSPATH=.¥;Sample¥java;+
C:¥Interstage¥EJB¥lib¥fjcontainer32.jar;+
C:¥Interstage¥ODWIN¥etc¥class¥ODjava2.jar;+
C:¥Interstage¥J2EE¥lib¥isj2ee.jar;+
C:¥Interstage¥J2EE¥var¥deployment¥deployed¥distribute¥ShoppingCa+
rt Component; ( ※ )JVM̲ARGS=+‑Dcom.fujitsu.interstage.j2ee.DeploymentDescriptorClient=D:¥ClientPetst+
oreDD.xml +‑DEBEproperties=ClientPetstoreProperties.xml +‑Djava.naming.factory.initial=com.fujitsu.interstage.j2ee.jndi.InitialCo+
ntextFactoryForClient +‑Dorg.omg.CORBA.ORBClass=com.fujitsu.ObjectDirector.CORBA.ORB +‑Dorg.omg.CORBA.ORBSingletonClass=com.fujitsu.ObjectDirector.CORBA.Single
tonORB +‑Djavax.rmi.CORBA.StubClass=com.fujitsu.ObjectDirector.rmi.CORBA.StubDele
gateImpl +‑Djavax.rmi.CORBA.UtilClass=com.fujitsu.ObjectDirector.rmi.CORBA.UtilDele+
gateImpl +‑Djavax.rmi.CORBA.PortableRemoteObjectClass=com.fujitsu.ObjectDirector.rm+
i.CORBA.PortableRemoteObjectDelegateImpl +‑Dorg.omg.CORBA.ORBInitialHost=localhost +‑Dorg.omg.CORBA.ORBInitialPort=8002（※）EJB が配備されたパスを指定します。

ClientPetStoreDD.xml<?xml version="1.0" encoding="UTF‑8"?><!DOCTYPE application‑client PUBLIC "‑//Sun Microsystems, Inc.//DTD J2EE
ApplicationClient1.3//EN" "http://java.sun.com/dtd/application‑client̲1̲3.dtd"><application‑client>開発者ガイドMagic eDeveloper V9 Plus261

第 20 章 - J2EE との連携
<display‑name>display</display‑name><description>desc</description><ejb‑ref><description>PetStore catalog EJB</description><ejb‑ref‑name>ejb/catalog/Catalog</ejb‑ref‑name><ejb‑ref‑type>Session</ejb‑ref‑type><home>com.sun.j2ee.blueprints.shoppingcart.catalog.ejb.CatalogHome</home><remote>com.sun.j2ee.blueprints.shoppingcart.catalog.ejb.Catalog</remote></ejb‑ref><ejb‑ref><description>PetStore Cart EJB</description><ejb‑ref‑name>ejb/cart/Cart</ejb‑ref‑name><ejb‑ref‑type>Session</ejb‑ref‑type><home>com.sun.j2ee.blueprints.shoppingcart.cart.ejb.
ShoppingCartHome</home><remote>com.sun.j2ee.blueprints.shoppingcart.cart.ejb.
ShoppingCart</remote></ejb‑ref></application‑client>

ClientPetStoreProperties.xml<?xml version="1.0" encoding="UTF‑8"?><!DOCTYPE fujitsu‑ebe‑definition SYSTEM 'fujitsu‑ebe‑definition.dtd'><fujitsu‑ebe‑definition><client><ejb‑ref‑entry><ejb‑ref‑name>ejb/catalog/Catalog</ejb‑ref‑name><jndi‑name>TheCatalog</jndi‑name></ejb‑ref‑entry><ejb‑ref‑entry><ejb‑ref‑name>ejb/cart/Cart</ejb‑ref‑name><jndi‑name>TheCart</jndi‑name></ejb‑ref‑entry></client></fujitsu‑ebe‑definition>

262

開発者ガイドMagic eDeveloper V9 Plus

Web サービス対応

21

Magic は、SOAP(Simple Object Access Protcol) を使用した Web サービスを呼ぶことも、またプロバイダとして他のアプリケーションから呼ばれることもできます。

この章では以下の手順について説明いたします。
動作環境

264 ページ

Web サービス を呼び出す（RPC 形式）

264 ページ

Web サービス を呼び出す（ドキュメント形式）

266 ページ

Web サービスのプロバイダの構築

275 ページ

プロバイダ用プログラムの作成（ドキュメント形式）

276 ページ

開発者ガイドMagic eDeveloper V9 Plus263

第 21 章 - Web サービス対応

動作環境
Magic が Web サービスの呼び出しを行ったり、Web サービスのプロバイダとして動作するには以下の設定が必要です。

実行 PC
PC がインターネット（またはイントラネット）に接続できる環境にしてください。

Mgreq.ini［MAGIC_MESSAGING_GATEWAYS］セクションのMGSRVR06 = MGRQSOAP.DLL, , ,の記述の先頭のカンマを外して、この設定を有効にしてください。
これにより、［MAGIC 情報］ダイアログの［ロードモジュール］欄に 「SOAP」が表示されるようになります。

Web サービス を呼び出す（RPC 形式）
ここでは、既存の RPC 形式の Web サービス を呼び出して情報を取得する方法について説明いたします。
以下の内容について説明いたします。
• WSDL• コール Web サービスの定義• コール Web サービスの実行

WSDL
WSDL(WebServices Description Language) は、Web サービスを呼び出す場合に必要なイン
タフェース情報が XML 形式で定義されたものです。Magic は、既存の WSDL をもとに
Web サービスへのアクセス環境を自動的に設定することができます。

コール Web サービスの定義「AirportWeather Service」という Web サービスを呼び出して空港の気温を求めるプログラ
ムを作成します。この作成作業にはインターネットに接続できる環境が必要です。

オンラインプログラムの作成
1. プログラムリポジトリにオンラインタスクを作成します。
2. 以下のような変数項目を定義します。
名前

型

書式

AirportA= 文字

10

Temperature

A= 文字

100

Complete

L= 論理

5

Fail

A= 文字

100

3. メインフォームに変数を配置します。

264

開発者ガイドMagic eDeveloper V9 Plus

Web サービス を呼び出す（RPC 形式）
4. コントロール後処理で項目「Airport」のエディットコントロールを割り当て、ハン
ドラに［コール］コマンドを定義します。タイプは「W=Web サービス」を指定します。

WSDL アシスト［コール Web サービス］コマンドの［コールタイプ］欄の次のカーソル位置でズームすると［コール Web サービス］ダイアログが表示されます。新規の場合はさらに［WSDL
アシスト］ダイアログが表示されます。ここで、既存の WSDL を指定することで Web
サービスを指定することができます。

Web サービスを指定する：
1. ［URL］欄に WSDL の URL を指定します。ここでは、以下のように入力します。
http://live.capescience.com/wsdl/AirportWeather.wsdl（上記の URL は、外部のサービスですのでアクセスできなくなる場合があります。）
2. 利用できる処理が下に一覧表示されます。「getTemperature」にカーソルを移動して［選択］ボタンを押すか［Enter］キーを押します。
［コール Web サービス］ダイアロ
グに戻り一部のパラメータが設定されます。
3. ［戻り値］欄に変数「Temperature」を、［正常終了］欄に「Complete」、［エラー情報］
欄に「Fail」を定義します。［OK］をクリックします。

パラメータの設定
Web サービスプロバイダに渡すパラメータを設定します。プロバイダ側のパラメータの書式に合った値を渡す必要があります。

パラメータを設定する：
1. コール Web サービスの［コールタイプ］欄の［パラ］欄でズームすると［パラメータ］テーブルが表示されます。
［リモート名］、［Xsd タイプ］、［モード］にはすでに
WSDL アシストによって設定されていますので、これに対応した Magic 側の値（［項目］または、［式］）を設定します。
ここでは［項目］欄でズームして、変数「Airport」を設定します。

コール Web サービスの実行
作成したプログラムを実行し、Web サービスプロバイダを呼び出します。

コール Web サービスを実行する：
1. 上記で作成したプログラムを実行します。
2. ［Airport］に「RJTT」と入力します。（「RJTT」は、羽田空港の空港コードです。
）
3. ［Temperature］でズーム（F5）します。「Temperature」には、”The Temperature at Tokyo International Airport, Japan is 71 F (22 C)”というような文字列が返されます。
4. 正常に処理された場合は、［Complete］には、「True」が、［Fail］は、空白のままになります。
5. 正常に処理されなかった場合は、［Complete］には、「False」が、［Fail］には、エラー

開発者ガイドMagic eDeveloper V9 Plus

265

第 21 章 - Web サービス対応
メッセージが返ります。
Web サービスのプロバイダのカタログが以下の URL で参照できます。
http://www.xmethods.net/

Web サービス を呼び出す（ドキュメント形式）
ここでは、既存のドキュメント形式の Web サービス を呼び出して情報を取得する方法について説明いたします。
ドキュメント形式で Web サービスを呼び出す場合は、入力／出力パラメータともに XML
形式のデータを１つずつ指定します。Magic プログラム内では、XML データとして SOAPの Body データのみをテキスト形式で指定します。（Body タグは含まれません。）<SOAP‑ENV:Envelope xmlns:SOAP‑ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP‑ENV:Body><SearchWord xmlns="http://www.iwebmethod.net" ><query>WebService</query><partial>true</partial></SearchWord></SOAP‑ENV:Body></SOAP‑ENV:Envelope>

この例では、SerachWord 以下のみ渡されます。
戻り値も Body データのみが返ります。

以下の例では、「用語辞典」という架空の Web サービスを呼び出して用語の意味を求めるプログラムを作成します。この作成作業にはインターネットに接続できる環境が必要です。

参照する Web サービスの概要
この Web サービスでは、次の２つの処理を行うことができます。
• 検索したい言葉を送信すると、その言葉を含んだ見出し語の一覧データが返されます。
• 見出し語データに対応した ID を送信すると、見出しの意味が返されます。
この Web サービスは、以下のメソッドとクラス定義が公開されているものとします。

メソッド
SearchWord……見出し語の一覧を取得します。
public WORD[] SearchWord(
string query,boolpartial
);

•

•

266

パラメータ
•

que

•

ry……検索する単語を指定します。

•

partial……検索方法を指定します。
（「true」の場合は、部分一致）

戻り値

開発者ガイドMagic eDeveloper V9 Plus

Web サービス を呼び出す（ドキュメント形式）•

WORD クラスのオブジェクトの配列が返されます。

GetItemById……用語の意味を取得します。
public ITEM GetItemById(
string id
);

•

パラメータ
•

•

id……見出し語の持つ ID を指定します。

戻り値•

ITEM クラスのオブジェクトが返されます。

クラス定義
WORD クラス……見出し語を定義します。
public class WORD {public string title;
public string id;
}

•

メンバー
•

title……見出し語•

id……見出し語のもつ ID

ITEM クラス……本文を定義します。
public class ITEM {public WORD
public WORD[]
public string
}

•

word;
aliases;meaning;

メンバー•

word……本文に対する見出し語•

aliases……見出し語に対する別名となっている見出し語•

meaning……本文（見出し語の意味）

ここで作成するプログラムは、検索したい言葉を入力すると、その言葉を含んだ見出し
語の一覧がコンボボックス上に表示され、その中から用語を選択するとその用語の意味が表示されるものです。
ここでは、以下の手順でプログラムを作成していきます。
• コール Web サービスの定義• 入力パラメータ用コンポーネントアプリケーションの定義• 出力パラメータ用コンポーネントアプリケーションの定義• 入力パラメータの設定処理の定義• 出力パラメータの取得処理の定義• コール Web サービスの実行

コール Web サービスの定義
オンラインプログラムの作成
1. プログラムリポジトリにオンラインタスクを作成します。
2. 以下のような変数項目を定義します。
（）は、フォーム上に配置する際のコントロー

開発者ガイドMagic eDeveloper V9 Plus267

第 21 章 - Web サービス対応
ルです。
名前

型

書式

コントロールSearchWord

A= 文字

30

エディットコントロール

Item_ID

A= 文字

30

コンボボックス

Meaning

A= 文字

500

エディットコントロール：複数
行編集

Input_XML

B=BLOB

Output_XML

B=BLOB

Complete

L= 論理

5

Fail

A= 文字

100

エディットコントロール

3. メインフォームにコントロール名を記述した変数を配置します。
4. ［ユーザイベント］テーブルに以下のイベントを定義します。（［タイプ］はどちらも「N= なし」です。）•

SearchWords•

GetItemByID

5. メインフォームにプッシュボタンコントコントロールを２つ配置し、各々上記で定義したイベントを割り当てます。
6. ［タスク定義］にハンドラを２つ作成し、上記で定義したイベントを割り当てます。

コール Web サービスの定義
1. SearchWords ハンドラに［コール Web サービス］コマンドを定義します。
2. WSDL アシストを起動し、［URL］欄に 「用語辞典」Web サービスの WSDL の URLを指定します。
3. 利用できる処理が下に一覧表示されます。
「SearchWords」にカーソルを移動して［選択］ボタンを押すか［Enter］キーを押します。
4. ［Web サービス］ダイアログでは、［スタイル］で「D= ドキュメント」と表示され、［入力 XSD］と［出力 XSD］にスキーマファイルの名前が表示されます。
（この時点
で XSD ファイルは作成されています。このファイルは後で使用します。）
5. ［戻り値］欄に変数「Output_XML」を、［正常終了］欄に「Complete」、［エラー情報］欄に「Fail」を定義します。［OK］をクリックします。

268

開発者ガイドMagic eDeveloper V9 Plus

Web サービス を呼び出す（ドキュメント形式）

図 21-1 ドキュメント形式の［Web サービス］ダイアログ

パラメータの設定
1. ［コール Web サービス］コマンドの［コールタイプ］欄の［パラ］欄でズームすると［パラメータ］テーブルが表示されます。
［項目］欄でズームして、変数「Input_XML」
を設定します。
同様に、GetItemByID ハンドラにも［コール Web サービス］コマンドを定義します。ここでは、「GetItemByID」メソッドを呼び出すようにします。

入力パラメータ用コンポーネントアプリケーションの定義
このアプリケーションは、入力された検索文字を XML 形式に変換するために使用されます。
「SearchWords」用と、「GetItemByID」用の２つのアプリケーションを定義します。

新規アプリケーションの登録
1. コンポーネントプログラムを作成するために［アプリケーション］テーブルにアプ
リケーションを登録します。
2. 登録したアプリケーションをオープンします。

XCG の実行
1. プルダウンメニューの［コンポーネント／ XML インタフェース］を実行して XCG
を起動します。
2. ［作成］処理を選択し、［Web サービス］ダイアログの［入力 XSD］に表示されていた XSD ファイルを読み込みます。
3. ［作成プログラム］は「書込用プログラムの作成」のみ有効にします。
4. ［スキーマインタフェースの詳細］ダイアログにパラメータの書式が表示されます。
「SearchWords」の場合、［partial］を「1」から「5」に変更します。
（「true」および「false」という文字列を渡す必要があるためです。）また、「Put プログラムの公開」
は有効にしてください。

開発者ガイドMagic eDeveloper V9 Plus269

第 21 章 - Web サービス対応
5. 上記の設定でコンポーネントを作成し、入力するようにしてください。

出力パラメータ用コンポーネントアプリケーションの定義
このアプリケーションは、Web サービスから返された XML データから用語データを取得するために使用されます。
「SearchWords」用と、「GetItemByID」用の２つのアプリケーションを定義します。

新規アプリケーションの登録
1. 「入力パラメータ用コンポーネントアプリケーションの定義」の説明を参照してください。

XCG の実行
1. プルダウンメニューの［コンポーネント／ XML インタフェース］を実行して XCG
を起動します。
2. ［作成］処理を選択し、［Web サービス］ダイアログの［出力 XSD］に表示されていた、XSD ファイルを読み込みます。
3. ［作成プログラム］は「読込用プログラムの作成」のみ有効にします。
4. ［スキーマインタフェースの詳細］ダイアログにパラメータの書式が表示されます。
「GetItemByID」の場合、［meaning］を「30」から「500」に変更します。また、「Get
プログラムの公開」は有効にしてください。
5. 上記の設定でコンポーネントを作成し、入力するようにしてください。

以後、元のホストアプリケーションに処理に戻ります。

入力パラメータの設定処理の定義
コンポーネントアプリケーションの登録
1. コンポーネントリポジトリをオープンし２行追加します。「入力パラメータ用コン
ポーネントアプリケーションの定義」で作成した、２つの MCI ファイルを読み込みます。
例えば、SearchWords の入力用 XSD ファイルをもとに XCG によって作成された MCI
ファイルを読み込むことで、以下のようなオブジェクトが利用できるようになりま
す。
•

テーブル
•

•

SearchWord …… 入力パラメータを XML 化するための作業用テーブル

プログラム
•

Write_SearchWord…… SearchWord テーブルの内容を XML 化します。

•

Put_SearchWord……SearchWord テーブルにデータを追加します。

コンポーネントプログラムを呼び出す
SearchWords ハンドラのコール Web サービスが定義された前の行に、以下の処理を追加
します。

270

開発者ガイドMagic eDeveloper V9 Plus

Web サービス を呼び出す（ドキュメント形式）
1. ［コールプログラム］コマンドを定義し、コンポーネントの Put プログラムを指定します。
2. ［パラメータ］テーブルには、以下のような値を指定します。
コール元
項目
A

コール先

式

内容

コール先パラメータ

型

書式

nn

1

P:Table_ID

N= 数値

5

0

SearchWord

query

A= 文字

30

nn

‘true’

partialA= 文字

5xx: 式番号
3. ［コールプログラム］コマンドを定義し、コンポーネントの Write プログラムを指定します。
4. ［パラメータ］テーブルには、以下のような値を指定します。
コール元
項目

式

コール先
内容

コール先パラメータ

型

書式

nn

（XML ファイル名）

P:File path

A= 文字

300

nn

‘TRUE’LOG

P:UseNamespace

L= 論理

5

SerachWord で指定した値を含んだ XML 形式の内容が、XML ファイル名で指定されたファイルとして出力されます。
5. 項目更新を定義し、File2Blob 関数で XML ファイル名で指定されたファイルを Blob
化して 変数「Input_XML」に代入します。
GetItemByID ハンドラに対しても、［コール Web サービス］コマンドが定義された前の行に同じような処理を追加します。
1. Put プログラムのパラメータは、以下のとおりです。
コール元
項目

コール先

式

内容

コール先パラメータ

型

書式

nn

1

P:Table_ID

N= 数値

5

Item_ID

id

A= 文字

30

B

2. Write プログラムのパラメータは、以下のとおりです。
コール元
項目

式

コール先
内容

コール先パラメータ

型

書式

nn

（XML ファイル名）

P:File path

A= 文字

300

nn

‘TRUE’LOG

P:UseNamespace

L= 論理

5

出力パラメータの取得処理の定義
コンポーネントアプリケーションの登録
1. コンポーネントリポジトリをオープンし、２行追加します。
「出力パラメータ用コン
ポーネントアプリケーションの定義」で作成した、MCI ファイルを読み込みます。
例えば、SearchWords の入力用 XSD ファイルをもとに XCG によって作成された MCI
ファイルを読み込むことで、以下のようなオブジェクトが利用できるようになります。

開発者ガイドMagic eDeveloper V9 Plus271

第 21 章 - Web サービス対応
•

•

テーブル
•

SearchWordResponse
テーブル•

SearchWordResult……メソッドの処理結果をテーブル化する上での親テーブル•

word……WORD クラスの実際のデータが格納されるテーブル……メソッドの処理が完了したかどうかの確認用

プログラム
•

Read_SearchWordResponse…… 指定されたXMLファイルをテーブル化します。

•

DBDEL()……コンポーネントテーブルの内容を初期化します。

•

Get_WORD……WORD テーブルからデータを取得します。

コンポーネントプログラムの呼び出し
SearchWords ハンドラの［コール Web サービス］コマンドが定義された後の行に、以下の処理を追加します。
1. ［項目更新］コマンドを定義し、UTF8FromAnsi 関数で変数「Output_XML」の内容
を UTF8 にエンコードし、変数「Output_XML」を更新します。
（XML 関数は、エンコード指定の無い XML データを UTF-8 として処理するためです。）
2. ［アクション］コマンドを定義し、Blb2File 関数で変数「Output_XML」の内容をファイル化するようにします。
3. ［コールプログラム］コマンドを定義し、コンポーネントの Read プログラムを指定します。
4. ［パラメータ］テーブルには、以下のような値を指定します。
コール元
項目

コール先

式

内容

コール先パラメータ

型

書式

nn

（XML ファイル名）

P:File path

A= 文字

300

nn

‘TRUE’LOG

P:UseNamespace

L= 論理

5

XML ファイル名には、ステップ 2 で指定した出力ファイル名を指定します。
5. イベント実行を定義して、［ビュー再表示］イベントを発行します。

GetItemByID ハンドラでも［コール Web サービス］コマンドが定義された後の行に同じような処理を追加します。
1. Read プログラムのパラメータは、以下のとおりです。
コール元
項目

コール先

式

内容

コール先パラメータ

型

書式

nn

（XML ファイル名）

P:File path

A= 文字

300

nn

‘TRUE’LOG

P:UseNamespace

L= 論理

5

2. ［コールプログラム］コマンドを定義し、コンポーネントの Put プログラムを指定します。
3. ［パラメータ］テーブルには、以下のような値を指定します。
コール元
項目

272

式

コール先
内容

コール先パラメータ

型

書式

開発者ガイドMagic eDeveloper V9 Plus

Web サービス を呼び出す（ドキュメント形式）
コール元

コール先

nn

1

Parent_ID

N= 数値

5

nn

1

Table_ID

N= 数値

5Meaningmeaning

C

500
A= 文字
これにより、変数「Meaning」に Web サービスによって取得された意味情報が代入されます。

コンボボックスの修正
SearchWords ハンドラが実行されると、コンポーネントテーブル（WORD）に見出し
データが入力されます。このテーブルをメインフォーム上のコンボボックスにリンクさせることで、取得した見出しデータから見出しを選択することが容易になります。
1. メインフォームをオープンし、コンボボックス（変数「Item_ID」）を選択します。
2. コントロール特性に以下の設定を行います。
•

ソーステーブル……「WORD」テーブルを指定します。

•

表示項目……「title」カラムを指定します。

•

リンク項目……「id」カラムを指定します。

•

インデックス……「1」を指定します。

コンポーネントのテーブル名やカラム名は、Web サービス側のクラス定義によって決定されます。
3. SearchWord ハンドラの先頭に［コールタスク］コマンドを定義します。
「WORD」
テーブルのレコード削除を行うサブタスクを作成し、このタスクを呼び出すようにします。
（DbDel 関数を実行してテーブルを削除するコンポーネントプログラムも作成されますが、コンボボックスにテーブルがリンクされているため、DbDel 関数では削除できません。）

コール Web サービスの実行
作成したプログラムを実行し、Web サービスプロバイダを呼び出します。

プログラムの実行
1. 上記で作成したプログラムを実行します。
2. ［SerachWord］に「Web サービス」と入力し、見出し検索ボタン（SearchWords イベ
ントを発行）をクリックします。
3. コンボボックス（変数「Item_ID」）をプルダウンすると検索された用語が表示されます。どれかを選択し、用語検索ボタン（GetItemByID イベントを発行）をクリックします。

開発者ガイドMagic eDeveloper V9 Plus273

第 21 章 - Web サービス対応
4. 正常に処理された場合は、変数「Meaning」に意味が返ります。

図 21-2 実行結果

配列項目の扱い方
パラメータ内の配列項目は、Magic のコンポーネントでは別のテーブルとして定義されます。この場合、項目名と項目の型定義名（クラス名）をもとにテーブルやプログラムが作成されます。
ここでは、ITEM クラスの メンバ「aliases」を例にして説明します。aliases には、検索された用語の別の名称が複数返ります。

テーブル•

aliases……aliases データの親テーブル•

MnWORD……aliases の実際のデータが格納されるテーブル
n は数値です。WORD 型のクラスを持つ項目に対して全て ’WORD’ という名前の付いたテーブルが作成されます。aliases テーブルの直後のテーブルが aliases の実際のデータが格納されます。

プログラム

274

•

nnGet_WORD……aliases データを取得します。
（nn は数値です。WORD 型のデータを取得する Get プログラムは、全て Get_WORD となり、先頭の番号で区別されます。このプログラムの前に Put_aliases や Count_aliases プログラムがある場
合、aliases 用の Get プログラムになります。）•

nnCount_WORD……aliases データのデータ数を取得します。

開発者ガイドMagic eDeveloper V9 Plus

Web サービスのプロバイダの構築

Web サービスのプロバイダの構築
Magic は、Web サービスのプロバイダとして動作することもできます。この場合、実行するアプリケーションに対応した WSDL を提供することで、他のクライアントから呼び出すことができます。
ここでは、以下の内容について説明します。
• 環境設定• プログラムの作成• WSDL の作成• プロバイダとして実行

環境設定
Magic が Web サービスのプロバイダになるには、以下の設定が必要です。

動作環境［動作環境］ダイアログの以下の設定を確認してください。

［外部参照］タブ• ［WSDL ファイルのパス］……コンポーネントビルダが作成する WSDL ファイルの保存先のデフォルト値（コンポーネントビルダ側で保存先やファイル名を変更できます。）［アプリケーションサーバ］タブ
インタネットアプリケーションとして動作する環境に設定します。

HTTP サーバ
以下のパスに対するエイリアスが作成されていることを確認してください。
（Magic のイ
ンストーラがデフォルト値を設定します。）• インターネットリクエスタのインストール先
Magic のインストール先の Scripts サブフォルダ …… Magic94Scripts• WSDL ファイルのパス
Web サーバのホームディレクトリの WSDL サブフォルダ …… WSDL

プログラムの作成
Web サービス化できるプログラムは以下の通りです。
• バッチタスク• パラメータは、入力用／入出力用／出力用の３種類として利用できますが、出力用と指定できるのは、最後に定義されたパラメータ項目だけです。
• ［タスク特性］の［戻り値］を指定することでパラメータとは別に戻り値を定義する
ことができます。
• プログラムには、公開名を定義します。公開プログラム名には、DBCS（全角文字や半角カタカナ）を使用できません。パラメータ項目の名前も同様です。

開発者ガイドMagic eDeveloper V9 Plus275

第 21 章 - Web サービス対応

RPC 形式とドキュメント形式
RPC の形式は、データを受け渡す形式が固定長の文字や数値、ドキュメントの形式では可変長の XML です。このため、プログラム、および、Web サービスビルダでの WSDL
ファイルの作成する際の設定には、次のような違いがあります。

プログラム
設定

RPC 形式ドキュメント形式

公開プログラム名

必須

必須

タスク特性／
タスクタイプバッチ

バッチ

パラメータ項目の数

複数可

１つ

パラメータ項目の型

文字型、数値型 (9 桁まで )、論理型

BLOB 型 ( リッチエ
ディット )

戻り値

任意

必須

戻り値の型

文字型、数値型 (9 桁まで )、論理型

BLOB 型 ( リッチエ
ディット )

パラメータのデータ形式

任意

XML 形式Web サービスインタフェースビルダ［公開プログラム用のパラメータ］ダイアログの設定内容は、以下のようになります。
設定

RPC 形式ドキュメント形式

パラメータのXSD タイプ

任意

String( デフォルト )パラメータの順

任意（ただし、OUT パラ
メータは最後のみ可能）

IN

戻り値の XSD タイプ

任意

Base64Binary( デフォルト )スキーマの設定なし

必須
入力パラメータのためのXML スキーマと出力パ
ラメータのための、XMLスキーマを定義した xsd
ファイルが必要

RPC 形式は、WS-I（Web Services Interoperability Organization）で推奨しておりません。クライアント側が Magic アプリケーション以外を想定する場合、ドキュメン
ト形式で作成するようにしてください。

プロバイダ用プログラムの作成（ドキュメント形式）
ここでは、ドキュメント形式のプロバイダ用アプリケーションを開発する手順を説明いたします。
顧客データを検索する Web サービスを例にします。入力として顧客番号の下限値と上限値が渡され、出力としてはその顧客番号の範囲内の顧客情報 (ID、名前、住所 ) を返すというものです。

276

開発者ガイドMagic eDeveloper V9 Plus

プロバイダ用プログラムの作成（ドキュメント形式）

作業概要
ドキュメント形式でプログラムを公開する場合は、以下の作業が必要です。
• 入出力 XML データ形式の決定• 入出力パラメータの XML データのスキーマ情報を記述した XSD ファイルの作成•

入力パラメータの XML データを解析するプログラムの作成• 出力パラメータの XML データを生成するプログラムの作成• Web サービスに公開するためのプログラムの作成• WSDL ファイルの作成
以下これらの作業の詳細を説明します。

入出力 XML データ形式の決定
ドキュメント形式の Web サービスでは、入力・出力パラメータはひとつだけで、それぞれ XML 形式になっています。このため、最初に入力と出力の XML データの形式を決める必要があります。
ここでは、以下のような形式にします。

入力
入力データは、顧客番号の下限値と上限値をそれぞれ最大 5 桁の整数で渡します。この場合、以下のような XML ファイルになります。
<CustRange><Min>1000</Min><Max>9999</Max></CustRange>

出力出力されるデータは、顧客情報 （顧客番号、名前、住所）の一覧になります。この XML
データでは、複数の顧客情報を含むため、<Cust> 以下の要素が複数回繰り返されることになります。
<CustList><Cust><ID>1008</ID><Name> 千葉ペットショップ </Name><Address> 千葉県千葉市千葉町千葉１−２−３ </Address></Cust><Cust><ID>1234</ID><Name> ペットセンター神田 </Name><Address> 東京都千代田区神田２−３−４ </Address></Cust></CustList>

入出力データ用 XSD を作成する
入出力の XML データの形式が決まったら、これに対応した XSD（XML スキーマ定義言語）ファイルを作成します。

開発者ガイドMagic eDeveloper V9 Plus277

第 21 章 - Web サービス対応
XSD 自体はテキストファイルですので、
テキストエディタで作成することもできますが、構造が複雑になってくると煩雑で、誤りも犯しやすくなります。専用の XSD エディタ
（例：XmlSpy 等）を使用することをお勧めします。

入力用 XSD
入力用 XML データの形式は、以下のようになります。
• ルート要素……CustRange• 子要素…… Min と Max という要素があります。
いずれも省略不可で複数指定することも不可で、integer 型です。
これを XSD 記法で表すと、以下のようになります。
<xs:schema targetNamespace="http://magicsoapservice.co.jp/xsd/CustRange.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://magicsoapservice.co.jp/xsd/CustRange.xsd"><xs:element name="CustRange" type="CustRangeType"/><xs:complexType name="CustRangeType"><xs:sequence><xs:element name="Min" type="xs:integer"/><xs:element name="Max" type="xs:integer"/></xs:sequence></xs:complexType></xs:schema>

出力用 XSD
入力用 XML データの形式は、以下のようになります。
• ルート要素…… CustList• 子要素……Cust
この要素は、複数回繰り返すことができます。
各 Cust 要素の子要素として、ID、Name、Address の各要素があります。ID は integer
型、それ以外は string 型です。
これを XSD 記法で表すと、以下のようになります。
<xs:schema targetNamespace="http://magicsoapservice.co.jp/xsd/CustList.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://magicsoapservice.co.jp/xsd/CustList.xsd"/><xs:element name="CustList" type="CustListType"/><xs:complexType name="CustType"><xs:sequence><xs:element name="ID" type="xs:integer"/><xs:element name="Name" type="xs:string"/><xs:element name="Address" type="xs:string"/></xs:sequence></xs:complexType><xs:complexType name="CustListType"><xs:sequence><xs:element name="Cust" type="CustType" minOccurs="0" maxOccurs="unbounded"/></xs:sequence></xs:complexType></xs:schema>

ネームスペースの指定
ドキュメント形式の Web サービスを定義する場合には、XSD に「targetNamespace」を指定する必要があります。

278

開発者ガイドMagic eDeveloper V9 Plus

プロバイダ用プログラムの作成（ドキュメント形式）

入力 XML 解析用のプログラム作成
入力パラメータは XML 形式で渡されますので、その中から Magic のプログラムで使用できるパラメータ値を抽出する必要があります。
この処理は、XCG を使用する方法と、DOM を使用する方法があります。どちらも以下の条件のタスクを作成します。
• バッチタスク• メインテーブル……なし• タスク終了条件……Yes• チェック時期……A= 後置• パラメータ項目•

XML データの入力用……BLOB 型•

顧客番号の最小値……数値型（5Z）•

顧客番号の最大値……数値型（5Z）

XCG を使用する方法
1. 入力用 XSD をもとに XCG でコンポーネントアプリケーションを作成します。
2. コンポーネントアプリケーションを登録します。
3. レコード後処理で以下の処理を定義します。
1. ［アクション］コマンドを定義し、Blb2File 関数で変数「XML データの入力用」の内容を XML ファイルに変換します。
2. ［コールプログラム］コマンドを定義し、コンポーネントの「DBDEL」プログ
ラムを指定します。
3. ［コールプログラム］コマンドを定義し、コンポーネントの「Read_CustRange」
プログラムを指定します。
［パラメータ］テーブルには、以下のような値を指定します。
コール元
コール先
項目

式

内容

コール先パラメータ

型

書式

nn

（XML ファイル名）

P:File path

A= 文字

300

nn

‘FALSE’LOG

P:UseNamespace

L= 論理

5

4. ［コールプログラム］コマンドを定義し、コンポーネントの「Get_CustRange」
プログラムを指定します。
［パラメータ］テーブルには、以下のような値を指定します。
コール元
コール先
項目

式

内容

コール先パラメータ

型

書式

nn

1

Table_ID

N= 数値

5

XX

顧客番号の最小値

Min

N= 数値

9

XX

顧客番号の最大値

Max

N= 数値

9

タイプライブラリ

オブジェクト名

Microsoft XML Vn.n

DOMDocument

DOM を使用する方法
1. 以下の変数項目を追加定義します。
名前型

DOMDocument

O=OLE

開発者ガイドMagic eDeveloper V9 Plus

書式

279

第 21 章 - Web サービス対応
名前型

DOMNode

O=OLE

書式

tmpString

A= 文字

100

戻り値

L= 論理

5

タイプライブラリ

オブジェクト名

Microsoft XML Vn.n

IXMLDOMNode2. レコード後処理で以下の処理を定義します。
1. ［コール COM］コマンドを定義し、以下のパラメータを設定します。
DOMDocument
オブジェクトオプション

C= メソッド呼出メソッド

loadXML

パラメータ

bstrXML……変数「XML データの入力用」を指定します。

戻り値

戻り値

2. ［コール COM］コマンドを定義し、以下のパラメータを設定します。
DOMDocument
オブジェクトオプション

C= メソッド呼出メソッド

selectStringNode

パラメータ

queryString……式で「CustRange/Min」を指定します。

戻り値

DOMNode3. ［コール COM］コマンドを定義し、以下のパラメータを設定します。
DOMNodeオブジェクトオプション

G= プロパティの取得

プロパティ

text

戻り値

tmpString

4. 変数「tmpString」を Val 関数で数値型に変換し、変数「顧客番号の最小値」に入力します。
5. ［コール COM］コマンドを定義し、以下のパラメータを設定します。
DOMDocument
オブジェクトオプション

C= メソッド呼出メソッド

selectStringNode

パラメータ

queryString……式で「'CustRange/Max'」を指定します。

戻り値

DOMNode6. ［コール COM］コマンドを定義し、以下のパラメータを設定します。
DOMNodeオブジェクトオプション

G= プロパティの取得

プロパティ

text

戻り値

tmpString

7. ［項目更新］コマンドを定義し、Val 関数で変数「tmpString」を数値型に変換した値を変数「顧客番号の最大値」に入力します。

280

開発者ガイドMagic eDeveloper V9 Plus

プロバイダ用プログラムの作成（ドキュメント形式）

出力 XML データ作成用のプログラム作成
入力パラメータを用いてレコードを抽出し、その内容を XML データ変換するプログラムを作成します。
この処理は、XCG を使用する方法とマージ処理を使用する方法があります。どちらも以下の条件のタスクを作成します。
• バッチタスク• メインテーブル……「顧客テーブル」• タスク終了条件……Yes• チェック時期……A= 後置• パラメータ項目
名前型

XML データの出力

B=BLOB

書式

顧客番号の最小値

N= 数値

5Z

顧客番号の最大値

N= 数値

5Z

• 「顧客テーブル」の実項目•

顧客番号（［範囲小］欄に「顧客番号の最小値」、［範囲大］欄に「顧客番号の最大値」を設定します。）

•

顧客名

•

住所

XCG を使用する方法
1. 出力用 XSD をもとに XCG でコンポーネントアプリケーションを作成します。
2. コンポーネントアプリケーションを登録します。
3. レコード前処理で以下の処理を定義します。
1. ［コールプログラム］コマンドを定義し、コンポーネントの「DBDEL」プログ
ラムを指定します。
4. レコード後処理で以下の処理を定義します。
1. ［コールプログラム］コマンドを定義し、コンポーネントの「Put_CustList」プ
ログラムを指定します。
［パラメータ］テーブルには、以下のような値を指定します。
コール元
コール先
項目

式

内容

コール先パラメータ

型

書式

nn

1

P:Table_ID

N= 数値

5

2. ［コールプログラム］コマンドを定義し、コンポーネントの「Put_Cust」プログ
ラムを指定します。
［パラメータ］テーブルには、以下のような値を指定します。
コール元
コール先
項目

式

内容

コール先パラメータ

型

書式

nn

1

P:Parent_ID

N= 数値

5

nn

Counter(0)P:Table_ID

N= 数値

5

XX

顧客番号

ID

N= 数値

9

XX

顧客名

Name

A= 文字

30

XX

住所

Address

A= 文字

30

開発者ガイドMagic eDeveloper V9 Plus281

第 21 章 - Web サービス対応
5. タスク後処理で以下の処理を定義します。
1. ［コールプログラム］コマンドを定義し、コンポーネントの「Write_CustList」
プログラムを指定します。
［パラメータ］テーブルには、以下のような値を指定します。
コール元
コール先
項目

式

内容

コール先パラメータ

型

書式

nn

（XML ファイル名）

P:File Path

A= 数値

300

nn

‘FALSE’LOG

p:UseNamespace

L= 論理

5

2. ［項目更新］コマンドを定義し、XML ファイルを File2Blb 関数で変換し、変数「XML データの出力」に入力します。

マージ処理を使用する方法
1. XML ファイルを出力するためのマージファイルを作成します。（赤字は、マージタ
グです。）<?xml version="1.0" encoding="Shift̲JIS"?><CustList><!$MGREPEAT><Cust><ID> <!$MG̲ID> </ID><Name> <!$MG̲NAME> </Name><Address> <!$MG̲ADDR> </Address></Cust><!$MGENDREPEAT></CustList>

2. ［入出力ファイル］テーブルに１行追加します。パラメータは以下の通りです。
•

名前……任意•メディア……V= 項目•

アクセス……A= 追加•

フォーマット……L= ライン•

式／項目……変数「XML データの出力」

3. ［フォーム］テーブルに１行追加します。パラメータは以下の通りです。
•

名前……任意•クラス……1•

アクセス……A= 追加•

インタフェースタイプ……M=HTML マージ形式•

XML 出力……Yes•

タグテーブル……［タグ］テーブルに以下のように設定します。
タグ名

項目

名前

書式

ID

XX

顧客番号

5Z

NAME

XX

顧客名

20

ADDR

XX

住所

40

4. レコード後処理で以下の処理を定義します。
1. ［データ出力］コマンドを定義し、#1 で定義した入出力ファイルと #2 で定義したマージフォームを設定します。

282

開発者ガイドMagic eDeveloper V9 Plus

プロバイダ用プログラムの作成（ドキュメント形式）

Web サービスの公開用プログラムを作成
次に、Web サービスの入り口となる Magic プログラムを作成します。以下の条件のタスクを作成します。
• バッチタスク• 公開プログラム名を設定• メインテーブル……なし• タスク終了条件……Yes• チェック時期……A= 後置
1. 以下のような変数を定義します。
名前型

入力用のパラメータ項目

B=BLOB

書式

備考
リッチエディット

出力用の変数項目

B=BLOB

リッチエディット
［タスク特性］の［戻り値］に割り当てます。

v_ 最小顧客番号

N= 数値

5Z

v_ 最大顧客番号

N= 数値

5Z

2. レコード後処理で以下の処理を定義します。
1. ［コールプログラム］コマンドを定義し、入力 XML の解析プログラムを指定します。
［パラメータ］テーブルには、以下のような値を指定します。
コール元
コール先
項目

内容

コール先パラメータ

型

XX

式

RTF_BLOB

XML データの入力用

B=BLOB

書式

XX

v_ 最小顧客番号

顧客番号の最小値

N= 数値

5Z

XX

v_ 最大顧客番号

顧客番号の最大値

N= 数値

5Z

2. ［コールプログラム］コマンドを定義し、出力 XML の作成プログラムを指定します。
［パラメータ］テーブルには、以下のような値を指定します。
コール元
コール先
項目

式

内容

コール先パラメータ

型

書式

XX

RTF_BLOB

XML データの出力用

B=BLOBXX

v_ 最小顧客番号

顧客番号の最小値

N= 数値

5Z

XX

v_ 最大顧客番号

顧客番号の最大値

N= 数値

5Z

WSDL の作成
WSDL は、Web サービスインタフェースビルダ（以下、WIB と略します。）で作成します。

WSDL 用コンポーネントを登録する：
1. プルダウンメニューの［コンポーネント／ Web サービスインタフェース］をクリッ
クして WIB を起動します。
2. １行追加して［コンポーネント名］を入力します。

開発者ガイドMagic eDeveloper V9 Plus283

第 21 章 - Web サービス対応
3. ［追加］ボタンをクリックします。
［プログラム一覧］が表示され、公開プログラム
名が定義されたバッチタスクのみ表示されます。
4. Web サービスとして公開したいプログラムを選択し、［OK］をクリックします。
プログラム渡すパラメータと戻り値の指定を行います。

パラメータを定義する：
1. 任意のプログラムにカーソルを移動して［パラメータ／戻り値］カラムでズームすると、［公開プログラムのパラメータ］ダイアログが表示されます。
2. プログラムに定義されたパラメータ／戻り値とそれに対応する WSDL 側の タイプが表示されます。

図 21-3［公開プログラムのパラメータ］ダイアログ

3. ［XSD タイプ］カラムでは、パラメータ項目の型に対応した XML データ型を指定します。ここでは、「string」を指定します。
4. ［順」カラムは、パラメータが入力用か出力用かを指定するものです。ここでは、「In」にします。
5. ［戻り値］欄は、［タスク特性］の［戻り値］に値が指定されている場合に表示されます。［base64Binary］を選択します。
6. 文字型または BLOB 型のパラメータが１つだけ定義されているプログラムの場合、［スキーマ］ボタンが有効になります。ここをクリックすることで、WSDL にスキー
マを組みこむことができます。

スキーマ情報を定義する：
1. ［スキーマ情報の設定］ダイアログには、入力／出力のそれぞれのスキーマを指定することができます。指定方法は同じです。

284

開発者ガイドMagic eDeveloper V9 Plus

プロバイダ用プログラムの作成（ドキュメント形式）

図 21-4［スキーマ情報の設定］ダイアログ

2. ［XSD ファイル］欄に XSD ファイルを URL 形式で指定します。
（この内容が、WSDL
ファイル内に書き込まれるため、通常のパス形式で指定しないでください。URL で指定するので、XSD ファイルは HTTP サーバでアクセスできる場所に配置しておいてください。）
3. ［>>］ボタンをクリックすると［ネームスペース］欄と［エレメント］欄に値が挿入されます。
4. 入力／出力のそれぞれのスキーマを設定すると［OK］ボタン有効になります。
［OK］
ボタンをクリックしてダイアログを閉じます。
［公開プログラムのパラメータ］ダイアログの［OK］ボタンをクリックしてダイアログを閉じます。
WSDL ファイルの作成場所や終端（URL）を変更する場合は、［設定］ダイアログで行います。

サービス特性を変更する：
1. サービス特性を設定したいコンポーネント（アプリケーション）上にカーソルがある状態で［オプション／設定］のプルダウンメニューをクリックします。

開発者ガイドMagic eDeveloper V9 Plus285

第 21 章 - Web サービス対応

図 21-5［設定］ダイアログ

2. ［設定］ダイアログでは、以下の内容を設定できます。
•

説明……このコンポーネントの内容を記述します。

•

レビジョン……このコンポーネントのレビジョンを記述します。
説明とレビジョンは、動作には影響しません。

•

WSDL ファイル……WSDL ファイルを作成するパスとファイル名を指定できます。デフォルト値は、［動作環境］ダイアログの［外部参照］タブの［WSDL
ファイルのパス］と「コンポーネント名」をもとに決定されます。

•

サービス終端……Web サービスを実行する場合のクライアント側がアクセスする URL。
（HTTP サーバのエイリアスが作成されている場所になるようにしてください。）デフォルト値は、［動作環境］ダイアログの［アプリケーションサー
バ］タブの［HTTP リクエスタ］を元に決定されます。

•

WSDL ネームスペース……システムで使用される名前です。変更する必要はあ
りません。

•

ヘッダ情報……アプリケーションを呼び出す際に、ユーザ ID とパスワードを渡したい場合にチェックします。

3. ［OK］をクリックすることで指定した内容が登録されます。

WDSL を作成する：
1. WSDL を作成したいコンポーネント（アプリケーション）上にカーソルがある状態
で［オプション／ WSDL ファイル作成］のプルダウンメニューをクリックします。
2. 作成に成功した場合は、「WSDL ファイルの作成に成功しました！」と表示されます。指定したフォルダが存在しなかったり、ファイルがすでに存在している場合は、確認のダイアログが表示されます。

プロバイダとして実行
Magic を Web サービスのプロバイダとして動作させる：
1. HTTP サーバを実行します。
2. Magic を実行モードにします。Mgrb.ini で Autoload が設定されている場合は、自動的にエンジンが起動されます。
3. Magic をクライアントとして確認する場合は、Web サービスインタフェースビルダで作成された WSDL ファイルをアシスト機能で読み込むことで対応できます。

ヘッダ付きの Web サービスを呼び出す：
WIB で［ヘッダ情報］を有効にして作成した WSDL を読み込むと、クライアント側で
ユーザ ID やパスワードを指定することができます。
この指定は必須ではありませんが、実行させるプログラムに特定のユーザでしか実行できないような権利設定がある場合、ユーザ ID を渡す必要があります。
1. コールリモートコマンドの［パラ］欄でズームします。
2. ［パラメータ］テーブルの１行目が、ヘッダ情報になります。（［ヘッダ］カラムがチェックされています。）
3. １行目の［式］カラムでズームして以下の式を定義します。
'<username> ユーザ ID</username><password> パスワード </password>'「ユーザ ID」と「パスワード」には、アプリケーションサーバ上の Magic 側に登録さ286

開発者ガイドMagic eDeveloper V9 Plus

プロバイダ用プログラムの作成（ドキュメント形式）
れているユーザ ID とパスワードを指定してください。
4. ２行目以降は、プログラムに渡すパラメータを指定してください。

DIME を使用した添付ファイルの処理
DIME(Direct Internet Message Encapsulation) とは、XML ドキュメント内に動画や画像、音声データなどのバイナリデータを埋め込むための仕組みです。Magic は、Web サービスのプロバイダ機能において DIME をサポートします。DIME による添付ファイルを含んだ SOAP データは例えば以下のような構造になっています。
<?xml version="1.0" encoding="utf‑8"?><soap:Envelope .........><soap:Header>..........
</soap:Header><soap:Body><GetDimedImage xmlns="http://tempuri.org/"><images><string> 添付データのファイル名 </string></images></GetDimedImage></soap:Body></soap:Envelope>
添付データ

添付データは、Envelope タグの外にあるため、パラメータを使用して受け渡しすることができません。Magic プログラムでは、WsAttachmentAdd /WsAttachmentGet 関数を使用して受け渡しします。ここでは、クライアントから送信された Web サービスメッセージから画像ファイルなどの添付データを取り込むプログラムとクライアントに添付データを返すプログラムを紹介します。
Magic アプリケーションがプロバイダとして動作している場合でのみ有効です。このため、クライアントは他のツール（C#）等で開発されたプログラムを使用することになります。クライアント側のプログラムについては、Microsoft の WSE（WebService Enhancement）を参考にしてください。
また、ドキュメント形式でサービスが公開されていることを前提としています。
RPC 形式で呼び出された場合、添付ファイルの取得ができない場合があります。
これ以降の説明は、添付データの取得のみを目的としているため、入出力パラメータの内容は意識しません。このためスキーマについては任意に用意してください。

ドキュメント形式用 Web サービスプログラム
Web サービスのプロバイダ用 Magic プログラムを作成します。
［タスク特性］には以下のように定義します。
• タスクタイプ……B= バッチ• タスク終了条件……Yes• チェック時期……B= 前置

パラメータ項目の定義添付される画像データは、Magic のパラメータには渡りません。このため、パラメータが無くても画像データを受け取ることはできますが、ドキュメント形式のプロバイダプ
ログラムとして WSDL ファイルを作成するために入力用と出力用として BLOB 型のパラ
メータ項目と変数項目を定義します。
• 入力パラメータ……P= パラメータ

開発者ガイドMagic eDeveloper V9 Plus287

第 21 章 - Web サービス対応• 出力パラメータ……V= 変数［タスク特性］の［戻り値］欄には、「出力パラメータ」を指定します。

画像データの受け取り処理を組みこむ
DIME メッセージから添付ファイルを取得するには、WsAttachmentGet 関数を使用します。この場合、以下の２通りの方法があります。
• 添付ファイル毎に指定された UUID
（Universaly Unique IDentifier）を指定して取り出す。
• 添付ファイルのインデックスを指定して取り出す。
UUID を指定して取り出すには、あらかじめその値を知っている必要があります。UUIDを指定した XML データをパラメータとして渡すことで実現できます。ここでは、インデックスを指定して取り出す方法について説明します。
基本となる Web サービスプログラムに以下の処理を追加します。

変数の追加
レコードメインに以下の変数を追加します。
名前

型

書式

備考

Blob Vector

V= ベクトル

セルモデルとして
BLOB 型のモデルを定義します。

この中に画像データを格納します

LoopSwitch

L= 論理

5

取得処理の追加
レコード後処理に以下の処理を追加します。
1. 項目更新処理コマンドで変数「LoopSwitch」を初期化（False）します。
2. ブロック処理コマンドで「Loop」を指定します。ループ条件は、変数「LoopSwitch」
が「True」です。
［戻］欄に変数「LoopSwitch」を指定します。（これにより DIME データが取得できなかった場合にループから抜けるようになります。
）
3. ブロック内にアクション処理コマンドを指定し、以下の式を指定します。
VecSet ( 変数「Blob Vector 」,LoopCounter (),WsAttachmentGet (LoopCounter ()))
これで、クライアントから送られた添付メッセージを順番に取り出し、ベクトルデータとして保存します。

画像データの添付処理を組みこむ
メッセージにファイルを添付するには、WsAttachmentAdd 関数を使用します。ここでは、固定のファイル名を指定した添付処理を組みこみます。
基本となる Web サービスプログラムに以下の処理を追加します。

変数の追加
レコードメインに以下の変数を追加します。
名前

型

書式

UUID

A= 文字

30

添付処理の追加

288

レコード後処理に以下の処理を追加します。

開発者ガイドMagic eDeveloper V9 Plus

プロバイダ用プログラムの作成（ドキュメント形式）
1. 項目更新処理コマンドで変数「UUID」を以下の式で行進します。
WsAttachmentAdd (File2Blb ( 画像ファイル名 ))2. #1 の処理を添付する画像ファイル数分定義します。
WsAttachmentAdd 関数は、UUID 値が返りますが、メッセージを受け取るプログラ
ムがインデックスを使用して添付ファイルを取得する場合は渡す必要がありません。
受け取りプログラムが UUID で添付ファイルを取得するような場合は、UUID を含んだ XML データを戻り値にして返す必要があります。

開発者ガイドMagic eDeveloper V9 Plus289

第 21 章 - Web サービス対応［このページは意図的に空白にしています。］

290

開発者ガイドMagic eDeveloper V9 Plus

COM 対応

22

Magic は、OS に登録された COM(Common Object Model) オブジェクトを扱うことができます。これによって Magic から他のアプリケーションを呼び出すことができます。
GUI フォーム上に追加された ActiveX コントロールとして使用したり、OLE オートメー
ション機能を利用して OLE オブジェクトとして使用することができます。
また、Magic のプログラムを COM オブジェクトとして、他のアプリケーションから呼び出すようにすることもできます。

この章では以下の手順について説明いたします。
COM コンポーネントを呼び出す（ActiveX オブジェクト） 292 ページ
COM コンポーネントを呼び出す（OLE オブジェクト）

297 ページ

DCOM コンポーネントを呼び出す

306 ページ

Magic アプリケーションの COM コンポーネント化

309 ページ

Magic アプリケーションのリモート COM コンポーネント
化

312 ページ

開発者ガイドMagic eDeveloper V9 Plus291

第 22 章 - COM 対応

COM コンポーネントを呼び出す（ActiveX オブジェクト）
ここでは、既存の ActiveX オブジェクトを呼び出す方法について説明いたします。Magicのフォーム上で Web ブラウザ機能を実現するプログラムを例にとって説明いたします。

COM コンポーネントの指定
アクセスする COM コンポーネントを指定するには、ActiveX 型の変数を定義する必要があります。Magic のフォームにオブジェクトを表示させる場合は、ActiveX 型にしなければなりません。別のアプリケーションとして呼び出す場合は、OLE 型にしてください。

COM コンポーネントを指定する：
1. プログラムに変数を定義します。（変数名：MS Web Browser）
2. 変数の型は、「X=ActiveX」を指定します。
3. 変数特性の［オブジェクト名］でズームします。現在の PC で指定できる ActiveX コ
ンポーネントの一覧が表示されます。
4. 「Microsoft Web Browser」を選択します。

図 22-1Active-X コンポーネントの一覧

5. その他、以下のような変数を定義します。
名前

型

書式

URL

A= 文字

256

Text Message

A= 文字

100（ステータス表示用

6. ［ユーザイベント］テーブルを開き、「実行」と「中断」という名前の２つのユーザイベントを定義します。（イベントタイプは、どちらも「N= なし」です。
）

フォームの定義
タスクのメインフォームに以下のようなコントロールを配置します。

292

開発者ガイドMagic eDeveloper V9 Plus

COM コンポーネントを呼び出す（ActiveX オブジェクト）• 変数「URL」（URL の入力用）• 変数「MS Web Browser」（ホームページが表示されるのでなるべく大きなサイズにしてください。）• 変数「Text Message」（ステータス表示用としてフォームの最下部に配置します。）• プッシュボタン
•実行用……［実行イベント］に、「実行」イベントを割り当ててます。

•

中断用……［実行イベント］に、「中断」イベントを割り当ててます。

参照処理［実行］ボタンをクリックすることでホームページが表示される処理を定義します。
「実行」イベントをトリガとしたハンドラを作成して以下の処理を定義します。

参照処理を定義する：
1.［項目更新］コマンドで変数「Text Message 」を以下の内容に更新するよう設定します。
Trim（変数「URL」）&’ の表示 ’
2. ［コール］処理コマンドを定義し、オプションで「C=COM」を選択します。
3. さらに右側の欄でズームすると［コール COM オブジェクト］ダイアログが表示されます。それぞれ以下のように指定します。
•

オブジェクト：変数「MS Web Browser」を指定•

オプション：C= メソッドの呼び出し•

メソッド：Navigate2（ここでズームするとオブジェクト一覧が表示されます。
Navigate2 にカーソルを合わせて［選択］をクリックします。
）

図 22-2 メソッドの選択•

パラメータ：パラメータテーブルには５つのパラメータが表示されますが、必須なものは、「URL」のみです。
•

開発者ガイドMagic eDeveloper V9 Plus

URL……変数「URL」を指定します。

293

第 22 章 - COM 対応
これで、URL を指定して［実行］ボタンをクリックすると指定したホームページが表示されます。

図 22-3 実行結果

中断処理
［中断］ボタンをクリックすることで表示の処理を中断する処理を定義します。
「中断」
イベントをトリガとしたハンドラを作成して以下の処理を定義します。

中断処理を定義する：
1. ［項目更新］コマンドで変数「Text Message 」を空白 (‘’) に更新するよう設定します。
2. ［コール］処理コマンドを定義し、オプションで「C=COM」を選択します。
3. さらに右側の欄でズームすると［コール COM オブジェクト］ダイアログが表示されます。それぞれ以下のように指定します。
•

オブジェクト：変数「MS Web Browser」を指定•

オプション：C= メソッドの呼び出し•

メソッド：Stop

これで、URL を指定して表示処理中に［中断］ボタンをクリックするとホームページの表示処理が中断されます。

処理中のステータス表示処理
ホームページの表示処理中に実行中を表すステータスメッセージを表示する処理を定義します。ActiveX イベントをトリガとしたハンドラを作成します。

ActiveX イベントを定義する：
1. タスク定義ウィンドウで１行追加します。
［レベル］は「H= ハンドラ」を指定します。
2. ［イベント］欄でズームし、イベントダイアログを表示します。
［イベントタイプ］
は、「X=ActiveX」を選択します。
3. ［イベント］欄でズームすると ActiveX イベントダイアログが表示されます。
［オブ

294

開発者ガイドMagic eDeveloper V9 Plus

COM コンポーネントを呼び出す（ActiveX オブジェクト）
ジェクト］欄で、変数「MS Web Browser」を選択します。
4. ［イベント］欄でズームするとオブジェクト一覧が表示されます。
「ProgressChange」
を選択します。
（ダウンロード処理の進行がオブジェクト上で更新される場合にこのイベントが発生します。）

図 22-4Active-X イベントの設定

5. このハンドラに対応する［処理テーブル］で項目更新コマンドを定義し、変数「Text
Message」を以下の値に更新するよう設定します。
Trim（変数「Text Message」）&’.’
これによって、表示処理中にステータスメッセージの右側に’.’ が追加された表示になり、
プログレスバーのような機能を実現させることができます。

処理終了時のステータス表示処理
ホームページの表示処理の終了を表すステータスメッセージを表示する処理を定義します。ActiveX イベントをトリガとしたハンドラを作成します。

ActiveX イベントを定義する：
1. タスク定義ウィンドウで１行追加します。
［レベル］は「H= ハンドラ」を指定します。
2. ［イベント］欄でズームし、イベントダイアログを表示します。
［イベントタイプ］
は、「X=ActiveX」を選択します。
3. ［イベント］欄でズームすると ActiveX イベントダイアログが表示されます。
［オブジェクト］欄で、変数「MS Web Browser」を選択します。
4. ［イベント］欄でズームするとオブジェクト一覧が表示されます。
「DocumentComplete」を選択します。
5. このハンドラに対応する［処理テーブル］で項目更新コマンドを定義し、変数「Text
Message」を以下の値に更新するよう設定します。

開発者ガイドMagic eDeveloper V9 Plus295

第 22 章 - COM 対応
Trim（変数「URL」）&’ の表示が終了しました。’
これによって、表示終了後にステータスメッセージが更新されるようになります。
COM オブジェクトの内容については、オブジェクトの提供先の情報を参照してください。

多次元配列データを渡す
COM コンポーネントに対して配列データを渡す必要がある場合、ベクトル型のデータを使用することができます。その際、多次元配列にする場合に、セルモデルをベクトル型のモデルにすることで実現できます。
ここでは、VB のチャートコントロール（Microsoft Chart Control）を例にとって２次元配列のデータを COM コンポーネントに渡す方法を説明します。

COM コンポーネントを指定する：
1. プログラムに ActiveX 型の変数を定義します。
（変数名：Chart）
2. 変数特性の［オブジェクト名］に、「Microsoft Chart Control」を設定します。

配列用変数を定義する：
1. モデルリポジトリに以下の２つのモデルを定義します。
名前

クラス

型

書式

セルモデル

文字列セル

F= 項目

A= 文字

3

−

ベクトルセルF= 項目

V= ベクトル−

文字列セル

2. プログラムに以下の２つの変数を定義します。
名前

型

セルモデル

配列

V= ベクト

文字列セル

配列の配列

V= ベクトル

ベクトルセル

3. 実行用のユーザイベントを定義し、このイベントをトリガとしたハンドラを定義します。また、メインフォームを開き以下のコントロールを配置します。
•

変数「Char」（デフォルトのグラフが表示されます。）•

プッシュボタン（ユーザイベントを割り当てます。）

配列にデータを設定し、グラフを表示させる：
ハンドラの処理テーブルに以下の処理を定義します。シンボル名は以下の通りです。
•

A: 変数「配列」のシンボル名•

B: 変数「配列の配列」のシンボル名

1. 配列にデータを入力します。

296

処理コマンド式

アクション

VecSet ('A'VAR,1,’A’)

アクション

VecSet ('A'VAR,2,’B’)

アクション

VecSet ('A'VAR,3,’C’)

アクション

VecSet ('B'VAR,1,A)

開発者ガイドMagic eDeveloper V9 Plus

COM コンポーネントを呼び出す（OLE オブジェクト）
この処理により、配列｛’A’,’B’,’C’｝が変数「配列の配列」に格納されます。
（チャートコントロールの最初のデータは、データのラベルになります。）
2. 同様に、配列データを入力します。
処理コマンド式

アクション

VecSet ('A'VAR,1,’10’)

アクション

VecSet ('A'VAR,2,’20’)

アクション

VecSet ('A'VAR,3,’30’)

アクション

VecSet ('B'VAR,2,A)

同じような方法で、以下のような配列データを定義します。
{｛’A’,’B’,’C’｝,｛’10’,’20’,’30’｝,｛’40’,’50’,’60’｝,｛’70’,’80’,’90’｝}
3. ［コール COM］コマンドで配列データを COM オブジェクトに設定します。
•

オブジェクト：変数「Chart」を指定•

オプション：S= プロパティの指定•

プロパティ：ChartData•

プロパティ値：変数「配列の配列」を指定

4. このプログラムを実行すると以下のようなグラフが表示されます。

図 22-5 グラフ表示

COM コンポーネントを呼び出す（OLE オブジェクト）
ここでは、既存の OLE オブジェクトを呼び出す方法の例として、Magic プログラムより
Microsoft Excel（以下、Excel と略します。）を制御するためのいくつかのプログラム例を紹介いたします。

開発者ガイドMagic eDeveloper V9 Plus297

第 22 章 - COM 対応

COM コンポーネントの指定
Excel を Magic とは別のアプリケーションとして呼び出すため、以下の OLE 型の変数を定義します。
変数名

タイプライブラリ

オブジェクト名

Excel Object Application

Microsoft Excel 10.0 Object Library ※Application

Excel Object WorkBook

Workbook

Excel Object WorkSheet

Worksheet

Excel Object Range

Range※ タイプライブラリは、インストールされた Excel のバージョンによって表示が異なり
ます。

共通事項
• サブオブジェクト名：指定しません• インスタンス化：N= なし

各処理用の Magic プログラム
以下、Excel を制御するための Magic プログラムについて説明します。

Excel の起動
（Excel Object Application の［インスタンス化］特性を「A= 自動」にすると、プログラムの実行時に自動的に Excel が起動されまが、ここでは自動起動を行いません。）
CreateObject 関数で変数「Excel Object Application」のインスタンスを作成することで Excelが起動されます。
以後、このインスタンス化されたオブジェクトを使用します。

ファイルを開く［コール COM］コマンドを以下のパラメータで実行します。
オブジェクトExcel Object Application

オプション

C= メソッド呼出メソッド

Workbooks.Open

パラメータ

Filename……オープンするファイル名を指定します。
これ以外のパラメータは任意です。

戻り値

Excel Object WorkBook

以下のパラメータで［コール COM］コマンドを実行することで、ツールメニューも表示されます。
オブジェクトExcel Object WorkBook

オプション

S= プロパティの設定

プロパティ

Workbooks.Visible

プロパティ値

値……［式］欄に「’TREU’LOG」を設定します。

以後、Excel Object WorkBook は、ここで取得されたオブジェクトを使用します。

298

開発者ガイドMagic eDeveloper V9 Plus

COM コンポーネントを呼び出す（OLE オブジェクト）

ワークブックを追加する［コール COM］コマンドを以下のパラメータで実行します。
オブジェクトExcel Object Application

オプション

C= メソッド呼出メソッド

Workbooks.Add

パラメータ（指定しません。）

戻り値

Excel Object WorkBook

以後、Excel Object WorkBook は、ここで取得されたオブジェクトを使用します。

ワークシートを追加する［コール COM］コマンドを以下のパラメータで実行します。
オブジェクトExcel Object WorkBook

オプション

C= メソッド呼出メソッド

Worksheets.Add

パラメータ（指定しません。）

戻り値

Excel Object WorkSheet

以後、Excel Object WorkSheet は、ここで取得されたオブジェクトを使用します。

ワークシートを指定する
以下の［コール COM］コマンドでワークシート名を指定します。
オブジェクトExcel Object WorkBook

オプション

G= プロパティの取得

プロパティ

Worksheets.Item

パラメータ

Index……オープンするシート名を指定します。

戻り値

Excel Object WorkSheet

以後、Excel Object WorkSheet は、ここで取得されたオブジェクトを使用します。
以下の［コール COM］コマンドで、指定されたワークシートに切り替わります。
オブジェクトExcel Object WorkSheetオプション

C= メソッド呼出メソッド

Activate

ワークシートにデータを送る
ワークシートにデータを送る場合は、ベクトル型項目を使用します。各行毎のデータをベクトル型の変数に挿入し、そのベクトル項目を更に別のベクトル型の変数に行単位で挿入したものを Excel に渡します。
ここでは、「Value1」、「Value2」の２つのカラムを持つテーブルの内容をワークシートに送る場合の手順を説明します。

ベクトルデータを作成する

開発者ガイドMagic eDeveloper V9 Plus299

第 22 章 - COM 対応
1. 次のモデルを定義します。
名前

型

文字列

A= 文字（30）ベクトル

V= ベクトルセルモデル
文字列

2. 次の変数を定義します。
名前

型

セルモデル

文字列ベクトルV= ベクトル

文字列

ベクトルのベクトル

V= ベクトルベクトル

3. デーブルデータをベクトルデータ化するためのバッチタスクを作成します。この
タスクのメインテーブルは、データ元のテーブルです。
1. タスク前処理に以下の処理を定義し、タイトル行をベクトル化します。
処理コマンド式
アクション

VecSet ( 変数「文字列ベクトル」,1,'Value1')

アクション

VecSet ( 変数「文字列ベクトル」,2,'Value2')

アクション

VecSet ( 変数「ベクトルのベクトル」,1, 変数「文字列ベクトル )2. レコード後処理に以下の処理を定義し、データをベクトル化します。
処理コマンド式
アクション

VecSet ( 変数「文字列ベクトル」,1, 項目「Value1」)

アクション

VecSet ( 変数「文字列ベクトル」,2, 項目「Value2」)

アクション

VecSet ( 変数「ベクトルのベクトル」,Counter(0)+1, 変数「文字列ベクトル )ベクトルデータを Excel に送る
1. 次の［コール COM］を実行してセルの範囲オブジェクトを取得します。
オブジェクトExcel Object WorkSheetオプション

G= プロパティの取得

プロパティ

Range

パラメータ

Cell1……範囲の開始セル（例：’A1’）
Cell2……範囲の終了セル（例：’B4’）

戻り値

Excel Object Range

以下 Excel Object Range は、ここでの戻り値を使用します。
2. 次の［コール COM］を実行して対象となるセルの範囲を指定します。
オブジェクトExcel Object Ranget

オプション

S= プロパティの設定

プロパティ

Value2

プロパティ値

値……変数「ベクトルのベクトル」

3. 次の２つの［コール COM］を実行して表示を整えます。

300

オブジェクトExcel Object WorkSheetオプション

C= メソッド呼出メソッド

Columns.AutoFit

開発者ガイドMagic eDeveloper V9 Plus

COM コンポーネントを呼び出す（OLE オブジェクト）

オブジェクトExcel Object Application

オプション

S= プロパティの設定

プロパティ

Visibleプロパティ値

値……［式］に「’TRUE’LOG」を設定

グラフを表示させる
ワークシートの指定した範囲のデータをもとにしたグラフを表示させます。
1. 次の［コール COM］を実行してセルの範囲オブジェクトを取得します。
オブジェクトExcel Object WorkSheetオプション

G= プロパティの取得

プロパティ

Range

パラメータ

Cell1……範囲の開始セル（例：’A1’）
Cell2……範囲の終了セル（例：’B4’）

戻り値

Excel Object Range

以下 Excel Object Range は、ここでの戻り値を使用します。
2. 次の［コール COM］を実行してセルの範囲を指定します。
オブジェクトExcel Object Ranget

オプション

C= メソッド呼出メソッド

Select3. 次の［コール COM］を実行してグラフの追加を指定します。
オブジェクトExcel Object WorkBook

オプション

C= メソッド呼出メソッド

Charts.Add

パラメータ（指定しません。）

4. 次の［コール COM］を実行してグラフの種類を指定します。
オブジェクトExcel Object WorkBook

オプション

S= プロパティの指定

プロパティ

ActiveChart.ChartType

プロパティ値

値……グラフの種類を数値で指定します。
［値］ボタンをクリックすると指定できる値の一覧が表示されます。

5. 次の［コール COM］を実行してグラフの対象となるデータの範囲を指定します。
オブジェクトExcel Object WorkBook

オプション

C= メソッド呼出メソッド

ActiveChart.SetSourceData

パラメータ

Source……Excel Object Range
PlotBy……（指定しません。）

開発者ガイドMagic eDeveloper V9 Plus

301

第 22 章 - COM 対応
6. 次の［コール COM］を実行してグラフの表示場所を指定します。
オブジェクトExcel Object WorkBook

オプション

C= メソッド呼出メソッド

ActiveChart.Location

パラメータ

Where……1 〜 2 の数値を指定します。
Name……（Where が「2」の場合、表示するシートの名前を指定します。）

7. 次の［コール COM］を実行してグラフを表示します。
オブジェクトExcel Object WorkBook

オプション

S= プロパティの指定

メソッド

ActiveChart.Visible

プロパティ値

値……-1

ワークシートのデータを取得する（範囲内のデータを取得）
ワークシートの指定した範囲のセルのデータを取得します。
1. 次の［コール COM］を実行してセルの範囲オブジェクトを取得します。
オブジェクトExcel Object WorkSheetオプション

G= プロパティの取得

プロパティ

Range

パラメータ

Cell1……範囲の開始セル（例：’A1’）
Cell2……範囲の終了セル（例：’B5’）

戻り値

Excel Object Range

以下 Excel Object Range は、ここでの戻り値を使用します。
2. 次の［コール COM］を実行してセルの値を取得します。
オブジェクトExcel Object Ranget

オプション

G= プロパティの取得

プロパティ

Value2

戻り値

値……変数「ベクトルのベクトル」

変数「ベクトルのベクトル」の内容から VecGet 関数を使用して各行のデータをベクトル変数に取り出し、更にその中から VecGet 関数にて列データを取り出すこと処理を実行します。

ワークシートのデータを取得する（特定のセルのデータを取得）
ワークシートの指定した 1 つのセルのデータを取得します。
1. 次の［コール COM］を実行してセルの範囲オブジェクトを取得します。

302

オブジェクトExcel Object WorkSheetオプション

G= プロパティの取得

プロパティ

Range

パラメータ

Cell1……範囲の開始セル（例：’A1’）
Cell2……範囲の終了セル（例：’A1’）

戻り値

Excel Object Range

開発者ガイドMagic eDeveloper V9 Plus

COM コンポーネントを呼び出す（OLE オブジェクト）
以下 Excel Object Range は、ここでの戻り値を使用します。
2. 次の［コール COM］を実行してセルの値を取得します。
オブジェクトExcel Object Ranget

オプション

G= プロパティの取得

プロパティ

Text

戻り値

値……文字型データとしてセルの値が返ります。
（セルの書式に関係なく文字列として返ります。）

ファイルを閉じる［コール COM］コマンドを以下のパラメータで実行します。
オブジェクトExcel Object Workbook

オプション

C= メソッド呼出

メソッド

Close

パラメータ

パラメータは任意です。

Excel を終了する
1. ［コール COM］コマンドを以下のパラメータで実行します。
オブジェクトExcel Object Application

オプション

C= メソッド呼出

メソッド

Quit

2. COMObjRelease 関数で Excel のインスタンスを解放します。

コレクションへのアクセス
コレクションとは、動的に要素数が変更できるオブジェクトの配列のようなものです。
コレクション内のオブジェクトを取得するには、通常インデクスを指定して Item
（MgItemSequantial）メソッドを呼び出すか、Item プロパティから取得します。どちらが使用できるかは、COM アプリケーションに依存します。
ここでは、Excel と Word の使用ファイル履歴を取得する方法を例にとって説明します。
Excel の場合は、Item プロパティから取得し、Word の場合は、Item メソッドを使用して取得します。
オブジェクトによっては、取得するキーとなるインデックス値が連続になっていない場
合があります。このような場合 MgItemSequantial メソッドを利用することで 1 から始まる連続値をキーとして値を取得することができます。
コレクションが実装されているオブジェクトには、MgItemSequantial メソッドが表示されますが、全て利用できるわけではありません。Item プロパティが実装されているオブジェクトの MgItemSequantial メソッドはできない場合があります。このような場合、戻り値のデータ型は「VT_EMPTY」になっています。

開発者ガイドMagic eDeveloper V9 Plus303

第 22 章 - COM 対応

Ecxel の使用ファイル履歴を取得する
Excel の使用ファイル履歴は、Item プロパティから取得します。

図 22-6 Item プロパティ

変数の定義
以下の OLE 型変数を定義します。
変数名

タイプライブラリ

オブジェクト名

Excel Object Application

Microsoft Excel 10.0 Object Library

Application

Excel Object Recent

RecentFile

これ以外に以下の変数を定義します。
変数名

型

書式

目的

Index

文字型

3

取得するクラスのインデックス

30

ファイル名の格納先

FileName

Application オブジェクトの取得
COMObjCreate (Excel Object Application) を実行してインスタンスを作成します。

オブジェクトのコレクションの取得
Call COM 処理コマンドを実行して RecentFile クラスコレクションのオブジェクトを取得
します。

304

オブジェクトExcel Object Application

オプション

G= プロパティの取得

プロパティ

RecentFiles.Item

開発者ガイドMagic eDeveloper V9 Plus

COM コンポーネントを呼び出す（OLE オブジェクト）
変数 Index

パラメータ取得する RecentFile クラスのインデックスです。
Excel Object Recent

戻り値

オブジェクトのプロパティの取得
Call COM 処理コマンドを実行して RecentFile クラスの Name プロパティ（ファイル名）
を取得します。
オブジェクトExcel Object Recent

オプション

G= プロパティの取得

プロパティ

Name

戻り値

FileName

変数「Index」に数値を入力して実行すすると変数「FileName」にパス付きのファイル名が返ります。

Word の使用ファイル履歴を取得する
Word の使用ファイル履歴は、Item メソッドから取得します。（MgItemSequantial メソッドを使用しても同じように取得できます。）

図 22-7 Item メソッドと MgItemSequential ネソッド

変数の定義
以下の OLE 型変数を定義します。
変数名

タイプライブラリ

オブジェクト名

Word Object Application

Microsoft Word 10.0 Object Library

Application

Word Object Recent

開発者ガイドMagic eDeveloper V9 Plus

RecentFile305

第 22 章 - COM 対応
これ以外に以下の変数を定義します。
変数名

型

書式

目的

Index

文字型

3

取得するクラスのインデックス

30

ファイル名の格納先

FileName

Application オブジェクトの取得
COMObjCreate (Word Object Application) を実行してインスタンスを作成します。

オブジェクトのコレクションの取得
Call COM 処理コマンドを実行して RecentFile クラスコレクションのオブジェクトを取得します。
オブジェクト

変数：Word Object Application

オプション

C= メソッドの呼び出し

プロパティ

RecentFiles.Item

パラメータ

変数 Index取得する RecentFile クラスのインデックスです。

戻り値

変数：Word Object Recent

オブジェクトのプロパティの取得
Call COM 処理コマンドを実行して RecentFile クラスの Name プロパティ（ファイル名）
を取得します。
オブジェクト

変数：Word Object Recent

オプション

G= プロパティの取得

プロパティ

Name

戻り値

変数：FileName

変数「Index」に数値を入力して実行すすると変数「FileName」にファイル名が返ります。

DCOM コンポーネントを呼び出す
DCOM コンポーネントとは、ネットワーク上にある別の PC 上の COM オブジェクトです。ここでは、DCOM コンポーネントを呼び出すための環境設定のみ説明いたします。

DCOM コンポーネント側の設定
以下の手順でサーバ側で、DCOM コンポーネントを有効にします。

306

開発者ガイドMagic eDeveloper V9 Plus

DCOM コンポーネントを呼び出す
1. コマンドプロンプトより DCOM 設定ツール（DCOMCNFG.EXE）を起動します。

図 22-8DCOM 設定ツール

2. ［マイコンピュータ］で、「このコンピュータ上で分散 COM を有効にする」をチェックします。

図 22-9 規定のプロパティ

3. DCOM の構成ツリーから利用するコンポーネントを選択し、［プロパティ］ダイア
ログを開きます。必要に応じてパラメータを設定します。

開発者ガイドMagic eDeveloper V9 Plus

307

第 22 章 - COM 対応

図 22-10 DCOM サーバのプロパティ

クライアント側の Magic アプリケーションの設定
クライアント側には、あらかじめ DCOM オブジェクトに接続するためのクライアント用COM オブジェクト、または DCOM オブジェクトと同じアプリケーションがインストー
ルされている必要があります。
1. OLE 型の変数を定義し、COM オブジェクトを指定します。
2. ［リモートホスト］特性にサーバのホスト名か IP アドレスを指定します。
3. プログラム方法は、COM コンポーネントの場合と同じです。

308

開発者ガイドMagic eDeveloper V9 Plus

Magic アプリケーションの COM コンポーネント化

Magic アプリケーションの COM コンポーネント化
COM インタフェースビルダ（以下、CIB と略します。）にて Proxy COM を作成すること
で、Magic アプリケーションが COM コンポーネント化され、他のアプリケーションから
Magic アプリケーションを呼び出すことができます。

図 22-11 Magic の COM 化

Magic アプリケーションの作成
Magic アプリケーションに以下のようなプログラムを作成します。
• 公開プログラム名を指定します。
• パラメータが必要な場合、パラメータ項目で定義します。パラメータには、Blob 型やOLE、ActiveX、ベクトル型は指定できません。
• パラメータとは別に戻り値が必要な場合、［タスク特性］の［戻り値］に指定します。

Proxy COM の作成
コンポーネント化したいアプリケーションを開いた状態で、［コンポーネント／ COM イ
ンタフェース］を実行して CIB を起動します。以下の手順で Proxy COM ファイルを作成します。

COM コンポーネントを登録する：
1. １行追加して［オブジェクト名］を指定します。
2. ［オブジェクトタイプ］を「L= ローカル」にします。
3. ［プログラムの選択］ボタンをクリックして［プログラム一覧］を表示します。COMのメソッドと使用したいプログラムを選択して、［OK］ボタンをクリックします。

開発者ガイドMagic eDeveloper V9 Plus309

第 22 章 - COM 対応
下のメソッドテーブルに追加されたプログラムが表示されます。

図 22-12COM インタフェースビルダ

パラメータを定義する：
1. メソッドテーブルの［パラメータ／戻り値］でズームします。パラメータテーブルが表示されます。
2. パラメータの［順］欄で入力用か出力用または、共用かを指定します。
3. 戻り値の ［COM タイプ］を指定します。
4. ［OK］をクリックします。

図 22-13 パラメータテーブル

COM のプロパティを指定する：［プロパティ］欄にカーソルを移動すると下にプロパティテーブルが表示されます。設定は必須ではありません。必要に応じて指定してください。

COM ファイルを作成する：
1. ［オプション／オブジェクトの作成］を実行するか Ctrl+I を押下すると作成する
COM ファイル名（デフォルト値は、「< オブジェクト名 >.dll」）を指定するダイア

310

開発者ガイドMagic eDeveloper V9 Plus

Magic アプリケーションの COM コンポーネント化
ログが表示されます。
2. ［OK］をクリックすると Proxy COM の作成処理が実行され、作成完了のメッセー
ジが表示されます。

COM を登録する：
Proxy COM の登録には、Windows の regsvr32 コマンド (regsvr32.exe) を実行します。
regsvr32 COM ファイル名
登録を解除する場合は、以下のようにします。
regsvr32 /u COM ファイル名
Proxy COM を登録すると、COM に対応した開発ツール上でオブジェクトとして参照する
ことができます。

Visual Basic から Magic アプリケーションを呼び出す
上記の手順で Proxy COM の作成／登録を行うことで、他のアプリケーションから Magic
アプリケーションを呼び出すようにすることができます。
ここでは、Visual Basic で Magic アプリケーションを呼び出すプログラムを作成する手順を説明します。以下の説明は、Visual Basic のプログラミングや Visual Studio の操作を理解していることが前提になります。
Magic アプリケーションとして以下のものを起動させるものとします。
• アプリケーション名：Sample• コンポーネント名：COMTest• プログラム名：Program01（文字型のデータを受け取り、その文字列を返すプログラムです。）

登録された COM オブジェクトを確認する：
OLE/COM オブジェクトビューワーにて登録された COM オブジェクトを確認します。
All Objects のツリー内の登録したオブジェクト名（COMTest Class）を探してください。
そのクラス名をマウスクリックすることで、オブジェクトの内容が右側に表示されます。
この中からインタフェース名を確認します。この例では、以下のように表示されます。
COMTest.COMTest.1 = COMTest Class
これにより、インターフェース名は、COMtest.COMtest.1 であることが分かります。
また、ITypeInfo Viewer より起動するメソッドとパラメータを確認します。
BSTR Program01([in,out] BSTR* String128)

プログラム例：
確認したコンポーネントの情報をもとにプログラムします。以下は簡単なプログラム例です。
Public Class Form1
Inherits System.Windows.Forms.Form
Dim oRet' Button1 をクリックすると Magic が起動されプログラムが実行されます。
Private Sub Button1̲Click(ByVal sender As System.Object, ByVal e As

開発者ガイドMagic eDeveloper V9 Plus311

第 22 章 - COM 対応
System.EventArgs) Handles Button1.ClickoRet = CreateObject("COMTest.COMTest.1")
oRet.MagicEngineLoad()
TextBox2.Text() = oRet.Program01(TextBox1.Text)
End Sub

← ①
← ②
← ③

' Button2 をクリックすると Magic が終了します。
Private Sub Button2̲Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.ClickoRet.MagicEngineUnLoad()← ④
End Sub
End Class① オブジェクトへの参照を作成します。
② MagicEngineLoad メソッドを実行します。このメソッドを実行することで Magic エ
ンジンが起動されます。
③ Program01 メソッドを実行します。これにより、Magic 側のプログラム「Program01」が実行されます。
④ MagicEngineUnLoad メソッドを実行します。このメソッドを実行することで Magic
エンジンが終了されます。

Magic アプリケーションのリモート COM コンポーネント化
ここでは、アプリケーションサーバ上の Magic アプリケーションを COM オブジェクトとして他のアプリケーションから呼び出す方法について説明します。この場合、呼び出
すアプリケーション側には Magic がインストールされている必要はありません。CIB によってリモート接続用に作成された Proxy COM と MGrqgnrc94.dll のみ置く必要があります。

図 22-14 リモート COM

Proxy COM の作成
CIB を起動して Proxy COM を作成します。作成手順は、ローカルの場合とほぼ同じです。

COM コンポーネントを登録する：
1. １行追加して［オブジェクト名］を指定します。
2. ［オブジェクトタイプ］を「R= リモート」にします。
3. 実行させたいプログラムを登録します。

312

開発者ガイドMagic eDeveloper V9 Plus

Magic アプリケーションのリモート COM コンポーネント化

パラメータを定義する：
ローカルの場合と同じです。

COM のプロパティを指定する：［プロパティ］欄にカーソルを移動すると下にプロパティテーブルが表示されます。リ
モートの場合は、この設定が重要です。設定内容が起動するアプリケーションと合っていない場合は、エラーが返ります。
［コールリモート］コマンドでリモートアプリケーションを起動する場合の設定内容（［サーバ］テーブル／［サービス］テーブル／［リモートコール］ダイアログ ）を参考にしてください。

COM ファイルを作成する：
ローカルの場合と同じです。

COM を登録する：起動アプリケーション側の PC で Proxy COM を登録します。作成した COM ファイルをクライアント側の PC にコピーした後 、regsvr32 マンド (regsvr32.exe) を実行して登録します。

Visual Basic からリモート Magic アプリケーションを呼び出す
上記の手順で COM ファイルの作成／登録を行うことで、他のアプリケーションからア
プリケーションサーバ上の Magic アプリケーションを呼び出すようにすることができます。
起動するアプリケーションの内容はローカルの場合と基本的には同じですが、以下の点が異なります。
• このプログラムが、MGrqgnrc94.dll を参照できるようにする必要があります。
• リモートの場合、MagicEngineLoad ／ MagicEngineUnLoad メソッドはありません。Magic
エンジンの起動は、MRB 側の環境設定に依存します。
以下は簡単なプログラム例です。
Public Class Form1
Inherits System.Windows.Forms.Form
Dim oRet' Button1 をクリックすると Magic が起動されプログラムが実行されます。
Private Sub Button1̲Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.ClickoRet = CreateObject("COMTest.COMTest.1")← ①
TextBox2.Text() = oRet.Program01(TextBox1.Text)← ②
End Sub
End Class① オブジェクトへの参照を作成します。
② Program01 メソッドを実行します。これにより、Magic 側のプログラム「Program01」が実行されます。

開発者ガイドMagic eDeveloper V9 Plus313

第 22 章 - COM 対応［このページは意図的に空白にしています。］

314

開発者ガイドMagic eDeveloper V9 Plus

データの受け渡し

23

ここでは、Magic と他のアプリケーションとの間でのデータの受け渡しを行う方法について説明いたします。
以下の３つの方法で受け渡しを行うことができます。
• Windows のクリップボードを利用する。
• ODBC データベースを利用する。
• XML を利用する。

この章では以下の手順について説明いたします。
Magic からクリップボードへデータを渡す

316 ページ

クリップボードのデータを Magic に渡す

317 ページ

Magic で作成したデータを Excel で参照する

317 ページ

Excel のワークシートを Magic で参照する

319 ページ

Magic で出力した XML データを Excel で読み込む

320 ページ

Excel で作成した XML データを Magic で読み込む

324 ページ

開発者ガイドMagic eDeveloper V9 Plus315

第 23 章 - データの受け渡し

Magic からクリップボードへデータを渡す
キーボード操作による処理
通常 Windows では、クリップボードにデータを渡すためには、Ctrl+C のショートカットを使用しますが、Magic では、DOS で使用されていた Ctrl+Ins のショートカットを使用するようになっています。
この設定は、キーボード割付を変更することで、Windows のショートカットに合わせることができます。ただし、Magic は、登録モードに切り替えるのためのショートカット
として、デフォルトで Ctrl+C が割り当てられています。この機能を使用する場合は、キー
割付を変える必要があります。

Magic 関数による処理
Magic は、クリップボードとアクセスするための関数として 、ClipAdd, ClipWrite とClipRead を使用することができます。
ClipAdd と ClipWrite 関数を使用してクリップボードにデータを書き込むことにより、他のアプリケーション上でデータの貼り付けを行うことができます。
• ClipAdd ……OS のクリップボードに追加する値と書式を指定してバッファに追加します。
この関数で指定するパラメータは、値（Blob 値以外の値）と書式の組み合わせになります。
• ClipWrite ……ClipAdd 関数で作成された CF_Text 形式のバッファ内容をクリップボー
ドに書き込みます。

Magic アプリケーションからクリップボードにデータを渡す：
1. カーソルのパークできる項目を持った、オンラインプログラムを作成します。
2. ユーザイベントを作成します。イベントテーブルの［強制終了］カラムは、「C= コントロール」に設定します。
3. ハンドラを作成し、ユーザイベントをトリガとします。
4. ハンドラには、２つのアクションコマンドを追加します。
ClipAdd(a,varpic(‘A’var,0)
ClipWrite()
5. このプログラムを実行し、パーク項目に値を入力後、ユーザイベントを発行します。
6. ノートパッド（Notepad.exe）を起動し、値を貼り付けてみてください。
同時に複数の値を追加できます。ClipWrite 関数を使用する前に、ClipAdd 関数を複数回実行するだけで可能です。マルチマーキングプログラムでクリップボード関数を使用するなどはよい例です。

316

開発者ガイドMagic eDeveloper V9 Plus

クリップボードのデータを Magic に渡す

クリップボードのデータを Magic に渡す
キーボード操作による処理
通常 Windows では、クリップボードのデータをアプリケーションに貼り付ける場合、
Ctrl+V のショートカットを使用しますが、Magic では、Shift+Ins のショートカットを使用するようになっています。
この設定は、キーボード割付を変更することで、Windows のショートカットに合わせることができます。ただし、Magic は、開発モードでは変数テーブルを開くためのショー
トカットとして、デフォルトで Ctrl+V が割り当てられています。この機能を使用する場
合は、キー割付を変える必要があります。

Magic 関数による処理
ClipRead 関数を使用してクリップボードのデータを読み込むことで、他のアプリケー
ションのデータを Magic アプリケーション側に貼り付けることができます。
• ClipRead ……OS のクリップボードの内容を読み込み、Blob 値として返します。

クリップボードのデータを Magic アプリケーションに渡す：
1. カーソルのパークできる項目を持ったオンラインプログラムを作成します。レコー
ドメインには、データを受け取るための Blob 型の変数項目を定義します。フォーム
上にはリッチエディットコントロールとして配置します。
2. 適当なユーザイベントを作成します。イベントテーブルの［強制終了］カラムは、「C= コントロール」に設定します。
3. ハンドラを作成し、このユーザイベントをトリガとします。
4. ハンドラには、項目更新コマンドを追加します。
#1 で定義した変数を、ClipRead() で更新します。
5. ノートパッド（Notepad.exe）を起動し、値を指定してコピー／切り取りを実行します。
6. Magic 側でプログラムを実行しユーザイベントを発行すると、コピーされた値が表示されます。

Magic で作成したデータを Excel で参照する
Pervasive Workgroup Engine を ODBC 経由でアクセスすることで、Magic で作成された
Pervasive データを Excel で参照することができます。

DDF ファイルの作成
DDF（データ辞書）は、データベースのコンポーネントを定義して、アプリケーション
から Btrieve データベースにアクセスすることを可能にします。

テーブルリポジトリを開く
1. リポジトリのタイトル行にカーソルを置き、［オプション］の［DDF 作成］を実行します。

開発者ガイドMagic eDeveloper V9 Plus317

第 23 章 - データの受け渡し
全てのテーブルに対する DDF が作成されます。特定のテーブルのみ作成する場合
は、そのテーブルにカーソルを置いた上で、DDF 作成を実行してください。
（DDF は、Magic のカレントディレクトリに作成されます。）
2. 作成された DDF ファイル（INDEX.DDF/FILE.DDF/FIELD.DDF/FIELDEXT.DDF）を
物理データファイが存在する場所にコピーします。

データベースの定義
1. Pervasive Control Center を起動します。
2. ［Pervasive.SQL エンジン／ホスト名／データベース］にカーソルを置き右クリックします。

図 23-1Pervasive Control Center

3. ［新規データベース］を選択し、［Pervasive.SQL データベース作成ウイザード］を実行します。
4. ［名前］欄にユニークなデータベース名、［ディレクトリ名］欄には物理データファイの存在するパス名を入力します。
5. ［次へ］をクリックし、［データベース作成ウイザードの終了］画面で［完了］ボタ
ンをクリックします。
データベースが追加され、［テーブル］には、テーブルリポジトリに登録されているテーブルが表示されます。

318

開発者ガイドMagic eDeveloper V9 Plus

Excel のワークシートを Magic で参照する

図 23-2 追加されたデータベース

Excel 側で参照する
1. Excel を起動し、［データ］／［外部データの取り込み／データの取り込み］を実行します。［データファイルの選択］ダイアログが表示されます。
2. ［+ 新しいデータソースへの接続 .odc］を選択し、［開く］をクリックすると、［デー
タ接続ウィザード］が実行されます。
3. ［接続するデータソースの種類］を選択するダイアログでは、［ODBC DSN］を選択し、［次へ］をクリックします。
4. ［ODBC データソースに接続］のダイアログに、Pervasive Control Center で作成されたデータベース名が表示されます。これを選択し、［次へ］をクリックします。
5. ［データベースとテーブルの選択］のダイアログで、アクセスしたいテーブルを選択して、［次へ］をクリックします。
6. ［データ接続ファイルを保存して終了］のダイアログでは、このまま［完了］をク
リックします。
7. ［データのインポート］ダイアログが表示されます。
［既存のワークシート］が有効な状態で、セルをシートの先頭（A1）にカーソルを置き範囲選択をした後、［OK］
ボタンをクリックします。
これで、Pervasive データがインポートされます。

Excel のワークシートを Magic で参照する
Excel のワークブックを ODBC 経由で参照する方法を説明します。

データソースの登録
1. Windows の［コントロ r −ルパネル］の［管理ツール］／［データソース（ODBC）］
を実行して、［ODBC データソースアドミニストレータ］を実行します。
2. ［ユーザ DSN］タブを開き、［追加］ボタンをクリックします。

開発者ガイドMagic eDeveloper V9 Plus319

第 23 章 - データの受け渡し
3. ［データソースの新規作成］ダイアログで、「Microsoft Excel Driver」を選択し［完了］ボタンをクリックします。
4. ［ODBC Microsoft Excel セットアップ］ダイアログが開きます。以下の設定を行います。
•

データソース名……ユニークな名前を入力します。

•

バージョン……「Excel 97-2000」を選択します。

•

ブックの選択……クリックして、参照したい ワークブックファイルを選択します。

5.［OK］をクリックして、［ODBC Microsoft Excel セットアップ］ダイアログを閉じます。

Magic 側で参照する
データベースの登録
1. ［設定］／［データベース］を実行し、［データベース］テーブルを開きます。
2. １行追加して以下の内容でデータベースを登録します。
•

名前……ユニークな名前•

DBMS……ODBC•

DB 名……［ODBC Microsoft Excel セットアップ］ダイアログで登録したデータ
ベース名

データベースの読み込み
1. アプリケーションを開き、［テーブルリポジトリ］を開きます。
2. テーブルリポジトリのタイトル行にカーソルを置き、［オプション］／［定義取得］を実行します。
3. ［テーブル定義取得］ダイアログで、［データベース］は、［データベース］テーブ
ルに登録した名前を一覧から選択します。
［タグテーブル］は、「S= 選択」を選択します。
4. ワークブック内の各ワークシートが［テーブル選択］一覧に表示されます。Space
キーで読み込むワークシートを選択し、［選択］ボタンをクリックします。
5. ［OK］をクリックすると読み込みを開始します。

テーブルにユニークインデックスを追加する
読み込まれたテーブルにはインデックスがありません。Magic からアクセスするためには、読み込まれたテーブルに対してユニークインデックスを登録する必要があります。
インデックスセグメントには、ユニークなデータになっているカラムを選択して下さい。

Magic で出力した XML データを Excel で読み込む
Excel2002 以降は、XML データを直接読み込むことができます。
Magic のデータ出力ウイザードを使用することで、現在定義されているビューをもとにMagicしたテーブル内容を XML データに出力することができます。この機能を利用して、のデータを Excel で読み取ることができます。

320

開発者ガイドMagic eDeveloper V9 Plus

Magic で出力した XML データを Excel で読み込む
ここでは、データ出力ウイザードと XML コンポーネントビルダ（以下、XCG と略します。）を使用して、Magic のデータを XML 化して Excel 側で読み込ませるようにする方法を説明いたします。
一時的にデータを XML 化する場合は、データ出力ウイザードを使用するだけで十分です
が、常にやり取りするような場合は、データ出力ウイザードで作成された XSD ファイルと XCG でプログラムを作成するようにした方が便利です。

データ出力ウィザードで作成されるスキーマ
データ出力ウイザードで作成されるスキーマについて説明します。
例えば、文字型（項目名：Alpha、書式：10）と数値型（項目名：Numeric、書式：5）の２つのカラムがあるテーブルの場合以下のようなスキーマファイルを作成します。
<?xml version="1.0" encoding="UTF‑8"?><!‑‑W3C Schema generated by eDeveloper 9.4 (http://www.magicsoftware.com)‑‑><xs:schema targetNamespace="urn:edeveloper.printdata"
xmlns="urn:edeveloper.printdata" xmlns:xs="http://www.w3.org/2001/XMLSchema"><xs:element name="Alpha"><xs:simpleType ><xs:restriction base="xs:string"><xs:maxLength value="10"/></xs:restriction></xs:simpleType></xs:element><xs:element name="Numeric"><xs:simpleType ><xs:restriction base="xs:integer"><xs:totalDigits value="5"/></xs:restriction></xs:simpleType></xs:element><xs:element name="Record"><xs:complexType ><xs:sequence><xs:element ref="Alpha"/><xs:element ref="Numeric"/></xs:sequence></xs:complexType></xs:element></xs:schema>

これは、以下の要素で構成されます。
• PrintData• Record• Alpha• Numeric
このスキーマをダイアグラム表示すると以下のようになります。

図 23-3XSD の構成例

開発者ガイドMagic eDeveloper V9 Plus

321

第 23 章 - データの受け渡し「PrintData」と「Numeric」はともにルート要素ですが 「PrintData」の方が上位のノードになるため、XCG や Excel でルートノードを選択する場合、「PrintData」を選択します。

テーブルに対応した XSD ファイルを作成する
データ出力ウイザードを使用して、XSD ファイルを作成します。
1. テーブルリポジトリで連携させたいテーブルにカーソルを置きます。以下の設定でAPG を実行しプログラムを作成します。
•

処理モード ……… G= 作成•

オプション ……… B= 照会•

選択カラム数 ……… 全てのカラムが出力されるようにします。

2. プログラムリポジトリの作成されたプログラムを開き、［タスク制御］ダイアログを開きます。［データ出力ウイザード］欄を「Yes」にします。
3. F7 でこのプログラムを実行します。
4. データが表示された状態で、［オプション］の［データ出力］（Ctrl+G）を実行し、データ出力ウィザードを起動します。
5. ［出力データ］ダイアログで以下の設定にします。
•

タイプ………X=XML ファイル•

ファイル名……… ユニークな XML ファイルの名前•

アクション……… C= ファイル作成•

スキーマファイルを作成………オン

図 23-4 データ出力ウイザード

6. ［終了］ボタンをクリックするとダイアログが閉じ、XML ファイルと XSD ファイルが作成されます。
7. ここで作成された XML ファイルと XSD ファイルを Excel で読み込むことでデータ連携させることができます。
8. この後、更に XSD ファイルで同じ構成のテーブル内容の受け渡しができるようにし
ます。

322

開発者ガイドMagic eDeveloper V9 Plus

Magic で出力した XML データを Excel で読み込む

XCG でアクセス用のプログラムを作成する
1. アプリケーションテーブル（［設定］／［アプリケーション］）を開き、１行追加してアプリケーションを登録します。
2. このアプリケーションを開き、［コンポーネント］／［XML インタフェース］を実行し、XCG を起動します。
3. ［ようこそ］ダイアログで［次へ］をクリックします。
4. ［メインオプション］ダイアログで［作成］を選択し、［次へ］をクリックします。
5. ［XML スキーマの詳細］ダイアログで［コンポーネント名］を入力し、［XML スキーマファイル］には、データ出力ウイザードで作成された XSD ファイルを指定します。［次へ］をクリックします。
6. ［ルート要素の選択］ダイアログが表示されます。
「Print_data」を選択して下さい。

図 23-5 ルート要素の選択

7. ［スキーマインタフェースの詳細］ダイアログが表示されます。
「Print_data」のサブツリーに「Record」があり、ここにテーブルのカラムが要素として表示されます。

開発者ガイドMagic eDeveloper V9 Plus323

第 23 章 - データの受け渡し［次へ］をクリックします。

図 23-6 スキーマインタフェースの詳細

8. ［コンポーネント用リポジトリ出力ファイルの指定］ダイアログが表示されます。
［ファイル名］を入力し（デフォルト値が表示されます。）［コンポーネントの入力］を「オン」にします。［次へ］をクリックします。
9. ［XML ウイザードの終了］ダイアログで［完了］ボタンをクリックすると、XCGが終了し、アプリケーションのインポート処理が実行されます。

Excel とのデータ連携を確認する作成されたプログラムをもとに XML データ形式で Excel とのデータ連携を確認します。

XML データを入力するプログラムリポジトリ内の 「ReadXML」というプログラムを F7 で実行します。
［XMLPath］欄に XML ファイル名を指定し［OK］ボタンをクリックします。これで XML ファ
イルが読み込まれ、Magic のデータテーブルに展開されます。
（ここでは、データ出力ウ
イザードで出力した XML 読み込みますが、同じスキーマであれば Excel で作成された
XML ファイルを読み込むこともできます。）

Magic で XML データを作成するプログラムリポジトリ内の 「WriteXML」というプログラムを F7 で実行します。［XMLPath］欄に XML ファイル名を指定し、［OK］ボタンをクリックします。これで Magic のテーブルの内容が、指定された名前で XML ファイルが作成されます。

Excel で作成した XML データを Magic で読み込む
Excel データを XML 形式にして Magic で読み込む手順を説明します。

324

開発者ガイドMagic eDeveloper V9 Plus

Excel で作成した XML データを Magic で読み込む

Excel のワークシートを XML ファイルで出力する
スキーマファイルを作成する
1. Excel データを XML 形式にする場合、あらかじめスキーマファイルを作成する必要があります。

Excel シートが以下のようになっているとします。
Id

Name

Age

MailAddress

1

大伴家持

36

yakamochi@example.com

2

額田王

28

nukata@example.com

3

柿本人麻呂

45

hitomaro@example.com

この場合、以下のようなスキーマを作成します。
<?xml version="1.0" encoding="Shift̲JIS"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><xsd:element name="NameList" type="ListType"><xsd:key name="Member‑id"><xsd:selector xpath="Member" /><xsd:field xpath="@Id" /></xsd:key></xsd:element><xsd:complexType name="ListType"><xsd:sequence><xsd:element ref="Member" maxOccurs="unbounded" /></xsd:sequence></xsd:complexType><xsd:element name="Member" type="MemberType" /><xsd:complexType name="MemberType"><xsd:sequence><xsd:element name="Name" type="xsd:string" /><xsd:element name="Age" type="xsd:positiveInteger" /><xsd:element name="MailAddress" type="xsd:string" /></xsd:sequence><xsd:attribute name="Id" type="xsd:positiveInteger" use="required" /></xsd:complexType></xsd:schema>

このスキーマは以下のような構造です。

図 23-7XSD の構成例

開発者ガイドMagic eDeveloper V9 Plus325

第 23 章 - データの受け渡し

Excel でスキーマファイルを読み込む
Excel2003 で XML ファイルを出力するためには、あらかじめスキーマファイルを読み込
み Excel シートとの関連づけを行う必要があります。
1. ［データ］メニューの［XML］／［XML ソース］を実行します。右側に［XML ソース］というコーナーが表示されます。
2. 右下の［XML の対応付け］ボタンを押して［XML の対応付け］ダイアログを表示させます。
3. ［追加］ボタンを押して XSD ファイルを読み込みます。
4. ［開く］を押すと、「指定した XML スキーマには複数のルートノードが含まれています」というルート一覧が表示されます。ここでのルート要素は NameList を選んで［OK］
ボタンを押します。
5. ［XML の対応付け］ダイアログの［OK］ボタンを押します。これでスキーマツリーが表示されます。

データとスキーマを対応させる
Excel のワークシートとスキーマを対応付ける処理を行います。
1. ［XML ソース］のツリーの Member アイコンの上をクリックして、ワークシートにドラッグします。
2. ワークシートの一番左上である「Id」と表示されているセルにドロップします。１行目の文字の表示が変更され、ワークシートが強調表示されます。
3. ［ファイル］／［名前を付けて保存］を実行して、ファイルダイアログを開きます。
一番下の［ファイルの種類］欄で「XML データ（*.xml）」を選びます。（「XML ス
プレッドシート」ではありません。）
これで、XML ファイルが出力されました。

Magic で XML データを読み込む
XCG とスキーマファイルを使用して XML データをアクセスするためのプログラムを作成します。作成手順は、「Magic で出力した XML データを Excel で読み込む」を参照してください。

326

開発者ガイドMagic eDeveloper V9 Plus

メッセージの送受信

24

分散アプリケーションにおいて、２つの異なったアプリケーション間で互いに情報のやり取りを行う必要があります。このような場合の解決策の１つとしてメッセージキューがあります。
メッセージキューを使用することで、アプリケーションは応答を待つことなくメッセー
ジを送信し、次の処理を継続することができます。他のアプリケーションは、処理の空き時間にメッセージを受け取り、受け取ったデータに基づいた処理を実行することができます。

ここでは、以下の内容について説明します。
Magic のメッセージングモジュールをインストールする

328 ページ

Magic から MSMQ へメッセージを送信する

329 ページ

MSMQ からメセージを受信する

330 ページ

Magic から MSMQ へトランザクションメッセージを送信する

332 ページ

Magic と JMS 間のメッセージの送受信

334 ページ

メッセージングコンポーネントの場所を変更する

337 ページ

メッセージング機能は、日本語版では JMS と WebSphere MQ についてはベータ機能扱いになっています。

開発者ガイドMagic eDeveloper V9 Plus327

第 24 章 - メッセージの送受信

Magic のメッセージングモジュールをインストールする
Magic のメッセージング機能は、標準的なインストール処理には含まれません。カスタ
ムインストールによってあらかじめ選択してインストールする必要があります。

Magic のメッセージングモジュールをインストールする：
メッセージングのモジュールがインストールされていない場合のみ、この操作が必要です。
1. Windows の［コントロールパネル］の［アプリケーションの追加と削除］から Magicのインストールプログラムを起動し、変更処理を実行します。（インストールで使用した Magic の CD-ROM を CD-ROM ドライブに挿入しておいてください。）
2. ［メッセージングコンポーネント］のオプションを選択します。インストールプロ
グラムによって、Magic のインストールディレクトリに Messaging サブフォルダが作成されます。また、Magic.ini に２つの論理名が追加されます。
•

MessagingComponentDir ……メッセージングコンポーネントのインストール
ディレクトリを指定します。
Magic のインストーラによってコピーされる場所をそのまま使用する場合は、「Messaging¥」と指定してください。

•

MessagingErrorLogFile ……エラーログの名前を指定します。

これらの論理名の詳細については、『メッセージング接続リファレンスガイド』を参照してください。メッセージングコンポーネントをインストールするとこのドキュメ
ントも参照できるようになります。

メッセージングコンポーネントをコンポーネントリポジトリに登録する：
1. Magic アプリケーションを新規に作成するか、既存のアプリケーションをオープンします。
2. コンポーネントリポジトリをオープンし、１行追加します。コンポーネント名を入力します。（例：「MSMQ」）
3. ［オプション］メニューより［読込／再読込］を実行します。コンポーネントイン
タフェース（MCI）ファイルの読込ダイアログが表示されます。メッセージング用の MCI ファイルは、Messaging サブディレクトリにあります。
4. Messaging サブディレクトリ上に、いくつかの .mci ファイルがあります。接続する
メッセージングサーバの種類に応じてファイルを選択してください。
•

MSMQ.MCI……MSMQ•

JMS.MCI……JMS•

MQ.MCI……WebSphere MQ

5. コンポーネントリポジトリに戻り、F5 を押して、コンポーネントが正しく読み込まれていることを確認してください。これで、コンポーネントを利用できます。

328

開発者ガイドMagic eDeveloper V9 Plus

Magic から MSMQ へメッセージを送信する

Magic から MSMQ へメッセージを送信する
ここでは、Magic から MSMQ(Microsoft Messaging Queuing) システムにメッセージを送信する方法について説明します。ここでは、すでに PC に MSMQ サービスがインストール
されていることを前提に、「Magic」という名前の Private（専用）キューにメッセージを送信するプログラムを作成します。
メッセージを送信するには、このコンポーネントの中の３つのプログラムを使用します。
• Open Queue …… メッセージを送信するキューをオープンします。
• Send Message …… メッセージを送信します。
• Close Destination…… キューをクローズします。
一度キューをオープンすると、何回でもメッセージを送信することができます。
以下に、メッセージを送信するプログラムを作成する上で、必要なコンポーネントプロ
グラムを呼び出す方法を説明します。送信処理用のハンドラを作成し、その中でプログラムを呼び出すものとします。

MSMQ のキューをオープンするプログラムを呼び出す：
1. プログラムには、内部のキュー ID を格納するための数値型の変数を定義します。変数は、負数を使用できるように書式を指定してください。（例：N17）
2. コールプログラムを定義します。
3. プログラム一覧よりコンポーネントのプログラムを選択します。これらは、赤字で表示されます。また、コンポーネント名が接頭語として表示されます。
4. 「MSMQ.MSMQ Open Queue」というプログラムを選択します。このプログラムには、５つのパラメータを渡します。
•

Format Name …… 通常は、「0」を指定してください。IP アドレスで MSMQ サー
バを指定する場合は、「1」を指定します。

•

Address …… MSMQ サーバのホスト名を指定してください。最初のパラメータ（Format Name）で 1 を指定している場合は、IP アドレスを指定してください。

•

Queue Name …… キューの名前を指定します。（例：private$¥Magic）•

Access ……「W」という文字を指定します。これは、キューにメッセージを書き込むことを表しています。

•

Share …… このプログラムがキューをオープンしている間、他のユーザによってこのキューのアクセスができるかどうかを指定します。今回は、’A’ と指定して、「フルアクセス」できるようにします。

5. コールコマンドの戻り値として、あらかじめ定義された数値型変数を設定します。
ここには、キューの ID が返ります。正常にキューがオープンできれば、ここには正の数値が返ります。この値は後の処理で使用することになります。エラーが発生した場合は、負数が返ります。
6. これ以降の手順での操作は、ブロックコマンド内で行ってください。ブロックコマ
ンドの条件として、「キュー ID>0 」を設定します。キューがオープンした時のみこの処理が実行されます。

MSMQ にメッセージを送信するプログラムを呼び出す：
1. コール処理コマンドを定義します。
2. 「MSMQ.MSMQ Send Message」プログラムを呼び出すようにします。このプログラ
ムには、８つのパラメータがありますが、今回は、５つのパラメータのみ渡すよう開発者ガイドMagic eDeveloper V9 Plus329

第 24 章 - メッセージの送受信にします。
•

Queue Handle …… 手順 3 のキューのオープンプログラムから返されたキュー ID
を指定します。

•

Message …… メッセージ内容を設定します。メッセージをデータ項目で指定する場合は、Blob 型データで指定し、GUI フォーム上はリッチエディットコント
ロールで表示します。

•

Datatype …… 使用するデータタイプです。通常の文字列を送信する場合は、文字列（Aipha）を表す「A」を指定します。

•

Picture …… Datatype が数値（「N」）の場合のみ関係します。その他のタイプの場合は、空白にしてください。

•

Transaction Mode …… 送信されるトランザクションの種類を指定します。今回の例では、トランザクションを使用しないため、「N」と指定します。

この他のパラメータは、［スキップ］カラムをチェックしておいてください。

メッセージキューをクロースするプログラムを呼び出す：
1. コール処理コマンドを定義します。
2. 「MSMQ.MSMQ Close Destination」プログラムを呼び出すようにします。このプログラムには、パラメータとして キューの ID を渡します。
コンポーネントでエラーが発生した場合、エラーログに書き込みます。ユーザがこのメッセージを参照することはありません。エラーが発生したかどうかをユーザが参照
するには、コンポーネントに登録されているイベントをトリガにしたハンドラを作成する必要があります。

エラーが発生した場合にユーザに表示する：
1. ユーザハンドラを作成します。
2. ハンドラのトリガイベントでズームして、イベント一覧より「MSMQ.Public Error」を選択します。
3. ハンドラには、パラメータ用に４つの変数を定義します。
•

Message System …… これは文字列パラメータです。今回の場合、「M」が返ります。

•

Error Code …… 負数（N17）の値が返ります。

•

Validation …… 論理値が返ります。「True」の場合、コンポーネントがパラメー
タをチェックした結果としての値です。
「False」の場合は、MSMQ のエラーを表します。

•

Error Message …… エラーメッセージが返ります。

4. エラーコマンドを定義し、エラーメッセージを表示テキストとします。実行条件として、「Error Code<0」と指定します。

MSMQ からメセージを受信する
ここでは、Magic から MSMQ システムのキューにあるメッセージを受信する方法について説明します。
「Magic」という名前の Private（専用）キューのメッセージを受信するプ
ログラムを作成します。

330

開発者ガイドMagic eDeveloper V9 PlusMSMQ からメセージを受信する
メッセージを受信する場合は、コンポーネントの中の以下の３つのプログラムを使用します。
• Open Queue …… メッセージを受信するキューをオープンします。
• Read Message …… メッセージを受信します。
• Close Destination …… キューをクローズします。
一度キューのオープンすれば、Read Message を呼び出すたびにキューにあるメッセージを順番に受け取ることができます。
手順 1 から手順 3 で、メッセージを受信するプログラムを作成する上で、必要なコンポー
ネントプログラムを呼び出す方法を説明します。受信処理用のハンドラを作成し、その中でプログラムを呼び出すものとします。

MSMQ のキューをオープンするプログラムを呼び出す：
1. プログラムには、内部のキュー ID を格納するための数値型の変数を定義します。変数は、負数を使用できるように書式を指定してください。（例：N17）
2. コールプログラムを定義します。
3. 「MSMQ.MSMQ Open Queue」というプログラムを選択します。このプログラムには、五つのパラメータを渡します。
•

Format Name …… 通常は、「0」を指定してください。

•

Address …… MSMQ サーバのホスト名を指定してください。

•

Queue Name …… キューの名前を指定します。（例：private$¥Magic）•

Access …… 「R」という文字を指定します。これは、キューからメッセージを読み出すことを表しています。

•

Share …… このプログラムがキューをオープンしている間、他のユーザによってこのキューのアクセスができるかどうかを指定します。今回は、「A」と指定して、「フルアクセス」できるようにします。

4. コールコマンドの戻り値として、あらかじめ定義された数値型変数を設定します。
ここには、キューの ID が返ります。正常にキューがオープンできれば、ここには正の数値が返ります。この値は後の処理で使用することになります。エラーが発生した場合は、負数が返ります。
5. これ以降の手順での操作は、ブロックコマンド内で行ってください。ブロックコマ
ンドの条件として、「キュー ID>0 」を設定します。キューがオープンした時のみこの処理が実行されます。

MSMQ にメッセージを受信するプログラムを呼び出す：
1. コール処理コマンドを定義します。
2. 「MSMQ.MSMQ Read Message」プログラムを呼び出すようにします。このプログラ
ムには、１１のパラメータがありますが、今回は、４つのパラメータのみ渡すようにします。
•

Queue Handle …… 手順 3 のキューのオープンプログラムから返されたキュー ID
を指定します。

•

Timeout …… メッセージの待ち時間をミリ秒で指定します。ここでは、「5000」（5 秒）で指定します。

•

Transaction Mode …… 受信するトランザクションの種類を指定します。今回の例
では、トランザクションを使用しないため、「N」と指定します。

開発者ガイドMagic eDeveloper V9 Plus331

第 24 章 - メッセージの送受信•

Message …… 受信メッセージを格納する Blob 項目を指定し、GUI フォーム上は
リッチエディットコントロールで表示します。

この他のパラメータは、［スキップ］カラムをチェックしておいてください。

メッセージキューをクロースするプログラムを呼び出す：
1. コール処理コマンドを定義します。
2. 「MSMQ.MSMQ Close Destination」プログラムを呼び出すようにします。このプログラムには、パラメータとして キューの ID を渡します。

Magic から MSMQ へトランザクションメッセージを送信する
ここでは、Magic から MSMQ にトランザクションメッセージを送信する方法について説明します。
MSMQ がすでにインストールされており、Magic から MSMQ への通常のメッセージ送信
処理方法ついて熟知していることを前提として説明します。
この例では、「MagicTrn」と呼ばれる MSMQ の Private キューを使用します。トランザク
ションメッセージを送受信する場合、メッセージサーバ側ではトランザクションが有効なキューを別途定義する必要があります。

MSMQ のキューをオープンするプログラムを呼び出す：
プログラムは、前述の送信処理と同じです。

MSMQ のトランザクションを開始するプログラムを呼び出す：
MSMQ のトランザクションは、キューのオープン処理では開始されません。別途開始処
理を実行する必要があります。ユーザは同一トランザクション内で２つの異なったキューをオープンすることができます。１つが読み込み用でもう一方が書き込み用です。
MSMQ 内のトランザクションは、個別に２つの方法で管理されます。
• 内部 …… MSMQ で管理されます。
• MTS …… Microsoft Transaction Server（MTS）によって外部で管理されます。
トランザクションが開始されると、ユーザはどこでトランザクションが管理されるか要求されます。
Magic のメッセージングコンポーネントを使用してトランザクションを開始する方法は以下の通りです。
1. プログラムに、トランザクションハンドル値を格納するための数値型の変数を定義します。変数は、負数を使用できるように書式を指定してください。（例：N17）
2. コール処理コマンドを定義し、「MSMQ.MSMQ Begin Transaction」プログラムを呼び出すようにします。このプログラムには、１つ文字型パラメータがあります。
•

I ……内部トランザクションを指定します。

•

M …… MTS トランザクション。トランザクションが成功した場合、コンポーネントは数値を返します。この番号またはハンドルは、これ以降の処理で使用されます。

ここでは、「I」を指定します。
3. コールコマンドの戻り値として、トランザクションハンドル値を格納するために定義された数値型変数を設定します。

332

開発者ガイドMagic eDeveloper V9 PlusMSMQ のトランザクションメッセージを受信する

MSMQ にメッセージを送信するプログラムを呼び出す：
1. コール処理コマンドを定義し、「MSMQ.MSMQ Send Message」プログラムを呼び出すようにします。前述の送信プログラムと以下のパラメータが異なります。
•

Transaction Mode …… 送信されるトランザクションの種類を指定します。今回
は、「T」を指定します。

•

Transaction Handle …… 「Begin Transaction」プログラムからの戻り値を指定します。

トランザクションを終了させるプログラムを呼び出す：
トランザクションを終了させるプログラムには以下の 2 つがあります。
• Commit Transaction …… トランザクションをコミットして終了します。送信メッセー
ジはキューに保存されます。
• Rollback Transaction …… トランザクションをロールバックして終了します。送信メッ
セージはキューに保存されません。
1. コール処理コマンドを定義し、「MSMQ.MSMQ Commit Transaction」プログラムを呼び出すようにします。このプログラムには、１つ文字型パラメータがあります。
•

Transaction Handle …… 「Begin Transaction」プログラムからの戻り値を指定します。

2. 送信したメッセージをキャンセルしたい場合は、「MSMQ.MSMQ Rollback
Transaction」プログラムを実行します。パラメータは同じです。

メッセージキューをクローズするプログラムを呼び出す：
1. コール処理コマンドを定義し、「MSMQ.MSMQ Close Destination」プログラムを呼び出すようにします。このプログラムには、パラメータとして キュー ID を渡します。

メッセージキューのオープン／クローズとトランザクションがの開始／コミットは、全く別の管理になります。トランザクションの開始をキューの前に行ってもかまいません
し、トランザクションのコミットをキューの後に行ってもかまいません。
トランザクションがコミットされない限りメッセージはキューに保存されません。
トランザクションはキューの一部でないので、同じトランザクション内で、複数の異なったキューをオープンしたり、メッセージの送受信を行うことができます。

MSMQ のトランザクションメッセージを受信する
ここでは、MSMQ のトランザクションメッセージを受信する方法について説明します。
以下の手順について行います。詳細は、トランザクションメッセージの送信の説明とほぼ同じです。

MSMQ のキューをオープンするプログラムを呼び出す：
プログラムは、前述の受信処理と同じです。

開発者ガイドMagic eDeveloper V9 Plus333

第 24 章 - メッセージの送受信

MSMQ のトランザクションを開始するプログラムを呼び出す：
プログラムは、前述の送信処理と同じです。

MSMQ にメッセージを受信するプログラムを呼び出す：
1. コール処理コマンドを定義し、「MSMQ.MSMQ Read Message」プログラムを呼び出すようにします。前述の受信プログラムと以下のパラメータが異なります。
•

Transaction Mode …… 受信するトランザクションの種類を指定します。今回は、「T」を指定します。

•

Transaction Handle …… 「Begin Transaction」プログラムからの戻り値を指定します。

トランザクションを終了させるプログラムを呼び出す：
プログラムは、前述の送信処理と同じです。

メッセージキューをクロースするプログラムを呼び出す：
プログラムは、前述の送信処理と同じです。

メッセージの受信プログラムを呼び出す毎に、キュー内のメッセージが順番に読み込まれますが、トランザクションがコミットされない限り、キュー内のメッセージは残ります。
トランザクションのロールバックを行うとキュー内のメッセージは、トランザクション
開始前の状態に戻るため、再度読み込むと同じメッセージが返ることになります。

Magic と JMS 間のメッセージの送受信
ここでは、Magic と JMS(Java Messaging System) の間でメッセージを送受信する方法について説明します。ここでは、すでに PC に JMS の API がインストールされていることを前提に説明します。JMS サーバとして、Java2 SDK Enterprise Edition （以下 J2EESDK）を使用するものとします。
JMS は、Java ベースの環境設定を行う必要があります。使用する JMS サーバによって設定内容が異なる場合があります。
メッセージを送受信するには、このコンポーネントの中の４つのプログラムを使用します。
• Open Destination …… メッセージを送信するキューをオープンします。
• Send Message …… メッセージを送信します。
• Read Message …… メッセージを受信します。
• Close Destination…… キューをクローズします。
一度キューをオープンすると、何回でもメッセージを送受信することができます。
以下に、メッセージを送受信するプログラムを作成する上で、必要なコンポーネントプ
ログラムを呼び出す方法を説明します。送受信処理用のハンドラを作成し、その中でプログラムを呼び出すものとします。

334

開発者ガイドMagic eDeveloper V9 Plus

Magic と JMS 間のメッセージの送受信

JMS のキューをオープンするプログラムを呼び出す :1. プログラムには、内部のキュー ID を格納するための数値型の変数を定義します。変数は、負数を使用できるように書式を指定してください。（例：N17）
2. コールプログラムを定義します。
3. プログラム一覧よりコンポーネントのプログラムを選択します。これらは、赤字で表示されます。また、コンポーネント名が接頭語として表示されます。
4. 「JMS.JMS Open Destination」というプログラムを選択します。このプログラムには、
１１のパラメータを渡します。
•

Connection Factory Name …… キューに対する接続ファクトリ名を指定します。
J2EESDK1.3 には、デフォルトで「QueueConnectionFactory」という接続ファクトリが登録されています。

•

Queue Name …… キューの名前を指定します。J2EESDK1.3 には、デフォルトで「jms/Queue」というキューが登録されています。

•

User Name …… JMS サーバにアクセスアクセス制限がある場合にユーザ名を指定します。デフォルトでは指定しません。

•

Password ……［UserName］に対するパスワードを指定します。デフォルトでは指定しません。

•

Transacted Operation …… キューがトランザクションの一部かどうかを指定します。指定すると全てのメッセージはトランザクション内に置かれます。トラン
ザクションを使用しない場合は、「False」を指定します。

•

Acknowledgement Mode …… Ack 情報がどこで作成されるかを指定します。以下のオプションがあります。

••

1 ……Auto Acknowledge：このモードが指定された状態でメッセージを受信するとメッセージは自動的に Ack を返します。通常はこちらを指定してください。

•

2……Client Acknowledge：このモードが指定された状態でメッセージを受信すると手動で Ack を返さなければなりません。

•

3……Dups OK Acknowledge：このモードに設定すると、Ack は自動的には返りません。JMS によって返ることになります。このため、このモードを使用することで、重複したメッセージを送信することができます。

以下のパラメータはここでは指定しません。（内容は『Magic メッセージング接続コンポーネント』を参照してください。）•

Message selector•

Topic?

•

Durable subscription?

•

Durable subscription Name•

Publish/Subscribe option

5. コールコマンドの戻り値として、あらかじめ定義された数値型変数を設定します。
ここにはキューの ID が返ります。正常にキューがオープンできれば、ここには正の数値が返ります。この値は後の処理で使用することになります。エラーが発生した場合は負数が返ります。
6. これ以降の手順での操作は、ブロックコマンド内で行ってください。ブロックコマ
ンドの条件として、「キュー ID>0 」を設定します。キューがオープンした時のみこの処理が実行されます。

開発者ガイドMagic eDeveloper V9 Plus335

第 24 章 - メッセージの送受信

JMS にメッセージを送信するプログラムを呼び出す :1. コール処理コマンドを定義します。
2. 「JMS.JMS Send Message」プログラムを呼び出すようにします。このプログラムには、５つのパラメータがあります。
•

Queue Handle …… キューのオープンプログラムから返されたキューの ID を指定します。

•

Message Type …… メッセージのタイプです。テキストメッセージを送信する場
合は、「T」と指定します。他のタイプを指定する場合は、『Magic メッセージン
グ接続コンポーネント』を参照してください。

•

Message …… メッセージ内容を設定します。メッセージをデータ項目で指定する場合は、Blob 型データで指定し、GUI フォーム上はリッチエディットコント
ロールで表示します。コンポーネントに登録されているモデルを使用すると便利です。

•

以下のパラメータはここでは指定しません。
•

Correlation Id•

Message ID （送信処理を行うと値が返ります。）

JMS のメッセージを受信するプログラムを呼び出す :1. コール処理コマンドを定義します。
2. 「JMS.JMS Read Message」プログラムを呼び出すようにします。このプログラムには、５つのパラメータがあります。
•

Queue Handle …… キューのオープンプログラムから返されたキューの ID を指定します。

•

Time Out …… メッセージの待ち時間を指定します。「0」を指定することでメッ
セージがキューに到着するまで待つようになります。

•

Message …… 受信メッセージを格納するための Blob 項目を定義します。GUI
フォーム上はリッチエディットコントロールで表示します。

•

以下のパラメータはコンポーネントプログラムから値が設定されるため指定する必要はありません。
•

Message Type•

Correlation ID

メッセージキューをクロースするプログラムを呼び出す :1. コール処理コマンドを定義します。
2. 「JMS.JMS Close Destination」プログラムを呼び出すようにします。このプログラムには、パラメータとして キューの ID を渡します。

エラーが発生した場合にユーザに表示する：
コンポーネントでエラーが発生した場合、エラーログに書き込みます。ユーザ
がこのメッセージを参照することはありません。エラーが発生したかどうかをユーザが参照するには、コンポーネントに登録されているイベントをトリガにしたハンドラを作成する必要があります。
1. ユーザハンドラを作成します。

336

開発者ガイドMagic eDeveloper V9 Plus

メッセージングコンポーネントの場所を変更する
2. ハンドラのトリガイベントでズームして、イベント一覧より「JMS.Public Error 」を選択します。
3. ハンドラには、パラメータ用に四つの変数を定義します。
•

Message System …… これは文字列パラメータです。今回の場合、’J’ が返ります。

•

Error Code …… 負数（N17）の値が返ります。

•

Validation …… 論理値が返ります。「True」の場合、コンポーネントがパラメー
タをチェックした結果としての値です。
「False」の場合は、JMS のエラーを表します。

•

Error Message …… エラーメッセージが返ります。

4. エラーコマンドを定義し、エラーメッセージを表示テキストとします。実行条件として、「Error Code<0」と指定します。
Magic のメッセージングコンポーネントは、自動的にメッセージをログファイルに書き込みます。このメッセージには、警告やエラーが含まれています。
このログファイルの名前は、次の論理名で定義されています。

MessagingErrorLogFile

メッセージングコンポーネントの場所を変更する
メッセージングコンポーネントと関連するファイルは、Magic のインストールディレク
トリの下のMessasingサブフォルダにあります。エラーは自動的にログに書き込まれます。

メッセージングコンポーネントの場所を変更する：
Messaging サブフォルダの場所は、以下の論理名で定義されています。

MessagingComponentDir
ディレクトリを変更する場合は、論理名の実行名を変更する必要があります。
例えば、以下のように変更します。
• 変更前：C:¥Magic¥Magic940¥Messaging¥• 変更後：F:¥Magic¥Messaging¥
ディレクトリ名の最後には、バックスラッシュ（¥）を付けてください。

開発者ガイドMagic eDeveloper V9 Plus337

第 24 章 - メッセージの送受信［このページは意図的に空白にしています。］

338

開発者ガイドMagic eDeveloper V9 Plusドラッグ & ドロップ機能の利用

25

Magic では、ドラッグ & ドロップ機能を使用することで他のアプリケーション間でのデータの転送が簡単にできます。この機能は、Magic アプリケーション間でも同様に行うことができます。
ドラッグ & ドロップ機能は、フォームや、エディットコントロール、テーブルコント
ロールなどの GUI 表示フォーム上のオブジェクトで利用できます。フォームやコント
ロールのドラッグまたはドロップに関する設定を行うことで、この機能が有効になります。

ここでは、以下の内容について説明いたします。
Magic から外部アプリケーションにデータをドラッグする

340 ページ

外部アプリケーションから Magic にデータをドラッグする

340 ページ

ドラッグ & ドロップのマウスポインタの外観の定義

341 ページ

複数のコントロールを一緒にドラッグする

341 ページ

ユーザ定義フォーマットを使用したドラッグ & ドロップ

342 ページ

テーブル間での複数のレコードをドラッグする

343 ページ

開発者ガイドMagic eDeveloper V9 Plus339

第 25 章 - ドラッグ & ドロップ機能の利用

Magic から外部アプリケーションにデータをドラッグする
データを Magic からドラッグ & ドロップ機能をサポートした外部アプリケーションにドラッグするには、以下のようにします。
Magic から外部のアプリケーションにドラッグできるようにする：
1. タスクのフォームに移動し、ドラッグさせたいコントロールを選択します。
2. ［コントロール特性］を開き、［詳細］セクションの［ドラッグ許可］特性を「Yes」に設定します。

外部アプリケーションから Magic にデータをドラッグする
ドラッグ & ドロップ機能をサポートした外部アプリケーションから、Magic にデータをドラッグするには、次の２つの方法があります。
• エディットコントロールの使用• RTF コントロールとして配置された BLOB 項目の使用
タスクが修正または登録モードであれば、Mgaic のデータ項目にドロップすることができます。

エディットコントロールの使用
外部アプリケーションから Magic のエディットコントロ−ルにデータをドラッグさせる：1. タスクのフォームに移動し、ドロップさせたいエディットコントロールを選択します。
2. ［コントロール特性］を開き、［詳細］セクションの［ドロップ許可］特性を「Yes」に設定します。

RTF コントロールとして配置された BLOB 項目の使用
外部アプリケーションから Magic に表示属性を含めてデータをドラッグさせる：
1. Magic プログラムに BlOB 項目を定義します。
2. ［項目特性］の［スタイル］セクションの［GUI 表示］特性を「I= リッチエディッ
ト」に設定します。
3. プログラムのフォームをにこの項目を配置します。
RTF エディットコントロールのコントロール特性には［ドラッグ許可］や［ドロップ許可］特性は表示されません。RTF エディットコントロールは、自動的にこれらの機能が有効になっています。
外部アプリケーションから RTF エディットコントロールにテキストがドラッグされた場
合、表示書式も一緒にコピーされます。

340

開発者ガイドMagic eDeveloper V9 Plusドラッグ & ドロップのマウスポインタの外観の定義

ドラッグ & ドロップのマウスポインタの外観の定義
イベントハンドラを利用することで、ドラッグ & ドロップ動作時のマウスポインタのア
イコン表示を変更することができます。この場合、以下の手順でプログラムを修正する必要があります。
1. 「ドラッグ開始」ハンドラを定義します。
2. このハンドラ内で、DragSetCrsr 関数を実行させます。
以下に具体的な方法について説明します。

「ドラッグ開始」ハンドラの定義「ドラッグ開始」ハンドラを定義する：
1. タスクに２つの文字型変数を定義し、表示フォームを作成します。
2. 最初のエディットコントロールの［ドラッグ許可］特性を「Yes」に設定します。
3. ２番目のエディットコントロールの［ドロップ許可］特性を「Yes」に設定します。
4. タスクにハンドラを作成します。ハンドラのイベントには、内部イベントの「ドラッグ開始」を定義します。

アクション処理コマンドで DragSetCrsr 関数を実行「ドラッグ開始」ハンドラにアクションコマンドを使用して DragSetCrsr 関数を実行させるように定義します。この関数は、ドロップ可能なコントロールと不可能なコントロ−ルで異なったカーソルの表示を定義できます。
例：
DragSetCrsr (1,'EnableCursorFile.cur')DragSetCrsr (2,'DisableCursorFile.cur')
この場合、［ドロップ許可］特性が「Yes」のコントロールにカーソルを移動すると「EnableCursorFile.cur」で指定された表示になり、「No」のコントロールにカーソルを移動すると「DisableCursorFile.cur」で指定された表示になります。

複数のコントロールを一緒にドラッグする
Magic のデフォルトのドラッグ処理は、１つのコントロールに対してのみ有効ですが、プ
ログラムによっては、テーブルコントロール上のレコードのような複数のコントロール
に対して、ドラッグすることができます。
以下の手順によって、レコードをマークしてドラッグし、外部アプリケーションや Magic
アプリケーションの RTF エディットコントロールにドロップすることができます。

複数のコントロールをドラッグできるようにする：
1. ラインモード表示のタスクに文字型変数（A）を定義します。変数のサイズは、ドラッグされる文字列の総桁数分を指定します。この変数は、ドラッグバッファ内の文字列を連結させるために使用されます。
2. GUI 表示フォームにテーブルコントロールを配置し、［ドラッグ許可］特性を「Yes」に設定します。（「マルチマーキング」特性も「Yes」にしてください。）

開発者ガイドMagic eDeveloper V9 Plus341

第 25 章 - ドラッグ & ドロップ機能の利用
3. タスクにハンドラを定義し、「ドラッグ開始」イベントをトリガとして定義します。
4. ハンドラ内で、文字型変数（A）を初期化（空白で更新）する処理を定義します。条件式は以下のようになります。
MMCurr(0)=1
5. ドラッグ処理によってコピーしたいテーブル内の項目（B）で、文字型変数を更新します。必要によってデータ変換を行い、既存の文字列に項目の内容を連結させるよ
うにします。２つの値の間には、区切り文字として Chr(9)（=HT コード）を挿入します。この場合以下のような式になります。
Trim(B)&Chr(9)&Trim(A)
6. アクションコマンドで DragSetData() 関数を実行します。パラメータとして、一番目に文字型変数（A）を指定し、二番目にデータのタイプとして「1」を指定します。
7. テーブルをマルチマーキングした状態でドラッグし、他のアプリケーションにドロップすると、マークしたレコードの指定されたカラムデータが連結されて貼り付けられます。

「HT コード」で連結することで、例えば Micrisoft Excel のようなスプレッド
シートにドラッグすると、各カラムデータが異なるセルに挿入されます。

ユーザ定義フォーマットを使用したドラッグ & ドロップ
Magic は、テキスト、OEM テキスト、リッチテキスト、HTML、ハイパーリンクの各
フォーマットを認識します。これらの標準的なフォーマットに加え、Magic にこれ以外のフォーマットを認識させることができます。これをユーザ定義フォーマットと言います。
ユーザ定義フォーマットでドラッグ & ドロップを行う前に、DropFormat 関数を使用してドロップされるオブジェクトがサポートされているかどうかを確認する必要があります。この関数は、オブジェクトがドラッグ & ドロップをサポートしていると「True」が返ります。
ユーザ定義フォーマットを使用することでアプリケーションの指定された情報を取得することができます。ここでは、Windows エクスプローラからドロップしたファイルの名前を取得するプログラムについて説明します。

ドラッグ & ドロップにてユーザ定義フォーマットを有効にする：
1. ［設定］メニューの［動作環境］をクリックし、［外部参照］タブの［ドロップデー
タサポート・ユーザフォーマット］に「FileName」と指定します。
2. プログラムに文字型変数（A、B）を２つ定義します。フォームにこれらを配置し、最初の変数（A）に対応したエディットコントロールの［ドロップ許可］を「Yes」に設定します。
3. 「ドロップ」イベントをトリガとしたハンドラを定義します。ハンドラには、２番目の変数（B）を DropGetData (0,'FileName') で更新する処理を定義します。
4. 確認のため、プログラムを実行してください。Windows エクスプローラをを起動させ、ファイルをドラッグし、最初のコントロールにドロップしてみてください。２番目のエディットコントロールにファイル名が表示されます。
ユーザ定義フォーマットで以下のような情報が取得できます。
• UniformResourceLocator
URL が返ります。

342……Web ブラウザのアドレスタブからドラッグするとその開発者ガイドMagic eDeveloper V9 Plus

テーブル間での複数のレコードをドラッグする

テーブル間での複数のレコードをドラッグする
テーブルのマークされたレコードのインデックスをベクトルデータに格納することで、複数のレコードに対するドラッグ & ドロップが可能になります。これらのインデックス
は、ドロップ時に相手のテーブルに貼り付けられます。
以下の手順で、複数のレコードをドラッグできるようになります。
1. ユーザインタフェースを作成します。
2. ２つのハンドラを定義します。
3. ２つのリンクコマンドを定義します。

ユーザインタフェースの作成
最初に、同じ構成のデータベーステーブルを定義します。
一方のテーブルをソーステーブルとし、他方をデスティネーションテーブルとします。
この例では、テーブルに数値型（Code）と文字型（Value）の２つのカラムを定義します。
テーブルのインデックスセグメントに「Code」を割り当てます。

２つのテーブルを使用したプログラムを作成する：
1. ラインモードでソーステーブルを表示させるプログラムを作成します。メイン
フォームのテーブルコントロールは、［ドラッグ許可］を「Yes」に設定します。
2. プログラムには、コールタスクコマンドを二カ所に定義します。１つは、レコード
メインでもう一カ所は、タスク前処理に定義します。
3. このプログラムのサブタスクとしてデスティネーションテーブルをラインモード表
示するタスクを作成します。メインフォームのテーブルコントロールは、［ドロップ許可］を「Yes」に設定します。
4. サブタスクの終了条件に「Level (1)='TP'」を設定します。
5. サブタスクのタスク制御ダイアログの［オプション］タブの［ウィンドウ消去］パ
ラメータを「No」に設定します。
6. 親子タスク上のテーブルが同時に表示するようにフォームを調整します。
7. 親タスクに戻り、ベクトル型の変数を定義します。変数名を「Index vector」とします。この場合、事前にモデルリポジトリに 「Code」と同じ書式のモデルを定義しておいてください。ベクトル型変数の［セルモデル］特性には、このモデルを指定します。

２つのハンドラを定義する
次に２つのハンドラを定義します。一方は、「ドラッグ開始」イベントで、他方は、「ドロップ」イベントをトリガにしたものです。

「ドラッグ開始」イベントハンドラを定義する：
1. ハンドラを作成し、「ドラッグ開始」イベントをトリガとして定義します。
2. 最初のレコードでハンドラが実行された場合に、変数「Index vector」を NULL（）
関数で更新します。これは、更新条件を MMCurr (0)=1 とすることで可能です。
3. アクションコマンドを使用することで、マークされたレコードに対してベクトル
データに値を設定するようにします。

開発者ガイドMagic eDeveloper V9 Plus343

第 25 章 - ドラッグ & ドロップ機能の利用
VecSet（Index vector 項目 ,MMCurr (0), ソーステーブルの Code 項目）
これにより、マークされたレコードに対する Code 項目の内容を含むベクトルデータが返ります。

「ドロップ」イベントハンドラを定義する：
1. サブタスクに移動し、「ドロップ」イベントをトリガとしたハンドラを作成します。
2. ハンドラ内に、ブロックコマンドで「Loop」を定義します。条件欄に以下の式を指定します。
LoopCounter ()<=VecSize (Index Vector 項目 )3. ブロック内にコールタスクコマンドを定義します。
4. サブタスクに変数「Index vector」の現在値をパラメータとして渡します。VecGet(Index
vector 項目 , loopcounter()) を使用します。
5. ブロックの外で、イベント実行コマンドを使用して、「ビュー再表示」という内部イ
ベントを発行するようにします。
6. 起動されるサブタスクを作成します。このタスクは、バッチタスクでメインテーブ
ルがありません。［タスク終了条件］は、「Yes」で、［チェック時期］を「A= 後置」と指定します。
7. 上記のバッチタスク内で数値型のパラメータ項目を定義します。ここには、親タス
クのパラメータ（Index Value）が渡されます。

２つのリンクコマンドを定義する
次に、バッチタスク内に２つのリンクコマンドを定義します。１つはソーステーブルを、
もう１つはデスティネーションテーブルをリンクします。
1. ソーステーブルに対する照会リンクコマンドを定義します。パラメータ変数で位置付けします。
2. デスティネーションテーブルに対する書込リンクを定義します。パラメータ変数で位置付けと代入指定をを行います。
3. レコード後処理で、デスティネーションテーブルの Value 項目の値をソーステーブ
ルの Value 項目の値で更新するように定義します。

344

開発者ガイドMagic eDeveloper V9 Plusブロックループ処理コマンド

26

ブロックループ処理コマンドは、指定された条件内で処理を繰り返す Do ループのような動作をします。
ブロックループの条件には通常の Magic の条件式が指定できますし、ブロックループ処
理用に提供されたカウンター関数を使用することもできます。
ブロックループは、レコードメインでは使用できません。
ここでは以下の処理について説明いたします。
１つの処理ブロックを繰り返し実行させる

346 ページ

繰り返し回数の監視

346 ページ

開発者ガイドMagic eDeveloper V9 Plus345

第 26 章 - ブロックループ処理コマンド

１つの処理ブロックを繰り返し実行させる
ブロックループを使用すると、オンラインタスクでバッチタスクのような処理ができます。ここでは、文字列の解析処理を例に説明します。

１つの処理ブロックを繰り返し実行させる：
1. オンラインタスクを作成します。このタスクには以下の変数を定義します。
•

ループカウンタ用の数値型の変数•

解析対象となる文字列を格納する文字型の変数•

解析結果を保存するベクトル型の変数。セルモデルには文字型のモデルを設定します。

2. ハンドラの最初にカウンタ変数を初期化する項目更新処理を定義します。
3. ブロック処理コマンドを定義し、ブロックタイプに「Loop」を設定します。
4. ［条件］カラムに以下のようなループ条件を設定します。
ループカウンタ変数 <=StrTokenCnt ( 文字列格納変数 ,',')
指定した条件が「True」の場合は、ループ処理を実行します。この条件式では、文字列格納変数に「AAAA,BBB,CCC」と入っている場合、３回処理を繰り返すことになります。
5. ブロックコマンド内では以下の処理を定義します。
•

アクションコマンドを定義して以下の関数を実行します。

VecSet（ベクトル変数 , ループカウンタ変数 ,StrToken（Trim（文字列格納変数）,
ループカウンタ変数 ,','））•

ループカウンタ変数の値を +1 更新します。

これで、ベクトル変数内のセルに文字列が挿入されます。

繰り返し回数の監視
繰り返し回数を管理するために、LoopCounter 関数を使用することができます。条件として、LoopCounter()<=N と指定することにより N 回処理が繰り返されます。
これにより、プログラム内で繰り返し回数をカウントアップする処理を組みこむ必要がありません。
LoopCounter 関数の使用は、ブロック関数内でのみ有効で、ブロック外では常に「0」が返ります。
前述の文字列の解析処理プログラムを LoopCounter 関数を使用する用に変更すると以下のようになります。

LoopCounter 関数を使用して繰り返し処理を実行させる：
1. オンラインタスクを作成し、以下の変数を定義します。
•

解析対象となる文字列を格納する文字型の変数•

解析結果を保存するベクトル型の変数。セルモデルには文字型のモデルを設定します。

2. ブロック処理コマンドを定義し、ブロックタイプに「Loop」を設定します。
3. ［条件］カラムに以下のようなループ条件を設定します。

346

開発者ガイドMagic eDeveloper V9 Plus

繰り返し回数の監視
LoopCounter()<=StrTokenCnt ( 文字列格納変数 ,',')
4. ブロックコマンド内では、以下の処理を定義します。
•

アクションコマンドを定義して以下の関数を実行します。

VecSet（ベクトル変数 ,LoopCounter(),StrToken（Trim（文字列格納変数）,LoopCounter(),','））

このように LoopCounter 関数を使用するとカウンタ変数の定義や更新処理を省くことができます。

開発者ガイドMagic eDeveloper V9 Plus347

第 26 章 - ブロックループ処理コマンド［このページは意図的に空白にしています。］

348

開発者ガイドMagic eDeveloper V9 Plus

リストボックスの利用

27

リストボックスでは複数の値を選択することができます。複数の値を格納できるベクタ
型項目をリストボックスとして配置することで可能になります。ベクトルのセルモデルの設定によって、文字型データ以外のデータと関連付けることができます。
ここでは、以下の内容について説明します。
リストボックスから複数の項目を選択させる

350 ページ

文字列以外のデータの取得

351 ページ

文字型および、メモ型の項目をリストボックスにする場合は、リストボックスの特性
を「M= マルチ」にするだけで可能ですが、この章では、ベクトル型項目をリスト
ボックスにすることを前提に説明しています。

開発者ガイドMagic eDeveloper V9 Plus349

第 27 章 - リストボックスの利用

リストボックスから複数の項目を選択させる
リストボックスを配置したプログラムを作成する
1. ベクトルセル用のモデルを定義します。（例：文字型 - 6）
2. ベクトル型の変数を定義し、項目特性の［セルモデル］特性欄に、#1 で定義したモデルを指定します。
3. 別の変数を定義し、Blob 型にします。この項目には、後で選択項目が入ります。項
目特性の［スタイル］セクションの［GUI 表示］特性に「リッチエディット」と指定します。
4. タスクのメインフォームを開き、ベクトル項目をリストボックスとしてフォームに配置します。リストボックスのコントロール特性を開き、［入力］セクションの［選択モード］特性を「M= マルチ」に設定します。また、Blob 項目を RTF エディット
コントロールとして配置します。
5. リストボックスの［ソーステーブル］や［表示項目］などの定義してデータコント
ロールとするか［選択項目リスト］に選択値を指定します。

選択内容を入力するハンドラを作成する
複数選択のリストボックスは、フォーカスが他の項目に移動したときに、コントロール
変更イベントのみトリガとして発行されます。

［コントロール変更］ハンドラを使用する場合
1. 以下のハンドラを作成します。
•

レベル……「C= コントロール」•

イベント……「C= 変更」•

詳細［コントロール］……リストボックスコントロールのコントロール名

2. ハンドラには以下の処理を定義します。
1. Blob 項目を空白で更新します。
2. ブロックループを定義し、ループ条件に 以下の式を指定します。
LoopCounter()<= VecSize（ベクトル項目）
3. ブロックループ内で Blob 項目を更新し、以下の内容に連結するようにします。
Blob 項目 &VecGet( ベクトル項目 , LoopCounter())&Chr(13)&Chr(10)もしフォーカスがまだリストボックス上にある場合に、処理を実行させたい場合は、他のイベント（例えば：［ズーム］イベント）で同じようなハンドラ定義する必要があります。この場合、項目は更新されていないので、Editget 関数を使用して値を取得する必要があります。

［ズーム］イベントハンドラを使用する場合
1. 以下のハンドラを作成します。

350•

レベル……「H= ハンドラ」•

イベント……「ズーム」

開発者ガイドMagic eDeveloper V9 Plus

文字列以外のデータの取得•

詳細［コントロール］……リストボックスコントロールのコントロール名

2. ハンドラには以下の処理を定義します。
コントロール変更イベント以外のトリガを使用する場合は、ベクトル項目の代わりに Editget 関数を指定します。
1. Blob 項目を空白で更新します。
2. ブロックループを定義し、ループ条件に 以下の式を指定します。
LoopCounter()<= VecSize（EditGet ()）
3. ブロックループ内で Blob 項目を更新し、以下の内容に連結するようにします。
Blob 項目 &VecGet(EditGet (), LoopCounter())&Chr(13)&Chr(10)マルチ選択リストボックスのチェック
リストボックスの選択処理を確認する：
1. タスクを実行します。
2. Ctrl キーを押します。
3. マウスでリストボックスを複数選択（クリック）してみます。
4. リストボックスで選択した値を入力するためにリッチエディットコントロールをクリックします。
［ズーム］イベントを使用した場合は、選択された状態でズーム（F5）を発行します。

文字列以外のデータの取得
リストボックスから文字型データ以外の値を取り出す場合は、ベクトルデータのセルモ
デルのデータ型を変更してください。
文字列の並びとして取り出す場合は、変換関数（例：Str 関数）を使用して文字データに置き換える必要があります。そのままのデータ型で取り出す場合は、VecGet 関数を使用して対応するデータ型の項目に入力してください。

開発者ガイドMagic eDeveloper V9 Plus351

第 27 章 - リストボックスの利用［このページは意図的に空白にしています。］

352

開発者ガイドMagic eDeveloper V9 Plus

バッファの処理

28

Magic アプリケーションから他のアプリケーションにパラメータを渡す場合、一般的に、構造体やバッファといわれるバイナリデータを使用して行います。

ここでは以下の内容について説明いたします。
構造体の作成354 ページ

Magic からバッファを送る

355 ページ

開発者ガイドMagic eDeveloper V9 Plus353

第 28 章 - バッファの処理

構造体の作成Magic は、Blob 項目を利用したバッファを扱うことができます。バッファ関数を使用することで構造体を構築することができ、構造体にデータを渡したり、受け取ったりすることができます。

構造体を作成する：
1. Blob 項目を定義します。ここには、バイナリデータが格納されます。
バッファは、バイナリデータとして格納されます。Blob 自体はデータ長を意識していませんので、データを格納したり取り出す際は、該当データの格納位置とデータ長を明示的に指定する必要があります。
2. 数値データをバッファに追加する場合は、BufSetNum 関数を使用します。
例：BufSetNum ('H'VAR,1,B,3,8)
BufSetNum 関数のパラメータは以下の通りです。
•

バッファ項目…… 全ての バッファ関数で指定します。値が追加されるバッファ
項目として Blob 型の項目を指定します。

•

位置…… 値が追加される位置です。
この例では、位置を「1」にしています。構造体の最初であることを示しています。（Magic では、位置指定は 1 から始まります。）
バッファは、連続したデータの集まりです。そのため、バイナリデータのどこに追加するかを指定することはとても重要です。
値を連続して指定する場合、値を設定する位置と長さを考慮に入れて位置を指定してください。
例えば、「位置 =1」、「長さ =2」のデータの後に続くデータの位置は、「3」になります。

•

値…… 構造体に追加する値です。関数のタイプに合っていなければなりません。例えば、BufSetNum 関数や BufSetBit 関数の場合は、数値であり、BufSetAlpha関数の場合は、文字データにしなければなりません。
ここには、項目や固定値を組み合わせた定義式でも指定できます。

•

記憶形式……BufSetVariant 関数以外のすべての BuffSet 関数の四番目のパラメー
タで、数値によって記憶タイプを指定します。
例えば、数値を float タイプでバッファに追加するといった指定を行います。有効な記憶タイプは、別表（355 ページ）で示しています。

•

354

長さ…… 最後のパラメータは、追加するデータの長さです。記憶タイプの長さと合っていなければなりません。この例では、「8」に設定されています。

開発者ガイドMagic eDeveloper V9 Plus

Magic からバッファを送る

Magic の記憶タイプ
#

型

ID

記憶形式名

長さ

1

文字

1

String - 文字列の終端が Null ではない

<32K

2

文字

2

LString - Short Int の文字長を含んだ圧縮形式

255

3

文字

3

ZString - 文字列の終端が Null

<32K

4

数値

1

Signed Integer

1,2,4

5

数値

2

Unsigned Integer

1,2,4

6

数値

3

IEEE Float

4,8

7

数値

4

Float MS-Basic

4,8

8

数値

5

Float Decimal

4,8

9

数値

6

Packed Decimal（現在未サポート）

10

数値

7

Numeric（現在未サポート）

11

数値

8

Numeric Character（現在未サポート）

12

数値

10

C-ISAM Decimal

13

数値

11

Extended Float

14

論理

1

Number containing 0,1

1

15

論理

2

Dbase containing T,F

1

16

日付

1

Integer - 1/1/1 から始まる日付

4

17

日付

2

Integer - 1/1/1901 から始まる日付

4

18

日付

3

YYMD 4

5

19

時刻

1

Integer

4

20

時刻

2

HMSH

4

21

Blob

1

4 バイトの記憶長 + バッファ (16 バイト )

22

Blob

2

バッファ (16 バイト )構造体に追加する要素の詳細については、『リファレンス』のバッファ管理関数の説
明を参照してください。

Magic からバッファを送る
コールユーザ PRC コマンドを使用して外部の Dll を呼び出す際、バッファを使用してパラメータの受け渡しをすることができます。以下の例では、PC のシステム日付を取得す
る Windows の API を呼び出しています。

変数項目を準備する：
1. オンラインタスクを作成し変数を定義します。
シンボル名

名前

型

A

バッファ用変数

B=BLOB

B

年数格納用変数

N= 数値

4

C

月数格納用変数

N= 数値

2

開発者ガイドMagic eDeveloper V9 Plus

書式

355

第 28 章 - バッファの処理
シンボル名

名前

型

書式

D

週の何日目かを格納する変数

N= 数値

1

E

日にち格納用変数

N= 数値

2

F

時数数納用変数

N= 数値

2

G

分数格納用変数

N= 数値

2

H

ミリ秒格納用変数

N= 数値

3

API を呼び出すハンドラを定義する：
1. タスクにハンドラを作成します。
2. アクションコマンドで構造体の初期化を行います。
BufSetNum ('A'VAR,1,0,1,2)
BufSetNum ('A'VAR,3,0,1,2)
BufSetNum ('A'VAR,5,0,1,2)......
BufSetNum ('A'VAR,15,0,1,2)
3. コールユーザ PRC を定義し外部 Dll を呼び出すようにします。呼び出す関数を定義式で指定します。（［規］欄は、「STDCALL」にしてください。）
通常、これらの Dll は、Magic 用にコンパイルされているわけではありません。このため、文字列は、以下のように「@」で始まるようにしてください。
'@kernel32.GetSystemTime'
これは、kernel32.dll 内の ‘GetSystemTime’ 関数を呼び出しています。（kernel32.dll
は、Windows に標準で添付されているモジュールです。）
dll ファイル名にパスを指定することもできます。例えば、'@C:¥Windows¥System32¥kernel32.GetSystemTime'
パスが指定されていない場合は、Magic は、最初に Magic の作業フォルダを探し、ない場合は、環境変数の ’PATH’ で指定されているディレクトリを検索します。
System32 ディレクトリは、OS で認識できるパスのため、通常指定する必要はありません。
4. コールユーザ PRC の最初のパラメータとして、「関数マスク」と呼ばれる関数のヘッダを表す文字列を指定します。
GetSystemTime 関数の関数ヘッダは、以下の通りです。
Public Declare Sub GetSystemTime Lib "kernel32" Alias "GetSystemTime" (lpSystemTimeAs SYSTEMTIME)
GetSystemTime 関数を呼び出すには、SYSTEMTIME 構造体を必要とし、Sub(Void)と定義されていて戻り値がないことを示しています。このため「関数マスク」は、’T0’ となります。
関数の説明は、Dll のベンダから取得するかそのソースファイルを見てください。

「関数マスク」は、以下の文字で表されます。

356•

1 …… Char

•

2 …… Short•

4 …… Long

開発者ガイドMagic eDeveloper V9 Plus

Magic からバッファを送る•

F …… Float•

8 …… Double•

D …… Double pointer•

E …… Float pointer•

L …… Long pointer•

A …… Null で終了する String のアドレス•

V …… Void pointer•

0 …… Void•

T …… Structure

5. コールユーザ PRC の二番目のパラメータとして、GetSystemTime 関数に渡すパラメー
タを指定します。この例では、構造体 SYSTEMTIME をもつ Blob 項目を渡します。
項目を送る場合、参照渡しとなり、（外部）関数はその内容を必要に応じて更新します。
つまりパラメータは以下のようになります。
•??? 式 #

‘T0’

•

A

（バッファ用変数）0

6. コールユーザ PRC コマンドの後に、バッファから値を取り出す処理を定義します。
項目更新コマンドで取得したデータを変数に格納します。
•

年数格納用変数（B）……BufGetNum ('A'VAR,1,1,2)•

月数格納用変数（C）……BufGetNum ('A'VAR,3,1,2)....

•

ミリ秒格納用変数（H）……BufGetNum ('A'VAR,15,1,2)

SYSTEMTIME 構造体は次のように定義されています。
Public Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type

その他の構造体の例
SHBrowseForFolder
ユーザーにシェルフォルダーを選択させるためのダイアログボックスを表示します。

構造体
typedef struct _browseinfo {HWND
hwndOwner;
LPCITEMIDLIST pidlRoot;
LPTSTR
pszDisplayName;
LPCTSTR
lpszTitle;

開発者ガイドMagic eDeveloper V9 Plus357

第 28 章 - バッファの処理
UINT
ulFlags;
BFFCALLBACK lpfn;
LPARAM
lParam;int
iImage;} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;
この場合以下のように値を渡します。
hwndOwner……BufSetNum ('A'VAR,1,WINHWND (1),1,4)
pidlRoot……BufSetNum ('A'VAR,5,0,1,4)
pszDisplayName……BufSetAlpha ('A'VAR,9,Fill (' ',1024),3,1024,'TRUE'LOG)
lpszTitle……BufSetAlpha ('A'VAR,13,’ ヘッダテキスト ’,3,256,'TRUE'LOG)
ulFlags……BufSetNum ('A'VAR,17,1,1,4)
lpfn、lParam、iImage は、指定不要です。

コール PROC のパラメータ358•

式 ‘T4’•

バッファ用変数•アイテム ID リストを格納する数値変数

開発者ガイドMagic eDeveloper V9 Plus

マージ Web アプリケーション

29

ここでは、HTML マージ機能を利用した Web アプリケーションについて説明いたします。
Magic は、Web アプリケーションを開発する上での機能としてブラウザタスクの他にHTML マージ機能を提供しています。開発するアプリケーションによってどちらを使用するかを検討することも必要です。
この２つの機能の違いを説明した後、HTML マージ機能を利用した簡単なアプリケー
ションの開発手順を説明いたします。

ここでは以下の内容について説明いたします。
機能の比較

360 ページ

基本的なマージ Web アプリケーション

360 ページ

ファイルの配置363 ページ

Cookie の使用

364 ページ

セッション管理366 ページ

コンテキスト管理367 ページ

排他制御

370 ページ

SSL による暗号化

371 ページ

ファイルのアップロード

378 ページ

開発者ガイドMagic eDeveloper V9 Plus359

第 29 章 - マージ Web アプリケーション

機能の比較
HTML マージとブラウザタスクの機能を比較したものを以下に示します。
HTML マージ

ブラウザタスク処理フロー

ページを更新ページ上のデータを更新

どこで処理されるかサーバでのみ実行

クライアントとサーバで実行

ブラウザへのアドオンなし

ブラウザクライアント用のモジュールが必要

ブラウザの互換性

全てのブラウザで有効

Microsoft の Internet
Exploler 5.5 以上

入力するコードの複雑さ高い（スクリプトを記述したり、セッション管理
用プログラムが必要）

低い（C/S プログラムに近い）

コンテキストアプリケーションで考慮する必要がある

Application Server で管理
している

実行モード

ページ

フィールド

対話性

ページの送信処理や JavaScript を追加することで対応

イベントハンドラを使用することで自動的に対応

保守性

やや悪い

通常の Magic のプログラ
ムに準拠

ネットワークのバンド幅
の必要性

低い

高い（※）

転送モジュール

HTML

HTML/XML（※）アプリケーションの内容によります。より複雑で、表示フィールドが多いほど広帯
域のネットワーク環境が必要です。

基本的なマージ Web アプリケーション
マージ形式を使用したプログラムの例として、「商品一覧」というデータテーブルの内容を表示する簡単な Web プログラムを紹介します。このプログラムは、「商品番号」をパラメータとして渡されるとその番号以降を表示します。

表示するテーブルの内容
テーブルのカラムは以下の通りです。
名前

型

書式

商品番号

N= 数値

5Z

商品名

A= 文字列

20

単価

N= 数値

N7CZ

HTML ファイルの作成
HTML オーサリングツールを使用して HTML ファイルを作成します。このファイルにMagic のデータがマージされます。
<html>

360

開発者ガイドMagic eDeveloper V9 Plus

基本的なマージ Web アプリケーション<head><meta http‑equiv="Content‑Type" content="text/html; charset=shift̲jis"></head><body><p align="center"><font size="6"> 商品一覧 </font></p><hr><div align="center"><table border="1"><tr><td> 商品 #</td><td> 商品名 </td><td> 単価 </td></tr><!$MGREPEAT><tr><td><!$MG̲ID></td><td><!$MG̲Name></td><td><!$MG̲Price></td></tr><!$MGENDREPEAT></table></div></body></html>マージタグ
データ置換タグ
書式 ：<!$MG_ID>「ID」は任意の項目名です。この部分に Magic がデータを埋め込みます。開発時の［タグ］テーブルには「ID」のみが表示されます。

繰り返しタグ
書式 ：<!$MGREPEAT> 〜 <!$MGENDREPEAT><!$MGREPEAT><!$MGENDREPEAT> に囲まれた部分が繰り返されます。このタグは、テーブルを一覧形式で表示させる場合に使用します。開発時の［タグ］テーブルには表示されません。

条件タグ
書式 ：<!$MGIF_Active? > 〜 <!$MGELSE> 〜 <!$MGENDIF>
この記述で、”IF then else endif” の構文を実現します。
「Active?」は任意の名称で、「True」
かどうかの判定条件として扱われます。開発時の［タグ］テーブルには「Active?」が表示され、論理型の値を割り当てます。

マージプログラムの作成
HTML ファイルにテーブルのデータをマージするプログラムを作成します。

タスク特性• タスクタイプ……B= バッチ• メインテーブル……商品一覧テーブル

開発者ガイドMagic eDeveloper V9 Plus361

第 29 章 - マージ Web アプリケーション

フォームテーブル• フォーム形式……HTML マージ形式• HTML ファイル……作成した HTML ファイルを指定• トークン前付符号……<!$• トークン後付符号……>

タグテーブルタグテーブルには、HTML ファイルに定義されたタグ（「!$MG_」の後に記述された文字列）とデータを割り当てます。
• ID……カラム「商品番号」• Name……カラム「商品名」• Price……カラム「単価」

入出力テーブル• メディア……リクエスタ

タスク定義
レコードメイン
1. セレクト処理コマンドでパラメータ項目「変数：商品番号」を定義します。書式は、テーブルのカラムの 「商品番号」と同じです。
2. セレクト処理コマンドでテーブルのカラムを全て定義します。
3. カラム 「商品番号」のセレクト定義行の［範囲］カラムの最大値（左側）に「変数：
商品番号」を式テーブルで割り当てます。

レコード後
以下の内容でデータ出力コマンドを定義します。
• 内容……マージフォーム• ファイル……入出力テーブルに定義されたリクエスタ

マージプログラムの実行
マージプログラムは、開発モードで実行確認することができません。実行モードにして、
Web ブラウザより呼び出します。呼び出しには、Web ブラウザから URL を入力する方法と、他の Web ベージから Form タグで指定する方法の２種類があります。

URL で呼び出す
Web ブラウザより以下のような URL を入力して呼び出します。
http://［サーバー名］/［スクリプトパス］/mgrqispi94.dll?APPNAME=［アプリケー
ション名］&PRGNAME=［公開プログラム名］&ARGUMENTS=［パラメータ］
例えば以下のように指定します。
http://localhost/Magic94Scripts/mgrqispi94.dll?APPNAME=MergeProg&362

開発者ガイドMagic eDeveloper V9 Plus

ファイルの配置
PRGNAME=Test&ARGUMENTS=-N1013
これによって、プログラムが呼び出され、数値「1013」がパラメータとして渡されます。

JavaScript の利用
URL での呼び出し方法を JavaScript で関数化することができます。この場合、事前に Script
タグ内で関数を定義する必要があります。
<HTML>......
<script>function mgcall(prog,arg){
url = 'http://localhost/Magic94Scripts/mgrqispi94.dll?APPNAME=MergeProg&
PRGNAME=' + prog + '&ARGUMENTS=' + arg ;window.open (url,'MainFrame');}</script>.......
<a href="javascript:mgcall('Test','‑N1013')">MergeSample</a></font></p>

Form タグの送信で呼び出す
別の Web ページ（HTML ファイル）に［Submit ボタン］を配置し、ボタンがクリックされた時に呼び出すようにすることもできます。
<form action="http://localhost/Magic94Scripts/mgrqispi94.dll" method="post"><input type="submit" value=" 送信 " name="B1"><input type="hidden" name="APPNAME"value="MergeProg"><input type="hidden" name="PRGNAME"value="Test"><input type="hidden" name="ARGUMENTS"value="‑N1013">s</form>

これらの内容をマージ機能で動的に変更することも可能です。

ファイルの配置
マージアプリケーションは、Magic のアプリケーションファイル以外に様々なファイル
を利用します。これらは以下のように配置します。

HTML ファイル
静的 HTML
Magic アプリケーションがアクセスしない HTML ファイルは、Web サーバー上に配置します。

動的 HTML
マージファイルとして使用する HTML ファイルは、アプリケーションサーバー上に配置します。

開発者ガイドMagic eDeveloper V9 Plus363

第 29 章 - マージ Web アプリケーション

その他のファイル
画像ファイルWeb サーバー上に配置します。

JavaScript、CSS ファイル（*.js、*.css)
Web サーバー上に配置します。

PDF ファイル
ブラウザに表示するためには Web サーバー上に配置する必要があります。このため、Magic が PDF を作成する場合は、アプリケーションサーバーから、Web サーバにコピーする処理が必要です。

Cookie の使用
Cookie は、Web ブラウザを実行している PC 上にファイルとして情報を保存するものです。Cookie を使用することで以下のような処理を実現させることができます。
• 訪問者がそのページに何回訪れたか記録して表示する。
• 訪問者の好みの表示方法を記録しておき、次回訪問時にそのモードで表示する。
• 掲示板やチャットで入力したユーザー名を記録しておき、次回訪問時にユーザー名の入力を省略する。
• ログインによるセッションを確立する。
ここでは、Web アプリケーションで Cookie に情報を書き込む方法と Cookie から情報を読み込む方法を説明します。

Cookie の書き込み
Magic の HTML 形式や HTML フレームセット形式のフォームを使用する場合、フォーム
特性の［コンテキスト変数］を使用することで、Cookie を書き込むことができますが、マージ形式のフォームにはこの特性がありません。HTML マージの場合、HTML ファイ
ルに以下のような方法で Cookie の書き込み処理を記述します。
• HTML ファイルの先頭に書き込み処理を記述する。
• META タグを使用する。
• JavaScript を使用する。
• RQHTTPHEADER 関数を使用する。

HTML ファイルの先頭に 書き込み処理を記述する。
HTML ファイルの先頭に以下の記述を追加します。
<!$MG̲CookiesString>364<html>
・・・</html>
この場合、マージフォームの［タグ］テーブルに以下のように設定します。

開発者ガイドMagic eDeveloper V9 Plus

Cookie の使用• タグ名……CookiesString• 式……'set-cookie: NAME=VALUE; expires=Fri, 05-Mar-2010 04:00:00 GMT;'

META タグを使用する。
META タグの中に書き込み処理を記述します。
<html><head><meta http‑equiv="set‑cookie" content="<!$MG̲CookiesString>">・・・</html>

この場合、マージフォームの［タグ］テーブルに以下のように設定します。
• タグ名……CookiesString• 式……'NAME=VALUE; expires=Fri, 05-Mar-2010 04:00:00 GMT;'

JavaScript を使用する。
Scripts タグの中に JavaScript 形式で記述します。
<html>
・・・<script type="text/javascript">
document.cookie = "<!$MG̲CookiesString>";</script>・・・<body>• タグ名……CookiesString• 式……'NAME=VALUE; expires=Fri, 05-Mar-2010 04:00:00 GMT;'

RqHTTPHeader 関数を使用する。
タスク前処理にアクション処理コマンドでRqHTTPHeader関数を以下ように実行します。
RqHTTPHeader ('set-cookie: NAME=VALUE; expires=Fri, 05-Mar-2010 04:00:00
GMT;')
Cookie の書き込みの際に、日付制限（expires）を指定しないとブラウザ終了時にCookie の情報が削除されます。

Cookie の読み込み
書き込まれた Cookie の情報を読み込むには、以下の２つの方法があります。
• GetParam 関数を使用する。
• HTTP ヘッダ情報から取り出す。

GetParam 関数を使用する
Cookie に設定された内容は GetParam 関数を使用することで取得することができます。
例えば、以下のように Cookie が書き込まれた場合。
Set-Cookie: NAME=Tanaka;TIME=10:12:00; expiers=Fri, 31-Dec-2030 23:59:59;
GetParam(NAME) では、「Tanaka」が返ります。

開発者ガイドMagic eDeveloper V9 Plus365

第 29 章 - マージ Web アプリケーション
HTTP ヘッダ情報から取り出す。
また、HTTP ヘッダ情報を取り出すことで、まとめて取得することもできます。
Mgreq.ini に以下の記述を加えます。
HttpVarts = HTTP_COOKIE
この状態で、GetParam(HTTP_COOKIE) を実行すると「NAME=tanaka;TIME=10:12:00」が返ります。

セッション管理
セッション管理の必要性
HTTP プロトコルは Web サーバーとの接続を保持しません。このため、アプリケーショ
ンによっては、ブラウザからの呼び出しが同じユーザからなのかどうかをその都度チェックする必要があります。この処理をセッション管理といいます。
マージを使用した Web アプリケーションでは、セッション管理をアプリケーション側でサポートする必要があります。

セッション管理の方法
セッション管理は、セッション ID を使用して管理します。セッション ID を次のページに渡し、データベースと照合することでユーザを識別します。

図 29-1 セッション管理の概念図

セッション ID の生成
Web サーバー側でセッション ID を発行する際、ランダムで容易に推測できない値にしてください。規則性を持った（例えば 0001、0002、0003 のような）セッション ID を発行
すると、他のユーザによるなりすましが発生する危険性があります。完全にユニークなセッション ID を生成し、さらにセッション ID を暗号化するように検討してください。
例えば、「最終アクセス日時」と「ランダム値」、「ホストの IP アドレス」を組み合わせた文字列を暗号化するなどして算出します。

セッション ID の実装
セッション ID を実装する方法として、以下の２つがあります。

366• Cookie を使用する

開発者ガイドMagic eDeveloper V9 Plus

コンテキスト管理• Hiden フィールドに埋め込む。

Cookie を使用する
Cookie にセッション ID を書き込むことで、同一 PC 上のセッション ID を管理することができます。

Hiden フィールドに埋め込む
入力フォームを Web サーバーに送信する際に利用する FORM タグの hidden フィールドにセッション ID を持たせることで、セッション管理を実現できます。Cookie を使用できない場合はこちらを利用します。

セッション ID の保存
セッション ID は、データベースに保存します。データベースには以下の情報を保存します。
• セッション ID• ログイン日時• 最終更新日時• ユーザー ID
その他の項目はアプリケーションの要求に応じて管理します。

コンテキスト管理
コンテキストオブジェクトを使用すると、アプリケーション情報を保管したり、アプリ
ケーションのさまざまなコンポーネント間で情報を共有ですることができます。
たとえば、アプリケーションが複数の HTML ページなどで構成されているとします。これらのアプリケーションコンポーネント間でのやり取りを可能にするために、アプリ
ケーションコンテキストオブジェクトを使用して、その情報を保管したり、取り出したりすることができます。
Magic では以下の情報をコンテキスト毎に保持することができます。
• メモリテーブル• グローバル値 （GetParam 関数で取得できます。）• IniPut 関数で設定した値• メインプログラムで定義されたグローバル変数の内容

コンテキスト管理の有効化
ブラウザクライアントでは、コンテキスト管理を Magic 側の機能で行っていますが。マー
ジアプリケーションの場合は、アプリケーション側で以下のような設定が必要になりま
す。

タスク特性
［拡張］タブの［コンテキストの保持］を「Yes」（または、「True」になる式）に設定します。これにより、バッチタスクが終了してもコンテキストは破棄されなくなります。

開発者ガイドMagic eDeveloper V9 Plus367

第 29 章 - マージ Web アプリケーション

コンテキスト ID の取得
一番最初に自分のコンテクスト ID を取得する必要があります。このとき、CtxGetdId('')
関数を実行することで取得できます。

プログラム起動時の URL
プログラムを実行させるための URL にコンテキスト ID（CTX=）を明示的に入れるようにします。これにより、このリクエストは指定されたコンテキストで実行されます。

（例）
http://localhost/Magic94Scripts/mgrqispi94.dll?appname=Samples&prgname=Test&
CTX=123456789123456789

または、<FORM Name="Items" action="http://localhost/Magic94Scripts/mgrqispi94.dll"><input type="Hidden" name="APPNAME" value="Samples"><input type="Hidden" name="PRGNAME" value="Test"><input type="Hidden" name="CTX" value="123456789123456789"><input type=submit value=" 送信 "</FORM>

コンテキスト管理プログラム
以下の図は、コンテキスト管理を行った場合のプログラムのフローを表しています。
「ロ
グインチェックプログラム」で［コンテキスト保持］を「Yes」にすることで以降の処理中の同じコンテキストを使用することができます。これにより、プログラム間のパラメー
タは、コンテキスト ID のみとなり。
グローバル値やグローバル変数、メモリテーブルに値を設定することで、コンテキスト
内のデータの一貫性が保たれます。

図 29-2 コンテキスト管理の概念図

クライアントの認証
コンテキストにクライアントの認証情報がない場合、クライアント（ユーザ）が異なっていても、リクエストに指定されたコンテキスト ID さえ合っていれば（割り込みして）処理を継続させることができます。
このようなことを防ぐためには、一連の処理が同じクライアントで行われたことを識別する情報が必要になります。そのための情報として HTML 環境変数を利用します。

368

開発者ガイドMagic eDeveloper V9 Plus

コンテキスト管理

HTML 環境変数
HTML 環境変数とは、Web サーバやリクエストを送信したクライアントの情報を Web
サーバが設定する環境変数です。この値をもとにクライアントを識別することができます。クライアントに関する環境変数には以下のものがあります。
変数名

内容

REMOTE_ADDR

クライアント側のホスト名

REMOTE_HOST

クライアント側の IP アドレス

REMOTE_USER

サーバ認証で使用されるユーザー名 ※HTTP_COOKIE

Cookie の情報※「REMOTE_USER」は、エイリアスの［匿名アクセス］が有効になっている場合は取得できません。
Magic プログラムで HTML 環境変数の内容を取得するには、GetParam 関数を使用します。

認証項目を指定するクライアントの認証項目の指定は、インターネットリクエスタが参照する（同じディレクトリ内にある）MGREQ.INI ファイルで行います。

設定例[REQUESTER_ENV]…
HttpSigVars = REMOTE_ADDR…
ISAPI 用のインターネットリクエスタの場合、MGREQ.INI の変更を有効にするには、IISを再起動する必要があります。

確認
一方のクライアントの Web ブラウザからアプリケーションを呼び出します。
http://localhost/Magic94Scripts/mgrqispi94.dll?appname=Samples&prgname=Test

この時のコンテキスト ID を「123456789123456789」とします。別のクライアントの Web
ブラウザから同じサーバの同じアプリケーションをコンテキストIDを指定して呼び出します。
http://localhost/Magic94Scripts/mgrqispi94.dll?appname=Samples&prgname=Test&
CTX=123456789123456789

開発者ガイドMagic eDeveloper V9 Plus369

第 29 章 - マージ Web アプリケーション
HttpSigVars を指定した場合、以下のようなエラー画面が表示されます。

図 29-3Web アプリケーションの認証エラー

排他制御
排他制御の必要性
HTTP プロトコルは Web サーバーとの接続を保持しないため、DB サーバーとクライアン
ト PC 間の接続も維持されません。このため、ロックの状態を維持することができません。このため、GUI の Client/Server システムのようにデータベースのロック（行、テーブルともに）状態を保持することができません。
この理由によって、更新時の排他制御には工夫が必要になります。

実装方法の例
更新前に変更があったかどうかを判断する
レコードを更新する際にそのレコードが他のユーザによって更新されていないかどうかを確認する方法です。
1. ユーザーが特定のレコードを開いた時、そのレコードの明細に当たるレコードも開きます。
2. 更新ボタンを押して DB に書き込む前に再度同じレコードを読み込み、他ユーザーが変更していないかどうかをチェックします。
3. 変更されていなければ更新し、変更されている場合はエラーとして再度の検索、入力を促します。

セッション管理との組み合わせ
セッション管理 DB にテーブルの更新情報を記録して管理します。
1. ユーザーが特定のレコードの明細を開いたとき、セッション管理 DB にこのレコードが編集中という情報を設定します。
2. 他ユーザーがセッションのチェックを行う際、このユーザが該当レコードを編集中

370

開発者ガイドMagic eDeveloper V9 PlusSSL による暗号化というステータスを認識できるようになります。プログラムで他ユーザーからは更新できなくする（更新ボタンを隠してしまうなど）ことで制御します。

特定の１ユーザーのみ更新可能なしくみを作成する
この例は、１ユーザーのみ更新可にします。このため、排他を考慮する必要がありません。ユーザー ID の権限等で実現します。

SSL による暗号化
通常の Web システムでは，デフォルトの状態では暗号化の機能は有効ではなく、ネット
ワーク上を流れる情報が漏洩する危険性があります。このため、クレジットカード番号
や業務情報など、漏洩してはならない情報を送受信する場合には、危険を伴うことになります。
重要な情報を送受信したいときには、SSL（Secure Socket Layer）を使用することで通信を暗号化することができます。SSL を使った暗号化機能を有効にするには、IIS などの
Web サーバに「サーバ（CA）証明書」と呼ばれるファイルをインストールするなど、いくつかの作業が必要となります。
ここでは、Windows 2000 に付属している証明書サービスを使ってサーバ証明書を作成し、IIS にインストールして SSL を有効にするまでの設定と、クライアント証明書の作成とその使用方法について説明します。
この設定を行うことで、Web アプリケーション（マージやブラウザクライアント）の暗号化が実現できます。更に、証明書ファイルを Magic で指定することで Magic のプログ
ラムが Web 上のファイルにアクセスする場合の暗号化も可能になります。

サーバ証明書の作成とインストール
ここでは、Windows2000Server の証明書サービスを利用してサーバ証明書を作成し、IISにインストールする手順を説明します。

サーバ証明書とはサーバ証明書とは、暗号化に用いる秘密鍵の情報が格納されたファイルのことです。SSLによる暗号化の大まかな流れは、以下のようになります。
1. 秘密鍵と公開鍵を作る……サーバー上で事前に秘密鍵と公開鍵のペアを作ります。
2. 公開鍵を証明機関に渡す……#1 で作成した鍵のうち、公開鍵を証明機関に渡し、サー
バ証明書の発行依頼をします。
証明機関とは、一定の登録手続きによって、クライアントやサーバの証明書を発行する組織またはサーバのことです。一般的には、Verisign 社などの公的な証明機関を利用します。しかし、組織内のサーバやクライアントなど、多くの証明書が必要となる場合には、組織内にプライベートな証明機関を設置し、独自の証明書を発行することもできます。このような用途で利用されるのが，Windows 2000 に添付されている証明書サービスです。
証明機関は、渡された公開鍵を証明機関の秘密鍵で暗号化したサーバ証明書を返します。
3. Web サーバにインストールする……#1. で作成した秘密鍵と #2. で取得したサーバ証
明書を Web サーバ（ここでは、IIS）にインストールします。
4. 証明書サービス自身の証明を作成する……証明書サービスが有効であるかどうかをクライアントが確認するための証明書ファイルを作成します。
（このファイルはクライアントで使用します。）

開発者ガイドMagic eDeveloper V9 Plus371

第 29 章 - マージ Web アプリケーション
詳細については、Windows 2000Server の解説書などを参考にしてください。

サーバ証明書を作成するには：
1. Windows コンポーネントの［証明書サービス］をインストールします。
2. 「サーバ証明書の要求」を作成します。IIS の管理ツールから暗号化したいサイトのプロパティを開き、［ディレクトリセキュリティ］タブを開きます。
［サーバー証明書］ボタンをクリックすると［サーバー証明書ウイザード］のダイアログが表示され、必要な設定を行うことで要求ファイル（デフォルトは「certreq.txt」）が作成されます。

図 29-4IIS の［ディレクトリセキュリティ］タブ

3. サーバ証明書の発行を依頼します。証明書サービスが実行されているサーバに対する「Microsoft 証明書サービスページ」を Web ブラウザでオープンすることで、要求ファイルを証明書機関に発行します。

図 29-5Microsoft 証明書サービスページ

372

開発者ガイドMagic eDeveloper V9 PlusSSL による暗号化
4. 証明機関側でサーバ証明書を発行します。
［証明機関］の管理ツールで「保留中の要求」に対して発行処理を実行します。
5. 発行されたサーバ証明書を取得します。「Microsoft 証明書サービスページ」を利用して、保留中の証明書の確認処理を実行します。ここで、サーバ証明書のダウンロードを実行します。（デフォルトファイル名「certnew.cer」）

サーバ証明書サービスの公開キーの証明書の作成
サーバ証明書が有効かどうかを確認するために、クライアント側にもこの証明書サービ
スの公開キーを提供する必要があります。このファイルは、「SSL CA 証明書ファイル」
として Magic アプリケーションが SSL サイトにアクセスする場合のファイルになります。
1. 「Microsoft 証明書サービスページ」をオープンし、「CA 証明書または証明書失効リストの取得」を選択します。
2. ［CA 証明書のダウンロード］のリンクを持つ画面が表示されます。このリンクをクリックして、証明書サービス自身の証明書をダウンロードします。

図 29-6CA 証明書または証明書失効リストの取得

サーバ証明書をインストールするには：
1. IIS 側でサーバ証明書をインストールします。IIS の管理ツールから暗号化したいサ
イトのプロパティを開き、［ディレクトリセキュリティ］タブを開きます。
［サーバー証明書］ボタンをクリックします。
［サーバー証明書ウイザード］のダイアログが表示され、［保留中の証明書の要求］処理を実行するようになります。ここで、作成された証明書ファイルを指定してインストールします。

開発者ガイドMagic eDeveloper V9 Plus373

第 29 章 - マージ Web アプリケーション

図 29-7IIS の保留中の要求処理

2. 証明書をインストールすると、SSL による暗号化が有効になります。この場合、URLの指定で、「http://」ではなく「https://」を使用してアクセスします。

クライアント証明書の作成とインストール
SSL による暗号化機能を有効にすると、クライアント証明書を使った認証が実現できます。

クライアント証明書とはクライアント証明書とは、ユーザーを識別するデジタルデータのことです。クライアン
ト証明書を使うと、ユーザー名とパスワードを入力する一般的なユーザーの識別法よりも、厳格にユーザーを識別することができます。
クライアント証明書は、ユーザーが申請した情報を証明機関（公的証明機関や証明書サービス）の秘密鍵で暗号化したものす。ユーザーが申請する情報には、ユーザー名、メー
ルアドレス、会社名、住所などがあります。クライアント証明書は、サーバー側に SSL
で暗号化して送付されるので、途中で偽造されることがありません。

クライアント証明書を作成してインストールする手順は以下の通りです。
1. 「クライアント証明書の要求」の作成ならびに発行依頼
2. 証明機関による発行処理
3. 発行されたクライアント証明書のインストール
この処理は、証明機関による発行処理以外は、すべてクライアント側で行います。

クライアント証明書の要求を作成および発行依頼するには :クライアント証明書を取得するには、「クライアント証明書の要求」を作成し、それを証明書サービスに送付して発行を依頼する必要があります。
1. 「Microsoft 証明書サービスページ」を開きます。

374

2. ［要求の詳細設定］／［フォームを使用してこの CA への証明書の要求を送信します。］を選択して［Web ブラウザ証明書］を要求する処理を実行します。

開発者ガイドMagic eDeveloper V9 PlusSSL による暗号化
その際、［キーのオプション］で［エクスポート可能なキーとしてマークする］を「オン」に指定します。

図 29-8Web ブラウザ証明書のキーオプション

3. ［秘密キーのパスワード作成］ダイアログが表示されるので、パスワードを入力します。
クライアント証明書はサーバー証明書と同様に、Verisign などの公的証明機関
を通じて取得することもできます。

証明機関による発行処理をおこなうには :クライアントから送付されたクライアント証明書の要求は、証明書サービスに随時追加されます。追加された要求は、［証明機関］管理ツールの［保留中の要求］の中に含まれます。
証明書サービスの管理者は、この要求に対して［発行］処理を実行することでクライアント証明書が発行されます。

発行されたクライアント証明書をインストールするには：証明書サービスでクライアント証明書を発行したら、次に証明書サービスがインストー
ルされたサーバーにクライアント側からアクセスし、発行済みとなったクライアント証
明書を取得し、Web ブラウザにインストールします。
1. 「Microsoft 証明書サービスページ」を開きます。
2. ［保留中の証明書の確認］を選択してインストールしたいクライアント証明書を選択しインストール処理を実行します。

開発者ガイドMagic eDeveloper V9 Plus375

第 29 章 - マージ Web アプリケーション

図 29-9 証明書のインストール

証明書ファイルをエクスポートするには :クライアント証明書をインストールすると（Internet Explore の場合）ブラウザの証明書
ダイアログの［個人］タブに証明書が追加されます。この内容をエクスポートして Magic
側で「SSL クライアント証明書ファイル」として使用します。
1. Internet Explore のプロパティを開きます。
2. ［個人］タブを開きます。インストールされた証明書が表示されています。
3. ［エクスポート］ボタンをクリックしてエクスポートウィザードを実行します。
4. ［秘密キーのエクスポート］の選択では、「はい、秘密キーをエクスポートします。」
を選択します。
5. ［エクスポートファイルの形式］の選択では、「PKCS#12」のみ有効になっています。全てのチェックボックスをオンにします。
6. ［パスワード］では、証明書ファイルを作成する上でのパスワードを指定します。
7. ［エクスポートするファイル］でファイル名を指定してください。

クライアント証明書を有効にするには :IIS にサーバ証明書をインストールした時点では、通常の HTTP と SSL（HTTPS）の両方が有効になっています。このサイトを SSL のみ有効にし、さらにクライアント証明書がないとアクセスできなくなるようにすることができます。
1. IIS の管理ツールから暗号されたサイトのプロパティを開き、［ディレクトリセキュリティ］タブを開きます。
［編集］ボタンをクリックすると［セキュリティで保護された通信］のダイアログが表示されます。

376

開発者ガイドMagic eDeveloper V9 PlusSSL による暗号化

図 29-10 IIS のセキュリティの設定

2. ［保護されたチャネル（SSL）を要求する］のチェックボックスをチェックします。
（この設定により、このサイトでは HTTPS でのみアクセス可能になります。）
3. ［クライアント証明書を要求する］のチェックボックスをチェックします。
（この設定により、クライアント証明書がインストールされたブラウザ以外アクセスできな
くなります。）

Magic から SSL サーバにアクセスする
暗号化されクライアント証明書が必要なサイトに対して Magic から HttpGet/Post 関数や
コール Web サービス処理コマンドでアクセスする場合、上記の作業で作成された証明書
ファイルが必要になります。

環境設定の指定［設定／動作環境］によって開いた［動作環境］ダイアログの［外部参照］タブに以下のように設定します。
• SSL CA 証明書ファイル……サーバ証明書サービスの公開キーを含んだファイルを指定します。ここには、セミコロン（；）で複数のファイルを指定することができます。
• SSL クライアント証明書ファイル……IE でエクスポートした PKCS#12 形式のファイルを指定します。
• SSL クライアント証明書パスワード……IE でエクスポートした際に指定したパス
ワードを指定します。

クライアント証明書の切り替え
クライアント証明書が必要な複数の SSL サイトに対してアクセスをする必要がある場合
は、ClientCertificatedAdd 関数を使用して証明書を追加する必要があります。

開発者ガイドMagic eDeveloper V9 Plus377

第 29 章 - マージ Web アプリケーション
この場合、動作環境の［SSL CA 証明書ファイル］に指定された証明書に対応するクライ
アント証明書のみ有効です。

WSDL アシストで SSL サイト上の WSDL にアクセスする場合にも、クライ
アント証明書が必要になります。あらかじめ、［動作環境］で設定しておくか、
クライアント証明書を切り替えるプログラムを開発モードで一旦実行させてから、該当するプログラムを開くようにしてください。

ファイルのアップロード
インターネットリクエスタを使用してクライアントからアプリケーションサーバにファイルをアップロードすることができます。
ここでは、クライアントで表示される HTML ページからアプリケーションサーバにファイルをアップロードする例を説明します。

HTML ページよりアップロードする
アプリケーションサーバ側プログラム
ファイルを受け取るアプリケーションサーバ側のプログラムは以下の通りです。
公開プログラム名……UploadReceive

タスク特性• タスク名……任意• タスクタイプ……B= バッチ• タスク終了条件……Yes• チェック時期……A= 後置

レコードメインセレクト処理コマンドで以下のパラメータ項目を定義します。
名前

型

書式

Date

D= 日付

YYYY/MM/DD

Time

T= 時刻

HH:MM:DD

File Blonb

B=BLOB

レコード後処理
アクション処理コマンドを定義して以下の式を割り当てます。
Blb2File ( 変数「File Blonb」,'tmpUploadFile.dat')

クライアント側 HTML ファイル
クライアント側でオープンする HTML ファイルは以下のようになります。

378<HTML><HEAD><META name="generator" content="Microsoft FrontPage 4.0"><TITLE>Upload From HTML</TITLE></HEAD>

開発者ガイドMagic eDeveloper V9 Plus

ファイルのアップロード<BODY><FORM action="http://was40/MG94/Scripts/mgrqispi94.dll" method="POST"
enctype="multipart/form‑data"><INPUT type="hidden" name="ARGUMENTS" value="date,time,filename"><INPUT type="hidden" name="PRGNAME" value="UploadReceive"><INPUT type="hidden" name="APPNAME" value=" 開発者ガイド "><table border="1" width="100%"><tr><th width="29%">File Name: </th><td width="71%"><INPUT type="file" name="filename" value="">
</td>
</tr>
<tr>
<th width="29%">Date: </th><td width="71%"><INPUT type="text" name="date" size=14 maxlength=10
value="2004/02/10">
</td>
</tr>
<tr>
<th width="29%">Time:</th><td width="71%"><INPUT type="text" name="time" size=14 maxlength=8
value="14:36:12">
</td>
</tr>
</table><p><INPUT type="submit" name="" value=" 送信 "></p></FORM></BODY></HTML>

通常の FORM による Magic プログラム呼び出しと比べ、次のような設定を行っておく必要があります。
• FORM には enctype="multipart/form-data" を指定します。
• type="file" の INPUT フィールドを配置します。これには name= を指定する必要があります。
• type="hidden" の INPUT フィールドの value としては、パラメータとして渡すフィール
ドの名前 ( 上例では date および time) の他に、2 で指定した type="file" の INPUT フィー
ルドの名前 ( 上の例では filename) も指定します。

アップロードファイルのサイズ制限
インターネット上でサイズの大きなファイルをアップロードすることは、ネットワークに負荷がかかります。特に帯域幅の狭い回線からアクセスされる可能性がある場合、処理に時間がかかり、ネットワーク上のタイムアウトを超えて回線が切断される場合もあります。このような場合、あらかじめアップロードできるサイズを制限することを推奨します。アップロードするファイルのサイズを制限するには、インターネットリクエス
タのあるフォルダ上の Mgreq.ini の以下のパラメータを変更してください。
[REQUESTER̲ENV]...
MaxUploadKB = 10

上記の設定の場合、10K（Byte）以上のファイルをアップロードするとエラーメッセージが表示されます。

開発者ガイドMagic eDeveloper V9 Plus379

第 29 章 - マージ Web アプリケーション［このページは意図的に空白にしています。］

380

開発者ガイドMagic eDeveloper V9 Plus

XML ファイルの出力

30XML（eXtensible Markup Language）は、" 拡張可能なテキストへの印を付けるためのコ
ンピュータ用言語 " という意味です。データを XML ファイルに出力することで、他のツールとのデータ連携がやりやすくなります。
ここでは、Magic のデータテーブルの内容を XML 化する方法について説明いたします。
XML の書式についての説明はいたしません。関連する書籍などで確認してください。

ここでは以下の内容について説明いたします。
概要

382 ページ

データ形式と XML データの関係

383 ページ

マージプログラムの作成

384 ページ

XML 出力の応用

387 ページ

開発者ガイドMagic eDeveloper V9 Plus381

第 30 章 - XML ファイルの出力

概要
Magic アプリケーションを使用してデータテーブルの内容を XML ファイルとして出力す
るには、以下の方法があります。

データ出力ウイザードを使用する
テーブルの内容を単純に出力する場合、最も簡単な方法です。
第 10 章 「印刷の実行」画面に表示されたデータの印刷」の説明を参照してください。

スキーマファイルも同時に作成することができ、Excel などの他ツールとのデータ連携などに利用できます。
第 23 章 「データの受け渡し」の「Magic で出力した XML データを Excel で読み込む」を参照してください。

出力ファイルは、UTF-8 でエンコードされています。

XCG を使用する
XCG は、既存のスキーマファイルをもとに、Magic のデータテーブルを作成するユーティ
リティです。
対応する XML ファイルをインポートしたり、Magic のデータを XML ファイル化するコ
ンポーネントプログラムも作成できます。
ドキュメント形式の Web サービスを呼び出すプログラムを作成する場合に利用できます。
第 21 章 「Web サービス対応」の「Web サービス を呼び出す（ドキュメント形式）」
を参照してください。

タグ名やデータは、スキーマファイルのエンコード指定に基づいてエンコードされます。
デフォルトは、UTF-8 です。

マージプログラムを作成する
XML ファイルを作成するためのテンプレートファイルを別途用意する必要がありまが、作成する XML ファイルの書式の自由度が高くなります。この方法の場合、XML の書式についての知識が必要になります。
XML の読み込み機能を持った外部ツールと連携を取る場合に、そのツールの読み込み形
式に合わせて書式を指定して使用します。
この章では、マージ機能を利用して XML ファイルの作成プログラムの開発手順について説明いたします。

382

開発者ガイドMagic eDeveloper V9 Plus

データ形式と XML データの関係

データ形式と XML データの関係
XMLファイルは、任意に定義したタグを使用して構造的に表現することができます。テーブルリポジトリのテーブル名やカラム名をタグとして定義することで、テーブルデータの内容を XML 形式で表現することができます。

単純なテーブル
以下のテーブル例にして、XML 化の例を示します。
受注データ
名前

書式

顧客番号

5Z

受注番号

5Z

受注合計金額N8CZ

XML 化されたデータは以下のようになります。
<?xml version="1.0" encoding="Shift‑JIS"?><data>< 受注データ >< 顧客番号 >1000</ 顧客番号 >< 受注番号 >0001</ 受注番号 >< 受注合計額 >12345</ 受注合計額 ></ 受注データ >< 受注データ >< 顧客番号 >1001</ 顧客番号 >< 受注番号 >0002</ 受注番号 >< 受注合計額 >54321</ 受注合計額 ></ 受注データ ></data>1 対 N の関係のテーブル
上記の受注データに対する明細データを組み合わせ、1対N の関係になるテーブルをXML化した場合の例を示します。
受注データ……前述と同じです。
受注明細
名前

書式

受注番号

5Z

明細番号

5Z

商品名

20

数量

N7CZ

金額

N8CZ

XML 化されたデータは以下のようになります。
<?xml version="1.0" encoding="Shift‑JIS" ?><data >
< 受注データ 受注番号 ="0001">< 顧客名 >XXXXXXXX</ 顧客名 >< 受注合計額 >12345</ 受注合計額 >< 受注明細 明細番号 ="1">< 受注番号 >0001</ 受注番号 >< 商品名 >AAAAA</ 商品名 >< 数量 >5</ 数量 >開発者ガイドMagic eDeveloper V9 Plus383

第 30 章 - XML ファイルの出力< 金額 >3000</ 金額 ></ 受注明細 >< 受注明細 明細番号 ="2">< 受注番号 >0001</ 受注番号 >< 商品名 >BBBBBB</ 商品名 >< 数量 >34</ 数量 >< 金額 >4300</ 金額 ></ 受注明細 ></ 受注データ >< 受注データ 受注番号 ="0002">< 顧客名 >YYYYYYYY</ 顧客名 >< 受注合計額 >54321</ 受注合計額 >< 受注明細 明細番号 ="1">< 受注番号 >0002</ 受注番号 >< 商品名 >DDDDD</ 商品名 >< 数量 >42</ 数量 >< 金額 >4545</ 金額 ></ 受注明細 >< 受注明細 明細番号 ="2">< 受注番号 >0002</ 受注番号 >< 商品名 >EEEEE</ 商品名 >< 数量 >34</ 数量 >< 金額 >5454</ 金額 ></ 受注明細 ></ 受注データ ></data>（明細の受注番号は、出力されなくても XML 上の関連性は確認できるので任意です。）

マージプログラムの作成
1 対 N の関係になる２つのテーブルをもとに XML ファイルを作成するプログラムの例を示します。

テンプレートファイル
マージ処理で使用されるテンプレートファイルは以下のようになります。
<?xml version="1.0" encoding="Shift‑JIS" ?><data >（!$MGREPEAT）< 受注データ 受注番号 ="（!$MG̲ 受注番号）">< 顧客名 >（!$MG̲ 顧客名）</ 顧客名 >< 受注合計額 >（!$MG̲ 受注合計額）</ 受注合計額 >（!$MGREPEAT）< 受注明細 明細番号 ="（!$MG̲ 明細番号）">< 商品名 >（!$MG̲ 商品名）</ 商品名 >< 数量 >（!$MG̲ 数量）</ 数量 >< 金額 >（!$MG̲ 金額）</ 金額 ></ 受注明細 >（!$MGENDREPEAT）</ 受注データ >（!$MGENDREPEAT）</data>

マージタグのトークン前付け符号と後付け符号は、デフォルトでは「<!$」と「）」ですが、XML のタグと混在するため、別の文字列にしています。

384

開発者ガイドMagic eDeveloper V9 Plus

マージプログラムの作成

プログラム
作成するプログラムは、親タスクと子タスクで構成されます。

親タスク• タスクタイプ……B= バッチ• メインテーブル……受注データ

レコードメインセレクトコマンドで全てのカラムを定義します。

入出力ファイル• メディア……F= ファイル• アクセス……A= 追加• 式／項目……（XML ファイル名）

フォーム
1 行作成し名前の他以下の定義を行います。
• クラス……1• インタフェースタイプ ……M=HTML マージ形式• トークン前付け符号……（!$• トークン後付け符号……）• タグテーブル•

受注番号……項目：受注番号•

顧客名……項目：顧客名•

受注合計額……項目：受注合計金額

レコード後
1. データ出力コマンドを定義します。
•

フォーム……マージフォーム•

ファイル……入出力ファイル

2. コールタスク処理コマンドを定義します。

子タスク
タスクタイプ……B= バッチ
メインテーブル……受注明細

レコードメインセレクトコマンドで全てのカラムを定義します。

フォーム
1 行作成し名前を定義します。
• クラス……1

開発者ガイドMagic eDeveloper V9 Plus385

第 30 章 - XML ファイルの出力• インタフェースタイプ……M=HTML マージ形式• トークン前付け符号……（!$• トークン後付け符号……）• タグテーブル•

明細番号……項目：明細番号•

商品名……項目：商品名•

数量……項目：数量•

金額……項目：金額

レコード後
データ出力コマンドを定義します。
• フォーム……マージフォーム• ファイル……親タスクで定義された入出力ファイル

XML データのチェック
Web ブラウザ（IE 6.0 以上）を使用してファイルをオープンすることで確認できます。書
式に問題がある場合は、エラーが表示されます。また、エンコードの指定と文字データの内容が合っていない場合は、文字が化けて表示されます。

XML データの BLOB 化
入出力ファイルの定義を以下のようにすることで、BLOB 項目内に出力されます。
• メディア……V= 項目• アクセス……A= 追加• 式／項目……BLOB 型変数

UTF-8 にエンコードする必要がある場合
UTF-8 でエンコードされた XML ファイルを出力する場合は以下のようにします。
1. テンプレートファイルの 1 行目を以下のようにします。
<?xml version="1.0" encoding="UTF-8" ?>または、<?xml version="1.0" ?>2. タグ名は、SBCS（半角の英数字）で設定した方がわかりやすいです。DBCS で指定する場合は、UTF-8 でエンコードされた文字列にする必要があります。
3. XML 出力プログラムは、BLOB 項目で出力するようにします。
4. Magic の UTF8FromAnsi 関数で出力された、BLOB 項目をエンコードします。
5. Blob2File 関数で、Blob 項目をファイル化します。l386

開発者ガイドMagic eDeveloper V9 Plus

XML 出力の応用

XML 出力の応用
ここでは、XML 出力プログラムを利用したアプリケーションの例を紹介します。
• ReportsMagic と組み合わせた印刷処理プログラム• スタイルシートを使用したビューワプログラム

ReportsMagic と組み合わせた印刷処理プログラム
ReportsMagic は、あらかじめ作成されたフォーム定義ファイルに対してテキストファイ
ルをマージさせて帳票を印刷するフォームオーバーレイ印刷ツールです。
マージさせるテキストファイルは、CSV 形式や XML 形式があります。ここでは、Magic
で XML ファイルを出力させ、ReportsMagic で印刷させるプログラムの例を説明します。
ReportsMagic RMDesigner には、作成したフォームに対応した XML ファイルを出力する
ためのテンプレートファイルを出力する機能があります。
ReportsMagic RMDesigner のオペレーションに関する詳細は、ReportsMagic のリ
ファレンスを参照してください。

ここでは、「1 対 N の関係のテーブル」で使用した受注テーブルと明細テーブルをもとに、帳票を出力するプログラムを作成します。

フォームの作成
ReportsMagic RMDesigner を使用して帳票フォームのテンプレートを作成します。

図 30-1 帳票フォームのテンプレート

赤字は、データがマージされる項目です。各項目の［項目 TAG］にタグ名を設定します。
（ここでは、項目名とタグ名は同じにします。）

テンプレートファイルの作成
ReportsMagic RMDesigner の［データ項目ウィンドウ］を開き、テンプレートファイルを作成します。これにより以下のようなファイルが作成されます。
<?xml version="1.0" encoding="Shift̲JIS"?>

開発者ガイドMagic eDeveloper V9 Plus387

第 30 章 - XML ファイルの出力<ReportsMagic version="1.0"><PrintData><report form=" フォームファイル名 ">(!$MGREPEAT)<form no="(!$MG̲FormNumber)"><field tag="OrderNum"><value>(!$MG̲OrderNum)</value></field><field tag="CustomNum"><value>(!$MG̲CustomNum)</value></field><table tag="Detail">(!$MGREPEAT)<field tag="(!$MG̲RecordNumber)"><field tag="Num"><value>(!$MG̲Num)</value></field><field tag="ItemName"><value>(!$MG̲ItemName)</value></field><field tag="Amount"><value>(!$MG̲Amount)</value></field><field tag="Sum"><value>(!$MG̲Sum)</value></field></field>(!$MGENDREPEAT)</table><field tag="Total"><value>(!$MG̲Total)</value></field></form>(!$MGENDREPEAT)</report></PrintData></ReportsMagic>

実際に出力されるテンプレートファイルには、改行は含まれません。

RMDesigner では、フォームに設定したタグ名以外に以下のタグが出力されます。
• フォームファイル名……ReportsMagic によって作成されたフォームファイル名• MG_FormNum……ページ番号• MG_RecordNumber……レコードの番号

印刷プログラム（オンラインプログラム）
ReportsMagic を使用して印刷するプログラムは以下の構成になります。
1. テーブルデータと ReportsMagic で作成されたテンプレートファイルをもとに、XML
ファイルを出力するプログラムを作成します。XML ファイルの作成プログラムについては、前節を参照してください。
2. ReportsViewer を起動してフォームファイルとマージファイル（XML ファイル）を読み込ませます。コールユーザ PRC コマンドを使用して、’RMViewer.Execute’ を実行します。
RMViewer.dll は、ReportsViewer のインストールディレクトリにあります。事前に
Magic のカレントディレクトリにコピーするか、ReportsViewer の定義式でパスを指388

開発者ガイドMagic eDeveloper V9 Plus

XML 出力の応用
定するようにしてください。
ユーザ PRC に渡すパラメータについては、ReportsMagic RMViewer のリファレンス
を参照してください。

印刷プログラム（ブラウザクライアントプログラム）
ReportsMagic（RMViewer）の ActiveX 版を利用することで、ブラウザクライアント上で帳票の表示や印刷ができます。基本的な手順は、前述のオンラインプログラムの場合と同じです。
1. テーブルデータと ReportsMagic で作成されたテンプレートファイルをもとに、XML
ファイルを出力するプログラムを作成します。
2. ブラウザクライアントタスクを別途作成します。以下の変数項目定義します。
名前

型

書式

プリンタ名

A= 文字

30

部数

A= 文字

3

3. ブラウザフォーム（HTML ファイル）には、プリンタ名と部数を入力するテキスト
ボックスと、プッシュボタン、RMViewer の ActiveX オブジェクト（RMViwerCtrl
Control）を配置します。プッシュボタンには、任意のユーザイベントを割り付けます。
4. タスクにハンドラを定義します。イベントは、プッシュボタンに割り当てたユーザ
イベントを定義します。処理テーブルに以下の処理を定義します。
1. プログラムコール処理コマンドで、XML ファイルを出力するプログラムを呼び出します。
2. アクション処理コマンドで CallOBJ 関数を実行します。CallOBJ 関数を実行することで、ActiveX オブジェクトのプロパティに値を設定することができます。
CallOBJ ('RMViewerCtrl1','RfrFile',’ テンプレートファイル名 ’)
CallOBJ ('RMViewerCtrl1','RDataFile',’ データファイル名 ’)
CallOBJ ('RMViewerCtrl1','ToolBar',’On’)
CallOBJ ('RMViewerCtrl1','PrinterName',Trim （変数「プリンタ名」））
CallOBJ ('RMViewerCtrl1','Copy',Trim （変数「部数」））

開発者ガイドMagic eDeveloper V9 Plus389

第 30 章 - XML ファイルの出力
このプログラムを実行させ、プッシュボタンをクリックすると HTML ページの ActiveX
オブジェクトに RMViewer が表示されます。RMViewer のツールバーで表示の拡大、縮小
や改ページ、印刷ができます。変数「プリンタ名」や変数「部数」で指定された値が印刷時のデフォルトになります。

図 30-2 RMViewer の実行例

スタイルシート（XSL）による表示のカスタマイズ
XML ファイルは、XSL スタイルシートを組みこむことで HTML として Web ブラウザ上で表示させることができます。この機能をデータ出力ウイザードや前述のマージプログ
ラムと組み合わせて簡単なビューワを実現できます。
ここでは、スタイルシートの一例を紹介します。XSL の構文の詳細は、関連する書籍などで確認してください。

スタイルシートの例<?xml version="1.0" encoding="Shift‑JIS"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><html><head><title>Magic データの表示 </title></head><body><p align="center"><font color="navy">Magic データの表示 </font></p><table border="1" width="600" align="center"><tr><th width="40%"> 顧客名 </th><th> 受注合計額 </th></tr><xsl:apply‑templates /></table></body></html></xsl:template><xsl:template match="data">390

開発者ガイドMagic eDeveloper V9 Plus

XML 出力の応用<xsl:for‑each select=" 受注データ "><tr><td><xsl:value‑of select=" 顧客名 " /></td><td><xsl:value‑of select=" 受注合計額 " /></td></tr></xsl:for‑each></xsl:template></xsl:stylesheet>

青字の部分が HTML 化された場合の書式、赤字の部分は、XML ファイル内の表示対象となるタグを指定しています。

XML ファイルの例<?xml version="1.0" encoding="Shift‑JIS" ?><?xml‑stylesheet type="text/xsl" href="Sample.xsl"?><data >
< 受注データ 受注番号 ="1">< 顧客名 >AAAAA</ 顧客名 >< 受注合計額 >497,513</ 受注合計額 ></ 受注データ >< 受注データ 受注番号 ="2">< 顧客名 >BBBBB</ 顧客名 >< 受注合計額 >434</ 受注合計額 ></ 受注データ >< 受注データ 受注番号 ="3">< 顧客名 >CCCCC</ 顧客名 >< 受注合計額 >34,787</ 受注合計額 ></ 受注データ >< 受注データ 受注番号 ="4">< 顧客名 >DDDDD</ 顧客名 >< 受注合計額 >4,523</ 受注合計額 ></ 受注データ ></data>

赤字は、使用するスタイルシートを指定しています。
これにより、この XML ファイルは、以下のように表示されます。

図 30-3XML ファイルの表示例

この表示は、スタイルシートを変更することで任意にカスタマイズできます。

開発者ガイドMagic eDeveloper V9 Plus391

第 30 章 - XML ファイルの出力［このページは意図的に空白にしています。］

392

開発者ガイドMagic eDeveloper V9 Plus

改訂履歴
第２版
章

ページ

改訂内容

20

229

Interstage V6 での記述を追加

21

276

RPC 形式とドキュメント形式の違いを追加

第3版
全体的な構成見直しを行いました。

第4版
章

ページ

改訂内容

1

16

「ウィンドウのタイトル変更」を 9 章から移動

350「位置付と範囲指定」を追加

464「タスクツリーの操作」を追加

5

74「コントロールモデルの利用」を追加

6

89「HTML コントロール」に「コントロールのクラス指定」を追加

97「IFRAME の使用」を追加

98「その他コントロールの使用」を追加

100「エラーメッセージ用ページの作成」を追加

126「データテーブルの暗号化」を追加

126「データの暗号化」を追加

144「ツリーコントロールの定義」を追加

146「メモリテーブルの保存」を追加

147「ウィンドウの分割」を追加

147「ユーザ定義開発メニュー」を追加

158「プログラム間での入出力ファイルの共有」に「入出力ファイルの式定義」を追加160「画面に表示されたデータの印刷」を追加

187「コンポーネントを登録しない外部アプリケーション」を追加

188「コンポーネント側からホスト側のイベントを実行する」を追加

191「DDE の使用」を追加

191「DLL の呼び出し」を追加

195「OLE オートメーションの利用」を追加

16

205

「Magic モジュールの分散化」を追加

20

229

8
9

10

14
15

以下の J2EE サーバについての説明を追加• WebSphere Ver5
• JBoss3• Sun J2SDK EE Ver1.4• Sun One 7ａ

開発者ガイドMagic eDeveloper Ver.9

章

ページ

改訂内容

21

266

「Web サービス を呼び出す（ドキュメント形式）」を追加

276「プロバイダ用プログラムの作成（ドキュメント形式）」を追加

296「COM コンポーネントを呼び出す（ActiveX オブジェクト）」に「多次元配列デー
タを渡す」を追加

297「同じような方法で、以下のような配列データを定義します。」を追加

306「DCOM コンポーネントを呼び出す」を追加

312「Magic アプリケーションのリモート COM コンポーネント化」を追加

317「Magic で作成したデータを Excel で参照する」を追加

319「Excel のワークシートを Magic で参照する」を追加

320「Magic で出力した XML データを Excel で読み込む」を追加

324「Excel で作成した XML データを Magic で読み込む」を追加

29

359

「マージ Web アプリケーション」を追加

30

381

「XML ファイルの出力」を追加

22

23

ｂ

開発者ガイドMagic eDeveloper Ver.9