Function get_sname(strCODE)
strSQL = "Select 商品名 From T_商品 Where 商品CD='" & strCODE & "'"
Set rs_master = db.Execute(strSQL) 'SQL文の発行
If rs_master.EOF = True Then 'データ無し?
get_sname = strCODE & "はエラーです"
Else
get_sname = rs_master("商品名").Value
End If
rs_Master.Close 'クローズ
Set rs_master = Nothing 'と開放で後始末・・・
End Function
データテーブルを商品CD順にして、
'お約束のレコードセットの作成
'T_月別売上から全項目(*)を指定、Order Byで商品コード順にする
Set rs = db.Execute("Select * From T_月別売上 Order By 商品CD")
とSQL文を発行、レコードセットを作成。
ループの中で、
'マスターから商品名を読み込む
Response.Write "<TD>" & get_sname(rs("商品CD").Value) & "</TD>"
なんて感じで、作成した関数でマスターテーブルを読み込んでました。
流行のRDB(リレーショナルデータベース)を知らない作りをしてみました。
今回は、テーブルをつなげてみたいと思います。
/*
* 2.テーブルを単純につなげる
*/
何の条件も無しにSQLでテーブルを2つ使用してみます。
^^^^^^^^^^^^^^^^
T_月別売上 テーブル
商品CD
売上4
売上5
・
・
売上12
売上1
売上2
売上3
↑作成したテーブルイメージ
T_商品 テーブル
商品CD
商品名
↑作成したテーブルイメージ
なにも条件を指定しないで、2つのテーブルをFrom句に書いてみました。
Set rs = db.Execute("Select * From T_月別売上, T_商品")
と、SQL文でレコードセットを作成してみた
さて、どうなるでしょう?
http://www.ken3.org/cgi-bin/test/test073-1.asp
でテスト結果をみると、
T_月別売上.商品CD
A1 に対して、同じデータが6行作成され、
T_商品.商品CDがA1,A2,A3,B1,B2,B3となってます
T_月別売上.商品CD A2も同様に6行データが作成されてます。
あらら、A1はA1同士つなげた商品名がほしいのにね・・・
Select * From T_月別売上, T_商品
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
だと、2つのテーブルの内容をセレクトしてくれるけど、
作成されたレコードセットのイメージはかなり違うなぁ・・・
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>テストで2つのテーブルデータを指定</title>
</head>
<body>
<h2>テストで2つのテーブルデータを指定</h2>
なにも条件を指定しないで、2つのテーブルをFrom句に書いてみました。<br>
Set rs = db.Execute("Select * From T_月別売上, T_商品")<br>
と、SQL文でレコードセットを作成してみた<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 'やっとデータベースを開ける
'お約束のレコードセットの作成 T_月別売上,T_商品を指定
Set rs = db.Execute("Select * From T_月別売上, T_商品")
'データの表示をテーブルで行う
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.商品コードが一致したデータにする
*/
商品コードで結合してないからだろボケ・・なんて読者の声を聞きつつ、
商品コードが一致するデータとWhere条件を付けてみます。
ポイントは、特に無く、
Select * From T_月別売上, T_商品
Where T_月別売上.商品CD = T_商品.商品CD
とSQL文を作成してます。
テーブル名.フィールド名
と
ドット(ピリオド)で区切って、
T_月別売上.商品CD はT_月別売上テーブルの商品CDフィールド
をあらわすぐらいかなぁ。
http://www.ken3.org/cgi-bin/test/test073-2.asp
が、T_月別売上.商品CD = T_商品.商品CDで一致させたデータです。
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>2つのテーブルを商品コードでつなげる</title>
</head>
<body>
<h2>2つのテーブルを商品コードでつなげる</h2>
条件を指定して、2つのテーブルをつなげてみます。<br>
Select * From T_月別売上, T_商品<br>
Where T_月別売上.商品CD = T_商品.商品CD<br>
と<br>
商品コードでつなげる条件を書いてみました。<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 'やっとデータベースを開ける
'お約束のレコードセットの作成 T_月別売上,T_商品を指定
'結合の条件 T_月別売上.商品CD = T_商品.商品CD を指定
strSQL = "Select * From T_月別売上, T_商品"
strSQL = strSQL & " Where T_月別売上.商品CD = T_商品.商品CD"
Set rs = db.Execute(strSQL) 'SQL発行、レコードセットを作成
'データの表示をテーブルで行う
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>
-- 余談 -- 一流読者の心の声?
SELECT T_月別売上.*, T_商品.*
FROM T_月別売上 INNER JOIN T_商品 ON T_月別売上.商品CD = T_商品.商品CD;
と
INNER JOIN でつなげろって?
まぁまぁ、あせらないでくださいよ・・・・
/*
* 4.SQL文を変えてみた
*/
2つのテーブルを商品コードでつなげたレコードセットを作成して処理しました
Select * From T_月別売上, T_商品
Where T_月別売上.商品CD = T_商品.商品CD
Order By T_月別売上.商品CD
と、SQLを発行するように修正しました。
すると、
57: 'グループ化のコードを初期化する
58: sum_code = Left(rs("商品CD").Value , 1) '先頭レコードの商品コード1桁目
ADODB.Recordset エラー '800a0cc1'
要求された名前、または序数に対応する項目がコレクションで見つかりません。
/cgi-bin/test/test073-3.asp, 行 58
えっ、58行目?エラー?
あっ、rs("商品CD")って、
T_月別売上.商品CD なのか T_商品.商品CD か、わからないのかぁ。
rs("商品CD").Value を rs("T_月別売上.商品CD").Value に変更するか。
http://www.ken3.org/cgi-bin/test/test073-3.asp
で、下記の作成したプログラムのテストが出来ます。
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>マスターとつなげて商品名を表示してみた</title>
</head>
<body>
<!-- Ken3 --><!-- #include file="info.inc" -->
<h2>マスターとつなげて商品名を表示してみた</h2>
2つのテーブルを商品コードでつなげたレコードセットを作成して処理しました<br>
Select * From T_月別売上, T_商品<br>
Where T_月別売上.商品CD = T_商品.商品CD<br>
Order By T_月別売上.商品CD<br>
<hr>
<%
'ADO DB Connection オブジェクトを作成する、英文そのままじゃん
Set db=Server.CreateObject("ADODB.Connection")
'.Provider?プロバイダー?通信会社?じゃなくって
'データアクセスにはJet.OLEDB.4.0を使うことを設定
db.Provider = "Microsoft.Jet.OLEDB.4.0"
'次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す
db.ConnectionString = Server.MapPath("db072.mdb")
'やっとデータベースを開ける
db.open
'お約束のレコードセットの作成 T_月別売上,T_商品を指定
'結合の条件 T_月別売上.商品CD = T_商品.商品CD を指定
strSQL = "Select * From T_月別売上, T_商品"
strSQL = strSQL & " Where T_月別売上.商品CD = T_商品.商品CD"
strSQL = strSQL & " Order By T_月別売上.商品CD"
Set rs = db.Execute(strSQL) 'SQL発行、レコードセットを作成
'データの表示をテーブルで行う
Response.Write "<TABLE Border='1'>"
'見出しを表示する
Response.Write "<TR bgcolor=#E0FFFF>"
Response.Write "<TH>商品名</TH>"
For n = 4 To 9 '4月から9月と見出しを表示したいので
Response.Write "<TH>" & n & "月</TH>"
Next
Response.Write "<TH>上期計</TH>"
Response.Write "</TR>"
'月別の小計・総合計を保存する配列を作成する
Dim sum_group(12) 'グループ合計
Dim sum_all(12) '総合計
Dim sum_code 'グループ化のコード
'総合計エリア、グループ合計を初期化する
For n = 1 To 12
sum_group(n) = 0
sum_all(n) = 0
Next
'グループ化のコードを初期化する
sum_code = Left(rs("T_月別売上.商品CD").Value , 1) '商品コード1桁目
'お約束のEOFまでループは(データが無くなるまでループ)、
Do While rs.EOF = False 'レコードセットの.EOFがFalseの間
'グループコードが変わったかチェックする
If sum_code <> Left(rs("T_月別売上.商品CD").Value , 1) Then
'小計を表示する
Response.Write "<TR bgcolor=#FFE0FF>" '行を表示する
Response.Write "<TD>小計</TD>"
g_kamiki = 0 '小計の上期集計用の変数を初期化する
For n = 4 To 9 '4〜9月
Response.Write "<TD>" & sum_group(n) & "</TD>" 'n月の値を表示
g_kamiki = g_kamiki + sum_group(n) '小計の上期のタメに計算
Next
Response.Write "<TD>" & g_kamiki & "</TD>" '小計の上期計を表示
Response.Write "</TR>" '行の終わり
'次のグループになるので、配列とCODEを初期化する
sum_code = Left(rs("T_月別売上.商品CD").Value , 1) '次のコードを代入
For n = 4 To 9 '小計値を初期化する
sum_group(n) = 0
Next
End If
Response.Write "<TR>" '行を表示する
'マスターから商品名を読み込む
Response.Write "<TD>" & rs("商品名").Value & "</TD>"
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
'月別、グループ、総合計を計算する
sum_group(n) = sum_group(n) + rs("売上" & n).Value 'グループ
sum_all(n) = sum_all(n) + rs("売上" & n).Value '総合計
Next
'上期の合計を表示する
Response.Write "<TD>" & g_kamiki & "</TD>"
Response.Write "</TR>"
'次のレコードにポインタを移動する
rs.MoveNext 'これを忘れると悲惨なことに、、、
Loop
'ループを抜けたら、最後の小計を表示する
'小計を表示する
Response.Write "<TR bgcolor=#FFE0FF>" '行を表示する
Response.Write "<TD>小計</TD>"
g_kamiki = 0 '小計の上期集計用の変数を初期化する
For n = 4 To 9 '4〜9月
Response.Write "<TD>" & sum_group(n) & "</TD>" 'n月の値を表示
g_kamiki = g_kamiki + sum_group(n) '小計の上期のタメに計算
Next
Response.Write "<TD>" & g_kamiki & "</TD>" '小計の上期計を表示
Response.Write "</TR>" '行の終わり
'総合計の表示(計算した総合計を表示する)
Response.Write "<TR bgcolor=#FFFFE0>" '行を表示する
Response.Write "<TD>総合計</TD>"
g_kamiki = 0 '総合計の上期集計用の変数を初期化する
For n = 4 To 9 '4〜9月の値を表示する
Response.Write "<TD>" & sum_all(n) & "</TD>" 'n月の値を表示
g_kamiki = g_kamiki + sum_all(n) '総合計の上期のタメに計算
Next
Response.Write "<TD>" & g_kamiki & "</TD>" '小計の上期計を表示
Response.Write "</TR>" '行の終わり
Response.Write "</TABLE>" 'テーブルは終わりです
'開いていたレコードセットを閉じる
rs.Close
'データベースも閉じようよ
db.Close
'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど)
Set db = Nothing
%>
<hr>
終了です。<br>
</body>
</html>