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

如何在程式碼中以下一筆減去該筆資料去做判斷?

答題得分者是:yubad2000
aleeon180
一般會員


發表:1
回覆:6
積分:1
註冊:2008-03-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-24 10:55:39 IP:61.71.xxx.xxx 訂閱
各位前輩你們好,敝人小良我有以下問題,還請各位指教!

假設資料庫內有以下資料
用table載入一小資料庫

[code delphi]

101
102
103
104
106
201
202
205
207
208

[/code]

我想要將空號(例:202 205 之間的空號)補上數連續的數字
判斷是若下一筆資料mod 100 減去該筆資料 mod 100 若大於1 則 插入一筆該筆資料 1 的新資料進去
當執行到 第104時 就會因為判斷而新增一筆105
到202時會新增 203
到203時會新增 204
以此類推

我卡在不知道怎麼去用下一筆減去該筆資料
.next不能降用><
編輯記錄
aleeon180 重新編輯於 2008-03-24 10:56:49, 註解 無‧
P.D.
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-24 15:58:58 IP:61.67.xxx.xxx 未訂閱
1.先就技術面來看, 要解決, 其實也不難, 只要在判斷結果上做
table1.next;
if xxxxx > 1 then begin
table1.prior; ==>把記錄往回推一筆
table1.insert;
......
end;

2.就實質面來看, Insert 的用法並不是每一種資料庫都支援, 有些資料庫insert還是插入到資料庫最下層,
所以你希望達到連續序號(我想你要的是序號的連續吧), 在實際的應用曾面上來說, 早晚會出事
3.不如採用index方式來處理, 我不管資料是否insert或append, 只要對該欄位進行index動作, 都可以排出
順利的序號
aleeon180
一般會員


發表:1
回覆:6
積分:1
註冊:2008-03-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-24 17:47:16 IP:61.71.xxx.xxx 訂閱
感謝版主回應!
另外我感到有問題的地方就在於那xxxxxxx之處

因為我無法用 table1XXXX.next - table1XXXX >1 @@
我現在用的方法是降
[code delphi]
請在此區域輸入程式碼
begin
bk1 := Table1.GetBookmark();
Table1.First;
while (NOT Table1.EOF) do
begin
Table1.Open;
tempP1S := Copy(Table1RAREN.AsString,6,5);
tempP1 := StrtoInt(tempP1S);
//存本身的值
Table1.next;//下一個
tempP2S := Copy(Table1RAREN.AsString,6,5);
tempP2 := StrtoInt(tempP2S);
//存下一個的值
Table1.Prior;//回到自己
If (tempP2 mod 10000) > (tempP1 mod 10000) 1 Then
Begin//如果有斷號就開始
tempP1 := tempP1 1;
tempS1 := Copy(Table1RAREN.AsString,1,5) InttoStr(tempP1);
Table1.next;//先移到下一個再新增,位置才會對
Table1.Insert;
Table1RAREN.Value := tempS1;
Table1RAMNI.Value := 0;
Table1RAMNO.Value := 0;
SHOWMESSAGE(tempS1); //我檢查用的
//另外我在這裡加上 Table1.Prior的話,就會變成無限迴圈,但因為我已經在前面下了next,這裡加上prior應該只是回到本身而已啊?!
Table1.Post;
End;
Table1.Next;
end;
Table1.GotoBookmark (bk1);
Table1.FreeBookmark (bk1);
end;
[/code]


這樣子都只跑一次耶,為什麼??
我這樣做的目的是要補所有斷號
而斷號長達十位,所以無法使用asinteger,
我切成兩部分做,切的部分剛好都是五位數字,且第一位不為零。

新增的資料都跑到了table1的最後方,我的bookmark沒用了嗎?orz


再次感謝版主回答,我第一次接觸此語言,希望大家多多牽成@@
編輯記錄
aleeon180 重新編輯於 2008-03-24 18:27:20, 註解 無‧
aleeon180
一般會員


發表:1
回覆:6
積分:1
註冊:2008-03-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-03-25 08:57:43 IP:61.71.xxx.xxx 訂閱
1.用回推的方式比較好嗎?
3.請問index的用法為何?

再次感謝回應,但我太嫩,有好多問題orz

===================引 用 P.D. 文 章===================
1.先就技術面來看, 要解決, 其實也不難, 只要在判斷結果上做
table1.next;
if xxxxx > 1 then begin
table1.prior; ==>把記錄往回推一筆
table1.insert;
......
end;

2.就實質面來看, Insert 的用法並不是每一種資料庫都支援, 有些資料庫insert還是插入到資料庫最下層,
所以你希望達到連續序號(我想你要的是序號的連續吧), 在實際的應用曾面上來說, 早晚會出事
3.不如採用index方式來處理, 我不管資料是否insert或append, 只要對該欄位進行index動作, 都可以排出
順利的序號

