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

存檔前讓序號自動重排之問題

尚未結案
99right
一般會員


發表:1
回覆:0
積分:0
註冊:2009-07-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-01-07 16:42:19 IP:59.120.xxx.xxx 訂閱
各為前輩們大家好,
小弟想求助各位 : 單身資料表BB透過複製產生了十筆0001~0010, 經過些許修改之後刪除了 item0002; 0004 & 0006,
希望存檔(新增或修改)時自動重新寫入 0001~0007 的序號(BB003), 請問該如何寫呢? (BB 資料表的PRIMARY : BB001 BB002 BB003)

DB新人
------
JK
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-01-07 18:00:59 IP:59.120.xxx.xxx 未訂閱
那您的0002  0004 0006 也要寫回去嗎?
假如是的話
可以在刪掉後....
1.先用i := 0010 DownTo 0001來判斷是否是最後一個被刪的
2.假如是的話再用j := 0001 to (i 1),然後下sql指令把你要的欄位資料Update為0001~(i 1)

僅供參考~

GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-01-07 19:16:54 IP:219.70.xxx.xxx 未訂閱
老大仔大您好,如果是把號碼重編的話,會不會比較快呢?

還是我搞錯題意的樣子?

因為有點看不懂…
1.先用i := 0010 DownTo 0001來判斷是否是最後一個被刪的
↑這是要利用旗標把之前刪除過的id先存起來嗎?

2.假如是的話再用j := 0001 to (i 1),然後下sql指令把你要的欄位資料Update為0001~(i 1)
↑想不太出來這要如何轉成delphi語法

還麻煩老大仔大大賜教,謝謝囉!

===================引 用 老大仔 文 章===================
那您的0002 0004 0006 也要寫回去嗎?
假如是的話
可以在刪掉後....
1.先用i := 0010 DownTo 0001來判斷是否是最後一個被刪的
2.假如是的話再用j := 0001 to (i 1),然後下sql指令把你要的欄位資料Update為0001~(i 1)

僅供參考~

pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-01-07 22:25:04 IP:61.224.xxx.xxx 未訂閱
您好

表身寫入檔的用意是?
我的作法是,表身依單號 產品編號為key
然後用虛欄位,
在DataSet.OnCalcFields事件裡,動態賦予序號
如此不管刪了那一筆次序會自動重排

試看看是不是你要的?

procedure cdsDetailCalcFields(DataSet: TDataSet);
begin
cdsDetailvSNo.Value:=IntToStr(cdsDetail.RecNo);
end;

===================引 用 99right 文 章===================
各為前輩們大家好,
小弟想求助各位 : 單身資料表BB透過複製產生了十筆0001~0010, 經過些許修改之後刪除了 item0002; 0004 & 0006,
希望存檔(新增或修改)時自動重新寫入 0001~0007 的序號(BB003), 請問該如何寫呢? (BB資料表的PRIMARY: BB001 BB002 BB003)

DB新人
rookie168
一般會員


發表:0
回覆:3
積分:0
註冊:2010-01-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-01-07 22:29:42 IP:59.120.xxx.xxx 訂閱
Dear 老大仔 您好, 
幾點事項, 向您說明報告:
1, 刪掉的部份不需要寫回去.
2, 我司因為求方便快速, 會先建立好常用單據(例如:常用報價單), 當中會有10幾項item; 並都有各自序號,
當客戶要求報價時, 我司會使用複製單據的功能快速的先把整張常用報價單copy 到當天的日期的新單據,
此時會依客戶實際所需刪除部份item, 但被刪除的item及其序號會形成跳號, 造成客戶誤解,
所以需要將程式修改成於"存檔前" "序號重排"的功能.
3, 最後容小弟解釋一下, 因小弟欲進行email 地址變更, 沒看清楚系統提醒需重新驗證, 一不小心把99right(原發問ID)給註銷了,
後續將用 rookie168 繼續向各位前輩們請益, 謝謝~


===================引 用 老大仔 文 章===================
那您的0002 0004 0006 也要寫回去嗎?
假如是的話
可以在刪掉後....
1.先用i := 0010 DownTo 0001來判斷是否是最後一個被刪的
2.假如是的話再用j := 0001 to (i 1),然後下sql指令把你要的欄位資料Update為0001~(i 1)

僅供參考~

------
PR.Rookie
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-01-08 01:59:44 IP:118.169.xxx.xxx 未訂閱
我常向初學者提出, 這樣的做法是無意義的, 試想, 等到資料有上萬筆時, 每次都要重排一次序號, 多累人!?
抱著序號一定要連號, 除了比較容易知道有沒有跳號外, 還有什麼功能性存在呢? 如果沒有, 為了跳號的控管
是不是還有其他方式可以達成, 想想看吧!
===================引 用 99right 文 章===================
各為前輩們大家好,
小弟想求助各位 : 單身資料表BB透過複製產生了十筆0001~0010, 經過些許修改之後刪除了 item0002; 0004 & 0006,
希望存檔(新增或修改)時自動重新寫入 0001~0007 的序號(BB003), 請問該如何寫呢?? (BB?資料表的PRIMARY?: BB001 BB002 BB003)?

DB新人
rookie168
一般會員


發表:0
回覆:3
積分:0
註冊:2010-01-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-01-08 09:11:39 IP:59.120.xxx.xxx 訂閱
版主大大大 您好,
可能是小弟很努力的想把重點簡單的表達出來, 但又表達的不好~ 真是報歉~~
但小弟的報價單身最多報個20筆就很多了(目前最多18筆, 不可能上萬筆), 而且我也沒有要控管??

事實上 : 單身資料表前三個欄位都是PRIMARY KEY : 分別為 BB001(單別) BB002(單號) BB003(序號),
而列印出來的給客戶的報價單BODY, 只會顯示序號(BB003) 品項 單價; 數量.....等等 ,

"序號" 會需要排序也是 FOR 客戶要求, 因為若是報價單身共有12個item, 但序號卻出現到 "0018",
並且中間少了6個序號(少18-12=6個), 龜毛的客戶會哇哇叫, 因此小弟來這求助於各位大師.

另外, 小弟也曾想過乾脆就改要提供給客戶的報價單憑證程式就好, 因為聽說建檔程式之"單別 單號 序號"是寫在祖先裡頭,
但是這時又考慮到 ISO 建檔資料與產出憑證內容不符的問題, 只好回頭想如何改建檔程式, 並且改在"存檔"前最後一刻, 強迫
直接將資料庫的序號改掉, 應該就全部相安無事了, 這就是整個故事及小弟的想法了...
謝謝~~



===================引 用 P.D. 文 章===================
我常向初學者提出, 這樣的做法是無意義的, 試想, 等到資料有上萬筆時, 每次都要重排一次序號, 多累人!?
抱著序號一定要連號, 除了比較容易知道有沒有跳號外, 還有什麼功能性存在呢? 如果沒有, 為了跳號的控管
是不是還有其他方式可以達成, 想想看吧!
===================引 用 99right 文 章===================
各為前輩們大家好,
小弟想求助各位 : 單身資料表BB透過複製產生了十筆0001~0010, 經過些許修改之後刪除了 item0002; 0004 & 0006,
希望存檔(新增或修改)時自動重新寫入 0001~0007 的序號(BB003), 請問該如何寫呢?? (BB?資料表的PRIMARY?: BB001 BB002 BB003)?

DB新人
------
PR.Rookie
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-01-08 09:15:50 IP:59.120.xxx.xxx 未訂閱
TO GrandRURU 前輩:
噢~看來我也會錯意了XD
我原本以為只是在10筆的範圍內
以為...因為少了三筆資料
所以從後面數回去到最後被刪掉的那一筆
然後再 1(0007)

唉唉~~會錯意了
請別在意我的第一篇回應囉~
Sorry~

ps:您稱我為”大”...小弟我擔當不起啊
我也只是個初學者而已

===================引 用 GrandRURU 文 章===================
老大仔您好,如果是把號碼重編的話,會不會比較快呢?

還是我搞錯題意的樣子?

因為有點看不懂…
1.先用i := 0010 DownTo 0001來判斷是否是最後一個被刪的
↑這是要利用旗標把之前刪除過的id先存起來嗎?

2.假如是的話再用j := 0001 to (i 1),然後下sql指令把你要的欄位資料Update為0001~(i 1)
↑想不太出來這要如何轉成delphi語法

還麻煩老大仔大大賜教,謝謝囉!

===================引 用 老大仔 文 章===================
那您的0002 0004 0006 也要寫回去嗎?
假如是的話
可以在刪掉後....
1.先用i := 0010 DownTo 0001來判斷是否是最後一個被刪的
2.假如是的話再用j := 0001 to (i 1),然後下sql指令把你要的欄位資料Update為0001~(i 1)

僅供參考~

編輯記錄
老大仔 重新編輯於 2010-01-08 09:26:17, 註解 無‧
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2010-01-08 09:23:59 IP:59.120.xxx.xxx 未訂閱
嗯...不知道我這樣想對不對
以下供參考~

先把您要的資料(序號(BB003) ?品項 ?單價; 數量.....等等)
Select出來放到某個Dataset中
並且在Select 當中再自行加入一個新的欄位(Ex:序號2)
之後再用迴圈0~12一一的把數值填入"序號2"中
要列印出來時,只需要把"序號(BB003)"設隱藏就好了
如此一來
序號2應該可以偷偷的代替掉序號了@@

不知這樣行不行的通= =

===================引 用 rookie168 文 章===================
版主大大大 您好,
可能是小弟很努力的想把重點簡單的表達出來, 但又表達的不好~?真是報歉~~
但小弟的報價單身最多報個20筆就很多了(目前最多18筆, 不可能上萬筆), 而且我也沒有要控管??

事實上 : 單身資料表前三個欄位都是PRIMARY KEY : 分別為 BB001(單別) BB002(單號) BB003(序號),
而列印出來的給客戶的報價單BODY, 只會顯示序號(BB003) ?品項 ?單價; 數量.....等等?,

"序號" 會需要排序也是 FOR 客戶要求, 因為若是報價單身共有12個item, 但序號卻出現到 "0018",
並且中間少了6個序號(少18-12=6個), 龜毛的客戶會哇哇叫, 因此小弟來這求助於各位大師.

另外, 小弟也曾想過乾脆就改要提供給客戶的報價單憑證程式就好, 因為聽說建檔程式之"單別 單號 序號"是寫在祖先裡頭,
但是這時又考慮到 ISO 建檔資料與產出憑證內容不符的問題, 只好回頭想如何改建檔程式, 並且改在"存檔"前最後一刻, 強迫
直接將資料庫的序號改掉, 應該就全部相安無事了, 這就是整個故事及小弟的想法了...
謝謝~~



===================引 用 P.D. 文 章===================
我常向初學者提出, 這樣的做法是無意義的, 試想, 等到資料有上萬筆時, 每次都要重排一次序號, 多累人!?
抱著序號一定要連號, 除了比較容易知道有沒有跳號外, 還有什麼功能性存在呢? 如果沒有, 為了跳號的控管
是不是還有其他方式可以達成, 想想看吧!
===================引 用 99right 文 章===================
各為前輩們大家好,
小弟想求助各位 : 單身資料表BB透過複製產生了十筆0001~0010, 經過些許修改之後刪除了 item0002; 0004 & 0006,
希望存檔(新增或修改)時自動重新寫入 0001~0007 的序號(BB003), 請問該如何寫呢?? (BB?資料表的PRIMARY?: BB001 BB002 BB003)?

