#2、#3です。
私も変に解釈しているかもしれないので
(#2、#3ミックスした方がよいかも)
フォームが複数あって、顧客IDがそれにぶら下がる、というのを以下で考えました。
運送会社が複数あって、その時の発送伝票を入力する。
顧客IDにより使う運送会社が違う。
運送会社A社 顧客ID 0001 / 0003 / 0005 など
運送会社B社 顧客ID 0002 など
運送会社C社 顧客ID 0004 / 0006 など
その他 顧客ID 0007 など
テーブル例
運送会社テーブル
運送会社ID, フォーム名, 運送会社名, ・・・
顧客テーブル
顧客ID, 運送会社ID, 顧客名, 住所, ・・・
という構成になっていたとして、
運送会社テーブル内容例
1, "フォームA", "XXXX運送"
2, "フォームB", "YYYY運送"
3, "フォームC", "ZZZZ運送"
4, "フォームD", "一般・・・"
顧客テーブル内容例
"0001", 1, "XXXX 一郎", "東京都・・・"
"0002", 2, "XXXX 二郎", "北海道・・・"
"0003", 1, "XXXX 三郎", "千葉県・・・"
"0004", 3, "XXXX 四郎", "大阪府・・・"
"0005", 1, "XXXX 五郎", "埼玉県・・・"
"0006", 3, "XXXX 六郎", "兵庫県・・・"
"0007", 4, "XXXX 七郎", "沖縄県・・・"
起動される側のフォームA / フォームB / フォームC / フォームD のレコードソースには、そのフォームを使用する顧客ID全てに対して表示できるように指定しておきます。
例えばフォームAの場合は、
SELECT 顧客ID FROM 顧客テーブル WHERE 運送会社ID=1;
で、フォームAを使用する顧客IDが抽出されます。
それを、請求データテーブルの顧客IDと結合させると、フォームAで扱う全データが得られます。
ただ単にフォームAを表示しただけでは、全てが表示されるので、フォームを起動する時点で絞込み指定します。
その指定部分が sWhere 部分になります。
> sWhere = "顧客ID='" & Me.顧客ID & "' AND 請求書番号='" & Me.請求書番号 & "'"
顧客IDと請求書番号で絞込みを指定しますが、既に登録されていた場合はそのものが表示されます。
ここで問題としたのが、請求書番号が登録されていなかった場合、何も表示されません。
この時には、顧客IDと請求書番号を表示した新規レコードに移動してほしいと思ったので、顧客IDと請求書番号を ,(カンマ)区切りの文字列とし、呼ばれた側に教えてあげる方法として OpenArgs 部分を使用しました。
> sArg = "'" & Me.顧客ID & "','" & Me.請求書番号 & "'"
(起動時に指定した sWhere は、呼ばれた側で Me.Filter の文字列として得ることができますが、そこから必要な部分を抜き出すのが面倒だったので)
呼ばれた側では、Me.OpenArgs で得られた文字列から、顧客IDと請求書番号を分離します。
> vTmp = Split(Me.OpenArgs, ",")
vTmp(0) で顧客ID / vTmp(1) で請求書番号
でこれを、顧客ID/請求書番号のテキストボックスの既定値に設定し、新規レコードへ移動かけています。
既定値の設定は、値の代入ではないのでレコードは編集状態にはなりません。
sWhere / sArg の扱いは、#2の方がよいと思います。
> If (Me.Recordset.RecordCount = 0) Then
の部分は表示対象のレコードが何件あるか、この時点でわかるので判別に利用。
また、運送会社テーブル構成で、フォーム名を持たない場合には、
顧客テーブルより、対象の顧客IDの運送会社IDを拾ってきて
Select Case DLookup("運送会社ID","顧客テーブル","顧客ID='" & Me.顧客ID & "'")
Case 1
sForm = "フォームA"
Case 2
sForm = "フォームB"
Case 3
sForm = "フォームC"
Case Else
sForm = "フォームD"
End Select
のようにすればよいと思います。
※ 呼ばれた側の処理は各フォームで必要になります。
※ 実際のものと違ったものでの説明になってしまいましたが、わかりましたでしょうか
※ 運送会社テーブル/顧客テーブルの構成は単なる説明上での例です。
実際にはもう少しテーブルを追加したり、例外など考慮されると思います。
お礼
30246kikuさん、ありがとうございます! お恥ずかしいながら、本当に初心者で、ご回答頂いたことを理解するのにも精一杯な状況です・・・。 おそらく、Select Caseの方になるのかな?と思いますが、 解読しながら、当てはめてみます。 ありがとうございます! また、疑問や補足等ありましたら、どうか宜しくお願い致します。
補足
30246kikuさん、度々申し訳ありません。 どうも、「DoCmd.OpenForm sForm, , , sWhere, , , sArg」でひっかかって実行できませんでした。。。 仕組みがどうもわからなく、前記の呼ばれた各「請求データの入力フォーム」での処理~という意味すらわかりません・・。 これはどういう意味なのでしょうか? 単純に、あるコントロール(この場合、顧客ID)が「aaa」の場合にボタンを押すと、「フォームaaa」を開く、 bbbの場合はフォームbbbを開く・・・というようなことをしたいのですが・・・・。