AKB48の推しメンをセンターにできちゃうかもしれない!? >>

マスターmdbにメインとなるテーブルを置き
(ID,課,担当者名,商品番号,商品名,価格・・・)
3課まであるのですが、各課の専用フォルダに編集するmdb
(仮に編集mdbとします)を置いて
メインテーブルをリンクし、同じフィールドを用意した編集用テーブルを置き、フォームやクエリを作成して作業しようとしています。
基本的に同じ顧客に一斉に手を加える事はないので
編集用テーブルに一旦格納したデータを追加クエリでリンクしたメインテーブルへ書き込み、削除クエリで編集用テーブルを綺麗にしています。
が。そもそも新規ばかりではなくメインテーブルに既存のデータを読み込んで編集したい事もあります。
この処理をどうしたら良いのか分かりません。誰かがメインテーブルを参照していたら他の人が見れないと思うし、1レコードだけ見るのであればそれだけ一旦編集用テーブルへ置けば良いのかと思いましたが、
一覧を見てソートしてみたりする事もあります。
管理者が全部のデータを掌握したいのでマスターmdbにメインとなるテーブルを置いたのですが、これを課ごとのテーブルに分ければ良いのでしょうか?
Accessをいじればいじる程毎回発見がありますので、知らないだけで他に簡潔な方法などありましたら教えて下さい。宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

> メインテーブルをリンクし、同じフィールドを用意した編集用テーブルを置き、


(中略)
> 編集用テーブルに一旦格納したデータを追加クエリでリンクしたメインテーブルへ
> 書き込み、削除クエリで編集用テーブルを綺麗にしています。

これができているのでしたら、既存データの編集もそれほど難しくはないかと思います。
但し、1画面で「上書き更新」と「削除」の双方に対応すると少し複雑になりますので
(→新規追加/既存編集/既存削除とも、同時に複数レコードを扱うことを想定)、
ここでは更新と削除は別として考えることにします。
(メニュー画面に、「新規追加」「既存編集」「データ削除」の3つのボタンがあって、
 それぞれ専用のフォームがあるイメージです)

現在行われている「新規レコードの追加」と、今回ご希望の「既存レコードの編集」
及び「既存レコードの削除」を比較して、概要を説明してみます:

<新規レコードの追加>
1)【削除クエリ】編集用テーブルのレコードを全て削除
 ※前回作業時に、何らかのエラーで削除が行われなかった場合への対応です。
2)【ユーザー】編集用テーブル(を元にしたフォーム)に対して、新規レコードを追加
3)【追加クエリ】コマンドボタンのクリックで、編集用テーブルからメインテーブルに
 書き込み
4)【削除クエリ】編集用テーブルのレコードを全て削除

<既存レコードの編集>
1)【削除クエリ】編集用テーブルのレコードを全て削除
 ※編集用テーブルは、新規レコードの追加用とは別に作成し、「更新」フィールド
   (データ型はYes/No型、既定値はNo)を追加しておきます。
2)【追加クエリ】メインテーブルから編集用テーブルに書き込み
 ※新規追加の時とは逆方向にデータをコピーするということです。
  なお、追加クエリでも選択クエリと同様に、絞り込み条件を指定できますので、
  担当の課に限定するとか、更に商品名を曖昧検索で抽出する、といったことも
  検討してみて下さい。
3)【ユーザー】編集用テーブル(を元にしたフォーム)に対して、既存レコードを変更
 ※フォームのプロパティシートの『データ』タブで以下を設定しておきます:
   「追加の許可」=「いいえ」、「削除の許可」=「いいえ」
 ※フォームの「更新後」イベントで、「更新」フィールドの値を「Yes」にします。
  (フォームにはチェックボックスとして設置の上、プロパティシートの「書式」タブで
   「可視」を「いいえ」にしておきます)
4)【更新クエリ】コマンドボタンのクリックで、編集用テーブルで「更新」フィールドが
 Yesのもののみ、メインテーブルのレコードを上書き
 ※双方のテーブルで、共にIDが主キーだと思いますので、このIDで両テーブルを
   結合させてクエリを作成し、更新クエリのデザインビューの「レコードの更新」欄に
   「[編集用テーブル].[担当者名]」等を記入します(→添付画像)
 ※主キーであるIDは、上書き更新の対象から外し、それ以外のフィールドを更新。
5)【削除クエリ】編集用テーブルのレコードを全て削除

