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

TDBLookupListBox造成的Operation not applicable問題

答題得分者是:careychen
Reiji
初階會員


發表:30
回覆:57
積分:32
註冊:2008-06-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-04-06 15:12:53 IP:61.219.xxx.xxx 訂閱
 小弟目前遇到一個頭痛的問題
以下是程式結構:

[code delphi]
Case RadioGroup1.ItemIndex of
0:sqltext:='select a,b from table1';
1:sqltext:='select c a,d b from table2';
2:sqltext:='select e a,'' '' b from table3';
end;

with Query1 do begin
close;
sql.Clear;
SQL.Text :=sqltext;
open;
end;
[/code]

這段程式是在RadioGroup1.OnClick時執行,其結果會將兩個欄位的內容顯示到TDBLookupListBox中,而TDBLookupListBox的ListSource就是指向這個Query的DataSource,並且可以點選TDBLookupListBox內容寫到Edit1當中(簡而言之就是下拉式選單)

小弟遇到的問題是這樣的,當點選第一個選項時TDBLookupListBox無誤(不執行選取),再選第二或第三個選項也都無誤,但是當點選TDBLookupListBox內容寫到Edit1中時,再去選第二或第三個選項,在執行到open這一句時就會跳出Operation not applicable的錯誤,經過測試將ListSource拿掉,程式執行過程是沒有問題的,請問有什麼方法能解決掉TDBLookupListBox這個問題?又是怎麼造成
------
永遠都是新手
編輯記錄
Reiji 重新編輯於 2010-04-06 15:13:25, 註解 無‧
Reiji 重新編輯於 2010-04-06 15:14:19, 註解 無‧
Reiji 重新編輯於 2010-04-06 15:15:24, 註解 無‧
Reiji 重新編輯於 2010-04-06 15:16:23, 註解 無‧
Reiji 重新編輯於 2010-04-06 15:16:43, 註解 無‧
Reiji 重新編輯於 2010-04-06 15:18:17, 註解 為什麼我的程式老是編輯不了啊(汗)‧
Reiji 重新編輯於 2010-04-06 15:19:27, 註解 無‧
Reiji 重新編輯於 2010-04-06 15:21:39, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-04-06 17:38:42 IP:60.248.xxx.xxx 訂閱
先確定一件事一下  三行 Select 中的  a 和 b 都是同一個型態嗎?

例如:
a, c, e 的型態是不是一樣的?
b, d, '' 是不是都是字串型態? (因為你的第三個 SQL 語法的第二個欄位是字串)

如果上面的說明不清楚,可以試試
Select Cast(A as Type) a, Cast(B as nvarcar(XX)) b from ...
Select Cast(C as Type) a, Cast(D as nvarcar(XX)) b from ...
Select Cast(E as Type) a, '' '' b from ...

我猜,ListSource 的錯誤應該不是錯誤,而是在於三個語法的欄位型態不同導致的

===================引 用 Reiji 文 章===================
小弟目前遇到一個頭痛的問題
以下是程式結構:

[code delphi]
Case RadioGroup1.ItemIndex of
0:sqltext:='select a,b from table1';
1:sqltext:='select c a,d b from table2';
2:sqltext:='select e a,'' '' b from table3';
end;

with Query1 do begin
close;
sql.Clear;
SQL.Text :=sqltext;
open;
end;
[/code]

這段程式是在RadioGroup1.OnClick時執行,其結果會將兩個欄位的內容顯示到TDBLookupListBox中,而TDBLookupListBox的ListSource就是指向這個Query的DataSource,並且可以點選TDBLookupListBox內容寫到Edit1當中(簡而言之就是下拉式選單)

小弟遇到的問題是這樣的,當點選第一個選項時TDBLookupListBox無誤(不執行選取),再選第二或第三個選項也都無誤,但是當點選TDBLookupListBox內容寫到Edit1中時,再去選第二或第三個選項,在執行到open這一句時就會跳出Operation not applicable的錯誤,經過測試將ListSource拿掉,程式執行過程是沒有問題的,請問有什麼方法能解決掉TDBLookupListBox這個問題?又是怎麼造成
------
價值的展現,來自於你用哪一個角度來看待它!!
Reiji
初階會員


