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

如何在Edit.Text上加入條件篩選

答題得分者是:老大仔
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-23 11:12:10 IP:122.116.xxx.xxx 訂閱
小弟在寫程式中的Edit上讓使用者可以填寫資料
如何在使用者每填寫一筆資料就SELECT 該資料是否存在TABLE
有的話就存入Edit.Text 沒有的話就出現警告訊息

這樣做是避免使用者亂填序號

MEMO
序號
1 [ENTER] (SELECT 1 FROM TABLE 檢查1 是否存在TABLE 若存在就填入Edit.Text 不存在就不填入並且出現警告)
2 [ENTER] (SELECT 2 FROM TABLE 檢查2 是否存在TABLE 若存在就填入Edit.Text 不存在就不填入並且出現警告)
等等以此類推

以下是我的CODE 不知道為什麼總是顯示"該序號尚未在QC'"

[code delphi]
if Key = #13 then begin
with csTempCheck do
begin
CommandText := 'SELECT A.CUSTOMER_SN "CSN"'
'FROM SAJET.G_SN_STATUS A, '
'SAJET.G_WO_BASE B '
'WHERE A.WORK_ORDER = B.WORK_ORDER '
'AND B.WO_STATUS = ''3'' '
'AND A.WIP_PROCESS = ''100032'' '
'AND A.PROCESS_ID = ''100028'' ';
csTempCheck.Open;
If Edit1.Text <> csTempCheck.Fieldbyname('CSN').AsString
Then showmessage('該序號尚未在QC')
ELSE
ShowMessage('OK')
END;
END;
{ELSE
Memo1.Lines.Add(Edit1.Text);
Edit1.Clear end
else begin Exit end; }
[/code]
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2009-04-23 11:16:32, 註解 無‧
lovemari 重新編輯於 2009-04-23 13:23:34, 註解 問題二我已解決了‧
lovemari 重新編輯於 2009-04-23 14:54:13, 註解 無‧
lovemari 重新編輯於 2009-04-23 15:50:34, 註解 無‧
max5020
資深會員


發表:29
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-23 18:29:55 IP:59.120.xxx.xxx 訂閱
我覺得是您的SQL.CommandText內容有問題??
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-04-23 22:26:04 IP:220.140.xxx.xxx 未訂閱
因為你查詢出來的CSN值並不等於Edit1的值啊
所以才會一直顯示 ' 該序號尚未存在' 啊...
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-04-24 08:45:20 IP:122.116.xxx.xxx 訂閱
但是我有先在資料庫查過

我在Edit1輸入的確實是存在的

不該不等於 CSN的

我的疑問在於 我在Edit輸入的CSN 確確實實是存在該TALBE的

可是卻一直出現警告 不知道那裡有問題

PS.我的CSN是一連串數字
我在Edit 輸入的是其中之一



===================引 用 老大仔 文 章===================
因為你查詢出來的CSN值並不等於Edit1的值啊
所以才會一直顯示 ' 該序號尚未存在' 啊...
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
max5020
資深會員


發表:29
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-04-24 09:03:44 IP:59.120.xxx.xxx 訂閱
  這行改成

If POS( Edit1.Text ,csTempCheck.Fieldbyname('CSN').AsString )=0
編輯記錄
max5020 重新編輯於 2009-04-24 09:04:20, 註解 無‧
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-04-24 09:25:12 IP:59.114.xxx.xxx 未訂閱
PS.我的CSN是一連串數字
我在Edit 輸入的是其中之一

你這個意思是:
CSN : 123456
Edit :123
是這個嗎?

或許樓上的大大的方法可以先試看看

and~你也可以先把CSN查詢出來的資料
先放在某個edit或memo來看看
看是不是查詢的資料是否一樣
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-04-24 10:31:19 IP:122.116.xxx.xxx 訂閱
我的CSN 一連串是指說

排序 CSN
1 123
2 456
3 789
4 012
5 345
6 678

那我在Edit1 輸入其中的012 or 789 等其中之一
我怕是不是我程式那裏寫錯 沒有跑Next
結果再做篩選的時候 程式一值在判斷第一筆CSN 123
請問大大我有這方面的錯誤嗎???


===================引 用 老大仔 文 章===================
PS.我的CSN是一連串數字
我在Edit 輸入的是其中之一

你這個意思是:
CSN : 123456
Edit :123
是這個嗎?

或許樓上的大大的方法可以先試看看

and~你也可以先把CSN查詢出來的資料
先放在某個edit或memo來看看
看是不是查詢的資料是否一樣
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
max5020
資深會員


發表:29
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-04-24 11:07:46 IP:59.120.xxx.xxx 訂閱
改成 


