【问题标题】:optional parameters on report报告中的可选参数
【发布时间】:2020-06-25 10:51:54
【问题描述】:

我在 Microsoft Access 中有一个包含 10 个字段的表, 但我想过滤他们最多 5 个字段 我留下了 5 个复选框,并为任何一次 1 个组合框选择 1 到 5 个选项进行过滤,换句话说,对 5 个字段进行动态报告。 我的代码:

my New code changes:

Dim p1 As Long
Dim p2 As String
Dim p3 As String
Dim p4 As String
Dim p5 As String
p2 = "*"
p3 = "*"
p4 = "*"
p5 = "*"
p1 = 20500101
If (chbeckbox1 = True) Then p1 = combobox1
If (chbeckbox2 = True) Then p2 = combobox2
If (chbeckbox3 = True) Then p3 = combobox3
If (chbeckbox4 = True) Then p4 = combobox4
If (chbeckbox5 = True) Then p5 = combobox5
strCriteria = "([DateCutting]<=" & p1 & ") And [SystemName]= '" & p2 & "' And [CenterName]='" & p3 & "' And [TypeCutting]='" & p4 & "' And [ReporterName]='" & p5 & "'"
task = "select * from Cutting where (" & strCriteria & ")"
DoCmd.ApplyFilter task

定义 5 个变量和 .... 但我没有得到正确的结果或语法错误 什么是解决方案???

【问题讨论】:

  • 使用combobox1.Value等。然后,声明Dim p1, p2, p3, p4, p5 As String 它声明了除As Variant 之外的所有变量。 VBA 需要Dim p1 As String, p2 As String....。无需以这种方式初始化变量。他们最初是nullStringnothing""...
  • 尝试将Debug.Print p1 放在If (chbeckbox1 = True) Then p1 = combobox1 行之后,看看它在Immediate Window 中返回什么(在VBE 中为Ctrl + G)。
  • 好的,但是当我选择两个选项时,它没有返回任何记录
  • 我认为明星是一种价值。没有通配符
  • 这 5 个组合框是 UNBOUND 吗?用于用户输入标准的控件应该是 UNBOUND,否则会更改记录中的数据。有条件地构建标准字符串 - 查看allenbrowne.com/ser-62.html

标签: sql vba ms-access


【解决方案1】:

通常,星号 (*) 是 Access 中的通配符。 https://support.microsoft.com/en-us/office/access-wildcard-character-reference-af00c501-7972-40ee-8889-e18abaad12d1

日期/时间字段的参数需要 # 字符作为分隔符。 "([DateCutting]&lt;=#" &amp; p1 &amp; "#) And

如果变量类型未显式声明,则默认为 Variant。因此,在您的变量声明中,只有 p5 是 String 类型,其他 4 个是 Variant。 Variant 类型的默认值为空字符串。

您的标准是这样构建的,即使变量为空(null 或空字符串),仍然在连接中引用变量。结果可能是无效的条件字符串 - 就像为日期/时间字段传递空字符串一样。即使标准没有错误,输出也可能不是我们想要的。

不要传递空字符串,而是使用通配符 (*) 和文本字段参数并为日期/时间字段提供替代值。

或者,有条件地构建字符串,因此字段及其参数仅在存在值且用户已选择时才使用。

【讨论】:

  • 我将 CuttingDdate 定义为 Long Integer 类型,您在 CuttingDdate 上跳过其他 4 个参数考虑的问题是在 "where" 中,星号 (*) 被认为是一个值 NO WILDCARD,所以当在表中时是 * 值过滤器工作正常
  • 不太理解那个评论。星号绝对可以用作 WHERE 子句中的通配符。您是否在我的其他评论中查看了 Allen Browne 链接?如果 DateCutting 不是日期值,为什么字段名称中有 Date?
  • 好吧,我的意思是,当我得到正确的结果时,桌子上有 * 值。例如,如果我过滤到 [SystemName] 和 [CenterName] 如果用户在组合框中选择 SystemName 的值并左键选择 CenterName ,则当结果正确时,表字段 CenterName 有 * 值 NO ANY VALUE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多