發表:30
回覆:57
積分:32
註冊:2008-06-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-04-07 09:31:25 IP:61.219.xxx.xxx 訂閱
是的,全部都是Varchar2型態,a b c d e 都是
不過經careychen你這麼一說,我去看這些欄位發現長度不一樣,也就是a c e雖然一樣是Varchar2但欄位長度並不相同,使用cast去設定為最大數就會解決了

那麼是不是雖然Query1有close,但是欄位長度依然停留在前一個select結果了呢?
總之用Cast是確實的解決了錯誤問題

十分感謝

===================引 用 careychen 文 章===================
先確定一件事一下 三行 Select 中的 a 和 b 都是同一個型態嗎?

例如:
a, c, e 的型態是不是一樣的?
b, d, '' 是不是都是字串型態? (因為你的第三個 SQL 語法的第二個欄位是字串)

如果上面的說明不清楚,可以試試
Select Cast(A as Type) a, Cast(B as nvarcar(XX)) b from ...
Select Cast(C as Type) a, Cast(D as nvarcar(XX)) b from ...
Select Cast(E as Type) a, '' '' b from ...

我猜,ListSource 的錯誤應該不是錯誤,而是在於三個語法的欄位型態不同導致的

===================引 用 Reiji 文 章===================
小弟目前遇到一個頭痛的問題
以下是程式結構:

[code delphi]
Case RadioGroup1.ItemIndex of
0:sqltext:='select a,b from table1';
1:sqltext:='select c a,d b from table2';
2:sqltext:='select e a,'' '' b from table3';
end;

with Query1 do begin
close;
sql.Clear;
SQL.Text :=sqltext;
open;
end;
[/code]

這段程式是在RadioGroup1.OnClick時執行,其結果會將兩個欄位的內容顯示到TDBLookupListBox中,而TDBLookupListBox的ListSource就是指向這個Query的DataSource,並且可以點選TDBLookupListBox內容寫到Edit1當中(簡而言之就是下拉式選單)

小弟遇到的問題是這樣的,當點選第一個選項時TDBLookupListBox無誤(不執行選取),再選第二或第三個選項也都無誤,但是當點選TDBLookupListBox內容寫到Edit1中時,再去選第二或第三個選項,在執行到open這一句時就會跳出Operation not applicable的錯誤,經過測試將ListSource拿掉,程式執行過程是沒有問題的,請問有什麼方法能解決掉TDBLookupListBox這個問題?又是怎麼造成
------
永遠都是新手
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-04-07 12:11:05 IP:60.248.xxx.xxx 訂閱
抱歉,才疏學淺,我無法回答是否為【欄位長度依然停留在前一個select結果】造成的,
但你的 TDBLookupListBox 的 dataSource 的地方也是有指定其他的來源資料呢?
如果沒有,單純只是用來秀資料的話,那有另一個建議的方式,可以試試

在 RadioGroup 之前先將 ListSource 清掉

DBLookupLIstBox.ListSource := nil;

case RadioGroup1.ItemIndex of
....
end;

with query1 do ...
...
end;

DBLookupListBox.ListSource := Query的DataSource;

這樣的話,那你上面那個 Select 就可以不用改了

===================引 用 Reiji 文 章===================
是的,全部都是Varchar2型態,a b c d e 都是
不過經careychen你這麼一說,我去看這些欄位發現長度不一樣,也就是a c e雖然一樣是Varchar2但欄位長度並不相同,使用cast去設定為最大數就會解決了

那麼是不是雖然Query1有close,但是欄位長度依然停留在前一個select結果了呢?
總之用Cast是確實的解決了錯誤問題

十分感謝

===================引 用 careychen 文 章===================
先確定一件事一下 三行 Select 中的 a 和 b 都是同一個型態嗎?

例如:
a, c, e 的型態是不是一樣的?
b, d, '' 是不是都是字串型態? (因為你的第三個 SQL 語法的第二個欄位是字串)