<既存レコードの削除>
1)【削除クエリ】編集用テーブルのレコードを全て削除
 ※編集用テーブルは、既存レコードの編集用のものと同様に新たに作成し、
  「削除」フィールド(データ型などは「更新」と同じ)を追加します。
2)【追加クエリ】メインテーブルから編集用テーブルに書き込み
3)【ユーザー】編集用テーブル(を元にしたフォーム)に対して、削除したいレコードの
 「削除」チェックボックスをYesに更新
4)【削除クエリ】コマンドボタンのクリックで、編集用テーブルで「削除」フィールドが
 Yesのもののみ、メインテーブルのレコードを削除
 ※この削除クエリも、上と同様にIDで双方のテーブルを結合させて作成します。
5)【削除クエリ】編集用テーブルのレコードを全て削除


・・・以上のように、新規レコードの追加の場合に比べて、メインテーブルからの
レコードのコピーが入るのと、編集用テーブルからメインテーブルへの反映に使用する
のが追加クエリか更新クエリ/削除クエリかの違い、です。
(・・・そのわりに、長文になってしまいましたが・・・(汗))
「Access:リンクテーブルでの参照、更」の回答画像2

この回答への補足

回答へのお礼の補足なのですが。。。
ワークテーブルを分けた方が、クエリ処理一発で済むのですね。
やはりワークテーブルは3つ作る事にします。
ありがとうございました!

補足日時:2009/10/09 15:09
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
編集は、一旦テーブルを全部コピってきて、編集したレコードだけをクエリで上書きする、という事ですね?
成る程成る程・・・と思っていじっていましたが、一覧をソートしたりなんだりする事も発生します。
いっそ1つのワークテーブルに一旦全部コピってきて、更新フラグを
0=新規追加 : 1=編集 : 2=削除 とか数値で立てて
更新フラグが立っている物を、値を見て処理を振り分けるとかしたら変ですか?
あれ・・・?丁寧に教えて頂いたのに変な質問してしまっていましたらすみません;もぅ1つの回答の方と両方試そうと試行錯誤してわたわたしています。すみません。ありがとうございます。

お礼日時:2009/10/09 14:45

こんにちは。


文面を見るとこの方式で既に作業をされているのでしょうか?
MDBをメインDBと作業用DBに分けるという事は良い事と思います。
アクセスは基本的に5クライアント迄のDBへのアクセスをコンセプト
にしているようです。
よって、作業クライアント数も問題は無いようです。

作り方ですが、せっかくリンクテーブルとしてあるので別に
各テーブルに同じ形式のテーブルを作らず、直接このリンクテーブル
を基にクエリを作成し、データ追加用クエリ・データ編集用クエリ・
データ削除用クエリの大体3種類を作って行なえばよいのでは
無いでしょうか?他のクライアントがテーブルを参照していても
作業者のマシンで同じテーブルは使えるはずです。

又、基本的に同じ顧客に一斉にアクセスしないとの事ですので、
多少不安ながら削除クエリを作動させる際にデータロックも
必要ないのでは?(VBA調べれば、削除実行前にテーブルロック
させる方法もあったはずですのでそれを使えばより安全ですが)

以上、参考まで
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
直にリンクテーブルをいじるのもアリなんですね。
誰かが参照していると開かないのかな…と思っていたのですが。
試しに自分のPC内ではありますが、複数の編集用mdbを作成して
(リンクするテーブルはMaster.mdb)同時に
リンクしているテーブルを参照しているクエリを使ったフォームを開いてみたのですが動きました!シンプルで良いですね。
同時に一覧を眺める事もありそうなので、これは助かります。
データロックは知りませんでした。何かあってはいけないのでその処理を頭に入れておきます。
ありがとうございました!

お礼日時:2009/10/09 14:40

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

Qaccessでのリンクテーブルの更新

いつもお世話になっております。

AccessからSQLServerのテーブルにリンクをはっています。
このリンクテーブルをupdate文で更新したいのですが、
「更新可能なクエリであることが必要」とでています。

以前にも類似の質問をしました。

http://oshiete.goo.ne.jp/qa/6581636.html

しかし、いったん解決したのですが、別のところで同様の現象が
でてしまいました。

調べると、リンク先のSQLServerのテーブルにはキーが存在していて、
Access側からリンクするときには自動的に一意設定されてしまいます。
発行したいupdate文はこのキーとは別の項目が一意になっていないと
だめな条件付けがされているのです。
リンクをはるときに、SQLServer側ですでに設定されているキーとは
違った項目を一意項目として選択する方法はあるのでしょうか?
調べてみると、まったくキーのないテーブルをリンクするときは当然、
一意な項目を選べるのですが、キーがすでにある場合はだめな
ようでした。

