一个复合查询方法

几乎每个完整的应用程序都会需要一个复合查询。建立一个功能强大的复合查询首先必须要能够动态

生成查询条件,其次应该能够对查询到的数据进行修改,最后这个复合查询最好能够对一对多的两个表建

立条件进行查询。

在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 sql

statement示例建立了一个复合查询,想将它集成到我自己的程序中。由于该示例是用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语句编

程建立视图的方法,建立视图后要先保存视图定义,再打开视图后视图中才有数据。因此,必须将Creat

sql view语句部分代码修改如下:

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

Create sql view tempview as &sqlstatement

use

use tempview

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

满以为这下问题解决了,结果更惨。出现的表格上不但没有数据,连表头、网格都不见了!这个问题

百思不得其解,查找资料也没有结果,最后不了了之,一直困扰了我几个月。

就在昨晚,我上床的时候突然灵光一现:既然表格无法动态加载数据源视图,那么干脆连包含表格的

表单也动态生成!只要表单动态生成,那么表单上的表格对象的数据源不就完全重新加载了吗?也用不着

刷新什么的了!而且,用这个方法也用不着先建立一个tempview视图,完全在程序中动态生成就可以了。

主意一定,马上下床动手。将原来包含表格的表单form1删除,在上述的代码中最后一句

thisformset.form1.show前插入以下代码:

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

thisformset.addobject(“form1“,“form“)

with thisformset.form1

.

时间: 2024-11-14 12:39:56

一个复合查询方法的相关文章

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

几乎每个完整的应用程序都会需要一个复合查询.建立一个功能强大的复合查询首先必须要能够动态生成查询条件,其次应该能够对查询到的数据进行修改,最后这个复合查询最好能够对一对多的两个表建立条件进行查询. 在VFP里建立查询的方法主要有这么几种:一是使用VFP中自带的SearchClass类:二是建立一个查询:三是建立一个视图,其中包括参数化视图.宏替换Sql语句视图:四是建立一个Grid,将其数据源设置为SQL语句或临时表. 不管哪一种方法,其实质都是使用SQL语句. 这几种方法各有各的优点,也都有缺

请问怎么在REST接口 根据群组id去查下一个 群组的聊天记录?现在只看到了timestamp查询方法

问题描述 请问怎么在REST接口 根据群组id去查下一个 群组的聊天记录?现在只看到了timestamp查询方法 解决方案 没有通过过id导出的.调用rest接口是导出app所有的记录,报存到你自己服务器过滤

谁能送给我一个2分叉查询方法

问题描述 谁能送给我一个2分叉查询方法 解决方案 public class BinarySearch { /** * 二分查找算法 * * @param srcArray 有序数组 * @param key 查找元素 * @return key的数组下标,没找到返回-1 */ public static void main(String[] args) { int srcArray[] = {3,5,11,17,21,23,28,30,32,50,64,78,81,95,101}; System

Yii框架参数化查询中IN查询只能查询一个的解决方法

本文实例讲述了Yii框架参数化查询中IN查询只能查询一个的解决方法.分享给大家供大家参考,具体如下: 在yii框架中使用参数化进行IN查询时,结果不如所愿 $sql =<<<SQL SELECT id FROM tb WHERE id IN(:ids) SQL; $db = GeneralService::getSlaveDB(); $result = $db->createCommand($sql)->query([':ids' => '1013,1015,1017'

MySQL大表中重复字段的高效率查询方法

MySQL大表重复字段应该如何查询到呢?这是很多人都遇到的问题,下面就教您一个MySQL大表重复字段的查询方法,供您参考. 数据库中有个大表,需要查找其中的名字有重复的记录id,以便比较. 如果仅仅是查找数据库中name不重复的字段,很容易 代码如下: SELECT min(`id`),`name` FROM `table` GROUP BY `name`; 但是这样并不能得到说有重复字段的id值.(只得到了最小的一个id值) 查询哪些字段是重复的也容易 代码如下: SELECT `name`,

带合并单元格的Excel数据查询方法

  带合并单元格的Excel数据查询方法.在下面这个图中,A列是带合并单元格的部门,B列是该部门的员工名单. 现在需要根据E2单元格中的姓名,来查询对应的部门. 看看本文给出的参考公式吧: =LOOKUP("座",INDIRECT("A1:A"&MATCH(E2,B1:B8,))) 简单解释一下: MATCH(E2,B1:B8,)部分: 精确查找E2单元格的姓名在B列中的位置,返回结果为4. "A1:A"&MATCH(E2,B1:

LinQ To Objects 高级查询方法

 什么是LinQ To Objects?      用一个例子解释,首先定义一个数组,查询数组中的最大值:   int[] arr = { 123, 2, 3, 45, 654, 2324, 897, 56, 6554, 4, 3, 6, 8, 434 };      旧的方法:    int max=0 ; foreach(int a in arr) { if(a>=max) max=a; } Console.Write("最大值:"+ max);           LinQ

Java模糊查询方法详解_java

当我们需要开发一个方法用来查询数据库的时候,往往会遇到这样一个问题:就是不知道用户到底会输入什么条件,那么怎么样处理sql语句才能让我们开发的方法不管接受到什么样的条件都可以正常工作呢?这时where '1'='1'加上list就可以完美解决这个问题了,废话少说,上代码: // 模糊查询方法 public List<person> query() { List<person> list = new ArrayList<>(); Connection con = null

什么sql语句能通过一个值查询其所在的列名

问题描述 什么sql语句能通过一个值查询其所在的列名 差不多就是这样的一个表.怎么样才能在查询[常州代派]时返回[江苏],查询[东莞直营公司]时返回[广东] 解决方案 我觉得应该采用两张表城市名一种表如下图id city1 浙江2 广东 公司一张表id 公司名 城市id1 佛山A公司 2这样通过两种表来进行查找. 解决方案二: 用SQL语句怎么查询列名?用SQL语句怎么查询列名? --转载[DB2]SQL语句 查询列名.表名等信息 解决方案三: 应该不行吧,sql查数据就是根据所在的哪张表查哪些