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

以ID算筆數問題

答題得分者是:st33chen
helsing
一般會員


發表:7
回覆:15
積分:4
註冊:2004-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-27 11:41:24 IP:203.126.xxx.xxx 訂閱
各位大大最近,在改一個程式的source code,但是這段有點看不懂,想請教看得懂的大大幫我駐解一下...感恩喔

Form1->Table1->Open();
if(Table1->FindFirst())
{
for(Table1->First();!Table1->Eof;Table1->Next())
{

if(Table1->FieldByName("CPF")->IsNull)
{
Qry_tmp1->Close();
Qry_tmp1->SQL->Clear();
Qry_tmp1->SQL->Add("select * from " Table1->TableName);
Qry_tmp1->SQL->Add("where ID like '" Table1->FieldByName("ID")->AsString "%'"); //以 ID去判斷一樣的
Qry_tmp1->Open();
Query1RecordCount=Qry_tmp1->RecordCount;
Qry_tmp1->First();

for(i=1;i<=Query1RecordCount;i )
{
Qry_tmp1->Edit();
if(Table1->FieldByName("TYPE")->AsString=="AA")
{
Qry_tmp1->FieldByName("CPF")->AsString="1";
}
else // ¤U­±³o¬q¬Ý¤£¤ÓÀ´,¥i¥H½Ð¬Ý±oÀ´ªº¤j¤jÀ°§Úµù¸Ñ¤@¤U¶Ü????
{
if(i%4==1)
{
if(Query1RecordCount/4)
if(Query1RecordCount/4*4 1==i)
Qry_tmp1->FieldByName("CPF")->AsString=(Query1RecordCount-Query1RecordCount/4*4)%4?(Query1RecordCount-Query1RecordCount/4*4)%4:4;
else
Qry_tmp1->FieldByName("CPF")->AsString=Query1RecordCount%i?Query1RecordCount%i:4;
else
Qry_tmp1->FieldByName("CPF")->AsString=Query1RecordCount%4?Query1RecordCount%4:4;
}
else
Qry_tmp1->FieldByName("CPF")->AsString="0";
}
Qry_tmp1->Post();
Qry_tmp1->Next();
}
}
}
}
Qry_tmp1->Close();

Form1->Table2->Open();
herbert2
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-31 08:44:30 IP:211.72.xxx.xxx 訂閱
不知您使用那種資料庫? Prodox 嗎?
SQL 指令 SELECT COUNT(*) AS RecCnt FROM 〈Table1_Name〉 WHERE ID LIKE 〈ID_Value〉 %'

便可以計數。但您尚要判斷 FieldByName("TYPE") 及修改 FieldByName("CPF") 值,
便不可只做計數的動作。

至於判斷 FieldByName("TYPE") 及修改 FieldByName("CPF") 值是何目的,
則要看您的作業需求了。

補充:注意雙引號及單引號的配對及角括號,會被 KTop 轉換而改變掉,故改用全型。
編輯記錄
herbert2 重新編輯於 2009-03-31 08:50:18, 註解 無‧
herbert2 重新編輯於 2009-03-31 08:53:16, 註解 無‧
GrandRURU
站務副站長


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-31 10:36:50 IP:203.75.xxx.xxx 未訂閱
其實很難從程式段看出這是要作什麼用的……
也不知道你是要哪一段註解…
註解出來後…有跟沒有差不多…哈!
[code cpp]
Form1->Table1->Open();
if(Table1->FindFirst())
{
for(Table1->First();!Table1->Eof;Table1->Next())
{
if(Table1->FieldByName("CPF")->IsNull)
{
Qry_tmp1->Close();
Qry_tmp1->SQL->Clear();
Qry_tmp1->SQL->Add("select * from " Table1->TableName);
Qry_tmp1->SQL->Add("where ID like '" Table1->FieldByName("ID")->AsString "%'"); //以 ID去判斷一樣的
Qry_tmp1->Open();
Query1RecordCount=Qry_tmp1->RecordCount;
Qry_tmp1->First();

for(i=1;i<=Query1RecordCount;i )
{
Qry_tmp1->Edit();
if(Table1->FieldByName("TYPE")->AsString=="AA")
{
Qry_tmp1->FieldByName("CPF")->AsString="1";
}
else // ?U-±3o?q?Y?£?OA’,¥i¥H?D?Y±oA’ao?j?jA°§Uμu﹐N?@?U?U????
{
if(i%4==1)
{
if(Query1RecordCount/4)
if(Query1RecordCount/4*4 1==i)
//if (筆數 - (筆數 / 4 *4)%4
// CPF = (筆數 - (筆數 / 4 *4)%4
//else
// CPF = 4
Qry_tmp1->FieldByName("CPF")->AsString=(Query1RecordCount-Query1RecordCount/4*4)%4?(Query1RecordCount-Query1RecordCount/4*4)%4:4;
else
//if !(筆數 - (筆數 / 4 *4)%4
// CPF = Query1RecordCount%i
//else
// CPF = 4
Qry_tmp1->FieldByName("CPF")->AsString=Query1RecordCount%i?Query1RecordCount%i:4;
else
//以此類推
Qry_tmp1->FieldByName("CPF")->AsString=Query1RecordCount%4?Query1RecordCount%4:4;
}
else
Qry_tmp1->FieldByName("CPF")->AsString="0";
}
Qry_tmp1->Post();
Qry_tmp1->Next();
}
}
}
}
Qry_tmp1->Close();

