我们知道,在数据库中,每个数据表都是为完成不同的目标功能而设计的,其字段结构因设计目标不同而各具差异。
当需要对这些异构数据表做选定字段的查询操作时,就必须编制不同的程序代码或者定制不同的查询表单来实现。而如果需要查询的数据表比较多,查询代码或表单就会显得冗长而繁杂。
最近,笔者在开发本单位一个项目管理软件时,就遇到了类似问题。如何用一种通用方法实现对异构数据表的查询维护,减少程序代码冗余和系统开销,优化代码编制,提高运行效率,从而获取解决此类问题的通用途径。
而后经笔者分析,找到了一种可行的解决方案,现拿出来和读者一起分享,希望能够对读者有所启发和帮助。
笔者采用Delphi及Access作为应用软件制作工具。涉及通信、人才培训、幼儿教育、房地产租赁等15个服务行业。
查询需求比较简单,就是在一个查询窗口下,针对15个不同行业类别,结合其他查询条件实施组合查询。
图1 查询设计界面
系统查询界面设计如图1所示。通过行业下拉框,选择不同行业(数据表)类别,设计其他查询条件的下拉框或输入框,如所属单位范围、类别区分、当前状态、单位名称、项目名称、项目类别、责任人等,用户可以选取和输入查询条件,当条件发生变化时激活查询。
实现上述查询功能一般都会用到三种数据构件,一是数据表构件KaDaoTable或ADOTable,用于定位不同的行业数据表;二是数据显控构件DBGrid,用于显示查询结果;三是数据源构件DataSource,用于将数据表和数据显控构件进行关联。
虽然有15个行业的数据表,但我们不需要在系统中放置这么多的数据表构件,而只需要设置1个KaDaoTable或ADOTable数据表构件,通过简单的SQL语句,在程序中动态进行切换就可以了。
行业竞争程度因素(Marketc),通过Herf i ndahl-Hirschman指数对企业所属行业的竞争度进行检测(Kafetzopoulos 和 Psomas 2015)[14]。
数据源DataSource构件设置更简单,因为数据表构件只有1个,所以只需要在DataSource中静态设置好对应数据表构件名称即可。
图2 DBGrid构件栏目结构示例
数据显控构件DBGrid的设置就不一样了,因为不同行业的数据表,其字段结构基本上不同,有的甚至差异巨大,与之对应的DBGrid栏目数据项也就随之完全不相同。传统上可以利用两种方法实现显控:一是静态法。即放置多个DBGrid构件,分别对应不同的行业数据表,通过DBGrid构件的图形化设计界面,事先设计好显示栏目结构,运行时直接调用(如图2)。
二是动态法。即编制程序代码,在系统运行过程中根据不同行业表的选择,动态将需要显示的数据栏目添加到DBGrid构件中。
静态法的优点是几乎不需要编制程序代码,但缺点却显而易见,15个行业就需要增加15个DBGrid构件,构件冗余度高,系统资源开销大,运行效率低;动态法的优点正好和静态法相反,系统开销小,只需1个DBGrid构件,但需要我们编制相应程序代码进行显示控制。以下是动态添加1个DBGrid显示栏目的代码片断:
可以想像,动态添加1个显示栏目就需要至少6条语句,如果行业表的数据项较多,并且要求显示的DBGrid栏目也较多时,动态添加DBGrid构件显示栏目的程序代码会十分冗长繁杂。
因此,以上两种方法要么增加了系统资源开销,影响了执行效率;要么程序代码冗长,编制繁杂,达不到代码优化目标,都存在这样那样的问题。那么,有没有一种更好的实现方法呢?答案当然是肯定的。
导出方法旨在将显示栏目结构导出到一个指定的文件中进行保存,导入方法则正好相反,可以导入事先保存的显示栏目结构文件,用于结果显示。有了DBGrid构件这两个方法支持,同时针对DBGrid一些特殊栏目,如序号、合计等栏目的特殊应用处理,我们自然就有了可行的解决方案。
首先,生成DBGrid显示栏目结构文件。确定15个行业表需要显示的数据字段,通过DBGrid图形化界面对其进行编辑,然后针对每一个DBGrid设置一个“DBGrid显示栏目生成”按钮,在其OnClick事件中输入如下代码:
运行后,分别点击“DBGrid栏目生成”按钮,这样就生成了15个后缀为tcc的文件,这些文件中存放着15个行业的DBGrid数据表栏目结构,便于后续动态导入操作。
其次,动态构造KaDaoTable或ADOTable数据字段结构。主要完成两个步骤:一是切换数据表构件到对应的行业表;二是创建数据表构件静态字段,便于特殊处理。如前所述,从优化的角度考虑,我们只使用了一个数据表构件,因此在查询不同行业数据表时,就必须对KaDaoTable或ADOTable数据表构件进行切换,这可以通过编制SQL语句轻松实现。
此外,在切换到对应行业表后,还必须动态创建数据表静态字段结构。静态字段结构包括两个部分,一是行业表中自身所具有的字段,也就是常规字段部分;二是为完成特殊显控需求而自定义的字段,即特殊字段(Delphi也称之为计算字段)部分,如记录序号字段等。代码如下:
图3 行业数据表字段结构
由以上代码可见,除了个别特殊字段(如序号)需要命名、赋值及加载外,其他常规字段生成只需要一条循环语句即可完成。
这样,我们就通过简单的程序代码动态简洁地实现了复杂的静态设计,如图4所示。
最后,根据所选查询条件实施查询。该过程主要有两个步骤:一是选取查询条件;二是调入DBGrid显示栏目结构,显示查询结果。代码如下:
该方法可能只是在实现异构数据表查询维护中众多方法的一种,但简单可行,它充分利用了DBGrid构件方法,将不同数据表字段对应的显示栏目以文件的形式静态保存,系统运行时动态调入,同时,编制少量程序代码,动态生成个别特殊字段栏目(如序号、合计等),这样既方便了系统设计维护,又简化了程序代码编制,是一种实现异构多表查询维护的有效方法,希望通过此文起到抛砖引玉、举一反三的作用。