函数的连续性:在PB中实现数据录入维持序号连续性的简单实现

江西思创数码科技有限公司 江恭和

在实际开发应用常常会碰到数据行增加、插入、删除要求保持数据行字段值连续性如在职工表中希望按职务高低赋予区别连续以便按职务高低进行显示;在制定工作任务或计划时能体现1、2、3、4 ... 连续子项目在此将此类要求连续值称为序号则要求能实现以下功能:
1)增加(追加)数据行时能根据当前数据总行数(n)追加新序号为(n+1)
2)插入数据行时能根据当前所在行序号(r)将序号大于和等于(r)值都加上1即序号(r)被赋予给新 插入数据行而原来序号rr+1...n数据行序号变为r+1r+2...n+1
3)删除数据行时能根据当前所在行序号(r)将序号大于和等于(r)值都减去1即原来序号rr+1 ...n数据行序号变为r-1r...n-1
对于员来说实现上述 3个功能逻辑上来说比较简单但对于具体开发语言实现起来却有难度特别是当序号是关键字组成的更是较为困难本人曾用Delphi开发订货为实现订货明细录入具有以上功能竟然为此编制了 3个后台存储过程才得和实现虽可在前台实现但数据行大于几十行时速度其慢无比而当时个订货明细数据行般在千条以上
而在Powerbuilder在保证较好响应速度可直接在前台实现上述功能简直是小菜这主要是Powerbuilder和Delphi对数据控制机制区别而造成
下面就在Powerbuilder中实现上述功能思路方法举例予以介绍说明

1.创建个employee表如下:
create table employee(
serial number, //序号
name varchar2(30), //姓名
duty varchar2(20), //职务
primary key(serial) //设置字段serial为主键
)

2.假设表中将插入如下数据,要求按职位高低进行显示在此例中序号即表示了职务高低
序号  姓名  职务
1  board chairman  董事长
2  general manager  总经理
3 manager  经理
.
  .
  .   
3.创建个性新库,称作autoserial.pbl,以及个应用对象称作a_autoserial
4.使用DataWindow画板创建个数据窗口对象dw_employee
Data Source选择Quick Select或SQL Select
Presentation Style选择Grid
Table 选择刚创建employee  
Selection List 选择serial,name,duty (注意serial字段在Selection List中位置)

5.使用Window画板创建个窗口w_autoserial,并在窗体中放入以下Control控件
Control控件名   属性   值  
DataWindows Control   Name  dw_1  
DataWindows Object   Name   "dw_employee"  
HScrollBar   TRUE  
VScrollBar   TRUE  
Command Button   Name   cb_insert  
Text   "插入"  
Command Button   Name   cb_add  
Text   "增加"  
Command Button   Name   cb_delete  
Text   "删除"  
Command Button   Name   cb_save  
Text   "保存"  
6.在Application画板中在应用对象Open事件中输入如下代码
// Profile project
SQLCA.DBMS = "OR8 ORACLE 8.0"
SQLCA.LogPass = "password"
SQLCA.ServerName = "gxmis"
SQLCA.LogId = "projectdba"
SQLCA.AutoCommit = False
SQLCA.DBParm = ""
//以上为连接数据库配置由用户根据具体设置
connect using sqlca;
open(w_autoserial) //打开w_autoserial窗口

7.窗口w_autoserial中Open事件中输入如下代码
dw_1.transobject(sqlca)
dw_1.retrieve

8.为窗口w_autoserial中数据窗口dw_1声明个用户事件ue_reassign_serial
用户事件ue_reassign_serial介绍说明
Event Name ue_reassign_serial
Event ID
Return (none)
Argument serial_position long Value
其中参数serial_position接收数据窗口对象dw_employee中序号字段在Selection List位置本例中序号字段位置为1
事件脚本如下
long i
this.redraw(false)
for i=1 to this.rowcount  
this.object.Data[i,serial_position]=i //重置序号
next
this.redraw(True)

9. 编写窗口w_autoserial中Command ButtonControl控件脚本
9.1 cb_insert按钮clicked事件代码
long ll_curr,ll_cur
ll_curr=dw_1.getrow
ll_cur=dw_1.insertrow(ll_curr)
//序号维护事件1为序号字段在Selection List中位置
dw_1.event trigger ue_reassign_serial(1)  
dw_1.focus
dw_1.column("name")
dw_1.scrolltorow(ll_cur)

9.2 cb_add按钮clicked事件代码
long ll_curr,ll_cur
ll_cur=dw_1.insertrow(0)
dw_1.event trigger ue_reassign_serial(1)
dw_1.focus
dw_1.column("name")
dw_1.scrolltorow(ll_cur)

9.3 cb_delete按钮clicked事件代码
messagebox('删除请求','肯定要删除该人员?',stopsign!,yesno!,2)=1 then
dw_1.deleterow(0)
dw_1.event trigger ue_reassign_serial(1)
end

9.4 cb_save按钮clicked事件代码
dw_1.update=1 then
commit;

rollback;
end

本例在Powerbuild 6.5 ,数据库oracle 8.0.5 上测试通过对于序号上千本思路方法也能应付自如如果中序号不为关键字或为些简单表格可在DataWindow中增加计算字段来实现以上功能计算字段表达式为getrow
Tags:  函数连续性 连续性 连续性方程 函数的连续性

延伸阅读

最新评论

发表评论