Form1->Table2->Open();
[/code]
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-31 14:28:13 IP:122.116.xxx.xxx 未訂閱
您好,

我的看法

Form1->Table1->Open();
if (Table1->FindFirst())
{
for (Table1->First();!Table1->Eof;Table1->Next())
{
if (Table1->FieldByName("CPF")->IsNull)
{
Qry_tmp1->Close();
Qry_tmp1->SQL->Clear();
Qry_tmp1->SQL->Add("select * from " Table1->TableName);
Qry_tmp1->SQL->Add("where ID like '" Table1->FieldByName("ID")->AsString "%'"); // 對所有以 id 的值開頭的資料錄
Qry_tmp1->Open();
Query1RecordCount=Qry_tmp1->RecordCount;
Qry_tmp1->First();
for (i=1;i<=Query1RecordCount;i )
{
Qry_tmp1->Edit();
if (Table1->FieldByName("TYPE")->AsString=="AA") // 不需解釋的吧
{
Qry_tmp1->FieldByName("CPF")->AsString="1";
}
else
{
if (i%4==1)
// 每4筆的第1筆
{
if (Query1RecordCount/4)
//每4筆為一組, 大於一組
if (Query1RecordCount/4*4 1==i)
//每4筆為一組, 最後一組的第一筆
Qry_tmp1->FieldByName("CPF")->AsString=(Query1RecordCount-Query1RecordCount/4*4)%4?(Query1RecordCount-Query1RecordCount/4*4)%4:4;
// 最後一組是否滿4筆, 是給4, 不滿4筆給該組筆數 --> 就是最後一組的筆數
else
//每4筆為一組, 不是最後一組的第一筆
Qry_tmp1->FieldByName("CPF")->AsString=Query1RecordCount%i?Query1RecordCount%i:4;
// 總筆數 是否整除以 目前筆數, 若整除給 4, 否則給餘數
else
// 每4筆為一組, 只有一組, 即小於4筆
Qry_tmp1->FieldByName("CPF")->AsString=Query1RecordCount%4?Query1RecordCount%4:4;
// 給該組筆數 --> 就是總筆數
}
else
// 每4筆為一組, 不是每組的第一筆
Qry_tmp1->FieldByName("CPF")->AsString="0";
// 固定給 0
}
Qry_tmp1->Post();
Qry_tmp1->Next();
}
}
}
}
Qry_tmp1->Close();
Form1->Table2->Open();

不知對不對, 也不知有何用途


------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
GrandRURU
站務副站長


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-04-01 09:15:26 IP:203.75.xxx.xxx 未訂閱
st33chen大,請教一下
這行的運算有什麼特別的意義嗎?
除4乘4的結果不就是還原回原本的數值??
為什麼還需要這樣算呢?
===================引 用 st33chen 文 章===================
...43...
if (Query1RecordCount/4*4 1==i)
//每4筆為一組, 最後一組的第一筆
...43...
helsing
一般會員


發表:7
回覆:15
積分:4
註冊:2004-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-04-01 12:45:04 IP:203.126.xxx.xxx 訂閱
st33chen大大,你的註解是對的說,可是我匯入db後排序想要是CPF的值第1筆是4,2和3,4都帶0,就是第一筆的頭都是帶總筆數 ,有啥方法嗎????
例如共有7筆

