我正在使用的前端的MS Access .mdb文件SQL Server 2008中的设备管理系统,并为后端。 如果需要,我可以在前端转换成MS Access 2010的文件。
我创建了一个日历形式,其中用户可以看到被黄牌警告什么设备,退出,或在到期。 它看起来像这样:
我提出这个使用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是预订的开始和结束,以及Date_Out和Date_In在表TBL_Usage是登出的开始和结束。 每个登出通过外键BookingID链接到预订。 如果Date_In为NULL,这意味着该设备目前已退出。
LKUP_List是开始之前,我曾在这一年内的工作,我从来没有困扰改变一个名为不善表。 它包含了设备类型的列表(除其他事项外)。 预订是设备的类型,而不是具体的项目,用户登录他们的设备,创建于TBL_Usage记录时,链接到一个特定的设备。
如果任何人有哪个方向的想法,我应该采取符合本和在哪里可以寻求指导,将不胜感激。
首先,42种形式的访问形式加载速度非常快,事实上,我已经做了好多年和42点的形式加载时间实际上是在瞬间完成的。
因此,这表明,这里的读者可以在这里忽略了一些评论这表明基于脚本或基于文本的解释系统,如HTML会在一定程度会更快一些类型的浏览器渲染系统的内部运行相比,它具有接近直接能力的窗户高性能的桌面应用程序直接写入到视频显卡。
请记住,如果你有简单和基本知识的Windows桌面应用程序可以接近直接写显卡则很少有人会尝试比较和建议,在HTML渲染系统在速度方面的比较,如果我们要比较的任何真正的希望这里有两个不同的架构。
因此,这里真正的问题是可以日历可以进行多快的速度运行,将42名的形式是一个问题?
答案很简单,就是42名的形式是不是一个问题,是快!
我的下列访问日历呈现近瞬间。
我的上述访问日历,即使在生产环境中已经使用了多年。 即使calendas拥有的每一天,无法容纳在屏幕上它是在加载时间instanct更多的数据。 相当数量的这些运行在桌面(客户端)更是创下一个SQL服务器后端OVER在网站上运行的标准互联网连接到SQL服务器的托管版本。 而即使在这种更有限的带宽情况下,加载时间和日历的反应是近乎即时的。 所以性能是没有问题的,无论我是否使用ACCDB(基于文件的)后端,使用SQL服务器后端,甚至更惊人的,所指出的形式与许多运行此访问日历OVER经常上网的我的客户的效果很好连接在其后端的SQL服务器上托管的网站运行。 我甚至有一个版本与SharePoint(名单)后台运行,再次运行没有问题,明显的延迟。
上述设计具有42点的形式,以及作为一个没有数据指出子形式绝对加载附近瞬间。 重要的是,这个国家,因此我提供了一些真实的世界和事实证据贬低那些谁显然不掌握和了解基本的计算机体系结构在这里提出的其他意见。 因此,这些人会认为42点的形式加载在某种程度上是问题减慢软件的时候,其实我可以很容易地证明这是不是这样的条款。 因此证人和其他人在这里的证词可以证明是没有法律依据,因此这种观点是基于计算机对基本操作是如何在我们这个行业的工作缺乏认识。 HTML不能希望在这里比较这样的设置。
和Access允许现在基于网络发言网络发布然后我张贴建于访问日历,在网页浏览器中运行的以下视频。 这个基于浏览器的日历只使用访问,而没有任何第三方工具构建的。
http://www.youtube.com/watch?v=AU4mH0jPntI
上述视频的结果表明,该日历应用程序的黄油顺利和迅速响应的基于Web的版本。
现在我应该指出,在上述的基于网络的例子我不在Web浏览器中使用42种形式,因为每个形式是单独的帧,并且使是从服务器发送的形式的重新呈现。 这意味着基于基于42个表单设计访问Web是出了问题。 您将在渲染方面遭受巨大的性能损失(即使因为XMAL形式没有数据按需加载,以节省时间,但在这种情况下,该设置伤害)。
然而,随着视频显示,基于对网络解决方案(同时也将努力为基于客户端)是填写在其中绑定文本框到表的表。 因此,具有一个记录显示被如所指出的和在上述视频显示示出了这样的结果意味着接近瞬时的响应并作为在Web浏览器甚至注意到。
我在强调基于WEB的应用程序,该视频只使用访问并没有其他工具构建。
现在又回到了性能问题和基于客户端的应用程序。 当然,问题是我们现在知道,装载42分的形式是不是一个问题。
当然,这个问题正在运行的所有类型的表达式42个独立的SQL查询与数据拉入那些子表单是其中的瓶颈和降低性能会发生。 因此,如果我们使用42个文本框,甚至42列表框,此性能问题不会改变。
所以,问题是,试图执行42个独立的SQL查询。 请记住,每个SQL查询需要一定的时间来分析,及时检查语法,然后查询计划等的建造。 事实上相当大量的行动面前数据甚至开始流动,对于一个给定查询出现。 我发现其实那一个查询可以是约10,000行数据流量的成本在带宽方面。
基于上述信息,为什么我与我的设计的42种形式可以加载并执行即时是由于我只执行一个查询返回的数据整整一个月的事实的原因。 换句话说,我执行与该开始日期和结束日期显示的查询。 我然后运行VBA代码以从所得reocrdset该数据处理成子形式1至42.因此,VBA代码充塞所得记录数据集合到42种的子形式。 因此,这是关键的概念,并建议在这里,以确保高性能计算和没有放缓。
因此,在总结和结论:
性能瓶颈不是使用42种形式的,但具有42分记录集和42个查询,以及潜在的额外代码,并且具有要被评估42倍表达式。 消除42个查询及42倍,并不必重新执行这样的SQL语句和这个瓶颈会非常蒸发。
我敢说,使用42个列表框,甚至只是42文本框,并继续执行42个这样的SQL语句不会产生任何性能上的改进值得。
有关日历有代表问,前不久: 创建在Access中“日历矩阵”
这就是说,你可能永远不会实现与绑定到不平凡的查询43子窗体不错的表现。
未成年人可能的改进
你是不是说,如果你的数据是后端服务器,在这种情况下,每个子窗体都有通过网络获取数据上。
如果是这样的话,你可能会更好做一个查询服务器把所有的数据和前端缓存它。 然后,您将只需要做一个本地表,这应该是更快简单的过滤,虽然42子窗体的可能会是一个很大的瓶颈性能。
一个简单的INSERT INTO
查询可以让你开始,只要你创建了一个称为本地表myCacheTable
根据您的正常查询返回的数据。
轻量级控件
首先,你应该尝试,它使用古老的listbox
。
这是相当轻巧,有很多方法对它们进行配置。
如果您结合起来,与缓存的数据来自正如我上面提到的服务器,你可以得到更好的性能。
基于Web的控制
作为HelloW提到的,它可能是简单地使用设置为文本框是一个好主意TextFormat = RichText
和简单的HTML提供给他们(它不支持多)到里面的数据格式:
全的网页
也许更复杂的设置了一下,但难以在UI方面击败,可使用现有的JavaScript库,例如FullCalendar ,或直接注入自己的HTML到浏览器文件(你可以使用简单的<table>
格式化日历)。
这是一个什么样的一个例子样品在线日历看上去像一个内部WebBrowser
中访问窗体控件:
我同意这个想法,这将在HTML效果最佳。
替换格式化为富文本的文本框每个子窗体。 然后在窗体加载(或其他事件)得到该月份和遍历其添加文本每个文本框的记录。 可用的HTML子集通常是足以让大多数你需要的格式。
注意事项
- 这将需要一些真实的想法尽可能的VBA去。 最有可能你的罚款与此,因为你已经得到了这么远。
- 仅存在一个查询,以便所述速度可更易于接受
- 你的关键HTML标签将
<br>
和颜色标签 - 你将不能够改变背景颜色只是文本颜色(我可能是错在这里)
另一种解决方案是使许多TextBox控件,每一个代表在日历天的纪录。
您运行1查询 - 快!
在通过每一个文本框控件VBA周期和分配给它的水平和垂直位置,内容(值),格式,可见性(你不需要证明那些没有数据)。
不好的一面是你必须提前决定许多文本框中如何控制你的需要和可能是这将是不够的,通过查询提供的所有记录。
为了克服这个问题,你可以arbitraryly决定,你有100个控制第一显示来自您的记录(例如,逾期)更重要的记录,并制作了一份说明,“不显示所有记录”。 如果用户希望看到的所有记录,他点击特定的日期,以及更详细的子窗体打开,这显示了该日期的所有记录。
我从来没有在日历试过,但我有甘特图形式,显示在时间条。 每个时间栏是一个TextBox控件。 我有120个控制和它的作品瞬间。
另一种解决方案是使用TCAL,我刚刚更新到1.4.2什么是TCAL版本? TCAL是一个客户端 - 服务器的跨平台的日历了一个完整的图形界面。 使用TcalServer和TCP / IP,TCAL记录事件,期限和工作时间为贵公司的个性化的FileMaker Pro,Microsoft Access或MySQL数据库文件。 您可以分配资源和作业名到您的活动,看其他资源日历,接受或拒绝邀请。 TCAL适用于Mac OSX和窗口(7或XP),并是免费的,为最多2连接的用户。 你可以在这里找到TCAL: http://www.tcal.it/eng/index.html