尝试在 Microsoft Access 中制作高效的日历

2023-12-15

我正在开发一个设备管理系统,前端使用 MS Access .mdb 文件,后端使用 SQL Server 2008。如果需要,我可以将前端转换为 MS Access 2010 文件。

我创建了一个日历表单,用户可以在其中查看哪些设备已预订、注销或过期。它看起来像这样:

enter image description here

我使用 42 个子表单制作了这个,不幸的是速度很慢。对于上面显示的数据,加载只需要大约 5 秒,但是一旦我使用真实数据,它就开始真正陷入令人无法接受的困境。我尝试通过将子表单的源对象保留为空白直到它们显示,并且直到此时才加载记录源,从而提高效率。这足以使上面的示例运行得相当快,但对于实际数据来说仍然不够。

所以我想做的是,要么找到一种方法在仍然使用子窗体的情况下提高效率,找到另一个可以代替子窗体的控件,要么用列表框切换子窗体,但仍然能够格式化颜色的行。我知道这对于列表框来说是不可能的,但我是一名程序员,如果不会浪费太多时间,我愿意尝试对列表框进行子类化来执行此操作。不幸的是,我从未做过任何 vba 子类化,因此需要向我指出一些好的资源才能这样做。

设置每天子表单的记录源的代码如下:

f("sub" & X & Y).Form.RecordSource = "SELECT * " & _
                                     "FROM QRY_Calendar " & _
                                     "WHERE CDate(StartDate) <= #" & curDate & "# " & _
                                     "AND ((EndDate IS NULL OR CDate(EndDate) >= #" & curDate & "#)" & _
                                     IIf(CDate(curDate) <= Date, " OR ((Date_In IS NULL OR CDate(Date_In) >= #" & curDate & "#) AND Date_Out IS NOT NULL)", "") & ") " & _
                                     "ORDER BY IIF(Date_Out Is Not Null And (Date_In Is Null Or CDate2(Date_In)>=#" & curDate & "#) And CDate2(EndDate)<#" & curDate & "#,0,iif(CDate2(Date_Out)<=#" & curDate & "# And (Date_In Is Null Or CDate2(Date_In)>=#" & curDate & "#),1,2)), ID"

QRY_Calendar 看起来像这样:

SELECT B.ID, Person, Initials, ProjectNum & '-' & ProjectYear & '-' & Format(TaskNum,'000') AS Project, Sign_Out_Code, Value AS Type, StartDate, EndDate, Date_Out, Date_In
FROM (((TBL_Booking AS B INNER JOIN TBL_Person AS P ON B.PersonID = P.ID) INNER JOIN LKUP_List AS T ON B.EquipTypeID = T.ID) LEFT JOIN TBL_Usage AS U ON B.ID = U.BookingID) LEFT JOIN TBL_Equipment AS E ON U.Equipment_ID = E.ID;

表TBL_Booking中的StartDate和EndDate是预订的开始和结束,表TBL_Usage中的Date_Out和Date_In是签出的开始和结束。 每次注销都通过外键 BookingID 链接到预订。如果 Date_In 为 NULL,则表示设备当前已注销。

LKUP_List 是一个名字很糟糕的表,在我几年前开始工作之前,我从来没有费心去改变。它包含设备类型的列表(除其他外)。预订针对设备类型而不是特定项目,当用户注销其设备时,会在 TBL_Usage 中创建一条链接到特定设备的记录。

如果有人对我应该朝哪个方向以及我可以在哪里寻求指导有想法,我将不胜感激。


首先,Access 表单上 42 个子表单的加载速度非常快,事实上我已经这样做很多年了,42 个子表单的加载时间实际上是瞬时的。

因此,这表明读者可以忽略这里的一些评论,这些评论表明,与具有近直接能力的 Windows 高性能桌面应用程序相比,基于脚本或基于文本的解释系统(例如 HTML)在某种类型的浏览器渲染系统中运行速度会更快直接写入视频显卡。