如果上面的說明不清楚,可以試試
Select Cast(A as Type) a, Cast(B as nvarcar(XX)) b from ...
Select Cast(C as Type) a, Cast(D as nvarcar(XX)) b from ...
Select Cast(E as Type) a, '' '' b from ...

我猜,ListSource 的錯誤應該不是錯誤,而是在於三個語法的欄位型態不同導致的

===================引 用 Reiji 文 章===================
小弟目前遇到一個頭痛的問題
以下是程式結構:

[code delphi]
Case RadioGroup1.ItemIndex of
0:sqltext:='select a,b from table1';
1:sqltext:='select c a,d b from table2';
2:sqltext:='select e a,'' '' b from table3';
end;

with Query1 do begin
close;
sql.Clear;
SQL.Text :=sqltext;
open;
end;
[/code]

這段程式是在RadioGroup1.OnClick時執行,其結果會將兩個欄位的內容顯示到TDBLookupListBox中,而TDBLookupListBox的ListSource就是指向這個Query的DataSource,並且可以點選TDBLookupListBox內容寫到Edit1當中(簡而言之就是下拉式選單)

小弟遇到的問題是這樣的,當點選第一個選項時TDBLookupListBox無誤(不執行選取),再選第二或第三個選項也都無誤,但是當點選TDBLookupListBox內容寫到Edit1中時,再去選第二或第三個選項,在執行到open這一句時就會跳出Operation not applicable的錯誤,經過測試將ListSource拿掉,程式執行過程是沒有問題的,請問有什麼方法能解決掉TDBLookupListBox這個問題?又是怎麼造成
------
價值的展現,來自於你用哪一個角度來看待它!!
Reiji
初階會員


發表:30
回覆:57
積分:32
註冊:2008-06-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-04-09 09:23:54 IP:61.219.xxx.xxx 訂閱
感謝,本來把它們拆成了很多個Query去分別跑,弄得越來越複雜
還是清空這個方法好,可惜沒辦法再給一次分,不然一定給你加好幾分

===================引 用 careychen 文 章===================
抱歉,才疏學淺,我無法回答是否為【欄位長度依然停留在前一個select結果】造成的,
但你的 TDBLookupListBox 的 dataSource 的地方也是有指定其他的來源資料呢?
如果沒有,單純只是用來秀資料的話,那有另一個建議的方式,可以試試

在 RadioGroup 之前先將 ListSource 清掉

DBLookupLIstBox.ListSource := nil;

case RadioGroup1.ItemIndex of
....
end;

with query1 do ...
...
end;

DBLookupListBox.ListSource := Query的DataSource;

這樣的話,那你上面那個 Select 就可以不用改了
------
永遠都是新手
Reiji
初階會員


發表:30
回覆:57
積分:32
註冊:2008-06-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-04-09 10:31:04 IP:61.219.xxx.xxx 訂閱
剛才試了一下,發現還是一樣會出現錯誤,哈哈,第一次試誤以為沒問題呢,第二次才發現點錯地方,才又發現問題
繞來繞去似乎還是要用cast的方法比較簡單

感覺應該是TDBLookupListBox的ListField無法順利變化長度的關係

===================引 用 Reiji 文 章===================
感謝,本來把它們拆成了很多個Query去分別跑,弄得越來越複雜
還是清空這個方法好,可惜沒辦法再給一次分,不然一定給你加好幾分

===================引 用 careychen 文 章===================
抱歉,才疏學淺,我無法回答是否為【欄位長度依然停留在前一個select結果】造成的,
但你的 TDBLookupListBox 的 dataSource 的地方也是有指定其他的來源資料呢?
如果沒有,單純只是用來秀資料的話,那有另一個建議的方式,可以試試

在 RadioGroup 之前先將 ListSource 清掉

DBLookupLIstBox.ListSource := nil;

case RadioGroup1.ItemIndex of
....
end;

with query1 do ...
...
end;

DBLookupListBox.ListSource := Query的DataSource;

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