就是 4 ,0 ,0 ,0
3 ,0,0
還是有更方便的寫法啊??謝謝大大喔
編輯記錄
helsing 重新編輯於 2009-04-01 12:48:45, 註解 無‧
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-04-02 21:53:13 IP:122.116.xxx.xxx 未訂閱
您好,

to GrandRURU 大大,

其實我也覺得奇怪, 只是看程式前後文猜的
他程式中的 / 應該就是 delphi 中的 div operator, 也就是取商值(整數)用的

而 delphi 中 / 則是取 real 的.

sorry, 造成困擾的話.

===================引 用 GrandRURU 文 章===================
st33chen大,請教一下
這行的運算有什麼特別的意義嗎?
除4乘4的結果不就是還原回原本的數值??
為什麼還需要這樣算呢?

=======================================================================

to helsing 大大

您想要
匯入db後排序想要是CPF的值第1筆是4,2和3,4都帶0,就是第一筆的頭都是帶總筆數 ,有啥方法嗎????
例如共有7筆
就是 4 ,0 ,0 ,0
3 ,0,0
還是有更方便的寫法?

那不是只要判斷總共多少組, 只有最後一組給 1 或 2,0 或 3,0,0 或 4,0,0,0; 其餘各組皆是 4,0,0,0 嗎?
我想到的方法, 不知是不是更簡單 ( 這是很主觀的啦 )
1. 由 recordcount 可以算出 組數 假設為 jj. 及 最後一組筆數 假設為 kk;
2. 用一個 loop, 每 loop 一次更新 4 筆 :
for ( ii = 1 ; ii < jj ; ii ) {
更新一筆 給 4;
更新下一筆 給 0;
更新下一筆 給 0;
更新下一筆 給 0;
}
3. 最後一組
更新一筆 給 kk;
for ( ii = 1 ; ii < kk ; ii ) 更新下一筆 給 0;

當然也可以先判斷 kk 是否為 4, 如果是則只要執行 2 就可以, 但要改成
for (ii = 1 ; ii < = jj ; ii ) {
更新一筆 給 4;
更新下一筆 給 0;
更新下一筆 給 0;
更新下一筆 給 0;
}

參考一下.



------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2009-04-02 22:22:08, 註解 無‧
st33chen 重新編輯於 2009-04-02 22:23:17, 註解 無‧
st33chen 重新編輯於 2009-04-02 22:23:44, 註解 無‧
st33chen 重新編輯於 2009-04-02 22:26:29, 註解 無‧
st33chen 重新編輯於 2009-04-02 22:28:24, 註解 無‧
helsing
一般會員


發表:7
回覆:15
積分:4
註冊:2004-07-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-04-06 15:30:42 IP:203.126.xxx.xxx 訂閱
st33chen大大,不太懂你的說法,還是可以給我一個範例嗎??
例如我匯入db之後在算完cpf之後是

CPF ID 想變成 CPF ID
4 001 4 001
4 001 0 001
2 001 0 001
0 001 0 001
0 001 4 001
0 001 0 001
0 001 0 001
0 001 0 001
0 001 2 001
0 001 0 001
1 002 1 002 (ID=002在最之前或後面都可以,只要同樣的是4個id一樣的以有筆數的放在最前,後面帶0的)
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-04-06 17:27:03 IP:118.168.xxx.xxx 未訂閱
      if (Table1->FieldByName("CPF")->IsNull) {
Qry_tmp1->Close();
Qry_tmp1->SQL->Clear();
Qry_tmp1->SQL->Add("select * from " Table1->TableName);
Qry_tmp1->SQL->Add("where ID like '" Table1->FieldByName("ID")->AsString "%'"); // 對所有以 id 的值開頭的資料錄
Qry_tmp1->Open();
Query1RecordCount=Qry_tmp1->RecordCount;
// 1. 由 recordcount 可以算出 組數 假設為 jj. 及 最後一組筆數 假設為 kk;
jj = (int)(Query1RecordCount/4); // 滿4筆的組數
kk = (int)(Query1RecordCount%4); // 餘數
if (kk==0) kk=4; // 如果上述餘數為0, 代表最後一組為4筆, 所以總組數就是滿4筆的組數
else jj ; // 如果上述餘數不為0, 代表最後一組不滿4筆, 所以總組數為滿4筆的組數加1
// 自己分別假設Query1RecordCount為7, 8 代進去筆算一下就知道.
Qry_tmp1->First();
// 2. 用一個 loop, 每 loop 一次更新 4 筆, 第1筆給4, 其餘給 0 : (第1組到第jj-1組)
for ( ii = 1 ; ii < jj ; ii ) {
Qry_tmp1->FieldByName("CPF")->AsInteger=4; qry_temp1->post(); qry_temp1->next();
for ( mm = 1 ; mm < 4 ; mm ) {
Qry_tmp1->FieldByName("CPF")->AsInteger=0; qry_temp1->post(); qry_temp1->next();
}
}
// 3. 最後一組 更新一筆 給 kk, 其餘給 0
Qry_tmp1->FieldByName("CPF")->AsInteger=kk; qry_temp1->post(); qry_temp1->next();
for ( mm = 1 ; mm < kk ; mm ) {
Qry_tmp1->FieldByName("CPF")->AsInteger=0; qry_temp1->post(); qry_temp1->next();
}
Qry_tmp1->Close();
}

