0

OpenFormメソッドで、正しいレコードがロードされたフォームを開くことができません。詳細を提供するために、ここで最善を尽くします。

「ソース」形式は表Aに基づいており、読み取り専用です。ソースフォームのボタンを使用して、レコードの編集に使用される「ターゲット」フォームを開きます。これも表Aからです。

ウィザードを使用して、主キーの同等性に基づいてフォームを開くボタンを作成してみました。ウィザードの結果は、ソースフォームのコンテキストにあるレコードに関係なく、テーブルAの最初のレコードのみがターゲットフォームによってロードされることです。

次のバリエーションの手順を使用してみました。

Dim frm As String, whr As String
frm = "Target Form"
whr = "Forms![Source Form]!ID = Forms![Target Form]!ID"
'whr = "[ID] = [ID]"
'whr = "[ID] = Forms![Target Form]!ID"
DoCmd.OpenForm frm, acNormal, , whr, , , 1

ターゲットフォームにロードする最初のレコードのみを取得するか、ターゲットフォームにロードする新しいレコードを取得することができました。しかし、ソースフォームのロードされたレコードを取得して、ターゲットフォームにロードされたレコードを判別できません。

助けてくれてありがとう

4

1 に答える 1

1

近づいたと思います。WhereConditionは、ターゲットフォームのレコードソースのクエリのWHERE句と同じである必要がありますが、WHEREという単語は含まれていません。

Dim frm As String, whr As String
frm = "Target Form"
whr = "[ID] = " & Me.ID
Debug.Print "whr: " & whr
DoCmd.OpenForm frm, acNormal, , whr

Me.IDは、名前がIDで、ソースフォームの現在のレコードのフィールドにバインドされているコントロールの値として意図していました。私は「このフォーム」の省略形です。これが役立つ理由の1つは、後でフォームに別の名前を付けることにした場合でも、コードを修正する必要がないためです。

Debug.Printステートメントを追加して、イミディエイトウィンドウ(Ctrl + g)に切り替え、whr文字列をコピーして、ターゲットフォームが使用するのと同じレコードソースに基づく新しいクエリに貼り付けることができるようにしました。これは、ターゲットフォームを開いたときに正しいレコードが表示されない場合に役立つ可能性があります。

お使いのバージョンには、OpenArgsからOpenFormへの1も含まれています。あなたがそれをどのように使っているのかわからなかったので、それをやめました。ターゲットフォームにOpenArgsで何かを行うイベントプロシージャが含まれている場合は、WhereConditionをオーバーライドしないようにしてください。

于 2011-10-05T18:56:50.447 に答える