14

いろいろ調べてみたところ、これは MS Access の制限のようです。そのため、他の人がこのパズルに対してどのような創造的な解決策を見つけたのだろうかと思っています。

連続フォームがあり、フィールドをその行に固有のオプションのコンボ ボックスにしたい場合、Access は配信に失敗します。コンボ ボックスの行ソースは、フォームの先頭で 1 回だけクエリされるため、フォームの残りの部分に間違ったオプションが表示されます。

もちろん、次のステップは、onCurrent イベントを使用してコンボ ボックスを再クエリすることです。これにより、実際には、オプションが特定の行に制限されます。ただし、この時点で、Access はおかしくなり、行ごとにすべてのコンボ ボックスを再クエリします。その結果、有効なオプションを選択したかどうかに応じて、他の行のオプションが消えたり再表示されたりすることがよくあります。現在のレコードの行ソース。

私が見つけた唯一の解決策は、利用可能なすべてのオプションを常にリストすることです。そこに創造的な答えはありますか?

編集また、コンボ ボックスの理由は、ルックアップ テーブルとしてクエリを使用するためであることに注意してください。人間が読めるバージョンが表示されている間、実際の値は非表示にして保存する必要があります...コンボ ボックスの行に複数の列ソース。したがって、制限をリストに変更しても役に立ちません。現在の行ソース クエリに含まれていない ID には、一致する人間が読み取れる部分がないためです。

この特定のケースでは、継続的なフォームは非常に理にかなっているので、それが間違った解決策だとは言わないでください。創造的な答えを求めています。

4

13 に答える 13

15

Access も嫌いですが、配られたカードでプレイする必要があります。この例のように、通常の場合のように、何らかの複雑さに遭遇するまでは、連続フォームは Access で素晴らしいものです。

この状況に直面したときに私がすることは次のとおりです(以前にも同様の回避策を実装しました):

UNBOUND コンボボックスをフォームに配置します。次に、編集するフィールドに BOUND textBox を配置します。

コンボボックスが textBox の後ろに隠れていることを確認してください (見えないのではなく、単に隠れているだけです)。

OnCurrent イベントで、listBox に必要なデータを入力します。先に進んで、それも「リストに制限」してください。

textBox の OnEnter または OnClick イベントで、コンボボックスにフォーカスを与えます。これにより、コンボボックスが前面に表示されます。フォーカスがコンボボックスを離れると、再び非表示になります。

コンボボックスの AfterUpdate イベントで、テキストボックスの値をコンボボックスの値に等しく設定します。

状況によっては、他の詳細を解決する必要がある場合がありますが、複雑になりすぎずに目標を多かれ少なかれ達成する必要があります。

于 2008-09-18T02:20:53.987 に答える
3

連続形式を使用する..間違いなく。実際、連続フォーム上に構築された優れた直感的なユーザーインターフェイスを使用して、アプリケーション全体を構築できます。トーストを聴かないでください!

利用可能なすべてのオプションを一覧表示するソリューションは正しいものです。実際、他にクリーンな解決策はありません。しかし、あなたがアクセスがおかしくなると言うとき、あなたは間違っています。連続フォームでは、各行を詳細セクションのインスタンスとして表示できます。コンボボックスは、詳細セクションのすべてのインスタンスに共通のプロパティです。このプロパティはすべてのインスタンスに対して更新できますが、特定の1つのインスタンスに対して設定することはできません。これが、Accessがすべてのレコードのコンボボックスに同じデータを表示する必要がある理由です。

このコンボボックスでレコード固有の値のみを受け入れる必要がある場合は、beforeUpdateイベントを使用して制御プロシージャーを追加してください。新しい値を受け入れることができない場合は、データの更新をキャンセルして、フィールドの前の値に戻すことができます。

リンクされたデータ(コントロールに格納されているデータ)が非表示になっている場合、limitToListプロパティを「No」に設定することはできません。これは論理的です。リンクされたフィールド(表示されていない)が空のままの場合、マシンはどのようにして新しいデータ行の入力を受け入れることができますか?

于 2008-09-17T22:01:32.363 に答える
1

