クエリー作成

この章ではクエリーを作成する手法を学びます。

クエリーは下記のデータベースファイル上に実装します。
Base
練習_TransactionForm.odb
なお、クエリー作成後のデータベースファイルは下記のファイルとなります。実装時間を省きたい方は下記ファイルを開いて第9章に進んで頂いても結構です。
Base
練習_Query.odb

品目マスター用クエリー作成

最初に品目マスターテーブル「Item」用クエリーを作成してみましょう。

Base編集画面左ペインの「データベース」欄より「クエリー」を選択し、右ペイン上部の「タスク」欄で[デザイン表示でクエリーを作成]をクリックします。

②すると下図のように「クエリーデザイン」画面が表示され、さらにダイアログボックス「テーブルまたはクエリーの追加」が表示されます。このダイアログボックスでは検索対象となるテーブルやクエリーを選択します。ここでは「テーブル」を選択し、テーブルリストから「Item」を選択し、[追加]をクリックした後、[閉じる]をクリックします。

③すると下図のように「クエリーデザイン」画面上部にテーブル「Item」の構造を表す図が表示されますので、各列の「フィールド」行にテーブル「Item」の全てのフィールドを指定します。
ここでアイコン「クエリーの実行」(下図参照)をクリックしてみましょう。

⑤すると下図のように画面最上部に実行結果が表示されます。このように、まだ保存前のクエリーでもアイコン「クエリーの実行」をクリックすることによって、その実行結果を確認することができます。

⑥つぎに、この時点でアイコン「デザインビューのオン/オフ切り替え」(下図参照)をクリックしてみましょう。

⑦すると下図のようにデザインビューが消え、SQL文(赤い破線で囲った部分)が表示されます。アイコン「デザインビューのオン/オフ切り替え」はトグルスイッチになっていますので、どちらのモードも随時切り替えることが可能です。
デザインビューで設定した内容により、BaseのシステムがSQLを自動生成します。SQL(Structured Query Language)とはデータベースの操作や管理を行う言語のことです。このコースでは詳しく解説しませんが、後ほど少しだけSQLの機能を活用します。ここではSQLの基本文法を簡単に説明しておきましょう。
今回自動生成されたSQL文は下記のとおりです。
SELECT “ID”, “Name”, “Unit_ID”, “UnitPrice”, “TaxRate” FROM “Item”
青字で書かれた部分をコマンド、「,」(カンマ)で区切られ、「”」(ダブルクォーテーション)で囲まれた部分をフィールドといいます。上記例は指定したテーブル名がひとつなので省略されていますが、”ID”は”Item”.”ID”のようにテーブル名とフィールドを「.(ピリオド)で繋いで記述するのが文法上正式な表記法です。
したがって、上記SQL文の意味は『テーブルItemを検索し、フィールドIDNameUnit_IDUnitPriceTaxRateの値を取得せよ』となります。

⑧まずは最もシンプルなクエリーが出来ましたので、ここで「クエリーデザイン」画面を閉じて下さい。

すると下図のようなダイアログボックス「確認」が表示されますので、[はい]をクリックします。

すると下図のようなダイアログボックス「名前を付けて保存」が表示されます。クエリーには既にあるテーブル名と同じ名前は付けられませんので「Item」とは付けられません。そこでクエリー名欄に「クエリー:Item」と入力し、[OK]をクリックします。

品目マスター用クエリーの実行と編集可能モードについて

それでは作成したクエリー「クエリー:Item」を実行してみましょう。

Base編集画面左ペインの「データベース」欄より「クエリー」を選択し、下図のように右ペイン下部の「クエリー」欄にリストされた「クエリー:Itemダブルクリックします。

②すると、下図のように「テーブルデータビュー」画面が表示されます。この画面では各レコードの値を変更することができますし、「+」アイコンが表示された最下行にカーソルを置いて新規データを追加することもできます。ただし、クエリーを使用してデータの更新や新規登録を行うことはあまりお勧めできません。アイコン「データの編集」(下図参照)をクリックして編集不可モードにして使用して下さい。
なお、テーブルのプライマリーキー(この例では「ID」)を取得フィールドに指定してクエリーを作成した場合に編集可能モードとなり、指定しない場合には編集不可モードになります。
編集不可モードになった事を確認したらテーブルデータビュー」画面を閉じて下さい。

