版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
歡迎閱讀本文檔,希望本文檔能對(duì)您有所幫助!歡迎閱讀本文檔,希望本文檔能對(duì)您有所幫助!歡迎閱讀本文檔,希望本文檔能對(duì)您有所幫助!歡迎閱讀本文檔,希望本文檔能對(duì)您有所幫助!歡迎閱讀本文檔,希望本文檔能對(duì)您有所幫助!歡迎閱讀本文檔,希望本文檔能對(duì)您有所幫助!計(jì)算機(jī)與信息工程學(xué)院規(guī)范化課程大型數(shù)據(jù)庫(kù)案例麗水學(xué)院計(jì)算機(jī)與信息工程學(xué)院周建東2007年11月目錄案例一:項(xiàng)目管理信息系統(tǒng)……………..1案例二:微機(jī)租賃管理系統(tǒng)…………….18案例三:麗水學(xué)院刷卡考勤系統(tǒng)……….49案例一:項(xiàng)目管理信息系統(tǒng)本例是一個(gè)簡(jiǎn)化的“項(xiàng)目管理信息系統(tǒng)”,以項(xiàng)目信息(項(xiàng)目編碼、項(xiàng)目名稱(chēng)、開(kāi)發(fā)經(jīng)費(fèi)、應(yīng)用情況和參加人員)以及項(xiàng)目開(kāi)發(fā)人員自身的信息(編碼、姓名、性別、出生年月、職稱(chēng)、部門(mén))為主線,以部門(mén)表等為輔表,實(shí)現(xiàn)了項(xiàng)目和人員信息的錄入、查詢(xún)和管理等功能,展示了用PowerBuilder開(kāi)發(fā)系統(tǒng)的方法和技巧。本系統(tǒng)的主要功能包括以下幾部分:項(xiàng)目管理信息系統(tǒng)項(xiàng)目管理信息系統(tǒng)系統(tǒng)管理統(tǒng)計(jì)報(bào)表數(shù)據(jù)處理部門(mén)維護(hù)人員維護(hù)人數(shù)統(tǒng)計(jì)項(xiàng)目統(tǒng)計(jì)更改密碼數(shù)據(jù)備份用戶管理項(xiàng)目維護(hù)一、創(chuàng)建應(yīng)用PowerBuilder8.0的應(yīng)用程序是以工作區(qū)文件、目標(biāo)文件、庫(kù)文件的形式保存的,因此創(chuàng)建這些文件是編寫(xiě)應(yīng)用程序的第一步。1.創(chuàng)建應(yīng)用的步驟如下:⑴在Windows資源管理器中為應(yīng)用新建一個(gè)目錄,如D:\Project。此目錄用于保存本系統(tǒng)的工作區(qū)文件、目標(biāo)文件、應(yīng)用庫(kù)文件和數(shù)據(jù)庫(kù)文件。⑵啟動(dòng)PowerBuilder8.0,單擊Power工具欄的新建按鈕,打開(kāi)。⑶在New對(duì)話框中選擇圖標(biāo),打開(kāi)New對(duì)話框。⑷選擇保存Workspace的目錄(D:\Project),并在文件名文本框中輸入Project,然后單擊“保存”按鈕,回到PowerBuilder主界面。⑸單擊Power工具欄中的新建按鈕,打開(kāi)New對(duì)話框,選擇Target標(biāo)簽頁(yè),并雙擊Application圖標(biāo),打開(kāi)SpecifyNewApplicationandLibrary對(duì)話框。在該對(duì)話框中要指定應(yīng)用對(duì)象名及所用庫(kù)、目標(biāo),輸入應(yīng)用對(duì)象名后,按Tab鍵,會(huì)以默認(rèn)方式自動(dòng)為應(yīng)用對(duì)象指定Library和Target,如下圖所示:⑹單擊Finish按鈕就建立了一個(gè)空白的應(yīng)用對(duì)象project,可以在PowerBuilder的SystemTree中看到。2.應(yīng)用的Open事件腳本:SQLCA.DBMS="ODBC"SQLCA.AutoCommit=FalseSQLCA.DBParm="Connectstring='DSN=Project'"CONNECTUSINGSQLCA;IFSQLCA.SQLCode<>0THEN Beep(1) MessageBox('連接錯(cuò)誤',SQLCA.SQLerrText) HaltCloseELSE //this.ToolbarText=True this.ToolBarFrameTitle="框架窗口工具條" this.ToolBarSheetTitle="當(dāng)前窗口工具條" this.ToolBarPopMenuText="左邊,上邊,右邊,下邊,浮動(dòng),顯示文字,圖標(biāo)提示" OPEN(w_login)ENDIF上述腳本的作用主要是建立與數(shù)據(jù)庫(kù)的連接,然后打開(kāi)登錄窗口。二、創(chuàng)建數(shù)據(jù)庫(kù)1.?dāng)?shù)據(jù)庫(kù)設(shè)計(jì)本系統(tǒng)采用了PowerBuilder8.0自帶的一個(gè)小型關(guān)系數(shù)據(jù)庫(kù)AdaptiveServerAnywhere7.0。在PowerBuilder8.0集成環(huán)境下創(chuàng)建數(shù)據(jù)庫(kù)的步驟如下:⑴單擊Power工具欄的DBProfile按鈕,打開(kāi)DatabaseProfiles對(duì)話框。⑵在DatabaseProfiles對(duì)話框中展開(kāi)ODBODBC列表項(xiàng),在展開(kāi)其下面的Utilities列表項(xiàng)。雙擊CreateASADatabase項(xiàng),系統(tǒng)打開(kāi)CreateASADatabase對(duì)話框。⑶在CreateASADatabase對(duì)話框中輸入DatabaseName(如D:\Project\Project.db),其余均用默認(rèn)值。單擊OK按鈕,系統(tǒng)開(kāi)始創(chuàng)建數(shù)據(jù)庫(kù)。PowerBuilder在創(chuàng)建數(shù)據(jù)庫(kù)后,自動(dòng)創(chuàng)建了ODBC數(shù)據(jù)源Project和描述文件Project,并自動(dòng)連接上數(shù)據(jù)庫(kù)。如果用SybaseCentral創(chuàng)建ASA數(shù)據(jù)庫(kù),還需要手工創(chuàng)建ODBC數(shù)據(jù)源和描述文件。2.創(chuàng)建數(shù)據(jù)表本數(shù)據(jù)庫(kù)包含5個(gè)數(shù)據(jù)表:⑴部門(mén)信息表(department) 列名列標(biāo)識(shí)數(shù)據(jù)類(lèi)型寬度小數(shù)空值主鍵部門(mén)編碼dept_idchar20NY部門(mén)名稱(chēng)dept_namechar200NN⑵人員信息表(personnel)列名列標(biāo)識(shí)數(shù)據(jù)類(lèi)型寬度小數(shù)空值主鍵編碼p_idchar40NY姓名namechar100NN性別sexchar10YN⑶項(xiàng)目信息表(project)列名列標(biāo)識(shí)數(shù)據(jù)類(lèi)型寬度小數(shù)空值主鍵項(xiàng)目編碼pro_idchar40NY項(xiàng)目名稱(chēng)pro_namechar400NNoutlaydouble80YN⑷項(xiàng)目參與人員表(member)列名列標(biāo)識(shí)數(shù)據(jù)類(lèi)型寬度小數(shù)空值主鍵項(xiàng)目編碼pro_idchar40NY編碼p_idchar40NY⑸系統(tǒng)用戶信息表(users)列名列標(biāo)識(shí)數(shù)據(jù)類(lèi)型寬度小數(shù)空值主鍵用戶編碼user_idchar100NY用戶姓名user_namechar100NN密碼passwdchar60YN創(chuàng)建表的外鍵和索引以創(chuàng)建表personnel的外鍵為例,介紹創(chuàng)建外鍵的步驟。⑴在數(shù)據(jù)庫(kù)畫(huà)板的Object視圖中,找到并雙擊打開(kāi)personnel表,右擊ForeignKeys,打開(kāi)彈出式菜單。⑵在彈出式菜單中選擇NewForeignKey菜單項(xiàng),進(jìn)入ForeignKey視圖。在Gereral標(biāo)簽頁(yè)中設(shè)置外鍵名稱(chēng)和本表外鍵對(duì)應(yīng)字段;在PrimaryKey標(biāo)簽頁(yè)中設(shè)置外鍵的對(duì)應(yīng)表;在Rules標(biāo)簽頁(yè)中設(shè)置外鍵連接規(guī)則。其創(chuàng)建的外鍵為:fk_dept_id,外鍵字段為p_id,對(duì)應(yīng)department表的主鍵dept_id⑶設(shè)置完成后,單擊工具欄上的Save按鈕,保存所創(chuàng)建的外鍵。表member的兩個(gè)外鍵,分別為:fk_member_proid:外鍵字段為pro_id,對(duì)應(yīng)project表的主鍵pro_idfk_member_pid:外鍵字段為p_id,對(duì)應(yīng)表personnel的主鍵p_id3.創(chuàng)建編輯風(fēng)格在數(shù)據(jù)庫(kù)畫(huà)板中創(chuàng)建編輯風(fēng)格,并設(shè)定表中某列的編輯風(fēng)格,這樣在日后生成數(shù)據(jù)窗口時(shí),該列將使用在數(shù)據(jù)畫(huà)板中定義的編輯風(fēng)格,從而可以節(jié)省設(shè)計(jì)的時(shí)間和工作量。本實(shí)例需要?jiǎng)?chuàng)建三個(gè)編輯風(fēng)格,分別命名為es_department、es_project和es_personnel,分別用來(lái)顯示部門(mén)數(shù)據(jù)、項(xiàng)目數(shù)據(jù)和開(kāi)發(fā)人員數(shù)據(jù)。這三個(gè)編輯風(fēng)格均使用下拉數(shù)據(jù)窗口樣式,因此,在創(chuàng)建編輯風(fēng)格之前,首先應(yīng)創(chuàng)建三個(gè)數(shù)據(jù)窗口對(duì)象。創(chuàng)建dddw_department數(shù)據(jù)窗口對(duì)象該數(shù)據(jù)窗口的表現(xiàn)風(fēng)格為T(mén)abular,數(shù)據(jù)源為department表的所有列。在數(shù)據(jù)窗口畫(huà)板下,把dept_id設(shè)為不可見(jiàn)。該數(shù)據(jù)窗口的布局如圖所示。下面以創(chuàng)建es_department編輯風(fēng)格為例,介紹具體操作步驟為:⑴在數(shù)據(jù)庫(kù)畫(huà)板下,打開(kāi)擴(kuò)展屬性(ExtendedAttributes)視圖,右擊EditStyles項(xiàng)目,顯示彈出式菜單。⑵在彈出式菜單中選擇New菜單項(xiàng),打開(kāi)EditStyle對(duì)話框。⑶按照下圖所示,輸入各有關(guān)參數(shù)。⑷輸入完畢,單擊OK按鈕,返回?cái)?shù)據(jù)庫(kù)畫(huà)板。三、創(chuàng)建用戶對(duì)象、全局函數(shù)和祖先窗口為了減輕應(yīng)用程序設(shè)計(jì)的工作量,以及使應(yīng)用程序更容易維護(hù),在進(jìn)行系統(tǒng)開(kāi)發(fā)時(shí)往往需要?jiǎng)?chuàng)建一些用戶對(duì)象。本實(shí)例需要?jiǎng)?chuàng)建多個(gè)命令按鈕用戶對(duì)象和兩個(gè)數(shù)據(jù)窗口用戶對(duì)象,還需要?jiǎng)?chuàng)建一個(gè)用來(lái)對(duì)用戶口令加密的全局函數(shù),創(chuàng)建一個(gè)作為所有表單(Sheet)祖先的窗口。1.創(chuàng)建命令按鈕用戶對(duì)象為應(yīng)用中常用的命令按鈕創(chuàng)建用戶對(duì)象,然后根據(jù)需要把這些按鈕用戶對(duì)象添加到窗口中,可以使應(yīng)用界面保持一致,也便于日后維護(hù)。本實(shí)例需要?jiǎng)?chuàng)建8個(gè)按鈕用戶對(duì)象。這8個(gè)按鈕用戶對(duì)象的名稱(chēng)、屬性和功能如下表所示。名稱(chēng)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)打開(kāi)查詢(xún)窗口uo_new新增(&N)新增一條記錄uo_refresh刷新(&R)刷新當(dāng)前數(shù)據(jù)窗口uo_save保存(&S)保存數(shù)據(jù)下面以"關(guān)閉"按鈕用戶對(duì)象為例,介紹建立按鈕用戶對(duì)象的步驟。⑴單擊Power工具欄上的New按鈕,在打開(kāi)的New對(duì)話框中選擇PBObject標(biāo)簽頁(yè),然后選擇StandardVisual圖標(biāo),在單擊OK按鈕,打開(kāi)SelectStantardVisualType對(duì)話框。⑵在對(duì)話框中選擇Commandbutton列表項(xiàng),然后單擊OK按鈕,打開(kāi)用戶對(duì)象畫(huà)板。⑶在屬性視圖中設(shè)置有關(guān)屬性,如下圖所示:⑷在腳本視圖中編寫(xiě)該按鈕clicked事件的腳本?!瓣P(guān)閉”按鈕的clicked事件腳本為:Close(Parent)⑸單擊畫(huà)板工具欄的Save按鈕,保存用戶對(duì)象,名字為uo_close。按照上述辦法建立其它按鈕用戶對(duì)象。(除uo_close外,其它按鈕不選中Cancel屬性,而且不用編寫(xiě)事件腳本)。2.創(chuàng)建數(shù)據(jù)窗口用戶對(duì)象本實(shí)例需要建立兩個(gè)數(shù)據(jù)窗口用戶對(duì)象。⑴建立uo_dw_freeform數(shù)據(jù)窗口用戶對(duì)象單擊Power工具欄上的New按鈕,在打開(kāi)的New對(duì)話框中選擇PBObject標(biāo)簽頁(yè),然后選擇StandardVisual圖標(biāo),再單擊OK按鈕,打開(kāi)SelectStandardVisualType對(duì)話框,選擇datawindow列表項(xiàng),然后單擊OK按鈕,打開(kāi)用戶對(duì)象畫(huà)板。⑵定義外部全局變量。語(yǔ)句如下:Stringgs_userid,gs_pwd//用戶ID,用戶密碼Booleangb_manager//管理者⑶建立用戶自定義事件。首先定義API函數(shù)subroutinekeybd_event(uintbVk,uintbScan,longdwFlags,longdwExtraInfo)library'user32.dll'Shift_er自定義事件:事件ID為pbm_dwnkey。事件腳本如下://回車(chē)鍵及下箭頭鍵下移焦點(diǎn)Ifkey=KeyEnter!OrKey=KeyDownArrow!Then keybd_event(9,0,0,0)//按下tab keybd_event(9,0,2,0)//釋放tab Return0EndIf//上箭頭鍵上移焦點(diǎn)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該事件用來(lái)實(shí)現(xiàn)在數(shù)據(jù)窗口中用回車(chē)鍵及上下箭頭移動(dòng)輸入焦點(diǎn)。注:用回車(chē)鍵代替Tab鍵也可以用發(fā)送消息的方式來(lái)實(shí)現(xiàn):Send(Handle(this),256,9,Long(0,0))Return1ue_delete自定義事件:事件ID為none。事件腳本如下://刪除當(dāng)前記錄IFGetRow()>0THEN IFDeleteRow(0)=1THEN MessageBox('提示','當(dāng)前記錄已被刪除,請(qǐng)按"保存"按鈕提交') ENDIFENDIF該事件用來(lái)刪除數(shù)據(jù)窗口的當(dāng)前記錄。ue_refresh自定義事件:事件ID為none。事件腳本如下://刷新數(shù)據(jù)This.Retrieve()該事件用來(lái)重新檢索數(shù)據(jù)窗口的數(shù)據(jù)(刷新顯示)。ue_save自定義事件:事件ID為none。事件腳本如下://保存數(shù)據(jù)IFthis.Update()>0THEN COMMITUSINGSQLCA; MessageBox('提示','數(shù)據(jù)已存盤(pán)')ELSE ROLLBACKUSINGSQLCA; MessageBox('提示','數(shù)據(jù)無(wú)法存盤(pán)',Exclamation!)ENDIF該事件用來(lái)更新并提交數(shù)據(jù)窗口的當(dāng)前記錄。⑷編寫(xiě)dberror事件的腳本。MessageBox('數(shù)據(jù)庫(kù)錯(cuò)誤','錯(cuò)誤代碼:'+string(sqldbcode)+& '~r~n'+'錯(cuò)誤信息:'+sqlerrtext)Return1⑸以u(píng)o_dw_freeform為名保存該用戶對(duì)象。建立uo_dw_gridform數(shù)據(jù)窗口用戶對(duì)象該用戶對(duì)象繼承自u(píng)o_dw_freeform,把shift_er自定義事件的腳本更改為://按回車(chē)鍵向后移焦點(diǎn)IFkey=KeyEnter!THEN keybd_event(9,0,0,0)//按下tab keybd_event(9,0,2,0)//釋放tab Return1ENDIF數(shù)據(jù)窗口標(biāo)準(zhǔn)類(lèi),用回車(chē)鍵、下箭頭、上箭頭改變輸入焦點(diǎn),適用于grid風(fēng)格3.建立全局函數(shù)f_encrypt()該函數(shù)用來(lái)實(shí)現(xiàn)對(duì)系統(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通過(guò)加密函數(shù),保存在數(shù)據(jù)庫(kù)的用戶密碼就不是明文,而是加密的密文。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上述語(yǔ)句的作用是實(shí)現(xiàn)表單窗口在工作區(qū)的中間顯示。由于主窗口w_main還未創(chuàng)建,因此需要把它們加上注釋標(biāo)記,待創(chuàng)建主窗口后,再去掉注釋標(biāo)記。四、各功能窗口的設(shè)計(jì)1.系統(tǒng)主窗口的設(shè)計(jì)本實(shí)例創(chuàng)建的是多文檔界面(MDI)應(yīng)用,因此需要?jiǎng)?chuàng)建一個(gè)主窗口作為應(yīng)用程序的主界面。該窗口的類(lèi)型為mdihelp,窗口標(biāo)題為“項(xiàng)目信息管理系統(tǒng)”。窗口以w_main為名字存盤(pán)。編寫(xiě)窗口的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)主窗口時(shí),系統(tǒng)會(huì)提示用戶是否確認(rèn)退出,以避免用戶的誤操作導(dǎo)致系統(tǒng)終止運(yùn)行,如下圖所示。2.用戶登錄窗口用戶登錄窗口是應(yīng)用程序的入口,用來(lái)對(duì)用戶的身份進(jìn)行驗(yàn)證。⑴新建一個(gè)窗口,窗口類(lèi)型為Response,窗口標(biāo)題為“用戶登錄”。⑵在新窗口中添加以下控件:一個(gè)圖片控件;兩個(gè)靜態(tài)文本控件,其Text屬性分別是“用戶名”和“用戶密碼”;兩個(gè)單行編輯框控件,分別命名為sle_name和sle_pw;兩個(gè)按鈕用戶對(duì)象uo_ok和uo_close,分別命名為cb_ok和cb_close。窗口的整體布局如下圖所示:⑶定義全局變量:Stringgs_userid,gs_pwd//用戶ID,用戶密碼Booleangb_manager//管理者⑷建立實(shí)例變量:Integerii_time=1//登錄次數(shù)⑸為sle_name的Modified事件編寫(xiě)如下腳本:sle_pw.SetFocus()⑹為sle_pw的Modified事件編寫(xiě)如下腳本:IFKeyDown(KeyEnter!)THEN ifthis.text=""then return else SetFocus(cb_ok) cb_ok.triggerevent(clicked!) endifendif⑺為cb_ok的Clicked事件編寫(xiě)如下腳本:Stringls_name,ls_pw,ls_typels_name=sle_name.Textls_pw=sle_pw.TextIFls_name<>''THEN //取出用戶密碼和用戶類(lèi)別 SELECTpasswd,user_type INTO:gs_pwd,:ls_type FROMusers WHEREuser_id=:ls_name; IFf_encrypt(ls_pw)<>gs_pwdTHEN IFii_time=3THEN MessageBox('登錄錯(cuò)誤','對(duì)不起,你無(wú)權(quán)使用本系統(tǒng)!',Exclamation!) HALTCLOSE ELSE ii_time++ MessageBox('登錄錯(cuò)誤','請(qǐng)輸入正確的用戶名或密碼',Exclamation!) ENDIF sle_name.SetFocus() ELSE IFls_type='0'THEN//管理用戶 gb_manager=TRUE ENDIF gs_userid=ls_name OPEN(w_main) Close(Parent) ENDIFENDIF上面的語(yǔ)句主要用來(lái)實(shí)現(xiàn)密碼的驗(yàn)證功能,如果密碼正確,則允許進(jìn)入系統(tǒng),同時(shí)把用戶名保存到全局變量中;如果密碼錯(cuò)誤,則提示重新輸入,當(dāng)三次輸入錯(cuò)誤的密碼后,系統(tǒng)強(qiáng)行關(guān)閉。在這段程序中使用了SQL嵌入語(yǔ)句“SELECT……”,⑻保存窗口,窗口名字為w_login。關(guān)于用戶登錄窗口的改進(jìn)如下圖所示,將用戶名文本框改為下拉列表框,用戶可從下拉列表框中選擇用戶名而不需要自己輸入用戶名。上述操作員登錄窗口的控件列表如下:控件類(lèi)型控件名說(shuō)明窗口W_login響應(yīng)類(lèi)型窗口下拉列表框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;//定義動(dòng)態(tài)游標(biāo)PREPARESQLSAFROM"SELECTnameFROMoperatorsORDERBYname";OPENDYNAMICmy_cursor;//打開(kāi)動(dòng)態(tài)游標(biāo)FETCHmy_cursorINTO:ls_opid;//從數(shù)據(jù)庫(kù)中取數(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)閉動(dòng)態(tài)游標(biāo)//2、設(shè)置初始操作員IFddlb_1.TotalItems()>0THEN//如果操作員列表存在列表項(xiàng) ls_lastid=ProfileString("example.ini","操作員信息","上次登錄操作員姓名","")//從INI文件中取得上次登錄的操作員 IFls_lastid=""THEN//如果未取到 ddlb_1.SelectItem(1)//選擇下拉列表框的第一個(gè)列表項(xiàng) ELSE//如果取得上次登錄的操作員 ddlb_1.SelectItem(ls_lastid,0)//選擇下拉列表框中的該操作員姓名 ENDIFENDIF上述腳本中用到了游標(biāo)技術(shù)。其作用是將SQL語(yǔ)句得到的多個(gè)操作員姓名逐個(gè)添加到下拉列表框之中?!按_定”按鈕的Clicked事件對(duì)用戶選擇的操作員和輸入的口令進(jìn)行校驗(yàn),以判斷是否為合法登錄。如果通過(guò)校驗(yàn),把操作員姓名賦值給字符串全局變量gs_operator(該變量是應(yīng)用對(duì)象的全局變量)。在應(yīng)用對(duì)象的Open事件中根據(jù)全局變量gs_operator來(lái)判斷是否需要繼續(xù)執(zhí)行。Clicked的事件腳本如下:String ls_opid//聲明用戶名變量Stringls_pass//聲明操作員口令變量ls_opid=ddlb_1.Text//取得用戶選擇下拉列表框中的用戶名IFls_opid=""THEN//如果未取到用戶名 MessageBox("登錄提示","請(qǐng)選擇正確的操作員!") Return//返回ENDIFSELECTpassINTO:ls_passFROMoperatorsWHEREname=:ls_opid;IFls_pass<>sle_1.TextTHEN MessageBox("系統(tǒng)提示","口令錯(cuò)誤!") ReturnENDIFSetProfileString("example.ini","操作員信息","上次登錄操作員姓名",ddlb_1.Text)//把操作員姓名置入INI文件gs_operator=ls_opid//把操作員姓名賦值給字符串全局變量Close(Parent)“取消”按鈕的Clicked事件:gs_operator=""http://把空字串賦值給全局變量Close(Parent)//關(guān)閉操作員登錄窗口上述登錄校驗(yàn)代碼沒(méi)有確定登陸的次數(shù),應(yīng)進(jìn)行修改完善。此外還可以對(duì)登錄口令采用加密算法進(jìn)行加密,在數(shù)據(jù)庫(kù)的操作員管理表中使用加密的口令,避免口令的泄密。在登錄是在將數(shù)據(jù)庫(kù)操作員管理表中的口令解密,與登錄者輸入的口令核對(duì)。3.部門(mén)數(shù)據(jù)錄入與維護(hù)窗口該窗口用來(lái)兩種部門(mén)代碼數(shù)據(jù)進(jìn)行錄入、刪除和編輯。⑴繼承w_basesheet建立一個(gè)新窗口。⑵往窗口添加5個(gè)按鈕用戶對(duì)象,分別為:uo_new、uo_delete、uo_refresh、uo_save和uo_close,分別命名為cb_new、cb_delete、cb_refresh、cb_save和cb_close。一個(gè)uo_dw_grid用戶對(duì)象,命名為dw_department,其Dataobject屬性為d_department。窗口布局如下圖所示:⑶創(chuàng)建與dw_department關(guān)聯(lián)的數(shù)據(jù)窗口對(duì)象d_department。該數(shù)據(jù)窗口的表現(xiàn)風(fēng)格為Grid,數(shù)據(jù)源為department表的所有列。數(shù)據(jù)窗口的布局如下圖所示:⑷定義窗口的實(shí)例變量:integerii_id⑸編寫(xiě)窗口的Open事件的腳本:dw_department.SetTransObject(SQLCA)dw_department.Retrieve()⑹編寫(xiě)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()上述語(yǔ)句首先取得數(shù)據(jù)窗口的最大部門(mén)ID,把它加1后賦值給新增記錄的dept_id字段。⑺編寫(xiě)cb_delete的Clicked事件的腳本:dw_department.Eventue_delete()⑻編寫(xiě)cb_refresh的Clicked事件的腳本:dw_department.Eventue_refresh()⑼編寫(xiě)cb_save的dw_department.Eventue_save()⑽保存窗口,窗口的名字為w_department。4.?dāng)?shù)據(jù)備份窗口為了放置數(shù)據(jù)丟失和破壞,必須對(duì)系統(tǒng)數(shù)據(jù)進(jìn)行定期備份。數(shù)據(jù)備份窗口用來(lái)實(shí)現(xiàn)數(shù)據(jù)備份功能。⑴新建一個(gè)Response類(lèi)型的窗口,窗口的標(biāo)題為“數(shù)據(jù)備份”。⑵往窗口添加一個(gè)靜態(tài)文本控件,其Text為“備份路徑”,在它后面添加一個(gè)單行編輯框控件,命名為sle_path。在sle_path的后面添加一個(gè)圖像按鈕,命名為pb_browse,該圖像按鈕的PictureName為PowerBuilder提供的Custom050。用一個(gè)成組框把上面三個(gè)控件框起來(lái)。再添加兩個(gè)用戶對(duì)象:uo_ok和uo_close,分別命名為cb_ok和cb_close。窗口布局如下圖所示:⑶為了保存?zhèn)浞萋窂?,以便下次打開(kāi)窗口時(shí)作為默認(rèn)路徑顯示,因此需要?jiǎng)?chuàng)建一個(gè)配置文件(INI文件)。方法如下:?jiǎn)?dòng)Windows記事本,在編輯區(qū)輸入如下的語(yǔ)句:BackupPath然后以project.ini為文件名存盤(pán),存盤(pán)時(shí)“保存類(lèi)型”記住選擇“所有類(lèi)型文件(*.*)”,而不要將它存為.txt文件。⑷編寫(xiě)窗口Open事件的腳本:Stringls_pathls_path=ProfileString('project.ini','backup','path','')sle_path.Text=ls_path上述語(yǔ)句從配置文件中取出備份路徑,并在sle_path中顯示出來(lái)。⑸編寫(xiě)cb_ok的Clicked事件腳本:Stringls_path,ls_runBooleanlb_fexistls_path=sle_path.textIFtrim(ls_path)=''ORIsnull(ls_path)THEN MessageBox('提示','請(qǐng)輸入或選擇備份目錄') sle_path.SetFocus() ReturnELSE IFFileExists(ls_path)=FALSETHEN IFMessageBox('提示',ls_path+'不存在,是否創(chuàng)建該目錄?',Question!,YesNo!,1)=1THEN Integerli_filenum IFCreateDirectory(ls_path)<>1THEN MessageBox('提示','無(wú)法創(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)⑹編寫(xiě)pb_browse圖像的Clicked事件腳本:Stringls_path="c:\project\data"Integerli_resultli_result=GetFolder("選擇備份文件夾",ls_path)IFli_result=1THEN sle_path.text=ls_pathENDIF上述語(yǔ)句判斷輸入的備份路徑,如果該目錄不存在,則提示創(chuàng)建文件夾,然后把數(shù)據(jù)備份到文件夾中。否則直接把數(shù)據(jù)備份到文件夾中。注意,這段程序中調(diào)用的備份命令dbbackup.exe是專(zhuān)門(mén)針對(duì)AdaptiveServerAnywhere7.0數(shù)據(jù)庫(kù)開(kāi)發(fā)的。對(duì)其它數(shù)據(jù)庫(kù)就不能使用這個(gè)命令。⑺保存窗口,窗口的名字為w_backup。5.更改密碼窗口設(shè)計(jì)該窗口允許用戶更改本人登錄系統(tǒng)的密碼。⑴新建一個(gè)Response類(lèi)型的窗口,窗口的標(biāo)題為“密碼更改”。⑵往窗口添加三個(gè)靜態(tài)文本控件,他們的Text屬性分別為:“原密碼”、“新密碼”、“再次輸入新密碼”。在靜態(tài)文本控件的后面添加三個(gè)單行編輯框控件,分別命名為:sle_oldpw、sle_newpw、sle_newpwag,用一個(gè)成組框把上述控件框住。添加兩個(gè)用戶對(duì)象uo_ok和uo_close,分別命名為cb_ok和cb_close。窗口的布局如下圖所示:⑶編寫(xiě)sle_oldpw的Modified事件的腳本:sle_newpw.SetFocus()⑷編寫(xiě)sle_newpw的Modified事件的腳本:sle_newpwag.SetFocus()⑸編寫(xiě)sle_newpwag的Modified事件的腳本:IFthis.Text<>sle_newpw.TextTHEN MessageBox('錯(cuò)誤','前后密碼不一致,請(qǐng)重輸') this.SetFocus()ELSE cb_ok.SetFocus()ENDIF⑹編寫(xiě)cb_ok的Clicked事件的腳本:Stringls_cpwdIFf_encrypt(sle_oldpw.Text)<>gs_pwdTHEN MessageBox('錯(cuò)誤','原密碼錯(cuò)誤,請(qǐng)重輸') sle_oldpw.SetFocus()ELSE IFsle_newpw.Text<>sle_newpwag.TextTHEN MessageBox('錯(cuò)誤','前后新密碼不一致,請(qǐng)重輸') 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('錯(cuò)誤','無(wú)法更改密碼') ENDIF CLOSE(Parent) ENDIFENDIF⑺保存窗口,窗口的名字為w_chpwd。
案例二:微機(jī)租賃管理系統(tǒng)某電腦公司的一項(xiàng)業(yè)務(wù)是微機(jī)出租經(jīng)營(yíng)。過(guò)去采用手工管理的方式,管理比較混亂,每到月末計(jì)算租金收入以及統(tǒng)計(jì)微機(jī)庫(kù)存情況,都要臨時(shí)計(jì)算,不僅很不正規(guī),而且也容易出錯(cuò)。為此,擬研究開(kāi)發(fā)一個(gè)微機(jī)出租管理系統(tǒng),用計(jì)算機(jī)進(jìn)行微機(jī)出租管理??紤]這是一個(gè)比較小的系統(tǒng),因此這里只進(jìn)行簡(jiǎn)單的系統(tǒng)分析與設(shè)計(jì)。一、系統(tǒng)分析與設(shè)計(jì)㈠可行性分析建立微機(jī)出租管理系統(tǒng)從技術(shù)上看是可行的。微機(jī)出租業(yè)務(wù)比較簡(jiǎn)單,所謂管理只需要建立相應(yīng)的數(shù)據(jù)庫(kù),進(jìn)行簡(jiǎn)單的統(tǒng)計(jì)計(jì)算就可以完成。而電腦公司的人員具備了開(kāi)發(fā)這樣系統(tǒng)的能力。建立微機(jī)出租管理系統(tǒng)從經(jīng)濟(jì)上看也是可行的。電腦公司本身就有微機(jī),不需要另行購(gòu)置;系統(tǒng)開(kāi)發(fā)沒(méi)有費(fèi)用;系統(tǒng)運(yùn)行也不增加新的費(fèi)用。系統(tǒng)運(yùn)行雖然不會(huì)帶來(lái)直接的經(jīng)濟(jì)效益,但管理水平的提高也會(huì)帶來(lái)間接的效益。建立微機(jī)出租管理系統(tǒng)從應(yīng)用方面考慮也是可行的。系統(tǒng)不是很復(fù)雜,管理人員很快就能熟悉;公司本身又有改善管理的愿望,系統(tǒng)運(yùn)行后會(huì)提高企業(yè)的管理水平,因此也不會(huì)有大的阻力。㈡系統(tǒng)的環(huán)境要求與基本結(jié)構(gòu)考慮電腦公司規(guī)模較小,因此擬開(kāi)發(fā)的微機(jī)出租管理系統(tǒng)采用單機(jī)系統(tǒng)。系統(tǒng)環(huán)境為:操作系統(tǒng)為Windows98/Windows2000;微機(jī)采用現(xiàn)有微機(jī),基本配置為CPU賽楊633,內(nèi)存128M,硬盤(pán)20G。數(shù)據(jù)庫(kù)采用AdaptiveServerAnywhere5.0;程序設(shè)計(jì)語(yǔ)言采用PowerBuilder6.5。㈢系統(tǒng)設(shè)計(jì)總體功能結(jié)構(gòu)設(shè)計(jì)⑴客戶客戶表租賃表客戶客戶表租賃表庫(kù)存表客戶登記辦理租賃辦理續(xù)租辦理退租打印合同續(xù)租數(shù)據(jù)客戶數(shù)據(jù)微機(jī)登記租賃數(shù)據(jù)退租數(shù)據(jù)退租數(shù)據(jù)⑵功能結(jié)構(gòu)圖:通過(guò)上述數(shù)據(jù)流圖可以看出,該系統(tǒng)主要有三項(xiàng)功能,即微機(jī)出租、續(xù)租和退租。同時(shí)還應(yīng)包括客戶登記和微機(jī)入庫(kù)登記的功能、打印租賃合同的功能、統(tǒng)計(jì)查詢(xún)的功能。具體功能結(jié)構(gòu)示意圖如下:微機(jī)租賃管理系統(tǒng)微機(jī)租賃管理系統(tǒng)統(tǒng)計(jì)查詢(xún)微機(jī)租賃系統(tǒng)維護(hù)客戶維護(hù)微機(jī)維護(hù)微機(jī)出租微機(jī)退租微機(jī)續(xù)租微機(jī)查詢(xún)客戶查詢(xún)租金統(tǒng)計(jì)備份恢復(fù)2.?dāng)?shù)據(jù)庫(kù)設(shè)計(jì)⑴實(shí)體聯(lián)系圖出租日期出租日期客戶微機(jī)租賃編號(hào)姓名單位編號(hào)名稱(chēng)月租金歸還日期租金mn⑵關(guān)系模型:客戶關(guān)系EMPLOYEE(EMP_NAME,EMP_ID,EMP_WORKER,……)微機(jī)關(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ù)庫(kù)的數(shù)據(jù)結(jié)構(gòu)COM_STORE(微機(jī))表列名列標(biāo)識(shí)數(shù)據(jù)類(lèi)型寬度小數(shù)空值主鍵型號(hào)com_typechar20Y微機(jī)編號(hào)com_idchar40NY名稱(chēng)com_namevarchar100NCPUcom_cpuvarchar100N內(nèi)存com_romvarchar100N硬盤(pán)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í)數(shù)據(jù)類(lèi)型寬度小數(shù)空值主鍵客戶姓名emp_namechar60NY身份證號(hào)emp_idchar180Y單位emp_workervarchar200Y住址emp_zhuzhivarchar200Y電話emp_telphchar110Y說(shuō)明emp_othervarchar300YCOM_OUTPUT(租賃)表列名列標(biāo)識(shí)數(shù)據(jù)類(lèi)型寬度小數(shù)空值主鍵微機(jī)編號(hào)com_idchar40NY客戶姓名emp_namechar60NY出租日期com_outdatedate40NY租期com_monthinteger40Y歸還日期com_intdatedate40Y交納租金com_summoneynumeric50Y租賃證件com_workcardvarchar100Y說(shuō)明com_notevarchar400Y是否歸還com_yesnochar40YUSER(用戶)表列名列標(biāo)識(shí)數(shù)據(jù)類(lèi)型寬度小數(shù)空值主鍵編號(hào)user_idchar40NY姓名user_namevarchar80NN密碼user_passvarchar80NN權(quán)限user_levelchar10NN系統(tǒng)輸入輸出設(shè)計(jì)⑴輸入數(shù)據(jù):微機(jī)庫(kù)存數(shù)據(jù);客戶數(shù)據(jù);租賃數(shù)據(jù);續(xù)租數(shù)據(jù);退租數(shù)據(jù)。⑵輸出數(shù)據(jù):租賃合同;租金收入統(tǒng)計(jì)表;客戶數(shù)據(jù)表;庫(kù)存微機(jī)數(shù)據(jù)表;租賃統(tǒng)計(jì)表。⑶系統(tǒng)部分窗體界面(輸入輸出)設(shè)計(jì)圖1微機(jī)出租窗體為便于用戶操作,微機(jī)續(xù)租和退租窗體界面與出租窗體基本相同。圖2微機(jī)庫(kù)存管理窗體系統(tǒng)中客戶管理窗體與微機(jī)庫(kù)存管理窗體界面基本相同。圖3微機(jī)庫(kù)存查詢(xún)窗體二、創(chuàng)建用戶對(duì)象和祖先窗口1.創(chuàng)建按鈕用戶對(duì)象創(chuàng)建多個(gè)命令按鈕用戶對(duì)象,具體如下表所示:名稱(chē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)打開(kāi)查詢(xún)窗口uo_picbutton_add新增(&N)新增一條記錄uo_picbutton_add刷新(&R)刷新當(dāng)前數(shù)據(jù)窗口uo_picbutton_add保存(&S)保存數(shù)據(jù)以增加按鈕(A)用戶對(duì)象uo_picbutton_add為例,按鈕用戶對(duì)象的Text屬性為“增加(&A)”。在增加按鈕用戶對(duì)象上添加一個(gè)圖片p_1,在PictureName框中填上圖片名稱(chēng)如resoure\add.bmp;同時(shí)添加一個(gè)按鈕cb_1。在按鈕用戶對(duì)象上建立兩個(gè)自定義函數(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定義按鈕用戶對(duì)象的結(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)移動(dòng)事件mousemove腳本:capturemouse=true//當(dāng)鼠標(biāo)移入圖片控件時(shí),設(shè)置捕獲鼠標(biāo)標(biāo)志為trueSetCapture(handle(cb_1))//當(dāng)鼠標(biāo)移入圖片控件時(shí),調(diào)用WindowAPI函數(shù)捕獲鼠標(biāo),并指定到按鈕定義圖片p_1的單擊事件clicked腳本:parent.postevent('clicked')定義按鈕的單擊事件腳本:parent.postevent('clicked')//執(zhí)行父窗口(用戶對(duì)象)中的clicked事件定義按鈕的鼠標(biāo)移動(dòng)事件腳本: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)離開(kāi)圖片控件時(shí)ifcapturemouse=truethen//當(dāng)捕獲鼠標(biāo)標(biāo)志為true時(shí)ReleaseCapture()//調(diào)用WindowAPI函數(shù)釋放鼠標(biāo)捕獲capturemouse=false//設(shè)置捕獲鼠標(biāo)標(biāo)志為falseendifendif其他按鈕用戶對(duì)象同樣處理。2.創(chuàng)建工作表祖先窗口w_user創(chuàng)建工作表窗w_user,窗口類(lèi)型為main。在窗口w_user中添加了四個(gè)按鈕用戶對(duì)象:uo_picbutton_add、uo_picbutton_save、uo_picbutton_del和uo_picbutton_close,分別命名為uo_4、uo_1、uo_3和uo_2。在窗口中添加一個(gè)數(shù)據(jù)窗口對(duì)象dw_1,其Dataobject屬性為“d_user”。w_user的Title屬性為“用戶管理”,MenuName屬性為"m_managerR"。菜單m_manager繼承于主菜單m_menu,同時(shí)添加了新的菜單項(xiàng)。窗口界面如圖所示:在窗口中定義四個(gè)自定義用戶事件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ù)窗口中插入一個(gè)空白行。自定義事件ue_delete的腳本如下:longrowintegerirow=dw_1.getrow()ifrow=0thenreturni=messagebox("提示信息","確認(rèn)要?jiǎng)h除此記錄嗎?",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("錯(cuò)誤信息","數(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//使主窗口菜單不顯示按鈕用戶對(duì)象uo_1的clicked事件腳本為:PARENT.TRIGGEREVENT("UE_UPDATE")按鈕用戶對(duì)象uo_2的clicked事件腳本為:PARENT.TRIGGEREVENT("UE_INSERT")按鈕用戶對(duì)象uo_3的clicked事件腳本為:CLOSE(PARENT)THIS.ParentWindow().Visibel=True//使主窗口菜單顯示按鈕用戶對(duì)象uo_1的clicked事件腳本為:PARENT.TRIGGEREVENT("UE_DELETE")關(guān)于自定義事件的改進(jìn)意見(jiàn):上述自定義事件是定義在窗口上,以后通過(guò)窗口的重用實(shí)現(xiàn)了對(duì)象的可重用性。實(shí)際上理想的情況應(yīng)該把這些自定義事件定義在數(shù)據(jù)窗口對(duì)象上,這樣就可以通過(guò)數(shù)據(jù)窗口對(duì)象的重用來(lái)使用它。建議大家按照這個(gè)思路進(jìn)行修改,并比較它們的異同。數(shù)據(jù)窗口中記錄顏色的隔層顯示數(shù)據(jù)窗口在Retrieve后往往會(huì)返回很多條記錄,而這些記錄中的數(shù)據(jù)復(fù)雜,通常會(huì)造成視覺(jué)上的不便。因此如果能夠使行與行之間用不同的顏色進(jìn)行區(qū)分,同時(shí)當(dāng)點(diǎn)擊當(dāng)前行時(shí),顏色會(huì)突出顯示,這樣既能極大地方便使用者,又能使應(yīng)用程序增色不少。而數(shù)據(jù)窗口中的所有數(shù)據(jù)是在細(xì)目帶(Detail)中列出的,因此只要在細(xì)目帶中設(shè)置列對(duì)象(Column)的某項(xiàng)屬性就會(huì)影響到它的顯示效果。具體操作如下:⑴打開(kāi)數(shù)據(jù)窗口dw_1,選擇所有的列(Column)。
⑵在Properties窗口中翻到Font標(biāo)簽頁(yè),單擊BackgroundColor屬性旁邊的一個(gè)帶有紅色圖標(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ù)行記錄的背景顏色為淺白色,雙數(shù)行記錄的背景顏色為淺橙色,鼠標(biāo)所在當(dāng)前行的背景顏色為淺黃色。相關(guān)函數(shù)說(shuō)明:
CurrentRow()與GetRow()函數(shù)是數(shù)據(jù)窗口信息函數(shù)。
1.CurrentRow()
功能描述:得到數(shù)據(jù)窗口當(dāng)前得到輸入焦點(diǎn)的行的行號(hào)。
語(yǔ)法:CurrentRow()
返回值:Long。函數(shù)執(zhí)行成功時(shí)返回當(dāng)前行的行號(hào),無(wú)當(dāng)前行時(shí)返回0。
2.GetRow()
功能描述:返回?cái)?shù)據(jù)窗口相應(yīng)帶中的當(dāng)前行行號(hào)。
語(yǔ)法:GetRow()
返回值:Long。函數(shù)執(zhí)行成功時(shí)返回相應(yīng)帶中當(dāng)前行的行號(hào),如果數(shù)據(jù)窗口中無(wú)數(shù)據(jù)則返回0,發(fā)生錯(cuò)誤時(shí)返回-1主窗口菜單與工作表菜單的無(wú)縫連接MDI主窗口菜單與工作表菜單不能同步顯示。為了解決這個(gè)問(wèn)題,采取的辦法是通過(guò)繼承方式創(chuàng)建工作表菜單m_manager,在該菜單上增加新的菜單項(xiàng)和相應(yīng)的工具欄圖標(biāo)。然后在工作表窗口w_user的Open事件中增加一條命令語(yǔ)句:THIS.ParentWindow().Visibel=False其作用是使主窗口菜單不顯示。同時(shí),在窗口的close事件中也加入語(yǔ)句:THIS.ParentWindow().Visibel=True其作用是恢復(fù)主窗口的菜單顯示。在m_manager菜單中,通過(guò)調(diào)用工作表窗口中的自定義用戶事件實(shí)現(xiàn)了對(duì)數(shù)據(jù)窗口的數(shù)據(jù)的各種操作,如PARENTWINDOW.TRIGGEREVENT("UE_INSERT")等等。三、創(chuàng)建數(shù)據(jù)處理維護(hù)窗口創(chuàng)建了w_user工作表祖先窗口之后,利用繼承的方法就可以生成客戶數(shù)據(jù)工作表、微機(jī)庫(kù)存表等數(shù)據(jù)處理維護(hù)窗口。需要改變的僅僅是數(shù)據(jù)窗口對(duì)象和Text屬性。四、創(chuàng)建微機(jī)租賃、續(xù)租和退租窗口微機(jī)租賃、續(xù)租和退租是微機(jī)租賃管理系統(tǒng)中的幾項(xiàng)主要管理工作,其工作窗口多是多表操作窗口。為了方便用戶的操作,三個(gè)窗口的界面盡可能選用相類(lèi)似的控件對(duì)象。微機(jī)租賃窗口的設(shè)計(jì)微機(jī)租賃窗口如下圖所示:圖微機(jī)出租窗體微機(jī)租賃窗口中有三個(gè)數(shù)據(jù)窗口控件dw_1、dw_2和dw_3,其對(duì)應(yīng)的數(shù)據(jù)窗口對(duì)象分別為d_f_employee、d_f_output和d_g_store,它們各自顯示用戶數(shù)據(jù)、租賃數(shù)據(jù)和微機(jī)庫(kù)存數(shù)據(jù)。還有5個(gè)按鈕用戶對(duì)象uo_1、uo_2、uo_3、uo_4和uo_5,3個(gè)成組控件gb_1、gb_2和gb_3。微機(jī)租賃窗口的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='庫(kù)存'"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='庫(kù)存'"DDW2.SETFILTER(STR1)DDW2.FILTER()DDW2.RETRIEVE()按鈕uo_1的clicked事件腳本:CLOSE(PARENT)事件腳本的作用是關(guān)閉窗口。按鈕uo_2的clicked事件腳本://將結(jié)果存為"微機(jī)租賃合同.doc"文件。constantintegerppLayoutBlank=12OLEObjectole_objectole_object=CREATEOLEObject//連接WORDIFole_object.ConnectToNewObject("Word.Application")<>0THENMessageBox('OLE錯(cuò)誤','OLE無(wú)法連接!')returnENDIFole_object.Visible=Trueole_object.Documents.open("微機(jī)租賃合同.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//斷開(kāi)OLE連接Ole_Object.DisConnectObject()DestroyOle_Object事件腳本的作用是將租賃輸入的結(jié)果存為"微機(jī)租賃合同.doc"文件。微機(jī)租賃合同.doc是事先建立在系統(tǒng)中的模板文件,該文件是一個(gè)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ù),警告庫(kù)存表更新錯(cuò)誤 ROLLBACKUSINGSQLCA; MESSAGEBOX("信息提示","庫(kù)存表更新失敗!") ENDIFELSE ROLLBACK; MESSAGEBOX("信息提示","租賃表更新失敗!")ENDIF此段腳本用于同時(shí)對(duì)庫(kù)存表和租賃表進(jìn)行更新。按鈕uo_4的clicked事件腳本:INTEGERYNYN=MESSAGEBOX("提示信息","確認(rèn)放棄租賃嗎?",QUESTION!,YESNO!)IFYN=1THEN ROLLBACK;ENDIF按鈕uo_5的clicked事件腳本:OPENSHEET(W_EMPLOYEE,W_MAIN,4,ORIGINAL!)微機(jī)續(xù)租窗口的設(shè)計(jì)微機(jī)續(xù)租窗口的界面如圖所示:圖微機(jī)續(xù)租窗體微機(jī)續(xù)租窗口不同于微機(jī)租賃窗口,其租機(jī)用戶信息不需要輸入,只要在已有租機(jī)用戶中查尋即可。需要更新的信息主要是租賃日期和租金等,微機(jī)續(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)建了一個(gè)自定義事件ue_dddw,其ID為pbm_command。自定義事件腳本如下:STRINGSTR1,STR2,STR3,WORKCARD,NOTE,YESNOLONGROW1,ROW2DATEINTDATE,OUTDATEINTEGERMONEYGETCHILD("EMP_NAME",DDW1)ROW1=DW_2.ROWCOUNT()IFhwndchild=Handle(DDW1)THEN//對(duì)應(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 當(dāng)幸福來(lái)敲門(mén)觀后感合集15篇
- 巾幗標(biāo)兵先進(jìn)事跡材料集錦15篇
- 感恩父母講話稿(集合15篇)
- 扭轉(zhuǎn)治療分享會(huì)
- 培訓(xùn)學(xué)校招生宣傳
- 初級(jí)金融專(zhuān)業(yè)-《金融專(zhuān)業(yè)知識(shí)與實(shí)務(wù)》名師預(yù)測(cè)卷1117
- 初級(jí)會(huì)計(jì)經(jīng)濟(jì)法基礎(chǔ)-初級(jí)會(huì)計(jì)《經(jīng)濟(jì)法基礎(chǔ)》預(yù)測(cè)試卷325
- 智研咨詢(xún)發(fā)布-2024年中國(guó)曲軸行業(yè)市場(chǎng)競(jìng)爭(zhēng)格局、行業(yè)政策及需求規(guī)模預(yù)測(cè)報(bào)告
- 產(chǎn)業(yè)研究報(bào)告-2024年中國(guó)磁懸浮軸承行業(yè)發(fā)展現(xiàn)狀、市場(chǎng)規(guī)模、投資前景分析(智研咨詢(xún))
- 二零二五年度家居定制銷(xiāo)售購(gòu)銷(xiāo)合同(含設(shè)計(jì)服務(wù))2篇
- 六年級(jí)上冊(cè)數(shù)學(xué)課件-第五單元 數(shù)據(jù)處理 北師大版
- YY/T 1496-2016紅光治療設(shè)備
- 鄭州小吃詳細(xì)地點(diǎn)
- 上海高考英語(yǔ)詞匯手冊(cè)
- 2021年江蘇省淮安市淮陰中學(xué)高一政治下學(xué)期期末試題含解析
- 2021年道路交通安全法期末考試試題含答案
- 自帶藥物治療告知書(shū)
- 建筑制圖與陰影透視-第3版-課件12
- 2023年最新的校長(zhǎng)給教師春節(jié)祝福語(yǔ)
- 吞咽解剖和生理研究
- TSG11-2020 鍋爐安全技術(shù)規(guī)程
評(píng)論
0/150
提交評(píng)論