- ベストアンサー
Access2000で同じIDを持つフォームを開く方法
- Access2000で単票フォーム上のボタンを押すと、同じIDを持つフォームが開く方法について教えてください。
- 請求書番号連番を取得するフォームと顧客データ入力フォームがあり、同じIDで結びついています。請求書番号連番取得フォーム上のボタンを押すと、顧客IDに紐づくフォームが開ける方法を知りたいです。
- 初心者ですが、Access2000で同じIDを持つフォームを開く方法を教えてください。請求書番号連番取得フォーム上のボタンを押すと、顧客IDに紐づくフォームが開けるようにしたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 意味合いが違ってましたね。 「顧客ID」に対応した「フォーム名」情報がテーブルで作られているとします。 もしくは、「顧客ID」と A社、B社、C社 などが紐付けされ、その社ごとに「フォーム名」情報が得られるとすると ボタンがクリックされた時の処理例) Private Sub ボタン_Click() Dim sForm As String Dim sWhere As String Dim sArg As String sWhere = "請求書番号='" & Me.請求書番号 & "'" sArg = "'" & Me.請求書番号 & "'" sForm = DLookup("フォーム名","テーブル名/クエリ名","顧客ID='" & Me.顧客ID & "'") DoCmd.OpenForm sForm, , , sWhere, , , sArg End Sub 呼ばれた各「請求データの入力フォーム」での処理 Private Sub Form_Open(Cancel As Integer) If (Me.Recordset.RecordCount = 0) Then Me.請求書番号.DefaultValue = Me.OpenArgs DoCmd.GoToRecord , , acNewRec '☆ Me.ラベル1.Caption = "新規" '☆ Else '☆ Me.ラベル1.Caption = "既存" End If End Sub ※「顧客ID」に対応した「フォーム名」情報ではなく、「会社名」なり「会社ID」が得られるのであれば以下のような感じかと (会社IDが得られるとした場合) Private Sub ボタン_Click() Dim sForm As String Dim sWhere As String Dim sArg As String sWhere = "請求書番号='" & Me.請求書番号 & "'" sArg = "'" & Me.請求書番号 & "'" Select Case DLookup("会社ID","テーブル名","顧客ID='" & Me.顧客ID & "'") Case 1 sForm = "請求データの入力フォームA" Case 2 sForm = "請求データの入力フォームB" Case 3 sForm = "請求データの入力フォームC" Case Else sForm = "請求データの入力フォームETC" End Select DoCmd.OpenForm sForm, , , sWhere, , , sArg End Sub
その他の回答 (3)
- 30246kiku
- ベストアンサー率73% (370/504)
#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
- ベストアンサー率73% (370/504)
「請求データの入力フォーム」では、全社のデータを扱えられる様になっているとします。 「請求データの入力フォーム」を表示させる時に、顧客ID/請求書番号 で絞込みします。 下記 sWhere 部分で生成&指定 絞込み後、レコード件数が0件だった場合、新規レコードに移動します。 その時、OpenArgs 経由で得られる、顧客ID/請求書番号 を既定値として表示します。 よって、請求書番号連番取得フォームでボタンをクリックする際、既にデータがあるかどうか気にせずに処理できます。 ボタンがクリックされた時の処理例) Private Sub ボタン_Click() Dim sWhere As String Dim sArg As String sWhere = "顧客ID='" & Me.顧客ID & "' AND 請求書番号='" & Me.請求書番号 & "'" sArg = "'" & Me.顧客ID & "','" & Me.請求書番号 & "'" DoCmd.OpenForm "請求データの入力フォーム", , , sWhere, , , sArg End Sub 呼ばれた側「請求データの入力フォーム」での処理 Private Sub Form_Open(Cancel As Integer) Dim vTmp As Variant vTmp = Split(Me.OpenArgs, ",") If (Me.Recordset.RecordCount = 0) Then Me.顧客ID.DefaultValue = vTmp(0) Me.請求書番号.DefaultValue = vTmp(1) DoCmd.GoToRecord , , acNewRec '☆ Me.ラベル1.Caption = "新規" '☆ Else '☆ Me.ラベル1.Caption = "既存" End If End Sub ※ '☆コメントは、新規/既存が対象なのか、ラベル表示する時の例 (「ラベル1」名のラベルを作成し、コメントを外した時有効) ※ 連結されていること、フィールド名とテキストボックス名が同じことが前提の例です。 ※ 新規の場合、顧客ID/請求書番号は既定値として表示しているだけなので、他の項目を編集しないと登録されません。
- inspire11
- ベストアンサー率33% (1/3)
現在自宅のため、記憶の範囲でお答えします。 フォームのボタン作成ウィザードでボタンを作成します。 フォームの操作→フォームを開く を選択。 特定のフォームを開く。を選択。 それで、開くフォームのリンクIDが選択できるはずです。 Access2003を使っているので、2000でこの機能が無ければゴメンナサイ。
お礼
inspire11さん、ありがとうございます。 2000でもおっしゃっている機能はありましたが、私が思っているのと同じ動きはしてくれませんでした・・・。 特定のCDは引き継げるのですが、そのCDから独立して存在するフォームをそれぞれ開くことは出来ませんでした。 私の設定がいけないのでしょうか・・・?
お礼
30246kikuさん、ありがとうございます! お恥ずかしいながら、本当に初心者で、ご回答頂いたことを理解するのにも精一杯な状況です・・・。 おそらく、Select Caseの方になるのかな?と思いますが、 解読しながら、当てはめてみます。 ありがとうございます! また、疑問や補足等ありましたら、どうか宜しくお願い致します。
補足
30246kikuさん、度々申し訳ありません。 どうも、「DoCmd.OpenForm sForm, , , sWhere, , , sArg」でひっかかって実行できませんでした。。。 仕組みがどうもわからなく、前記の呼ばれた各「請求データの入力フォーム」での処理~という意味すらわかりません・・。 これはどういう意味なのでしょうか? 単純に、あるコントロール(この場合、顧客ID)が「aaa」の場合にボタンを押すと、「フォームaaa」を開く、 bbbの場合はフォームbbbを開く・・・というようなことをしたいのですが・・・・。