请问如何实现模糊查找功能?

godtanker 2004-09-29 11:12:06
具体是这样的:比如在 text1 中输入“豌豆种植”,而希望通过“豆”,“种植”这几个关键字查找到自由表中的“豆类种植”,在 text2 中显示出来;如果找到的结果不只一个的话,比如查找“水泥”,而表中有“水泥生产”和“水泥销售”两个,通过按钮“下一个”刷新text2。

请教达人如何实现呢?
...全文
256 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
十豆三 2004-10-11
  • 打赏
  • 举报
回复
应该是
godtanker 2004-10-11
  • 打赏
  • 举报
回复
那是说就算用 text 而不用 grid 来显示搜索结果也无法实现关键字高亮吗?
vokeyliu 2004-10-10
  • 打赏
  • 举报
回复
我想你这个愿望应该是没有办法实现的
可以全部的显示为高亮但是这些值是在一个text框中的,不可能将其中的一部分设置为一种字体颜色而另外一部分设置为另外一种颜色。
LAIYANGPJ 2004-10-10
  • 打赏
  • 举报
回复
to: 十豆三:1、关键字高亮,不太可能,只能让关键字据的那个单元格高亮。
也可以的:
THISFORM.GRID1.COLUMN1.HEADER1.FORECOLOR=RGB(255,255,255)&&RGB(255,255,255)是你要的颜色啊!
十豆三 2004-10-10
  • 打赏
  • 举报
回复
1、关键字高亮,不太可能,只能让关键字据的那个单元格高亮。

2、LAIYANGPJ(小丑) 回答的就是"上一个"。
LAIYANGPJ 2004-10-10
  • 打赏
  • 举报
回复
1.你的表格关键字高亮处理代码:
表格中对就的关键字列的COLUMN的FORECOLOR定义为你想要的颜色就好了.
2.那你就把十豆三兄的那段代码改下下好了:
EOF()改为BOF()
SKIP改为SKIP-1
LAIYANGPJ 2004-10-10
  • 打赏
  • 举报
回复
这个可能楼下有解!没见过,不好意思了!
godtanker 2004-10-10
  • 打赏
  • 举报
回复
楼上的只是让grid中的column1中显示的字段名高亮而已啊~
而我是希望字段的内容中的关键字高亮啊,比如查找“汽车”找到“类别”字段中的“汽车修理”和“汽车制造”,我是希望后两者中的“汽车”两字高亮,而不是希望“类别”两字高亮。
有办法吗?
godtanker 2004-10-09
  • 打赏
  • 举报
回复
谢谢楼上的~
还有一个问题,就是可否让搜索的关键字在结果中“高亮”显示呢(就是类似于搜索引擎搜索出来之后的效果)?现在这样,当搜索的结果数大于一,则用一个grid来显示,其中的关键字高亮(就是换一种颜色标示),应该怎么做呢?

额外再问一个,如果采用原来的方法,加一个“上一个”按钮,应该怎么实现呢?

呵呵,问的太多了,应该加分。
godtanker 2004-10-08
  • 打赏
  • 举报
回复
查询一次之后,清楚text1再输入查询则提示“文件正在使用”,应该关闭哪一个表啊?
十豆三 2004-10-08
  • 打赏
  • 举报
回复
对 这里的 ctxt 应该是 ctxt1
十豆三 2004-10-08
  • 打赏
  • 举报
回复
*假如你在1区打开的表

*text1的Valid事件:
SELECT 1
Ctxt1=ALLTRIM(thisform.text1.value)
P=LEN(ALLTRIM(thisform.text1.value))
for I=1 to P step 2
Ctxt2=substr(Ctxt1,I,I+1)
DELETE ALL FOR Ctxt2$字段名1 &&此字段是你表中要查询的字段名。
endfor
select 2
use
select 1
copy to temp for DELETED()
RECALL all
SELECT 2
USE temp
RECALL all
IF RECCOUNT()>0
thisform.command2.enabled=.t. &&command为“下一个”按钮
GO TOP
thisform.text2.value=字段名1
ELSE
thisform.command2.enabled=.f.
thisform.text2.Value=""
ENDIF
thisform.Refresh

*"下一个"按钮的Click事件:
SELECT 2
IF NOT EOF()
SKIP
thisform.text2.value=字段名1
ELSE
GO BOTTOM
thisform.text2.value=字段名1
ENDIF
thisform.Refresh


******************************************
即在
copy to temp for DELETED()
之前加
select 2
use
select 1
  • 打赏
  • 举报
回复
我还想出来种方法就是建立用select * from table1 where aaa like建立个临时表,从临时表里掏东西
淡蓝冰 2004-10-03
  • 打赏
  • 举报
回复
以上的方法都很好。
只要充分利用函數﹐什么都能做到。
godtanker 2004-10-01
  • 打赏
  • 举报
回复
Ctxt2=substr(ctxt,I,I+1)
这里的 ctxt 是不是应该是 ctxt1 啊?
xclzteb 2004-09-30
  • 打赏
  • 举报
回复
楼上的已经可以了。
LAIYANGPJ 2004-09-30
  • 打赏
  • 举报
回复
还有一个函数:OCCURS()
功能:返回字符表达工在另一个字符表达式中出现的次数.
语法:OCCURS(cSearchExpression,cExpressionSearched)
返回:数值型.
用法与AT()
lifengliu2000 2004-09-30
  • 打赏
  • 举报
回复
有简单的办法,用at()函数,
if at(s1,s2) > 0 then
s1 是s2的子串
YuyuanJian 2004-09-30
  • 打赏
  • 举报
回复
请用like( ) 函数
语法:
like( ) 函数
确定一个字符表达式是否与另一个字符表达式相匹配。

语法

LIKE(cExpression1, cExpression2)

参数

cExpression1

指定要与 cExpression2 相比较的字符表达式。cExpression1 中可以包含通配符 * 和 ?。问号 (?) 可与 cExpression2 中的任何单个字符相匹配,星号 (*) 可与任意数目的字符相匹配。在 cExpression1 中可以把任何数目的通配符进行任意的组合。

cExpression2

指定要与 cExprssion1 相比较的字符表达式。只有在 cExpression1 与 cExpression2 中的字符逐个匹配的情况下,like( ) 函数才返回“真”(.T.)。

返回值类型
逻辑型

说明
如果 cExpression1 与 cExpression2 相匹配,则 like( ) 函数返回“真”(.T.);否则,返回“假”(.F.)。
SET COMPATIBLE 决定 like( ) 函数如何比较 cExpression1 和 cExpression2 中的空格。若 SET COMPATIBLE 设置为 ON 或 DB4,则在比较之前删除 cExpression1 和 cExpression2 中的后缀空格。若 SET COMPATIBLE 设置为 OFF 或 FOXPLUS,则两字符表达式中的后缀空格也参加比较。

示例:

下面的示例将显示 products 表中所有前两个字符是“ch”的产品名。

close databases
open database (home( ) + 'samples\data\testdata')
use products && 打开 products 表

clear
? 'all product names with first two letters ch:'
?
scan for like('ch*', prod_name)
? prod_name
endscan
use

十豆三 2004-09-30
  • 打赏
  • 举报
回复
*假如你在1区打开的表

*text1的Valid事件:
SELECT 1
Ctxt1=ALLTRIM(thisform.text1.value)
P=LEN(ALLTRIM(thisform.text1.value))
for I=1 to P step 2
Ctxt2=substr(ctxt,I,I+1)
DELETE ALL FOR Ctxt2$字段名1 &&此字段是你表中要查询的字段名。
endfor
copy to temp for DELETED()
RECALL all
SELECT 2
USE temp
RECALL all
IF RECCOUNT()>0
thisform.command2.enabled=.t. &&command为“下一个”按钮
GO TOP
thisform.text2.value=字段名1
ELSE
thisform.command2.enabled=.f.
thisform.text2.Value=""
ENDIF
thisform.Refresh

*"下一个"按钮的Click事件:
SELECT 2
IF NOT EOF()
SKIP
thisform.text2.value=字段名1
ELSE
GO BOTTOM
thisform.text2.value=字段名1
ENDIF
thisform.Refresh
加载更多回复(1)

2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