全局日期变量仅适用于输入值

时间:2014-07-15 19:11:44

标签: ms-access parameters datepicker global-variables ms-access-2010

我目前正在研究一个应该是一个相对简单的数据库,这个数据库非常接近于它,直到我遇到了不可避免的问题。

我使用全局变量和表单来收集参数以传递到查询的Criteria部分,这对前两个工作正常,它们是基本的字符串和整数。

只要您从DatePicker中选择了一个输入查询的日期,那么日期就会起作用。

例如,如果查询字段占用6/1 / 2014,6 / 3/2014和6/8/2014,并且选择了日期6/5/2014,则表单将崩溃并变为空白,但如果您选择2014年6月8日,那么它将继续进行。

我曾尝试过各种不同形式的代码,但最简单的形式是:

Between Get_Global('GBL_Start_Date_ID') AND Get_Global('GBL_End_Date_ID')

我不确定是否应该根据查询中输入的值限制DatePicker,或者是否有更强大的解决方法,或者我只是完全错过了一个简单的复选框

修改

我的全局变量代码如下所示:

Option Compare Database
Global GBL_Start_Date_ID As Date
Global GBL_End_Date_ID As Date
Global GBL_Customer_ID As Long
Global GBL_Engineer_ID As Long

Public Function Init_Globals()
GBL_Start_Date_ID = #6/1/2014#
GBL_End_Date_ID = #6/30/2014#
GBL_Customer_ID = 1
GBL_Engineer_ID = 1
End Function

Public Function Get_Global(gbl_parm)
Select Case gbl_parm
    Case "GBL_Customer_ID"
        Get_Global = GBL_Customer_ID
    Case "GBL_Engineer_ID"
        Get_Global = GBL_Engineer_ID
    Case "GBL_Start_Date_ID"
        Get_Global = GBL_Start_Date_ID
    Case "GBL_End_Date_ID"
        Get_Global = GBL_End_Date_ID
End Select
End Function

我只是在ComboBoxes和TextBoxes的AfterUpdate事件中添加一个简单的行来分配变量:

GBL_Engineer_ID = Me.EngineerSelection

提前致谢,

亚伦

1 个答案:

答案 0 :(得分:0)

你可以做两件事。修复查询,或使其更加健壮。

以书面形式修复

Between "#" & Get_Global('GBL_Start_Date_ID') & "#" AND "#" & Get_Global('GBL_End_Date_ID') & "#"

OR

更改Get_Global功能

Public Function Get_Global(gbl_parm)
    Select Case gbl_parm
        Case "GBL_Customer_ID"
            Get_Global = GBL_Customer_ID
        Case "GBL_Engineer_ID"
            Get_Global = GBL_Engineer_ID
        Case "GBL_Start_Date_ID"
            Get_Global = "#" & GBL_Start_Date_ID & "#"
        Case "GBL_End_Date_ID"
            Get_Global = "#" & GBL_End_Date_ID & "#"
    End Select
End Function

您在创建日期时使用GBL_Start_Date_ID正确指定GBL_End_Date_ID#的值是日期,但是当您在查询中使用它们时,它们会在没有它们的情况下显示。您可以通过在即时窗口中键入?#1/1/2014#向自己证明这是正在发生的事情。日期打印为1/1/2014,当您在查询中使用时,Between 6/1/2014 AND 6/30/2014会出现语法错误。

为了使事情变得更好,您需要参数化查询的这一部分。改变这个

Between Get_Global('GBL_Start_Date_ID') AND Get_Global('GBL_End_Date_ID')

到这个

Between pStartDate AND pEndDate

在调用查询之前,您需要进行常规检查:这些是否为null?是pStartDate< pEndDate

通过执行这些检查并对其进行参数化,您可以确保永远不会得到这样的查询。调用查询意味着您需要使用DAO或ADO填充参数。

Between AND