【问题标题】:SQL statement for combobox row source组合框行源的 SQL 语句
【发布时间】:2013-09-04 13:48:29
【问题描述】:

我正在尝试定义一个 SQL 语句以用作 MSAccess 表单上 ComboBox 的行源。 SQL 应该从表 tblI 中选择记录,其中特定表字段与用户设置的变体参数 varS 匹配;但是,如果 varS 为 Null 或不存在于另一个表 tblS 中,则 SQl 应选择 tblI 中的所有记录。

我可以对它的第一部分进行编码(varS 匹配或为空):

SELECT tblI.ID, tblI.S FROM tblI WHERE ((tblI.S = varS) OR (varS Is Null)) ORDER BY tblI.ID;

我正在苦苦挣扎的地方是合并最后一个元素(varS 不存在于 tblS 中)。我可以为 tblS 中没有 varS 编写一个测试代码:

Is Null(DLookup("[tbls.ID]","tblS","[tblS.ID]= " & varS))

但我不知道如何将其合并到 SQL 语句中。这应该有效吗?

SELECT tblI.ID, tblI.S FROM tblI WHERE tblI.S = varS OR varS Is Null OR DLookup("[tbls.ID]","tblS","[tblS.ID]= " & varS) Is Null ORDER BY tblI.ID;

当作为查询运行时,无论 varS 的值如何,它都会返回 tblS 中的每条记录。

表结构:

tblI 包含 2 个字段,Autonumber ID 和 Long S

tblS 包含 1 个字段,自动编号 ID

【问题讨论】:

  • "...用户设置的变体参数 varS" 您使用什么方法让用户为varS 提供值?
  • @HansUp 来源于ComboBox中选择的值;如果未选择任何值,则将其设置为 tblS 中不存在的值(类似于stackoverflow.com/a/18407742/1943174 中描述的内容)

标签: sql ms-access


【解决方案1】:

我自己解决这个问题的方法是这样的:

Private Sub SetComboSource(vID as Variant)
    Dim sSQL as String
    sSQL = "SELECT tblI.ID, tblI.S " & _
        "FROM tblI "
    If IsNull(vID) = False Then
        If IsNumeric(vID) = True Then
            If DCount("ID", "tblS", "ID = " Clng(vID)) > 0 Then
                sSQL = sSQL & "WHERE tblI.S = " & CLng(vID)
            End If
        End If
    End If
    sSQL = sSQL & " ORDER BY tblI.ID"
    Me.cboComboBox.RowSource = sSQL
End Sub

顺便说一句,我建议您为表和字段提供更具描述性的名称,然后在 SQL 中使用别名,尤其是表名。我也认为最好避免使用 Variant 变量。我通常将 Longs 用于这样的事情,我取一个小于 1 的值来表示用户没有选择任何东西,或者选择了 ALL,或者你想从中获得的任何含义。换句话说,我的 ID 始终是大于零的数字,而变量中小于 1 的 ID 意味着 ID 为空。我将其用作创建新记录或返回所有记录或在给定上下文中您想从中派生的任何含义的信号。

【讨论】:

  • 如果 ID 是自动生成的,如何确保它们始终大于零? (在实际代码中,I == Information,S == Source。)
  • 自动编号始终分配大于零的数字,除非您使用 Access 复制或 SharePoint 链接表。如果您正在使用 SQL Server,它允许您控制身份字段的“种子”。
  • 啊哈!全面使用 -1 会容易得多!
  • 或者你可以使用零。或者您可以使用零表示一种含义,使用-1 表示不同的含义。在这种情况下,您似乎不需要两种不同的含义。
【解决方案2】:

以下应该有效;

SELECT tblI.ID, tblI.S 
FROM tblI
WHERE tbl.ID=varS
OR varS NOT IN(SELECT ID from tblS)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    相关资源
    最近更新 更多