以ID算筆數問題 |
答題得分者是:st33chen
|
helsing
一般會員 發表:7 回覆:15 積分:4 註冊:2004-07-06 發送簡訊給我 |
各位大大最近,在改一個程式的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 發送簡訊給我 |
不知您使用那種資料庫? Prodox 嗎?
SQL 指令 ”SELECT COUNT(*) AS RecCnt FROM 〈Table1_Name〉 WHERE ID LIKE ’” ”〈ID_Value〉” ”%'” 便可以計數。但您尚要判斷 FieldByName("TYPE") 及修改 FieldByName("CPF") 值, 便不可只做計數的動作。 至於判斷 FieldByName("TYPE") 及修改 FieldByName("CPF") 值是何目的, 則要看您的作業需求了。 補充:注意雙引號及單引號的配對及角括號,會被 KTop 轉換而改變掉,故改用全型。 |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
其實很難從程式段看出這是要作什麼用的……
也不知道你是要哪一段註解… 註解出來後…有跟沒有差不多…哈! [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 發送簡訊給我 |
您好,
我的看法 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 發送簡訊給我 |
|
helsing
一般會員 發表:7 回覆:15 積分:4 註冊:2004-07-06 發送簡訊給我 |
|
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
您好,
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 (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
helsing
一般會員 發表:7 回覆:15 積分:4 註冊:2004-07-06 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
|
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
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 發送簡訊給我 |
// 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, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |