[三流君] −−> [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系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.074を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

三流君の主なリンク先

[アクセスランキング] [サイトマップ] [リンク先・相互リンク先など]
ASPで遊ぶ、失敗する 掲示板 バックナンバー 登録と解除
三流プログラマー 業務の愚痴 掲示板 バックナンバー 登録と解除
VBAで楽しくプログラミング 掲示板 バックナンバー 登録と解除
コンビニのオモテとウラ話 掲示板 バックナンバー 登録と解除
www.ken3.org(サイト内)から Google を利用して、

Ken3の日記(weblog) -- [広告・副収入系] [プログラマー業務の愚痴] [VBA系の話題] [ASP系の話題] [コンビニ系ネタ] [その他]

その他 宣伝広告