P.D.
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-03-25 10:03:58 IP:61.67.xxx.xxx 未訂閱
先回答你上一個問題
xxx.next-xxx
這個用法你是在那一本書看到或老師教的, 還是自創, .next 是一個procedure, 沒有任何回傳值的, 能夠這樣子來相減嗎?
我在上一個回覆已經很明白指出, 你要使用prior, next 方式來判斷
這是Delphi Help的說明
Positions the cursor on the next record in the dataset.
procedure Next;
Description
Call Next to position the cursor on the next record in the dataset and make it the active record. Next posts any changes to the active record and
Sets the Bof and Eof properties to False.
Fetches the next record, positions the cursor on it, and makes it the active record.
Fetches any additional records required for display, such as those needed to fill out a grid control.
Sets the Eof property to True if the cursor was already on the last record in the dataset.
Broadcasts the record change so that data controls and linked detail sets can update.
Note: TDataSet uses internal, protected methods to position the database cursor and to fetch additional records required for display. In TDataSet, these internal methods are abstract. Descendant classes implement these methods to enable the Last method to work.

1.用回推的方式比較好嗎?
你沒有用心看我的回覆哦! 我都解釋很清楚了, 你的po文說你很嫩, 但不代表就可以拿來當藉口, 呼嚨的看回文

3.請問index的用法為何?
這與各資料庫結構有不同做法, 你必須先瞭解你使用的是那一種資料庫, 然後建議你用功點翻書查索引方面資料, 因為這不是一篇討論可以說明白的!
編輯記錄
P.D. 重新編輯於 2008-03-25 10:05:47, 註解 無‧
aleeon180
一般會員


發表:1
回覆:6
積分:1
註冊:2008-03-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-03-25 11:36:09 IP:61.71.xxx.xxx 訂閱
一、
不好意思,我知道降用是錯的啊@@
就算真的不知道…在COMPLIE的時候就會出錯了,所以也該知道了,
我表達的是我的想法啦

二、
這我就不懂了
我算是認真看了…因為很想解決這問題
我是用當筆減下一筆,先把兩者的數字都存了起來。
版主的例子中,小弟沒有看到版主到下一筆後怎麼去和上一筆去互動…我已經了解了PRIOR NEXT用法,但問題還是沒有解決
所以才會對差異提出這個問題(回推比較好嗎?),

三、
現在我知道TABLE裡面新增資料一律都是從尾巴了
APPEND 和 INSERT 一樣
而且一新增 INDEX就到最後了

回到最原本的問題,如何以下一筆減去該筆資料去做判斷,
小弟是想知道有沒有比較簡潔的方法,
嫩…有引起什麼誤會的話,先抱歉了。

===================引 用 P.D. 文 章===================
先回答你上一個問題
xxx.next-xxx
這個用法你是在那一本書看到或老師教的, 還是自創, .next 是一個procedure, 沒有任何回傳值的, 能夠這樣子來相減嗎?
我在上一個回覆已經很明白指出, 你要使用prior, next 方式來判斷
這是Delphi Help的說明


1.用回推的方式比較好嗎?
你沒有用心看我的回覆哦! 我都解釋很清楚了, 你的po文說你很嫩, 但不代表就可以拿來當藉口, 呼嚨的看回文

3.請問index的用法為何?
這與各資料庫結構有不同做法, 你必須先瞭解你使用的是那一種資料庫, 然後建議你用功點翻書查索引方面資料, 因為這不是一篇討論可以說明白的!
P.D.
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-03-25 17:35:22 IP:61.67.xxx.xxx 未訂閱
1.在目前這一筆先記錄 "序號" 到 var1
2.table.next 後記錄 "序號" 到 var2
3.這樣不就有 var1, var2 兩個變數, 那不就可以知道兩者當中差了多少
4.接下來使用 table.insert (如果你的資料庫可以接受insert用法), 那就可以把不夠的序號給補上了
但如果insert 與 append 一樣都是被插入到最後一筆的話, 基本上就必須使用index來排序, 否則你插入的記錄永遠會如下
1
2
5
3
4
這在我上面的程式說明所要表達的, 重點就是prior, next 其他你能好好想一下, 應該不難的!
aleeon180
一般會員


發表:1
回覆:6
積分:1
註冊:2008-03-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-03-26 00:38:03 IP:59.105.xxx.xxx 訂閱
這樣是不是和小弟我自己寫的一樣啊?
感謝回應
我會自己再去克服其它問題的。
jackiemi2_seed
中階會員


