[摘 要] 本文以Microsoft Visual FoxPro 6.0為關(guān)系數(shù)據(jù)庫管理系統(tǒng),分析探討了記賬憑證輸入模塊設(shè)計(jì)與實(shí)施的過程與方法,并提供了相應(yīng)的程序代碼。
[關(guān)鍵詞] 管理信息系統(tǒng);記賬憑證;信息輸入;VFP程序設(shè)計(jì)
[中圖分類號]F232[文獻(xiàn)標(biāo)識碼]A[文章編號]1673-0194(2007)12-0003-06
記賬憑證輸入是電算化會計(jì)信息系統(tǒng)的一種極為重要的操作,輸入數(shù)據(jù)的正確性將直接關(guān)系到登記明細(xì)賬、現(xiàn)金日記賬、銀行存款日記賬及總賬的正確性,是保證正確輸出會計(jì)報(bào)表、賬簿數(shù)據(jù)的關(guān)鍵。本文將以Microsoft Visual FoxPro 6.0(以下簡稱VFP)數(shù)據(jù)庫管理系統(tǒng)為系統(tǒng)開發(fā)環(huán)境,闡明記賬憑證輸入模塊的設(shè)計(jì)與實(shí)現(xiàn)方法,本文所述程序已在VFP中運(yùn)行通過。本文的設(shè)計(jì)在功能上有如下特點(diǎn):①程序運(yùn)行后立即顯示數(shù)據(jù)庫中最后一張記賬憑證,以便確定下一張待輸入憑證的憑證號;②記賬憑證輸入界面與實(shí)際單據(jù)相似,符合用戶習(xí)慣;③輸入憑證號立即顯示數(shù)據(jù)庫中已存在的對應(yīng)憑證,如顯示為空白則表示憑證號可作為新憑證的憑證號進(jìn)行輸入;④可以在同一輸入界面輸入和顯示一借一貸、一借多貸、多借一貸、多借多貸等憑證;⑤未審核的憑證允許修改,但已審核憑證禁止修改;⑥同一憑證輸入時,憑證號只需輸入一次,日期自動取憑證輸入當(dāng)天的系統(tǒng)日期,“科目”與“借貸”項(xiàng)目可通過下拉組合框中的列表項(xiàng)選??;⑦命令按鈕在必要時呈灰色(無效狀態(tài));⑧借貸不平衡的輸入信息不允許保存;⑨輸入不符合要求或操作失誤時會有必要的信息提示。
1 設(shè)計(jì)與建立數(shù)據(jù)表
記賬憑證中的數(shù)據(jù)包括憑證號、日期、摘要、科目、借貸、金額、附件張數(shù)、審核、制單等信息。為保證記賬憑證信息完整有效和降低數(shù)據(jù)冗余,使信息存儲結(jié)構(gòu)更加合理,需在指定目錄或默認(rèn)目錄下建立記賬憑證附表jzpzfb.dbf和記賬憑證主表jzpzzb.dbf。這兩個數(shù)據(jù)表的結(jié)構(gòu)為jzpzfb.dbf{pzh(C4),rq(D8),fjzs(N2.0),sh(C8),zd(C8)}、jzpzzb.dbf{pzh(C4),zy(C20),km(C9),jd(C2),je(N12.2)}。其中,字段pzh、rq、fjzs、sh、zd分別對應(yīng)于憑證號、日期、附件張數(shù)、審核、制單,字段zy、km、jd、je對應(yīng)于摘要、科目、借貸、金額,C、D、N分別表示字符型、日期型、數(shù)值型,數(shù)字表示字段寬度,小數(shù)點(diǎn)右邊的數(shù)字表示小數(shù)位數(shù)。例如,je(N12.2)表示“金額”字段je,寬度為12位,小數(shù)位占2位。
另外,由于記賬憑證中的科目(字段km的值)必須是會計(jì)科目表中存在的科目,在輸入科目時必須以會計(jì)科目表為依據(jù)。假設(shè)會計(jì)科目表的文件名為kjkm.dbf,其表結(jié)構(gòu)為kjkm.dbf{kmbh(C9),kmmc(C36),jdfx(C1),qcye(N12.2)},其中,字段kmbh、kmmc、jdfx、qcye分別表示科目編號、科目名稱、借貸方向、期初余額,表中已保存有全部科目的相關(guān)信息。應(yīng)確保文件kjkm.dbf與jzpzfb.dbf、jzpzzb.dbf在同一文件夾內(nèi)。
2 設(shè)計(jì)與建立用戶輸入界面
2. 1設(shè)計(jì)與創(chuàng)建表單
按照輸入設(shè)計(jì)的原則和要求設(shè)計(jì)記賬憑證輸入界面,并用VFP建立與輸入界面對應(yīng)的表單,如圖1所示。輸入界面的格式與實(shí)際的記賬憑證格式基本一致(或相似),Text1至Text6是各文本框的Name屬性,其中Text1至Text5文本框分別對應(yīng)于jzpzfb中的各字段,Text6文本框用于接收從鍵盤輸入的憑證號數(shù)據(jù),Text1中的憑證號在程序運(yùn)行時自動取值為Text6中的數(shù)據(jù);表格(默認(rèn)Name屬性為Grid1)中各欄對應(yīng)于jzpzzb中的各字段,表格中的憑證號在程序運(yùn)行時自動取值為Text1中的數(shù)據(jù);命令按鈕“新增憑證”、“輸入分錄”、“確定”、“取消”、“關(guān)閉”用于輸入過程中實(shí)現(xiàn)相應(yīng)的操作。
2. 2建立關(guān)聯(lián)
2. 2. 1創(chuàng)建數(shù)據(jù)環(huán)境并建立表間聯(lián)系
建立數(shù)據(jù)環(huán)境(Name屬性默認(rèn)為Dataenvironment),將數(shù)據(jù)表文件jzpzfb.dbf、jzpzzb.dbf、kjkm.dbf添加至數(shù)據(jù)環(huán)境,這時數(shù)據(jù)環(huán)境中這3個表的Alias屬性分別為jzpzfb、jzpzzb、kjkm,通過屬性窗口將它們的Name屬性分別設(shè)置為Cursor_JZPZFB、Cursor_JZPZZB、Cursor_KJKM(以便在后面的程序代碼中使用)。然后在數(shù)據(jù)環(huán)境窗口按住鼠標(biāo)左鍵不放,將jzpzfb的pzh字段拖動到j(luò)zpzzb的pzh字段,可建立兩表之間的永久關(guān)系。
這樣,在表單啟動后,數(shù)據(jù)環(huán)境中的數(shù)據(jù)表jzpzfb、jzpzzb和kjkm將自動打開(表單關(guān)閉時這些數(shù)據(jù)表也會自動關(guān)閉),同時,數(shù)據(jù)表jzpzzb中的記錄指針將隨著jzpzfb中指針的移動而移動,jzpzzb中的指針指向與jzpzfb的pzh(憑證號)相匹配的記錄。
2. 2. 2表單各文本框與相應(yīng)數(shù)據(jù)表的字段建立對應(yīng)關(guān)系
為使表單上各文本框與jzpzfb中各字段建立關(guān)聯(lián),將文本框Text1、Text2、Text3、Text4、Text5的ControlSource屬性分別設(shè)置為:jzpzfb.pzh、jzpzfb.rq、jzpzfb.fjzs、jzpzfb.sh、jzpzfb.zd。這樣,表單運(yùn)行后,這些文本框?qū)⒎謩e顯示jzpzfb中當(dāng)前指針?biāo)傅挠涗浶畔ⅰ?/p>
2. 2. 3表格控件與相應(yīng)數(shù)據(jù)表建立對應(yīng)關(guān)系
為使表格與jzpzzb建立關(guān)聯(lián),應(yīng)將表格控件(默認(rèn)的Name屬性為Grid1)的RecordSourceType屬性設(shè)置為“1-別名”(不包括引號),同時將表格的RecordSource屬性設(shè)置為jzpzzb。用鼠標(biāo)右鍵單擊Grid1表格,在彈出的快捷菜單中單擊“生成器”,再在彈出的“表格生成器”對話框中設(shè)置成如圖1所示的表格欄目及其標(biāo)題。這樣,表格中各欄對應(yīng)的ControlSource屬性自動設(shè)置成為jzpzzb中相應(yīng)的字段,如表1所示。為便于后面的程序引用,將表格各欄對應(yīng)的Name屬性也按表1進(jìn)行設(shè)置。
表格中的“科目”及“借貸”欄的組合框控件是按下述方法添加上去的:①用鼠標(biāo)右鍵單擊表格,在出現(xiàn)的快捷菜單中選擇執(zhí)行“編輯”項(xiàng),則表格四周出現(xiàn)粗框,表明處于編輯狀態(tài)。②用鼠標(biāo)左鍵單擊選中“表單控件”工具欄的組合框控件,然后再單擊表格中的“科目”欄,就在屬性窗口出現(xiàn)了一個Combo1組合框?qū)ο?,其ControlSource屬性自動設(shè)置為jzpzzb.km。③為便于理解和使用,將Combo1的Name屬性改為ComboKM,這樣ComboKM的ControlSource屬性就自動成為jzpzzb.km。④在屬性窗口將科目欄column_KM的CurrentControl屬性設(shè)置為ComboKM,就可以看到在表格的“科目”欄添加了組合框ComboKM。用同樣方法在表格的“借貸”欄添加一個Name屬性為ComboJD的組合框控件,借貸欄column_JD的CurrentControl屬性為ComboJD,而ComboJD的
ControlSource屬性為jzpzzb.jd。表格中各欄的屬性設(shè)置如表1所示。
表單啟動后,在輸入或修改憑證時,單擊“科目”欄的組合框,在下拉列表中應(yīng)顯示kjkm表中的全部科目編號與對應(yīng)的科目名稱,可以選擇輸入相應(yīng)的科目編號(輸入的科目必須是在kjkm表中存在的科目);單擊“借貸”欄的組合框,可在下拉列表選擇輸入“借”或“貸”。為達(dá)此目的,在設(shè)計(jì)時,應(yīng)在屬性對話框按表2進(jìn)行相應(yīng)屬性的設(shè)置。其中,Name屬性指定了在代碼中用于引用的組合框控件的名稱,RowSourceType屬性指定組合框控件中數(shù)據(jù)值的源的類型,RowSource屬性指定組合框控件中數(shù)據(jù)值的源,而ColumnCount屬性指定組合框的下拉列表中列的數(shù)目,它應(yīng)與RowSource屬性所做的設(shè)置相對應(yīng)。
為便于后面的程序引用,將表格“憑證號”欄、“摘要”欄及“金額”欄的文本框控件對應(yīng)的Name屬性分別設(shè)置為TextPZH、TextZY、TextJE,如表3所示。
經(jīng)過上述設(shè)置后,圖1所示的表單在運(yùn)行時,表格內(nèi)將顯示jzpzzb中與jzpzfb的當(dāng)前記錄相匹配的所有記錄,表單其余部分將顯示jzpzfb中當(dāng)前指針?biāo)赶虻挠涗?,如果記錄指針指向文件尾,則表單中不顯示任何記錄。
2. 3日期型及數(shù)值型文本框的處理
Text2中的數(shù)據(jù)應(yīng)為輸入憑證的當(dāng)天日期,數(shù)據(jù)類型為日期型,需要在“屬性”對話框?qū)⑵銿alue屬性設(shè)置為“=date()”(不含引號),這樣,Text2就被設(shè)置為日期型文本框,并且運(yùn)行時自動顯示為系統(tǒng)當(dāng)前日期。
Text3中的數(shù)據(jù)是憑證的附件張數(shù),數(shù)據(jù)類型為數(shù)值型,且對應(yīng)于數(shù)據(jù)表jzpzfb的fjzs字段,數(shù)據(jù)位數(shù)不超過兩位。可以使用鼠標(biāo)右鍵單擊Text3控件,在出現(xiàn)的快捷菜單中選擇執(zhí)行“生成器”項(xiàng),再利用彈出的“文本框生成器”對話框?qū)?shù)據(jù)類型設(shè)置成為“數(shù)值型”,并將輸入掩碼設(shè)置為“99”(不含引號)。這樣就將Text3的數(shù)據(jù)類型設(shè)置成“數(shù)值型”,并且只允許在其中輸入1位或2位的整數(shù)值。
3 輸入功能的實(shí)現(xiàn)
3. 1設(shè)置表單緩沖方式
在屬性窗口將表單的BufferMode屬性設(shè)置為:2-開放式,可將緩沖方式指定為開放式更新記錄方式。這種緩沖方式可使編輯時記錄不鎖定,而當(dāng)使用tableupdate()將記錄寫向磁盤時,VFP試圖鎖定記錄。這樣設(shè)置,才能保證3.5.3節(jié)所述單擊“確定”按鈕以保存憑證、3.5.4節(jié)所述單擊“取消”按鈕以取消憑證輸入或更新的程序在運(yùn)行時不會出錯。
3. 2建立命令按鈕狀態(tài)方法程序
為盡可能避免誤操作,應(yīng)將運(yùn)行過程中不必使用的命令按鈕設(shè)置為無效,命令按鈕只有需要使用時才設(shè)置為有效。根據(jù)對不同運(yùn)行階段各按鈕有效與無效狀態(tài)的分析可知,本輸入模塊共有3種不同的命令按鈕組合狀態(tài),這3種組合狀態(tài)在程序中多處使用。為減少程序代碼,提高代碼的重用性,可新建3個方法程序,每個方法程序代表一種命令按鈕組合狀態(tài),可以作為方法在程序中被使用。通過執(zhí)行VFP“表單”菜單下的“新建方法程序”,分別建立buttonstatus1、buttonstatus2和buttonstatus3命令按鈕方法程序,再在屬性窗口分別雙擊buttonstatus1、buttonstatus2、buttonstatus3,在彈出的代碼編輯窗口輸入相應(yīng)功能的過程代碼即可。為便于引用各命令按鈕,在輸入代碼前先將“新增憑證”、“輸入分錄”、“確定”、“取消”、“關(guān)閉”按鈕的Name屬性分別設(shè)置為xzpz、srfl、qd、qx、gb。命令按鈕狀態(tài)方法程序的3個過程代碼及效果如表4所示。
3. 3表單初始化
表單啟動時,完成初始化設(shè)置,包括關(guān)閉會話方式并設(shè)置為精確比較方式;表單釋放時,恢復(fù)其默認(rèn)的設(shè)置。分別在表單的Load、Unload過程中輸入相應(yīng)的代碼即可,如表5所示。
表單啟動后,應(yīng)使“新增憑證”、“關(guān)閉”按鈕呈有效狀態(tài),使“輸入分錄”、“確定”、“取消”按鈕呈無效狀態(tài),可利用thisform.buttonstatus1實(shí)現(xiàn);同時,如數(shù)據(jù)表有記錄,則表單顯示最后一條記錄,以便輸入新記錄時確定一個新的不重復(fù)的憑證號(輸入記錄時,一般按憑證號由小到大的順序輸入),可選擇jzpzfb所在的工作區(qū),指針指向末記錄。為達(dá)此目標(biāo),可在表單的Init過程中輸入相應(yīng)的VFP代碼。表單的Init過程代碼對應(yīng)如下,其中表示行后注釋,注釋可以不出現(xiàn)在程序中。
thisform.buttonstatus1“新增憑證”、“關(guān)閉”按鈕有效,其余按鈕無效
sele(thisform.dataenvironment.cursor_JZPZFB.alias)
選擇jzpzfb所在工作區(qū)
go bott指針指向末記錄
3. 4Text6文本框內(nèi)容變化的處理
Text6文本框中的內(nèi)容(憑證號)任何時候發(fā)生變化,都應(yīng)在jzpzfb所在的工作區(qū)查找有無與Text6中的憑證號匹配的記錄,如有匹配,則立即在表單中顯示出匹配的記賬憑證;如無匹配的記錄則表單上相應(yīng)的文本框及表格控件中將不顯示任何值,這時可將Text6中的內(nèi)容作為憑證號進(jìn)行新憑證的輸入。為實(shí)現(xiàn)這種功能,可在Text6的Interactive Change過程中輸入相應(yīng)的代碼,Interactive
Change過程在用戶利用鍵盤或鼠標(biāo)更改控件的值時發(fā)生。由于按2.2.1節(jié)進(jìn)行設(shè)置后,jzpzzb中的記錄指針將隨著jzpzfb中指針的移動而指向相匹配的記錄,因此用refresh方法刷新表單即可顯示出匹配的憑證,而無匹配記錄時則顯示為空白。Text6文本框的InteractiveChange過程代碼如下:
sele( thisform.dataenvironment.cursor_JZPZFB.alias )選擇jzpzfb所在工作區(qū)
locate for allt(pzh)=allt(thisform.text6.value)定位到與Text6中匹配的記錄或文件尾
thisform.refresh刷新表單
3. 5輸入憑證處理
3. 5. 1單擊“新增憑證”按鈕以增加一個憑證
單擊“新增憑證”按鈕,如果Text6文本框中無輸入憑證號,則提示“請輸入新增憑證的憑證號!”;如果輸入Text6中的憑證號已存在于jzpzfb中,則提示“已存在此憑證號的憑證!”;如果輸入至Text6中的憑證號是一個新的憑證號(在jzpzfb中尚不存在該憑證號),則在jzpzfb中增加一條空白記錄,然后使Text1中的值自動變?yōu)門ext6中的值,再將Text6中的內(nèi)容清空并將Text6的ReadOnly屬性設(shè)置為
.t.,使Text2中的日期自動成為當(dāng)前系統(tǒng)的日期,刷新表單即可。應(yīng)注意各命令按鈕的有效和無效狀態(tài)?!靶略鰬{證”按鈕的Click事件對應(yīng)的VFP程序代碼如下:
if len(allt(thisform.text6.value))<>0如果Text6中輸入了憑證號
sele ( thisform.dataenvironment.cursor_JZPZFB.alias ) 選擇jzpzfb所在工作區(qū)
locate for allt(pzh)=allt(thisform.text6.value) 查找jzpzfb中是否有匹配的憑證號
if .not.found() 如果輸入至Text6中的憑證號是一個新的憑證號
thisform.buttonstatus2“輸入分錄”、“取消”按鈕有效,其余按鈕無效
append blank在jzpzfb中追加一條空記錄
thisform.text1.value=thisform.text6.value Text1文本框自動取Text6中的值
thisform.text6.value=space(0) Text6中的內(nèi)容清空
thisform.text6.readonly=.t. Text6的ReadOnly屬性設(shè)置為.t.
thisform.text2.value=date() Text2中自動取值為系統(tǒng)當(dāng)前日期
thisform.refresh刷新表單
else如果輸入Text6中的憑證號已存在于jzpzfb中
thisform.buttonstatus1“新增憑證”、“關(guān)閉”按鈕有效,其余按鈕無效
=messagebox(\"已存在此憑證號的憑證!\",48)提示對話框
thisform.text6.setfocus Text6文本框獲得焦點(diǎn)
endif
else如果Text6中還未輸入憑證號
thisform.buttonstatus1“新增憑證”、“關(guān)閉”按鈕有效,其余按鈕無效
=messagebox(\"請輸入新增憑證的憑證號!\",48)提示對話框
thisform.text6.setfocus Text6文本框獲得焦點(diǎn)
endif
3. 5. 2單擊“輸入分錄”按鈕以進(jìn)行憑證的輸入
如果Text6文本框中已輸入符合要求的憑證號,再單擊“新增憑證”按鈕,那么“輸入分錄”和“取消”按鈕呈有效狀態(tài),其他按鈕為無效按鈕。這時,如果單擊“輸入分錄”按鈕,程序應(yīng)選擇jzpzzb所在的工作區(qū),并追加一條空白記錄,然后將pzh字段的值用表單上Text1控件中的值替換,刷新表格Grid1,以便通過鍵盤輸入此表格所示的其余字段的值,最后使各命令按鈕呈buttonstatus3所確定的狀態(tài)(“輸入分錄”、“確定”、“取消”有效;“新增憑證”、“關(guān)閉”無效)?!拜斎敕咒洝卑粹o的Click事件對應(yīng)的VFP代碼如下:
sele (thisform.dataenvironment.cursor_JZPZZB.alias)
appe blank
replace pzh with thisform.text1.value
thisform.grid1.refresh
thisform.buttonstatus3
3. 5. 3單擊“確定”按鈕以保存憑證
輸入至表單上的數(shù)據(jù),需要單擊“確定”按鈕保存至jzpzzb.dbf和jzpzfb.dbf文件,或者單擊“取消”按鈕放棄數(shù)據(jù)的輸入或更新操作。
單擊“確定”按鈕,應(yīng)充分考慮數(shù)據(jù)輸入的容錯功能,即輸入至表單的數(shù)據(jù)不符合要求時,不能進(jìn)行保存操作,并應(yīng)當(dāng)有相應(yīng)的提示信息,只有符合要求的數(shù)據(jù)才真正保存在jzpzzb.dbf和jzpzfb.dbf文件。單擊“確定”按鈕執(zhí)行的操作過程如圖2所示。
“確定”按鈕的Click事件對應(yīng)的VFP代碼如下:
sele (thisform.dataenvironment.cursor_JZPZZB.alias)
set filter to allt(pzh)=allt(thisform.text1.value)
locate for len(allt(km))=0
if .not. found()
locate for len(allt(jd))=0
if .not. found()
locate for je=0.00
if .not. found()
store 0.00 to je_jie,je_dai
sum je to je_jie for allt(jd)='借'
sum je to je_dai for allt(jd)='貸'
if je_jie=je_dai
if len(allt(thisform.text5.value))<>0
sele (thisform.dataenvironment.cursor_JZPZFB.alias)=tableupdate(.t.)
sele (thisform.dataenvironment.cursor_JZPZZB.alias)=tableupdate(.t.)
thisform.refresh
thisform.buttonstatus1
thisform.text6.setfocus
thisform.text6.readonly=.f.
else
=messagebox(“請輸入制單人!”,48)
thisform.text5.setfocus
thisform.buttonstatus3
thisform.text6.readonly=.t.
endif
else
=messagebox(“借貸不平衡!”,48)
thisform.grid1.column_JE.setfocus
endif
else
=messagebox(“金額不能為0!”,48)
thisform.grid1.column_JE.setfocus
endif
else
=messagebox(“指定借或貸!”,48)
thisform.grid1.column_JD.setfocus
endif
else
=messagebox(“請指定科目!”,48)
thisform.grid1.column_KM.setfocus
endif
3. 5. 4單擊“取消”按鈕以撤銷憑證的輸入或更新
單擊“取消”按鈕,將不允許以表單上顯示的輸入數(shù)據(jù)對jzpzfb.dbf和jzpzzb.dbf文件進(jìn)行更新。應(yīng)分別在jzpzfb和jzpzzb所在的工作區(qū)用tablerevert(.t.)來撤銷對當(dāng)前記錄的更改,然后用refresh方法刷新表單,并使各按鈕呈buttonstatus1所確定的狀態(tài)(就是使“新增憑證”、“關(guān)閉”有效以便增加新的憑證或關(guān)閉表單,使其余按鈕無效),再將Text6的ReadOnly屬性設(shè)置為.f.,并使Text6獲得焦點(diǎn),以便于輸入新的憑證號。這些操作的代碼應(yīng)體現(xiàn)在“取消”按鈕的Click事件中,“取消”按鈕的Click事件對應(yīng)的VFP代碼如下:
sele (thisform.dataenvironment.cursor_JZPZFB.alias)
=tablerevert(.t.)
sele (thisform.dataenvironment.cursor_JZPZZB.alias)
=tablerevert(.t.)
thisform.refresh
thisform.buttonstatus1
thisform.text6.readonly=.f.
thisform.text6.setfocus
3. 6關(guān)閉操作
全部輸入操作完成后,需單擊“關(guān)閉”按鈕以退出表單。退出前可用messagebox()函數(shù)提示“真的想退出嗎?”,在彈出的包含“是”和“否”按鈕的提示對話框中單擊“是”按鈕完成退出功能,退出用release方法實(shí)現(xiàn)?!瓣P(guān)閉”按鈕的Click事件對應(yīng)的VFP代碼如下:
if messagebox(“真的想退出嗎?”,4+48,“提示”)=6
thisform.release
endif
4 進(jìn)一步討論
4. 1防止手工修改Text1、Text2、Column_PZH和Text4中的值
為降低輸入出錯率和提高輸入的容錯性,從鍵盤輸入的憑證號顯示在Text6文本框,當(dāng)單擊“新增憑證”按鈕時,Text1文本框中自動變?yōu)門ext6中的值,Text2中自動顯示為系統(tǒng)的當(dāng)前日期(即輸入憑證的日期),而單擊“輸入分錄”按鈕時,表格中憑證號欄(Column_PZH)的文本框(TextPZH)應(yīng)自動變?yōu)門ext1文本框中的值,以保證同一輸入界面中輸入的是同一憑證的數(shù)據(jù)。為防止誤操作,需將Text1、Text2、Column_PZH的ReadOnly屬性設(shè)置為:.T.-真。同樣,Text4中為審核人姓名或代碼,由于輸入憑證時不允許輸入審核人(表示憑證未審核),修改憑證時也不能修改其中的內(nèi)容,只有在審核模塊中才允許更改其中的值,所以在該輸入模塊中還應(yīng)將Text4的ReadOnly屬性也設(shè)置為:.T.-真。
4. 2防止對已審核憑證進(jìn)行更改
4. 2. 1定義Text3、Text5、Grid1的When過程
在Text6中輸入憑證號時,如果輸入的憑證號在數(shù)據(jù)庫中已存在,則對應(yīng)的記賬憑證會在表單中顯示出來。如果顯示出的是已審核憑證(即Text4中的值為非空),則不能對其進(jìn)行有意或無意的修改,可通過設(shè)置相關(guān)控件的ReadOnly屬性實(shí)現(xiàn)。如果text4中的內(nèi)容不為空(表明為已審核憑證),則Text3、Text5收到焦點(diǎn)前將其ReadOnly屬性設(shè)置為.t.,表格Grid1控件收到焦點(diǎn)前將其Enabled屬性設(shè)置為.f.,并提示“已審核憑證不能修改”;否則,Text3、Text5收到焦點(diǎn)前將其ReadOnly屬性設(shè)置為.f.,Grid1收到焦點(diǎn)前將其Enabled屬性設(shè)置為.t.。為實(shí)現(xiàn)此功能,可分別在Text3、Text5、Grid1的When過程中輸入如表6所示的代碼,When過程代碼在控件對象收到焦點(diǎn)前發(fā)生。(注:Text1、Text2、Text4的ReadOnly屬性已按4.1節(jié)設(shè)置為:.T.-真。如未進(jìn)行此設(shè)置,則應(yīng)在Text1、Text2、Text4的When過程中輸入與Text3、Text5相同的When過程代碼)。
4. 2. 2允許正常的輸入與修改操作
通過用戶操作或以代碼方式使Text6文本框獲得焦點(diǎn)時,表示可能要輸入憑證號,并允許輸入新的憑證。但為了減少誤操作,在4.2.1節(jié)所述程序代碼中出現(xiàn)了將Text3和Text5的Readonly屬性設(shè)置成.t.、將Grid1的Enabled屬性設(shè)置成.f.的情況,從而限制了對Grid1及Text3、Text5中數(shù)據(jù)的后續(xù)輸入和修改操作。因此,為便于后續(xù)輸入及修改操作的執(zhí)行,還需要在Text6文本框的GotFocus過程中將Grid1的Enabled屬性設(shè)置為.t.、將Text3(附件張數(shù))和Text5(制單)的Readonly屬性設(shè)置為.f.,同時有必要將Text6中的內(nèi)容清空(如果已有內(nèi)容的話),GotFocus過程在一個對象通過用戶操作或以代碼方式獲得焦點(diǎn)時發(fā)生。Text6的GotFocus過程對應(yīng)的VFP代碼如下:
thisform.grid1.enabled=.t.
thisform.text3.readonly=.f.
thisform.text5.readonly=.f.
this.value=space(0)
4. 3防止修改狀態(tài)下執(zhí)行“新增憑證”和“關(guān)閉”操作
當(dāng)使用鍵盤或鼠標(biāo)更改文本框Text3、Text5及表格Grid1的TextZY、ComboKM、ComboJD、TextJE中的值時,表明可能要對相應(yīng)的數(shù)據(jù)進(jìn)行修改,程序進(jìn)入修改狀態(tài),必須單擊“確定”或“取消”按鈕以便決定是否真正執(zhí)行數(shù)據(jù)修改操作。單擊“確定”或“取消”按鈕前,也允許根據(jù)需要輸入新的分錄,所以應(yīng)使“確定”、“取消”、“輸入分錄”按鈕同時有效,而這種情況下的“新增憑證”和“關(guān)閉”按鈕應(yīng)呈無效狀態(tài),可用thisform.buttonstatus3實(shí)現(xiàn)。另外,在數(shù)據(jù)修改狀態(tài)下,Text6文本框中不可輸入新值,需將其ReadOnly屬性設(shè)置為.t.。實(shí)現(xiàn)這種功能的程序代碼應(yīng)包含在相應(yīng)控件的InteractiveChange過程中,Text3、Text5、TextZY、ComboKM、ComboJD、TextJE的InteractiveChange過程代碼對應(yīng)如下。
thisform.buttonstatus3
thisform.text6.readonly=.t.
4. 4使輸入憑證號更方便
有時,Text6中輸入了一些字符,希望利用鼠標(biāo)單擊能夠立即清空,以便重新輸入,可以在Text6文本框的Click過程中輸入以下代碼:this.value=space(0)。
主要參考文獻(xiàn)
[1] 李國紅.管理信息系統(tǒng)數(shù)據(jù)輸入模塊的設(shè)計(jì)與實(shí)現(xiàn)——兼論會計(jì)科目的輸入設(shè)計(jì)[J]. 中國管理信息化,2006,(11):19-22.
[2] 朱順泉,姜靈敏.管理信息系統(tǒng)理論與實(shí)務(wù)[M]. 北京:人民郵電出版社,2004.