| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1332 人关注过本帖, 1 人收藏
标题:VFP 学习、开发漫谈 (22)
只看楼主 加入收藏
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
结帖率:96.77%
收藏(1)
 问题点数:0 回复次数:10 
VFP 学习、开发漫谈 (22)
对数据进行筛选,是每个应用程序必备的功能之一。下面,介绍一种利用快捷菜单对数据进行筛选的方法,希望对大家的编程开发有所启发。

以编写一个合同模板维护表单为例,下图是表单的运行界面,仅显示了采购员“张三”填写的合同模板:
图片附件: 游客没有浏览图片的权限,请 登录注册

先介绍一下“合同模板.dbf”的结构。主要字段有“模板 ID(Integer AutoInc)”、“模板说明 C(60)”、“采购员 C(10)”、“质量标准 M”、……。
说明:
●“模板id”是主关键字段,是模板的唯一标识。
●“采购员”字段由系统自动维护,每个采购员只能修改自己的模板。
●“通用”模板是公司法律事务部拟定的标准模板,适用于无特殊要求的所有材料,“采购员”字段为空。采购员不能修改和删除“通用”模板。同时,“通用”模板可作为其他模板的基础。在新建自己的模板时,先通过“复制”按钮,将“通用”模板复制一份,然后再对其进行修改形成自己的模板。

现在,要实现的功能是:单击“筛选”按钮,弹出一个快捷菜单,里面显示出所有采购员。选择某个采购员,则仅显示该采购员的合同模板。选择“全部”则取消筛选,显示所有采购员的模板记录。在快捷菜单中,当前采购员的菜单项前有“√”标记,表示记录已按该采购员进行了筛选。

系统的核心代码放在“筛选”按钮的 Click 事件中:
程序代码:
LOCAL aBuyer[1],nNum,cFilter,nMark,i,cBuyer

* 获取采购员列表
SELECT DISTINCT 采购员 FROM 合同模板 INTO ARRAY aBuyer WHERE !EMPTY(采购员)
nNum = _Tally          && 采购员数量
IF nNum = 0            && 若除通用模板外无其他记录,则返回
    RETURN
ENDIF

* 定义菜单(全部,采购员1,采购员2……)
DEACTIVATE POPUP mnuFilt
DEFINE POPUP mnuFilt SHORTCUT RELATIVE FROM MROW(),MCOL()
DEFINE BAR 1 OF mnuFilt PROMPT ' (全部)'
DEFINE BAR 2 OF mnuFilt PROMPT '\-'
FOR i = 1 TO ALEN(aBuyer)
    DEFINE BAR i+2 OF mnuFilt PROMPT aBuyer[i]
NEXT

* 根据表的筛选状态,标记菜单项
cFilter = FILTER('合同模板')
nMark = 1              && 默认选定“(全部)”
FOR i = 1 TO nNum
    IF ALLT(aBuyer[i]) $ cFilter
        nMark = i + 2  && 前两项是“(全部)”和分隔线,所以菜单项要加 2
        EXIT
    ENDIF
NEXT
SET MARK OF BAR nMark OF mnuFilt TO .t.

* 激活菜单
ON SELECTION POPUP mnuFilt DEACTIVATE POPUP mnuFilt
ACTIVATE POPUP mnuFilt
RELEASE POPUPS mnuFilt

* 根据选择的采购员,执行筛选
IF BAR() > 0
    SELECT 合同模板
    cBuyer = PROMPT()
    IF cBuyer = ' (全部)'
        SET FILTER TO
    ELSE
        SET FILTER TO EMPTY(采购员) OR 采购员 = "&cBuyer"
    ENDIF
    GO TOP
    THISFORM.Refresh
ENDIF
为了与大多数软件的习惯保持一致,在为“筛选”按钮指定图标时,我选择了一个“漏斗”图片,然后又在其下方添加了一个小箭头,表示单击该按钮将弹出一个快捷菜单。

另外,在使用 Set Filter To 指定筛选条件时,不要直接使用内存变量。比如:若将代码改为 Set Filter to Empty(采购员) OR 采购员 = cBuyer,将因 cBuyer 是 Local 变量而运行时出错(单击表格时,系统提示“变量 cBuyer未找到”)。当然,将 cBuyer 设为 Public 可以解决变量作用域的问题。但是,这绝对不是一个好方法。

正确的方法是,使用宏替换将 cBuyer 转换为常量,如:SET FILTER TO EMPTY(采购员) OR 采购员 = "&cBuyer"。

对于一个程序员来说,对全局变量的使用应该慎之又慎。Windows是一个多线程、多窗口操作系统,即使在每个表单中定义的全局变量名不同,但由于VFP允许一个表单运行多个实例,那么在该表单的多个运行实例中实际上使用的仍是同一个变量,导致各窗口中的同名变量相互影响,带来逻辑混乱。我一般仅将用户的登录id(gnUserId)、用户名(gcUserName)以及与 SQL Server的连接句柄(gnHandle)定义为全局变量。对于在同一表单中不同控件之间的共用变量,我一般通过将其设置为表单的自定义属性来解决。在VFP中,可以将表单的自定义属性理解为表单变量,它的作用域是表单的所有控件以及表单本身。


[ 本帖最后由 liuxingang28 于 2014-5-16 09:57 编辑 ]
搜索更多相关主题的帖子: 采购员 关键字 应用程序 编程开发 
2014-05-16 09:56
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
第一个学习
2014-05-16 11:00
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2197
专家分:3838
注 册:2007-4-27
收藏
得分:0 
学习中……谢谢

只求每天有一丁点儿的进步就可以了
2014-05-16 12:44
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11772
专家分:43421
注 册:2006-5-13
收藏
得分:0 
最后一段的经验尤其重要

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2014-05-16 14:23
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1528
专家分:180
注 册:2006-6-3
收藏
得分:0 
liuxingang28:
界面好漂亮
最好能有完整的内容,好好学一下。
2014-05-16 16:55
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
收藏
得分:0 
回复 5 楼 sylknb
下一课将讲述有关表单界面设计的内容,附原代码,请关注……

泉城飞狐
2014-05-16 18:36
asdf_123000
Rank: 4
等 级:业余侠客
威 望:1
帖 子:273
专家分:227
注 册:2012-12-20
收藏
得分:0 
期待
2014-05-17 13:12
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1528
专家分:180
注 册:2006-6-3
收藏
得分:0 
盼!!
2014-05-19 09:51
jsddx
Rank: 2
等 级:论坛游民
帖 子:42
专家分:21
注 册:2006-4-11
收藏
得分:0 
等待
2014-05-21 10:46
ILoveVFD
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:218
专家分:147
注 册:2015-5-2
收藏
得分:0 
篇篇精彩!
2015-05-02 12:10
快速回复:VFP 学习、开发漫谈 (22)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017059 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved