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

转载 2012年03月31日 11:13:08

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

(加入日期:2001-8-9)

保存文章至硬盘】【打印文章】【字体:

分享到: 0
江西思创数码科技有限公司 江恭和

在实际开发应用程序中,常常会碰到数据行增加、插入、删除要求保持数据行的某一字段值的连续性。如在职工表中希望按职务高低赋予不同的连续的值,以便按职务高低进行显示;在制定工作任务或计划时能体现1、2、3、4 ... 连续的子项目。在此将此类要求连续的值称为序号。则要求程序能实现以下功能:
1)增加(追加)数据行时,能根据当前数据的总行数(n),追加新序号为(n+1)
2)插入数据行时,能根据当前所在行的序号(r),将序号大于和等于(r)的值都加上1。即序号(r)被赋予给新 插入的数据行,而原来序号r,r+1,...,n的数据行序号变为r+1,r+2,...,n+1
3)删除数据行时,能根据当前所在行的序号(r),将序号大于和等于(r)的值都减去1。即原来序号r,r+1, ...,n的数据行序号变为r-1,r,...,n-1
对于程序员来说,实现上述三个功能逻辑上来说比较简单,但对于具体开发语言实现起来却有一定的难度,特别是当序号是关键字组成之一时,更是较为困难。本人曾用Delphi开发一订货程序为实现订货明细录入具有以上功能,竟然为此编制了三个后台存储过程,才得与实现,虽可在前台实现但数据行大于几十行时,速度其慢无比,而当时一个订货明细数据行一般在千条以上。
而在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,并在窗体中放入以下控件。
控件名   属性   值  
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.settransobject(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.setredraw(false)
for i=1 to this.rowcount()  
this.object.Data[i,serial_position]=i //重置序号
next
this.setredraw(True)

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

9.2 cb_add按钮的clicked事件代码
long ll_curr,ll_newcur
ll_newcur=dw_1.insertrow(0)
dw_1.event trigger ue_reassign_serial(1)
dw_1.setfocus()
dw_1.setcolumn("name")
dw_1.scrolltorow(ll_newcur)

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

9.4 cb_save按钮的clicked事件代码
if dw_1.update()=1 then
commit;
else
rollback;
end if

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

相关文章推荐

【Little_things】jsp+MySql简单的数据录入功能

这学期开设了JSP Web技术课程,上机的时候有一个简单的签到系统,用的就是JSP+数据库。其原理就是事先在数据库中加入了本班所有同学的学号和姓名,然后根据输入的学号和机号更新学号所在行的数据。  ...

c#简单数据录入系统

  • 2009-02-23 18:25
  • 540KB
  • 下载

数据录入窗口的通用写法[转载]

数据录入窗口的通用写法[转载] 2010-08-01 22:02:22| 分类: PB学习资料 | 标签:录入 窗口 通用 程序 |举报 |字号大中小 订阅 ...

图形化的机房资源理系统的数据录入与资料集成

一:属性数据的录入 我们知道,像在CAD之类的绘图软件上画图,如果我们要对该图形进行信息的描述,可能更多采用的办法是在旁边添加“备注”之类的文本,但是如果有很多信息需要描述时,采用这种方法就...

图形化的机房综合布线管理系统的数据录入

一:属性数据的录入 我们知道,像在CAD之类的绘图软件上画图,如果我们要对该图形进行信息的描述,可能更多采用的办法是在旁边添加“备注”之类的文本,但是如果有很多信息需要描述时,采用这种方法就...

【来日复制粘贴】跨sheet的数据录入

效果: 录入Sheet2: 代码的含义需自己点明一下,方便日后用起来瞬间理解它的运行逻辑。 Sub haha() Dim lastRow As Long Dim lstData As List...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)