線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:983
推到 Plurk!
推到 Facebook!

新增資料,自動計算結餘

尚未結案
goodjimmy
一般會員


發表:20
回覆:26
積分:9
註冊:2004-02-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-21 17:59:12 IP:218.162.xxx.xxx 未訂閱
各位高手:     小弟有個問題,使用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-21 23:49:18 IP:220.134.xxx.xxx 未訂閱
您好,個人小建議,有錯請指正 依您第一個問題來看,因為不清楚您所有的資料庫類型為何,暫舉作法 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-22 05:10:44 IP:203.73.xxx.xxx 未訂閱
^__^"!,你可以設定自已取得目前時間(delphi用==>now)(oracle用==>Sysdate),這樣一來你可以不用輸入時間,如果你要的是要一筆一筆打資料進去的話,並設定時間,你有使用adotable,就有連資料庫,你可以下語法,讓日期自動排序(因該是order by 時間欄位 (desc大到小)(asc小到大)),這樣就~~~。
goodjimmy
一般會員


發表:20
回覆:26
積分:9
註冊:2004-02-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-22 07:19:00 IP:218.162.xxx.xxx 未訂閱
不好意思,沒說明白,我用的資料庫是oracle,現在排序問題已經解決,只不過使用者會在程式中,突然插入一筆過往的日期,這樣結餘計算會出錯,因為我的程式碼,是取最後一筆,也就是說,新增資料,必需是最後一筆的下一日 不過兩位高手的回答,我會試試看,找尋靈感
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-22 11:08:07 IP:220.134.xxx.xxx 未訂閱
個人建議,如果像您所說的,會有插入資料影響計算的情況,是否可考慮利用stored procedure或trigger的方式處理以讓資料庫重新計算 ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
lcc1299
一般會員


發表:39
回覆:42
積分:21
註冊:2004-09-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-22 14:29:48 IP:211.78.xxx.xxx 未訂閱
你可以試著將你delphi日期的欄位拿掉,改成系統自動設定,而那個值就從oracle資料庫裡的日期(排序過後),並將最大的那一天加1天,這樣因該不會出現你那個問題了。
goodjimmy
一般會員


發表:20
回覆:26
積分:9
註冊:2004-02-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-22 22:50:02 IP:218.162.xxx.xxx 未訂閱
謝謝各位的幫忙,我已經想出資料結構解決它 有兩種方式 1。是找尋最後一筆的前一筆結餘,來當作我的計算基準 需要比對日期,插入資料的日期,如果比最後一筆大,就插在後面,如果比最後一筆小,就是插在前面,但是需要日期比對 例如 1日到10日,插入5日,結餘基準,是1日的結餘,如果再插入6日的資料 財結餘基準要變成5日的結餘,來計算出6日的結餘 2。一樣是插入日期比較大小,但是結餘基準除了是前一日之外,插入日期之後的資料,一律用迴圈更新 我是採用第二種做法,覺得比較寫的出來 但是有個bug,就是,容錯能力,只能插入一筆,例外輸入 但如5日到10日,插入9日,是ok的 但是如果再插入6日,則6日以後的資料筆數結餘會發生錯誤 因為,我只是比較插入日期的大小值,去判斷結餘,日期比對,還需要想想 另外一位高手,是提供不錯的建議,只是因為日期,都要由使用者key入,因為是屬於財務系統,會考慮到查帳,以及帳面的資料查詢,來提供高階主管參考 如果使用系統時間,仍然需要帳目日期 再來因為使用環境的設備等級不高,用oracle資料庫,來傳輸資料,網路和記憶體較為吃重,以白箱測試時間,平均要10幾秒來回應(主程式) 這個會計系統,只是單純的key in資料 不知道可不可以跟使用者協調一下,請他按照日期輸入,就不會有例外處理 呵呵呵,只是有困難度在吧 突然發現,人是活的,程式是死的,要把程式寫的很活,那要不斷的磨練 delphi的結構,真的很嚴僅,oracle也是,因此~~~!!我會找出靈感的
系統時間:2024-09-11 23:57:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!