【问题标题】:MSACCESS Form VBA Open Where Clause - US v AU Date FormattingMS ACCESS Form VBA Open Where 子句 - US v AU 日期格式
【发布时间】:2018-03-28 15:44:07
【问题描述】:

大家早上好, 这应该是一个简单的修复,我已经四处搜索并找到了看起来它们应该工作的东西,但它们似乎没有......

所以 - 这是一个简单的“打开此表单并仅显示该日期的记录”功能,您猜对了,日期格式的好美国是问题,无论我尝试哪种方式都无法解决问题问题...

所以 - 这是表单代码...

DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , "# " & NEWDATE & " #"

查找 NEWDATE...

我从几个组合框(CBOYear 和 CBOMonth)和一个表示当月日期的字段中删除日期组件(数据将采用“1st”或“2nd”等格式......)

我连接各个组件...

NEWDATE = DateSerial(TempYear, TempMonth, TempDate)

一个 msgbox NEWDATE 弹出窗口会产生正确的数据(即 1/3/18)

但是当我运行代码时,它要么选择所有内容,要么什么都不选择...该函数唯一起作用的时间是当日字段为 13 或更高(即 13/3/18)时 - 因此它可以确定正确的格式一起工作。

我确信正确的答案已经在某处 - 但是正确的问题可能是我没想到要搜索的东西。

我曾尝试在表单打开代码之前和之内使用 DATEVALUE()。我试图对美国格式进行硬编码,看看是否可行......

DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , "#3/1/18#"

不好...显示所有记录 - 如果我对 AU 格式 #1/3/18# 进行硬编码,则相同

我的电脑设置为 AU 格式 dd/mm/yy

所以...在调用 Openform 之前,我需要使用哪个函数将 AU 日期字符串转换为美国日期字符串,以便打开正确的记录?或者有没有更好的方法在 Docmd 行中编写 WHERE 子句来实现这个结果? - 或者我是否需要将我的所有日​​期字段重置为美国格式并仅在表格上将它们转换回 AU?

感谢您的反馈...

【问题讨论】:

    标签: ms-access-2010 where-clause date-formatting


    【解决方案1】:

    在 VBA 和 VB6 中,无论用户的日期格式设置如何,使用 # 语法的日期文字总是采用 M/dd/yyyy 格式。这是 VBA/VB6 在本地化成为问题之前在美国开发的遗产(美国是 the only country 使用不合逻辑的 MM/dd/yyyy 格式)。

    注意它是 M/dd/yyyy 而不是 MM/dd/yyyy - 所以请省略任何前导零。

    这在此处记录:https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/data-types/date-data-type

    同样的规则也适用于 Access SQL 中的日期文字(与 VBA/VB6 不同)。幸运的是,在 SQL Server 中,您总是在引号中使用 ISO 8601 yyyy-MM-dd 格式……但对 Access 感到羞耻。

    【讨论】:

    • 抱歉没有前导“0” - 我尝试了链接中的解决方法格式建议 - 我将其格式化为美国和澳大利亚格式,但无济于事......所有记录都在打开......任何其他选择或建议?
    • @Dude 你能逐字发布你的整个函数/子吗?包括任何全局变量和模块范围的变量?我需要看到全貌。
    • prev 评论因代码太长而失败... - 我可以将文本文件上传到此站点或发送给您吗?不知道这是如何工作的
    • @Dude 编辑您现有的问题并将您的代码放在那里而不是在评论中。
    【解决方案2】:

    您只需为您的日期值设置一个格式正确的字符串表达式 - 以及正确的语法:

    Dim NEWDATE As Date
    Dim WhereCondition As String
    
    NEWDATE = DateSerial(TempYear, TempMonth, TempDate)
    WhereCondition = "[NameOfYourDateField] = #" & Format(NEWDATE, "yyyy\/mm\/dd") & "#"
    
    DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , WhereCondition
    

    【讨论】:

      【解决方案3】:

      您的第一个问题是您没有将NewDate 与某物进行比较。

      您的第二个问题是您使用字符串连接按日期过滤,这会导致日期错误。

      您可以查看this answer,了解在 Access 中使用参数的不同方式。

      您的最终代码应该如下所示:

      NEWDATE = DateSerial(TempYear, TempMonth, TempDate)
      DoCmd.SetParameter("NewDateParam", NEWDATE)
      DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , "SomeDateField = NewDateParam"
      

      或者,如果可能有时间与日期一起存储:

      NEWDATE = DateSerial(TempYear, TempMonth, TempDate)
      DoCmd.SetParameter("NewDateParam", NEWDATE)
      DoCmd.OpenForm "frm_Prod_Runs_Edit_List", , , "SomeDateField - NewDateParam < 1"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 2016-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多