ギリガンよりも簡単な方法があります。大変な作業のようですが、実際はそうではありません。私のソリューションでは、サブフォームデータシートとして連続フォームを使用する必要があります。私のサブフォームには、EquipmentとManufacturerと呼ばれる2つのルックアップコンボボックスがあります。どちらも、データソースに長整数キーを保持するだけです。メーカーは、機器で選択されたものでフィルタリングする必要があります。Manufacturer.RowSourceをフィルタリングするのは、Manufacturer_GotFocusイベントだけです。

プライベートサブManufacturer_GotFocus()

If Nz(Me.Equipment, 0) > 0 Then
    Me.Manufacturer.RowSource = GetMfrSQL()  '- gets filtered query based on Equipment
Else
    Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
End If

サブ終了

Manufacturer_LostFocusで、Manufacturer.RowSourceをすべてのManufacturersにもリセットしました。サブフォームを最初にクリックすると、実際にはフィールドを更新していなくても、Manufacturerを含むすべてのコントロールに対してGotFocusイベントが発生するため、これを行う必要があります。

プライベートサブManufacturer_LostFocus()

Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"

サブ終了

ManufacturerのEnterイベントで、Equipmentにフォーカスが設定されていない場合は、Equipmentが選択されているかどうかを確認する必要があります。

プライベートサブManufacturer_Enter()

If Nz(Me.EquipmentID, 0) = 0 Then
    '-- Must select Equipment first, before selecting Manufacturer
    Me.Equipment.SetFocus
End If

サブ終了

また、Form_Currentイベント(つまり、Me.Manufacturer.Requery)でManufacturerコンボボックスを再クエリする必要があり、このサブフォームのCycleプロパティを「CurrentRecord」に設定する必要があります。

簡単そうに見えますが、まだ終わっていません。また、ユーザーがManufacturerコンボボックスに移動したが、選択を行わずに親フォームのどこかをクリックした場合に備えて、親フォームのSubForm_ExitイベントでManufacturer.RowSourceをすべてのManufacturersにリセットする必要があります。コードサンプル(親形式):

Private Sub sFrmEquip_Exit(整数としてキャンセル)

Me.sFrmEquip.Controls("Manufacturer").RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"

サブ終了

まだきれいではないものが1つあります。[製造元]をクリックしてデータシートグリッドに複数の行がある場合、現在の行の製造元を変更している間、他の行の[製造元]フィールドは空白になります(コンボボックスの下のデータはそのままです)。このフィールドから移動すると、他のメーカーフィールドのテキストが再び表示されます。

于 2008-11-26T23:49:24.800 に答える
1

コンボボックスの値を編集不可能なテキストフィールドにしてから、ポップアップ/モーダルウィンドウを起動してその値を編集することもできます。ただし、それを行っている場合は、これらのウィンドウの1つでレコード全体を編集する傾向があるかもしれません。

于 2008-09-17T19:41:28.737 に答える
1

これはうまくいくようです。CBOsfrmTouchpoint8 は、ドロップダウン スクエアに短縮されたコンボボックスです。CBOsfrmTouchpoint14 は、残りのスペースを構成するテキスト ボックスです。絶対とは絶対言うな:

  Private Sub CBOsfrmTouchpoint8_Enter()  

  If Me.CBOsfrmTouchpoint8.Tag = "Yes" Then  
  CBOsfrmTouchpoint14.SetFocus  
  Me.CBOsfrmTouchpoint8.Tag = "No"  
  Exit Sub  
  End If  

  Me.CBOsfrmTouchpoint8.Tag = "No"  
  Me.CBOsfrmTouchpoint8.RowSource = "XXX"  
  Me.CBOsfrmTouchpoint8.Requery  
  Me.CBOsfrmTouchpoint8.SetFocus  
  End Sub 

  Private Sub CBOsfrmTouchpoint8_GotFocus()  
  Me.CBOsfrmTouchpoint14.Width = 0  
  Me.CBOsfrmTouchpoint8.Width = 3420  
  Me.CBOsfrmTouchpoint8.Left = 8580  
  Me.CBOsfrmTouchpoint8.Dropdown  
  End Sub

  Private Sub CBOsfrmTouchpoint8_LostFocus()  
  Me.CBOsfrmTouchpoint8.RowSource = "XXX"  
  Me.CBOsfrmTouchpoint8.Requery  
  End Sub 

  Private Sub CBOsfrmTouchpoint8_Exit(Cancel As Integer)  
  Me.CBOsfrmTouchpoint14.Width = 3180  
  Me.CBOsfrmTouchpoint8.Width = 240  
  Me.CBOsfrmTouchpoint8.Left = 11760  
  Me.CBOsfrmTouchpoint8.Tag = "Yes"  
  End Sub