请记住,如果您了解 Windows 桌面应用程序几乎可以直接写入显卡的简单和基本知识,那么很少有人会尝试进行比较,并且如果我们要进行比较,则建议 HTML 呈现的系统真正有希望在速度方面进行比较这里有两种不同的架构。

因此,这里真正的问题是日历的运行速​​度有多快,42 个子表单会成为问题吗?

答案很简单,42 个子表单不是问题,而且速度很快!

我的以下 Access 日历几乎立即呈现。

enter image description here

我的上述 Access 日历即使在生产环境中也已使用多年。即使日历每天都有更多无法显示在屏幕上的数据,它的加载时间也是即时的。其中很多正在运行,其中桌面(客户端)通过标准互联网连接到 SQLServer 后端,连接到网站上运行的 SQLServer 托管版本。即使在这种带宽更有限的情况下,日历的加载时间和响应也几乎是即时的。因此,无论我是否使用 accDB(基于文件)后端、使用 SQLServer 作为后端,性能都没有问题,更令人惊奇的是,正如所指出的,该表单与我的许多客户通过常规互联网连接运行此 Access 日历配合得很好。其后端是在托管网站上运行的 SQLServer。我什至有一个与 SharePoint(列表)后端一起运行的版本,并且它再次运行时没有问题和明显的延迟。

上述设计有 42 个子表单,并且如无数据所述,子表单绝对接近即时加载。声明这一点很重要,因此我提供了一些现实世界和事实证据来贬低那些显然不掌握和理解基本计算机体系结构的人在此发表的其他评论。因此,这些人会认为 42 个子表单的加载在某种程度上是一个降低软件速度的问题,而事实上我可以轻松地证明事实并非如此。因此,这里其他人的见证和证词可以被证明是没有根据的,因此这种观点是基于对我们行业中计算机的基本操作如何工作缺乏了解。 HTML 无法与此处的此类设置进行比较。

说到基于 Web,Access 允许进行 Web 发布,那么我将发布以下在 Access 中内置并在 Web 浏览器中运行的日历的视频。这个基于浏览器的日历仅使用 Access 构建,没有任何第三方工具。

http://www.youtube.com/watch?v=AU4mH0jPntI

上面视频的结果显示了此日历应用程序的基于 Web 的非常流畅且即时响应的版本。

现在我应该指出,在上面基于 Web 的示例中,我没有使用 42 个子表单,因为在 Web 浏览器中,每个表单都是一个单独的框架,并导致重新呈现从服务器发送的表单。这意味着对于基于 Access Web 的基于 42 个子表单的设计是不可能的。您将在渲染方面遭受巨大的性能损失(即使自 XMAL 表单按需加载以来没有数据以节省时间,但在这种情况下,此设置会受到影响)。

然而,正如视频所示,基于 Web 的解决方案(也适用于基于客户端的解决方案)是填写一个表格,在其中将文本框绑定到该表格。因此,如上述视频中所指出和所示,具有一个记录显示表明这样的结果意味着接近瞬时响应,并且甚至在网络浏览器中也如此。

我强调基于 WEB 的应用程序,因为该视频仅使用 Access 构建,没有使用其他工具。

现在回到性能问题和基于客户端的应用程序。当然,我们现在知道加载 42 个子表单不是问题。

当然,问题是运行 42 个带有各种表达式的独立 SQL 查询来将数据拉入这些子表单,这就是瓶颈和性能缓慢的地方。因此,如果我们使用 42 个文本框,甚至 42 个列表框,这个性能问题不会改变。

所以问题是尝试执行 42 个单独的 SQL 查询。请记住,每个 SQL 查询都需要时间来解析、检查语法,然后构建查询计划等。事实上,在某个给定查询的数据甚至开始流动之前,必须发生相当多的操作。事实上,我发现一次查询可能会消耗大约 10,000 行数据流的带宽。

