演習9
入力した条件に従いデータベース
からデータを抽出する
演習9 製品情報を取得するサンプル
パソコン製品情報が格納された表から、
任意のメーカーIDを取得するプログラムの構造を検討する。
sample1.htm、sample1.asp、SDEV_MST_PRODUCT
データベース
PC_KATABAN KOBAN MAKER_ID HD-0001 1 NED HD-0002 2 NED
パソコン製品情報
サーバー
クライアント
SDEV_MST_PRODUCT演習9 パソコン製品情報の表
パソコン製品情報の表の名前は、「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 プログラム構造に関して
sample1.htm
sample1.asp
SDEV_MST_PRODUCT
設問 内容問1
「
sample1.htm
」と「
sample1.asp
」は、どの様な処理(画面)を行っている
か?
・それぞれの処理概要と構造的な関係をUML図で示せ
(UMLはシーケンス図 または コミュニケーション図で表現)
問2
「
sample1.asp
」は、表「SDEV_MST_PRODUCT」にどの様にアクセスしている
か?
・DBアクセスの処理概要とSQL文を抜き出す
演習9 設問1 -解答例-
設問
内容
問1
「
sample1.htm
」と
「
sample1.asp
」は、
どの様な処理(画面)を行っている
か?
・それぞれの処理概要と構造的な
関係を示せ
演習9 設問1
sample1.htm
①タイトル、メッセージ等の表示。 ②検索条件としてメーカ名を入力させるテキストボックスと「検索実行」ボタンを表示。 ③「検索実行」のsubmitボタンを実行すると、テキストボックスに入力されたデータ値(メ ーカ名)が、txtValueに格納されてsample1.aspに送られる。sample1.asp
② ① ③sample1.htm
演習9 設問1
sample1.asp
④起動と同時にtxtValueに格納された値を取得。 ⑤データベースSDEV_MST_PRODUCT表への接続/Open。 ⑥取得した値を検索キーとしてSQL文の生成と実行。 ⑦検索結果をHTMLに編集して出力。 ④ SDEV_MST_PRODUCT Close SQL(Select) Open ⑤ ⑥ ⑦演習9 設問2
設問
内容
問2
「
sample1.asp
」は、
表「
SDEV_MST_PRODUCT
」に
どの様にアクセスしているか?
・DBアクセスの処理概要とSQL
文を抜き出す
SQL文
演習9 設問2
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" )strSQLWork="SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC
FROM SDEV_MST_PRODUCT
演習9 データベースとSQLの構成
SQL文
[MAKER_ID] [PC_NAME] [SAL_VALUE] [SPEC] という項目を
[KOBAN]の昇順で並べた結果を返す 入力された[MAKER_ID]を検索キーとして抽出し、 [SDEV_MST_PRODUCT]表から SELECT - FROM - WHERE - ORDER BY - SDEV_MST_PRODUCT txtValue 入力されたMAKER_ID
解説
演習9 画面の構成
「NED」の値を渡す。
sample1.htm
sample1.asp
演習9 sample1.htmソース
9行目から13行目の処理
submitボタンを実行した時に、フィールドに
入力された値が、txtValueに格納されて
sample1.aspに送られる動作を行う。
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>
: ~省略~
解説
演習9 sample1.aspソース
aspファイル内では、HTMLとして処理する部分と、VBScriptとして
処理する部分が混在する。
aspファイル内では、上から順にプログラム処理される。
演習9 sample1.aspソース
解説
1 <%@ LANGUAGE="VBSCRIPT" %> aspで使用する言語を宣言する。→VBScriptを適用する
変数の宣言は、必ず実行しなければならない という宣言文
1行目、2行目は決まりの文言である
3 <%aspとして処理するのは<%から%>の間となり、aspプログラムの中
に複数存在しても良い
ここ<%から%>までasp・VBScriptとして処理することを示す。即 ち、13行目までをVBScriptとして処理する。 2 <%Option Explicit%>演習9 sample1.aspソース
解説
4 Dim m_objDB ' データベースオブジェクト
5 Dim objRS ' 製品マスター用レコードセットオブジェクト
6 Dim strSQLWork ' SQL文を格納する変数
7 Dim formValue ' sample1.htmで入力されたフォームの変数を格納する
aspファイル/VBScriptで使用する変数の宣言
8 formValue = Request.Form ( "txtValue" )
パラメータの取得
sample1.htmで入力した文字列を取得し、変数formValueに格納する
(メーカID)HTMLのFormで入力した値を取得する方法は、
Request.Form(
“名前”)
で行う
sample1.htmのForm内で定義した入力ボックス名 <input type="text" value="" name="txtValue">演習9 sample1.aspソース
解説
9行目、10行目はデータベースを使用するために必要な処理。
以後、変数「m_objDB」を使って、SQL実行を行う。
9 Set m_objDB = Server.CreateObject("ADODB.Connection")
データベースをオープン(接続)する
データベースに接続するための処理。
10 m_objDB.Open “DSN=sdevDB-dsn;" ' ※変更しないで下さい
演習9 sample1.aspソース
SQL文を作成して、変数strSQLWorkに代入する
11
strSQLWork = "SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT
WHERE MAKER_ID ='" & formValue & "' ORDER BY KOBAN"
解説
SQL文
[MAKER_ID] [PC_NAME] [SAL_VALUE] [SPEC]という項目を
[KOBAN]の昇順で並べた結果を返す 入力された[MAKER_ID]を検索キーとして抽出し、 [SDEV_MST_PRODUCT]表から SELECT - FROM - WHERE - ORDER BY -
sample1.htmで入力したメーカーID値と一致するMAKER_IDを持つ
データを抽出する。
条件をWHERE文で定義する。
結果を[KOBAN]の昇順で整列させる(ORDER BY句を使用)
演習9 sample1.aspソース
まず、検索文を組み立てる。→条件文、整列文を除いたSQL文の作成
解説
SQL文を組み立てる。
SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT
次に、変数以外の部分を組み入れる。→整列文を加えたSQL文の作成
SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT
ORDER BY KOBAN
SQL文
演習9 sample1.aspソース
解説
SQLを変数strSQLWorkに代入する。
SQLは言語だが、asp/VBScriptでは一連の文字列として処理され
る。そのため、
SQL文全体をダブルクゥオーテーション(”)で囲む
必
要がある。
strSQLWork = "SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT
ORDER BY KOBAN"
演習9 sample1.aspソース
strSQLWork =
"文字列"
&
変数
&
"文字列"
解説
sample1.htmで入力した値は、8行目の処理で変数formValueに
格納されている。
変数formValueを条件データとしてSQLを作成する
8 formValue = Request.Form ( "txtValue" )
※SQL文は文字列、formValueは変数(文字列) なので、strSQLWork変数への代入式
は以下の連結代入の形式となる。
strSQLWork = "SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT
WHERE MAKER_ID="
& formValue &
演習9 sample1.aspソース
例えば、formValueに「NED」が格納されている場合、SQL文は
以下のようになる。
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"
解説
strSQLWork = "SELECT MAKER_ID, PC_NAME, SAL_VALUE, SPEC FROM SDEV_MST_PRODUCT
WHERE MAKER_ID="
& formValue &
"ORDER BY KOBAN"
SQLでは文字型のデータを設定する には、値を 「’」 (シングル・クォーテー ション)で囲む必要があるので
演習9 sample1.aspソース
m_objDB.Execute(
SQL文
) でstrSQLWorkに格納されたSQL文を実行する。
実行した結果は、変数「objRS」に代入(set)する。
以後、変数「objRS」を使って、データベースの検索結果の値を操作する。
objRSの中に、SQL文の検索結果データがレコード数分格納されている。
解説
12 Set objRS = m_objDB.Execute(strSQLWork)
SQL文を実行し、実行した結果を変数「objRS」に代入する。 13 %>
aspとして処理するのは<%から%>の間
この領域は、aspプログラムの中に複数存在しても良い
ここ%>までをasp・VBScriptとして処理することを示す。 即ち、3行目から13行目までをVBScriptとして処理する。演習9 sample1.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>
記述されたHTMLタグをそのまま処理する。
この部分は、HTMLのヘッダ部と一覧TABLEの1行目(列タイトル)を出
力している。
演習9 sample1.aspソース
解説
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 <TD bgcolor="#333333" align="center"><font size="2"
COLOR="#ffffff"><b>製品名</b></font></td>
28 <TD bgcolor="#333333" align="center"><font size="2"
COLOR="#ffffff"><b>メーカー</b></font></td>
29 <TD bgcolor="#333333" align="center"><font size="2"
COLOR="#ffffff"><b>販売価格</b></font></td>
30 <TD bgcolor="#333333" align="center"><font size="2"
COLOR="#ffffff"><b>スペック</b></font></td>
演習9 sample1.aspソース
解説
32 <% 更に、ここ<%から%>までasp・VBScriptとして処理することを示す。
即ち、32行目から43行目までをVBScriptとして処理する。
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>") 41 objRS.MoveNext 42 Loop 【説明】改行文字をHTML上に出力。プログラ ムでは特に必要ないがHTMLに出力したとき にソースを見やすくするために入れている 【説明】次のレコードへ ※この処理をいれないと無限ループに陥る
◆Do While ~ Loop 文で(検索結果データを表形式で表示するタグを生成する処理) ◆「objRs.Eof」 がFalse(偽) の間Loopまでの間の処理を繰り返すことを意味する。
演習9 sample1.aspソース
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>")
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文 34行目から40行目を 繰り返すごとに1行分 のデータをHTML上に 出力している。
演習9 sample1.aspソース
解説
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>") Response.Write(“ 文字列 ”)でHTML上に文字列を出力する。 34行目では、 <TR> を 最後の40行目では </TR> をHTML上に出力する 。 以下同様の処理を行う。 35行目の vbCrLf は改行コードを示す。改行文字をHTML上に出力。プログラムでは 特に必要ないがHTMLに出力したときにソースを見やすくするために入れている
◆HTML上に出力するには、
Response.Write
を使用する。
演習9 sample1.aspソース
◆列の値を取り出すには、
objRS("列名")
を使用する。
「PC_NAME」の値は、 objRS(“PC_NAME”)
「MAKER_ID」の値は、 objRS(“MAKER_ID”)
「SET_VALUE」の値は、 objRS(“SET_VALUE”)
「SPEC」の値は、 objRS(“SPEC”)
解説
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>")
objRS.MoveNext objRS objRS.MoveNext objRS
演習9 sample1.aspソース
objRSは1行ずつ操作できる。
それ以上、行(レコード)が存在しない場合は、
「objRS.Eof=True」となる。(Eof=End of file)
objRS objRS.MoveNext objRS objRS.Eof=True の状態 objRS objRS.MoveNext解説
objRS.Eof=False の状態 34行目から41行目までをEof状態になるまで繰り返す。 繰り返すごとに1行分のデータをHTML上に出力している。演習9 sample1.aspソース
解説
◆データベースの終了処理を行う。
49 <%
53 %>
50 Set objRS = Nothing
51 m_objDB.Close
52 Set m_objDB = Nothing
変数objRSの解放 データベースをクローズする。 変数m_objDBの解放 更に、ここ<%から%>までasp・VBScriptとして処理することを示す。 即ち、49行目から53行目までをVBScriptとして処理する。 解放: PCやサーバ内の資源(主にメモリ領域)をプログラム動作前の状態に戻すこ とをいう。 49行目から53行目までをVBScriptとして処理する。