Cサブフォームの設定を変更する
前項では、クエリを作成し、商品IDを入力して商品名を表示してみました。このクエリによる問い合わせ機能を、請求書フォームに組み込んだサブフォームの請求明細の一覧でも使えるようにすれば、請求書フォームの明細を入力する部分が完成します。
1◆レコードソースを変更する
現在、サブフォームのレコードソースは、最初に設定した請求明細(マスター)テーブルになっています(193ページ「●テーブルとフィールドの選択」参照)。レコードソースを作成した「請求明細クエリ」に変更して、問い合わせ機能を使えるようにしましょう。フォームの設定を変更するので、サブフォームをデザインビューで開いて操作します。
>操作
図3.68 フォームの一覧を表示させたデータベースウィンドウ
@請求明細のサブフォームを選択して反転表示にする
A[デザイン]をクリックする
図3.69 請求明細のサブフォームがデザインビューで開く
Bフォームの左上角のボタンを右クリックしてショートカットメニューを表示する
C[プロパティ]を選択する
図3.70 プロパティウィンドウが表示される
D[データ]タブをクリックしてこの一覧を表示する
図3.71E[レコードソース]欄の[▼]ボタンをクリックしてテーブル一覧を表示する
F[請求明細クエリ]を選択する
図3.72アレコードソースが変更される
AC7H379Z AC7H380Z
AC7H382Z
AC7H383Z AC7H384Z
●操作上の注意
サブフォームをデザインビューで開いたときにプロパティウィンドウが表示された場合は、図3.69Bの操作はプロパティウィンドウを消す操作になります。
●状態の確認
データシートビューに切り替えて、レコードソースを[請求明細クエリ]に変更した結果を確認しましょう。
>操作
図3.73@[ビュー]ボタンをクリックする
図3.74 データシートビューに切り替わる
図3.75A ウィンドウサイズを大きくしたり、スクロールバーを操作してフィールド全体を見る
フィールド[品名]が[#Name?]になっています。これは、フィールド名[品名]が見あたらないということをあらわすエラー表示です。レコードソースに指定した[請求明細クエリ]にはフィールド[品名]は確かに存在するのに、エラーが表示されています。
これは、クエリを作成したときに、請求明細(マスター)テーブルのフィールド[品名]と商品テーブルのフィールド[品名]の両方をクエリのフィールドに使ったので、どちらの[品名]なのか区別がつかないということです。同じフィールド名が存在する場合は、フィールド名にテーブル名を付加して指定します。
AC7H385Z AC7H386Z
AC7H387Z
●コントロールソースを変更する
品名の欄に指定されているフィールド名(コントロールソースで指定されているフィールド名)を変更します。品名の欄に表示する内容は問い合わせの結果なので、商品テーブルのフィールド[品名]を指定します。
請求明細のサブフォームのデザインビューに戻り、テキストボックス[品名]を右クリックしてショートカットメニューの[プロパティ]を選択します。
>操作
@ [ビュー]ボタンをクリックしてデザインビューに切り替える
A [品名]欄を右クリックして[プロパティ]を選択する
図3.76 ア [品名]欄のプロパティ一覧が表示される
図3.77 B [コントロールソース]欄の[▼]ボタンをクリックしてフィールド一覧を表示する
C 目的のフィールド名(ここでは「商品テーブル.品名」)を選択する
図3.78 イ コントロールソースが変更される
@
AC7H388Z
AC7H389Z/AC7H390Z
AC7H391Z/AC7H392Z
●結果の確認
これで、商品テーブルから抽出された品名が表示されるようになります。データシートビューに切り替えて確認しましょう。
>操作
図3.79 @[ビュー]ボタンをクリックしてデータシートビューに切り替える
ア品名が表示される(品番と品名は対応していない)
図3.80 A品番を変更して(ここでは1行目のEX-3をWD-1に変更)、
入力を決定する[↓]キーなどを押す)
イ品名は変更されない
AC7H394Z
AC7H393Z
AC7H395Z
図3.79のように、品名は表示されても、品番と品名が対応していません。また、図3.80のように品番を変更しても、正しい品名が表示されません。品番「KB1」は品名「ミディキーボード」のはずですが、表示は更新されていません。
すでに気付いた読者もいると思いますが、品名は商品IDでリレーションシップを設定したので、フィールド[商品ID]に入力されているデータを書き換えないと品名は更新されないことになります。つまり、ここの品番は機能していないということです。これは、241ページ「●商品IDを入力する」で「あえて異なる値を入力」しておいてから発生している現象です。次の操作でこれを解決します。
3◆「品番」を「商品ID」に変更する
品番の欄に設定されているコントロールソースをフィールド[商品ID]に変更して、品名が自動表示されるようにします。フォーム上に表示しているフィールド名「品番」はそのままにしておくことにします。
デザインビューに切り替えて以下の操作を行います。プロパティウィンドウが表示されていないときは、プロパティウィンドウを表示してから操作します。
>操作
@ [ビュー]ボタンをクリックしてデザインビューに切り替える
図3.81 テキストボックス[品番]を右クリックしてショートカットメニューの[プロパティ]を選択する
ア[品番]欄のプロパティ一覧が表示される
A[データ]タブをクリックしてこの一覧に切り替える
図3.82B[コントロールソース]欄の[▼]ボタンをクリックしてフィールド一覧を表示する
C[商品ID]を選択する
図3.83イコントロールソースが変更される
D[×]をクリックして閉じる
AC7H396Z
AC7H397Z
AC7H398Z
AC7H399Z
●結果の確認
データシートビューに切り替えて、[品番]欄に[商品ID]フィールドに入力してある番号が表示されることを確認します。また番号を変更すると、番号に対応する品名が表示されることも確認します。
>操作
図3.84 @[ビュー]ボタンをクリックしてデータシートビューに切り替える
ア[商品ID]フィールドに入力してある番号が表示される
図3.85 A番号を変更して(ここでは、1行目の品番「1」を「4」に変更)、
入力を決定する([↓]キーなどを押す)
イ番号に対応する品名が表示される
表示されるレコードの順番はソートした結果で表示されることがあります。
AC7H396Z
AC7H400Z
AC7H401Z
これで、品番([商品ID]フィールドに替えたので「商品ID」の番号)を入力すると、対応する品名が自動的に表示されるようになりました。しかし、当初の目的は「品番を入力すると品名が自動表示される」という機能でしたが、完成したのは「商品IDを入力すると品名が自動表示される」という機能に変わってしまいました。この解決方法は、254ページの「2 コンボボックスの表示内容を変更する」で解説します。
●リレーションシップの変更による解決方法もあるが……
「品番を商品IDに変更しなくても、品番にリレーションシップを設定すればよいのではないか」と考える読者もいるでしょうが、リレーションシップは主キーと外部キーに設定することになっています。したがって、商品IDを使うことが必須です。
「それなら、商品テーブルを作るときに、品番を主キーにすればよかったのに」という考え方に対しては、まったくそのとおりです。ただし、商品番号から同じ品番を使わないかぎり品番を主キーにできますが、顧客名簿などのように個人名を扱うテーブルでは同姓同名の人が存在する可能性があり、個人名を主キーにすることは避けなければなりません。このようなときは、商品IDのような連番で(顧客名簿なら顧客IDとする)リレーションシップを作成する必要があります。品番や顧客番号を重複しないように付けて主キーとすることも考えられますが、入力の手間を考えると、自動的に重複しない番号が振られるオートナンバー型は捨てがたいところがあります。
コラム=並べ替え=追加原稿
データシートビューでは、フィールド名を右クリックして開くショートカットメニューの[昇順で並べ替え]あるいは[降順で並べ替え]を使って、レコードの表示を並べ替えることができる。
r>操作
@ 並べ替えるフィールド名にマウスポインタを合わせる(下向きの矢印に変わる位置)
A 右クリックしてショートカットメニューを開き、[昇順で並べ替え]を選択する
イ 行番の小さい順で並べ替えが施される
AC7H402Z
AC7H403Z
AC7H404Z
===============ここまで
キーワード
■#Name?エラー 「使用しているフィールド名が存在しない」という意味のエラー。コントロールソースなどに設定したフィールド名が存在しないとき、あるいはリレーションシップのように両方のテーブルに同名のフィールドが存在する場合など、フィールド名を特定できないときにも発生する。また、開いていないオブジェクト(テーブルやフォームなど)のフィールド名に対しても発生する
Dデータ入力を選択方式にする
商品IDを入力すると品名が自動的に表示されるようになりましたが、品名との対応がわからないと入力しにくいので、これを解決するためにコントロールソースはフィールド[商品ID]のままにして、表示は品番になるように変更します。
1 テキストボックスをコンボボックスに変更する
商品テーブルの品番を一覧から選択するには、コンボボックスコントロールまたはリストボックスコントロールを使います。現在使っているテキストボックスをコンボボックスに変更しましょう(170ページの「1 テキストボックスをコンボボックスに変更する」を参照)。
変更するテキストボックスのショートカットメニューで操作します。サブフォーム「請求明細のサブフォーム」をデザインビューで開いて操作します。
>操作
図3.86 デザインビューで開いた請求明細のサブフォーム
@テキストボックス[商品ID]を右クリックする
A[コントロールの種類の変更]→[コンボボックス]を選択する
図3.87アコントロールが変更される
イ[商品ID]のプロパティウィンドウを表示する
B[値集合ソース]に[商品テーブル]を指定する
AX7H405Z
AC7H406Z
データシートビューに切り替えて、結果を確かめましょう。品番の並べ替えの状態で図と同じレコードの並びにならない場合があります。
>操作
図3.88 @ [ビュー]ボタンをクリックしてデータシートビューに切り替える
A [品番]欄をクリックすると[▼]ボタンが表示される
図3.89 B[▼]ボタンをクリックして一覧から選択する
図3.90 ア選択した値が入力されて対応する品名が表示される
AC7H396Z
AC7H407Z
AC7H408Z
AC7H409Z
2◆コンボボックスの表示内容を変更する
コンボボックスには、コントロールソースに指定したテーブルの任意のフィールドを表示することができます。プロパティ[列数]とプロパティ[列幅]で、表示するフィールドを指定します。
請求明細のサブフォームのフィールド[品番]には商品テーブルのフィールド[商品ID]の値が表示されているので、フィールド[品番]のコンボボックス[商品ID]のプロパティを変更して同じ商品テーブルの品番が表示されるように修正します。
>操作
図3.91@[商品ID]コンボボックスを右クリックして表示されるショートカットメニューの[プロパティ]を選択する
ア[コンボボックス 品番]のプロパティ一覧が表示される
A[書式]タブをクリックする
B[列数]を2つ設定する
C[列幅]を0に設定する
図3.92 データシートビューに切り替える
イフィールド[品番]の表示がID番号から品番に変わっている
図3.91Bの操作で入力を決定すると、単位のcmが自動的に付加されます。プロパティ[列数]ではコントロールソースのテーブルの左から何列目までを表示するのかを数値で指定します。ここでは、「2」を指定したので商品テーブルのフィールド[商品ID]と[品番]が指定されたことになります。
プロパティ[列幅]では表示する列の列幅(単位はcm)を指定します。複数の列数が指定されている場合は、セミコロンで区切って各列について、指定することができます。ここでは、「0」としましたが、これは1つ目の列の列幅は0、すなわち、表示しないという意味です。2列目については何も指定していないので既定値の列幅で表示されます。「0;5」のようにすると、1つ目の列は非表示、2つ目の列は5cmの幅で表示されます。
AC7H415Z
AC7H416Z
●プロパティ変更後の表示
プロパティを変更した直後は、データシートビューの表示が更新されないことがあります。その場合は、サブフォームをいったん閉じてもう一度開きます。
また、データが正しく入力されていても図3.93の「このフィールドに入力した値が不正です。」というエラーが表示されることがあります。この場合も、サブフォームをいったん閉じて、もう一度開きます。
AC7H417Z
3◆フィールドに入力される値
以上でフィールド[品番]に品番が表示されるようになりましたが、請求明細(マスター)テーブルに実際に入力されるデータは[商品ID]の値です。請求明細(マスター)テーブルのフィールド[商品ID]に入力されるデータは、コンボボックスのプロパティ[連結列]で指定された列番号(ここでは既定値の1)のデータということです。この関係を図3.94に示します。
P256と同じ図
凍結列で入力データを指定
請求明細(マスター)テーブル 商品テーブル
1 2 3 (列番号)
行番 請求書番号 商品ID …… 商品ID 品番 品名 ……
3 1 UF1
2 2 NT1
2 3 NT2
3 4 NT3
請求明細のサブフォーム
リンクとリレーションシップ
リンクとリレーションシップは同じようなはたらきをするが、若干異なる点がある。
リンクは、数式やコントロールがデータを参照するために、フィールドとフィールドを手操作で結合あるいは連結の設定を行う(プロパティやフィールド名として記述する)。
一方、リレーションシップは、Accessが自動的に結合あるいは連結を行う。
リレーションシップはおもに、テーブルやクエリ、フォームとサブフォームなどの自動作成機能であるウィザードで利用される。また、リレーションシップを設定することで、結合や連結など、データベース全体のデータ参照のつながりのようすがわかりやすくなる。リンクの設定を自動化するための方法がリレーションシップである、と考えれば理解しやすいだろう。
キーワード
■コンボボックスとリストボックス どちらも値を一覧形式で表示する機能をもつが、リストボックスでは一覧表示されたデータ以外を入力することはできない。コンボボックスは、テキストボックスにリスト機能を加えたコントロールで、一覧から選択入力するだけでなく、一覧にないデータを入力することもできる
■結合 フィールド同士を接続して、同じ値を互いに参照し合う接続
■連結 指定したデータによって、別のテーブルから関連する値(データ)を取得するための接続
Eサブフォームを完成する
請求明細のサブフォームに「単位」と「単価」も自動表示するようにします。「金額」は数量と単価のかけ算で求められるので、サブフォームのテキストボックスに計算式を記述して自動表示するようにします。
1 単位と単価のフィールドを追加する
品番を入力して品名を表示したのと同じ方法で、単位と単価を自動表示させます。リレーションシップの設定も同じですから、新たに設定する必要はありません。クエリ「請求明細クエリ」にフィールドを追加し、サブフォームのコントロールソースを変更するだけです。これまで解説した操作の応用操作でサブフォームを完成できるので、ここでは操作と結果だけを示しておきます。
●フィールドの追加
品番に対応する単位と単価を表示するために、クエリ「請求明細クエリ」にフィールド[単価]とフィールド[単位]を追加します。フィールドリストのどの位置に追加することもできますが、ここでは後部に追加しています。
クエリ「請求明細クエリ」をデザインビューで開いて操作します。追加後はクエリを閉じます。
>操作
図3.95 クエリ「請求明細クエリ」をデザインビューで開く
@商品テーブルの[単価]をフィールドリストにドラッグアンドドロップする
A商品テーブルの[単位]をフィールドリストにドラッグアンドドロップする
B[×]をクリックして閉じる
AC7H418Z
●コントロールソースの変更
請求明細のサブフォームのテキストボックス[単位]と[単価]のコントロールソースを、市用品テーブルのフィールド[単位]と[単価]に変更します。請求明細のサブフォームをデザインビューで開いて操作します。
>操作
図3.96 請求明細のサブフォームをデザインビューで開く
@テキストボックス[単位]のコントロールソースを「商品テーブル.単価」に変更する
アプロパティウィンドウを横に広げると、入力欄も横に広がるのでコントロールソースの一覧表が見やすくなる
図3.97Aテキストボックス[単価]のコントロールソースを「商品テーブル.単価」に変更する
図3.98 [ビュー]ボタンをクリックしてデータシートビューに切り替える
イ品番に対応した単位と単価が表示される
図3.99Bスクロールバーを操作して後部のフィールドを確認する
AC7H419Z
AC7H420Z
AC7H421Z
2◆金額を計算する
サブフォームの金額欄には、フィールド[数量]とフィールド[単価]のデータをかけ合わせた値を表示させます。テキストボックス「金額」のプロパティ[コントロールソース]を次の計算式にします。
=[数量]*[単価]
●式ビルダの起動
計算式を、コントロールソース欄に直接入力してもかまいませんが、次のように式ビルダを使うこともできます。
>操作
図3.100 請求明細のサブフォームをデザインビューで開く
アテキストボックス[金額]のプロパティ一覧を表示する
@コントロールソース欄の[...]をクリックする
図3.101 式ビルダが開く
Aウィンドウに表示されているコントロールソース名(金額)を消す
イ請求明細のサブフォームのアイコンが開いた状態になっている
ウ請求明細のサブフォームのフィールド名一覧が表示されている
コントロールソースの入力を消すには、コントロールソースの入力欄をクリックして[Backspace]キーなどで入力内容を消します。
AC7H422Z
AC7H423Z
請求明細のサブフォームのフィールド一覧が図3.101ウのようになっていない場合は、請求明細のサブフォームのアイコン(同図イ)をクリックします。
●計算式の作成
>操作
図3.102@[=]ボタンをクリックする
ア[=]が入力される
図3.103A[数量]を選択して[貼り付け]をクリックする
イフィールド名[数量]が入力される
図3.104B[*]ボタンをクリックする
ウ[*]が入力される
図3.105C[単価]を選択して[貼り付け]をクリックする
エフィールド名[単価]が入力される
D[OK]をクリックする
図3.106オ計算式がコントロールソースに入力される
AC7H424Z AC7H425Z
AC7H426Z AC7H427Z
AC7H428Z
●計算式作成上の注意
コントロールソースの欄に計算式を直接入力する場合は、半角と全角を正確に区別しなければなりません。とくにフィールド名は、全角、半角が異なると別のフィールド名と判断されるので注意が必要です。
●結果の確認
データシートビューに切り替えて、正しい計算結果が得られることを確認します。
>操作
図3.107 @データシートビューに切り替えて
、スクロールバーを操作して[数量]と[金額]が見えるようにする
図3.108 A数量を入力して(ここでは1行目に[2]を入力)、入力を決定する([↓]キーなどを押す)
ア計算結果が表示される
図3.109 B各レコードに数量を入力する
C[×]をクリックして閉じる
合計を求めるときに使うデータとして、各レコードの数量を図3.109のように入力しておきます。なお、ここまでの操作ではデータを並べ替えていないので、各レコードが図3.109と同じ順に並ぶとは限りません。レコード表示の並べ替えについては、266ページの「@レコード表示を並べ替える」で解説します。
AC7H429Z
AC7H430Z
AC7H431Z
3◆サブフォームのフィールドの表示幅
以上で、請求明細のサブフォームのデータ入力に関する処理はひとまず完成しました。ここで、請求書フォームに表示したときの幅を調整しておくことにしましょう。
フォームをフォームビューで開いて操作します。
●列幅の変更
最上部フィールド名の縦線にマウスポインタを合わせると、両向きの矢印に変わります。その位置でドラッグします。右方向へドラッグアンドドロップすれば広く、左へドラッグアンドドロップすれば狭く変更できます。
>操作
図3.110 請求書フォームを開く
@ フィールド名の間の縦線にマウスポインタを合わせる
図3.111Aドラッグして幅を変更する
図3.112アマウスボタンを放したときの幅になる
AC7H432Z
AC7H434Z
AC7H435Z
●列の非表示
ドラッグアンドドロップで前部のフィールドへ移動すると、非表示にすることができます。再び表示するには、非表示にした縦線のすぐうしろのあたりをドラッグして右へ移動させます。非表示にしてもデータがなくなるわけではなく、見えなくなるだけです。
>操作
図3.113@非表示にする列の右側の縦線にマウスポインタを合わせる
Aドラッグですぐ前の縦線を越えるあたりに移動して、マウスボタンを放す
図3.114ア[請求書番号]フィールドが表示されなくなる
図3.115B非表示にした列のすぐうしろにマウスポインタを合わせる
Cドラッグで右へ移動して、マウスボタンを放す
図3.116イ[請求書番号]フィールドが再表示される
AC7H436Z
AC7H437Z
AC7H438Z AC7H439Z
●列幅を調整したフォーム
図3.117は、各フィールドの表示幅を適切に調整した結果です。サブフォームからはみ出さないように調整すると下部のスクロールバーは表示されなくなります。
調整した幅は、サブフォームだけを開いたときにも反映されます。親フォーム上に表示されているサブフォームは、サブフォームそのものだからです。つまり、ファイルとして保存されているサブフォームとフォーム上に表示されているサブフォームは同じものだということです。サブフォームを開いて列幅を変更すると、フォーム上のサブフォームの列幅も変更された列幅で表示されます。逆に、前記の操作のようにフォーム上の列幅を変更すれば、サブフォーム単体の列幅も同じ列幅に変更されます。
AC7H440Z
長い説明になりましたが、請求書らしいフォームが完成しました。ここでは品番と品名を例に操作を解説しましたが、同様の操作で親フォーム上に顧客名を入力して、顧客住所や電話番号を自動表示させることもできます。ページ数の関係ですべての操作を解説できませんが、読者が自分で設定すると理解が深まることと思います。ぜひ挑戦してみてください。次節以降は、ここまでの操作の続きとして解説を進めます。
キーワード
■式ビルダ コントロールソースなどに入力する計算式などを作成するために使う機能。フィールド名やテーブル名、あるいは関数をマウスで選択操作し、目的の数式を完成させることができる