線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1434
推到 Plurk!
推到 Facebook!

如何在修改Table資料的時候做檢查的動作

答題得分者是:st33chen
lovemari
中階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-08 16:04:57 IP:122.116.xxx.xxx 訂閱
小弟在程式上寫了 Update Table 的程式

小弟希望如果在Update的時候

1.原本的REPAIR_EMP 欄位是NULL 值的時候就直接Update
2.如果REPAIR_EMP 欄位有資料的時候就檢查 ComboBox2的值是否跟已存在的值相同
相同才可以Update 該列資料的其他欄位 不相同就不准Update 以及秀出警告

以下是我的SQL


[code delphi]
procedure TForm1.Button6Click(Sender: TObject);
begin
IF ComboBox1.Text = '' then
begin
showmessage ('請輸入序號')
end else
begin
With csTemp3 do
begin
Close;
Params.Clear;
CommandText := 'Update SAJET.G_SN_DEFECT_SPC '
'SET REPAIR_RESULT = ''' Edit7.Text ''', '
'REPAIR_EMP = ''' ComboBox2.Items.Strings[ComboBox2.Itemindex] ''', '
'WAY = ''' Edit8.Text ''', '
'REMARK = ''' Edit9.Text ''', '
'RP_STATUS = ''1'' '
'Where Serial_Number = ''' ComboBox1.Text ''' '
Execute;
showmessage ('處理完成!');
end;
Edit7.Clear;
Edit8.Clear;
Edit9.Clear;
ComboBox2.Clear;
end;
Button1.Click;
end;
[/code]
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2009-04-08 16:05:49, 註解 無‧
lovemari 重新編輯於 2009-04-08 16:10:35, 註解 無‧
lovemari 重新編輯於 2009-04-08 16:19:57, 註解 無‧
taishyang 重新編輯於 2009-04-09 09:45:10, 註解 將[Talbe]改成[Table]‧
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-08 16:36:38 IP:61.222.xxx.xxx 訂閱
這實在很麻煩。
滿足一的條件,直接在 Where 做判斷。再依據提交後是否更改處理。
若要達到警示,只能說既然要與目前的變數作判斷,一來要不分兩段先查詢 REPAIR_EMP 值再處理。
二來使用預儲函數應該是不錯的方法。
lovemari
中階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-04-08 17:45:34 IP:122.116.xxx.xxx 訂閱
其實我現在寫法就是不管是不是null值或者已經有值
就會直接Update

所以對於 第一項可以算是成立了
主要是第二項在Update前檢查是否相同名字or null值
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
st33chen
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-04-08 20:22:36 IP:122.116.xxx.xxx 未訂閱
您好,
用 oracle 的 nvl 如何?
// 懶得寫那麼多字, 先存在變數中.
wrepair_emp := ComboBox2.Items.Strings[ComboBox2.Itemindex];
CommandText :=
'Update SAJET.G_SN_DEFECT_SPC '
' SET REPAIR_RESULT = ''' Edit7.Text ''', '
' REPAIR_EMP = ''' wrepair_emp ''', '
' WAY = ''' Edit8.Text ''', '
' REMARK = ''' Edit9.Text ''', '
' RP_STATUS = ''1'' '
'Where Serial_Number = ''' ComboBox1.Text ''' '
// 如果原為空值, 改成使用者輸入的值, 所以相等或空值都會更新
' and nvl(repair_emp,''' wrepair_emp ''')=''' wrepair_emp '''';
Execute;
if rowsaffected=0 then
showmessage('repair_emp 不等於 ' wrepair_emp)
else begin
showmessage('更新完成');
end;
請試一下, 我沒實測.
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
lovemari
中階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-04-09 08:51:15 IP:122.116.xxx.xxx 訂閱
Dear st33chen 大大

感謝你 已經可以按照名字做檢查的動作了

只是在警訊部份

if rowsaffected=0 then
showmessage('repair_emp 不等於 ' wrepair_emp)
else begin



我在Delphi 7 好像找不到 rowsaffected 這各

是否有其他可用之函數呢

這函數應該是記算指有更動過的rows


===================引 用 st33chen 文 章===================
您好,
用 oracle 的 nvl 如何?
// 懶得寫那麼多字, 先存在變數中.
wrepair_emp := ComboBox2.Items.Strings[ComboBox2.Itemindex];
CommandText :=
'Update SAJET.G_SN_DEFECT_SPC '
' SET REPAIR_RESULT = ''' Edit7.Text ''', '
' REPAIR_EMP = ''' wrepair_emp ''', '
' WAY = ''' Edit8.Text ''', '
' REMARK = ''' Edit9.Text ''', '
' RP_STATUS = ''1'' '
'Where Serial_Number = ''' ComboBox1.Text ''' '
// 如果原為空值, 改成使用者輸入的值, 所以相等或空值都會更新
' and nvl(repair_emp,''' wrepair_emp ''')=''' wrepair_emp '''';
Execute;
if rowsaffected=0 then
showmessage('repair_emp 不等於 ' wrepair_emp)
else begin
showmessage('更新完成');
end;
請試一下, 我沒實測.
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
st33chen
尊榮會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-04-09 09:11:32 IP:122.116.xxx.xxx 未訂閱
非常抱歉, 我很少用 ttable, 沒注意到 ttable 沒有 rowsaffected
(您是用 ttable 吧)
請改用 tquery, 他有這個屬性.

ttable 的話就要找一下有沒類似屬性.
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2009-04-09 09:13:40, 註解 無‧
lovemari
中階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-04-09 09:51:14 IP:122.116.xxx.xxx 訂閱
大大別這麼說 還是很謝謝你

剛剛查詢以及問人 都說 好像沒有這各屬性

那我又想到一各方式

大大你能不能教我改寫成

在UPDATE 之前先檢查 ComboBox 上的值 跟要改的ROw 裡面的Repair_EMP 是否相同
如果不同就提出警訊

像改成這樣可以嗎???


===================引 用 st33chen 文 章===================
非常抱歉, 我很少用 ttable, 沒注意到 ttable 沒有 rowsaffected
(您是用 ttable 吧)
請改用 tquery, 他有這個屬性.

ttable 的話就要找一下有沒類似屬性.
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
st33chen
尊榮會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-04-09 11:18:13 IP:122.116.xxx.xxx 未訂閱
我認為沒有必要這樣, 改用 TQUERY 比較快, 就是
1. 先拉一個 QUERY1
2. WITH csTemp3 改成 WITH QUERY1
3. COMMANDTEXT 改成 SQL.TEXT
4. EXECUTE 改成 EXECSQL
應該就 OK 了
若要改成 UPDATE 前先判斷是否存在, 變成要兩段式, 效率不佳
不然就用 TRY 試看看
// 懶得寫那麼多字, 先存在變數中.
wrepair_emp := ComboBox2.Items.Strings[ComboBox2.Itemindex];
CommandText :=
'Update SAJET.G_SN_DEFECT_SPC '
' SET REPAIR_RESULT = ''' Edit7.Text ''', '
' REPAIR_EMP = ''' wrepair_emp ''', '
' WAY = ''' Edit8.Text ''', '
' REMARK = ''' Edit9.Text ''', '
' RP_STATUS = ''1'' '
'Where Serial_Number = ''' ComboBox1.Text ''' '
// 如果原為空值, 改成使用者輸入的值, 所以相等或空值都會更新
' and nvl(repair_emp,''' wrepair_emp ''')=''' wrepair_emp '''';
TRY
Execute;
showmessage('更新完成');
EXCEPT
showmessage('repair_emp 不等於 ' wrepair_emp);
end;

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


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-04-09 14:11:15 IP:122.116.xxx.xxx 訂閱

謝謝st33chen大大

我剛剛有想到一各簡單的方法
就是在UPDATE之前 先作一次SELECT 把人名帶出來
然後再還沒UPDATE之前 就先寫
IF SELECT 出來的人名 <> wrepair_emp
'repair_emp 不等於 ' wrepair_emp

已經可以囉^_^

還是很謝謝你提供的寶貴意見

===================引 用 st33chen 文 章===================
我認為沒有必要這樣, 改用 TQUERY 比較快, 就是
1. 先拉一個 QUERY1
2. WITH csTemp3 改成 WITH QUERY1
3. COMMANDTEXT 改成 SQL.TEXT
4. EXECUTE 改成 EXECSQL
應該就 OK 了
若要改成 UPDATE 前先判斷是否存在, 變成要兩段式, 效率不佳
不然就用 TRY 試看看
// 懶得寫那麼多字, 先存在變數中.
wrepair_emp := ComboBox2.Items.Strings[ComboBox2.Itemindex];
CommandText :=
'Update SAJET.G_SN_DEFECT_SPC '
' SET REPAIR_RESULT = ''' Edit7.Text ''', '
' REPAIR_EMP = ''' wrepair_emp ''', '
' WAY = ''' Edit8.Text ''', '
' REMARK = ''' Edit9.Text ''', '
' RP_STATUS = ''1'' '
'Where Serial_Number = ''' ComboBox1.Text ''' '
// 如果原為空值, 改成使用者輸入的值, 所以相等或空值都會更新
' and nvl(repair_emp,''' wrepair_emp ''')=''' wrepair_emp '''';
TRY
Execute;
showmessage('更新完成');
EXCEPT
showmessage('repair_emp 不等於 ' wrepair_emp);
end;

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