毎度のことでお手数なのですが、どうかよろしくお願い申し上げます。

いつもお世話になっております。

AccessからSQLServerのテーブルにリンクをはっています。
このリンクテーブルをupdate文で更新したいのですが、
「更新可能なクエリであることが必要」とでています。

以前にも類似の質問をしました。

http://oshiete.goo.ne.jp/qa/6581636.html

しかし、いったん解決したのですが、別のところで同様の現象が
でてしまいました。

調べると、リンク先のSQLServerのテーブルにはキーが存在していて、
Access側からリンクするときには自動的に一意設定されてしまいます。
発行し...続きを読む

Aベストアンサー

リンク先のテーブルにユニーク索引を作成してください。
alter table テーブル名 unique ( 項目1, 項目2, ... )

これで更新クエリで対象レコードが指定した項目でユニークになるのであれば更新可能なはずです。

QAccessのリンクされたテーブルでリンク先ではデータを変更出来ないようにするには?

AccessでAに元のデータベースファイルがあり、そこに社員一覧のテーブルがあります。Bでその社員一覧のテーブルをリンクで取り込みました。社員一覧テーブルはリンク先のBでは編集・変更など一切出来ないようにすることは可能でしょうか?
他にも、元データのテーブルを参照するだけの(変更不可)の方法があれば教えて下さいませ。
どうぞよろしくお願い致します。

Aベストアンサー

リンクテーブルのプロパティには閲覧のみを許可する・・・
と言うようなものは有りませんので不可能かと思います。当方Access2002
2003や次期Accessがどうなっているのかは分かりませんけど。
データベースを共有して使用する方法
http://support.microsoft.com/kb/882219/ja
↑最後の方の関連情報もご覧下さい。

2002以前であれば
案1
社員一覧テーブルの更新頻度が少なければ、元のMDBにリンクするのではなく
ダミー(元のMDBのコピー)にリンクさせておき、
社員にはテーブルを変更しても正規のMDBには反映されない、
変更しても突然元に戻る場合がある、と通知する。
ご質問者は定期的に元MDBのデータをダミーMDBに反映させる。

案2
リンクテーブルとそれを使ったクエリは非表示にしておいて、
フォームを作成し、プロパティで編集ロックにしておく。
(少しでもAccessを知っている人には効き目が有りません。)

案3
リンクテーブルは作らないで全てVBA・SQL文で作る
作るのが面倒です。

案4
リンク先にあるようにユーザーレベルのセキュリティを設定すれば
運用は一番楽ですが、設定が分かり辛くて難しい。
Access データベースとそのオブジェクトにユーザーレベル セキュリティを設定する (MDB)
http://office.microsoft.com/ja-jp/assistance/HP052578501041.aspx
(全て表示をクリックしてみて下さい)

かな?

リンクテーブルのプロパティには閲覧のみを許可する・・・
と言うようなものは有りませんので不可能かと思います。当方Access2002
2003や次期Accessがどうなっているのかは分かりませんけど。
データベースを共有して使用する方法
http://support.microsoft.com/kb/882219/ja
↑最後の方の関連情報もご覧下さい。

2002以前であれば
案1
社員一覧テーブルの更新頻度が少なければ、元のMDBにリンクするのではなく
ダミー(元のMDBのコピー)にリンクさせておき、
社員にはテーブルを変更しても正規のMDB...続きを読む

QACCESSに同時アクセス(編集)をしたい

教えてください。
ACCESSのDBに複数のユーザが同時にアクセスして、
データを追加・編集したいのですが、
やはり、不可能でしょうか?

Aベストアンサー

マイクロソフトのアクセスに同時に複数のユーザが同時にアクセスして
データベースを操作することは可能です。いくつかの方法がありますが、
昔私が簡便に行なっていた方法は「テーブルのリンク」です。

あるコンピュータにアクセスでdb1という名前のデータベースを作って
ここにデータを格納しておきます。

他方で別のコンピュータに、アクセスでdb2という名前のデータベースを作ります。

このdb2というデータベースのメニューで

「ファイル」->「外部データの取り込み」->「テーブルのリンク」

というのがありますから、最初に作ったdb1をたどり、リンクしたいテーブルを
選択します。

こうすることにより、db2にdb1のテーブルがリンクされ(リンクテーブルと
呼ばれます。アイコンが通常のテーブルと違います。)、db1に格納された
データをdb2で編集することができます。

