演習 9 入力した条件に従いデータベースからデータを抽出する 1
演習 9 製品情報を取得するサンプル パソコン製品情報が格納された表から 任意のメーカー IDを取得するプログラムの構造を検討する sample1.htm sample1.asp SDEV_MST_PRODUCT 2 データベース クライアント サーバー PC_KATABAN KOBAN MAKER_ID HD-0001 1 NED HD-0002 2 NED パソコン製品情報 SDEV_MST_PRODUCT
演習 9 パソコン製品情報の表 3 パソコン製品情報の表の名前は SDEV_MST_PRODUCT である SELECT * FROM SDEV_MST_PRODUCT を入力し データを確認すること 項番 列名 項目名 データ型 サイズ 内容 1 PC_KATABAN 製品型番 TEXT 10 パソコンの型番 2 KOBAN 子番 INTEGER2 - 並び替えで使用する番号 3 MAKER_ID メーカー ID TEXT 10 パソコンメーカーのID 番号 4 PC_TYPE パソコン種類 INTEGER2 - パソコンメの種類 (0-デスクトップ,1-ノート) 5 PC_NAME 製品名 TEXT 50 パソコンの製品名 6 STOCK_VALUE 仕入れ値 LONG - パソコンの仕入れ値 ( 単位 : 円 ) 7 STOCK_NUM 在庫数 LONG - パソコンの在庫数 8 SAL_VALUE パソコン販売価格 LONG - パソコンの販売価格 ( 単位 : 円 ) 9 SPEC スペック TEXT 255 パソコンのスペック PC_KATABAN は主キーである
演習 9 プログラム構造に関して 4 設問 問 1 内容 sample1.htm と sample1.asp は どの様な処理 ( 画面 ) を行っているか? それぞれの処理概要と構造的な関係を UML 図で示せ (UML はシーケンス図またはコミュニケーション図で表現 ) 問 2 sample1.asp は 表 SDEV_MST_PRODUCT にどの様にアクセスしているか? DB アクセスの処理概要と SQL 文を抜き出す sample1.htm sample1.asp SDEV_MST_PRODUCT
演習 9 設問 1 - 解答例 - 5 設問 内容 sample1.htm と sample1.asp は 問 1 どの様な処理 ( 画面 ) を行っている か? それぞれの処理概要と構造的な 関係を示せ
演習 9 設問 1 6 1 タイトル メッセージ等の表示 sample1.htm 2 検索条件としてメーカ名を入力させるテキストボックスと 検索実行 ボタンを表示 3 検索実行 の submit ボタンを実行すると テキストボックスに入力されたデータ値 ( メーカ名 ) が txtvalue に格納されて sample1.asp に送られる sample1.asp 1 3 2
演習 9 設問 1 7 4 sample1.htm sample1.asp 4 起動と同時にtxtValueに格納された値を取得 5データベースSDEV_MST_PRODUCT 表への接続 /Open 6 取得した値を検索キーとしてSQL 文の生成と実行 6 7 検索結果をHTMLに編集して出力 7 5 Open SQL(Select) Close SDEV_MST_PRODUCT
シーケンス図 8
アクティビティ図 9
演習 9 設問 2 10 設問 内容 sample1.asp は 表 SDEV_MST_PRODUCT に 問 2 どの様にアクセスしているか? DB アクセスの処理概要と SQL 文を抜き出す
演習 9 設問 2 11 sample1.asp [SDEV_MST_PRODUCT] 表から sample1.htm で入力した値 (txtvalue) と一致する MAKER_ID を検索キーとして [MAKER_ID],[PC_NAME],[SAL_VALUE],[SPEC] の値を [KOBAN] の昇順に並べて結果を返す SQL 文を作成 sample1.htm で入力したメーカー ID(txtValue) を取得し formvalue 変数に格納 formvalue = Request.Form ( "txtvalue" ) SQL 文 strsqlwork="select MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT WHERE MAKER_ID='" & formvalue & "' ORDER BY KOBAN"
演習 9 データベースと SQL の構成 SDEV_MST_PRODUCT 12 txtvalue 入力された MAKER_ID SQL 文 SELECT - FROM - WHERE - ORDER BY - [MAKER_ID] [PC_NAME] [SAL_VALUE] [SPEC] という項目を [SDEV_MST_PRODUCT] 表から 入力された [MAKER_ID] を検索キーとして抽出し [KOBAN] の昇順で並べた結果を返す
演習 9 画面の構成 sample1.htm 13 sample1.asp NED の値を渡す
演習 9 sample1.htm ソース 14 1 <html> : ~ 省略 ~ 9 <FORM name="frmsearch" action="./sample1.asp" method="post" target="_self"> 10 <input type="text" value="" name="txtvalue"> 11 <br> 12 <input type="submit" value=" 検索実行 " name="sbmsearch"> 13 </FROM> : ~ 省略 ~ submit ボタン 9 行目から13 行目の処理 submitボタンを実行した時に フィールドに入力された値が txtvalueに格納されて sample1.aspに送られる動作を行う
15 asp ファイル内では HTML として処理する部分と VBScript として処理する部分が混在する asp ファイル内では 上から順にプログラム処理される
1 行目 2 行目は決まりの文言である 16 1 <%@ LANGUAGE="VBSCRIPT" %> 2 <%Option Explicit%> asp で使用する言語を宣言する VBScript を適用する 変数の宣言は 必ず実行しなければならないという宣言文 3 <% ここ <% から %> まで asp VBScript として処理することを示す 即ち 13 行目までを VBScript として処理する asp として処理するのは <% から %> の間となり asp プログラムの中に複数存在しても良い
17 asp ファイル /VBScript で使用する変数の宣言 4 Dim m_objdb ' データベースオブジェクト 5 Dim objrs ' 製品マスター用レコードセットオブジェクト 6 Dim strsqlwork ' SQL 文を格納する変数 7 Dim formvalue ' sample1.htm で入力されたフォームの変数を格納する パラメータの取得 sample1.htm で入力した文字列を取得し 変数 formvalue に格納する ( メーカ ID) 8 formvalue = Request.Form ( "txtvalue" ) sample1.htm の Form 内で定義した入力ボックス名 <input type="text" value="" name="txtvalue"> HTML の Form で入力した値を取得する方法は Request.Form( 名前 ) で行う
データベースをオープン ( 接続 ) する 9 Set m_objdb = Server.CreateObject("ADODB.Connection") データベースに接続するための処理 18 10 m_objdb.open DSN=sdevDB-dsn;" ' 変更しないで下さい データベースを開く 9 行目 10 行目はデータベースを使用するために必要な処理 以後 変数 m_objdb を使って SQL 実行を行う
SQL 文を作成して 変数 strsqlwork に代入する 19 11 strsqlwork = "SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT WHERE MAKER_ID ='" & formvalue & "' ORDER BY KOBAN" SQL 文 SELECT - FROM - WHERE - ORDER BY - [MAKER_ID] [PC_NAME] [SAL_VALUE] [SPEC] という項目を [SDEV_MST_PRODUCT] 表から入力された [MAKER_ID] を検索キーとして抽出し [KOBAN] の昇順で並べた結果を返す sample1.htm で入力したメーカー ID 値と一致する MAKER_ID を持つデータを抽出する 条件を WHERE 文で定義する 結果を [KOBAN] の昇順で整列させる (ORDER BY 句を使用 )
20 SQL 文を組み立てる まず 検索文を組み立てる 条件文 整列文を除いた SQL 文の作成 SQL 文 SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT 次に 変数以外の部分を組み入れる 整列文を加えた SQL 文の作成 SQL 文 SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT ORDER BY KOBAN
21 SQL を変数 strsqlwork に代入する SQL は言語だが asp/vbscript では一連の文字列として処理される そのため SQL 文全体をダブルクゥオーテーション ( ) で囲む必要がある strsqlwork = "SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT ORDER BY KOBAN" SQL 文は文字列なので " で囲む
sample1.htmで入力した値は 8 行目の処理で変数 formvalueに格納されている 8 formvalue = Request.Form ( "txtvalue" ) 変数 formvalueを条件データとしてsqlを作成する 22 SQL 文は文字列 formvalue は変数 ( 文字列 ) なので strsqlwork 変数への代入式は以下の連結代入の形式となる strsqlwork = " 文字列 " & 変数 & " 文字列 " strsqlwork = "SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT WHERE MAKER_ID=" & formvalue & "ORDER BY KOBAN"
23 例えば formvalue に NED が格納されている場合 SQL 文は以下のようになる strsqlwork = "SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT WHERE MAKER_ID=" & formvalue & "ORDER BY KOBAN" strsqlwork = "SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT WHERE MAKER_ID=NED ORDER BY KOBAN" strsqlwork = "SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT WHERE MAKER_ID=' " & formvalue & " ' ORDER BY KOBAN" SQL では文字型のデータを設定するには 値を ( シングル クォーテーション ) で囲む必要があるので NED としなければならない
24 12 Set objrs = m_objdb.execute(strsqlwork) SQL 文を実行し 実行した結果を変数 objrs に代入する m_objdb.execute(sql 文 ) で strsqlwork に格納された SQL 文を実行する 実行した結果は 変数 objrs に代入 (set) する 以後 変数 objrs を使って データベースの検索結果の値を操作する objrs の中に SQL 文の検索結果データがレコード数分格納されている 13 %> ここ %> までを asp VBScript として処理することを示す 即ち 3 行目から 13 行目までを VBScript として処理する asp として処理するのは <% から %> の間 この領域は asp プログラムの中に複数存在しても良い
14 <HTML> 15 <HEAD> : : 22 <B> 検索結果 </B> : 25 <TABLE cellspacing="1" cellpadding="3" width="100%"> 26 <TR> 27 <TD bgcolor="#333333" align="center"><font size="2" COLOR="#ffffff"><b> 製品名 </b></font></td> : : 31 </TR> 25 記述された HTML タグをそのまま処理する この部分は HTML のヘッダ部と一覧 TABLE の 1 行目 ( 列タイトル ) を出力している
26 18 <TITLE> サンプル 1- 検索結果 -</TITLE> 19 </HEAD> 20 <BODY bgcolor="#ffffff"> 21 <CENTER> 22 <B> 検索結果 </B> 23 <BR> 24 <BR> 25 <TABLE cellspacing="1" cellpadding="3" width="100%"> 26 <TR> 27 28 29 30 31 </TR> <TD bgcolor="#333333" align="center"><font size="2" COLOR="#ffffff"><b> 製品名 </b></font></td> <TD bgcolor="#333333" align="center"><font size="2" COLOR="#ffffff"><b> メーカー </b></font></td> <TD bgcolor="#333333" align="center"><font size="2" COLOR="#ffffff"><b> 販売価格 </b></font></td> <TD bgcolor="#333333" align="center"><font size="2" COLOR="#ffffff"><b> スペック </b></font></td>
27 32 <% 更に ここ <% から %> まで asp VBScript として処理することを示す 即ち 32 行目から 43 行目までを VBScript として処理する Do While ~ Loop 文で ( 検索結果データを表形式で表示するタグを生成する処理 ) objrs.eof が False( 偽 ) の間 Loop までの間の処理を繰り返すことを意味する 33 Do While (objrs.eof = False) 34 Response.Write("<TR>") 35 Response.Write(vbCrLF) 36 Response.Write("<TD>" & objrs("pc_name") & "</TD>") 37 Response.Write("<TD>" & objrs("maker_id") & "</TD>") 38 Response.Write("<TD>" & objrs("sal_value") & "</TD>") 39 Response.Write("<TD>" & objrs("spec") & "</TD>") 40 Response.Write("</TR>") 説明 改行文字を HTML 上に出力 プログラムでは特に必要ないが HTML に出力したときにソースを見やすくするために入れている 41 objrs.movenext 42 Loop 説明 次のレコードへ この処理をいれないと無限ループに陥る
33 Do While (objrs.eof = False) 34 Response.Write("<TR>") 35 Response.Write(vbCrLF) 36 Response.Write("<TD>" & objrs("pc_name") & "</TD>") 37 Response.Write("<TD>" & objrs("maker_id") & "</TD>") 38 Response.Write("<TD>" & objrs("sal_value") & "</TD>") 39 Response.Write("<TD>" & objrs("spec") & "</TD>") 40 Response.Write("</TR>") 34 行目から 40 行目を繰り返すごとに 1 行分のデータを HTML 上に出力している 28 出力される HTML 文 41 objrs.movenext 42 Loop <TR> <TD>VALUE START</TD><TD>NED</TD><TD>184800</TD><TD>Duran1.7GHz, 512MB,80GB UltraATA100, DVD-ROM</TD></TR> <TR> <TD>VALUE START</TD><TD>NED</TD><TD>239800</TD><TD>Tentium4 2.4GHz, 512MB,120GB UltraATA100, DVD-ROM</TD></TR> <TR> <TD>Lavie</TD><TD>NED</TD><TD>174800</TD><TD>Duran1GHz, 256MB, 30GB UltraATA66, CD-R/RW</TD></TR> <TR> <TD>Lavie</TD><TD>NED</TD><TD>254800</TD><TD>Tentium M 1.7GHz, 512MB,60GB UltraATA100, CD-R/RW DVD-ROM</TD></TR> 出力される画面
HTML 上に出力するには Response.Write を使用する Response.Write( 文字列 ) で HTML 上に文字列を出力する 29 34 行目では <TR> を最後の40 行目では </TR> をHTML 上に出力する 以下同様の処理を行う 35 行目の vbcrlf は改行コードを示す 改行文字をHTML 上に出力 プログラムでは 特に必要ないがHTMLに出力したときにソースを見やすくするために入れている 34 Response.Write("<TR>") 35 Response.Write(vbCrLF) 36 Response.Write("<TD>" & objrs("pc_name") & "</TD>") 37 Response.Write("<TD>" & objrs("maker_id") & "</TD>") 38 Response.Write("<TD>" & objrs("sal_value") & "</TD>") 39 Response.Write("<TD>" & objrs("spec") & "</TD>") 40 Response.Write("</TR>")
列の値を取り出すには objrs(" 列名 ") を使用する PC_NAME の値は objrs( PC_NAME ) MAKER_ID の値は objrs( MAKER_ID ) SET_VALUE の値は objrs( SET_VALUE ) SPEC の値は objrs( SPEC ) 30 36 行目から39 行目は objrs 変数内の [PC_NAME] [MAKER_ID] [SET_VALUE] [SPEC] のデータを <TD> 各種データの実体 </TD> でHTML 上に出力する 36 Response.Write("<TD>" & objrs("pc_name") & "</TD>") 37 Response.Write("<TD>" & objrs("maker_id") & "</TD>") 38 Response.Write("<TD>" & objrs("sal_value") & "</TD>") 39 Response.Write("<TD>" & objrs("spec") & "</TD>")
31 objrs.movenext objrs.movenext objrs.movenext objrs.movenext objrs objrs objrs objrs objrs objrs.eof=false objrs.eof=true の状態 の状態 objrs は 1 行ずつ操作できる それ以上 行 ( レコード ) が存在しない場合は objrs.eof=true となる (Eof=End of file) 34 行目から 41 行目までを Eof 状態になるまで繰り返す 繰り返すごとに 1 行分のデータを HTML 上に出力している
データベースの終了処理を行う 32 49 <% 更に ここ <% から %> まで asp VBScript として処理することを示す 即ち 49 行目から 53 行目までを VBScript として処理する 50 Set objrs = Nothing 51 m_objdb.close 52 Set m_objdb = Nothing 変数 objrs の解放 データベースをクローズする 変数 m_objdb の解放 53 %> 49 行目から 53 行目までを VBScript として処理する 解放 : PC やサーバ内の資源 ( 主にメモリ領域 ) をプログラム動作前の状態に戻すことをいう