在PB中實現數據錄入維持序號連續性的簡單實現

在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()。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章