PB的组合查询

2023-11-15

用PB进行数据库应用系统开发时,我们经常要对大量的数据进行筛选、查询,得到符合要求的记录,这就需要用到组合条件查询功能。我在作应用系统开发时,就自己编写了一个简单而又实用的组合条件查询模板窗口,只要用到组合条件查询的地方,都可从此窗口继承而来,非常方便。下面是给出其实现方法。
一、建一个外部数据源的dataobject对象,取名为:d_tabular_query ,各列如下:

Name Type Lenth Dec
column_name string 10  
compare string 3  
value string 255  
and_or string 3  



二、建一窗口w_condition_query_template,Title设置为:“组合条件查询窗口模板”,并加入控件:

控件名 类型 说明
dw_query_condition datawindow 用以输入查询条件 Datawindow Object Name 为前所建数据窗口对象 d_tabular_query
cb_add command button 增加一查询条件
cb_del command button 删除一查询条件
cb_ins command button 插入一查询条件
cb_clear command button 清除所有询条件
cb_ok command button 由查询条件得出结果
dw_query datawindow 查询结果 Datawindow Object Name 为空,继承后的子窗口再加入。
cb_all command button 显示所有记录
cb_print command button 打印查询结果
cb_exit command button 退出


三、编写脚本

1、在dw_query_condition的Constractor事件中加入如下脚本:

//-------------------------------------------------------------//
// 功能说明:根据数据窗口dw_query设定可组合项,供组合查询选择
// 注意事项:数据窗口dw_query的对象中text命名须用默认值,
// 即:列名+ _t
// 柯建勋 于1999年4月27日
//-----------------------------------------------------------------------//

long ll_column_count
long ll_i
long ll_row
string ls_column
string ls_column_name

this.settransobject(sqlca)
ll_row = this.insertrow(0)
this.setitem(ll_row,'compare','=')
this.setitem(ll_row,'and_or','and')

ll_column_count = long(dw_query.Describe("DataWindow.Column.Count")) //总列数

this.Clearvalues("column_name")
for ll_i = 1 to ll_column_count
if dw_query.Describe("#"+string(ll_i)+".Visible") = '1' then
ls_column = dw_query.Describe("#"+string(ll_i)+".Name") //列名
ls_column_name = dw_query.Describe(ls_column + "_t.text") //列名对应文本
this.Setvalue("column_name", ll_i , ls_column_name + "~t" + ls_column)
end if
next

2、定义dw_query_condition的用户事件ue_Enterkeydown,Event ID选择pbm_dwnProcessEnter。
当我们按下Enter键时,将触发此事件。在ue_Enterkeydown事件中加入如下脚本:


//回车键(Enter)切换列焦点
long ll_column_count
long ll_column

ll_column_count = long(this.Describe("DataWindow.Column.Count"))

ll_column = this.getcolumn()
if ll_column = ll_column_count then
cb_add.triggerevent(clicked!) //增加一行
else
this.setcolumn(ll_column + 1)
end if

3、在cb_add的Clicked事件加入:

long ll_row

ll_row = dw_query_condition.insertrow(0)
dw_query_condition.setitem(ll_row,'compare','=')
dw_query_condition.setitem(ll_row,'and_or','and')
dw_query_condition.SetColumn(1)

4、在cb_del的Clicked事件加入:

long ll_row

ll_row = dw_query_condition.getrow()
dw_query_condition.DeleteRow(ll_row)

5、在cb_ins的Clicked事件加入:

long ll_row
long ll_new_row

ll_row = dw_query_condition.getrow()
ll_new_row = dw_query_condition.InsertRow(ll_row)
dw_query_condition.setitem(ll_new_row,'compare','=')
dw_query_condition.setitem(ll_new_row,'and_or','and')
dw_query_condition.SetColumn(1)

6、在cb_clear的Clicked事件加入:

long ll_row

dw_query_condition.reset()
ll_row = dw_query_condition.insertrow(0)
dw_query_condition.setitem(ll_row,'compare','=')
dw_query_condition.setitem(ll_row,'and_or','and')


7、在cb_ok的Clicked事件加入:

//-----------------------------------------------------------------------//
// 条件组合查询 柯建勋 1999.04.27
//-----------------------------------------------------------------------//

long ll_rowcount
long ll_row
long ll_j
string ls_filter_condition
string ls_column
string ls_compare
string ls_value
string ls_and_or
string ls_column_type

if dw_query_condition.AcceptText() = -1 then return

ll_rowcount = dw_query_condition.rowcount()
if ll_rowcount <=0 then return

ls_filter_condition = ''
for ll_row = 1 to ll_rowcount
ls_column = dw_query_condition.getitemstring(ll_row, 'column_name')
ls_compare = dw_query_condition.getitemstring(ll_row, 'compare')
ls_value = dw_query_condition.getitemstring(ll_row, 'value')
ls_and_or = dw_query_condition.getitemstring(ll_row, 'and_or')
ls_column_type = dw_query.Describe(ls_column + ".ColType") //
ls_column_type = left(ls_column_type, 3)
if ll_row = ll_rowcount then //最后一行(不加and、or)
choose case ls_column_type //根据数据类型设置Filter条件
case 'cha' ,'var' ,'str' // 字符型
ls_filter_condition = ls_filter_condition + &
ls_column + ls_compare + "'" + ls_value + "'"
case 'num','dec','lon','rea','ulo' // 数值型
ls_filter_condition = ls_filter_condition + &
ls_column + ls_compare + ls_value
case 'dat','tim' //日期型
ls_filter_condition = ls_filter_condition + "string(" + &
ls_column + ")" + ls_compare + "'" + ls_value + "'"
case else
end choose
else
choose case ls_column_type //根据数据类型设置Filter条件
case 'cha','var','str' // 字符型
ls_filter_condition = ls_filter_condition + &
ls_column + ls_compare + "'" + ls_value + "' " &
+ ls_and_or + " "
case 'num','dec','lon','rea','ulo' // 数值型
ls_filter_condition = ls_filter_condition + &
ls_column + ls_compare + ls_value + " " &
+ ls_and_or + " "
case 'dat','tim' //日期型
ls_filter_condition = ls_filter_condition + "string(" + & ls_column + ")" + ls_compare+ "" + ls_value+ "' " &
+ ls_and_or + " "
case else

end choose
end if
next

dw_query.setredraw(false)
dw_query.setFilter(ls_filter_condition)
if dw_query.filter() = 1 and dw_query.rowcount() > 0 then
ls_column = dw_query_condition.getitemstring(1, 'column_name')
dw_query.setsort(ls_column + ' A')
dw_query.sort()
dw_query.SetColumn(ls_column)
dw_query.selectrow(0,false)
dw_query.selectrow(1,true)
dw_query.setrow(1)
end if
dw_query.setredraw(true)

8、在dw_query的Constractor事件中加入如下脚本:

this.Object.DataWindow.ReadOnly="Yes"
this.settransobject(sqlca)
this.retrieve()

if this.rowcount() > 0 then
this.selectrow(0,false)
this.selectrow(1,true)
this.setrow(1)
end if

9、在cb_all的Clicked事件加入:

dw_query.SetFilter('')
dw_query.Filter()
if dw_query.rowcount() > 0 then
dw_query.selectrow(0,false)
dw_query.selectrow(1,true)
dw_query.setrow(1)
end if
dw_query.SetFocus()

10、在cb_print的Clicked事件加入:
if messagebox("提示信息","确认打印?", question!,Yesno!,1) = 1 then
if PrintSetup () = -1 then
messagebox('出错信息','打印机设置出错!',Exclamation!)
return else dw_query.Print() end if
end if