[code delphi]
CommandText := 'SELECT A.CUSTOMER_SN'
' FROM SAJET.G_SN_STATUS A, '
' SAJET.G_WO_BASE B '
' WHERE A.WORK_ORDER = B.WORK_ORDER '
' AND B.WO_STATUS = ''3'' '
' AND A.WIP_PROCESS = ''100032'' '
' AND A.PROCESS_ID = ''100028'' '
' AND A.CUSTOMER_SN=' QuotedStr(Edit1.Text);
csTempCheck.Open;
If csTempCheck.isEmpty

[/code]
編輯記錄
max5020 重新編輯於 2009-04-24 11:08:47, 註解 無‧
max5020 重新編輯於 2009-04-24 11:10:06, 註解 無‧
max5020 重新編輯於 2009-04-24 11:11:26, 註解 無‧
max5020 重新編輯於 2009-04-24 11:11:58, 註解 無‧
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-04-24 13:34:57 IP:122.116.xxx.xxx 訂閱
to max 大

小弟改成下列狀態

他還是只會跑 then begin showmessage('該序號尚未在QC') 這段而已



[code delphi]
with csTempCheck do
begin
CommandText := 'SELECT A.CUSTOMER_SN "CSN"'
'FROM SAJET.G_SN_STATUS A, '
'SAJET.G_WO_BASE B '
'WHERE A.WORK_ORDER = B.WORK_ORDER '
'AND B.WO_STATUS = ''3'' '
'AND A.WIP_PROCESS = ''100032'' '
'AND A.PROCESS_ID = ''100028'' '
'AND A.CUSTOMER_SN = ' QuotedStr(Edit1.Text) ' ';
csTempCheck.Open;

while not
csTempCheck.eof do begin
with StringGrid1 do
begin
Params.Clear;
Cells[1, RowCount - 1] := Fieldbyname('CSN').AsString;
RowCount := RowCount 1;
end;
NEXT;
end;


if csTempCheck.isEmpty
//if Edit1.Text <> csTempCheck.Fieldbyname('CSN').AsString
then begin showmessage('該序號尚未在QC')
end
else begin
ShowMessage('OK')
end;
end;
[/code]
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-04-24 13:37:06 IP:122.116.xxx.xxx 訂閱
也試了這段
結果都是只跑 then begin showmessage('該序號尚未在QC')


[code delphi]
If POS( Edit1.Text ,csTempCheck.Fieldbyname('CSN').AsString )=0
//if csTempCheck.isEmpty
//if Edit1.Text <> csTempCheck.Fieldbyname('CSN').AsString
then begin showmessage('該序號尚未在QC')
end
else begin
ShowMessage('OK')
end;
end;
[/code]
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
christie
資深會員


發表:30
回覆:299
積分:475
註冊:2005-03-25

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-04-24 13:42:17 IP:59.125.xxx.xxx 未訂閱
  1. while not csTempCheck.eof do
  2. begin
  3. with StringGrid1 do
  4. begin
  5. Params.Clear;
  6. Cells[1, RowCount - 1] := Fieldbyname('CSN').AsString;
  7. RowCount := RowCount 1;
  8. end;
  9. NEXT;
  10. end;
  11. csTempCheck.First;
  12. if csTempCheck.isEmpty then
  13. begin
  14. Showmessage('該序號尚未在QC')
  15. end
  16. else
  17. begin
  18. ShowMessage('OK')
  19. end;
------
What do we live for if not to make life less difficult for each other?
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-04-24 14:40:31 IP:122.116.xxx.xxx 訂閱
大大妳們好

小弟按照上文所敘修改

已經ok了

可有一各很怪的現象

如果我第一次輸入CSN是正確的 會顯示 OK
可第二筆我故意輸入錯誤 結果還是OK

如果我第一次輸入CSN是錯誤的 會顯示 序號不在QC
可第二筆我輸入正確的 結果還是顯示 序號不在QC

變成第一比好像會影響到後期

以下是我完整程式碼


[code delphi]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
i, j: Integer;
begin
if Key = #13 then begin
with StringGrid1 do
begin
Cells[1, 0] := 'CSN';
end;
with csTempCheck do
begin
CommandText := 'SELECT A.CUSTOMER_SN "CSN"'
'FROM SAJET.G_SN_STATUS A, '
'SAJET.G_WO_BASE B '
'WHERE A.WORK_ORDER = B.WORK_ORDER '
'AND B.WO_STATUS = ''3'' '
'AND A.WIP_PROCESS = ''100032'' '
'AND A.PROCESS_ID = ''100028'' '
'AND A.CUSTOMER_SN = ' QuotedStr(Edit1.Text) ' ';
csTempCheck.Open;

