欄位包含可複選的資料時,欄位該如何設計 |
尚未結案
|
bugy
一般會員 發表:4 回覆:8 積分:2 註冊:2003-01-15 發送簡訊給我 |
請問各位,在設計 Schema 時,如果有一個欄位包含了可複選的資料時,這個欄位該如何設計呢? 舉個例子好了,比如說有一個欄位是設定用來儲存使用者常用的程式語言,
可選的項目如下(可複選):
1.Delphi
2.Java
3.Basic
4.PHP
5.C
6.C
7.C#
8.其他 在單選的情況下可以用 LookupField 來做,
想請問的是,在複選時,
1.這個欄位的 Schema 要怎麼設計呢?
2.有什麼 DBControls 適合編輯這種型式的欄位呢? 發表人 - bugy 於 2005/07/02 21:56:53
|
jeff377
初階會員 發表:9 回覆:60 積分:33 註冊:2004-08-10 發送簡訊給我 |
方法一: 依選項數目,開多個Boolean欄位來記錄。當然若是這樣,就可以用一般的DBCheckBox控件即可。 方法二: 用一Integer欄位來記錄所有複選的資料,將所有的選項編碼依序為2的n次方,如1,2,4,8,16,32,64,128....依序,如下範例: 1.Delphi (1)
2.Java (2)
3.Basic (4)
4.PHP (8)
5.C (16)
6.C (32)
7.C# (64)
8.其他 (128) 若複選的項目為1,2,4則儲存值為1 2 8=11,若要判別儲存值是否包含某個項目,則用and運算,如(11 and 8)=8,即表示包含了項目4。如果是以這種方式儲存,則Control的值則需自行處理。
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
bugy:可以考慮以二進位處理, 1.Delphi (選:1) 2.Java (選:1) 3.Basic (不選:0) 4.PHP (不選:0) 5.C (選:1) 6.C (不選:0) 7.C# (不選:0) 8.其他 (選:1) 文字型二進位表示為11001001假設存入Edit2->Text 很抱歉我以BCB表示 int l=Edit2->Text.Length(); int temp=0,x,r=0; for (int i=l;i>0;i--) { x=StrToIntDef(Edit2->Text[i],0); temp=temp (x*Power(2, r)); // Power要USE Math r ; } temp; // 十進位為201 反解只要十進位轉二進位即可 int n,a[100]; for (n=0 ; temp>0 ; n ) // temp是剛剛的201 { a[n] = temp % 2 ; temp = temp / 2 ; } Edit2->Text =""; for (int i=n-1 ; i>=0 ; i--) Edit2->Text = Edit2->Text a[i] ; 只要一個整數型欄位就可以存放此類資料! 請參考!Andy Chang
------
Andy Chang |
bugy
一般會員 發表:4 回覆:8 積分:2 註冊:2003-01-15 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
引言: 首先感謝 jeff377, Andy Chang 的回答。 使用2進位表示來儲存每個選項的做法我也曾經考慮過,不過這種方法只適用在選項的數目少的時候,是嗎? 如果我有很多的選項,或是選項會經常修改情況下, 使用 integer 似乎不夠,那還有什麼其他方法呢?是的!約30個選項,但寫程式就是去挑戰這些!如果考慮以文字存在再進行分 解或以整數分批存入,或我在DOS時代以Char(254)中只01000010001方式存檔 也可以存放254個判斷。 請參考! Andy Chang
------
Andy Chang |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |