SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CurlデベロッパーセンターPick Up(AD)

逆引きリファレンスから見る
Curl開発「データ操作」のポイント(前編)

バリデーションチェック、ActiveXを使用したExcelデータ操作

  • X ポスト
  • このエントリーをはてなブックマークに追加

 この連載では、Curl開発者向けの技術情報サイト「Curlデベロッパーセンター」の「逆引きリファレンス」の記事から人気の記事をピックアップしていきます。今回は、業務向けのWebアプリケーションに必要な機能の1つであるデータ操作に着目します。前編では「バリデーションチェック」と「ActiveXを使用したExcelデータ操作」を取り上げます。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 Curlでは、Curl開発者向けに技術情報サイト「Curlデベロッパーセンター」を公開しています。このサイトの「逆引きリファレンス」で紹介している記事の中から、人気の記事をピックアップしていきます。

 本稿では、前後編の2回に分けて業務向けのWebアプリケーションに必要な機能の1つであるデータ操作に着目します。前編となる今回は「バリデーションチェック」と「ActiveXを使用したExcelデータ操作」について紹介していきます。

 業務画面からデータを入力する際、エラー表示されずに送信完了までスムーズにできれば、ユーザーのストレスは軽減され、業務効率を向上させることができます。しかし、一般的なWebアプリケーションの場合、エラーが複数回表示されてユーザーにストレスを与えてしまい業務効率の低下をまねくことになります。

 また、ユーザーがローカルマシンにインストールされたアプリケーションにアクセスする必要がある場合、一般的なWebアプリケーションではアクセスが制限されてしまいます。

 これらの悩みをCurlのリッチクライアント/RIAの技術で解決できます。

必要環境

 サンプルアプレットの利用には、Curlの開発環境Curl Development tools for Eclipse(CDE)が必要になります。CDEは、住商情報システムのWebサイトよりインストールできます。

 サンプルアプレットの実行には「特権」の設定が必要になる場合があります。特権(※注意)の設定方法は、こちらを参照ください。

※注意

 「特権」とは、対象のアプレットに対してローカルソースにアクセスできる権限を与えることです。

バリデーションチェック

 業務アプリケーションを作成する際に、フォームに入力した値をチェックする検証の仕組みは欠かせない機能になります。全てのフォームを入力して[送信]ボタンを押したらエラーメッセージが出てしまい、エラーの該当箇所を探して再度[送信]ボタンを押す、といった作業が複数回続くと、ユーザーにとってはストレスとなり入力フォームからの離脱を増加させてしまいます。

 Curlアプリケーションでは、このチェック機能をサーバー側ではなくクライアント側で行うことができます。入力フィールドに入力された値が一定の規則に従っているかをチェックし、Curlならではの使い勝手のいい操作感を簡単に提供できます。これによりユーザーの入力するストレスを軽減させ、ユーザーエクスペリエンスの向上を図ります。

個別アイテムのValidationチェック

 ここでは、個別フィールドに対してのValidationチェックを解説します。まずは、色々な検証フィールドを見てみましょう。

||数値検証
{let numeric-val:TextField = 
    {TextField
        width = 3cm,
        {validate-with
            {NumericValidator},
            message = "年齢は数値で記入してください。"
        }
    }
}
||文字列検証
{let string-val:TextArea = 
    {TextArea
        height = 3cm,
        width = 3cm,
        {validate-with
            {StringValidator max-chars=30},
            message = "コメントは30文字以内です。"
        }
    }
}

 Curlでの検証機能には、validate-withプロシージャを使用します。その中で、Validatorクラスの引数を指定して、検証する法則を決定します。

 上記の検証では、1つ目で数値(NumericValidator)、2つ目で文字列の検証(StringValidator)を行っています。文字列では、最小文字数(min-chars)や、最大文字数(max-chars)を設定することが可能です。

 では、次の例を見てみましょう。

||正規表現検証
{let phone-val:TextField = 
    {TextField
        width = 3cm,
        {validate-with
            {RegExpValidator.from-ValidationPattern ValidationPattern.ja-phone-number},
            message = "電話番号が不正です。",
            dialog-on-finished? = true
        }
    }
}
||正規表現検証2
{let md:MessageDisplay = {MessageDisplay}}
{let email-val:TextField = 
    {TextField
        width = 3cm,
        message-display = md,
        {validate-with
            {RegExpValidator.from-ValidationPattern ValidationPattern.email-address},
            message = "メールアドレスが不正です。"
        }
    }
}
||ドメイン検証
{let md2:MessageDisplay = {MessageDisplay}}
{let domain-val:TextField = 
    {TextField
        width = 3cm,
        message-display = md2,
        {validate-with
            {DomainValidator {StandardDateDomain}},
            message = "日付は、[日/月/西暦]の形式で記入してください。"
        }
    }
}

 RegExpValidatorクラスは、正規表現に基づいた検証を行います。今回はfrom-ValidationPatternコンストラクタを使用し、標準APIに組み込まれているValidationPatternという列挙型のクラスを使用しています。正規表現については、Curlの技術情報サイト「Curlデベロッパーセンター」の『逆引きリファレンス-データ操作-正規表現』を参照ください。

 DomainValidatorクラスは、ドメイン(データ型から生成されます。例えば、String、int、Timeなどの型を指します)の検証を行います。今回は日付のみの検証を行うために、StandardDateDomainクラスを使用しています。

 添付のサンプルコードをダウンロードすると、実際の動作を確認できる(※注意)ので、試していただければと思います。

※注意

 現状では、ValidationPatternのja-phone-numberに携帯電話の番号が対応していないため、サンプルコードにて携帯電話用を検証できる正規表現の列挙型を追加してあります。

 以下に、関連情報のサイトを紹介します。

