我正在开发一个设备管理系统,前端使用 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 中的 StartDate 和 EndDate 是预订的开始和结束,表 TBL_Usage 中的 Date_Out 和 Date_In 是注销的开始和结束。每个注销都通过外键 BookingID 链接到预订。如果 Date_In 为 NULL,则表示设备当前已注销。
LKUP_List 是我几年前开始工作之前的一个名称不佳的表,我从来没有费心去改变它。它包含设备类型的列表(除其他外)。预订是针对设备类型而非特定项目的,当用户注销其设备时,会在 TBL_Usage 中创建一条与特定设备相关联的记录。
如果有人对我应该采取哪个方向以及我可以在哪里寻求指导有任何想法,我将不胜感激。