2012-11-14 24 views
0

我有两个表格,我们称之为T1和T2。 T1目前在它近600的记录,其中一个包含的ID号与另一其中包含一个标题,所以ID和TITLE:当他们都引用另一个表的ID时,如何根据输入到另一个字段的数据限制一个字段的多选选项?

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

T2具有一个ID字段,标题字段,接受标题字段,以及拒绝标题字段,所以ID,TITLES,ACCEPTED TITLES和REJECTED TITLES。访问表单使用多选ListBox从T1中选择一个或多个TITLES,然而很多都是必需的,但通常不超过十个。一旦条目进入T2的TITLES字段,这是对应于从T1中选择的标题的记录ID的数字,我希望T2中每个被接受的TITLES和REJECTED TITLES的组合框被限制为仅显示那些标题对应于输入到TITLES字段中的ID。所以,如果我在T2的标题领域,

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

我想下拉组合框,只显示对应于这些ID输入到标题领域的标题。因此,采取接受的TITLES领域,它可能是这样的:

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

我想我应该能够建立一个SELECT凡(...)语句,我可以在“行源使用“接受的标题和拒绝标题的属性。然后,列表将与选择的TITLES项目一样短,而不是长于600+条记录。这也完全消除了被接受的TITLES或REJECTED TITLES下的错误输入的可能性,因为这些标题只能从TITLES下输入的标题中选择。但是,我还不知道如何构建这样的SELECT语句。

任何援助将不胜感激。谢谢你的时间。

+0

我对'T2.Titles'发生了什么感到困惑。这些“T1.ID”是否连接在一起并用逗号分隔?为什么他们不都有自己的记录? – Brad

+0

T1表适用于个人作品。它包含作品的标题以及关于每件作品的信息,例如作品完成时间,单词数量等等等。 T2表跟踪对各种期刊的提交。还有另外一张包含期刊本身的表格,但这对我所要完成的目标并不重要。由于大多数期刊接受多种此类提交,T2的TITLES字段必须能够包含多个条目。 – Zahhar

+0

我已经可以从列表框中为这个字段选择多个标题。但是,我只想筛选一次以上的600多条记录。当我从期刊收到回复时,我想检查已被接受和/或被拒绝的标题,而不必每次筛选全部600多条记录。我只想从提交的标题中进行选择。 – Zahhar

回答

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和您正在检查的列表框的记录都相同,这些ID将始终正确排列。

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; 

(此表可与一列来组织,但要防止像“接受”和“接受标题”状态侵入,无论哪种方式,然后你就会有两个记录,这是同样的事情,但你不知道自然,寻找两者)

然后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' 
+0

让我来消化这个,看看我能不能找出你在这里提出的,但是我睡了一些之后。感谢您花时间提出此建议。 – Zahhar

+0

我想到你的反馈意见,并意识到我无法使用它们。然后,在解决另一个问题时,我遇到了ADODB.RecordSet(一旦在Tools-> References中选择了正确的引用就可以使用),并且意识到我可以利用我在解决其他问题时学到的知识来解决这个问题。我的示例代码单独发布并作为解决方案进行检查。 – Zahhar

相关问题