DB新人
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2010-01-08 11:00:01 IP:211.72.xxx.xxx 訂閱
依個人經驗,連號序號對 DB 實無意義,但確有實際的需求。
例如本例,客戶並不想依”單別+單號+品號”做排序,
因對客戶而言,品名及品項(序號)較有意義,品號只是電腦作業的需求。
又例如會計傳票之單身,若不編序號,無法 Unique;若在中間刪除或插入,
則序號便須重編,否則難符會計之需求。

小弟重編序號的方法是:
若是插入,先將該位置序號及其後者,由後往前各加一,再做插入新錄,序號為原插入位置之序號。
若是新增於最後,則直接加入新錄,序號為原有各錄之最大號加一。
若是刪除,則刪除後,該序號之後各錄,由前往後各減一。
須注意的是:做此流程時,須鎖住該批單身資料各錄,以防網路多人作業發生錯誤。
rookie168
一般會員


發表:0
回覆:3
積分:0
註冊:2010-01-07

發送簡訊給我
#11 引用回覆 回覆 發表時間:2010-01-08 12:35:36 IP:59.120.xxx.xxx 訂閱
Pedro大 您好,
感謝您的指點, 幾點事項向您說明報告:
1, 表身序號重新寫入的用意是 : 新增單據方式為透過複製舊單據產生後, 開始進行編修資料,
但單身之序號欄位(BB003)只可顯示,不給修改, 所以經過刪除修改後造成中間有被刪除的item序號跳號.
2, 單據想要存檔時, 同時重新排序的欄位已經存在, 即 : BB003
3, 您指導的方式, 小弟覺得好像比較接近可行, 但礙於剛在學習階段, 無法完全理解, 可否請您依照小弟
目前的環境狀況, 再詳述一下作法及完整的語法

感謝您!!

===================引 用 pedro 文 章===================
您好

表身寫入檔的用意是?
我的作法是,表身依單號 產品編號為key
然後用虛欄位,
在DataSet.OnCalcFields事件裡,動態賦予序號
如此不管刪了那一筆次序會自動重排

試看看是不是你要的?

procedure cdsDetailCalcFields(DataSet: TDataSet);
begin
cdsDetailvSNo.Value:=IntToStr(cdsDetail.RecNo);
end;

===================引 用 99right 文 章===================
各為前輩們大家好,
小弟想求助各位 : 單身資料表BB透過複製產生了十筆0001~0010, 經過些許修改之後刪除了 item0002; 0004 & 0006,
希望存檔(新增或修改)時自動重新寫入 0001~0007 的序號(BB003), 請問該如何寫呢? (BB資料表的PRIMARY: BB001 BB002 BB003)

DB新人
------
PR.Rookie
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2010-01-09 08:20:39 IP:61.216.xxx.xxx 未訂閱
hi rookie168

事實上,我提的作法與P.D.版主建議的一樣,不存入流水序的方式,既然是計算欄位,
只是方便使用者閱讀和列印,在資料表是不存在的欄位

如果照herbert2大,所提,會有一些額外的動作需處理,
就如您2.的構想一樣,需用迴圈看表身從頭計數到尾

===================引 用 rookie168 文 章===================
Pedro大 您好,
感謝您的指點, 幾點事項向您說明報告:
1, 表身序號重新寫入的用意是 :?新增單據方式為透過複製舊單據產生後, 開始進行編修資料,
但單身之序號欄位(BB003)只可顯示,不給修改, 所以經過刪除修改後造成中間有被刪除的item序號跳號.
2, 單據想要存檔時, 同時重新排序的欄位已經存在, 即 : BB003?
3, 您指導的方式, 小弟覺得好像比較接近可行, 但礙於剛在學習階段, 無法完全理解, 可否請您依照小弟
??? 目前的環境狀況, 再詳述一下作法及完整的語法

感謝您!!

===================引 用 pedro 文 章===================
您好

表身寫入檔的用意是?
我的作法是,表身依單號 產品編號為key
然後用虛欄位,
在DataSet.OnCalcFields事件裡,動態賦予序號
如此不管刪了那一筆次序會自動重排

