[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.074 演算フィールドを作成する

演算フィールドを作成する



本文(発行内容)


<演算フィールドを作成する>

こんにちは、三流プログラマーのKen3です。 小計・合計の表示プログラムで、 上期の合計をループで計算させてました。 今回は、チョットだけ進化させて、 SQL内で計算してみたいと思います。

/* * 1.今回のキッカケ */

前回までの、商品名表示を組み込んだ表 http://www.ken3.org/cgi-bin/test/test072-4.asp で、商品マスターから商品名を検索して、表示させました。 この表で、4月から9月の上期の合計を計算表示してます。 計算方法は、フィールドをループで計算してました。 g_kamiki = 0 '集計用の変数を初期化する For n = 4 To 9 'フィールドにフィールド名でアクセスする Response.Write "<TD>" & rs("売上" & n).Value & "</TD>" '↑"売上" & nでフィールド名売上4..売上9を作成してアクセス '自分で上期を集計する g_kamiki = g_kamiki + rs("売上" & n).Value Next まぁ、これも間違いじゃないんだけど。

/* * 2.演算フィールドって何? */

通常、下記のようなテーブルがあったら、 T_月別売上 テーブル 商品CD 売上4 売上5 ・ ・ 売上12 売上1 売上2 売上3 ↑作成したテーブルイメージ Select * From T_月別売上 なんて感じのSQL文を作成して、データを取り出します。 http://www.ken3.org/cgi-bin/test/test072-1.asp 上記で、テストしているのが、 Set rs = db.Execute("Select * From T_月別売上") でレコードセットを作成して、 For Each fld_A In Rs.Fields 'フィールドのアイテムに対してループ Response.Write "<TD>" & fld_A.Value & "</TD>" '↑.Valueでフィールドの値を表示する Next フィールドの全ての項目を呼び出し表示してます。 このフィールドに対して、演算した/フィールドを使った式を作ることが出来ます。 だから何?えっと、 下記のテストデータがあります。 商品CD 売上4 売上5 ... 売上1 売上2 売上3 A1 1 2 ..... A2 2 3 ..... 商品コードの1桁目をグループコードした時に、 下記のSQL文を書きます。 Select Left([商品CD], 1) AS GroupCD, * From T_月別売上 ポイントは、 Left([商品CD], 1) AS GroupCD として、Left関数を使用して、1文字とり出し、 AS GroupCDで演算結果のフィールド名はGroupCDと指定しました。 Select Left([商品CD], 1) AS GroupCD, * と,のあとの*で、テーブル内のフィールド全てを取り出してます。 百聞は一見になので、下記を実行してみてください。 http://www.ken3.org/cgi-bin/test/test074-1.asp ↑左端に、GroupCDの項目が表示されていると思います。 SQL文しか変わっていないけど、下記がソースです。 <%@LANGUAGE=VBScript%> <html> <head> <title>演算フィールドの作成テスト</title> </head> <body> <h2>演算フィールドの作成テスト</h2> 商品CDの一桁目を(左から1文字を)GroupCDにする。<br> strSQL = "Select Left([商品CD], 1) AS GroupCD, * From T_月別売上"<br> Set rs = db.Execute(strSQL)<br> と、演算フィールドとして、<br> <b>Left([商品CD], 1) AS GroupCD</b>を作成する。<br> <hr> <% 'ADO DB Connection オブジェクトを作成する、英文そのままじゃん Set db=Server.CreateObject("ADODB.Connection") 'データアクセスにはJet.OLEDB.4.0を使うことを設定 db.Provider = "Microsoft.Jet.OLEDB.4.0" '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す db.ConnectionString = Server.MapPath("db072.mdb") db.open 'データベースを開く '商品CDの一桁目を(左から1文字を)GroupCDにする strSQL = "Select Left([商品CD], 1) AS GroupCD, * From T_月別売上" Set rs = db.Execute(strSQL) 'データの表示をテーブルで行う Response.Write "<TABLE Border='1'>" '見出しを(フィールド名を)そのまま書き込む Response.Write "<TR>" For Each fld_A In Rs.Fields 'フィールドのアイテムに対してループ Response.Write "<TH>" & fld_A.Name & "</TH>" '↑.Nameでフィールド名を表示する Next Response.Write "</TR>" 'お約束のEOFまでループは(データが無くなるまでループ)、 Do While rs.EOF = False 'レコードセットの.EOFがFalseの間 Response.Write "<TR>" '内容を表示する For Each fld_A In Rs.Fields 'フィールドのアイテムに対してループ Response.Write "<TD>" & fld_A.Value & "</TD>" '↑.Valueでフィールドの値を表示する Next Response.Write "</TR>" '次のレコードにポインタを移動する rs.MoveNext 'これを忘れると悲惨なことに、、、 Loop Response.Write "</TABLE>" 'テーブルは終わりです '後始末 rs.Close '開いていたレコードセットを閉じる db.Close 'データベースも閉じようよ Set db = Nothing 'お行儀よくオブジェクトも開放しましょう %> <hr> 終了です。<br> </body> </html>

/* * 3.上期の合計を計算する */

簡単に計算することが出来ましたね。 演算フィールド、なんとなく、わかりましたか? 今度は、上期と下期の合計を計算してみます。 項目を+(加算)して上期計にする。 Select Left([商品CD], 1) AS GroupCD, T_月別売上.* ,([売上4]+[売上5]+[売上6]+[売上7]+[売上8]+[売上9]) AS 上期計 ,([売上10]+[売上11]+[売上12]+[売上1]+[売上2]+[売上3]) AS 下期計 >From T_月別売上 Set rs = db.Execute(strSQL) と、演算フィールドとして、上期計と下期計を作成しました。 http://www.ken3.org/cgi-bin/test/test074-2.asp で、テスト実行できます。

/* * 4.終わりの挨拶 </HTML> */

Left等の関数を使って、フィールドの編集結果を新たなフィールドにする。 ([売上4]+[売上5]+[売上6]+[売上7]+[売上8]+[売上9]) AS 上期計 と単純に計算を行って、フィールドを作成する。 そんなことが簡単に可能、そんなイメージがわきましたか? 自分で計算する ^^^^^^^^^^^^^^ g_kamiki = 0 '集計用の変数を初期化する For n = 4 To 9 'フィールドにフィールド名でアクセスする Response.Write "<TD>" & rs("売上" & n).Value & "</TD>" '↑"売上" & nでフィールド名売上4..売上9を作成してアクセス '自分で上期を集計する g_kamiki = g_kamiki + rs("売上" & n).Value Next SQLに演算フィールドを作る ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Select T_月別売上.*,([売上4]+[売上5]+[売上6]+[売上7]+[売上8]+[売上9]) AS 上期計 From T_月別売上 アナタは、自分で計算するorSQLに式を書いて置く、 どちらが好みですか? これで、横の計算は、SQLだけでもなんとかなりそうですね。 ---------------------------------------------------------------- | 商品名 | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 | 上期計 | ---------------------------------------------------------------- | A1   |  1 |  2 |  3 |  4 |  5 |  6 |   21 | | A2   |  2 |  0 |  4 |  5 |  6 |  7 |   24 | | A3   |  3 |  1 |  5 |  6 |  7 |  8 |   30 | ---------------------------------------------------------------- | 小計  |  6 |  3 | 12 | 15 | 18 | 21 |   75 | ---------------------------------------------------------------- あとは、 縦の小計を簡単にしたいですよね・・・ 今回の解説でもSQL系まだまだなんだけど、 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。


ページフッター

ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、

三流君へ メッセージを送る

感想や質問・要望・苦情など 三流君へメッセージを送る。
返信例 XXXXさんへ
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:


(感想や質問・要望・苦情はHPで記事に載せることがあります。)

種類別のリンク や 広告など

[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


Blogとリンク:[三流君のMemo別館]/ [ASP 三流君のソースコード置き場]/ [Ken3Video YouTubeで動画解説]
広告:

気になった ジャンル ↓を選択してください。

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

広告:



DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


広告: