計算機與信息工程學(xué)院規(guī)范化課程_第1頁
計算機與信息工程學(xué)院規(guī)范化課程_第2頁
計算機與信息工程學(xué)院規(guī)范化課程_第3頁
計算機與信息工程學(xué)院規(guī)范化課程_第4頁
計算機與信息工程學(xué)院規(guī)范化課程_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

歡迎閱讀本文檔,希望本文檔能對您有所幫助!歡迎閱讀本文檔,希望本文檔能對您有所幫助!歡迎閱讀本文檔,希望本文檔能對您有所幫助!歡迎閱讀本文檔,希望本文檔能對您有所幫助!歡迎閱讀本文檔,希望本文檔能對您有所幫助!歡迎閱讀本文檔,希望本文檔能對您有所幫助!計算機與信息工程學(xué)院規(guī)范化課程大型數(shù)據(jù)庫案例麗水學(xué)院計算機與信息工程學(xué)院周建東2007年11月目錄案例一:項目管理信息系統(tǒng)……………..1案例二:微機租賃管理系統(tǒng)…………….18案例三:麗水學(xué)院刷卡考勤系統(tǒng)……….49案例一:項目管理信息系統(tǒng)本例是一個簡化的“項目管理信息系統(tǒng)”,以項目信息(項目編碼、項目名稱、開發(fā)經(jīng)費、應(yīng)用情況和參加人員)以及項目開發(fā)人員自身的信息(編碼、姓名、性別、出生年月、職稱、部門)為主線,以部門表等為輔表,實現(xiàn)了項目和人員信息的錄入、查詢和管理等功能,展示了用PowerBuilder開發(fā)系統(tǒng)的方法和技巧。本系統(tǒng)的主要功能包括以下幾部分:項目管理信息系統(tǒng)項目管理信息系統(tǒng)系統(tǒng)管理統(tǒng)計報表數(shù)據(jù)處理部門維護人員維護人數(shù)統(tǒng)計項目統(tǒng)計更改密碼數(shù)據(jù)備份用戶管理項目維護一、創(chuàng)建應(yīng)用PowerBuilder8.0的應(yīng)用程序是以工作區(qū)文件、目標(biāo)文件、庫文件的形式保存的,因此創(chuàng)建這些文件是編寫應(yīng)用程序的第一步。1.創(chuàng)建應(yīng)用的步驟如下:⑴在Windows資源管理器中為應(yīng)用新建一個目錄,如D:\Project。此目錄用于保存本系統(tǒng)的工作區(qū)文件、目標(biāo)文件、應(yīng)用庫文件和數(shù)據(jù)庫文件。⑵啟動PowerBuilder8.0,單擊Power工具欄的新建按鈕,打開。⑶在New對話框中選擇圖標(biāo),打開New對話框。⑷選擇保存Workspace的目錄(D:\Project),并在文件名文本框中輸入Project,然后單擊“保存”按鈕,回到PowerBuilder主界面。⑸單擊Power工具欄中的新建按鈕,打開New對話框,選擇Target標(biāo)簽頁,并雙擊Application圖標(biāo),打開SpecifyNewApplicationandLibrary對話框。在該對話框中要指定應(yīng)用對象名及所用庫、目標(biāo),輸入應(yīng)用對象名后,按Tab鍵,會以默認(rèn)方式自動為應(yīng)用對象指定Library和Target,如下圖所示:⑹單擊Finish按鈕就建立了一個空白的應(yīng)用對象project,可以在PowerBuilder的SystemTree中看到。2.應(yīng)用的Open事件腳本:SQLCA.DBMS="ODBC"SQLCA.AutoCommit=FalseSQLCA.DBParm="Connectstring='DSN=Project'"CONNECTUSINGSQLCA;IFSQLCA.SQLCode<>0THEN Beep(1) MessageBox('連接錯誤',SQLCA.SQLerrText) HaltCloseELSE //this.ToolbarText=True this.ToolBarFrameTitle="框架窗口工具條" this.ToolBarSheetTitle="當(dāng)前窗口工具條" this.ToolBarPopMenuText="左邊,上邊,右邊,下邊,浮動,顯示文字,圖標(biāo)提示" OPEN(w_login)ENDIF上述腳本的作用主要是建立與數(shù)據(jù)庫的連接,然后打開登錄窗口。二、創(chuàng)建數(shù)據(jù)庫1.?dāng)?shù)據(jù)庫設(shè)計本系統(tǒng)采用了PowerBuilder8.0自帶的一個小型關(guān)系數(shù)據(jù)庫AdaptiveServerAnywhere7.0。在PowerBuilder8.0集成環(huán)境下創(chuàng)建數(shù)據(jù)庫的步驟如下:⑴單擊Power工具欄的DBProfile按鈕,打開DatabaseProfiles對話框。⑵在DatabaseProfiles對話框中展開ODBODBC列表項,在展開其下面的Utilities列表項。雙擊CreateASADatabase項,系統(tǒng)打開CreateASADatabase對話框。⑶在CreateASADatabase對話框中輸入DatabaseName(如D:\Project\Project.db),其余均用默認(rèn)值。單擊OK按鈕,系統(tǒng)開始創(chuàng)建數(shù)據(jù)庫。PowerBuilder在創(chuàng)建數(shù)據(jù)庫后,自動創(chuàng)建了ODBC數(shù)據(jù)源Project和描述文件Project,并自動連接上數(shù)據(jù)庫。如果用SybaseCentral創(chuàng)建ASA數(shù)據(jù)庫,還需要手工創(chuàng)建ODBC數(shù)據(jù)源和描述文件。2.創(chuàng)建數(shù)據(jù)表本數(shù)據(jù)庫包含5個數(shù)據(jù)表:⑴部門信息表(department) 列名列標(biāo)識數(shù)據(jù)類型寬度小數(shù)空值主鍵部門編碼dept_idchar20NY部門名稱dept_namechar200NN⑵人員信息表(personnel)列名列標(biāo)識數(shù)據(jù)類型寬度小數(shù)空值主鍵編碼p_idchar40NY姓名namechar100NN性別sexchar10YN⑶項目信息表(project)列名列標(biāo)識數(shù)據(jù)類型寬度小數(shù)空值主鍵項目編碼pro_idchar40NY項目名稱pro_namechar400NNoutlaydouble80YN⑷項目參與人員表(member)列名列標(biāo)識數(shù)據(jù)類型寬度小數(shù)空值主鍵項目編碼pro_idchar40NY編碼p_idchar40NY⑸系統(tǒng)用戶信息表(users)列名列標(biāo)識數(shù)據(jù)類型寬度小數(shù)空值主鍵用戶編碼user_idchar100NY用戶姓名user_namechar100NN密碼passwdchar60YN創(chuàng)建表的外鍵和索引以創(chuàng)建表personnel的外鍵為例,介紹創(chuàng)建外鍵的步驟。⑴在數(shù)據(jù)庫畫板的Object視圖中,找到并雙擊打開personnel表,右擊ForeignKeys,打開彈出式菜單。⑵在彈出式菜單中選擇NewForeignKey菜單項,進入ForeignKey視圖。在Gereral標(biāo)簽頁中設(shè)置外鍵名稱和本表外鍵對應(yīng)字段;在PrimaryKey標(biāo)簽頁中設(shè)置外鍵的對應(yīng)表;在Rules標(biāo)簽頁中設(shè)置外鍵連接規(guī)則。其創(chuàng)建的外鍵為:fk_dept_id,外鍵字段為p_id,對應(yīng)department表的主鍵dept_id⑶設(shè)置完成后,單擊工具欄上的Save按鈕,保存所創(chuàng)建的外鍵。表member的兩個外鍵,分別為:fk_member_proid:外鍵字段為pro_id,對應(yīng)project表的主鍵pro_idfk_member_pid:外鍵字段為p_id,對應(yīng)表personnel的主鍵p_id3.創(chuàng)建編輯風(fēng)格在數(shù)據(jù)庫畫板中創(chuàng)建編輯風(fēng)格,并設(shè)定表中某列的編輯風(fēng)格,這樣在日后生成數(shù)據(jù)窗口時,該列將使用在數(shù)據(jù)畫板中定義的編輯風(fēng)格,從而可以節(jié)省設(shè)計的時間和工作量。本實例需要創(chuàng)建三個編輯風(fēng)格,分別命名為es_department、es_project和es_personnel,分別用來顯示部門數(shù)據(jù)、項目數(shù)據(jù)和開發(fā)人員數(shù)據(jù)。這三個編輯風(fēng)格均使用下拉數(shù)據(jù)窗口樣式,因此,在創(chuàng)建編輯風(fēng)格之前,首先應(yīng)創(chuàng)建三個數(shù)據(jù)窗口對象。創(chuàng)建dddw_department數(shù)據(jù)窗口對象該數(shù)據(jù)窗口的表現(xiàn)風(fēng)格為Tabular,數(shù)據(jù)源為department表的所有列。在數(shù)據(jù)窗口畫板下,把dept_id設(shè)為不可見。該數(shù)據(jù)窗口的布局如圖所示。下面以創(chuàng)建es_department編輯風(fēng)格為例,介紹具體操作步驟為:⑴在數(shù)據(jù)庫畫板下,打開擴展屬性(ExtendedAttributes)視圖,右擊EditStyles項目,顯示彈出式菜單。⑵在彈出式菜單中選擇New菜單項,打開EditStyle對話框。⑶按照下圖所示,輸入各有關(guān)參數(shù)。⑷輸入完畢,單擊OK按鈕,返回數(shù)據(jù)庫畫板。三、創(chuàng)建用戶對象、全局函數(shù)和祖先窗口為了減輕應(yīng)用程序設(shè)計的工作量,以及使應(yīng)用程序更容易維護,在進行系統(tǒng)開發(fā)時往往需要創(chuàng)建一些用戶對象。本實例需要創(chuàng)建多個命令按鈕用戶對象和兩個數(shù)據(jù)窗口用戶對象,還需要創(chuàng)建一個用來對用戶口令加密的全局函數(shù),創(chuàng)建一個作為所有表單(Sheet)祖先的窗口。1.創(chuàng)建命令按鈕用戶對象為應(yīng)用中常用的命令按鈕創(chuàng)建用戶對象,然后根據(jù)需要把這些按鈕用戶對象添加到窗口中,可以使應(yīng)用界面保持一致,也便于日后維護。本實例需要創(chuàng)建8個按鈕用戶對象。這8個按鈕用戶對象的名稱、屬性和功能如下表所示。名稱Text屬性值功能uo_ok確定(&Y)確認(rèn)當(dāng)前操作uo_closse關(guān)閉(&C)關(guān)閉當(dāng)前窗口uo_delete刪除(&D)刪除當(dāng)前記錄uo_edit編輯(&E)編輯當(dāng)前記錄uo_find查找(&F)打開查詢窗口uo_new新增(&N)新增一條記錄uo_refresh刷新(&R)刷新當(dāng)前數(shù)據(jù)窗口uo_save保存(&S)保存數(shù)據(jù)下面以"關(guān)閉"按鈕用戶對象為例,介紹建立按鈕用戶對象的步驟。⑴單擊Power工具欄上的New按鈕,在打開的New對話框中選擇PBObject標(biāo)簽頁,然后選擇StandardVisual圖標(biāo),在單擊OK按鈕,打開SelectStantardVisualType對話框。⑵在對話框中選擇Commandbutton列表項,然后單擊OK按鈕,打開用戶對象畫板。⑶在屬性視圖中設(shè)置有關(guān)屬性,如下圖所示:⑷在腳本視圖中編寫該按鈕clicked事件的腳本?!瓣P(guān)閉”按鈕的clicked事件腳本為:Close(Parent)⑸單擊畫板工具欄的Save按鈕,保存用戶對象,名字為uo_close。按照上述辦法建立其它按鈕用戶對象。(除uo_close外,其它按鈕不選中Cancel屬性,而且不用編寫事件腳本)。2.創(chuàng)建數(shù)據(jù)窗口用戶對象本實例需要建立兩個數(shù)據(jù)窗口用戶對象。⑴建立uo_dw_freeform數(shù)據(jù)窗口用戶對象單擊Power工具欄上的New按鈕,在打開的New對話框中選擇PBObject標(biāo)簽頁,然后選擇StandardVisual圖標(biāo),再單擊OK按鈕,打開SelectStandardVisualType對話框,選擇datawindow列表項,然后單擊OK按鈕,打開用戶對象畫板。⑵定義外部全局變量。語句如下:Stringgs_userid,gs_pwd//用戶ID,用戶密碼Booleangb_manager//管理者⑶建立用戶自定義事件。首先定義API函數(shù)subroutinekeybd_event(uintbVk,uintbScan,longdwFlags,longdwExtraInfo)library'user32.dll'Shift_er自定義事件:事件ID為pbm_dwnkey。事件腳本如下://回車鍵及下箭頭鍵下移焦點Ifkey=KeyEnter!OrKey=KeyDownArrow!Then keybd_event(9,0,0,0)//按下tab keybd_event(9,0,2,0)//釋放tab Return0EndIf//上箭頭鍵上移焦點IfKey=KeyUpArrow!Then keybd_event(16,0,0,0)//按下shift keybd_event(9,0,0,0)//按下tab keybd_event(9,0,2,0)//釋放tab keybd_event(16,0,2,0)//釋放shift Return1EndIf該事件用來實現(xiàn)在數(shù)據(jù)窗口中用回車鍵及上下箭頭移動輸入焦點。注:用回車鍵代替Tab鍵也可以用發(fā)送消息的方式來實現(xiàn):Send(Handle(this),256,9,Long(0,0))Return1ue_delete自定義事件:事件ID為none。事件腳本如下://刪除當(dāng)前記錄IFGetRow()>0THEN IFDeleteRow(0)=1THEN MessageBox('提示','當(dāng)前記錄已被刪除,請按"保存"按鈕提交') ENDIFENDIF該事件用來刪除數(shù)據(jù)窗口的當(dāng)前記錄。ue_refresh自定義事件:事件ID為none。事件腳本如下://刷新數(shù)據(jù)This.Retrieve()該事件用來重新檢索數(shù)據(jù)窗口的數(shù)據(jù)(刷新顯示)。ue_save自定義事件:事件ID為none。事件腳本如下://保存數(shù)據(jù)IFthis.Update()>0THEN COMMITUSINGSQLCA; MessageBox('提示','數(shù)據(jù)已存盤')ELSE ROLLBACKUSINGSQLCA; MessageBox('提示','數(shù)據(jù)無法存盤',Exclamation!)ENDIF該事件用來更新并提交數(shù)據(jù)窗口的當(dāng)前記錄。⑷編寫dberror事件的腳本。MessageBox('數(shù)據(jù)庫錯誤','錯誤代碼:'+string(sqldbcode)+& '~r~n'+'錯誤信息:'+sqlerrtext)Return1⑸以uo_dw_freeform為名保存該用戶對象。建立uo_dw_gridform數(shù)據(jù)窗口用戶對象該用戶對象繼承自uo_dw_freeform,把shift_er自定義事件的腳本更改為://按回車鍵向后移焦點IFkey=KeyEnter!THEN keybd_event(9,0,0,0)//按下tab keybd_event(9,0,2,0)//釋放tab Return1ENDIF數(shù)據(jù)窗口標(biāo)準(zhǔn)類,用回車鍵、下箭頭、上箭頭改變輸入焦點,適用于grid風(fēng)格3.建立全局函數(shù)f_encrypt()該函數(shù)用來實現(xiàn)對系統(tǒng)用戶口令的加密。函數(shù)的定義信息如圖所示。函數(shù)的腳本如下://功能:口令加密//參數(shù):字符串//返回值:字符串Integeri,li_kllenStringls_zmklli_kllen=LEN(a_ymm)FORi=1TOli_kllenls_zmkl=ls_zmkl+CHAR(ASC(Mid(a_ymm,i,1))+i+li_kllen)NEXTRETURNls_zmkl通過加密函數(shù),保存在數(shù)據(jù)庫的用戶密碼就不是明文,而是加密的密文。4.建立表單(Sheet)祖先窗口w_basesheet該窗口的所有屬性均采用默認(rèn)值。其Open事件的腳本如下:this.X=(w_main.WorkSpaceWidth()-this.Width)/2this.Y=(w_main.WorkSpaceHeight()-w_main.mdi_1.MicroHelpHeight-this.Height)/2-50上述語句的作用是實現(xiàn)表單窗口在工作區(qū)的中間顯示。由于主窗口w_main還未創(chuàng)建,因此需要把它們加上注釋標(biāo)記,待創(chuàng)建主窗口后,再去掉注釋標(biāo)記。四、各功能窗口的設(shè)計1.系統(tǒng)主窗口的設(shè)計本實例創(chuàng)建的是多文檔界面(MDI)應(yīng)用,因此需要創(chuàng)建一個主窗口作為應(yīng)用程序的主界面。該窗口的類型為mdihelp,窗口標(biāo)題為“項目信息管理系統(tǒng)”。窗口以w_main為名字存盤。編寫窗口的closequery事件腳本:longll_returnll_return=messagebox("提示信息","確認(rèn)退出系統(tǒng)嗎?",Question!,YesNo!,1)ifll_return=2then return1//不關(guān)閉窗口else return0//關(guān)閉窗口endif這段程序的作用是,當(dāng)用戶關(guān)閉系統(tǒng)主窗口時,系統(tǒng)會提示用戶是否確認(rèn)退出,以避免用戶的誤操作導(dǎo)致系統(tǒng)終止運行,如下圖所示。2.用戶登錄窗口用戶登錄窗口是應(yīng)用程序的入口,用來對用戶的身份進行驗證。⑴新建一個窗口,窗口類型為Response,窗口標(biāo)題為“用戶登錄”。⑵在新窗口中添加以下控件:一個圖片控件;兩個靜態(tài)文本控件,其Text屬性分別是“用戶名”和“用戶密碼”;兩個單行編輯框控件,分別命名為sle_name和sle_pw;兩個按鈕用戶對象uo_ok和uo_close,分別命名為cb_ok和cb_close。窗口的整體布局如下圖所示:⑶定義全局變量:Stringgs_userid,gs_pwd//用戶ID,用戶密碼Booleangb_manager//管理者⑷建立實例變量:Integerii_time=1//登錄次數(shù)⑸為sle_name的Modified事件編寫如下腳本:sle_pw.SetFocus()⑹為sle_pw的Modified事件編寫如下腳本:IFKeyDown(KeyEnter!)THEN ifthis.text=""then return else SetFocus(cb_ok) cb_ok.triggerevent(clicked!) endifendif⑺為cb_ok的Clicked事件編寫如下腳本:Stringls_name,ls_pw,ls_typels_name=sle_name.Textls_pw=sle_pw.TextIFls_name<>''THEN //取出用戶密碼和用戶類別 SELECTpasswd,user_type INTO:gs_pwd,:ls_type FROMusers WHEREuser_id=:ls_name; IFf_encrypt(ls_pw)<>gs_pwdTHEN IFii_time=3THEN MessageBox('登錄錯誤','對不起,你無權(quán)使用本系統(tǒng)!',Exclamation!) HALTCLOSE ELSE ii_time++ MessageBox('登錄錯誤','請輸入正確的用戶名或密碼',Exclamation!) ENDIF sle_name.SetFocus() ELSE IFls_type='0'THEN//管理用戶 gb_manager=TRUE ENDIF gs_userid=ls_name OPEN(w_main) Close(Parent) ENDIFENDIF上面的語句主要用來實現(xiàn)密碼的驗證功能,如果密碼正確,則允許進入系統(tǒng),同時把用戶名保存到全局變量中;如果密碼錯誤,則提示重新輸入,當(dāng)三次輸入錯誤的密碼后,系統(tǒng)強行關(guān)閉。在這段程序中使用了SQL嵌入語句“SELECT……”,⑻保存窗口,窗口名字為w_login。關(guān)于用戶登錄窗口的改進如下圖所示,將用戶名文本框改為下拉列表框,用戶可從下拉列表框中選擇用戶名而不需要自己輸入用戶名。上述操作員登錄窗口的控件列表如下:控件類型控件名說明窗口W_login響應(yīng)類型窗口下拉列表框Ddlb_1用于顯示操作員列表供選擇單行編輯框Sle_1供用戶輸入口令按鈕Cb_1用于輸入完畢后的確認(rèn)按鈕Cb_2用于取消輸入,推出登錄圖片P_1用于顯示窗口左面的圖片在登錄窗口的Open事件中,取得操作員的用戶名供登錄者選擇,并置入默認(rèn)的操作員。腳本如下:Stringls_opid//聲明操作員姓名變量Stringls_lastid//聲明上次登錄操作員姓名變量//1、獲取操作員信息SetPointer(HourGlass!)//把鼠標(biāo)指針改為漏斗狀DECLAREmy_cursorDYNAMICCURSORFORSQLSA;//定義動態(tài)游標(biāo)PREPARESQLSAFROM"SELECTnameFROMoperatorsORDERBYname";OPENDYNAMICmy_cursor;//打開動態(tài)游標(biāo)FETCHmy_cursorINTO:ls_opid;//從數(shù)據(jù)庫中取數(shù)據(jù)DoWhilesqlca.sqlcode=0//如果取到數(shù)據(jù) ddlb_1.AddItem(ls_opid)//把取得的操作員名添加到下拉列表框 FETCHmy_cursorINTO:ls_opid;//取下一數(shù)據(jù)Loop//循環(huán)CLOSEmy_cursor;//關(guān)閉動態(tài)游標(biāo)//2、設(shè)置初始操作員IFddlb_1.TotalItems()>0THEN//如果操作員列表存在列表項 ls_lastid=ProfileString("example.ini","操作員信息","上次登錄操作員姓名","")//從INI文件中取得上次登錄的操作員 IFls_lastid=""THEN//如果未取到 ddlb_1.SelectItem(1)//選擇下拉列表框的第一個列表項 ELSE//如果取得上次登錄的操作員 ddlb_1.SelectItem(ls_lastid,0)//選擇下拉列表框中的該操作員姓名 ENDIFENDIF上述腳本中用到了游標(biāo)技術(shù)。其作用是將SQL語句得到的多個操作員姓名逐個添加到下拉列表框之中。“確定”按鈕的Clicked事件對用戶選擇的操作員和輸入的口令進行校驗,以判斷是否為合法登錄。如果通過校驗,把操作員姓名賦值給字符串全局變量gs_operator(該變量是應(yīng)用對象的全局變量)。在應(yīng)用對象的Open事件中根據(jù)全局變量gs_operator來判斷是否需要繼續(xù)執(zhí)行。Clicked的事件腳本如下:String ls_opid//聲明用戶名變量Stringls_pass//聲明操作員口令變量ls_opid=ddlb_1.Text//取得用戶選擇下拉列表框中的用戶名IFls_opid=""THEN//如果未取到用戶名 MessageBox("登錄提示","請選擇正確的操作員!") Return//返回ENDIFSELECTpassINTO:ls_passFROMoperatorsWHEREname=:ls_opid;IFls_pass<>sle_1.TextTHEN MessageBox("系統(tǒng)提示","口令錯誤!") ReturnENDIFSetProfileString("example.ini","操作員信息","上次登錄操作員姓名",ddlb_1.Text)//把操作員姓名置入INI文件gs_operator=ls_opid//把操作員姓名賦值給字符串全局變量Close(Parent)“取消”按鈕的Clicked事件:gs_operator=""http://把空字串賦值給全局變量Close(Parent)//關(guān)閉操作員登錄窗口上述登錄校驗代碼沒有確定登陸的次數(shù),應(yīng)進行修改完善。此外還可以對登錄口令采用加密算法進行加密,在數(shù)據(jù)庫的操作員管理表中使用加密的口令,避免口令的泄密。在登錄是在將數(shù)據(jù)庫操作員管理表中的口令解密,與登錄者輸入的口令核對。3.部門數(shù)據(jù)錄入與維護窗口該窗口用來兩種部門代碼數(shù)據(jù)進行錄入、刪除和編輯。⑴繼承w_basesheet建立一個新窗口。⑵往窗口添加5個按鈕用戶對象,分別為:uo_new、uo_delete、uo_refresh、uo_save和uo_close,分別命名為cb_new、cb_delete、cb_refresh、cb_save和cb_close。一個uo_dw_grid用戶對象,命名為dw_department,其Dataobject屬性為d_department。窗口布局如下圖所示:⑶創(chuàng)建與dw_department關(guān)聯(lián)的數(shù)據(jù)窗口對象d_department。該數(shù)據(jù)窗口的表現(xiàn)風(fēng)格為Grid,數(shù)據(jù)源為department表的所有列。數(shù)據(jù)窗口的布局如下圖所示:⑷定義窗口的實例變量:integerii_id⑸編寫窗口的Open事件的腳本:dw_department.SetTransObject(SQLCA)dw_department.Retrieve()⑹編寫cb_new的Clicked事件的腳本:Stringls_maxidLongll_rowcount,ll_rowll_rowcount=dw_department.RowCount()IFll_rowcount>0THEN ls_maxid=dw_department.GetItemString(ll_rowcount,'dept_id') ii_id=Integer(ls_maxid)+1ELSE ii_id=1ENDIFll_row=dw_department.InsertRow(0)dw_department.ScrollToRow(ll_row)dw_department.SetItem(ll_row,'dept_id',String(ii_id,'00'))dw_department.SetFocus()上述語句首先取得數(shù)據(jù)窗口的最大部門ID,把它加1后賦值給新增記錄的dept_id字段。⑺編寫cb_delete的Clicked事件的腳本:dw_department.Eventue_delete()⑻編寫cb_refresh的Clicked事件的腳本:dw_department.Eventue_refresh()⑼編寫cb_save的dw_department.Eventue_save()⑽保存窗口,窗口的名字為w_department。4.?dāng)?shù)據(jù)備份窗口為了放置數(shù)據(jù)丟失和破壞,必須對系統(tǒng)數(shù)據(jù)進行定期備份。數(shù)據(jù)備份窗口用來實現(xiàn)數(shù)據(jù)備份功能。⑴新建一個Response類型的窗口,窗口的標(biāo)題為“數(shù)據(jù)備份”。⑵往窗口添加一個靜態(tài)文本控件,其Text為“備份路徑”,在它后面添加一個單行編輯框控件,命名為sle_path。在sle_path的后面添加一個圖像按鈕,命名為pb_browse,該圖像按鈕的PictureName為PowerBuilder提供的Custom050。用一個成組框把上面三個控件框起來。再添加兩個用戶對象:uo_ok和uo_close,分別命名為cb_ok和cb_close。窗口布局如下圖所示:⑶為了保存?zhèn)浞萋窂?,以便下次打開窗口時作為默認(rèn)路徑顯示,因此需要創(chuàng)建一個配置文件(INI文件)。方法如下:啟動Windows記事本,在編輯區(qū)輸入如下的語句:BackupPath然后以project.ini為文件名存盤,存盤時“保存類型”記住選擇“所有類型文件(*.*)”,而不要將它存為.txt文件。⑷編寫窗口Open事件的腳本:Stringls_pathls_path=ProfileString('project.ini','backup','path','')sle_path.Text=ls_path上述語句從配置文件中取出備份路徑,并在sle_path中顯示出來。⑸編寫cb_ok的Clicked事件腳本:Stringls_path,ls_runBooleanlb_fexistls_path=sle_path.textIFtrim(ls_path)=''ORIsnull(ls_path)THEN MessageBox('提示','請輸入或選擇備份目錄') sle_path.SetFocus() ReturnELSE IFFileExists(ls_path)=FALSETHEN IFMessageBox('提示',ls_path+'不存在,是否創(chuàng)建該目錄?',Question!,YesNo!,1)=1THEN Integerli_filenum IFCreateDirectory(ls_path)<>1THEN MessageBox('提示','無法創(chuàng)建目錄') Close(Parent) Return ENDIF ELSE sle_path.SetFocus() ENDIF ENDIFENDIFSetProfileString('project.ini','backup','path',ls_path)ls_run="dbbackup-c~"uid=dba;pwd=sql"+"~"-y~""+ls_path+"~""Close(Parent)⑹編寫pb_browse圖像的Clicked事件腳本:Stringls_path="c:\project\data"Integerli_resultli_result=GetFolder("選擇備份文件夾",ls_path)IFli_result=1THEN sle_path.text=ls_pathENDIF上述語句判斷輸入的備份路徑,如果該目錄不存在,則提示創(chuàng)建文件夾,然后把數(shù)據(jù)備份到文件夾中。否則直接把數(shù)據(jù)備份到文件夾中。注意,這段程序中調(diào)用的備份命令dbbackup.exe是專門針對AdaptiveServerAnywhere7.0數(shù)據(jù)庫開發(fā)的。對其它數(shù)據(jù)庫就不能使用這個命令。⑺保存窗口,窗口的名字為w_backup。5.更改密碼窗口設(shè)計該窗口允許用戶更改本人登錄系統(tǒng)的密碼。⑴新建一個Response類型的窗口,窗口的標(biāo)題為“密碼更改”。⑵往窗口添加三個靜態(tài)文本控件,他們的Text屬性分別為:“原密碼”、“新密碼”、“再次輸入新密碼”。在靜態(tài)文本控件的后面添加三個單行編輯框控件,分別命名為:sle_oldpw、sle_newpw、sle_newpwag,用一個成組框把上述控件框住。添加兩個用戶對象uo_ok和uo_close,分別命名為cb_ok和cb_close。窗口的布局如下圖所示:⑶編寫sle_oldpw的Modified事件的腳本:sle_newpw.SetFocus()⑷編寫sle_newpw的Modified事件的腳本:sle_newpwag.SetFocus()⑸編寫sle_newpwag的Modified事件的腳本:IFthis.Text<>sle_newpw.TextTHEN MessageBox('錯誤','前后密碼不一致,請重輸') this.SetFocus()ELSE cb_ok.SetFocus()ENDIF⑹編寫cb_ok的Clicked事件的腳本:Stringls_cpwdIFf_encrypt(sle_oldpw.Text)<>gs_pwdTHEN MessageBox('錯誤','原密碼錯誤,請重輸') sle_oldpw.SetFocus()ELSE IFsle_newpw.Text<>sle_newpwag.TextTHEN MessageBox('錯誤','前后新密碼不一致,請重輸') sle_newpw.SetFocus() ELSE ls_cpwd=f_encrypt(sle_newpw.Text) UPDATEusers SETpasswd=:ls_cpwd WHEREuser_id=:gs_userid USINGSQLCA; IFSQLCA.SQLNRows>0THEN COMMITUSINGSQLCA; MessageBox('提示','密碼已成功更改') gs_pwd=ls_cpwd ELSE ROLLBACKUSINGSQLCA; MessageBox('錯誤','無法更改密碼') ENDIF CLOSE(Parent) ENDIFENDIF⑺保存窗口,窗口的名字為w_chpwd。

