この章ではフォームを作成してスムーズにトランザクションデータを登録する手法を学びます。
トランザクション入力用フォームは下記のデータベースファイル上に実装します。
Base練習_MasterForm.odb
なお、トランザクション入力用フォーム作成後のデータベースファイルは下記のファイルとなります。実装時間を省きたい方は下記ファイルを開いて第8章に進んで頂いても結構です。
Base練習_TransactionForm.odb
受注伝票入力用フォーム「Slip」作成
トランザクションテーブルの「受注伝票(Slip)」と「商品明細(SlipDetail)」に直接入力するにはかなり問題があります。双方の受注伝票IDを一致させなければなりませんし、参照する各マスターのキーを間違えずに入力するのは骨がおれます。そこで、ここはどうしても入力用フォームが必要となります。
受注伝票はひとつの受注伝票IDに対して複数の商品を登録しますので、商品入力に関しては「サブフォーム」を定義することにします。まずは最も単純なスタイルのフォームを作り、実際にデータ入力してみた上で、改良を加えていくという手順で作業を進めましょう。
今回も[ウィザードを使用してフォームを作成]をクリックするところから始めます。
①Base編集画面左ペインの「データベース」欄より「フォーム」を選択し、右ペイン上部の「タスク」欄で[ウィザードを使用してフォームを作成]をクリックします。
②すると、下図のように「データベースフォーム」画面が開き、さらにウインドウ「フォームウィザード」が表示されて、左ペインの「ステップ」欄には「1.フィールドの選択」フェーズであることが示されます。
③右ペインの「テーブルまたはクエリー」欄で「表:Slip」を選択すると、「使用可能なフィールド」欄には受注伝票(Slip)のフィールドが表示されます。フィールド「Date」を指定すると、ボタン「>」が有効になり、これををクリックするとフィールド「Date」が「フォーム内のフィールド」欄に移動します。同様にID以外の全てのフィールドを移動します。IDは自動採番で作成されるフィールドであるため指定しないのは担当者マスター入力用フォームを作成した時と同じです。
④下図が「フォーム内のフィールド」欄に全ての必要なフィールドを移動した状態です。
⑤ここで[次へ]をクリックします。
⑥すると、下図のように左ペインの「ステップ」欄には「2.サブフォームの設定」フェーズであることが示されます。「サブフォームの追加」をクリックし、「既存のリレーションに基づいたサブフォーム」をONにします。
⑦「追加するリレーションを入力してください?」という欄にはデフォルトで「SipDetail」が表示されているので、それを指定して[次へ]をクリックします。
⑧すると下図のように左ペインの「ステップ」欄には「3.サブフォームフィールドの追加」フェーズであることが示されます。
⑨右ペインの「テーブルまたはクエリー」欄には「表:SlipDetail」が表示されていて、「使用可能なフィールド」欄には商品明細(SlipDetail)のフィールドが表示されています。フィールド「Item_ID」を指定すると、ボタン「>」が有効になり、これををクリックするとフィールド「Item_ID」が「フォーム内のフィールド」欄に移動します。同様にID以外の全てのフィールドを移動します。Slip_IDはここでも指定しません。
⑩下図が「フォーム内のフィールド」欄に全ての必要なフィールドを移動した状態です。
⑪ここで[次へ]をクリックします。
⑫すると左ペインの「ステップ」欄には「5.コントロールの整列」フェーズであることが示されます。ここでは右ペインの「メインフォームの整列」欄で「欄で、ラベル書きは上に」の整列パターンをクリックし、「サブフォームの整列」欄で「データ表として」の整列パターンをクリックします。
⑬すると下図のように背景の「データベースフォーム」画面こメインフォームとサブフォームのコントロールが配置されているのが確認されますので、[次へ]をクリックします。
⑭すると、左ペインの「ステップ」欄には「6.データエントリーの設定」フェーズであることが示されます。ここではなにもせず[次へ]をクリックします。
⑮すると、左ペインの「ステップ」欄には「7.スタイルの適用」フェーズであることが示されます。、ここでは「灰色」を指定して[次へ]をクリックします。
⑯すると、下図のように左ペインの「ステップ」欄には「8.名前の設定」フェーズであることが示されます。右ペインの「フォーム名」欄には指定したテーブル名「Slip」がデフォルトで表示されていますのでそのままにし、「フォームを使用」もONのままにして[完了]をクリックします。
⑰すると、フォーム「Slip」が登録され、引き続き下図のようなフォーム画面が起動します。テーブル「Slip」にはまだ何も登録されていませんので、全てのフィールドがブランクの状態で表示されます。
⑱この状態で、まずは1レコード入力してみましょう。下図はフィールド「Date」から順にデータ入力し、[Tab]キーで進め、フィールド「Note」の入力が終わったところです。「フォームのナビゲーション」左端には現在1レコード目であることを表示しています。
⑲ここでフィールド「Item_ID」に進めようとして[Tab]キーをクリックすると、下図のように入力値が全て消えてしまいます。フォームのナビゲーション」左端を見ると、どうやら1レコード目が既に登録されて、2レコード目の入力に進んだようです。
⑳ここでフォーム「Slip」を閉じて、テーブル「Slip」の内容を確認してみましょう。下図のとおり、やはりフォーム「Slip」のヘッダー部分で入力したデータはID=0で登録されています。当然、テーブル「SlipDetail」には登録されていません。
㉑この問題を解決する前に、気になることがあります。下図のフィールド「Date」には”4月1日”と表示さています。フォーム画面では”21/04/01”と入力したはずですが、これでは年数が分からなくて不便ですね。この問題を先に解決しましょう。
㉒テーブル「Slip」を編集モードで開き、「Date」を指定して画面下方「フィールドの属性」の「形式の例」欄右にあるボタン[…]をクリックします。
㉓すると下図のようにウインドウ「フィールドの書式設定」が表示されますので、「書式」タブを開き、カテゴリー欄で「日付」、言語欄で「日本語」、形式欄で「99/12/31」を選択すると、画面下方の書式コード欄に「YY/MM/DD」と表示されますので、[OK]をクリックします。
㉔テーブル「Slip」を保存し、再度ダブルクリックで開きます。
㉕下図が書式変更後のテーブル「Slip」の内容です。
㉖タブの問題に戻りましょう。フォーム「Slip」を編集モードで開き、ツールバーのアイコン「タブの順序」をクリックします。
㉗するとダイアログボックス「タブの順序」が表示されますので、右側にあるボタン[自動並び替え]をクリックした後、[OK]ボタンをクリックします。このダイアログボックスは画面のコントロールのタブ順を自動的に並び替えるものですが、タブの動きをサブフォームにも及ぶようにしてくれます。
㉘フォーム「Slip」を保存して閉じ、再びダブルクリックで開きます。
㉙フォーム「Slip」が入力モードで開くと、下図のように既に登録されているID=0のレコードが最初に表示されます。フィールド「Date」にカーソルを置き、[Tab]キーを何度かクリックすると、フィールド「Note」、「Customer_iD」、「Staff_ID」、そしてサブフォームの第1列「Item_ID」へと移動します。下図はフィールド「Item_ID」まで移動した状態です。
㉚この画面でフィールド「Date」から「Staff_ID」の入力値を変更することができますが、ここでは変更せず、商品明細を2行入力してみましょう。
㉛下図の破線個所が商品明細入力後の状態です。ここで「フォームのナビゲーション」よりアイコン「レコード保存」をクリックしてフォーム「Slip」を終了します。
㉜下図はテーブル「Slip」とテーブル「SlipDetail」を開いて上下に並べたものです。テーブル「Slip」にはID=0のキーを持ったレコードが1レコード登録されており、テーブル「SlipDetail」にはSlip_ID=0,Item_ID=D001のキーを持ったレコードと、Slip_ID=0,Item_ID=S003のキーを持ったレコードの2レコードが登録されているのが確認できます。
※ このように、フォーム内でサブフォームを使うと、伝票イメージのヘッダー部分を格納するテーブルと明細部分を格納するテーブルにスムーズにデータを入力し、登録あるいは修正を行うことが可能になります。
受注伝票入力用フォーム「Slip」修正
①ここまでの作業で最も単純なスタイルのフォームが出来上がりました。これをもう少し見栄えのよいフォームに修正しましょう。まず、フォーム「Slip」のフィールド名を日本語名にしましょう。前章でフォーム「Staff」を作成した時の要領で各フィールドのタイトルを修正して下さい。なお、サブフォームの場合は列名を右クリックし、コンテキストメニューから「列」を選んで属性ウインドウを開いて下さい。
(注)コンテキストメニューの「列」というのが少し分りにくい表示ですが、要は「習うより慣れろ」です。
②下図がフィールド名を日本語名にした状態です。次にフィールド「取引先」と「担当者」をリストから選択する方式に変更してみましょう。これらも前章のフォーム「Staff」でフィールドをリストボックスに変更した時の要領を参考に作業してみて下さい。なお、サブフォームのフィールド「品目」もリストから選択する方式に変更しますが、こちらの手順は少し複雑なので、この後で説明します。
③下図がフィールド「取引先」と「担当者」をリストから選択する方式に変更した状態です。いずれもコントロールが小さいので広げ、さらに表示される位置を変更してあります。なお、グループ化は解除しました。
④フォーム「Slip」を保存し、入力モードで開いたのが下図です。取引先と担当者が正しく選択されているのが確認できます。
⑤それではフォーム「Slip」を閉じ、再度編集モードで開いて下さい。
⑥こんどはサブフォームのフィールド「品目」をリストから選択する方式に変更しますが、ひとつ問題があります。受注伝票の明細として品目名をリストから選ぶのはいいのですが、その品目の販売単位が分らないと、たとえ入力する数量が「2」であっても、それが「2箱」なのか「2ダース」なのか分かりません。そこで今回は品目リストに名称と単位を表示するよう、工夫してみます。
⑦下図のようにサブフォームの列名「品目」を右クリックし、コンテキストメニューから「置換後の文字列>リストボックス」を選んで下さい。
⑧すると、品目列の幅が少し長くなった程度の変化しかありませんが、再度列名「品目」を右クリックし、コンテキストメニューから「列」を選んで下さい。
⑨すると下図のようにウインドウ「属性 リストボックス」が開きますので「データ」タブを開いて「リスト内容の種類」を「Sql」に変更します。
⑩すると、操作のタイミングによっては下図のように黒くなり固まってしまうことがありますので、一旦ウインドウを閉じて、再度列名「品目」を右クリックし、コンテキストメニューから「列」を選んでウインドウ「属性 リストボックス」を開きます。
⑪すると下図のようにウインドウ「属性 リストボックス」が正常に開きますので、4番目の項目「リストの内容」の右端にあるボタン[…]をクリックして下さい。
⑫すると下図のように「クエリーデザイン」画面が表示され、さらにダイアログボックス「テーブルまたはクエリーの追加」が表示されますので、「テーブル」を選択し、テーブルリストから「Item」と「Unit」を選択し、[閉じる]をクリックします。
※ テーブルを2つ選択することに着目して下さい。
⑬「クエリーデザイン」画面下方の表1列目のフィールド行で「Item.Name」、2列目のフィールド行で「Unit.Name」、3列目のフィールド行で「Item.ID」を選択して「クエリーデザイン」画面を閉じます。
⑭すると下図のようなダイアログボックス「確認」が表示されますので、[はい]をクリックします。
⑮すると下図のようにウインドウ「属性 リストボックス」の4番目の項目「リストの内容」にSQL文が設定されているのが確認されますので、右隣のボタン[▼]をクリックします。
⑯すると下図のように次のようなSQL文が設定されているのが確認されます。
SELECT “Item”.“Name”,“Unit”.“Name”,“Item”.”ID”
FROM “Item”,“Unit”
WHERE “Item”.“Unit_ID” = “Unit”.“ID”
SQL文の文法の説明は第8章で説明しますが、このSQL文を簡単に説明すると、『テーブル「Item」の「Name」とテーブル「Unit」の「Name」、そして「Item」の「ID」の値を取得せよ』という意味になります。このように3つのフィールドを取得しますが、1番目と2番目は品目リストに表示され、3番目は選択された品目のIDとして、その値がテーブル「SlipDetail」のフィールド「Item_ID」に格納するためです。
⑰フォームのリストボックスの機能としては取得する項目は2つで、最初の項目は画面上の表示テキスト、2番目の項目はリストより選択されたもののIDとなっているので、ここでは最初の項目に単位名も含んでひとつの項目にまとめる手法を取ります。
⑱自動生成されたSQL文を下記のように変更します。
SELECT “Item”.”Name”||’ 単位:‘||”Unit”.”Name” , “Item”.”ID”
FROM “Item”, “Unit”
WHERE “Item”.”Unit_ID” = “Unit”.”ID”
赤字の部分が変更箇所です。これで取得される項目が2つに変更されます。
<解説>文法上、「”」(ダブルクォーテーション)で囲った部分はテーブル名またはフィールド名を表します。例として“Item”.“Name”はテーブル「Item」のフィールド「Name」を表します。次に「||」(バーティカルバー)2文字は連結演算子といい、取得したテキストや文字列を連結してひとつのテキストにします。「’」(シングルクォーテーション)で囲った部分は固定の文字列(リテラル)を表します。
したがって、赤字の部分はつぎの意味になり、最初の項目の内容になります。
『テーブル「Item」のフィールド「Name」の値と、「 単位:」という文字列とテーブル「Unit」のフィールド「Name」の値を連結したテキスト』
(注)SQL文を変更する際、漢字は直接入力できませんので、テキストエディター等で予め入力しておいたテキストをコピペで入力して下さい。
⑲下図がSQL文を修正した後の状態です。修正したら[OK]をクリックしてウインドウ「属性 リストボックス」を閉じ、フォーム「Slip」を保存して下さい。
⑳下図がフォーム「Slip」を閉じ、入力モードで開いた状態です。赤い破線で囲った部分が単位名付きの品目名です。これで見栄えのよいトランザクションデータ入力用フォームが完成しました。なお、列幅は適宜広げています。やりかたは編集モードでCalcの列を広げるのと同様の要領で広げてフォームを保存します。
⑳これでトランザクションデータ入力用フォームが完成したようですが、実はもう1点問題があります。サブフォームを内臓するフォームは「フォームのナビゲーション」がうまく制御されません。カーソルがサブフォーム内にあるとき、ツールバーの「フォームのナビゲーション」の一部が消えてしまいます。上図の青い破線で囲った部分がその状態を表しています。これを常に表示させるように設定し直します。
㉑フォーム「Slip」を編集モードで開き、アイコン「フォームナビゲーター」をクリックします。
㉒すると下図のようにウインドウ「フォームナビゲーター」が開きますので「Subform」上で右クリックし、コンテキストメニューの「属性」を選択します。
㉓すると下図のようにウインドウ「フォームの属性」が表示されますので、タブ「データ」を開き、下から2番目の項目「ナビゲーションバー」の値「はい」を「親フォーム」に変更し、フォームの属性を閉じ、フォームナビゲーターも閉じて、フォーム「Slip」を保存します。
㉔これでフォーム「Slip」が使いやすい状態になりましたので、いくつかレコード登録して見て下さい。下図はサンプルデータを4伝票追加した後のテーブル「Slip」とテーブル「SlipDetail」を開いて上下に並べたものです。