Sql VBA-Access 03-遍历列表框,并使用if语句进行计算

Sql VBA-Access 03-遍历列表框,并使用if语句进行计算,sql,ms-access,iterator,vba,Sql,Ms Access,Iterator,Vba,因此,我有一个列表框,其中包含DeptA、DeptB、DeptC和DeptD等值。我有一个方法,可以使它们自动填充到此列表框中(如果适用)。换句话说,如果它们填充在这个列表框中,我希望结果逻辑在表中的布尔字段中表示“是” 因此,为了实现这一点,我首先尝试使用这个迭代示例循环遍历列表框,它非常有效: dim i as integer dim myval as string For i = o to me.lstResults.listcount - 1 myVal = lstResults

因此,我有一个列表框,其中包含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
如果我debug.print myval,我将从列表框中获取所需的数据项列表。因此,现在我尝试评估该列表,以便在需要时使用UPDATE SQL语句更新该表

所以,我知道这是一个错误,但这正是我试图做的(举个例子,这样你就可以看到我在这里试图达到的目的)

因此,您可以看到这将导致问题的原因,因为这些值(DeptA、DeptB等)自动填充的列表框是动态的……列表框中很少有一个值,并且每个OrderID的值列表都会更改(我使用的表单首先填充信息;唯一实例)

我正在寻找一个可以一次一个地计算这个列表的东西(即,遍历值列表,并查找“DeptA”,如果找到了,则在SQL字符串中添加yes,如果没有,则在SQL字符串中添加no,然后继续进行下一次迭代)。即使listbox动态地填充值,但它们是设置值,这意味着我知道它最终会得到什么

谢谢你的帮助,
贾斯汀

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

我想您可以创建一个dictionary对象,其值最初设置为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,用LSTRUSTS代替SetB,这样正确吗

我想建议的是用所有可能的“DeptX”键加载dict,并将它们分配为False。然后迭代您的结果,并将每个结果(在dict中)更改为True。然后,从dict构建SQL语句


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

我想您可以创建一个dictionary对象,其值最初设置为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,用LSTRUSTS代替SetB,这样正确吗

我想建议的是用所有可能的“DeptX”键加载dict,并将它们分配为False。然后迭代您的结果,并将每个结果(在dict中)更改为True。然后,从dict构建SQL语句


listbox的行源和行源类型是什么?听起来您没有遵循在这个问题中给出的建议,-您接受了答案,但在我看来,您再次尝试在应该使用子窗体时使用listbox。@Remou:type=ValueList,如果row-source=“”,则使用row-source=“”,然后您必须在代码中构建它,这意味着这些值对您可用。您可能喜欢考虑发布填充ListBox的代码。@ ReououRoSoe= =“DeTTA”;“DeptB”;“DeptC”;“DeptD”列表框的行源和行源类型是什么?听起来您没有按照在这个问题中给出的建议进行操作,-您接受了答案,但在我看来,您再次尝试在应该使用子窗体时使用列表框。@Remou:type=ValueList,如果row-source=“”,则使用row-source=“”,然后您必须在代码中构建它,这意味着这些值对您可用。您可能喜欢考虑发布填充ListBox的代码。@ ReououRoSoe= =“DeTTA”;“DeptB”;“DeptC”;“DeptD”我要求使用行源代码的原因是,从前面的问题中我怀疑这个列表框是用值构建的,所以简单地捕获行源代码应该很容易,特别是如果dept表与您的示例类似:
WHERE WHERE_department IN(“&Replace(x.RowSource),;”,“,”,“,”,“,”,“,“,”,“,”,“,“,”&”)中的哪个部门“
或大约。@Remou AFAICT列表框包含要更新为True的部门。若DeptA为True,但现在不在listbox中,则应将其设置为False。我喜欢您的RowSource方法,但我怀疑它仍然会涉及太多的工作。奥托,我想我不明白贾斯汀在想什么…@两个家伙…不是