カクテル一覧 製品紹介
ベース別一覧
ドライ・ジン
タンカレー・ジン
オールド・トム・ジン
ゴードン・ジン
ウォッカ
フィンランディア・ウォッカ
ラム
ホワイト・ラム
ダーク・ラム
ゴールド・ラム
バカルディ・ラム・ホワイト
151プルーフ・ラム
テキーラ
ウイスキー
アイリッシュ・ウイスキー
ライ・ウイスキー
スコッチ・ウイスキー
バーボン・ウイスキー
カナディアン・ウイスキー
ブランデー
アップル・ブランデー
ブランデー(コニャック)
カルバドス
ピンガ
チェリー・ブランデー
アプリコット・ブランデー
クレーム・ド・バナーヌ
ピーチ・リキュール
キルシュ・リキュール
マンダリン
キウイ・リキュール
サザン・カンフォート
杏露酒
ストロベリー・リキュール
スロー・ジン
ディタ
メロン・リキュール
ブルー・キュラソー
パッションフルーツ・リキュール
ホワイト・キュラソー
マンゴスティン・リキュール
レモン・リキュール
ルジェ・クレーム・カルテット
アメール・ピコン
カンパリ
ベネディクティン
ペルノ
グリーン・ミント・リキュール
ガリアーノ
シャルトリューズ(イエロー)
スーズ
リカール
アマレット
クレーム・ド・カカオ
カカオ・リキュール
カルーア・コーヒー・リキュール
フランジェリコ
ノチェロ
コーヒー・リキュール
チョコレート・リキュール
モーツァルト・チョコレートクリーム・リキュール
ミルク・リキュール
アドヴォカート
クリーム・リキュール
クリーム・リキュール(ビスコタ)
ベイリーズ・オリジナル・アイリッシュ・クリーム
ヨーグルト・リキュール
ストロベリー・クリーム・リキュール
ドライ・ベルモット
ドライ・シェリー
赤ワイン
白ワイン
シャンパン
辛口白ワイン
スパークリング・ワイン
ビール
スタウト・ビール
日本酒
焼酎(ホワイトリカー)
芋焼酎
紅乙女(ゴマ焼酎)
麦焼酎
米焼酎
ベースなし
レポート
変更点
第3課題からの大きな設計上の変更点はない。
ただし関係addについては、同名の関数が存在しているためエラーとなったので、
add_secondary と名前を変更した。
また、画像を使用しているがエンティティに属性は追加しておらず、
エンティティのIDに.pngを付けたものをファイル名として保存して、
質問文中では ID | '.png' の形で呼び出しを行うことで画像を表示した。
Q1
GENERATE HTML {
 [{''}@{height = 10, bgcolor = '#CEE3F6'}! link(c.name@{width=200}, 'Q3.ssql', c.id), 
	{
                {'ID'@{width=80, bgcolor = '#08298A', color = 'white'},
                      (asc)c.id@{width=200, bgcolor = '#08298A', color = 'white'}}!
	 	{'ベース'@{width=80, bgcolor = '#F5DA81'}, link(l.name@{width=200}, 'Q6.ssql', l.id)}!
	 	{'度数'@{width=80, bgcolor = '#BCF5A9'}, {&ROUND(c.percentage)}@{width=200}}!
	 	{'味'@{width=80, bgcolor = '#F5A9A9'}, c.taste@{width=200}}
	}@{width=280}
 ]!
}@{talign = 'center', bgcolor = 'white', pbgcolor = '#CEE3F6'} 
FROM cocktail c, liquor l
WHERE c.base = l.id

カクテルの一覧を表示する質問文である。
カクテルの名前とともに、ID、ベース、度数、そして味を表示させる。
また、カクテルの名前からは詳細情報のページへ、
ベースの名前からは同じベースのカクテルの一覧へそれぞれリンクが貼ってある。
Q2
GENERATE HTML {
 [{''}@{height = 10, bgcolor = '#CEE3F6'}! link(c.name@{width=200}, 'Q3.ssql', c.id), 
	{
                {'ID'@{width=80, bgcolor = '#08298A', color = 'white'},
                      (asc)c.id@{width=200, bgcolor = '#08298A', color = 'white'}}!
	 	{'ベース'@{width=80, bgcolor = '#F5DA81'}, link(l.name@{width=200}, 'Q6.ssql', l.id)}!
	 	{'度数'@{width=80, bgcolor = '#BCF5A9'}, {&ROUND(c.percentage)}@{width=200}}!
	 	{'味'@{width=80, bgcolor = '#F5A9A9'}, c.taste@{width=200}}
	}@{width=280}
 ]!
}@{talign = 'center', bgcolor = 'white', pbgcolor = '#CEE3F6'} 
FROM cocktail c, liquor l
WHERE c.base = l.id

具体的な酒類の製品を表示する質問文である。
銘柄とともに、その一般名称と度数、販売元、原産国を表示し、
酒の一般名称からはそれを使ったカクテルの一覧のページへ移動することができる。
また販売元からはその住所と電話番号が記されたページへ移ることができる。
Q3
FOREACH c.id
GENERATE HTML {
	{{{c.name}@{bgcolor = 'black', color ='gold'}! image(c.id || '.png', './mypicts')@{width = 200}},
		{{'基本情報'}@{width = 350, bgcolor = '#08298A', color = 'white'}!
{{'ベース'}@{width = 60, bgcolor = '#F5DA81'}, link(lb.name@{width = 135, bgcolor = 'white'}, 'Q6.ssql', lb.id),
{'度数'}@{width = 40, bgcolor = '#BCF5A9'}, {&ROUND(c.percentage)}@{width = 30, bgcolor = 'white'},
{'味'}@{width = 30, bgcolor = '#F5A9A9'}, c.taste@{width = 50, bgcolor = 'white'}}@{width = 350}!
		 {'材料'}@{width = 350, bgcolor = '#08298A', color = 'white'}!
{[{link(l.name@{width = 300, bgcolor = '#FBEFFB'}, 'Q5.ssql', l.id),
m.amount@{width = 50, bgcolor = 'white'}}@{width = 350} ]!}!
{[{s.name@{height = 25, width = 300, bgcolor = '#EFFBFB'},
a.amount@{height = 25,width = 50, bgcolor = 'white'}}@{width = 350} ]!}}@{bgcolor = '#8A0829'}
	 }@{talign = 'center', pbgcolor = '#8A0829'}
} FROM cocktail c left outer join add_secondary a
	 on a.cocktail = c.id
	 left outer join secondary s
	 on a.secondary = s.id, 
	mix m, liquor l, liquor lb
WHERE m.cocktail = c.id AND m.liquor = l.id AND c.base = lb.id;

あるカクテルのレシピのページである。
一覧で記された基本情報に加え、全ての材料とその分量、そして画像を表示する。
また材料は、酒類が薄い赤色、副材料が薄い青色、と背景の色を色分けしてある。
また副材料がないカクテルにも対応するため、left outer join を用いており、
副材料がない場合は薄い青の空欄が表示される。
また、ベースのカクテルの名前からは同じベースのカクテル一覧のページへ、
材料のうち酒類(ベースを含む)の名前からはそれを含むカクテル一覧のページへ移動できる。
Q4
FOREACH ca.id
GENERATE HTML {
	{ca.name@{width = 200}, 
		{{{'住所'}@{width = 50},[ca.address@{width = 300}]!}@{width = 350}!
		{{'TEL'}@{width = 50},[ct.telephone@{height = 25, width = 300}]!}@{width = 350}}
	 }@{talign = 'center'}
} FROM company_add ca left outer join company_tel ct
on ca.id = ct.id;

会社の情報を示す質問文である。
レシピにおける副材料と同様、調べた限りで電話番号が見つからなかった会社が存在したので、
これも left outer join を用いて結合した。
						   
Q5
FOREACH l.id
GENERATE HTML {
{l.name || 'を含むカクテル一覧'}@{bgcolor = '#08298A', color = 'white'}!
 [{''}@{height = 10, bgcolor = '#CEE3F6'}! link(c.name@{width=200, bgcolor = 'white'}, 'Q3.ssql', c.id), 
	{
                {'ID'@{width=80, bgcolor = '#08298A', color = 'white'},
                      (asc)c.id@{width=200, bgcolor = '#08298A', color = 'white'}}!
                {'ベース'@{width=80, bgcolor = '#F5DA81'},
                        link(lb.name@{width=200, bgcolor = 'white'}, 'Q6.ssql', lb.id)}!
	 	{'度数'@{width=80, bgcolor = '#BCF5A9'}, {&ROUND(c.percentage)}@{width=200, bgcolor = 'white'}}!
	 	{'味'@{width=80, bgcolor = '#F5A9A9'}, c.taste@{width=200, bgcolor = 'white'}}
	}@{width=280}
 ]!
}@{talign = 'center', bgcolor = 'white', pbgcolor = '#CEE3F6'} 
FROM cocktail c, liquor lb, liquor l, mix m
WHERE c.base = lb.id AND m.cocktail = c.id AND m.liquor = l.id;
ある酒類を材料にもつカクテルの一覧を表示する。
先頭に表題があること以外はQ1とまったく同じ表示形式となっている。
						   
Q6
FOREACH lb.id
GENERATE HTML {
{lb.name || 'がベースのカクテル一覧'}@{bgcolor = '#08298A', color = 'white'}!
 [{''}@{height = 10, bgcolor = '#CEE3F6'}! link(c.name@{width=200}, 'Q3.ssql', c.id), 
	{
                {'ID'@{width=80, bgcolor = '#08298A', color = 'white'},
                   (asc)c.id@{width=200, bgcolor = '#08298A', color = 'white'}}!
	 	{'ベース'@{width=80, bgcolor = '#F5DA81'}, link(lb.name@{width=200}, 'Q6.ssql', lb.id)}!
	 	{'度数'@{width=80, bgcolor = '#BCF5A9'}, {&ROUND(c.percentage)}@{width=200}}!
	 	{'味'@{width=80, bgcolor = '#F5A9A9'}, c.taste@{width=200}}
	}@{width=280}
 ]!
}@{talign = 'center', bgcolor = 'white', pbgcolor = '#CEE3F6'} 
FROM cocktail c, liquor lb, mix m
WHERE c.base = lb.id AND m.cocktail = c.id;

ある酒類をベースにもつカクテルの一覧を表示する。
単に材料ではなくそれをベースとしているものを表示する点以外はQ5と同じである。
意見 ・ 感想
ssqlについて不明な点が多くて苦労する点が多かった。
まずアルコール度数の表示についてそのままだと微小な誤差があって表示桁数が多くなり過ぎたので、
四捨五入をするためround関数を用いようとしたところ、
表示する桁数が指定できずにすべて整数値とするしかなかった。
そこで10倍して四捨五入した後に10で割ることも考えたが、
関数値で四則演算を行おうとするとエラーが出てしまい、結局小数点以下を無視せざるを得なかった。
表の結合に関してもわからないことがあり、特にくり返しで生成した表で折り返しを行っている場合、
折り返した表にそのまま別の表を結合しようとしても、
付け加えた表も折り返しに従うような結合のしかたをしてしまい、うまくいかなかった。
ただ、foreach文 によって多数のページをひとつの質問文で生成でき、
それそれにリンクを繋げられるところは非常に便利であり、作業中も楽しく感じられた。