新增資料,自動計算結餘 |
尚未結案
|
goodjimmy
一般會員 ![]() ![]() 發表:20 回覆:26 積分:9 註冊:2004-02-19 發送簡訊給我 |
各位高手:
小弟有個問題,使用adotable元件,來做一個會計財務系統,然而希望結餘能在新增資料後,自動結算,工式是今日的結餘=前一日的結餘+今天的收入-今天的支出,現在我只想到,取最後一筆的結餘來計算,但是使用者,可能沒辦法按照日期順序輸入資料,所以取最後一筆計算會有BUG
問題二是,有兩個存款銀行,分別為第一銀行和郵局,這兩個銀行帳戶,在計算結餘時,如何區分計算呢?
資料庫的TABLE是
TDATE 日期欄位
TINPUT 收入
TOUPUT 支出
ARNOTE 應收票據(算收入)
EXPECT 預計支出(算支出)
SURPLUS 結餘 新增程式碼如下
procedure TForm1.Button2Click(Sender: TObject); var opt:TLocateOptions; locvalues: string; day:string;//日期變數 sum: string; //結餘的變數 begin day:='0' cb1.Text cb2.Text cb3.Text; //日期選擇 locvalues:=cbb1.Text; //銀行選擇 分別為第一銀行和郵局 opt:=[loCaseInsensitive,loPartialKey]; if adotable1['surplus']=null then //第一筆結餘如果是空值,請先輸入 begin adotable1.Insert; adotable1['tdate']:='0' cb1.Text cb2.Text cb3.Text; adotable1['expect']:=StrToInt(edit1.Text); adotable1['arnote']:=StrtoInt(edit2.Text); adotable1['touput']:=StrtoInt(edit3.Text); adotable1['tinput']:=StrtoInt(edit4.Text); adotable1['surplus']:=StrtoInt(edit5.Text); adotable1['bank']:=cbb1.Text; end else if not ADOTABLE1.Locate('TDATE ; BANK',VarArrayOf([day,locvalues]),opt) then begin ADOTable1.Last; sum:=adotable1['surplus']; adotable1.Insert; adotable1['tdate']:='0' cb1.Text cb2.Text cb3.Text;//日期 adotable1['expect']:=StrToInt(edit1.Text);//預計支出 adotable1['arnote']:=StrtoInt(edit2.Text);//應收票據 adotable1['touput']:=StrtoInt(edit3.Text);//支出 adotable1['tinput']:=StrtoInt(edit4.Text);//收入 adotable1['surplus']:=StrtoInt(sum) StrtoInt(edit4.Text) StrtoInt(edit2.Text)-StrtoInt(edit3.Text)-StrToInt(edit1.Text);//結餘計算方式 edit5.Text:=adotable1['surplus']; adotable1['bank']:=cbb1.Text;//銀行類別 end else begin showmessage('資料已存在,請用修改功能'); edit1.Text:=adotable1['expect']; edit2.Text:=adotable1['arnote']; edit3.Text:=adotable1['touput']; edit4.Text:=adotable1['tinput']; edit5.Text:=adotable1['surplus']; cbb1.Text:=adotable1['bank']; end; end; |
likush
高階會員 ![]() ![]() ![]() ![]() 發表:5 回覆:235 積分:103 註冊:2002-10-08 發送簡訊給我 |
您好,個人小建議,有錯請指正
依您第一個問題來看,因為不清楚您所有的資料庫類型為何,暫舉作法
select ((select surplus from table1 where tdate < '20040102' order by tdate desc) tinput - touput)
as Newsurplus from table1 where tdate = '20040102'
就您第二問題而言,解決方法有case及if等處理方式,而上述作法於站上均有相關之高手解答,您可參考 =========================
讀萬卷書~不如來K.TOP走一遭
=========================
|
lcc1299
一般會員 ![]() ![]() 發表:39 回覆:42 積分:21 註冊:2004-09-12 發送簡訊給我 |
|
goodjimmy
一般會員 ![]() ![]() 發表:20 回覆:26 積分:9 註冊:2004-02-19 發送簡訊給我 |
|
likush
高階會員 ![]() ![]() ![]() ![]() 發表:5 回覆:235 積分:103 註冊:2002-10-08 發送簡訊給我 |
|
lcc1299
一般會員 ![]() ![]() 發表:39 回覆:42 積分:21 註冊:2004-09-12 發送簡訊給我 |
|
goodjimmy
一般會員 ![]() ![]() 發表:20 回覆:26 積分:9 註冊:2004-02-19 發送簡訊給我 |
謝謝各位的幫忙,我已經想出資料結構解決它 有兩種方式
1。是找尋最後一筆的前一筆結餘,來當作我的計算基準
需要比對日期,插入資料的日期,如果比最後一筆大,就插在後面,如果比最後一筆小,就是插在前面,但是需要日期比對
例如 1日到10日,插入5日,結餘基準,是1日的結餘,如果再插入6日的資料
財結餘基準要變成5日的結餘,來計算出6日的結餘 2。一樣是插入日期比較大小,但是結餘基準除了是前一日之外,插入日期之後的資料,一律用迴圈更新 我是採用第二種做法,覺得比較寫的出來
但是有個bug,就是,容錯能力,只能插入一筆,例外輸入
但如5日到10日,插入9日,是ok的
但是如果再插入6日,則6日以後的資料筆數結餘會發生錯誤
因為,我只是比較插入日期的大小值,去判斷結餘,日期比對,還需要想想 另外一位高手,是提供不錯的建議,只是因為日期,都要由使用者key入,因為是屬於財務系統,會考慮到查帳,以及帳面的資料查詢,來提供高階主管參考
如果使用系統時間,仍然需要帳目日期
再來因為使用環境的設備等級不高,用oracle資料庫,來傳輸資料,網路和記憶體較為吃重,以白箱測試時間,平均要10幾秒來回應(主程式) 這個會計系統,只是單純的key in資料
不知道可不可以跟使用者協調一下,請他按照日期輸入,就不會有例外處理
呵呵呵,只是有困難度在吧 突然發現,人是活的,程式是死的,要把程式寫的很活,那要不斷的磨練 delphi的結構,真的很嚴僅,oracle也是,因此~~~!!我會找出靈感的
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |