[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.73 テーブルをつなげて商品名を取得する方法

テーブルをつなげて商品名を取得する方法



本文(発行内容)


<テーブルをつなげて商品名を取得する方法>

こんにちは、三流プログラマーのKen3です。 前回は、リレーションを知らない?な人が作った(三流プログラマーの私(笑)) 小計・合計の表示プログラムでした。 今回は、チョットだけ進化させて、テーブルをつなげて見たいと思います。

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

前回の、商品名表示を組み込んだ表 http://www.ken3.org/cgi-bin/test/test072-4.asp で、商品マスターから商品名を検索して、表示させました。 '商品コードを受け取り、商品名を返す関数を作成する
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>

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

今回は、 テーブルをつなげて、商品名付のレコードセットを作成して、 使用してみました。 自分でマスターを読み込むより、SQLでつなげたほうが簡単だったでしょ? 今回の解説でも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記事 バックナンバー目次]


広告: