如何讓二個欄位間做相關選項 |
答題得分者是:ddy
|
Selena
一般會員 ![]() ![]() 發表:16 回覆:28 積分:8 註冊:2002-11-06 發送簡訊給我 |
如何讓二個欄位間做相關選項,有二個欄位,一個是員工編號,一個是職位名稱
編號設計為
tnos:代表主管級
tnoa:代表會計
tnop:代表工讀生
用下拉選單可決定為那一個,再找出它的序號,如,Tnop0015,表選擇為工讀,編號呈上茟(0014),由程式中自動判定
而現在的問題是,到了職位欄很麻煩,如何設定,當使用者在員工編號選了主管或會計時,就能自動將主管或會計的字樣填入,而選到了工讀生時,在職位名稱又會出現下拉選單,可以選擇班別呢?如早班,晚班,(因為工讀生的代碼都一樣,不分早中晚所以序號會連著上一號,但班別可選不同) 月光小築~月牙兒
------
月光小築~月牙兒 |
ddy
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
這是不是妳要的???
procedure TForm1.FormCreate(Sender: TObject); begin //假設Combobox1由資料庫取得得資料如下 ComboBox1.Items.Add ('Tnos0001'); //主管 ComboBox1.Items.Add ('Tnoa0002'); //會計 ComboBox1.Items.Add ('Tnop0001'); //工讀生0001 ComboBox1.Items.Add ('Tnop0003'); //工讀生0003 ComboBox1.Items.Add ('Tnop0005'); //工讀生0005 end; procedure TForm1.ComboBox1Change(Sender: TObject); var i:Integer; begin ComboBox2.Clear ; if Pos('Tnos',ComboBox1.Text)>0 then begin ComboBox2.Text :='主管'; end else if Pos('Tnoa',ComboBox1.Text)>0 then begin ComboBox2.Text :='會計'; end else if Pos('Tnop',ComboBox1.Text)>0 then begin //由資料庫取得班別資料後,逐筆加入ComboBox2 while not ADOTable1.Recordset.EOF do begin ComboBox2.Items.Add (ADOTable1.Recordset.Fields.Item[0].Value); ADOTable1.Recordset.MoveNext ; end; ComboBox2.ItemIndex :=0; end; end;--【KTop SNG新聞現場】--記者:ddy----------------------------------------- 請各位市民做好資源回收與垃圾分類,讓不良標題與不當發言在KTop 市消失 ------------------------------------------------------------------------- 發表人 - ddy 於 2002/12/06 01:26:30 |
Selena
一般會員 ![]() ![]() 發表:16 回覆:28 積分:8 註冊:2002-11-06 發送簡訊給我 |
不太像耶~
case DBGrid1.Columns[0].PickList.IndexOf( DataSet.FieldByName('員工編號').AsString) of
0: CodePrefix := 'Tnos';
1: CodePrefix := 'Tnoa';
2: begin
CodePrefix := 'Tnop';
DBGrid1.Columns[6].PickList.Clear;
DBGrid1.Columns[6].PickList.Add( '早班工讀生');
DBGrid1.Columns[6].PickList.Add( '午班工讀生');
DBGrid1.Columns[6].PickList.Add( '晚班工讀生');
DBGrid1.Columns[6].PickList.Add( '洗車員');
end;
end;
想法是這樣,以為這樣寫可以OK,但似乎沒法子正確執行耶~ 月光小築~月牙兒
------
月光小築~月牙兒 |
T.J.B
版主 ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
|
Selena
一般會員 ![]() ![]() 發表:16 回覆:28 積分:8 註冊:2002-11-06 發送簡訊給我 |
我的欄位是在DBGrid中的欄位,下拉選單是在DBGrid1的屬性PickList中
當我選擇員工編號時,它可以自由選擇為那一類的人員,以給定編號的前四碼
應為何(上述有說明)如:選到工讀生,那麼它的前四碼則為Tnop,,後四碼我則以程式控制,計算,到目前為至,這類員工的流水編號到第幾號,如:到目前為至Tnop已經編到0010那麼這筆新增的就應為0011,也就是說這個員工編號的欄位會被正確的寫入Tnop0011,
而現在的問題在於
在職位這個欄位和員工編號是有相關性的,當使用者在員工編號選擇了這個人的的身份欲做其編號時,職位就應做適當的對應,而不能在員工編號時明明選了會計,到了職位欄時,還有一個選項叫工讀的,這是不對的,
那麼
本來會很容易,只要在員工編號處選到某個類別時,就同時在職位欄填上對應的的文字,就可以了,可是因為工讀的這個還可以細分為早班,晚班等..
所以希望當使用者,若是在員工編號中選到了,工讀這一項時,在職位的欄位中,就可以出現提供再選擇是那一個班別的人員.
員工編號 職位
Tnop0001 早班工讀生
Tnop0002 中班工讀生
Tnop0003 晚班工讀生
Tnop0004 早班工讀生
Tnop0005 晚班工讀生
Tnos0001 會計
Tnoa0001 站長 員工編號
站長 ==>1.新增時會出現下拉選單
會計
工讀生==>2.萬一選到工讀生 職位
早班工讀生==>3.對應員工編號選到工讀生時會出現的選單
晚班工讀生
中班工讀生 月光小築~月牙兒 發表人 - Selena 於 2002/12/06 12:46:11
------
月光小築~月牙兒 |
ko
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
Selena你好:
我用個笨方法來做希望你不要笑喔!!!
if ComboBox1.Text='工讀生' then
begin
ComboBox.clear;//這個一定要加喔不然.......嘿嘿 ComboBox2.Items.Add('早');
ComboBox2.Items.Add('中');
ComboBox2.Items.Add('晚');
end;
假設班別都是固定的... 發表人 - ko 於 2002/12/06 12:27:46
------
====================== 昏睡~ 不昏睡~ 不由昏睡~ |
Selena
一般會員 ![]() ![]() 發表:16 回覆:28 積分:8 註冊:2002-11-06 發送簡訊給我 |
|
ddy
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
Selena 妳好
一、相信T.J.B 版主與Ko 和我一樣,是以Combobox 來模擬妳的作業邏輯,事實上一開始也沒有說清楚,誤解是必然的。
二、
引言: 而現在的問題在於 在職位這個欄位和員工編號是有相關性的,當使用者在員工編號選擇了這個人的的身份欲做其編號時,職位就應做適當的對應,而不能在員工編號時明明選了會計,到了職位欄時,還有一個選項叫工讀的,這是不對的, 那麼 本來會很容易,只要在員工編號處選到某個類別時,就同時在職位欄填上對應的的文字,就可以了,可是因為工讀的這個還可以細分為早班,晚班等.. 所以希望當使用者,若是在員工編號中選到了,工讀這一項時,在職位的欄位中,就可以出現提供再選擇是那一個班別的人員.如果參考我po的那段,邏輯仍不是妳要的,妳把程式po上來吧,幫妳看看 --【KTop SNG新聞現場】--記者:ddy----------------------------------------- 請各位市民做好資源回收與垃圾分類,讓不良標題與不當發言在KTop 市消失 ------------------------------------------------------------------------- |
Selena
一般會員 ![]() ![]() 發表:16 回覆:28 積分:8 註冊:2002-11-06 發送簡訊給我 |
case DBGrid1.Columns[0].PickList.IndexOf( DataSet.FieldByName('員工編號').AsString) of
0:
begin
CodePrefix := 'Tnos';
DBGrid1.Columns[6].ReadOnly:=true;
ADODataSet1.FieldByName('職稱').AsString:='站長';
end;
1:
begin
CodePrefix := 'Tnoa';
ADODataSet1.FieldByName('職稱').AsString:='會計';
end;
2:
begin
CodePrefix := 'Tnop';
DBGrid1.Columns[6].PickList.Clear;
DBGrid1.Columns[6].PickList.Add('早班工讀生');
DBGrid1.Columns[6].PickList.Add('中班工讀生');
DBGrid1.Columns[6].PickList.Add('晚班工讀生');
DBGrid1.Columns[6].PickList.Add('洗車員');
end;
邏輯上似乎是沒錯啦!但是似乎還是不太可行耶,它並不會出現下拉選單,不過選到站長或是會計時,等到一post上去時,就會正確地自動寫入,但有個小問題,還在編輯時,無法鎖住那一欄,不讓使用者可以再輸入其的的資料(紅色那一段不會執行)
PS.程式內容寫在BeforePost中 月光小築~月牙兒 發表人 - Selena 於 2002/12/06 14:29:48
------
月光小築~月牙兒 |
T.J.B
版主 ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
引言: 不太像耶~ case DBGrid1.Columns[0].PickList.IndexOf( DataSet.FieldByName('員工編號').AsString) of 0: CodePrefix := 'Tnos'; 1: CodePrefix := 'Tnoa'; 2: begin CodePrefix := 'Tnop'; DBGrid1.Columns[6].PickList.Clear; DBGrid1.Columns[6].PickList.Add( '早班工讀生'); DBGrid1.Columns[6].PickList.Add( '午班工讀生'); DBGrid1.Columns[6].PickList.Add( '晚班工讀生'); DBGrid1.Columns[6].PickList.Add( '洗車員'); end; end; 想法是這樣,以為這樣寫可以OK,但似乎沒法子正確執行耶~ 月光小築~月牙兒我了解妳的問題了 case DBGrid1.Columns[0].PickList.IndexOf( 改成妳table或query的名字不要用 dataset .FieldByName('員工編號').AsString) of 0: CodePrefix := 'Tnos'; 1: CodePrefix := 'Tnoa'; 2: begin CodePrefix := 'Tnop'; DBGrid1.Columns[6].PickList.Create; DBGrid1.Columns[6].PickList.Append('早班工讀生'); DBGrid1.Columns[6].PickList.Append('午班工讀生'); DBGrid1.Columns[6].PickList.Append('晚班工讀生'); DBGrid1.Columns[6].PickList.Append('洗車員'); end; end;這樣就可以了 ps:1:可以寫在DBGrid1ColEnter事件 2:記得要把DBGrid1.Columns[6]的buttonStyle屬性設為cbsAuto 天行健 君子當自強不息~~@.@ 發表人 - T.J.B 於 2002/12/06 15:23:07 發表人 - T.J.B 於 2002/12/06 15:26:32 發表人 - T.J.B 於 2002/12/06 15:30:02
------
天行健 君子當自強不息~~@.@ |
ddy
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
引言: case DBGrid1.Columns[0].PickList.IndexOf( DataSet.FieldByName('員工編號').AsString) of 0: begin CodePrefix := 'Tnos'; DBGrid1.Columns[6].ReadOnly:=true; ADODataSet1.FieldByName('職稱').AsString:='站長'; end; 1: begin CodePrefix := 'Tnoa'; ADODataSet1.FieldByName('職稱').AsString:='會計'; end; 2: begin CodePrefix := 'Tnop'; DBGrid1.Columns[6].PickList.Clear; DBGrid1.Columns[6].PickList.Add('早班工讀生'); DBGrid1.Columns[6].PickList.Add('中班工讀生'); DBGrid1.Columns[6].PickList.Add('晚班工讀生'); DBGrid1.Columns[6].PickList.Add('洗車員'); end; 邏輯上似乎是沒錯啦!但是似乎還是不太可行耶,它並不會出現下拉選單,不過選到站長或是會計時,等到一post上去時,就會正確地自動寫入,但有個小問題,還在編輯時,無法鎖住那一欄,不讓使用者可以再輸入其的的資料(紅色那一段不會執行) PS.程式內容寫在BeforePost中原因找到了, CodePrefix := 'Tnop'; DBGrid1.Columns[6].ReadOnly :=False ; DBGrid1.Columns[6].PickList.Clear; DBGrid1.Columns[6].PickList.Add('早班工讀生'); DBGrid1.Columns[6].PickList.Add('中班工讀生'); DBGrid1.Columns[6].PickList.Add('晚班工讀生'); DBGrid1.Columns[6].PickList.Add('洗車員'); 妳這樣子設就行了(紅色部份) --【KTop SNG新聞現場】--記者:ddy----------------------------------------- 請各位市民做好資源回收與垃圾分類,讓不良標題與不當發言在KTop 市消失 ------------------------------------------------------------------------- |
ddy
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
引言: CodePrefix := 'Tnos'; DBGrid1.Columns[6].ReadOnly:=true; ADODataSet1.FieldByName('職稱').AsString:='站長'; 但有個小問題,還在編輯時,無法鎖住那一欄,不讓使用者可以再輸入其的的資料(紅色那一段不會執行)改成這樣子 CodePrefix := 'Tnos'; ADODataSet1.FieldByName('EmpName').AsString := '站長'; DBGrid1.Columns[1].ReadOnly := true; //先寫入後,設成唯讀--【KTop SNG新聞現場】--記者:ddy----------------------------------------- 請各位市民做好資源回收與垃圾分類,讓不良標題與不當發言在KTop 市消失 ------------------------------------------------------------------------- |
Selena
一般會員 ![]() ![]() 發表:16 回覆:28 積分:8 註冊:2002-11-06 發送簡訊給我 |
case DBGrid1.Columns[0].PickList.IndexOf( 改成妳table或query的名字不要用 dataset .FieldByName('員工編號').AsString) of
ADOQuery1.].FieldByName('員工編號').AsString這樣嗎?
好像不行耶,會有錯 還有,ddy大大,您說的法子,改過了似乎沒有影響說 後來又發現另一個問題,就是修改時,如只改個電話,還是說改別的欄位,
在編號的地方,英文字會不見,我直接接程式放到上傳區,請幫我再看看好嗎?
謝謝~~ 月光小築~月牙兒
------
月光小築~月牙兒 |
T.J.B
版主 ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
引言: case DBGrid1.Columns[0].PickList.IndexOf( 改成妳table或query的名字不要用 dataset .FieldByName('員工編號').AsString) of ADOQuery1.].FieldByName('員工編號').AsString這樣嗎? 好像不行耶,會有錯 還有,ddy大大,您說的法子,改過了似乎沒有影響說 後來又發現另一個問題,就是修改時,如只改個電話,還是說改別的欄位, 在編號的地方,英文字會不見,我直接接程式放到上傳區,請幫我再看看好嗎? 謝謝~~ 月光小築~月牙兒BDE的元件沒問題 ADO我不知道可不可以用FieldByName('員工編號').AsString ADOQuery1.].FieldByName('員工編號').AsString這樣嗎? 妳是打錯了嗎 應該是 ADOQuery1.FieldByName('員工編號').AsString 天行健 君子當自強不息~~@.@ 發表人 - T.J.B 於 2002/12/06 18:44:06
------
天行健 君子當自強不息~~@.@ |
Selena
一般會員 ![]() ![]() 發表:16 回覆:28 積分:8 註冊:2002-11-06 發送簡訊給我 |
|
ddy
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
CodePrefix := 'Tnop'; DBGrid1.Columns[6].ReadOnly :=False ; ... .. .. ... . .. .... CodePrefix := 'Tnos'; ADODataSet1.FieldByName('EmpName').AsString := '站長'; DBGrid1.Columns[1].ReadOnly := true;上面二段我試過都能解決合妳原先的問題,第一段能出現Tnop的班別下拉內容 第二段,能防止BeforePost 之後被更改,必須移動col / row 讓此事件觸發後 再去檢核此功能是否正確。妳先試試看。 我抓妳的程式來看,看看是不是有忽略的地方 --【KTop SNG新聞現場】--記者:ddy----------------------------------------- 請各位市民做好資源回收與垃圾分類,讓不良標題與不當發言在KTop 市消失 ------------------------------------------------------------------------- |
ddy
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
改成下列即可
procedure TForm1.DBGrid1ColEnter(Sender: TObject); var CodePrefix, Code, temp: String; begin case DBGrid1.Columns[0].PickList.IndexOf( ADODataSet1.fieldByName('員工編號').AsString) of 0: begin CodePrefix := 'Tnos'; ADODataSet1.FieldByName('職稱').AsString:='站長'; end; 1: begin CodePrefix := 'Tnoa'; ADODataSet1.FieldByName('職稱').AsString:='會計'; end; 2: begin CodePrefix := 'Tnop'; ADODataSet1.FieldByName('職稱').AsString:=''; DBGrid1.Columns[6].PickList.Create; DBGrid1.Columns[6].PickList.Clear ; DBGrid1.Columns[6].PickList.Append('早班工讀生'); DBGrid1.Columns[6].PickList.Append('中班工讀生'); DBGrid1.Columns[6].PickList.Append('晚班工讀生'); DBGrid1.Columns[6].PickList.Append('洗車員'); end; end; end; procedure TForm1.ADODataSet1BeforePost(DataSet: TDataSet); var CodePrefix, Code, temp: String; begin ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add( 'SELECT MAX(員工編號) AS MAXCODE FROM 員工基本資料表 WHERE 員工編號 LIKE ''' CodePrefix '%'''); ADOQuery1.Open; temp := IntToStr(StrToInt( Copy( ADOQuery1.FieldByName( 'MAXCODE').AsString, 5, 4)) 1); temp := CodePrefix Copy('0000', 1, 4 - Length(temp)) temp; if not ADOQuery1.Eof then begin DataSet.FieldByName( '員工編號').AsString :=temp; DataSet.FieldByName('到職日').AsDateTime:=Date; end else Code := CodePrefix '0001'; ADOQuery1.Close; ADOQuery2.SQL.Text:='insert into Login(員工編號,密碼) values(''' temp ''',1111)';//新增資料同時,為此員工建密碼,預設為1111 ADOQuery2.ExecSQL; DBGrid1.Columns[0].ReadOnly:=true; DBGrid1.Columns[6].ReadOnly:=true; end;--【KTop SNG新聞現場】--記者:ddy----------------------------------------- 請各位市民做好資源回收與垃圾分類,讓不良標題與不當發言在KTop 市消失 ------------------------------------------------------------------------- 發表人 - ddy 於 2002/12/07 00:56:18 |
ddy
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
Selena
順便一提,關於設計的觀念妳參考看看 員工基本資料檔,應是以員工代碼為主要的Key
職務與員工代碼分開處理
而職務tnos/tnoa/tnop 可以另以table 存放,例 職務主檔
職務代碼 職務簡碼 職務說明
--------------------------
101 tnos 主管
102 tnoa 會計
103 tnop 工讀生 而員工主檔,則為
員工代號 員工姓名 職務 ……
1001 jason 101
1002 ddy 103
1003 ted 102 所以tnos0001 /tnos0002 / tnoa0002 ... 之類的編碼,依此序號,較無意義 也許語法上的問題解決了,但真正的問題在於系統的邏輯與架構… --【KTop SNG新聞現場】--記者:ddy----------------------------------------- 請各位市民做好資源回收與垃圾分類,讓不良標題與不當發言在KTop 市消失 -------------------------------------------------------------------------
|
Selena
一般會員 ![]() ![]() 發表:16 回覆:28 積分:8 註冊:2002-11-06 發送簡訊給我 |
|
領航天使
站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
引言: ddy大,多謝你了~ 我知道你一直在告訴我邏輯的關念很重要,我也不知怎麼說,是不是女生的邏輯概念本來就差一點,還是我在規避問題,為自己找台階下,是我自己本身在邏輯的概念上沒下功夫的關係嗎?可是邏輯這種東西不是多少都要有點天份嗎?我也不知如何增強邏輯的能力~~也許以後多寫了,經驗多了,是不是會有進步一點啊! 您說我法子,我會再試試,要再沒法子,我只能先擱下,有空再回來想了,(雖然有點看不懂~~)
------
~~~Delphi K.Top討論區站長~~~ |
Selena
一般會員 ![]() ![]() 發表:16 回覆:28 積分:8 註冊:2002-11-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |