全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1959
推到 Plurk!
推到 Facebook!

如何實作類似出貨單據的程式?

答題得分者是:jcjroc
dm228183
一般會員


發表:10
回覆:10
積分:4
註冊:2002-07-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-16 01:20:50 IP:220.134.xxx.xxx 未訂閱
小弟最近要幫公司寫一個會員積點的管理程式,其中有一項功能為記錄會員積點兌換商品的資料.其結構如同出貨單一般將資料分寫至二個資料表中.一個資料表為表頭另一資料表為表身. 表頭結構如下 TRN_NO varchar 11 (單據號碼)(primary key) TRN_DATE varchar 8 (單據日期) TRN_VIP_CODE varchar 11 (會員編號) TRN_TOTAL_PT numberic 9 (積點總數) 表身結構如下 TRN_NO varchar 11 (單據號碼)(同表頭TRN_NO)(primary key) SEQ_NO varchar 3 (序號) (primary key) PROD_NO varchar 14 (商品代號) BOUNS_PT numberic 9 (商品點數) 小弟使用的資料庫為MS-SQL. 程式要能多人連線使用. 想請教各位先進. 類似這樣的作業功能建議如何實作? 如何在使用者新增資料時自動產生單據號碼?(規則為日期8碼 流水3碼) 如何鎖定單據號碼以免多人使用時造成鍵值重覆的錯誤? 感謝各位先進賜教 Leon.HP
------
Leon.HP
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-20 15:20:12 IP:211.75.xxx.xxx 未訂閱
用預存程序來對資料庫動作就可以解決你的問題 但建議"單據號碼"不要使用字串(因為搜尋速度慢) 另因為單據編號必須唯一,但此編號在資料未完成交易前為不確定(你不會想要有編號第100號然後直接跳到第200號的情況) 基於上述理由,同樣建議你用預存程序,排程,一個記錄目前流水號的Table來達到,其中使用排程的用意是因為你說"單據號碼"是由"日期8碼 流水3碼"組合而成,而流水號在不同的日期下是可以重複,但在同"一天"不可重複,這問題就交由DB來幫你維護就好,至於流水號的歸零,就交由排程來完成 發表人 - jcjroc 於 2005/06/20 15:24:39
dm228183
一般會員


發表:10
回覆:10
積分:4
註冊:2002-07-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-20 16:47:04 IP:61.221.xxx.xxx 未訂閱
感謝您的回應 想再請教您 1.使用預存程序的意思是在資料庫上預寫程序嗎?此程序作何用途?如何實作? 2.單據號碼如不使用字串,建議使用何種型別? 3.您有提到在完成交易前單號為不確定的,也因為單號不確定那要如何實作AB檔的行為?小弟看大部份書上的作法皆為先以臨時單號記錄,再實際存檔後再更新為實際單號.有其他建議的作法嗎? Leon.HP
------
Leon.HP
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-21 08:43:08 IP:211.75.xxx.xxx 未訂閱
1.使用預存程序的意思是在資料庫上預寫程序嗎?此程序作何用途?如何實作? 沒有錯,預存程序是存在于DB上,你可以把它當成是自製的DB接口,就好像寫C的Function一樣.只是語言是SQL Command而已. 當然Function中要做何事,如何做那就跟AP無關了 唯一要注意的是,有些小型資料庫並不支援,而各大型DB在這部分語法上會有差異.至於如何實做,你可以到坊間去買書來看.裡面都有詳細的介紹. 2.單據號碼如不使用字串,建議使用何種型別? 根據你的需求,此欄位需要11位,但因每一位都是數字,所以建議你用int 但int只有4Byte最多到10位,並不能滿足你的需求,所以建議用bigint(int64) 3.您有提到在完成交易前單號為不確定的,也因為單號不確定那要如何實作AB檔的行為?小弟看大部份書上的作法皆為先以臨時單號記錄,再實際存檔後再更新為實際單號.有其他建議的作法嗎? 這就是要你使用預存程序的理由,因為在MS-SQL來說當一個預存程序中會改變資料的話,當有任何呼叫此預存程序的動作產生時,會被此預存程序所影響到的Table,都會被鎖定,直到此預存程序結束,至於鎖定的範圍,書上有說,也算是給你的課題. 因為有這個特性,我們剛好可以拿來運用. 假設你的資料是存放在A與B這兩個Table,而關聯的Field為TRN_NO,此欄位前8位為日期,後三位為流水號,但流水號在同一天為唯一. 此時我們舊再產生一個Table來處理此事,假設此Table叫做Keyment,其欄位只有一個(或兩個),但主Key型態必須為整數且將其設為Autoincrement, 當你每為A增加一筆資料時,就先去Keyment增加一筆資料,此時因其主鍵為Autoincrement,所以會自動加一(或其他值,端看你的設定),此新值取出後就是你的流水號. 至於流水號必須於新的一天開始時歸零的問題,就交給排程去吧,只要把Keyment這個Table清除就可以了.
ph
一般會員


發表:3
回覆:27
積分:11
註冊:2003-09-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-22 01:49:26 IP:218.160.xxx.xxx 未訂閱
Hi: 我目前的做法是將單據紀錄和計算點數分成兩個部分。 同樣有一個最大單號檔,紀錄當天最大單號到幾號。在 單據下Transaction之前。先抓當時的最大單號,同時回 寫入最大單號檔=當時最大單號加1。 單頭檔有旗標紀錄是否此筆單據已經過檔。SQL Server定時 排程跑Store procedure,對未過檔的單據去做處理。這樣 在計算點數時只有一個排程的對外窗口,比較可以避免多人 易動資料時的錯誤。 山即是我 我即是山
------
學了這麼久還是沒進步
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-22 08:49:13 IP:211.75.xxx.xxx 未訂閱
唉!T-SQL Command就有Transaction的命令 這事情我大部分都是把它放在預存程序中,至於最大單據的流水號可由IDENT_CURRENT 命令取得 過檔?? 你一份資料不管要分成幾個Table,只要有一個Table寫入不對,此交易就是失敗 還需要啥過檔的紀錄嗎? 又不是會計系統或.... 用排程執行預存程序???? 依據你的需求,就TRUNCATE TABLE 一行指令而已,需要去執行預存程序嗎?(也可以啦!!!) 最大單據編號,不是利用欄位Autoincrement屬性嗎?,幹麻沒事自己去讀出又加入??? 發表人 - jcjroc 於 2005/06/22 08:59:50
ph
一般會員


發表:3
回覆:27
積分:11
註冊:2003-09-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-23 09:04:08 IP:61.229.xxx.xxx 未訂閱
我好像把事情搞得太複雜了厚.... 自己寫最大單號檔是因為最大單號的日期是key值 ex 0940622 10 0940623 23 如上 表示 22號最大單號為10 ,23號最大單號為23 若照您說的方式 好像會變成 0940622 1 0940622 2 .. 我說的排程執行預儲程序 意思是用預儲程序處理過檔(計算會員點數)的部分 單據歸單據 計算點數歸計算點數 山即是我 我即是山
------
學了這麼久還是沒進步
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-23 15:50:21 IP:211.75.xxx.xxx 未訂閱
難道你每一天開始最初那一張單號不是001嗎? 如果是 那把日期轉換出來的整數乘1000後加入不就好了,最主要就是流水號不要重複就好. 總歸一句話,技巧都告訴你了,怎變化運用就看每個人的巧思了. 用作太空梭的技術去製造腳踏車,客戶不會因為技術高超就買,只會因為它是一台他所需的腳踏車而買.
dm228183
一般會員


發表:10
回覆:10
積分:4
註冊:2002-07-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-27 10:56:21 IP:59.120.xxx.xxx 未訂閱
再請問各位先進 當單據進行修改時又該如何實作?只能利用暫存資料表嗎? Leon.HP
------
Leon.HP
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-27 14:24:21 IP:211.75.xxx.xxx 未訂閱
引言: 再請問各位先進 當單據進行修改時又該如何實作?只能利用暫存資料表嗎? Leon.HP
唉!!! 你的問題看一看,我發現一個問題 那就是你根本沒有規劃你每一個功能需做到的要求是啥?? 在滿足這些要求時,可能會碰到啥問題? 這樣的思考模式是在處理案子的時候必需的步驟. 當你釐清你的要求與可能會碰到的問題時,你才有方向去尋求解決方案. 其實看看你所要做到的功能與可能會碰到的情況,說實在的,光在DB端就可以解決. 建議你去翻翻SQL的書吧!!!!
ph
一般會員