根据以上信息,我的设计中这42个子表单之所以能够瞬时加载并执行,是因为我只执行一个查询来返回整个月的数据。换句话说,我使用显示的开始日期和结束日期执行查询。然后,我运行 VBA 代码将生成的记录集中的数据处理到子表单 1 到 42 中。因此,VBA 代码将生成的记录集数据填充到 42 个子表单中。这是这里的关键概念和建议,以确保高性能计算并且不会降低速度。

所以总结和结论是:

性能瓶颈不在于使用 42 个子表单,而在于拥有 42 个记录集和 42 个查询,并且可能需要计算 42 次额外的代码和表达式。消除 42 次查询和 42 次并且必须重新执行这样的 SQL 语句,这个瓶颈几乎就会消失。

我敢说,使用 42 个列表框,甚至只是 42 个文本框并继续执行 42 条这样的 SQL 语句不会产生任何值得的性能改进。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试在 Microsoft Access 中制作高效的日历 的相关文章

  • 在 VBA 中循环合并单元格

    是否可以循环遍历合并的单元格vba questions tagged vba 我的范围内有 6 个合并单元格B4 B40 我只需要这 6 个单元格中的值 6 次迭代 上面的答案看起来已经让你排序了 如果您不知道合并的单元格在哪里 那么您可以
  • 如何在字符串vba中包含引号

    我想存储以下文本 Test1 Monday Test Abcdef 全部在字符串中包含引号 我知道要在字符串中包含引号 我必须包含 之前 但在这里这不是一个很好的解决方案 因为我在文本中有太多这样的解决方案 知道如何一次完成这一切吗 您有两
  • 将 pandas 数据帧拆分为子数据帧列表的最快方法

    我有一个大数据框df我有完整的清单indices中的独特元素df index 我现在想创建一个由元素索引的所有子数据帧的列表indices 具体来说 list df df loc x for x in indices 运行这个命令需要很长时
  • 如何使用 SSIS 将多个 Access 数据库导入到 SQL Server

    我有一个文件夹 其中包含 300 多个 Access 数据库 由我无法控制的程序编写 它们都有相同的结构 只是一张表 我正在将数据导入到 SQL Server 2005 中的表中 使用导入向导效果很好 但它一次只能用于一个 Access 数
  • 优化 LATERAL join 中的慢速聚合

    在我的 PostgreSQL 9 6 2 数据库中 我有一个查询 该查询根据一些股票数据构建计算字段表 它为表中的每一行计算 1 到 10 年的移动平均窗口 并将其用于周期性调整 具体来说 CAPE CAPB CAPC CAPS 和 CAP
  • 复制一张工作表上的静态范围,然后根据单元格中的单个值粘贴到另一张工作表中的动态范围

    我对这个问题分为三个部分 我在 Sheet1 A1 中有一个带有周数的单元格 我在 Sheet1 B1 F1 中有一个需要复制的静态范围 然后 我需要将该值粘贴到 Sheet2 中的动态范围中 偏移量为行的周数 这是我正在为我经常使用的工作
  • Android 性能:SharedPreferences 的成本

    当我的应用程序启动时 我使用分片首选项中的值填充容器类 这个想法是处理 SharedPreferences 和 PreferenceManager 一次 因为我猜它们很重 这是一个示例 SharedPreferences prefs Pre
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • Pandas dataframe:每批行的操作

    我有一个熊猫数据框df我想计算每批行的一些统计信息 例如 假设我有一个batch size 200000 对于每批batch sizerows 我想要一列的唯一值的数量ID我的数据框 我怎样才能做这样的事情呢 这是我想要的一个例子 prin
  • 哪些属性有助于运行时 .Net 性能?

    我正在寻找可用于通过向加载器 JIT 编译器或 ngen 提供提示来确保 Net 应用程序获得最佳运行时性能的属性 例如我们有可调试属性 http msdn microsoft com en us library k2wxda47 aspx
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 当使用公式生成超链接时,VBA 打开 Excel 超链接不起作用

    使用公式生成的 Excel 超链接似乎存在错误 我使用的是 Excel 2010 我有一个电子表格 其中的单元格包含 URL 我的目标是执行以下两件事 将这些单元格变成超链接 创建一个键盘快捷键来打开这些超链接 这样我就不必使用鼠标了 为了
  • 添加冗余赋值可以在未经优化的情况下编译时加快代码速度

    我发现一个有趣的现象 include
  • * 到底有多慢?

    大家都表示 选择器非常慢 但它到底有多慢呢 我总是试图避免它 但有时它非常有用 例如 h1 margin top 1em 简单来说 通用选择器 速度只与页面上的元素一样慢 Since 从右到左匹配浏览器获取每个元素并将其与所有候选规则进行匹
  • R、Rcpp 与 Armadillo 中矩阵 rowSums() 与 colSums() 的效率

    背景 来自 R 编程 我正在扩展到 C C 形式的编译代码Rcpp 作为循环交换 以及一般的 C C 效果的实践练习 我实现了 R 的等效项rowSums and colSums 矩阵的函数Rcpp 我知道它们以 Rcpp 糖的形式存在 并
  • 所以,我有 6 个“主”文件,然后分为 40 个单独的文件

    我将简要描述我想要的内容 我有 6 个 主 文件 每个文件包含 40 个工作表 如下所示 AG 工作簿有 HR Gp 1 到 HR Gp 40 ER 工作簿有 FB Gp 1 到 Gp 40 等 所有工作表都已 平坦 我已经成功创建了一个适
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V

随机推荐

  • 如何在MSVC中有效地将两个__m128d转换为一个__m128i?

    转换然后移位然后按位或是从两个转换的唯一方法 m128d到一个单一的 m128i 这对于 x64 构建中的 Xcode 来说是完全可以接受的 m128d v2dHi m128d v2dLo m128i v4i mm set epi64 mm
  • 如何杀死 C# 线程?

    我有一个线程在我们的 旧 SQL 服务器上查找数据 当数据进入时 我将信息发布到模式对话框中 在所有这些处理正在进行时 用户不能也不应该做任何其他事情 模式对话框只是让他们看到我正在做某事并防止他们同时运行另一个查询 有时 很少 当代码调用
  • 如何在 vi 搜索和替换中包含正斜杠

    我有一个包含字符串的文件usrbin 我想寻找usrbin并将其替换为 usr bin I tried s usrbin usr bin g 但它显示错误E488 Trailing characters 如何在搜索和替换中包含正斜杠 这里有
  • Enterprise Library 6 验证配置文件

    我正在尝试学习 EnterpriseLibraryValidatoin 当我配置 TypeValidation 通过配置文件验证类时 它不会拾取 但是当我添加数据注释时它会正确验证 我不知道我是否遗漏了一些东西 请提供任何帮助 验证配置文件
  • JS:仅过滤非空和字符串值类型的数组

    我正在尝试过滤这样的数组 array filter e gt return e 有了这个我想过滤所有空字符串 包括undefined and null 不幸的是 我的数组有一些不应该存在的数组 因此 我还需要仅检查字符串值并删除所有其他值
  • 通俗地说,Ruby 自我?

    Ruby self 什么时候引用 Object 什么时候 self 引用 Ruby 类 带有示例的解释会很棒 我不明白这个问题 类本身就是对象 假设我有一堂课Person 这实际上是一个实例Class 所以你可以让 self 引用 Arti
  • 在 Javascript 中将数字连接为字符串

    myCoolObject a 0 b 12 c 24 我想串联a b and c使它们看起来像一个唯一的字符串 a b c 或示例中的 0 12 24 a b and c总是代表数字 将它们中的每一个从 int 转换为 string 需要大
  • 未找到整数 parseInt 方法

    我正在尝试在这段代码中测试一个简单的方法 您在其中使用接收参数的方法 正在发生的问题是Integer解析 int 方法 命令提示符给出的错误是 java 24 error cannot find symbol cholo Integer p
  • 清除 QGraphicsScene 中的小部件:崩溃

    我有一个 QGraphicsScene 里面有一个 QPushButton 清除这个场景将使我的应用程序崩溃 有没有正确的方法来使用 QWidget 清除场景 单击按钮时以下代码会崩溃 include
  • python:multiprocessing.Pipe 和重定向标准输出

    我在用multiprocessing包生成第二个进程 我想将 stdout 和 stderr 重定向到第一个进程 我在用multiprocessing Pipe object dup2 output pipe fileno 1 Where
  • VS 2010 Ultimate:将 ProteusDebugEngine 调试器附加到进程失败

    当将 C NET 4 项目加载到我的主机 Win 7 Ultimate 64 位 上的 VS 2010 Ultimate 中时 我收到错误消息 Attaching the ProteusDebugEngine debugger to pro
  • 使用“.gitattributes”文件修复 Git 存储库中的行结尾

    需要修复什么 我有一个包含单个 md文件 其中包含我正在写的一篇文章 我在几台不同的计算机上编辑该文件 其中一台运行 Linux 另一台运行 Windows 看着一个git diff现在在 Windows 中我做了一些更改 我可以看到我的文
  • @RequestMapping 未正确映射

    我正在尝试设置一个控制器 但不幸的是无法查看输出 一切都正确渲染 当我去http localhost 8080 CMT content edit我收到 404 页面 从 Netbeans 运行我的应用程序会转到http localhost
  • 多对多 Ajax 表单(Symfony2 表单)

    我在 mongodb 中玩家和锦标赛之间存在多对多关系 我希望能够一次将许多玩家添加到锦标赛中 如果没有 ajax 这很简单 但我们有一个包含数千名玩家的数据库 因此表单选择变得巨大 我们想为此使用 ajax 是否可以创建一个小部件 带有j
  • 创建安装程序:从注册表项读取安装路径(例如 wix/installshield/nsis)

    我想创建我的程序的安装程序 但由于安装相当复杂 我需要比 installshield 限量版更高级的东西 我必须从当前的安装程序中运行另一个安装程序 用户是否按 取消 或安装该程序并不重要 我只需要运行它即可 我必须在用户计算机上安装一个包
  • XMl 解析中的空指针异常

    我需要解析 Xml 文档并将值存储在文本文件中 当我解析普通数据 如果所有标签都有数据 时 它工作正常 但如果任何标签没有数据 那么它会抛出我需要的 空指针异常 要做的 为了避免空指针异常 请建议我使用示例代码 示例 XML
  • 无法使用 Laravel SMTP 驱动程序将邮件发送到 gmail 帐户并且没有收到错误

    我正在 Localhost 中构建 Laravel 5 8 应用程序 我这样配置我的 env 文件 MAIL DRIVER smtp MAIL HOST mail mydomain com MAIL PORT 465 took from m
  • 隐式转换没有警告

    g sizeofint cpp std c 11 Wconversion Wall Wextra Werror pedantic errors include
  • Django 的 Cron 示例

    我在互联网上搜索了 Django 中计划作业的工作示例 但我只能找到如何做 但没有给出例子 有人可以分享 Django 框架使用 cron 运行计划任务的工作示例吗 首先创建一个自定义管理命令 该命令将用于将任务添加到 crontab 这是
  • 尝试在 Microsoft Access 中制作高效的日历

    我正在开发一个设备管理系统 前端使用 MS Access mdb 文件 后端使用 SQL Server 2008 如果需要 我可以将前端转换为 MS Access 2010 文件 我创建了一个日历表单 用户可以在其中查看哪些设备已预订 注销