11、在cb_exit的Clicked事件加入:
close(parent)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PB的组合查询 的相关文章

  • 结合 EditText 和 Button?

    在某些应用程序中 我看到 EditText 小部件与右侧的按钮结合在一起 例如Twitter 应用程序中的搜索字段 http 2 bp blogspot com GTM W5mVPTU S rmYdiUTCI AAAAAAAAAEE hIO
  • 在Python中从字典中删除某些键的最快方法

    我正在寻找删除 python 字典中某些键的最快 有效的方法 这里有一些选项 for k in somedict keys if k startswith someprefix del somedict k or dict k v for
  • 在 Windows 命令提示符中使用通配符

    我想知道是否可以在 Windows 命令提示符中使用通配符 例如 如果我想查看以 docx 结尾的目录中的所有文件 在 Linux 上我会输入以下内容ls docx Windows下有类似的工具吗 谢谢 是的你可以 e g 星号字符 可以代
  • 根据 Python Pandas 中的描述场景和状态过滤产品

    假设我在 Pandas DataFrame 中有以下产品描述 我想保留满足以下条件的产品的所有产品描述 对于每一个id in product descriptions 检查是否包含全部descriptions从 至少 1 个场景scenar
  • 将函数绑定到 Kivy 按钮

    我正在尝试将以下函数绑定到Button在基维 def auth self print self username if self username Hendricko print self username Hendricko popup
  • `npm i` 命令有什么作用?

    什么是i在 npm CLI 中执行命令 我看到它是这样使用的 npm i package The iflag 是一个别名install so npm i package 是相同的 npm install package 从文档中 npm i
  • 如何在树视图标题中“创建”和“导入”按钮 Odoo 8 附近添加按钮?

    我可以成功在表单视图标题或树视图行中添加按钮 但我想在 Odoo 8 中 创建 和 导入 按钮附近的树视图标题中添加自定义按钮 我该如何执行此操作 我找到了解决我的问题的方法 如果我使用 我会替换创建按钮project project mo
  • Array.filter 与 $filter('filter')

    我应该在 Angular 应用程序中使用哪一个 为什么 array filter o gt o name myName or filter filter array name myName true 关键的区别是快捷方式或语法糖由提供 fi
  • 奇怪的问题,除非单击鼠标,否则按钮不会重新启用

    我的应用程序是使用 WPF 中的 MVVM 模式编写的 我的所有按钮都使用命令绑定来执行模型中的代码 所有命令在 CanExecute 中都有代码来确定绑定按钮的启用状态 该逻辑工作完美 但在所有情况下 GUI 都会保持禁用状态 除非我单击
  • WPF 重复按钮 MouseUp

    有没有办法让重复按钮上的 MouseUpevent 在不再按下按钮时触发 我试图使用 MouseMove 事件来跟踪按下按钮时鼠标的位置 但 MouseDown 和 MouseUp 都不会触发鼠标左键的事件 关于可以做什么的任何想法或建议
  • mifare 卡身份验证错误“6982:安全状态未满足”

    我有 pc sc 读卡器和非接触式卡 mifare 卡 我可以连接到该卡 并且我也成功执行 getdate 命令 但是当我想进行身份验证时 我看到此错误 6982 安全状态不满足 我已经尝试过这 3 个不同的身份验证命令 但所有这些命令都出
  • WPF UserControls - 在 UserControl 内的按钮上设置 .Command 属性

    我有一个包含按钮和其他一些控件的 UserControl
  • Froala 添加自定义预编码按钮

    我正在尝试创建一个代码按钮Froala http editor froala com 编辑器基本上可以通过按执行与此处相同的操作CNTRL K 现在我想我有两个选择 第一个是编辑 froala editor js 文件 因为 Froala
  • 如何在java中的组合框之间使用过滤器?

    我的数据库中有两个表 分别是学期表和课程表 学期表中有学期 ID 课程 ID 课程名称和 Sdepartment 部门名称 课程表有课程 ID 和课程名称 我的 jframe 有两个组合框 第一个用于选择部门 第二个用于选择课程 我想选择所
  • MVVM 中的事件而不是命令?

    在MVVM的各种教程中经常会指出 MVVM的目标不是消除代码隐藏 并且代码隐藏中的一些事件处理可能仍然是必要的 在什么场景下您需要在代码隐藏中编写事件而不是在视图模型中使用命令 一般来说 如果您的代码与 UI 逻辑相关 请将其保留在视图的
  • 如何设置按钮的大小?

    我将按钮放在带有 GridLayout 的 JPane 中 然后我用 BoxLayout Y AXIS 将 JPanel 放入另一个 JPanel 中 我希望 GridLayout 中的按钮是方形的 我使用 tmp setSize 30 3
  • C# 中的自定义按钮:如何删除悬停背景?

    我正在尝试使用 Visual Studio 2005 对我的表单 其 FormBorderStyle none 执行自定义按钮 我在链接到该按钮的 ImageList 中有我的 3 种状态按钮图像 this btnClose AutoSiz
  • 增加 .fig 文件中的散点标记大小

    我有一个图形文件 scatter fig 该图有许多使用 scatter 的散点绘图仪 现在我只有这个无花果文件 我需要增加所有散点的标记大小 手动尝试过 但非常困难 有没有办法我可以做类似的事情 H 图形句柄 s 点 h 设置 s 标记大
  • 按钮元素内的 IE8 绝对定位元素是错误的

    标题说明了一切 按钮元素的绝对定位子元素在 IE8 中是错误的这是一个fiddle http jsfiddle net Sjeiti paFKM 这是强制性的代码
  • 如何使用 wamp 在 Windows 上烘焙 cakephp 2.0 应用程序

    我想在Windows系统上烤蛋糕php项目 我正在使用 wamp 服务器来运行 PHP mysql 我已经浏览过 cakephp 网站上的视频投射 并设置了环境设置 按照演示给出命令 蛋糕 后 最后我收到一条消息说 php 不被识别为内部或

