数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
PB中相关联下拉数据窗口的实现

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

  近日在开发过程中遇到使用下拉数据窗口的情况:数据表Data中有二列Dept_id(主管部门编码)、Unit_id(企业编码)的取值分别来自数据表Dept(主管部门)及Unit(企业基本情况),且要求选择某一主管部门后,能将该主管部门的所有企业显示出来以便选择。有关数据表的结构如下(已简化):

表 名 字段名 类型 长度 关键字 含义
Data Dept_id Char 5 主管部门编码
Unit_id Char 9 企业编码
Num Numeric 7(无小数) 上交金额
Dept Id Char 5 主管部门编码
Name Char 15 主管部门?/TD>
Unit Id Char 7 企业编码
Name Char 30 企业名称
Dept_id Char 5 主管部门编码

  为实现这些要求,可将Data表的2个字段Dept_id、Unit_id设计为2个相关联的下拉数据窗口,关键是如何将Dept_id的当前选定值传递给Unit_id以使其仅显示相应的主管部门的企业清单。为此,本人查阅了许多有关书刊及有关网站的相关资料,找到两种解决方法:设置检索参数及使用动态SQL语句。

  这两种解决方法的共同关键是使用GetChild()函数及DataWindowChild型变量。许多资料称设置检索参数是最简单、最方便的有效解决方法,也提出了几种隐藏系统自动弹出的“Specify Retrieval”对话框的方法。但令人遗憾的是本人竭尽所能也未能如愿(主要是无法隐藏系统自动弹出的“Specify Retrieval”对话框)。

  因此开始考虑使用动态SQL语句。经过一番努力,终于比较满意地实现了设计要求。具体做法如下:

  1、 首先创建应用dddw,有关操作按提示即可。(PowerBuilder8.0中请先创建WorkSpace dddw.pdw,
其他操作基本同PowerBuilder7.0)

  2、 创建数据窗口dddw_dept:Grid、Quick Select、表Dept的所有字段,最好不要定义Where子句以免后面编程复杂化,能将header部分去掉最好(可使显示简洁)。

  3、 创建数据窗口dddw_unit:Grid、Quick Select、表Unit的所有字段,其余同上。

  4、 创建数据窗口d_1:FreeForm、Quick Select、表Data的所有字段,适当排列、编辑一下,关键是Dept_id及Unit字段,必须做成下拉数据窗口。下面就以Dept_id字段为例:右击Dept_id字段(注意:不是列标题),在弹出菜单中选“Properties…”, 然后在弹出的“Properties-Dept_id”窗口中选择“Edit”标签页,在“Style Type”下拉框中选择“DropDownDW”,选中复选框“Always Show Arrow”、“V ScrollBar”,再在“DataWindow”编辑框中输入“dddw_dept”,或点击其右边的“…”进行选择,在“Display Column”下拉框中选择“name”(即下拉数据窗口中显示的是name列值),在“Data Column”下拉框中选择“id”(即实际存入数据库的是id列值)。字段Unit_id如法炮制,只需将“DataWindow”编辑框中的“dddw_dept”改成“dddw_unit”即可。

  5、创建主窗口w_main,其上建数据窗口控件dw_1,其DataObject为d_1。

  再在主窗口w_main的Open事件中写入如下脚本:

Long ll_newrow

SQLCA.DBMS = "ODBC"

SQLCA.AutoCommit = True

SQLCA.DBParm = "Connectstring='DSN=SmpDB'"//ODBC数据源已配置好

connect;

dw_1.SetTransObject(SQLCA)

dw_1.Retrieve()

  然后再在数据窗口dw_1的ItemFocusChanged事件中写入如下脚本:

Integer rtncode

String ls_nowFld,ls_deptid,ls_sql

DataWindowChild fld_child



rtncode = dw_1.GetChild("Unit_id",fld_child) file://获得Unit_id字段下拉数据窗口的句柄

If rtncode = -1 Then MessageBox("错误!", "不是下拉数据窗口!")

fld_child.SetTransObject(SQLCA) file://设置事务对象

ls_sql = Lower(fld_child.GetSQLSelect())// 获得DDDW的SQL语句



// 去除Sql 语句中的Where条件子句, 如原Sql 语句中须有Where条件子句,此处则需进行较

file://复杂的处理,应视具体情况而定。

if Pos(ls_sql, " where ")>0 then ls_sql = Left(ls_sql,Pos(ls_sql, " where "))

file://重新设置Sql 语句中的Where条件子句

ls_deptid=dw_1.Object.dept_id[GetRow()] file://取得当前dept_id选定值

ls_sql = ls_sql + " Where dept_id = '" +Trim(ls_deptid)+"'"



file://重新设置Sql 语句

fld_child.SetSQLSelect(ls_sql)

fld_child.Retrieve()//取得满足条件的数据


  6、在应用dddw的Open事件中写入:Open(w_main)

  至此,应用建立完毕,已可运行。

  注:在Win98/WindowsXP、PowerBuilder8.0/PowerBuilder7.0/PowerBuilder6.5下通过。

  补充说明:

  (一)、ODBC数据源设置

  打开Windows操作系统的“开始”菜单--à设置--à控制面板--àODBC数据源,出现“ODBC数据源管理器”窗口,在“系统DSN”页签中点击“添加(D)…”按钮,出现“创建新数据源”窗口,双击列表框中“Adaptive Server Anywhere 7.0”选项,即弹出“ODBC Configuration for Adaptive Server…”窗口,在ODBC标签页的“Data source name”文本框中输入SmpDB, 在Database标签页的Database name文本框输入SmpDB, Database file文本框输入带路径的数据库文件名及后缀,如数据库SmpDB.db在C:\Program Files\Sybase\Adaptive Server Anywhere 7.0文件夹中,此处即输入C:\Program Files\Sybase\Adaptive Server Anywhere 7.0\SmpDB.db,或点击“Browse…”按钮选择数据库文件,然后点击“确定”按钮,ODBC数据源即设置完毕。其他数据源可参照设置。

  (二)、PowerBuilder8.0有关问题

  PowerBuilder8.0中创建应用先须创建(或打开)WorkSpace(*.pbw)文件,其他操作基本同PowerBuilder7.0。本示例在PowerBuilder8.0中运行需如下三个文件:dddw.pbl, dddw.pbw,dddw.pbt(已压缩在dddw_db.zip中)。如图(-)为PowerBuilder8.0中编辑本示例的主窗口w_main的样图。

  示例在PowerBuilder6.0/6.5、PowerBuilder7.0、PowerBuilder8.0中的运行结果图见下面附图。


        图(-)PowerBuilder8.0中编辑本示例的主窗口w_main

  附1 示例在PowerBuilder6.0/6.5中的运行结果图


  附2 示例在PowerBuilder7.0中的运行结果图


   附3 示例在PowerBuilder8.0中的运行结果图





相关文章

相关软件