単位名付き品目マスター用クエリーの作成

クエリー「クエリー:Itemを編集モードで開きます。
すると下図のように「クエリーデザイン」画面が表示されますので、アイコン「テーブルまたはクエリーの追加」をクリックします。

③するとダイアログボックス「テーブルまたはクエリーの追加」が表示されますので、「テーブル」を選択し、テーブルリストから「Unit」を選択し、[追加]をクリックした後、[閉じる]をクリックします。

④下図のように「TaxRate」列の右隣のフィールド行に「Unit.Name」を指定して、アイコン「クエリーの実行」をクリックします。

⑤すると下図のように画面最上部に実行結果が表示され、Unit_IDに対応した単位名が右端の列に表示されているのが確認されます。
通常、コードに対応した名称は並んでいるのが見やすい表ですので、列の変更を行います。右端の列「Name」をドラッグし、列「Unit_ID」と列「UnitPrice」の境目にドロップして下さい。
(注)行のドラッグ&ドロップがうまくできない場合もありますが、何度かトライしてコツを掴んで下さい。

⑦「Name」列を「Unit_ID」列の右にドラッグ&ドロップして再度アイコン「クエリーの実行」をクリックした結果が下図です。
つぎに列名を整理しましょう。「Name」列が2個所あったらこれを使用する人が何の名称か解りませんね。ID以外の各列のエイリアス行に適切な見出しを設定します。

⑨エイリアス行に適切な見出しを設定し、もう一度アイコン「クエリーの実行」をクリックした結果が下図です。

⑩下図は自動生成されたSQL文です。これで取得する各フィールドとエイリアスとの関係がAS句でよく分ると思います。また、WHERE句でテーブル「Item」と「Unit」との間でリレーションシップを図っていることも理解して頂けると思います。
(注)下図は読みやすいように適宜改行処理したSQL文ですが、クエリー上で編集し、保存した後は残念なことに改行情報が失われてしまいます。今後さらに複雑なSQL文を構成し、しかも読みやすい形のまま記録したい方にはWriterや他のテキストエディター上で読みやすい形で原文を記録し、それをクエリーの編集画面上にコピペする方法をお勧めします。
ここでクエリー「クエリー:Item」を保存し、終了して下さい。これで見やすいクエリーが完成しました。

部門名付き担当者マスター用クエリーの作成

クエリー「クエリー:Item」の作成手順を参考にしてクエリー「クエリー:Staff」を作成して下さい。
検索対象となるのはテーブル「Staff」とテーブル「Department」です。
下図が完成した「クエリー:Staff」を編集モードで開いてアイコン「クエリーの実行」をクリックした状態です。

③下図は自動生成されたSQL文です。これでクエリーは完成しましたが、今回はもうひとつ改善を試みてみましょう。上図の「性別」列の値が「m」か「f」で表示されていますが、これを「男性」と「女性」のように表示するようにします。

④「Gender」列の右の列のフィールド行に下記のコードを入力します。
CASE “Gender” WHEN ‘m’ THEN ‘
男性‘ ELSE ‘女性‘ END
これはSQLに組み込み可能な式のひとつで「CASE式」といいます。「CASE」と「END」で囲まれた中に記述する構文ですが、「CASE」句には条件となるフィールド、「WHEN」句には条件となる値、「THEN」句には条件となる値が真の場合のフィールドの値、「ELSE」句には条件となる値が偽の場合のフィールドの値を記述します。
つまり、式全体の意味は『フィールド「Gender」の値が「m」の場合は「男性」、そうでない場合は「女性」』となります。
(注1)コード入力時、単語間に半角スペースを挿入する場合は[Sift]+[Space]を使用して下さい。
(注2)フィールド行に入力した式のフィールド名を「”Gender”」のようにダブルクォーテーションで囲って入力したはずなのに、保存後に「[Gender]」のように勝手に変更され、ブラケットで囲われている事がありますが、そのままで問題ありません。この場合もSQL上はダブルクォーテーションで囲われたまま保存されています。

⑤下図が式を設定し、アイコン「クエリーの実行」を再度クリックした状態です。なお、変更前にフィールド「Gender」の値を表示していた列は「表示」行のチェックを外して非表示にしてありますが、不要な列なので保存後に自動的に削除されます。

⑥下図は自動生成されたSQL文です。CASE式は緑色で表示されています。

⑦ここでクエリー「クエリー:Staff」を保存し、終了して下さい。

トランザクション用クエリーの作成

ここまで学習を進めてこられた方はクエリー作成法にだいぶ慣れてきたことと思います。これまでの作成法の説明を参考にして、次はトランザクション用クエリー「クエリー:Slip1」を作成して下さい。
クエリー名を「クエリー:Slip1」と、末尾に数字「1を付けたのには訳があります。その訳は後で述べることにして、まずは基本となるクエリーを作成しましょう。下記の作成要件を守って作成してみて下さい。

「クエリー:Slip1作成要件>

・テーブル「Department」以外の全てのテーブルを検索対象とします。
・できるだけ受注伝票のイメージでフィールドを並べます。
IDなど、コード類の右隣には名称が表示されるようにします。
・「エイリアス」行と「並べ替え」行はまだ設定しないで下さい。
(注)実装作業をすると気づく事ですが、「フィールド」行でドロップダウンリストからフィールドを選ぼうとしてもフィールド名がリストの下方に位置し、容易に表示されない場合があります。これは使用するテーブル数が多い場合、画面で処理しきれなくなったためです。このような場合は先に「テーブル」行でテーブルを指定した後で「フィールド」行でドロップダウンリストを開くと、指定したテーブルに関するフィールドがリストに表示されますので、容易に選択できます。また場合によっては「フィールド」行にフィールド名を直接入力する事も可能です。

①下図が各列の「フィールド」行にフィールドを設定し、アイコン「クエリーの実行」をクリックした状態です。なお、クエリーデザイン画面中央のテーブル設計デザイン領域は見やすいように配置し直しています。
ここで「クエリー:Slip1」と命名して保存し、クエリーを終了して下さい。

③下図はクエリー「クエリー:Slip1」を実行した状態です。受注伝票IDごとに薄緑色の線で囲んでみました。「ID」列から「Slip.Note」列までが伝票のヘッダー部、「Item_ID」列から「SlipDetail.Note」列までが伝票の明細部です。同じ伝票内のヘッダー部は明細数分、同じデータが表示されています。

④クエリー「クエリー:Slip1」を編集モードで開いて下さい。次に金額と消費税をの計算をしましょう。
一番右の空いている列の「フィールド」行に下記の式を入力します。
“UnitPrice” * “Quantity”
これは「単価×数量」の意味ですが、「*」などの演算記号はCalcの演算記号と同じです。この列の「エイリアス」行には「Amount」と入力します。
さらに右の列の「フィールド」行に下記の式を入力します。
“UnitPrice” * “Quantity” * “TaxRate”
これは「単価×数量×消費税率」の意味です。左隣の列で金額を計算しているので、できれば、式を「“Amount” * “TaxRate”」としたい所ですが、この時点でエイリアス「Amount」はフィールドとして認識してくれませんので、上記のような式にしました。この列の「エイリアス」行には「Tax」と入力します。
下図が2つの列に式とエイリアスを設定し、アイコン「クエリーの実行」をクリックした状態です。

厳密に言うと消費税計算では小数点以下を切り捨てますので、式を変更します。関数「CEILING()」で式を囲ってやると計算結果の端数を切り捨ててくれます。下記が変更後の式です。
CEILING(“UnitPrice” * “Quantity” * “TaxRate”)
追加した2列をSlipDetail.Note」列の左に移動し、再度アイコン「クエリーの実行」をクリックした状態が下図です。

この時点で「エイリアス」行に適切な名称を設定しておきましょう。特に「Name」や「Note」のように、同じフィールド名になっている列はユニークな名称にしておいて下さい。「エイリアス」行を設定してアイコン「クエリーの実行」をクリックした状態が下図です。

ここで再びクエリー「クエリー:Slip1」を保存して終了して下さい。
実は作成したクエリー「クエリー:Slip1」には税込金額の列がありません。もうひとつ列を作成して、下記の式を設定すれば確かに解決するのですが、これではあまりにも式が冗長すぎます。
“UnitPrice” * “Quantity” + CEILING(“UnitPrice” * “Quantity” * “TaxRate”)
そこで次に新たなクエリーを作成し、既に作成したクエリーをあたかもテーブルのように検索対象にする手法を紹介します。こうすると、既成のクエリーで命名したエイリアスもフィールド名として利用することが可能になります。
Base
編集画面左ペインの「データベース」欄より「クエリー」を選択し、右ペイン上部の「タスク」欄で[デザイン表示でクエリーを作成]をクリックします。
すると下図のように「クエリーデザイン」画面が表示され、さらにダイアログボックス「テーブルまたはクエリーの追加」が表示されますので、「クエリー」を選択し、クエリーリストから「クエリー:Slip1」を選択し、[追加]をクリックした後、[閉じる]をクリックします。