db2で、db1からのリンクテーブルを元にクエリーを作成することもできます。
リンクテーブルに対してできないことはテーブル構造の変更くらいで
他のことはだいたいできると思っていいかと思います。

このような形をとれば、ローカルエリアネットワーク内の複数のコンピュータ
から同時に同じアクセスデータベースにアクセスすることは可能かと思います。

このやり方にはおそらく問題もあるだろうと思うのですが、昔私がやって
いた頃は、特段支障もなく業務を行なうことができました。問題は、これを
読んだ他の誰かが指摘してくださるかと思います。

同じレコードに複数ユーザが同じタイミングでアクセスするとややこしい
ことになります。これを回避するためには、db2にワークテーブルを備えておき、
リンクテーブルからレコードを一度db2に格納し、編集を終了したのちに
リンクテーブルのレコードを削除し、ワークテーブルで編集したレコードを
リンクテーブルに追加する、などのルーティンをマクロやVBAで構築するのが
よいかと思います。私はそのようにしていました。

他に、ADOを使う方法などもあります。方法はいくつかありますから、
少し研究してみるといいですよ。(^-^)

マイクロソフトのアクセスに同時に複数のユーザが同時にアクセスして
データベースを操作することは可能です。いくつかの方法がありますが、
昔私が簡便に行なっていた方法は「テーブルのリンク」です。

あるコンピュータにアクセスでdb1という名前のデータベースを作って
ここにデータを格納しておきます。

他方で別のコンピュータに、アクセスでdb2という名前のデータベースを作ります。

このdb2というデータベースのメニューで

「ファイル」->「外部データの取り込み」->「テーブルのリンク」
...続きを読む

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

QACCESSでフォームを使って、テーブルを参照、データ入力、データ更新をしたいのです

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入力画面
       ↓
レコード番号を入れると、そのレコードのデーターが画面に表示され、
その画面で修正可能
       ↓
 保存 ボタンで保存

という流れです。

レコードナンバーはIDを使おうと思っています。

データの量が莫大な為、コンポボックスなどは使えません。

できるだけ、VBAなどは使わずに作りたいです。

よろしくお願い致します。

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入...続きを読む

Aベストアンサー

まずそのテーブルを基にしてフォームを作成します。
そのフォームのヘッダー部分にテキストボックスを配置後、一旦
上書き保存。
フォームのレコードソースを
SELECT *
FROM テーブル名 WHERE ID=[Forms]![フォーム名]![テキストボックス名]
とします。
次にテキストボックスの更新後処理に
Me.Requery
とすれば完成です。
フォームを開いてテキストボックスにID入力後エンターしてください。

保存に関しては、コマンドボタン作成後クリック時イベントに
DoCmd.RunCommand acCmdSaveRecord
とすれば良いでしょう。

この手のモノは検索すれば相当数ヒットするので、そちらを参考にされるのもよろしいかと。

QAccessのマクロでモジュールを実行させたい。

Access2002を勉強中の初心者です。

AccessでDB1という名前のデータベースを作成し、その中で、モジュール1というモジュールを作成しました。これを実行するマクロを作成したく、次のようにマクロを作成しました。
マクロのデザイン画面でアクションに「プロージャの実行」を選択、プロージャ名入力覧の右側の...のボタンを押して式ビルダ画面を表示、ここの「関数」フォルダを開いてDB1を選択、表示されたモジュール1を貼り付けてOK。
しかし、このマクロを実行すると、次のエラーとなります。「DB1 指定されたDB1が見つけることができない関数名が含まれています」

根本的に方法が間違っているのでしょうか?
アドバイスをよろしくお願いします。

Aベストアンサー

#1です。

ちょっと時間ができたので、Accessのヘルプで、
 "RunCode/プロシージャの実行" アクション
についてのトピックを見てみました。

結論から言うと、基本的な考え方が間違っているみたいです^^;。

「プロシージャの実行」アクションでは、「Function」プロシージャを指定するようです。
Subプロシージャではエラーになります。


つまりご質問の件では、
「Subプロシージャを呼び出すFnctionプロシージャ」をまず書かなけれえばならない。
そして、マクロのアクションでは、あらためてこのFunctionプロシージャを指定しなければいけません。

QAccessのリンク先を相対パスにしたい

Access2010をつぎのような環境で開発しています。