于 2012-02-13T05:05:03.647 に答える
1

私は Access の連続フォームをまったく非難すべきだとは思いませんが、EDITING DATA では避けるべきだと確信しています。これらはリストに最適で、単なるリストボックスよりもはるかに多くの書式設定機能を提供します (もちろん、複数選択はできませんが、操作もはるかに簡単です)。

編集用のレコードへのナビゲーションに連続フォームを使用する場合は、編集用の詳細データを表示するサブフォームを使用し、サブフォームの PK 値をリンク フィールドに使用します。これは、連続フォームの背後にあるテーブルの PK にリンクされた詳細サブフォームをヘッダーまたはフッターに配置する連続フォームで実行できます。

または、連続フォームを使用して子データを親フォームに表示している場合は、詳細サブフォームを連続サブフォームの PK への参照にリンクできます。たとえば、次のようになります。

[MySubForm].[Form]!MyID

これがリンク マスター プロパティになり、MyID がリンクの子プロパティになります。

于 2008-09-17T23:51:03.053 に答える
1

私たちのアプリケーションでもこれによく遭遇します。私たちが見つけた良い解決策は、コンボボックス内のすべての行を表示することです。次に、ユーザーが特定の行でコンポボックスに入るとすぐに、(その行のフィルターを使用して) 行ソースを調整します。コンボボックスがフォーカスを失ったら、行ソースを再設定してすべてを表示できます。

于 2008-09-18T11:05:56.567 に答える
0

私にとって、最善かつ最も簡単な方法は、バインドされたすべてのフィールドに加えて、はい/いいえフィールドである追加のフィールドを持つ一時テーブルを作成することだと思います。

次に、このテーブルを連続 for のデータ ソースとして使用します。onLoad を使用して、一時テーブルに必要なデータを入力できます。

その後、選択肢をループするのは簡単だと思います。一時テーブルから yes/no フィールドを読み取るための小さなループです。

これが役立つことを願っています

于 2010-02-12T22:24:21.447 に答える
0

event を使用OnEnterしてコンボ ボックスにデータを入力します。fixed は使用しないでくださいrowsource

于 2010-03-10T18:45:56.103 に答える
0

より良い...

コンボ ボックスのコントロール ソースを、コンボ ボックスの値が格納されるクエリの列に設定します。

于 2009-03-08T15:41:37.820 に答える
0

「リストに制限」オプションをオフにして、更新前に検証を行って、ユーザーが入力した可能性のある内容が、提示したリスト内の何かと一致することを確認するとどうなるでしょうか?

于 2008-09-17T18:59:57.107 に答える
-1

免責事項:私は情熱を持ってアクセスを嫌います。

連続フォームは使用しないでください。彼らはあなたが達成したいことのための赤いニシンです。連続形式は、異なるデータで何度も繰り返される同じ形式です。同じフォームを複数回開くことはできないため、これはすでにAccessの通常の操作モードの手がかりです。表示されている動作は、Accessでは「設計どおり」です。これらのComboBoxコントロールのそれぞれは、実際には同じコントロールです。他の人に影響を与えずに1人に影響を与えることはできません。

基本的に、ここで行ったことは、Accessがプロジェクトに適さなくなった領域にぶつかります(ただし、すでに大量の作業を表しているため、捨てることはできません)。

ここで最も可能性の高い行動方針は、それを本当にうまく偽造することです。データに対してクエリを実行し、結果に基づいてプログラムでフォーム要素を作成します。Accessのデータ処理機能のかなりの部分を自分で複製するので、これはかなりの量の作業です。

編集への返信:
しかし、それがそうであるように、連続フォームはあなたが望むことを達成することはできません。だからこそ、私はあなた自身の連続フォームを偽造することを提案しました。なぜなら、連続フォームには、できることには実際の制限があるからです。特定の実装に固執して、それが機能しなくなったときにそれを手放すことができないようにしないでください。

于 2008-09-17T18:56:12.683 に答える