⑯「クエリーデザイン」画面上部にクエリー「クエリー:Slip1の構造を表す図が表示されますので、ここで試みに一番左端の列の「フィールド」行に「クエリー:Slip1.*」を入力してアイコン「クエリーの実行」をクリックしてみましょう。
すると下図のように画面上部に全てのフィールドの結果が表示されます。クエリーではテーブル名やクエリー名の次に「*」を指定すると全てのフィールドの値が検索されて表示されます。

⑱ここでフィールドの*」指定を説明したのは手法のひとつを紹介したかったからです。今回は「クエリー:Slip1」の全てのフィールドを再度あらためて各列で指定することにします。
下図が全てのフィールドを各列で指定し、アイコン「クエリーの実行」をクリックした状態です。これで「クエリー:Slip1」と同じ結果が得られるようになりました。

⑳ここで「クエリー:Slip2」と命名して保存し、クエリーを終了して下さい。クエリー名の末尾に数字を付けたのはテーブルを検索対象にしたクエリーと、クエリーを検索対象にしたクエリーを区別するためで、名前の付け方にルールはありません。
㉑あらためてクエリー「クエリー:Slip2」を編集モードで開いて下さい。
㉒空白列の「フィールド」行に下記の式を入力し、「エイリアス」行に「税込金額」と入力して下さい。
“Amount” + “Tax”

㉓再びアイコン「クエリーの実行」をクリックした状態が下図です。「クエリー:Slip1」ではエイリアスだったAmount」は「クエリー:Slip2」ではフィールド名になったため、式内で使用することができるようになりました。Tax」も同様です。

㉔下図は「税込金額」列を「明細備考」列の左に移動し、他の列も適切なエイリアスを設定した状態です。フィールド名「〇〇〇_ID」のエイリアスは表示列を短くするため「ID」としました。ただし、このあと並べ替えを指定するItem_ID」を除いています。
残念なことにクエリーを検索対象にしたクエリーは日付の書式がデフォルトに戻ってしまうので、下図のように実行結果の画面で列「販売日」を右クリックし、コンテキストメニューから「列の書式」を選択します。
㉕すると、ウインドウ「フィールドの書式設定」が表示されますので、第4章のテーブル「Slip」作成の項で説明した要領で書式を変更して下さい。

㉖下図が列「販売日」の書式を変更した後の状態です。なお、現在のところ設定した書式は保存されず、実行の度に元に戻ってしまうようです。
㉗次に下図のように「受注伝票」列および「Item_ID」列の「並べ替え」行で「昇順」を指定します。この状態でアイコン「クエリーの実行」をクリックすると「受注伝票」列が昇順に、同一受注番号内では「Item_ID」列が昇順に並べ変えられます。

㉘自動生成されたSQL文を見てみる下図のとおりORDER BY句で並べ替えを指定しています。ちなみに昇順は「ASC」(ASCENDINGの略)、降順は「DSC」(DESCENDINGの略)のパラメーターで指定します。

㉙最後に各金額を集計するクエリーを作成してみましょう。新たに[デザイン表示でクエリーを作成]から始め、クエリー「クエリー:Slip1」を検索対象にします。
㉚受注伝票ID毎に金額、消費税、税込金額を集計するよう関数設定し、アイコン「クエリーの実行」をクリックした状態が下図です。

㉛集計クエリーを作成する際、下記の点を守って下さい。
・選択するフィールドはグループ化した時に同じ行で表示されるものに限ること。
・グループ化しないフィールドは指定しないこと。
・並べ替えはしないこと。
㉜下図は自動生成されたSQL文です。集計はSUM関数で行い、グループ化はGROUP BY句で行っていることが分ります。

㉝うまく集計されたので、「クエリー:Slip3」と命名して保存し、クエリーを終了して下さい。

Back> 7.トランザクション入力用フォーム作成
Next> 9.レポート作成

 

タイトルとURLをコピーしました