案例二:微機租賃管理系統(tǒng)某電腦公司的一項業(yè)務(wù)是微機出租經(jīng)營。過去采用手工管理的方式,管理比較混亂,每到月末計算租金收入以及統(tǒng)計微機庫存情況,都要臨時計算,不僅很不正規(guī),而且也容易出錯。為此,擬研究開發(fā)一個微機出租管理系統(tǒng),用計算機進行微機出租管理??紤]這是一個比較小的系統(tǒng),因此這里只進行簡單的系統(tǒng)分析與設(shè)計。一、系統(tǒng)分析與設(shè)計㈠可行性分析建立微機出租管理系統(tǒng)從技術(shù)上看是可行的。微機出租業(yè)務(wù)比較簡單,所謂管理只需要建立相應(yīng)的數(shù)據(jù)庫,進行簡單的統(tǒng)計計算就可以完成。而電腦公司的人員具備了開發(fā)這樣系統(tǒng)的能力。建立微機出租管理系統(tǒng)從經(jīng)濟上看也是可行的。電腦公司本身就有微機,不需要另行購置;系統(tǒng)開發(fā)沒有費用;系統(tǒng)運行也不增加新的費用。系統(tǒng)運行雖然不會帶來直接的經(jīng)濟效益,但管理水平的提高也會帶來間接的效益。建立微機出租管理系統(tǒng)從應(yīng)用方面考慮也是可行的。系統(tǒng)不是很復(fù)雜,管理人員很快就能熟悉;公司本身又有改善管理的愿望,系統(tǒng)運行后會提高企業(yè)的管理水平,因此也不會有大的阻力。㈡系統(tǒng)的環(huán)境要求與基本結(jié)構(gòu)考慮電腦公司規(guī)模較小,因此擬開發(fā)的微機出租管理系統(tǒng)采用單機系統(tǒng)。系統(tǒng)環(huán)境為:操作系統(tǒng)為Windows98/Windows2000;微機采用現(xiàn)有微機,基本配置為CPU賽楊633,內(nèi)存128M,硬盤20G。數(shù)據(jù)庫采用AdaptiveServerAnywhere5.0;程序設(shè)計語言采用PowerBuilder6.5。㈢系統(tǒng)設(shè)計總體功能結(jié)構(gòu)設(shè)計⑴客戶客戶表租賃表客戶客戶表租賃表庫存表客戶登記辦理租賃辦理續(xù)租辦理退租打印合同續(xù)租數(shù)據(jù)客戶數(shù)據(jù)微機登記租賃數(shù)據(jù)退租數(shù)據(jù)退租數(shù)據(jù)⑵功能結(jié)構(gòu)圖:通過上述數(shù)據(jù)流圖可以看出,該系統(tǒng)主要有三項功能,即微機出租、續(xù)租和退租。同時還應(yīng)包括客戶登記和微機入庫登記的功能、打印租賃合同的功能、統(tǒng)計查詢的功能。具體功能結(jié)構(gòu)示意圖如下:微機租賃管理系統(tǒng)微機租賃管理系統(tǒng)統(tǒng)計查詢微機租賃系統(tǒng)維護客戶維護微機維護微機出租微機退租微機續(xù)租微機查詢客戶查詢租金統(tǒng)計備份恢復(fù)2.?dāng)?shù)據(jù)庫設(shè)計⑴實體聯(lián)系圖出租日期出租日期客戶微機租賃編號姓名單位編號名稱月租金歸還日期租金mn⑵關(guān)系模型:客戶關(guān)系EMPLOYEE(EMP_NAME,EMP_ID,EMP_WORKER,……)微機關(guān)系COM_STORE(COM_TYPE,COM_ID,COM_NAME,…,COM_STATE,COM_DATE)租賃關(guān)系COM_OUTPUT(EMP_NAME,COM_ID,COM_OUTDATE,COM_INTDATE,……)用戶關(guān)系USER(USER_ID,USER_NAME,USER_PASS,USER_LEVEL)⑶數(shù)據(jù)庫的數(shù)據(jù)結(jié)構(gòu)COM_STORE(微機)表列名列標(biāo)識數(shù)據(jù)類型寬度小數(shù)空值主鍵型號com_typechar20Y微機編號com_idchar40NY名稱com_namevarchar100NCPUcom_cpuvarchar100N內(nèi)存com_romvarchar100N硬盤com_hardvarchar100N顯卡com_carvarchar100N光驅(qū)com_cdromvarchar100N顯示器com_dispvarchar100N網(wǎng)卡com_webchar20N音箱com_boxchar20N配件com_othervarchar200Y月租金com_moneynumeric40Y狀況com_statuschar40N最近租期com_datedate40YEMPLOYEE(客戶)表列名列標(biāo)識數(shù)據(jù)類型寬度小數(shù)空值主鍵客戶姓名emp_namechar60NY身份證號emp_idchar180Y單位emp_workervarchar200Y住址emp_zhuzhivarchar200Y電話emp_telphchar110Y說明emp_othervarchar300YCOM_OUTPUT(租賃)表列名列標(biāo)識數(shù)據(jù)類型寬度小數(shù)空值主鍵微機編號com_idchar40NY客戶姓名emp_namechar60NY出租日期com_outdatedate40NY租期com_monthinteger40Y歸還日期com_intdatedate40Y交納租金com_summoneynumeric50Y租賃證件com_workcardvarchar100Y說明com_notevarchar400Y是否歸還com_yesnochar40YUSER(用戶)表列名列標(biāo)識數(shù)據(jù)類型寬度小數(shù)空值主鍵編號user_idchar40NY姓名user_namevarchar80NN密碼user_passvarchar80NN權(quán)限user_levelchar10NN系統(tǒng)輸入輸出設(shè)計⑴輸入數(shù)據(jù):微機庫存數(shù)據(jù);客戶數(shù)據(jù);租賃數(shù)據(jù);續(xù)租數(shù)據(jù);退租數(shù)據(jù)。⑵輸出數(shù)據(jù):租賃合同;租金收入統(tǒng)計表;客戶數(shù)據(jù)表;庫存微機數(shù)據(jù)表;租賃統(tǒng)計表。⑶系統(tǒng)部分窗體界面(輸入輸出)設(shè)計圖1微機出租窗體為便于用戶操作,微機續(xù)租和退租窗體界面與出租窗體基本相同。圖2微機庫存管理窗體系統(tǒng)中客戶管理窗體與微機庫存管理窗體界面基本相同。圖3微機庫存查詢窗體二、創(chuàng)建用戶對象和祖先窗口1.創(chuàng)建按鈕用戶對象創(chuàng)建多個命令按鈕用戶對象,具體如下表所示:名稱Text屬性值功能uo_picbutton_add確定(&O)確認(rèn)當(dāng)前操作uo_picbutton_add關(guān)閉(&C)關(guān)閉當(dāng)前窗口uo_picbutton_add刪除(&D)刪除當(dāng)前紀(jì)錄uo_picbutton_add編輯(&E)編輯當(dāng)前紀(jì)錄uo_picbutton_add查找(&F)打開查詢窗口uo_picbutton_add新增(&N)新增一條記錄uo_picbutton_add刷新(&R)刷新當(dāng)前數(shù)據(jù)窗口uo_picbutton_add保存(&S)保存數(shù)據(jù)以增加按鈕(A)用戶對象uo_picbutton_add為例,按鈕用戶對象的Text屬性為“增加(&A)”。在增加按鈕用戶對象上添加一個圖片p_1,在PictureName框中填上圖片名稱如resoure\add.bmp;同時添加一個按鈕cb_1。在按鈕用戶對象上建立兩個自定義函數(shù)of_enable()和of_disable()。of_enable()的腳本如下:cb_1.enabled=truep_1.enabled=truep_1.picturename=i_szenablenamethis.enabled=trueof_disable()的腳本如下:cb_1.enabled=falsep_1.enabled=falsep_1.picturename=i_szdisablenamethis.enabled=false定義按鈕用戶對象的結(jié)構(gòu)事件constructor腳本:cb_1.x=0cb_1.y=0cb_1.width=This.width-5cb_1.height=This.height-5p_1.x=This.width/16p_1.y=This.height/7i_szEnableName=p_1.picturenamei_szDisableName=left(p_1.picturename,len(p_1.picturename)&4)+"_dis."+right(p_1.picturename,3)IfThis.Enabled=Falsethen cb_1.Enabled=False p_1.Enabled=False p_1.picturename=i_szDisableNameELSE cb_1.Enabled=TRUE p_1.Enabled=TRUE p_1.picturename=i_szEnableName Endif定義圖片p_1的鼠標(biāo)移動事件mousemove腳本:capturemouse=true//當(dāng)鼠標(biāo)移入圖片控件時,設(shè)置捕獲鼠標(biāo)標(biāo)志為trueSetCapture(handle(cb_1))//當(dāng)鼠標(biāo)移入圖片控件時,調(diào)用WindowAPI函數(shù)捕獲鼠標(biāo),并指定到按鈕定義圖片p_1的單擊事件clicked腳本:parent.postevent('clicked')定義按鈕的單擊事件腳本:parent.postevent('clicked')//執(zhí)行父窗口(用戶對象)中的clicked事件定義按鈕的鼠標(biāo)移動事件腳本:ifxpos<p_1.xorxpos>(p_1.x+p_1.width)orypos<p_1.yandypos>(p_1.y+p_1.height)then//當(dāng)鼠標(biāo)離開圖片控件時ifcapturemouse=truethen//當(dāng)捕獲鼠標(biāo)標(biāo)志為true時ReleaseCapture()//調(diào)用WindowAPI函數(shù)釋放鼠標(biāo)捕獲capturemouse=false//設(shè)置捕獲鼠標(biāo)標(biāo)志為falseendifendif其他按鈕用戶對象同樣處理。2.創(chuàng)建工作表祖先窗口w_user創(chuàng)建工作表窗w_user,窗口類型為main。在窗口w_user中添加了四個按鈕用戶對象:uo_picbutton_add、uo_picbutton_save、uo_picbutton_del和uo_picbutton_close,分別命名為uo_4、uo_1、uo_3和uo_2。在窗口中添加一個數(shù)據(jù)窗口對象dw_1,其Dataobject屬性為“d_user”。w_user的Title屬性為“用戶管理”,MenuName屬性為"m_managerR"。菜單m_manager繼承于主菜單m_menu,同時添加了新的菜單項。窗口界面如圖所示:在窗口中定義四個自定義用戶事件ue_insert、ue_delete、ue_update和ue_retrieve,它們的ID編碼分別是pbm_custom01、pbm_custom02、pbm_custom03和pbm_custom04。自定義事件ue_insert的腳本如下:longrowrow=dw_1.insertrow(0)dw_1.scrolltorow(row)dw_1.setrow(row)該事件的作用是在數(shù)據(jù)窗口中插入一個空白行。自定義事件ue_delete的腳本如下:longrowintegerirow=dw_1.getrow()ifrow=0thenreturni=messagebox("提示信息","確認(rèn)要刪除此記錄嗎?",Exclamation!,YesNo!)ifi=1then dw_1.deleterow(row) ifupdate(dw_1)=1then commit; else rollback; endifendif該事件的作用是刪除數(shù)據(jù)窗口中的當(dāng)前記錄。自定義事件ue_update的腳本如下:dw_1.accepttext()ifdw_1.update()>0then DW_1.RESETUPDATE() commit;else rollback; messagebox("錯誤信息","數(shù)據(jù)保存失敗!")endif該事件的作用是更新數(shù)據(jù)窗口中的數(shù)據(jù)。自定義事件ue_retrieve的腳本如下:DW_1.RETRIEVE()該事件的作用是重新建所數(shù)據(jù)窗口中的數(shù)據(jù)。定義窗口的Open事件,其腳本如下:DW_1.SETTRANSOBJECT(SQLCA)DW_1.RETRIEVE()THIS.ParentWindow().Visibel=False//使主窗口菜單不顯示按鈕用戶對象uo_1的clicked事件腳本為:PARENT.TRIGGEREVENT("UE_UPDATE")按鈕用戶對象uo_2的clicked事件腳本為:PARENT.TRIGGEREVENT("UE_INSERT")按鈕用戶對象uo_3的clicked事件腳本為:CLOSE(PARENT)THIS.ParentWindow().Visibel=True//使主窗口菜單顯示按鈕用戶對象uo_1的clicked事件腳本為:PARENT.TRIGGEREVENT("UE_DELETE")關(guān)于自定義事件的改進意見:上述自定義事件是定義在窗口上,以后通過窗口的重用實現(xiàn)了對象的可重用性。實際上理想的情況應(yīng)該把這些自定義事件定義在數(shù)據(jù)窗口對象上,這樣就可以通過數(shù)據(jù)窗口對象的重用來使用它。建議大家按照這個思路進行修改,并比較它們的異同。數(shù)據(jù)窗口中記錄顏色的隔層顯示數(shù)據(jù)窗口在Retrieve后往往會返回很多條記錄,而這些記錄中的數(shù)據(jù)復(fù)雜,通常會造成視覺上的不便。因此如果能夠使行與行之間用不同的顏色進行區(qū)分,同時當(dāng)點擊當(dāng)前行時,顏色會突出顯示,這樣既能極大地方便使用者,又能使應(yīng)用程序增色不少。而數(shù)據(jù)窗口中的所有數(shù)據(jù)是在細(xì)目帶(Detail)中列出的,因此只要在細(xì)目帶中設(shè)置列對象(Column)的某項屬性就會影響到它的顯示效果。具體操作如下:⑴打開數(shù)據(jù)窗口dw_1,選擇所有的列(Column)。

⑵在Properties窗口中翻到Font標(biāo)簽頁,單擊BackgroundColor屬性旁邊的一個帶有紅色圖標(biāo)的小按鈕。如下圖所示:⑶在Expression表達(dá)式一欄中輸入:if(currentrow()=getrow(),rgb(255,240,194),if(mod(getrow(),2)=1,rgb(255,254,249),rgb(247,247,239)))⑷保存設(shè)置結(jié)果,數(shù)據(jù)窗口就可以得到預(yù)期的結(jié)果。此時,單數(shù)行記錄的背景顏色為淺白色,雙數(shù)行記錄的背景顏色為淺橙色,鼠標(biāo)所在當(dāng)前行的背景顏色為淺黃色。相關(guān)函數(shù)說明:

CurrentRow()與GetRow()函數(shù)是數(shù)據(jù)窗口信息函數(shù)。

1.CurrentRow()

功能描述:得到數(shù)據(jù)窗口當(dāng)前得到輸入焦點的行的行號。

語法:CurrentRow()

返回值:Long。函數(shù)執(zhí)行成功時返回當(dāng)前行的行號,無當(dāng)前行時返回0。

2.GetRow()

功能描述:返回數(shù)據(jù)窗口相應(yīng)帶中的當(dāng)前行行號。

語法:GetRow()

返回值:Long。函數(shù)執(zhí)行成功時返回相應(yīng)帶中當(dāng)前行的行號,如果數(shù)據(jù)窗口中無數(shù)據(jù)則返回0,發(fā)生錯誤時返回-1主窗口菜單與工作表菜單的無縫連接MDI主窗口菜單與工作表菜單不能同步顯示。為了解決這個問題,采取的辦法是通過繼承方式創(chuàng)建工作表菜單m_manager,在該菜單上增加新的菜單項和相應(yīng)的工具欄圖標(biāo)。然后在工作表窗口w_user的Open事件中增加一條命令語句:THIS.ParentWindow().Visibel=False其作用是使主窗口菜單不顯示。同時,在窗口的close事件中也加入語句:THIS.ParentWindow().Visibel=True其作用是恢復(fù)主窗口的菜單顯示。在m_manager菜單中,通過調(diào)用工作表窗口中的自定義用戶事件實現(xiàn)了對數(shù)據(jù)窗口的數(shù)據(jù)的各種操作,如PARENTWINDOW.TRIGGEREVENT("UE_INSERT")等等。三、創(chuàng)建數(shù)據(jù)處理維護窗口創(chuàng)建了w_user工作表祖先窗口之后,利用繼承的方法就可以生成客戶數(shù)據(jù)工作表、微機庫存表等數(shù)據(jù)處理維護窗口。需要改變的僅僅是數(shù)據(jù)窗口對象和Text屬性。四、創(chuàng)建微機租賃、續(xù)租和退租窗口微機租賃、續(xù)租和退租是微機租賃管理系統(tǒng)中的幾項主要管理工作,其工作窗口多是多表操作窗口。為了方便用戶的操作,三個窗口的界面盡可能選用相類似的控件對象。微機租賃窗口的設(shè)計微機租賃窗口如下圖所示:圖微機出租窗體微機租賃窗口中有三個數(shù)據(jù)窗口控件dw_1、dw_2和dw_3,其對應(yīng)的數(shù)據(jù)窗口對象分別為d_f_employee、d_f_output和d_g_store,它們各自顯示用戶數(shù)據(jù)、租賃數(shù)據(jù)和微機庫存數(shù)據(jù)。還有5個按鈕用戶對象uo_1、uo_2、uo_3、uo_4和uo_5,3個成組控件gb_1、gb_2和gb_3。微機租賃窗口的Open事件腳本:STRINGSTR1LONGROW1DW_1.SETTRANSOBJECT(SQLCA)DW_2.SETTRANSOBJECT(SQLCA)DW_3.SETTRANSOBJECT(SQLCA)DW_2.RETRIEVE()ROW1=DW_2.INSERTROW(0)DW_2.SCROLLTOROW(ROW1)DW_2.SETITEM(ROW1,"COM_INTDATE",RELATIVEDATE(TODAY(),31))STR1="COM_STATUS='庫存'"DW_3.SETFILTER(STR1)DW_3.FILTER()DW_3.RETRIEVE()Dw_2的itemchanged事件腳本:STRINGSTR1,STR2,STR3,STR4INTEGERMONEYLONGROW1STR3=DDW1.GETITEMSTRING(DDW1.GETROW(),"EMP_NAME")STR4="EMP_NAME='"+STR3+"'"DW_1.SETFILTER(STR4)DW_1.FILTER()DW_1.RETRIEVE()STR1=DDW2.GETITEMSTRING(DDW2.GETROW(),"COM_ID")STR2="COM_ID='"+STR1+"'"DW_3.SETFILTER(STR2)DW_3.FILTER()SELECT"COM_STORE"."COM_MONEY"INTO:MONEYFROM"COM_STORE"WHERE"COM_STORE"."COM_ID"=:STR1;ROW1=DW_2.ROWCOUNT()DW_2.SETITEM(ROW1,"COM_SUMMONEY",MONEY)Dw_2的constructor事件腳本:STRINGSTR1DW_2.GETCHILD("EMP_NAME",DDW1)DDW1.SETTRANSOBJECT(SQLCA)DDW1.RETRIEVE()DW_2.GETCHILD("COM_ID",DDW2)DDW2.SETTRANSOBJECT(SQLCA)STR1="COM_STATUS='庫存'"DDW2.SETFILTER(STR1)DDW2.FILTER()DDW2.RETRIEVE()按鈕uo_1的clicked事件腳本:CLOSE(PARENT)事件腳本的作用是關(guān)閉窗口。按鈕uo_2的clicked事件腳本://將結(jié)果存為"微機租賃合同.doc"文件。constantintegerppLayoutBlank=12OLEObjectole_objectole_object=CREATEOLEObject//連接WORDIFole_object.ConnectToNewObject("Word.Application")<>0THENMessageBox('OLE錯誤','OLE無法連接!')returnENDIFole_object.Visible=Trueole_object.Documents.open("微機租賃合同.doc")integeriiole_object.selection.goto(true,0,0,'empname')ole_object.selection.typetext(DW_2.GETITEMSTRING(DW_2.GETROW(),"EMP_NAME"))forii=1to2 ole_object.Selection.TypeBackspace()nextole_object.selection.goto(true,0,0,'COMOUTDATE')ole_object.selection.typetext(STRING(DW_2.GETITEMDATE(DW_2.GETROW(),"COM_OUTDATE")))ole_object.selection.goto(true,0,0,'COMQX')ole_object.selection.typetext(STRING(DW_2.GETITEMNUMBER(DW_2.GETROW(),"COM_MONTH")))ole_object.selection.goto(true,0,0,'COMINTDATE')ole_object.selection.typetext(STRING(DW_2.GETITEMDATE(DW_2.GETROW(),"COM_INTDATE")))ole_object.selection.goto(true,0,0,'COMSUMMONEY')ole_object.selection.typetext(STRING(DW_2.GETITEMNUMBER(DW_2.GETROW(),"COM_SUMMONEY")))ole_object.selection.goto(true,0,0,'COMCARD')ole_object.selection.typetext(TRIM(DW_2.GETITEMSTRING(DW_2.GETROW(),"COM_WORKCARD")))//ole_object.selection.goto(true,0,0,'COMNOTE')//ole_object.selection.typetext(TRIM(DW_2.GETITEMSTRING(DW_2.GETROW(),"COM_NOTE")))longll_colnum,ll_rownumconstantlongwdWord9TableBehavior=1constantlongwdAutoFitFixed=0constantlongwdCell=12stringls_value//得到數(shù)據(jù)窗口數(shù)據(jù)的列數(shù)與行數(shù)(行數(shù)應(yīng)該是數(shù)據(jù)行數(shù)+1)//ll_colnum=Long(dw_3.object.datawindow.column.count)//ll_rownum=dw_1.rowcount()+1ll_colnum=11ll_rownum=2//新建表ole_object.selection.goto(true,0,0,'TABLE')ole_object.ActiveDocument.Tables.Add(ole_object.Selection.Range,ll_rownum,ll_colnum,wdWord9TableBehavior,wdAutoFitFixed)stringls_colnameintegeri,j,kfori=1toll_colnum //得到標(biāo)題頭的名字 ls_colname=dw_3.describe('#'+string(i)+".name")+"_t"ls_value=dw_3.describe(ls_colname+".text") ole_object.Selection.TypeText(ls_value) fork=1tof_cncharnum(ls_value) ole_object.Selection.TypeBackspace() next ole_object.Selection.MoveRight(wdCell)nextdw_3.setredraw(false)ole_object.Selection.MoveLeft(wdCell)fori=2toll_rownum forj=1toll_colnum dw_3.scrolltorow(i-1) dw_3.setcolumn(j) ls_value=dw_3.gettext() ole_object.Selection.MoveRight(wdCell) ole_object.Selection.TypeText(ls_value) fork=1tof_cncharnum(ls_value) ole_object.Selection.TypeBackspace() next nextnextdw_3.setredraw(true)forii=1to3 ole_object.Selection.TypeBackspace()nextole_object.selection.goto(true,0,0,'DATE')ole_object.selection.typetext(STRING(TODAY()))constantlongwdFormatDocument=0//斷開OLE連接Ole_Object.DisConnectObject()DestroyOle_Object事件腳本的作用是將租賃輸入的結(jié)果存為"微機租賃合同.doc"文件。微機租賃合同.doc是事先建立在系統(tǒng)中的模板文件,該文件是一個Word文件。按鈕uo_3的clicked事件腳本:DATEindateintdate=DW_2.GETITEMDATE(DW_2.GETROW(),"COM_INTDATE")DW_3.SetItem(DW_3.GETROW(),"COM_STATUS","出租")DW_3.SetItem(DW_3.GETROW(),"COM_DATE",INTDATE)IFDW_2.UPDATE(TRUE,FALSE)=1THEN//如果主表可以更新,則更新輔助表,并且不重置主表更新標(biāo)志 IFDW_3.UPDATE(TRUE,FALSE)=1THEN//如果輔助表可以更新,則不重置該表更新標(biāo)志,提交事務(wù) COMMITUSINGSQLCA; IFSQLCA.SQLCODE=0THEN//如果兩表都更新成功,則重置兩表的更新標(biāo)志 DW_3.RESETUPDATE() DW_2.RESETUPDATE() MESSAGEBOX("信息提示","更新任務(wù)完成!") ENDIF ELSE//回退該事務(wù),警告庫存表更新錯誤 ROLLBACKUSINGSQLCA; MESSAGEBOX("信息提示","庫存表更新失敗!") ENDIFELSE ROLLBACK; MESSAGEBOX("信息提示","租賃表更新失敗!")ENDIF此段腳本用于同時對庫存表和租賃表進行更新。按鈕uo_4的clicked事件腳本:INTEGERYNYN=MESSAGEBOX("提示信息","確認(rèn)放棄租賃嗎?",QUESTION!,YESNO!)IFYN=1THEN ROLLBACK;ENDIF按鈕uo_5的clicked事件腳本:OPENSHEET(W_EMPLOYEE,W_MAIN,4,ORIGINAL!)微機續(xù)租窗口的設(shè)計微機續(xù)租窗口的界面如圖所示:圖微機續(xù)租窗體微機續(xù)租窗口不同于微機租賃窗口,其租機用戶信息不需要輸入,只要在已有租機用戶中查尋即可。需要更新的信息主要是租賃日期和租金等,微機續(xù)租窗口的Open事件腳本為:STRINGSTR1,STR3,WORKCARD,NOTE,YESNODATEOUTDATE,INTDATELONGROW1INTEGERMONEYDW_1.SETTRANSOBJECT(SQLCA)DW_2.SETTRANSOBJECT(SQLCA)DW_3.SETTRANSOBJECT(SQLCA)DW_2.RETRIEVE()ROW1=DW_2.INSERTROW(0)DW_2.SCROLLTOROW(ROW1)DW_2.GETCHILD("EMP_NAME",DDW1)DDW1.SETTRANSOBJECT(SQLCA)DDW1.SETFILTER("COM_YESNO='未還'")DDW1.FILTER()DDW1.RETRIEVE()STR1=DDW1.GETITEMSTRING(1,"EMP_NAME")SELECT"COM_OUTPUT"."COM_ID","COM_OUTPUT"."COM_OUTDATE","COM_OUTPUT"."COM_SUMMONEY","COM_OUTPUT"."COM_INTDATE","COM_OUTPUT"."COM_WORKCARD","COM_OUTPUT"."COM_NOTE","COM_OUTPUT"."COM_YESNO"INTO:STR3,:OUTDATE,:MONEY,:INTDATE,:WORKCARD,:NOTE,:YESNOFROM"COM_OUTPUT"WHERE"COM_OUTPUT"."EMP_NAME"=:STR1;DW_2.SETITEM(ROW1,"EMP_NAME",STR1)DW_2.SETITEM(ROW1,"COM_ID",STR3)DW_2.SETITEM(ROW1,"COM_OUTDATE",OUTDATE)DW_2.SETITEM(ROW1,"COM_SUMMONEY",MONEY)DW_2.SETITEM(ROW1,"COM_INTDATE",INTDATE)DW_2.SETITEM(ROW1,"COM_WORKCARD",WORKCARD)DW_2.SETITEM(ROW1,"COM_NOTE",NOTE)DW_2.SETITEM(ROW1,"COM_YESNO",YESNO)//DW_2.RETRIEVE(STR1)DW_1.RETRIEVE(STR1)DW_3.RETRIEVE(STR3)DW_2數(shù)據(jù)窗口中創(chuàng)建了一個自定義事件ue_dddw,其ID為pbm_command。自定義事件腳本如下:STRINGSTR1,STR2,STR3,WORKCARD,NOTE,YESNOLONGROW1,ROW2DATEINTDATE,OUTDATEINTEGERMONEYGETCHILD("EMP_NAME",DDW1)ROW1=DW_2.ROWCOUNT()IFhwndchild=Handle(DDW1)THEN//對應(yīng)DDW1的句柄 IFnotificationcode=2048THEN//行發(fā)生改變(RowFocusChanged) ROW2=DDW1.GETROW() STR1=DDW1.GETITEMSTRING(ROW2,"EMP_NAME") SELECT"COM_OUTPUT"."COM_ID","COM_OUTPUT"."COM_OUTDATE","COM_OUTPUT"."COM_SUMMONEY","COM_OUTPUT"."COM_INTDATE","COM_OUTPUT"."COM_WORKCARD","COM_OUTPUT"."COM_NOTE","COM_OUTPUT"."COM_YESNO" INTO:STR3,:OUTDATE,:MONEY,:INTDATE,:WORKCARD,:NOTE,:YESNO FROM"COM_OUTPUT"WHERE"COM_OUTPUT"."EMP_NAME"=:STR1; DW_2.SETITEM(ROW1,"EMP_NAME",STR1) DW_2.SETITEM(ROW1,"COM_ID",STR3) DW_2.SETITEM(ROW1,"COM_OUTDATE",OUTDATE) DW_2.SETITEM(ROW1,"COM_SUMMONEY",MONEY) DW_2.SETITEM(ROW1,"COM_INTDATE",INTDATE) DW_2.SETITEM(ROW1,"COM_WORKCARD",WORKCARD) DW_2.SETITEM(ROW1,"COM_NOTE",NOTE) DW_2.SETITEM(ROW1,"COM_YESNO",YESNO) DW_1.RETRIEVE(STR1) DW_3.RETRIEVE(STR3) ENDIFENDIF自定義事件的作用是當(dāng)下拉數(shù)據(jù)窗口的當(dāng)前

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論