發表:3
回覆:27
積分:11
註冊:2003-09-28

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-27 17:19:54 IP:218.160.xxx.xxx 未訂閱
引言: 再請問各位先進 當單據進行修改時又該如何實作?只能利用暫存資料表嗎? Leon.HP
若是用過檔模式,等於是新增一筆單據,在過帳時,先把 原本已過帳的單據刪除,回扣會員點數,再新增一筆單據 山即是我 我即是山
------
學了這麼久還是沒進步
dm228183
一般會員


發表:10
回覆:10
積分:4
註冊:2002-07-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-29 13:57:03 IP:59.120.xxx.xxx 未訂閱
小弟不才,小弟非專業程式設計人員,在公司也非司職程式設計,僅因對程式設計具有興趣,偶而為公司寫些小程式應用.
引言: 唉!!! 你的問題看一看,我發現一個問題 那就是你根本沒有規劃你每一個功能需做到的要求是啥?? 在滿足這些要求時,可能會碰到啥問題? 這樣的思考模式是在處理案子的時候必需的步驟. 當你釐清你的要求與可能會碰到的問題時,你才有方向去尋求解決方案. 其實看看你所要做到的功能與可能會碰到的情況,說實在的,光在DB端就可以解決.建議你去翻翻SQL的書吧!!!!
jcjroc先進以上所言甚是,但對於未所受過正規教育的非專業人員所需要的應該各位受過正規訓練的先進的建議,畢竟你們的經驗可以是我們的思考學習的方向.書籍固然可以也是自身技術的基礎,但是在閱讀後仍百思不解時就希望會有能人可以指引迷津提供方法,我想這也是這個論壇成立的意義吧.讓我們這些新手能在這裡尋求先進們的協助及學習經驗. 我想若是jcjroc先進你去看醫生時,如果有疑惑而對醫生提出詢問的時候,你應該也不希望聽到醫生對你說 "來看病前建議你先去翻翻藥典和醫藥辭典" 吧.在這小弟仍然感謝你無私的提供你寶貴的建言. Leon.HP
------
Leon.HP
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-07-12 19:35:26 IP:211.75.xxx.xxx 未訂閱
我並不是不願經驗傳承,但我會希望提發問的人能很清楚的知道自己想要啥?? 而問題出現在哪?對於技術層面上,我大都毫不保留,但..... 一個軟體的實現可說是用兜出來的,既然是兜出來的,那方法就有非常多. 說實在的,在我來看技術大家都會,要學也很快.但如何靈活運用技術進而產生一個商品(或解決問題)這才重要,這就是一般人說的Solution(解決方案). Solution是一個廣泛性的辭句(範圍可大可小),一個Solution可能需要多種專業技術來組合與搭配才能成功. 一般來說"技術"要轉換成"錢"是比較沒價值的,也就是說如果要單靠技術賺錢,其下場常是"餓死一途",真正能賺錢的是Solution.而且通常是越大的Solution越能賺錢.. 一個程式拆開來看,每一行都看得懂,難就難再不知道為何要那樣組合.是何道理要那樣做??? 我們常買了一樣東西回家研究後,發現其運作原理與實做的技術簡單到3歲小孩都懂,更氣人的是還賣那麼貴.@@@,ㄏㄏㄏ,別氣,人家賣的是Solution. 不知你看到這能不能明白我所要傳達的意思??? 告訴你去翻書,並不是要你去對書中所提到的技術做一番徹底研究,而是要你去知道它提供哪些小Solution可以解決你的大Solution.而不知道那些小Solution正是你的致命傷.. 這道理跟看醫生是不同的,看醫生是花錢了事,A醫生看不好我再花錢去看B醫生.至於那些專業名詞與原理壓跟我不想知道,我只是要花錢醫好我的病. 當然如果你是想花錢了事,那找外包就好,管它啥SQL Command,排程,預存程序的.一樣能達到你最後的目的.....交給你老闆一個可用的程式.
系統時間:2024-04-26 5:57:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!