試看看是不是你要的?

procedure cdsDetailCalcFields(DataSet: TDataSet);
begin
cdsDetailvSNo.Value:=IntToStr(cdsDetail.RecNo);
end;

編輯記錄
pedro 重新編輯於 2010-01-09 08:22:41, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#13 引用回覆 回覆 發表時間:2010-01-11 22:55:14 IP:118.169.xxx.xxx 未訂閱
其實你的描述已經非常清楚了, 所以無須抱歉啦!
我提這檔觀念是因為接過太多這樣的案例, 我都向客戶解釋電腦資料處理的要點在那裡?
早之前大家會要求序號連號是因為手工作業不易管理, 所以最直接的引用序號控管是人力
目視上都容易察覺的出來的, 但把人工的觀念引入資訊流中是否恰當, 這值得三思, 往往就是
因為人工的觀念害的電腦設計為配合這樣的不合適的流程, 而引發敗筆
雖然現實面上還是有很多業主要求要連號, 在此提供你一個方法
只要你能確保操作者輸入的資料可以正常保存, 不妨流水號由報表產生, 這樣不管對方如何輸入,
印出來都一定會是連號, 當然這只是為應付像你提到這麼龜毛的客戶
或者利用一個calcfiled 來產生流水號, 提供你參考
===================引 用 rookie168 文 章===================
版主大大大 您好,
可能是小弟很努力的想把重點簡單的表達出來, 但又表達的不好~?真是報歉~~
但小弟的報價單身最多報個20筆就很多了(目前最多18筆, 不可能上萬筆), 而且我也沒有要控管??

事實上 : 單身資料表前三個欄位都是PRIMARY KEY : 分別為 BB001(單別) BB002(單號) BB003(序號),
而列印出來的給客戶的報價單BODY, 只會顯示序號(BB003) ?品項 ?單價; 數量.....等等?,

"序號" 會需要排序也是 FOR 客戶要求, 因為若是報價單身共有12個item, 但序號卻出現到 "0018",
並且中間少了6個序號(少18-12=6個), 龜毛的客戶會哇哇叫, 因此小弟來這求助於各位大師.

另外, 小弟也曾想過乾脆就改要提供給客戶的報價單憑證程式就好, 因為聽說建檔程式之"單別 單號 序號"是寫在祖先裡頭,
但是這時又考慮到 ISO 建檔資料與產出憑證內容不符的問題, 只好回頭想如何改建檔程式, 並且改在"存檔"前最後一刻, 強迫
直接將資料庫的序號改掉, 應該就全部相安無事了, 這就是整個故事及小弟的想法了...
謝謝~~

pillar62
資深會員


發表:9
回覆:324
積分:271
註冊:2002-04-15

發送簡訊給我
#14 引用回覆 回覆 發表時間:2010-04-23 16:03:21 IP:219.87.xxx.xxx 訂閱
小弟認為序號如果只是要讓流水號看起來比較順眼,那可以像pd大大說的使用一個計算欄位顯示.recno就可以了。
但是如果是類似會計系統的傳票明細需要做排序處理的,建議是鍵值的欄位不要顯示,另外增加一個排序的欄位
讓使用者可以自行修改。
------
Pillar Wang
ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#15 引用回覆 回覆 發表時間:2010-04-25 14:55:50 IP:140.135.xxx.xxx 訂閱

您只是要讓報價單的 "項次" 號碼連貫, 建議不要去重寫 PRIMARY KEY,工程浩大

如其它前輩所言,另開一欄位,可以輸入號碼,好處是可以自己輸入項次,
要把某幾筆屬性一樣的資料連號在一起,也可以手工調整
例 :
項次
------
01
02
03
......



項次
------
A01
A02
B01
B02
......


結論是 : 1. 電腦產生的 PRIMARY KEY 是 目前最大號,繼續往下 1
2. 印表的項次序號,由另一欄位可輸入調整,隨時可以更改
------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
系統時間:2024-11-23 3:43:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!