Excelとグラフ(Lesson2)
 Xcuteは、Excelを画面作成ツール(レイアウター)として利用しています。具体的には、Excelで書式を設定したり、入力規則を作成したり、グラフを作成したりします。
しかし、書式や入力規則の設定を行っただけでは、実務に耐えうるWebアプリケーションの開発はできません。
 よりよいWebアプリケーションを開発するには、セルにIF関数や文字列の連結などのシート関数のテクニックが必要です。本稿は、グラフの作成しながら、シート関数の使い方などを実習形式で学習していきます。
本書の読者は、Xcuteのマニュアル10章までを一読していることが前提で、本書はマニュアルの「10章 Web関連機能の詳細」のレッスンと考えてください。
 XcuteでWebアプリケーションをさくさく作るには、HTMLやXcuteの作法を体で理解しておかなければいけません。ここでは、HTMLやひな型シートをご自分で作成する実習形式で話を進めます。
使用するデータについて(Jizake.mdb)
この例題に使用するデータは、AccessのmdbファイルJizake.mdbの「地酒注文書」テーブルとします。
このファイルはExcelGraph\Appフォルダーにありますので、実習用にコピーして使ってください。
また、プロジェクト名は、ExcelGraphとします。
実習1 「地酒注文書」テーブルから、下記のURLで銘柄別の集計表レポートをブラウザに表示しなさい。
URL http://localhost/procgi/procgi.exe?P=ExcelGraph&WriteReport=Graph1
解答1 レポートGraph1のひな型Graph1シートの作成
ああ・いいなどと2件のダミーデータを作成し、グラフウィザードを使いひな型を作成します。セルR14C1の$$除去は、ダミーデータを除去するためです。
なお、ひな型は全体のセル数をなるべく減らすように作成します。下のGraph1Xでは全体のセル数が多いので多少遅くなります。(Manulの7章11参照)
レポートGraph1の作成
グラフの元になる数値を書き出すレポートを登録します。
レポートGraph1のテーブルをSQL文を使って作成します。
 このSQL文を右に示します。