while not
csTempCheck.eof do begin
with StringGrid1 do
begin
Params.Clear;
Cells[1, RowCount - 1] := Fieldbyname('CSN').AsString;
RowCount := RowCount 1;
end;
NEXT;
end;
csTempCheck.First;
if csTempCheck.isEmpty then
//if Edit1.Text <> csTempCheck.Fieldbyname('CSN').AsString
begin showmessage('該序號尚未在QC')
end
else begin
ShowMessage('OK');
Edit1.Clear;
end;
end;
{ELSE
Memo1.Lines.Add(Edit1.Text);
Edit1.Clear end
else begin Exit end; }
end;
end;
[/code]
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2009-04-24 14:41:34, 註解 無‧
max5020
資深會員


發表:29
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-04-24 14:46:50 IP:59.120.xxx.xxx 訂閱
說實在的, 
您的程式邏輯整個就很怪??
看不出真正的原需求??
我猜猜是不是要將子:


[code delphi]


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
i, j: Integer;
begin
if Key <> #13 then exit;

StringGrid1.Cells[1, 0] := 'CSN';
csTempCheck. CommandText := 'SELECT A.CUSTOMER_SN "CSN"'
'FROM SAJET.G_SN_STATUS A, '
'SAJET.G_WO_BASE B '
'WHERE A.WORK_ORDER = B.WORK_ORDER '
'AND B.WO_STATUS = ''3'' '
'AND A.WIP_PROCESS = ''100032'' '
'AND A.PROCESS_ID = ''100028'' '
'AND A.CUSTOMER_SN = ' QuotedStr(Edit1.Text) ' ';
csTempCheck.Open;
if csTempCheck.isEmpty then showmessage('該序號尚未在QC')
else begin
ShowMessage('OK');
Cells[1, RowCount - 1] := Fieldbyname('CSN').AsString;
RowCount := RowCount 1;
Edit1
end;
csTempCheck.Close;
{ELSE
Memo1.Lines.Add(Edit1.Text);
Edit1.Clear end
else begin Exit end; }
end;


[/code]
編輯記錄
max5020 重新編輯於 2009-04-24 14:55:36, 註解 無‧
max5020 重新編輯於 2009-04-24 14:58:21, 註解 無‧
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#14 引用回覆 回覆 發表時間:2009-04-24 14:58:58 IP:122.116.xxx.xxx 訂閱
= =
屙....我是一開始先把CSN 帶出來
放在StringGird裡面

然後讓使用者輸入CSN 並且存在MEMO裡面
我還有後續動作是要把MEMO 的存在TABLE

但使用者不一定會把所有CSN 都輸入
可能StringGrid 帶出來有十筆
但使用者只會用到2-3筆

然後這2-3筆存在MEMO之後
會再存到TALBE

我現在是卡在這2-3筆CSN 必須要是有在StringGrid裡面的才可以存入MEMO
要不然不能繼續下一步....
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#15 引用回覆 回覆 發表時間:2009-04-24 15:00:04 IP:59.114.xxx.xxx 未訂閱
請加上紅色字那兩段試試

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
i, j: Integer;
begin
if Key = #13 then begin
csTempCheck.Close;
with StringGrid1 do
begin
Cells[1, 0] := 'CSN';
end;
with csTempCheck do
begin
CommandText := 'SELECT A.CUSTOMER_SN "CSN"'
'FROM SAJET.G_SN_STATUS A, '
'SAJET.G_WO_BASE B '
'WHERE A.WORK_ORDER = B.WORK_ORDER '
'AND B.WO_STATUS = ''3'' '
'AND A.WIP_PROCESS = ''100032'' '
'AND A.PROCESS_ID = ''100028'' '
'AND A.CUSTOMER_SN = ' QuotedStr(Edit1.Text) ' ';
csTempCheck.Open;
while not
csTempCheck.eof do begin
with StringGrid1 do
begin
Params.Clear;
Cells[1, RowCount - 1] := Fieldbyname('CSN').AsString;
RowCount := RowCount 1;
end;
NEXT;
end;
csTempCheck.First;
if csTempCheck.isEmpty then
//if Edit1.Text <> csTempCheck.Fieldbyname('CSN').AsString
begin showmessage('該序號尚未在QC')
end
else begin
ShowMessage('OK');
Edit1.Clear;
end;
end;
{ELSE
Memo1.Lines.Add(Edit1.Text);
Edit1.Clear end
else begin Exit end; }
end;

csTempCheck.Close;
end;
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#16 引用回覆 回覆 發表時間:2009-04-24 15:49:58 IP:122.116.xxx.xxx 訂閱
Dear 老大仔


可以了...萬分感謝各位的幫忙
小弟在此感激不盡

是不是csTempCheck一直開著狀態
導致..我第一次輸入正確
csTempCheck就一值只任務這各指令呢??
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#17 引用回覆 回覆 發表時間:2009-04-24 16:03:08 IP:59.114.xxx.xxx 未訂閱
嗯~
因為已經Open過了
所以資料就會一直存在著
你要把它給Close掉
然後再Open
讓它再重新去查詢過一次(重新更新一次)
這樣才不會容易有錯誤

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