0

2 つのテーブルがあり、T1 と T2 と呼びます。T1 には現在 600 近くのレコードがあり、そのうちの 1 つには ID 番号が含まれ、もう 1 つにはタイトルが含まれているため、ID と TITLE:

T1
ID   | TITLE
-----|----------
1    | Title ABC
...  | ...
201  | Title XYZ
...  | ...
411  | Title 123

T2 には ID フィールド、Titles フィールド、Accepted Titles フィールド、および Rejected Titles フィールドがあるため、ID、TITLES、ACCEPTED TITLES、および REJECTED TITLES です。アクセス フォームは、T1 から 1 つ以上の TITLES を選択するために複数選択 ListBox を使用しますが、多くのタイトルが必要ですが、通常は 10 以下です。T1 から選択されたタイトルに対応するレコード ID の数値である T2 の TITLES フィールドにエントリが作成されると、T2 の ACCEPTED TITLES と REJECTED TITLES のそれぞれのコンボ ボックスで、それらのタイトルのみを表示するように制限する必要があります。 TITLES フィールドに入力された ID に対応します。T2 の TITLES フィールドに

T2
ID | TITLES        | ACCEPTED TITLES  | REJECTED TITLES 
---|---------------|------------------|----------------
1  | 1, 201, 411   |                  |                

ComboBox のドロップダウンに、TITLES フィールドに入力された ID に対応するタイトルのみを表示したいと考えています。したがって、ACCEPTED TITLES フィールドを取得すると、次のようになります。

T2
ID | TITLES        | ACCEPTED TITLES    | REJECTED TITLES 
---|---------------|--------------------|---------------
1  | 1, 201, 411   | | [ ] Title ABC  \/|
                     | [ ] Title XYZ   |
                     | [ ] Title 123   |

ACCEPTED TITLES および REJECTED TITLES の「Row Source」プロパティで使用できる SELECT WHERE IN (...) ステートメントを作成できるはずだと考えています。その場合、リストは 600 以上のレコードではなく、TITLES で選択されたアイテムと同じくらい短くなります。また、ACCEPTED TITLES や REJECTED TITLES は、TITLES に入力されたものからしか選択できないため、誤入力の可能性も完全に排除されます。しかし、そのような SELECT ステートメントを作成する方法はまだわかりません。

任意の支援をいただければ幸いです。御時間ありがとうございます。

4

2 に答える 2

0

解決策を見つけました。実際には、私が思っていたよりもずっと簡単です:

Public Function GetTitleIDs() As String
   Dim IDData As ADODB.Recordset
   Dim SubLookup As Variant
   Dim SelectSubmissions As String

   ' Should pull the same records and in the same order as '
   ' those found in originating Listbox '
   Set IDData = CurrentProject.Connection.Execute("SELECT [Poems].[ID], [Poems].[Title] FROM Poems ORDER BY [Title];")
   SubLookup = IDData.GetRows

   ' Submissions is the name of my originating Listbox. The rest remains unaltered. '
   Dim listrow As Integer
   For listrow = 0 To Me.Submissions.ListCount - 1
      If Me.Submissions.Selected(listrow) = True Then
         SelectSubmissions = ", " & SubLookup(0, listrow) & SelectSubmissions
      End If
   Next
   If Len(SelectSubmissions) > 0 Then
      SelectSubmissions = Right(SelectSubmissions, Len(SelectSubmissions) - 1)
   End If

   GetTitleIDs = SelectSubmissions
End Function

Private Sub Form_Current()
   ' Needed to update existing Listbox entry or entries when record is loaded '
   ' in form. If record is new, Listbox(es) will simply contain no records. This '
   ' can source all records for the fields you want in order to show existing '
   ' Listbox entries without fail. '
   Me.Declined.RowSource = "SELECT [Poems].[ID], [Poems].[Title], [Poems].[Year Completed], [Poems].[Blog Location] FROM Poems ORDER BY [Title];"
   Me.Accepted.RowSource = "SELECT [Poems].[ID], [Poems].[Title], [Poems].[Year Completed], [Poems].[Blog Location] FROM Poems ORDER BY [Title];"
End Sub

Private Sub Declined_GotFocus()
   ' Presumably your subset selection list gets focus after '
   ' checking list entries in originating Listbox. '
   Me.Declined.RowSource = "SELECT [Poems].[ID], [Poems].[Title], [Poems].[Year Completed], [Poems].[Blog Location] FROM Poems WHERE [ID] IN (" & GetTitleIDs & ") ORDER BY [Title];"
End Sub

Private Sub Accepted_GotFocus()
   Me.Accepted.RowSource = "SELECT [Poems].[ID], [Poems].[Title], [Poems].[Year Completed], [Poems].[Blog Location] FROM Poems WHERE [ID] IN (" & GetTitleIDs & ") ORDER BY [Title];"
End Sub

これにより、[送信] の下でチェックされている [拒否] および [承認済み] のオプションのみが表示され、選択オプションはこれらのフィールドに関心のある値のみに制限されます。パーフェクトだ。

IDData に割り当てられたレコードとチェック対象の ListBox の両方でテーブルと順序が同じである限り、ID は常に正しく並べられます。

于 2012-11-17T09:57:02.527 に答える
0

T2 (TitleStatus) のデザインを少し変えて提案します。

Create Table [TitleStatus] ([TitleID] Number, [StatusID] Number);
Create Index TitleIDindex ON [TitleStatus] (TitleID) WITH PRIMARY;

次に、ステータスを格納する別のテーブル。何かのようなもの

Create Table [Statuses] ([StatusID] Number, [StatusText] String);
Create Index StatusIDindex ON [Statuses] (StatusID) WITH PRIMARY;

(このテーブルは 1 つの列で編成できますが、どちらの方法でも、「承認済み」や「承認済みのタイトル」などのステータスが忍び寄るのを防ぎたいと考えています。その場合、同じものである 2 つのレコードがありますが、自然にはわかりません両方を探す)

次に、T2 (TitleStatus) は次のようになります

TitleStatus
TITLEID   | STATUSID
----------|----------
1         | 1
...       | ...
201       | 1
...       | ...
411       | 1
500       | 2

どこStatusesのように見えます

 StatusID | StatusText
 1        | Accepted
 2        | Rejected

あなたの挿入物はそこにかなり単純な形でなければなりません。

このように、受け入れられたすべてのタイトルを取得できます

Select T1.Title, Status.StatusText
From T1
Inner join TitleStatus TS on TS.TitleID = T1.ID
Inner Join Statuses S on S.StatusID = TS.StatusID
Where S.StatusText = 'Accepted'
于 2012-11-14T19:12:45.857 に答える