VB中利用DataBase巧妙设置DataReport中的动态SQL

来源:互联网 发布:python os 复制 编辑:程序博客网 时间:2024/06/03 15:59

    近日分析一VB做的报表,由于对VB只是了解,谈不上熟练,不过对其水晶报表倒有点认识,之前也做过三两个小的报表 ,加之对PB中的报表了解非常熟悉,当时信心蛮大的。
    先是看了DataReport,用于绘制报表格式。再来看DataEnvironment,用于定义获取的数据列。将DataReport与DataEnvironment绑定后就可获取数据了。
    基于这个思路还算是简单,做个简单的不带参数条件的SQL通过了。不过打开报表的界面无法自定义,如加个查询的按钮,让查询的条件与报表显示在同一个界面中,(PB实现就太简单了)。想到一个与DataReport差不多同名的ActiveX-DataRepeat,(想通过ActiveX加载该DataReport,这样就可在自定义界面上显示这个Report)先看看再说,结论是两码事。DataReport用于设计报表,Datarepeat与DataGrid类似数据底层转换处理的。(只怪英文差,应该从字面上可以理解这个DataRepeat与Report是两码事,不过这种精神值得提倡,没有调查就没发言权。)
    无参数的SQL是没问题,下面就是有参数的了。分析别人的程序是件可怕的事,特别是对VB不熟,加上别人使用的另类方法,更是一头雾水。这回我就遇上了。
    代码中没有去处理DataEnvironment,虽然DataReport都与DataEnvironment绑定了,但属于静态式绑定。原作者使用的是DataBase,通过OpenDatabase一个MDB文件,再在QueryDefs子类中去动态设置SQL,这样就将相当于对参数传入了。开始时照猫画虎了,程序未报错,可检索后没有按查询条件来检索。DataEnvironment中我定义了的CmdText方式,将报表需要的列都给出来,Where 条件给不出来,因为条件是在界面中录入的。分析下原有的DataEnvironment,使用的是CmdTable方式,与内部的视图直接对应,可我这无法对应表,我的SQL是多表关联。
    “遇到问题,你baidu了吗?”,这话非常流行。那就先找找相关资料,无赖原来这们仁兄使的招数太偏,无果。
    继续分析,原来那位仁兄使用了DataBase来与Report打交道,那就查查QueryDefs,该技术好像失传了一般,只能在MSDN上看到English帮助,也没看到DataBase与DataReport相关的,只有段样例是可以用来设置一个Sql语句。
    换个角度看问题,既然看不到真正意义的帮助,那就自已了解,还好VB中有这个调试查看器,Debug动态跟踪再看看DataBase对象,DataBase为一数组,通过opendatabase的方法打开了一个MDB数据库,DataBase为一数组,数组序列就是其MDB中的表与视图。看样子DataBase是只接接管数据库。
    现在猜测版的结论出来了。原来那位仁兄使用DataEnvironment获取数据时的CmdTable是个假象,只是用于定义些虚的列,用于在DataReport设计时引用这些列。DataReport是静态与DataEnvironment绑定,代码无需处理。最后的动态SQL是将原来的视图中的SQL进行替换,这样DataBase中的数据就是一个动态的视图,它在执行过程中进行调整。原先定义的视图只是为于满足设计时定义这些引用的数据列。
    照此思路,DataEnvironment中还得使用那个虚的视图,即还得用CmdTable方式,引用那个虚的视图,在使用时再动态调整这个视图中的内容。不出所然,检索成功了。

原创粉丝点击