發表:37
回覆:97
積分:76
註冊:2006-09-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-03-26 11:43:40 IP:61.218.xxx.xxx 訂閱
我將資料拉到出來時,習慣丟到ClientDataSet1裡
在ClientDataSet1設定index
如:ClientDataSet1.IndexFieldNames :='tt';//tt為欄位名字
這樣不管用ClientDataSet1.Insert或ClientDataSet1.Append新增資料時
資料都會自動作排序
我不確定你用的table是否有和ClientDataSet1一樣的IndexFieldNames功能
//
在table1判斷發生缺號時,先把缺的號碼新增到table2,
等到table1所有資料跑完時,再從table2把缺號的號碼一次新增到table1
這樣不知會不會讓程式簡單一點
//
希望對你有幫助
===================引 用 aleeon180 文 章===================

三、
現在我知道TABLE裡面新增資料一律都是從尾巴了
APPEND 和 INSERT 一樣
而且一新增 INDEX就到最後了
------
OS : Win 7 pro
Program : Delphi 7
DataBase : Ms Sql 2008
yubad2000
中階會員


發表:0
回覆:44
積分:78
註冊:2007-09-30

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-03-26 11:56:00 IP:66.171.xxx.xxx 未訂閱
You need another TQuery to check the "next ID number"
The SQL command is
"Select Min(table1.id) as nextID from table1 where id > :now_ID;"

1. Set TQuery.parameterbyname("now_ID") = Ttable1["id"], assume we give id = 202;
2. Run TQuery
3. Then, the TQuery["nextID"] should give you the value 205 and store in var2.
4. If TQuery["nextID"] = 0, means that Ttable1["id"] is the maximun value as well as the last row.
then do nothing.
else
for (i=1; i< ( var2 -Ttable1["id"]); i )
insert a row with id = Ttable1["id"] i;
5. Go through each row using Ttable1.next and repeat step1~4 until Ttable1.EOF.

Hope this help~

===================引 用 aleeon180 文 章===================
各位前輩你們好,敝人小良我有以下問題,還請各位指教!

假設資料庫內有以下資料
用table載入一小資料庫

[code delphi]

101
102
103
104
106
201
202
205
207
208

[/code]

我想要將空號(例:202 205 之間的空號)補上數連續的數字
判斷是若下一筆資料mod 100 減去該筆資料 mod 100 若大於1 則 插入一筆該筆資料 1 的新資料進去
當執行到 第104時 就會因為判斷而新增一筆105
到202時會新增 203
到203時會新增 204
以此類推

我卡在不知道怎麼去用下一筆減去該筆資料
.next不能降用><
------
===波士頓夜未眠===
What a wonderful world!!
Jazz up the world with jazz!!
==================

When I am not programming...
you can find me here:
http://www.holy-war.de/EN/World3/bin/?advertiser=63190
aleeon180
一般會員


發表:1
回覆:6
積分:1
註冊:2008-03-18

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-03-26 16:40:08 IP:61.71.xxx.xxx 訂閱
謝謝您的回答,
小弟接觸Delphi約兩個禮拜了,從看人家寫的程式開始,
但連TQuery TTable都不知道怎麼用
最近才了解到一些,我自己花的時間太少在程式上了。
我會試試看您提供的作法試試的!
ClientDataSet又是陌生人啊~
===================引 用 jackiemi2_seed 文 章===================
我將資料拉到出來時,習慣丟到ClientDataSet1裡
在ClientDataSet1設定index
如:ClientDataSet1.IndexFieldNames :='tt';//tt為欄位名字
這樣不管用ClientDataSet1.Insert或ClientDataSet1.Append新增資料時
資料都會自動作排序
我不確定你用的table是否有和ClientDataSet1一樣的IndexFieldNames功能
//
在table1判斷發生缺號時,先把缺的號碼新增到table2,
等到table1所有資料跑完時,再從table2把缺號的號碼一次新增到table1
這樣不知會不會讓程式簡單一點
//
希望對你有幫助

aleeon180
一般會員


發表:1
回覆:6
積分:1
註冊:2008-03-18

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-03-26 16:43:09 IP:61.71.xxx.xxx 訂閱
Thanks for your reply!
I will try the way you suggested!

===================引 用 yubad2000 文 章===================
You need another TQuery to check the "next ID number"
The SQL command is
"Select Min(table1.id) as nextID from table1 where id > :now_ID;"

1. Set TQuery.parameterbyname("now_ID") = Ttable1["id"], assume we give id = 202;
2. Run TQuery
3. Then, the TQuery["nextID"] should give you the value 205 and store in var2.
4. If TQuery["nextID"] = 0, means that Ttable1["id"] is the maximun value as well as the last row.
then do nothing.
else
for (i=1; i< ( var2 -Ttable1["id"]); i )
insert a row with id = Ttable1["id"] i;
5. Go through each row using Ttable1.next and repeat step1~4 until Ttable1.EOF.

Hope this help~

系統時間:2024-05-21 14:46:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!