随机推荐

  • c++哈希表-map&set (无序)

    简述 无序的map set 称为unordered map unordered set 采用迭代器遍历出来的元素是无序的 这是因此底层实现数据结构为哈希表 1 哈希表不同于红黑树 哈希表它的查找效率是o 1 一个常数的效率 虽然红黑树是o
  • 使用的chorm插件 留存自用

    使用的chorm插件 留存自用 保存一下常用的插件 省的以后忘记了 啊哈哈 掘金插件 每次打开浏览器都得看上几眼 JSON handle 在线json解析 不解释了 好用 PostMan 模拟api的网络请求 The Great Suspe
  • 浅谈ThreadLocal

    目录 一 ThreadLocal原理 二 TheadLocal特性 二 TheadLocal使用场景 一 ThreadLocal原理 1 每个Thread对象都含有一个ThreadLocalMap ThreadLocalMap是由Entry
  • node.js错误 --> node-pre-gyp install --fallback-to-build

    错误 node pre gyp install fallback to build 问题描述 在安装ghost博客的时候需要使用node js 但是在执行sudo npm install production的时候报了这个错误 接着百度 看
  • 饥饿和公平

    转自 饥饿和公平 下文笔者将讲述java多线程中的 饥饿与公平 的相关知识 如下所示 Java中饥饿与公平的概念 当一个线程因为CPU时间全部被其他线程获取而无法获取CPU运行时间时 我们将这种状态称之为 饥饿 此时此线程由于 饥饿 而无法
  • 最大公约数与最小公倍数 -- 3种计算方法详解

    目录 1 穷举法 最大公约数 思路 最小公倍数 思路 2 辗转相除法 最大公约数与最小公倍数 最大公约数思路 最小公倍数思路 公式 3 特殊方法 最大公约数 相减法 思路 最小公倍数 叠乘法 思路 总结 1 穷举法 最大公约数 思路 假设两
  • C/C++问题处理:error : no matching function for call to ‘max‘

    报错代码 MaxVal max MaxVal words i size words j size 上面的 words 是vector
  • vue的双向绑定原理---defineProperty->Proxy

    可以实现双向绑定的方法有很多 基于观察者模式 基于数据模型 Angular基于脏检查的双向绑定 本篇我们重点讲vue的基于数据劫持和发布订阅的双向绑定 vue实例化过程中进行了以下操作 initLifecycle vm initEvents
  • Android性能之内存泄漏

    和你一起终身学习 这里是程序员Android 经典好文推荐 通过阅读本文 您将收获以下知识点 一 什么是内存泄漏 二 Android中导致内存泄漏的主要几个点三 Java虚拟机内存管理四 Java内存几种分配策略 五 垃圾收集器是如何判断对
  • MATLAB环境下基于支持向量机、孤立森林和LSTM自编码器的三轴振动数据的机械异常检测

    本文讲解如何使用机器学习和深度学习来检测机械振动数据中的异常 属于异常检测领域 这玩意在工业中用的更多 因为工业中毕竟还是正常样本远多于故障样本 异常样本 运行环境为MATLAB R2021B 第三方面包多官网下载如下 正在为您运送作品详情
  • 因为一个bug来深入探讨下分页插件PageHelper

    事情来源是这样的 因为某些操作失误 在使用分页插件pageHelper时 因为这样一句不起眼的操作 竟然引发了一系列的灾难 下面来看下灾难的由来 Page localPage PageHelper startPage page limit
  • Linux WIFI 驱动实验(USB和SDIO方式)

    目录 WIFI 驱动添加与编译 向Linux 内核添加WIFI 驱动 配置Linux 内核 编译WIFI 驱动 驱动加载测试 wireless tools 工具移植与测试 wireless tools 移植 wireless tools 工
  • 数据结构循环链表,增删改查基本操作

    一 双向循环链表的描述 和单链表的循环类似 双向链表也可以有循环表 循环表的引进是为了弥补双向链表不能向前遍历的弊端 在双向循环链表中 头结点的直接前驱为尾结点 而尾结点的直接后继为头结点 二 双向循环链表的存储结构 三 双向循环链表基本操
  • VS2012:LNK4098: 默认库“MSVCRT”与其他库的使用冲突

    VS2012警告 LINK warning LNK4098 默认库 MSVCRT 与其他库的使用冲突 请使用 NODEFAULTLIB library 原因 在使用多线程调试dll MDd 模式的时候 lt 位置 配置属性 c c 代码生成
  • 大厂偏爱的Agent技术究竟是个啥

    搜索关注微信公众号 捉虫大师 后端技术分享 架构设计 性能优化 源码阅读 问题排查 踩坑实践 hello大家好 我是小楼 今天给大家分享一个关于Agent技术的话题 也是后端启示录的第3篇文章 通过本文你可以了解到如下内容 什么是Agent
  • 硬盘安装Linux(ubuntu,centos)

    硬盘安装Linux ubuntu centos 硬盘安装Linux 使用硬盘安装Linux最大的好处不只是方便 是快速 之前使用U盘安装 很慢 没有记录具体时间 Ubuntu区别不大 本身比较小 安装介质只有2G ubuntu18 10 C
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Linux 实时查看文件 tail 命令详解

    Linux 实时查看文件 tail 命令详解 Linux 实时查看文件 tail 命令详解 一 概述 tail 命令用于显示文件的末尾内容 默认显示文件的最后 10 行 通常情况下 tail 命令用于实时查看日志文件 可以使用 f 参数跟踪
  • Python发送信息及附件到邮箱

    import smtplib import os from email mime text import MIMEText from email mime multipart import MIMEMultipart from email
  • PB的组合查询

    用PB进行数据库应用系统开发时 我们经常要对大量的数据进行筛选 查询 得到符合要求的记录 这就需要用到组合条件查询功能 我在作应用系统开发时 就自己编写了一个简单而又实用的组合条件查询模板窗口 只要用到组合条件查询的地方 都可从此窗口继承而