<演算フィールドを作成する>
こんにちは、三流プログラマーの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でした。
ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]
まぁ、基本はデータの受け取りかなぁ。
・[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記事 バックナンバー目次]