ActiveXを使用したExcelデータ操作

 続いて、CurlからActiveXを使用したExcelデータの操作方法について解説します。

 一般的なWebアプリケーションからアクセスされるコンテンツはWebサーバーを通じたデータベース内のデータなどです。しかし、Curlはそれらの一般的なサーバーサイドにあるデータだけでなく、ローカルディスク上のデータにもアクセスできます。

 通常のテキストデータやバイナリデータではなく(※注意)、ローカルマシンにインストールされたアプリケーションに依存したファイルなどにアクセスする必要がある場合もあります。例えば、以下のようなコンテンツです。

  • Microsoft Excel、Word、PowerPoint、VISIO
  • Flashムービー
  • CAD
  • Browserコンロール

 上記のようなコンテンツにアクセスする場合は、提供されているActiveXコントロールを使用してデータを読み込んだり、再生したりできます。

 今回はCurlアプリケーション上に表示されているRecordGrid(一覧形式のインタフェース)からExcelファイルに出力するサンプルを解説します。

ActiveXObjectの作成

 サンプルソースの7行目に、次のような記述があります。

let obj_Excel:ActiveXObject = 
        {ActiveXObject
            ProgId = "Excel.Application"
        }

 Excelのような外部コンテンツとやり取りを行うにはまず、ActiveXObjectクラスを使用してExcelアプリケーションのActiveXObjectのインスタンスを生成します。

 ちなみに、Microsoft Office 2003、Microsoft Office 2007で確認しましたが、ExcelのプログラムIDは「Excel.Application」です。

ActiveXObjectのメソッドやプロパティの使用

 ActiveXオブジェクトのインスタンスが生成されたら、その後はそのメソッドやプロパティを使用してコンテンツを制御できます。

 11行目から32行目までの処理は、Excelのマクロの処理をCurlで記述しただけです。以下のセルのボーダーの設定をしている部分で、Curlで記述している箇所とExcelマクロで書いている箇所を比較してみましょう。

|| Curlの場合
    set {obj_Excel.Range "A2","C14"}.Borders.LineStyle = 1
    set {obj_Excel.Range "A2","C2"}.Borders.weight = 4
    set {obj_Excel.Range "A2","C2"}.Interior.ColorIndex=12

'  Excel マクロの場合
    Range("A2:C14").Borders.LineStyle = 1
    Range("A2:C2").Borders.LineStyle = 4
    Range("A2:C2").Interior.ColorIndex = 12

 上記から、ほとんど同じ記述をしていることがわかります。このように、ActiveXObjectを使用して外部コンテンツをコントロールできます。

CurlからExcelファイルの生成とデータの出力

 サンプルソースは以下の流れになっています。

1.ボタンを押し出力ファイルを選択する

 80行目のCommandButtonの部分で実装しています。84行目のchoose-fileプロシージャを使用してファイル選択ダイアログを出力し、

 choose-fileプロシージャの返却値(Url)を6行目で定義されたrecords-to-excelプロシージャに渡しています。

{CommandButton
    label="Excel出力",
    {on Action do
        let file-url:#Url
        {if-non-null file-url={choose-file
                                  style = FileDialogStyle.save-as,
                                  filters={{Array-of FileDialogFilter}
                                              {FileDialogFilter
                                                  "Microsoft Office Excel ブック",
                                                  {new
                                                      {Array-of FileDialogTypeFilter},
                                                      {FileDialogTypeFilter "xls"}
                                                  }
                                              }
                                          }
                              } then
            
            {records-to-excel file-url.name,"海外ドラマ「HEROS」のキャスト",rg.records}
        }
    }
}
2.Excelファイルが生成され保存される

 Excelファイルを生成し、データを出力する部分がrecords-to-excelプロシージャです。このプロシージャはパラメータとして以下を受け取っています。

  • ファイル名(String)
  • タイトル名(String)
  • レコードデータ(RecordView)
define-proc {records-to-excel str_FileName:String,title:String,records:RecordView}:void

 メインの処理は3番目のレコードデータを35行目のロープ処理で1行づつ出力しているところです。それ以外は罫線や背景を設定しています。

let i:int=3
{for r in records do
    set {obj_Excel.Cells i,1}.Value = {r.get "First"}
    set {obj_Excel.Cells i,2}.Value = {r.get "Last"}
    set {obj_Excel.Cells i,3}.Value = {r.get "Power"}
    set {obj_Excel.Cells 1,3}.ColumnWidth = 40
    set i = i + 1 
 }

注意事項

ActiveXの削除

 ActiveXObjectは、ガベージコレクションで解放されない限りメモリ上に残ってしまうため、処理の終了時にActiveXObjectを削除することをお勧めします。

クライアントマシンに依存するActiveXコントロール

 ActiveXコントロールはクライアントマシンの環境に依存するため、ActiveXコントロールの有無やバージョンなども十分に考慮し使用してください。

セキュリティについて

 ActiveXコンロールはクライアント資源の1つです。クライアント資源にアクセスするには、セキュリティレベルを解除する「特権」を付与しなければなりません。詳しくは、以下を参照ください。

 また、ActiveXコントロール関連のヘルプドキュメントは、以下を参照ください。

まとめ

 今回は、Curlの「バリデーションチェック」と「ActiveXを使用したExcelデータ操作」について紹介しましたが、CurlはAPIが豊富に提供されているので、業務系アプリケーション用に複雑なUIを作りたいときに、これらの部品を利用できます。まずは、サンプルを使って試してみてはいかがでしょうか。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5807 2011/03/08 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング