[三流君] −−>
[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
で、テスト実行できます。
-【けんぞう!】---------------------------------------------------------
番外編:在宅プログラマー↓↓派遣登録した時の笑い話です(実話です)
http://www.ken3.org/etc/500yen/zaitaku.html
出会い系システムを探った話は↓↓
http://www.ken3.org/etc/500yen/deai.html
※おっ、と思ったら覗きに来てくださいね。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
※あとは
http://www.ken3.org/etc/pc.html PC自作パーツと本体
http://www.ken3.org/etc/game.html GAMEソフト(国内)
http://www.ken3.org/etc/net.html ブロードバンド通信・レンタルサーバー
http://www.ken3.org/etc/book.html 本/書籍
http://www.ken3.org/etc/cd_dvd.html CD/DVD/ビデオ
http://www.ken3.org/etc/flower.html 花・フラワー
http://www.ken3.org/etc/diet.html ダイエット・健康食品・サプリメント
http://www.ken3.org/etc/cosme.html 美容・化粧品
http://www.ken3.org/etc/bland.html ブランド・ジュエリー・香水
http://www.ken3.org/etc/gourmet.html グルメ・おいしい食品
http://www.ken3.org/etc/sake.html 日本酒・焼酎
http://www.ken3.org/etc/wine.html ワイン
http://www.ken3.org/etc/cheese.html チーズ
http://www.ken3.org/etc/dessert.html デザート・お菓子
http://www.ken3.org/etc/pet.html ペット関係
http://www.ken3.org/etc/500yen/ebank.html イーバンク申し込み
----
を
バナーから売ろうとするけど、
なかなかうまくはいかないよね(笑)
------------------------------------------------------------------------
/*
* 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でした。
フィードバック
ASP系の→[掲示板]←を覗く、質問を書き込む
評価・感想
三流君の主なリンク先
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
Ken3の日記(weblog) --
[広告・副収入系]
[プログラマー業務の愚痴]
[VBA系の話題]
[ASP系の話題]
[コンビニ系ネタ]
[その他]
その他 宣伝広告