參考一下, 沒實測哦, 許久未寫 c , 不知語法是否對.
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2009-04-09 18:14:41, 註解 無‧
helsing
一般會員


發表:7
回覆:15
積分:4
註冊:2004-07-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-04-08 12:39:17 IP:203.126.xxx.xxx 訂閱
大大的方法可以說,感謝,那我想在請問一個問題喔,就是如果有name的欄位,想要cpf 4 的 name 也一樣傳遞到 0的name欄位,該怎模一起寫進去啊?
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-04-09 09:23:35 IP:122.116.xxx.xxx 未訂閱
1. 先把每組第一筆的 name 存到一個變數(假設為 nstr)
2. 以下各筆給 0 時順便 name 欄位的值給 nstr

for ( ii = 1 ; ii < jj ; ii ) {
Qry_tmp1->FieldByName("CPF")->AsInteger=4; qry_temp1->post(); qry_temp1->next();
nstr = Qry_tmp1->FieldByName("name")->AsString; // 1.
for ( mm = 1 ; mm < 4 ; mm ) {
Qry_tmp1->FieldByName("name")->AsString = nstr; // 2.
Qry_tmp1->FieldByName("CPF")->AsInteger=0; qry_temp1->post(); qry_temp1->next();
}
}


===================引 用 helsing 文 章===================
大大的方法可以說,感謝,那我想在請問一個問題喔,就是如果有name的欄位,想要cpf 4 的 name 也一樣傳遞到 0的name欄位,該怎模一起寫進去啊?
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
helsing
一般會員


發表:7
回覆:15
積分:4
註冊:2004-07-06

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-04-09 16:25:54 IP:218.210.xxx.xxx 訂閱
 // 1. 由 recordcount 可以算出 組數 假設為 jj. 及 最後一組筆數 假設為 kk;
jj = (int)(Query1RecordCount/4); 這邊是說 每4筆為 1組 共幾組
kk = (int)(Query1RecordCount%4); 不到4組的餘數
if (kk==0) kk=4; // 這邊有點不懂
else jj ;
Qry_tmp1->First();
// 2. 用一個 loop, 每 loop 一次更新 4 筆, 第1筆給4, 其餘給 0 : (第1組到第jj-1組)
for ( ii = 1 ; ii < jj ; ii ) {
Qry_tmp1->FieldByName("CPF")->AsInteger=4; qry_temp1->post(); qry_temp1->next();
for ( mm = 1 ; mm < 4 ; mm ) {
Qry_tmp1->FieldByName("CPF")->AsInteger=0; qry_temp1->post(); qry_temp1->next();
}
}
// 3. 最後一組 更新一筆 給 kk, 其餘給 0
Qry_tmp1->FieldByName("CPF")->AsInteger=kk; qry_temp1->post(); qry_temp1->next();
for ( mm = 1 ; mm < kk ; mm ) {
Qry_tmp1->FieldByName("CPF")->AsInteger=0; qry_temp1->post(); qry_temp1->next();
}
Qry_tmp1->Close();
}
感謝大大喔,可是我是初學者有點不太懂,可以在幫我注解詳細一點嗎??
感謝喔,所以大大你的這個寫法和我上面的寫法是一樣的嗎
編輯記錄
helsing 重新編輯於 2009-04-09 16:38:07, 註解 無‧
系統時間:2024-11-21 20:05:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!