このSQL文の作成は、やさしくはありませんが、とりあえずこのように作成し、つぎへ進みましょう。
レポートGraph1のひな型の設定
セル位置を設定して、完成です。
テスト Xcuteの書出(WriteReport)ボタンを選択し、Excelへ書き出しを行い正しく表示されるか確認します。
つぎに、ブラウザでURLを指定しテストを行います。
ひな型シートのR14C1セルの「$$除去」を削除し、「$$除去」の効果も確認しておきましょう。
実習2 下記のURLで、川田次郎の銘柄別の集計表レポートをブラウザに表示しなさい。
(お名前フィールドで、フィルターを掛けるレポートの作成です。)
URL http://localhost/procgi/procgi.exe?P=ExcelGraph&WriteReport=Graph2&Set_R9C1=川田次郎
解答2 今回の解答は、要点だけを述べます。実際の作成作業は、Xcuteでレポートをコピーし、Excelでひな型をコピーすると手早く行えます。
レポートGraph2のひな型シートGraph2の作成
R9C1には、ダミーのaaを入れてあり、R9C2とR2C8には計算式を指定しています。
R2C8は、Filterコマンドでフィルタをかけます。
Xcuteでは、つぎのような計算式で文字列を作成します。&は文字列を連結する時に使う記号です。"は固定文字列の区切り記号です。計算式の使い方には慣れてください。
R9C2セル =R9C1 & "さんの銘柄別グラフ"
R2C8セル ="FILTERお名前=" & R9C1
レポートGraph2のテーブルのSQL文
お名前フィールドでFilterを掛けるため、SQL文に"お名前"フィールドを追加します。
完成したXcuteのGraph2レポート
テスト まず、Xcute本体からお名前フィールドを「川田次郎」としてFilterを掛けて見ましょう。
ReadReportやFilterコマンドは、Xcuteをブラウザから遠隔操作するものであることを再確認してください。
実際のテストは、上記川田次郎のFilterをクリアしてから行ってください。
実習3 下記のURLで、下記のフォームを表示し、実習2の集計表を表示しなさい。
(Graph2を呼び出す、下記のNameInフォームを作成します。)
URL http://localhost/procgi/procgi.exe?P=ExcelGraph&WriteSheet=NameIn
解答3 実習2では、ブラウザに直接アドレスを記述することにより結果画面を得ていましたが、リストから名前を選択し送信ボタンを押すことで結果を表示する仕組みを作成することになります。
いよいよ、実務でよく使われるパターンの作成です。
ひな型シートNameInの作成
NameInの色の付いているセルは、注意個所で、個別に説明します。
・R11C3セルには、つぎのリストを入力規則で指定 ※マニュアル10章5参照
上記のように、Excelのリストボックスに文字入力した後、BSキーで削除すると、下記のエラーが発生するようにこのリストボックスを作成します。
このリストボックスは、Webでつぎのエラー・チェックを行うためです。
上記画面でリストボックスから入力なしで、送信すると、Setコマンドが空白をセットしエラーを発生します。(マニュアル10章5を参照)
4列は、黄色のセルでタグ差込を行っています。
・R7C4セルの計算式は、R1C5(プロジェクト名)を文字連結しています。
="<Input Type=""Hidden"" Name=""P"" Value=""" & R1C5 & """>"
Excelの計算式の固定文字列は、"囲みます。固定文字列の中に”を表記するには,""と2つ記述します。
固定文字の中に"を表記する数式は慣れないと難しいので、最初、固定文字の中に"を含まない下記の数式を作成し、その後で"を2つ追加して上記の数式を完成させます。
="<Input Type=Hidden Name=P Value=" & R1C5 & ">"
・R8C4セルは、WriteSheet=NameInと再度NameInを呼び出します。
<Input Type="Hidden" Name="WriteSheet" Value="NameIn">
・R3C8セルは、コマンド連鎖で、WriteReport=Graph2を呼び出します。
=IF(ISBLANK(R11C3),"","WriteReport=Graph2")
このNameInシートは、少なくとも2度呼ばれます。最初は、URLのWriteSheet=NameInで、この時は、R11C3のリストボックスは空白です。次は、FormのボタンをClickした時です。Formから呼ばれた時、何か値がセットされているなら、WriteReport=Graph2を実行させます。
テスト リストボックスが空白のままと名前が選ばれた時の2つケースをテストしてください。
解説
1)  Xcuteでは、グラフなどをExcelで作成しWeb化することは、難しくありません。今回のテーマは、業務フローのロジックの記述の手法です。
 ひな型シートのR2C8あるいはR3C8以降のセルに、業務フローのロジックを作成しますが、IF関数やExcelの&を使った計算式を使うのがコツです。
特定のセルを参照し分岐するロジックを作成するためにExcelのIF関数やLEN・ISBLANKなどの関数を知っていることも重要です。
2) 今回作成したNameInシートは、Xcuteのマニュアルの13章で説明される「ビルダー」のBuilder_1.xlsの「集計テンプレートK」シートと同じ作りになっています。
Xcuteのひな型の作り方は、一定の型があります。今回の実習も、ご自分で苦労して作成して、良いひな型の作り方のコツを身に付けてください。
3) Xcuteで今回のような集計表を作成するとなると、SQL文を使うことになります。SQLが苦手の方も少なくありません。
SQL文の学習や作成には、下記のように、Accessのクエリを利用すると簡単です。
また、SQLのやさしい参考書は、下記がお勧めです。
はじめてのSQL 著者:萌木 尨 出版社:技術評論社
一歩進んで「ListItemをOverWriteで作成」
リストボックスのアイテムをデータベースから作成しましょう。
同時にXcuteでのデバッグの方法も解説します。
最初に行うことは、リストボックスのアイテムを書き出すレポートを作ることです。ここでは、レポート名をMakeListItemとします。
1) レポートMakeListItemを作成
先に作成したNameInひな型をコピーしMakeListItem1とします。このシートのR17C2セルからアイテムを書き始めます。
XcuteにレポートMakeListItemをつぎのように作成します。
ひな型の設定では、固定を選択することが高速に書き出すために重要です。Xcuteは、「不定」では書出数に応じて行を追加し書式を整えます。この行追加の処理は時間がかかります。この場合、書式は重要でないので固定とします。
これで、レポートMakeListItemは完成しました。Excelへの書き出しテストを行います。
2) MakeListItem1ひな型の改造
リストボックスの変更
リストボックスの変更元の値をセル範囲R17C2:R100C2と十分大きな範囲でとります。
セルR3C8にOverWriteコマンドを追加(ブラウザから通常のWriteReortコマンドを送信する方法もありますが、学習のためOverWriteコマンドをつかいます。)
R3C8の元 =IF(ISBLANK(R11C3),"","WriteReport=Graph2")
R3C8の新 =IF(ISBLANK(R11C3),"OverWrite=MakeListItem","WriteReport=Graph2")
タグ差込のR8C4を変更
R8C4の元 <Input Type="Hidden" Name="WriteSheet" Value="NameIn">
R8C4の新 <Input Type="Hidden" Name="WriteSheet" Value="MakeListItem1">
ブラウザから、WriteSheet=MakeListItem1を送信します。
つぎのエラーが発生します。エラーは、メイン・コマンドが指定されていないと指示しています。
この時のExcelのBookを調べ、原因を突き止めます。
R1C8セルには、WriteSheetがありますので、ここは原因ではありません。R3C8以降に指定するコマンド連鎖で、エラーが発生したはずです。
R3C9セルに、Set_R9C1=がありますが、これが原因でしょう。つぎのように修正し、ここを空白にします。
R3C9の元 ="Set_R9C1=" & R11C3
R3C9の新 =IF(IsBlank(R11C3),"","Set_R9C1=" & R11C3)
なお、学習経過を残すため、このひな型をMakeListItem2ととしてひな型ブックに残してあります。再現には、セルR8C4のタグ差込とMakeListItemレポートのひな型シート名の変更が必要です。
ブラウザから、WriteSheet=MakeListItem2を送信します。
http://localhost/procgi/procgi.exe?P=ExcelGraph&WriteSheet=MakeListItem2
リストボックスも作られ、ここまでは、正解です。
リストボックスから、名前を選んで送信します。
リストボックスで、エラー発生しています。
Bookを調べると、セルR11C3に「川田次郎」がセットされたが、リストアイテムは空白であることが原因です。
リストボックスのエラー・メッセージを削除するように変更し、MakeListItem3とします。
ブラウザにMakeListItem3を表示し、リストボックスから、名前を選んで送信します。
このテストは、OKです。
リストボックスを空白にして送信します。
送信ボタンを押下しても、画面は変化しません。
リストボックスのエラー・メッセージを削除したため、R11C3が空白の時、再度OverWriteしてその画面を送信していることが解かります。
空白で送信されたとき、再度リスト選択画面を表示する設計でも悪くはありませんが、今回はエラー画面を表示するようにしたいと思います。
しかし、リストボックスのエラーを有効にする訳にいきません。
R2C6セルを使う前処理のエラー・トラップは使えるはずです。このエラー・トラップにMessage=エラーなどを指定できます。しかし、R11C3が空白の時という条件だけでは意味をなしません。
幸い、フォームにはPOSTを返す指定があります。ブラウザからURLを指定した時はGETとなります。
したがって、POST且つR11C3が空白の時が、エラーとする条件です。
R2C6セルにつぎのエラー・トラップを追加し、ひな型をMakeListItem4とします。
R2C6 =IF(AND(R1C4="POST",ISBLANK(R11C3)),"Message=エラー","")
ブラウザにMakeListItem4を表示し、リストボックスを空白のまま送信します。
これで、ひな型シートのうまく動作します。
最終的なひな型シートは、MakeListItemとし、R2C6のエラー・トラップもWriteSheet=NameInMsgとしてあります。
最終的なMakeListItemは、下記のように動作します。
もう半歩進んでフレーム版を作ってみましょう。
ここまで、出来ればフレームを作成することは難しくありません。
つぎのように、graphframe.htmを作成します。
フレームは、上(f_top)下(f_bottom)に分け、WriteSheet=NakeListItemFrameとWrieSheet=NameInMsgを呼びます。
MakeListItemをコピーしてMakeListItemFrameを作成し、つぎを修正します。
ひな型シート名の変更に対応し、下記を変更
R8C4の元 <Input Type="Hidden" Name="WriteSheet" Value="MakeListItem">
R8C4の新 <Input Type="Hidden" Name="WriteSheet" Value="MakeListItemFrame">
レポート名をMakeListItemFrameにするため、下記を変更
R3C8の元 =IF(ISBLANK(R11C3),"OverWrite=NameInMakeList","WriteReport=Graph2")
R3C9の新 =IF(ISBLANK(R11C3),"OverWrite=MakeListItemFrame","WriteReport=Graph2")
<Formタグにtarget="f_bottom"を追加するため、下記を変更
R8C4の元 <Form Method="Post" Action="procgi.exe" target="f_bottom">
R8C4の新 <Form Method="Post" Action="procgi.exe">
MakeListItemレポートをコピーしてMakeListItemFrameを作成し、つぎを修正します。
レポートMakeListItemFrameのひな型シートをMakeListItemFrameとします。
ブラウザで、graphframe.htmを呼び出してテストします。
http://localhost/procgi/graphframe.htm
以上