VBA - Access 03 - 通过列表框迭代,使用if语句进行评估

时间:2010-05-31 17:35:45

标签: sql ms-access vba iterator access-vba

所以我有一个列表框,其中包含DeptA,DeptB,​​DeptC& DeptD。我有一个方法,如果它们适用,会导致这些自动填充在此列表框中。换句话说,如果它们填充在这个列表框中,我希望结果逻辑在表中的布尔字段中说它们是“是”。

所以为了实现这一点,我首先尝试使用这个迭代示例循环遍历列表框,并且效果很好:

dim i as integer
dim myval as string

For i = o to me.lstResults.listcount - 1
   myVal = lstResults.itemdata(i)
Next i

如果我调试.print myval,我从列表框中获取我想要的数据项列表。所以现在我正在尝试评估该列表,以便我可以使用UPDATE SQL语句来更新表,因为我需要它完成。

所以,我知道这是一个错误,但这是我试图做的(给它作为一个例子,以便你可以看到我想要到达这里)

dim sql as string
dim i as integer
dim myval as string
dim db as database

sql = "UPDATE tblMain SET "

for i = 0 to me.lstResults.listcount - 1
  myval = lstResults.itemdata(i)

    If MyVal = "DeptA" Then
        sql = sql & "DeptA = Yes"
    ElseIF myval = "DeptB" Then
        sql = sql & "DeptB = Yes"
    ElseIf MyVal = "DeptC" Then
        sql = sql & "DeptC = Yes"
    ElseIf MyVal = "DeptD" Then
        sql = sql & "DeptD = Yes"
    End If
Next i

    debug.print (sql)

    sql = sql & ";"
    set db= currentdb
    db.execute(sql)

    msgbox "Good Luck!"

所以你可以看到为什么这会导致问题,因为这些值(DeptA,DeptB等)自动填充的列表框是动态的...列表框中很少有一个值,而值列表每个OrderID的更改(我在使用此表单时首先填充信息;唯一实例)。

我正在寻找能够一次评估一个列表的东西(即迭代值列表,并查找“DeptA”,如果找到,则在SQL字符串中添加yes,如果不添加否为SQL字符串,然后进入下一次迭代)。即使列表框动态填充值,它们也是设置值,这意味着我知道最终会出现什么。

感谢您的帮助, 贾斯汀

1 个答案:

答案 0 :(得分:1)

我不明白你想要完成什么。但是,我怀疑你的UPDATE语句需要一个WHERE子句。 (' WHERE OrderID = X ',其中X替换为您正在编辑的行的OrderID)

我想你可以创建一个字典对象,其值最初设置为False。

Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "DeptA", False
dict.Add "DeptB", False
' .. etc.    '

然后浏览列表框中的项目,将dict值更改为True。

dict(myval) = True

最后,根据字典值构建UPDATE语句。

但这对我来说似乎太过分了。所以现在我想知道你的表格结构。 tblMain设置与此类似吗?:

OrderID DeptA DeptB DeptC DeptD
------- ----- ----- ----- -----
127     True  False False True

如果是,请考虑Dept信息的相关表格。

OrderID Which_Department
------- ----------------
127     DeptA
127     DeptD

管理这一点的经验法则是“列很昂贵;行很便宜”。

编辑:在我看来,您有两套商品:SetA是所有可能的商品; SetB是SetA的子集。您希望为SetB中的每个项生成True,并为每个不在SetB中的SetA项生成False。将 dict (字典对象)替换为SetA并将 lstResults 替换为SetB时,这是否正确?

我试图建议用所有可能的“DeptX”键加载 dict 并将它们指定为False。然后迭代 lstResults 并将其中的每一个(在 dict 中)更改为True。然后,从 dict 构建您的SQL语句。

Dim varKeys As Variant
Dim i As Integer
Dim strFragment As String

varKeys = dict.keys()
For i = LBound(varKeys) To UBound(varKeys)
    strFragment = strFragment & ", " & varKeys(i) & " = " & dict(varKeys(i))
Next i
strFragment = Mid(strFragment, 3)
sql = sql & strFragment & "WHERECLAUSE"