当系统位置为美国时,如何在Access中管理硬编码(VBA)EU日期格式

时间:2017-07-06 13:54:49

标签: vba date ms-access ms-access-2013

这可能是一个黑暗中的镜头,有点奇怪,但它在这里..我们使用由第三方构建的Access 2003应用程序。它真的写得非常糟糕,但它通过大量的科学研究和验证来计算行为测量。这意味着我们无法修改任何应用程序。为了清楚起见,我们已经要求进行甚至小的更改或允许我们做出并且我们被拒绝(将措辞更改为z以更多的美国格式)......基于申请经过验证的理由而且任何应用程序中的更改将使结果数据无效。

以上内容非常重要,因为我们无法对MDB文件中的任何资产进行任何直接更改。任何解决方案都必须改变Access的行为,而不是改变局部性等系统范围的改变。也许是命令行开关或什么的。

存在的问题是,该应用程序是在欧盟国家编写的,因此符合欧洲地区标准硬编码到VBA中。如果在单个会话期间有一个命令行开关在Access上强制EU位置,这将是一个很好的解决方案......但是我找不到一个。

此问题仅在此应用程序中使用DATES公开。

只要需要日期输入,就会使用访问表单。它会弹出并按NAME请求月份,每天都是它自己的字段。例如出生日期。由于这些字段是单独填写的,因此VBA代码将它们连接成日期...仅使用EU格式。发布者根本没有考虑局部性。所以它按照美国格式放置DAY FIRST而不是Month。

这是一个问题,因为Microsoft使用的日期转换显然不会将欧盟格式的日期视为无效的美国日期,并且会很乐意将其转换为..错误占30%的时间。

因此,2000年5月10日的日期变为2000年10月10日,因为日期转换为“DD / MM / YYYY”或5/10/2000变为10/5/2000.10 / 5 / 2000是一个有效的美国格式化日期,但它不是用户输入的日期.MS认为这是美国的正确日期,因为从技术上讲它是,但在我们的日期,当12号以上的数字放入时,我认为这不是错误。当MS转换它时,MONTH位置.1 / 13/2000无效。由于MS算法只有12个月,显然只是将日期标识为EU格式并将其转换为美国格式...所以,13/5 / 2000年成为2000年5月13日,即使是13处于对美国地区无效的位置,但它会变成月份的日期,而5则变成月份数字。这些类型的日期因此而正确。 。5/13/2000变为13/5/2000但MS将其转换回5/13/2000但是5/10/2000变为10/5/2000并且MS不会将其转换回5/10/2000。 / p>

希望你到目前为止一直遵循这一点。

所以,正如我所说的,我需要一个不涉及更改应用程序的解决方案(表单,查询,vba或其他任何因为合法和科学我们不能),并且不涉及更改系统设置,如地点。任何解决方案都只需要影响访问,并且只在使用此单个数据库时影响它...即:命令行开关。

3 个答案:

答案 0 :(得分:4)

  

我们使用由第三方构建的Access 2003应用程序。它真的写得非常糟糕,但它通过大量的科学研究和验证来计算行为测量。这意味着我们无法修改任何应用程序。

不。这意味着您需要单元测试。制作备份副本,然后使用全面的测试套件涵盖所有复杂的科学功能(Rubberduck可以提供帮助)。

一旦你有一个带有绿色测试的正确测试套件,彻底验证了代码完成了它应该做的事情,你就可以自由地做出你想要的所有改变,包括如果你需要重构复杂的逻辑:如果你已覆盖所有执行路径,然后每个测试将保持绿色,这意味着代码仍然执行它所写的内容,或者某些将变为红色意味着您进行了修改,修改了一些不应修改的内容。每次测试都会产生一个单独的断言,单个红色测试意味着你知道完全什么破坏,在哪里以及如何。

“应用程序已经过验证” - 我称之为BS。如果没有单元测试,则没有验证。有人运行了代码,尝试了各种输入,并且已经批准了[APPROVED]。那不是验证。哎呀,那不是测试。无论如何都不是有用的测试。有用的测试特别 启用对应用程序进行更改,因为他们验证代码按照应该执行的方式执行的操作。

阅读Michael {Feathers的Working Effectively With Legacy Code。锁定一个因为它很关键而写得很糟糕的关键应用程序是彻头彻尾的愚蠢。

如果您无法添加适当的单元测试,并且无法修改任何内容,那么请不要报告错误:“已验证”程序将其错误视为功能 - 它的工作方式[破碎]因为那是怎么样,你无能为力。

答案 1 :(得分:3)

您可以尝试使用this onethis one等语言环境模拟器运行Access(不再支持最后一个)。此外,您可以在VM内部或在具有正确语言环境设置的其他计算机/服务器上运行它,并允许用户远程连接到它。

由于您既不能修改数据库也不能修改区域设置,因此我没有看到任何其他选项。

答案 2 :(得分:1)

日期值没有格式 - 但是:

  

它弹出并按照NAME,日期和年份分别请求它自己的月份   字段。

和 - 假设month是一个组合框,返回月份数 - 这些用于构建日期,如:

EnteredDate = DateSerial(Me!Year.Value, Me!Month.Value, Me!Day.Value)

日期是正确的。

因此应用程序可能会使用一些虚假的字符串来处理日期;如果是这种情况,并且您无法改变表格和方法,则无需做任何事情。

这很简单,所以你应该向开发人员解决这个问题。