c:\開発\データ.accdb  テーブル定義と実データ格納
c:\開発\アプリ.accdb  データ.accdbのテーブル定義へのリンクとフォームなど

これを本番のネットワーク環境 “\\network\本番” に設置した場合、
「c:\開発\データ.accdbは無い」旨のエラーになってしまいます。
また、本番環境のパス名はインストール先によって異なります。

Access2010のリンクマネージャでは絶対パスでのリンクしか定義できないようですが、
カレントパスに変更するには、アプリ.accdb を起動時に毎回、動的に変更するしかないのでしょうか?

お教えいただきたくお願いいたします。

Aベストアンサー

データ.accdb と アプリ.accdb が同じフォルダ内にあって
アプリ.accdb のリンク先を
その同じフォルダ内のデータ.accdbに設定するのなら、
VBAになりますが、アプリ.accdb に(例は標準モジュールです)

Sub reLink()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim lnkPath As String
Dim i As Integer

lnkPath = CurrentProject.path
Set db = CurrentDb
For Each tdf In db.TableDefs
If Len(tdf.Connect) <> 0 Then
tdf.Connect = ";DATABASE=" & lnkPath & "\データ.accdb"
tdf.RefreshLink
End If
Next
db.TableDefs.Refresh
End Sub

というのを一回実行すればリンク先が変更されます。

ただ、アプリ.accdb も共有フォルダ内に置いて、みんなが使うのは、
アプリ.accdb が壊れる可能性が高まる。
アプリ.accdb のデータもネットワークを流れるのでパフォーマンスが良くない。
という点でお勧めできません。
アプリ.accdb は各ユーザーに配布して使ってもらった方が吉。
データ.accdb のバックアップも抜かりなく。

データ.accdb と アプリ.accdb が同じフォルダ内にあって
アプリ.accdb のリンク先を
その同じフォルダ内のデータ.accdbに設定するのなら、
VBAになりますが、アプリ.accdb に(例は標準モジュールです)

Sub reLink()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim lnkPath As String
Dim i As Integer

lnkPath = CurrentProject.path
Set db = CurrentDb
For Each tdf In db.TableDefs
If Len(tdf.Connect) <> 0 Then
tdf.Connect = ";DATABASE=" & lnkPath & "\データ.accdb"
tdf...続きを読む

QAccessで別テーブルの値をフォームに表示したい

初めてのAccessで分からない事があり質問させてください。

<会社テーブル>
会社ID
会社名
住所

<社員テーブル>
会社ID
社員名
ソート番号

*1社に対し複数の社員レコードが存在

以上のようなテーブルがあるとします

現在「会社テーブル」を表形式で一覧表示しています
会社ID,会社名、住所とフィールドが並んでいるのですが、その後ろに「社員テーブル」のソート番号が一番若い社員名を表示したいと考えています(現状は番号関係なく表示させる方法すら分かりません)

色々いじくりまわしたのですが、初めてAccessをさわる事もあってよくわかりません

リレーション等でひっぱってくる事ができるのでしょうか?

どなたか教えて頂けませんでしょうか

何卒よろしくお願い致します

PS.Access2013で作成中です

Aベストアンサー

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FROM 社員
ORDER BY 社員.ソート番号;

2、コントロールソースに次のように書きます。

=DLookUp("社員名","社員ソートクエリ","会社ID=" & [会社ID])

http://office.microsoft.com/ja-jp/access-help/HA001228825.aspx

DLookup()については、マイクロソフトの解説を参照されてください。

【DLookup()の限界を破るにはVBAで同じ関数を作るしかない】

マイクロソフトの解説を読めば判りますが、ORDER BY 節を指定する引数が用意されていません。ですから、どうしても、"社員ソートクエリ"を作成するという手間が必要となります。そこで、SQL文を引数とするDBLookup()をVBAで書けば、その手間を省けるという算段になります。この辺りは、好みと趣味の問題。どっちでも良いと思います。そういうお断りをした上で DBLookup()を紹介しておきます。なお、ADOは、つぎのように参照設定しないと利用できません。

http://www.happy2-island.com/access/gogo03/capter00307.shtml

Public Function DBLookup(ByVal strQuerySQL As String, _
             Optional ByVal ReturnValue = Null) As Variant
On Error GoTo Err_DBLookup
  Dim DataValue
  Dim rst     As ADODB.Recordset

  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      .MoveFirst
      DataValue = .Fields(0)
    End If
  End With
Exit_DBLookup:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)
  Exit Function
Err_DBLookup:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBLookup
End Function

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FR...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング