一个复合查询方法

2016-01-29 16:16 14 1 收藏

一个复合查询方法,一个复合查询方法

【 tulaoshi.com - SQLServer 】

  几乎每个完整的应用程序都会需要一个复合查询。建立一个功能强大的复合查询首先必须要能够动态生成查询条件,其次应该能够对查询到的数据进行修改,最后这个复合查询最好能够对一对多的两个表建立条件进行查询。

在VFP里建立查询的方法主要有这么几种:一是使用VFP中自带的SearchClass类;二是建立一个查询;三是建立一个视图,其中包括参数化视图、宏替换Sql语句视图;四是建立一个Grid,将其数据源设置为SQL语句或临时表。

不管哪一种方法,其实质都是使用SQL语句。

这几种方法各有各的优点,也都有缺点。

建立查询的方法最死板,只能建立固定条件的查询,并且不能更新数据,最不能满足要求。

SearchClass类功能强大,但是它只能对一个表建立条件进行查询,并且它的源代码太复杂了,几乎难以进行修改定制;(初学者想必都有过用表单向导建立表单后试图修改txtbtn类、SearchClass类的经历吧!看到源代码后有几个没昏倒?)用将Grid的数据源设置为SQL语句或临时表的方法无法修改/更新数据,刷新数据也比较困难。(这方面的问题在网易虚拟社区VFP版上有过许多讨论,大家可以去看看。)建立视图的方法中,参数化视图也太简单。不管是用表单控件的值作参数还是用给参数两端加上引号的方法都只能对固定的字段进行查询。如果是复合查询,难道要先建立几十个视图吗?最有前途的办法还是用宏替换SQL语句建立视图的办法。视图有着能够对数据进行修改/更新的优点,如果能够动态生成查询条件,那么就是最完美的查询了。

建立宏替换sql语句视图的具体办法是先动态生成一个Sql语句sqlstatement,然后用宏替换的方法使用Create Sql view viewname as &sqlstatement来动态建立视图,最后将数据动态显示在一个Grid控件中。

看到这里,VFP大虾们怕会大喊:Stop!你当我是菜鸟啊!你的办法从理论上虽然行的通,但实际做起来就会碰到查询结果在表格上数据无法刷新的难题。俺早就试过不行了!你想骗稿费啊!

嘿嘿,这个难题偏偏给我解决了!这就是我洋洋得意的写这篇文章的原因!

问题的解决

==========

几个月前(好可怜^0^.....),我参照VFP的Sample中的Solution里的Interactively Bulid a sqlstatement示例建立了一个复合查询,想将它集成到我自己的程序中。由于该示例是用browse窗口来显示查询结果的,而我自己的应用程序使用了顶层表单,结果编译后运行才发现Browse窗口在顶层表单中无法显示。于是我建立了一个有两个表单的表单集,用一个表单makesql动态生成sql语句,在另一个表单form1上用grid来显示查询结果的数据,在给Grid设置数据源的时候,问题来了。首先使用临时表来作为表格的数据源,结果第一次查询正确,更改条件进行第二次查询时碰到了众所周知的"不能更新临时表"的错误;使用sql语句倒是可以,可是在表格显示数据前会莫名其妙的先出现一个Browse窗口,必须关闭它后才会显示表格,由于browse窗口在使用顶层表单的程序中无法显示,结果导致程序无法继续执行,这个办法也不行。

最后只能使用Create sql view viewname as &sqlstatement的办法了,先随便建立一个视图tempview,把表格的Recordsourcetype属性设置为1-别名,Recordsource属性设置为视图别名tempview,在表单makesql上建立sql语句后的代码中使用create sql view temp view as &sqlstatement建立视图Tempview.
执行后发现,第一次查询正确,更改查询条件后再次查询,出现"视图已存在,要改写吗?"的情况,按下"确定"后,出现的表格中没有数据。

避免出现对话框的问题好解决,在建立视图前先用rename view tempview to oldview,然后用Delete view oldview将旧的视图删除就可以了。代码如下:

****************************************************************************

set database to databasename &&databasename是你的数据库名称

&&注意:即使你打开了数据库也必须写这个语句!否则会出现"找不到数据库"的错误。

if used("tempview")

rename view tempview to oldview

delete view oldview

endif

Create sql view tempview as &sqlstatement

=requery()

IF _TALLY = 0

#DEFINE MSG_LOC "没有找到符合条件的纪录!"

#DEFINE TITLE_LOC "没有找到纪录"

=MESSAGEBOX(MSG_LOC,64+0+0,TITLE_LOC)

ELSE

thisform.hide

thisformset.form1.show

Endif

*****************************************************************************

但是这样做了以后,表格上没有数据的问题仍然存在。查找资料后发现,用Create sql view语句编程建立视图的方法,建立视图后要先保存视图定义,再打开视图后视图中才有数据。因此,必须将Creatsql view语句部分代码修改如下:

************************

来源:https://www.tulaoshi.com/n/20160129/1498118.html

延伸阅读
iphone4s版本查询方法 Verizon 版的 iPhone 5 均为无锁机! 判断依据 iPhone 盒子上的型号,如上tulaoshi图的 MD277LL/A 即可作为判断 iPhone 4S 版本的依据。如果你的盒子和 iPhone 并不对应,那么打开【设置】-【通用】-【关于本机】,以查看到的【型号】数据为准。 合约版 iPhone 4S 知道了 iPhone 4S 的...
手机58同城车辆违章查询方法   手机58同城车辆违章查询方法。58同城提供快递查询、违章查询、生活号码簿、空气质量查询、找代驾、优惠券、房贷计算器等服务和工具。接下来小编先来带大家看看手机58同城车辆违章查询方法。 1)打开,接着在首页热门服务区点击。 2)输入车辆信息后点击,即可查询记录。
标签: MySQL mysql数据库
       数据库系统是管理信息系统的核心,基于数据库的联机事务处理(OLTP)以及联机分析处理(OLAP)是银行、企业、政府等部门最为重要的计算机应用之一。从大多数系统的应用实例来看,查询操作在各种数据库操作中所占据的比重最大,而查询操作所基于的SELECT语句在SQL语句中又是代价最大的语句。举例来说,如果数...
标签: 手机 智能手机
1、首先我们要找到移动的官网,点击‘中国移动”进入官网。 2、在首页的上方点击登录按钮,大家记得要选择自己所在的省份,这个是很重要的。 3、在这个页面输入信息进行验证,需要输入验证码和服务密码什么的。服务密码不知道的同学可以拨打10086咨询一下。4、登录成功后点击“详单查询”,如图所示。 5、在这里再次输入...
微信公交换乘查询方法   微信公交换乘查询方法。出行前是否需要先查询一下交通路线?微信城市服务快速帮你查询公交换乘路线。出行不担忧。接下来小编就教大家微信公交换乘查询方法。 1)打开微信进入微信钱包,点击,接着点击。 2)起止地点。将可以查看换乘方案。

经验教程

55

收藏

13
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部