using ASP,ADO,VBS,VBA and ActiveXControl

    ユーザーフレンドリーなインターフェイスを持つ
    Internet Databaseプログラム with Internet Explorer

    秋月巌 AKIZUKI, Iwao  


     私は当初この記事を「完全なInternet Databaseプログラミング」というタイトルにしようと考えていた.完全なInternet Databaseプログラミングというのは,もちろん,言葉のあやである.完全なデータベースプログラミングなどというものはスタンドアロンのデータベースシステムにしか存在しない.すべてのネットワークデータベースシステムは妥協の産物なのである.なかでもインターネットデータベースシステムはHTMLによる制約に強く縛られてきた.ここでは,現在,一般的に使えるテクノロジーのみを使って,普通のC/Sシステム並みのユーザーインターフェイスをもつデータベースシステムをインターネット上で展開する方法について解説する.

    有用な情報とテクニカルライター
     さて,http://pcdn.int21.co.jp/pcdn/vb/howto/には企業プログラマにとって,貴重な話題の多くが扱われている.ここはまだ発展中のサイトだから,これからもさらに有用な情報を提供してくれることだろう
    .  では,何故,雑誌等に執筆しているライターが,このサイトに見られるような率直な記事が書けないのだろうか.その原因にテクニカルライターの無知や怠慢とは別に,広告主であるメーカーとの政治的な理由をあげる人もいるだろう.確かに,それは間違いではない.影響力のある媒体で作業しているライターは,それなりの制約での作業を強いられている.

    図1:ユーザーフレンドリーなインターフェイスを持つWebデータベースシステムのフロントエンド

    コンピュータジャーナリズム
     しかし,それ以上に原因となるのは,情報の精度への要求が違うことである.たとえば,ある製品の機能が正常に動作しなかったとしよう.Webに掲載する分には,試してみて動作しなかったことを率直に語ればいい
    . しかし,それがマスメディアである限りは,現象に対する追試が必要となる.動作しなかったのが,操作ミスや環境に依存しないものであることを証明しなければならない.この作業は容易ではない.ライターは動作しているものに対する記事を依頼されるのが普通であって,テスティングを頼まれているわけではないからである.結局,ライターとしては,「動作の不安定が認められた」といった,トーンダウンした言い方をせざるを得なくなる.

    テクニカルライター
     また,ライターは基本的に,仕事を依頼された製品に対する悪口を書きたくないという性質がある.プログラミング関係のテクニカルライターの場合,ライティングのための調査が目的というよりも,自分がこれから使っていくテクノロジーの事前調査のような部分がある.「使えない」と想像がつくような製品の依頼は最初から断ることになる.
     こういったライターの制約に比較的とらわれていないのが,日経のコンピュータ雑誌群である.これらの雑誌の記事は編集者(記者)が書いていることが多い.彼らは,ある意味では実務から開放された状態で記事に臨むことができる.調査した結果を使って彼らが社内の部門システムを作ることはあっても,結局,それは実験レベルにすぎない.私は日経の雑誌に書かれている記事のいくつかは,勇気ある告発だと思う.これはジャーナリズムとして重要な姿勢である.しかし,日経の記事の通りにシステムを選択していけば,正しい結果が得られるというわけではない.結局,最後は個人責任だということになる.

    Webによる情報公開とMicrosoft
     USのMicrosoftのWebサイトは,価値のある情報提供が行なわれている.実用的なものから,将来スクラップになりかねない技術に関してまで,無造作にWebで公開されている.また,MSDNのCDROMやダウンロード可能なモジュールなど,MSのテクノロジーに関して参照可能な情報は限りなく多い.
     テクニカルライターが,一般的なエンジニアよりも情報の収集について,極端に有利な立場にあるというわけではない.少なくともMicrosoft関係の情報に関しては,ライターが情報を手にした時点でUSのWebサイトに公開されていることがほとんどである.あえていえば,Webに一日中アクセスしていることが立場上,許されているということと,経費でかなりの金額を資料に費やせることが情報収集の点で有利な点だということになる.
     Microsoftがフェアな体質の組織であるか否かは不明だが,開発者に対しては十分にフェアな姿勢を維持しているといえる.ただ,その姿勢は,Microsoftと競合しない製品を開発するエンジニアに対してだけである.

    MicrosoftとInternet
     Microsoftのインターネット戦略については,あまりにも多くが語られてきた.いろいろな意見があると思うが,概して方針は成功してきたのではないかと私は判断している.Internet Explorerの普及,WindowsNT4.0の発売,ActiveX関連開発環境の整備,Office製品の対応,どれもが驚くべき速度での方向転換をなし遂げた.去年の前半,全体のプランを聞いたときは無謀な計画のように思えたが,それでも予告していた製品はほぼ出揃ったということができる.
     同時にMicrosoftのインターネット文化に対する無知さに対する非難もたかまっている.インターネットの分野における現在のMicrosoftの立場は,新大陸発見のころの西洋人に喩えることができる.どちらに正当性があるかは言うまでもないが,ビジネスとしてとらえるならば,どちらにより多くのチャンスがあるかもまた判断は容易である.

    よりユーザーフレンドリなシステム

     今回ここで紹介するインターネットデータベースプログラミングの方法は,Internet Explorerに依存している.つまり,ActiveXテクノロジーに100%依存している.サーバーサイドスクリプト(ASP-VBS),クライアントスクリプト(VBS),ActiveXコントロール(VB5)と,すべてのパートにわたってActiveXテクノロジー(あるいはVisual Basic)が活用されている.しかも,このシステムの作成プロセスではActiveX DocumentsとAdvanced Data Connectorについてもかなりの調査をした(これは次号のVBマガジンに書く予定である).

    AccessアプリケーションのようなインターフェイスをWebで・・

     以前から,大手ベンダーのある営業マン氏に,Web上で動作するAccessアプリケーションのようなプログラムができないのかと相談されてきた.もちろん,私は「できない」と答えつづけた.HTMLの

    タグによる送信システムでは,数を特定できないレコードを同時にサブミットする方法が困難だからである.
     JavaスクリプトやVBSのようなクライアントスクリプトが,ブラウザによって提供されるようになっても,クライアントスクリプトによる動的なインターフェイスの作成には多くの点で限界がある.もちろん,トリッキーなプログラムをISAPIやCGIで記述すれば不可能ではなかったろう.しかし,それは本望ではない.
     自ずと私の関心はSymantecがプレリリース版を公開したJavaとJDBCに向き,これらに期待していた.Visual cafe とdbanywhereの組み合わせはかなりの可能性を感じさせた.しかし,日本語表示の問題とブラウザとの相性は,その時点ではクリアできなかった.
     ASPはHTTP以外のプロトコルを用いないという意味で,強い魅力を持つが,結局はHTMLの制限をクリアすることができない.インターフェイスアーキクチャの工夫で,使いにくくないシステムを構築するのが限界である.
     また,いくつかの大手メーカーからプラグインで対応する開発ツールが発売された.しかし,それらはアクセスするのが特定のデータベースに限定されていたり,イントラネットのみの対応だったりした.

    Visual Basic 5.0の登場

     決定的な解決策がないまま時間が経過し,Visual Basic 5.0のテクニカルインフォメーションが公開された.注目したのはActiveX Documentsである.ActiveXコントロールが動的にダウンロードされるプログラミングオブジエクトだとすると,ActiveX Documentsは動的にブラウザ内にダウンロードされるプログラムである.このプログラムはVisual Basicプログラムとほぼ同等の機能を持つことができる.当然,RDOを介したデータベースアクセスにも対応している.しかし,RDOが使用するODBC接続はインターネットをまたぐことができない.それに動的にダウンロードされたとしても,クライアントサイドのODBC設定の設定やドライバのインストールの問題が残る.

    Advanced Data Connectorによるプロトタイプ

     そこで,考えたのが先月号で紹介したADC(Advanced Data Connector)との併用である.動的にダウンロードされたプログラムはADCを使ってHTTP経由でデータベースへのアクセスをおこなう.ADCの接続情報としてODBCのDSNを要求するが,それはサーバーのDSNであって,クライアントのDSNではない.つまり,クライアントサイドでのODBC設定は必要ない.
     現在の英語版では2バイト文字を取得すると文字情報が誤って伝送され,余分な記号が附加されるという障害があったが,これは独自のパッチをあてることで解決した.しかし,できあがったプロトタイプの性能はさんざんなものだった.セッションの確立のために生じるオーバーヘッドが大きすぎるのである.コンボボックスのリストにデータベースのテーブル内容を取得する負荷の大きいプログラムだったが,ひとつのフォームのオープンに1.5分かかるのは問題だった.最適化の方法はいくつか思いついたが,効果には限界がある.
     この結果に対してはいくつかの釈明をおこなう必要があるだろう.私が使用したのはhttp://microsoft.com/adcで入手したリリース1.0である.ベータ1.5も公開されていたが,これは動作させることができなかった.リリース1.0は動作したが,そのすべての機能を使用できるわけではなかった.結局,私としては確実に動作するSQL文の実行機能だけを使用して,プログラミングをおこなった.だから,実装されているはずのレコードセットによる更新がスマートに実現すれば,パフォーマンスが劇的に向上する可能性は高い.私はいまだにADCの可能性に高い期待をしている.
     しかし,とにかく,私と妻の2人は翌日,関係者にみせるためのプロトタイプを作成しなければならなかった.ActiveX DocumentsとADCによるプロトタイプのコーディングを,Visual Basicプログラマである妻が終了させたのは明け方の5時だった.我々はそれからテストをおこない,絶望的な結果を得ることになる.

    HTMLのフォームで不定数のSQL文を実行

     何かの代替案を考えなければならなかった.問題となるのは,数が特定できない複数のSQL文をサーバー側で実行しなければいけないということである.それならば,複数のSQL文をひとつのストリングに結合してサーバーに送信し,それをサーバー側で切り出せばいいではないか.
     経験的にいってASPは安定して動作し,処理は十分に高速である.次のポイントはASPが返した結果をどのようにインターフェイスに反映させるかである.VBSで配列を操作し,表形式に並べたHTMLのオブジェクトに表示する方法も考えたが,現在のInternet ExplorerがサポートするVBSの安定性から考えると不安な処理だった.それに,HTMLのオブジェクトはプログラミングの柔軟性も低い.
     次に考えたのがテキストボックスなどのActiveXコントロールをHTML上に配置し,VBSで値を代入していく方法である.この方法の問題点はActiveXコントロールをHTMLやHTMLレイアウトコントロール上に配置すると,フォーカス関係のイベントが取得できない点である.フォーカスを失ったときのイベントが取得できないのは,業務プログラムのインターフェイスを作成するには大きすぎる制約である.
     結論からいえば,フォームをActiveXコントロールとして作成し,各コントロールのプロパティを公開して,値の設定と取得をInternet Explorerに記述されているVBSでおこなうことができるようにしたのである.入力に関するフォーム内での処理は,すべてVisual Basic 5.0で記述し,ActiveXコントロールとして実装する.また,サーバー側で実行するSQL文もすべてコントロール内で生成してしまう.HTMLのサブミットによって,その値をサーバーに送信し,ASPはActiveXコントロール化されたフォームに結果を代入するVBSを動的に生成する.

    ActiveXテクノロジーのオールキャスト

     これが,結果として考えたシナリオである.まさにActiveXテクノロジーの百花繚乱である.
     この方法の問題点として次のようなことがあげられる.

    ActiveXテクノロジーに依存するため,ブラウザとOSが限定される

     インターネット対応といっても,この場合,ユーザーが望んでいるのはプロパイダを使った低価格WANの実現であり,不特定多数のユーザーを相手にするものではない.公開するのならば,ASPなどを使ってブラウザやOSに依存しないシステムを作成すべきだろう.その際にインターフェイスの柔軟性に難がでるのはやむを終えない.
     ユーザーがWindows用のInternet Explorer専用で納得してくれるならば,この2つの問題点には譲歩する余地がある.
     もっとも,ADCを使用してもこれらの問題が完全にクリアさるというわけではない.

    データ表示の仕組み

     プログラムの仕組みはかなり複雑である.動作の原理は図2を参照してほしい.
     最初にページがロードされたとき,ブラウザのFRAME1はdbaccess.aspをActive Serverに要求する.サーバーはASPファイルに記述されているスクリプトを実行してクライアント用のVBSコードを動的に生成し,FRAME1にロードする.FRAME1にロードされるActive Server PagesにはVBSのスクリプトが記述されているだけなので,FRAME1には何も表示されない.しかし,Window_onLoadプロシージャに記述されているコードが実行され,データベースの内容をActiveXコントロールのフォーム(cxForm)のテキストボックス(txt1)に表示する.データ表示部はこのように動作する.

    図2:プロトタイプの動作原理図

    データ更新の仕組み

     データ更新のためにはSQLのUPDATA文とSQLを利用する.データが変更された場合,変更したレコードと新規に作成したレコードのそれぞれにフラグを立てておく.単数レコードしか表示しないようなケースでは問題ないが,グリッドコントロール等を使用して複数レコードの編集を可能にした場合には,どのレコードが編集され,どのレコードが新規に作成されたかを把握しておく必要がある.
     このフラグはHTMLのサブミットボタンがクリックされて,SQLcmdプロパティの値取得が要求されたときに参照する.
     たとえば次のように「商品」テーブルが編集されていたとする.

    商品コード商品名価格フラグ
    1いちごクッキー300更新
    2リンゴパイ200 
    3チョコットクッキー230削除
    4ショートパイ140新規

     SQLcmdプロパティを取得するとActiveXコントロール(acxForm)は,UPATE,DELETE,INSERTの3つのSQLステートメントをひとつのストリングに結合して,HTML内のVBSコードに提供する.VBSは取得した値をHIDDEN属性の<INPUT>タグに格納し,文字列をサーバーに送信する.
     図では省略しているが,サーバーサイドでは区切り文字によってSQL文を各行ごとに分割し,複数回数のSQLコマンドを実行する.対象のデータベースがMS SQL Serverならば,各ステートメントを「GO」で区切っておけば,SQLステートメントを切り出す必要がない.これにより,念願だった複数行の同時更新が可能になる.
     VBSのコードをやりとりするASPを別フォームにロードしているのは,ActiveXコントロールが表示されているフォームが更新ごとにリフレッシュされるのを防ぐためである.

    ActiveXコントロールによるフォーム

    図3:開発中のActiveXコントロールによるフォーム

     実際に作成したプロトタイプが,この記事の冒頭に掲載している図1のプログラムである.ページはサブミットボタン以外はすべてActiveXコントロールで作成されている.このActiveXコントロールフォームのグリッド表示部には,文化オリエント社のSpread OCXを使用している.もちろん,データベースとの連結はしていない.ActiveXコントロールフォームをVisual Basic5.0で開発している様子が図3である.
     このフォームはデータの表示編集機能とSQL文を生成する機能を持っている.それらを操作しているのは,すべてクライアントサイドのVBSである.このVBS自体が,データベースにアクセスするASPにより動的に生成されている.
     プロトタイプのレベルでは,プログラムの動作は十分に高速で安定している.ただ,仕組みが複雑なだけにプログラミングは若干混乱しやすい.しかし,トリッキーな処理はなく,各開発ツールごとの標準的な機能しか使用していないので危険は少ない.データアクセスにはASP+ADOを用いており,どのような環境でもインターネット経由でのアクセスが可能である.


    最後に

     このプログラミング方法は,現時点でインターネット経由でアクセスするWebデータベースプログラムを作成しなければならない開発者には有効な方法である.しかし,IDCがそうであつたように,この方法も所詮は過度期の手法である.将来的にはADCやJDBCのようにクライアントサイドで自由にレコードセットを操作できる方法が主流になるだろう.
     しかし,本命の登場を待っていてはいつまでも開発にかかれないのが,現代の開発者が置かれている状況である.現在,提供されている技術の組み合わせで,できる限り使いやすいシステムを開発していく努力は必要だろう.
     なお,Webデータベースシステムの長所であるアプリケーションの自動配布を実施するためには,CABファイルを作成する必要がある.自動ダウンロードおよび,インストール可能なCABファイルを作成するにはVisual Basic付属のセットアッブウィザードを使うのが一般的である.しかし,私が使用しているリビジョンのVisual Basic 5.0に付属しているセットアップウィザードで作成するCABファイルでは,正常に自動インストールがおこなわれなかった.特にサードパーティ製品であるSpread OCXの自動インストールの方法がわからなかった.
     CABファイルを自分で作成するには,ActiveXSDKに含まれているDiamond.exeというツールを使用するる.操作方法は添付のドキュメントに記述されている.INFファイルの作成法さえ理解してしまえば,作成は難しくない.このツールで作成したCABファイルだと,サードパーティのOCXやVisual Basic5.0のランタイムライブラリも問題なく自動的にクライアントマシンにインストールできる.
     また,バージョン番号を設定することで,バージョンが上がっている場合のみインストールするといった設定も可能である.こういった,メインテンナンスを軽減してくれるようなシステムの発達は,喜ばしいばかりである.しかし,その恩恵の裏側に,セキュリティホールという闇が隠れていることも忘れてはならない.


    VB Magazineライブラリ | Visual Basicコースホームページ
    int21 ホームページ | PCDN ホームページ