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

主副明細表的問題?

答題得分者是:change.jian
lisahsu7488
一般會員


發表:9
回覆:3
積分:2
註冊:2007-10-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-06-06 15:50:51 IP:210.243.xxx.xxx 訂閱
請問各位大大,:
我想做一個master/detail明細,需要連很多的資料表,請問除了,這個方式一直不斷的存取還有其他的方法可以增加查詢的速度&增加程式的維護性嗎?
以下是我想查詢的表和我目前做的方式:
所需資料表有axx01,cxx16,axx10,cxx17,axx04,axx05,axx02
master表中固定欄位有活動代號、活動名稱、交易序號、贈品名稱、數量、兌換明細
detail表中固定欄位有活動代號、交易序號、發票號碼、金額
在edit1.text輸入發票號碼
master表會先去查 axx05,cxx16, 這二個資料表裡面有沒有發票號碼
if axx05,cxx16沒有就showmessage(無資料);
if axx05有的話,
begin
master表會去查
s:=select distinct axx05.活動代號, axx05.交易序號, axx01.活動名稱, axx04.數量,
axx02.贈品名稱, axx04.兌換日期;
s:=s from axx04, axx05, axx01, axx02;
s:=s where axx04.活動代號 = axx05.活動代號;
s:=s and axx04.活動代號=axx01.活動代號;
s:=s and axx04.交易序號=axx05.交易序號;
s:=s and axx05.活動代號=axx02.活動代號;
s:=s and axx04.贈品代號=axx02.贈品代號;
s:=s and axx05.發票號碼= edit1.text ;
query1.close;
query1.sql.clear;
query1.sql.text:=s;
quer1.open;
s1:='select 活動代號, 交易序號, 發票號碼, 部類, 金額 from axx05 where 活動代號=:活動代號 and 交易序號=:交易序號';
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Text:=s1;
adoquery2.Open;
end
if cxx16有的話
s:=select distinct cxx16.活動代號, cxx16.交易序號1, axx01.活動名稱, cxx17.數量,
cxx17.贈品名稱, cxx17.兌換日期;
s:=s from cxx16,axx01,cxx17;
s:=s where cxx16.活動代號 = axx01.活動代號;
s:=s and cxx16.活動代號=axx01.活動代號;
s:=s and cxx16.活動代號=cxx17.活動代號;
s:=s and cxx16.發票號碼 = edit1.Text;
s:=s and cxx16.交易序號1;
s:=s in ( select distinct axx10.交易序號 from axx10;
s:=s and axx10.交易序號2=cxx17.交易序號2;
s:=s and axx10.交易序號1 = cxx16.交易序號1);
query1.close;
query1.sql.clear;
query1.sql.text:=s;
quer1.open;
s1:='select 活動代號, 交易序號, 發票號碼, 部類, 金額 from cxx16 where 活動代號=:活動代號 and 交易序號=:交易序號';
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Text:=s1;
adoquery2.Open;
end
編輯記錄
lisahsu7488 重新編輯於 2008-06-10 16:37:07, 註解 無‧
lisahsu7488 重新編輯於 2008-06-10 16:38:06, 註解 無‧
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-06-09 14:48:56 IP:211.23.xxx.xxx 訂閱
看不大懂你的問題:

if 查詢 act04, act05, acm01, acm02'資料=0 then
查詢test5,test6,test7,test8

你的 code 裡看不出這樣的邏輯

還是你的 code 沒有貼完整?
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-06-11 13:53:24 IP:211.23.xxx.xxx 訂閱
解法有很多種,如果是我會這樣做:
1.在 DB 上寫個 storeProcedure,傳入發票號碼,回傳一個 Query 的結果
store procedure 的邏輯,當然就是你的需求.前端 delphi 僅需要擺個 TStoreProcedure ,把回傳結果設為 Query 的型態
當然,這表示你要會寫 store procedure 及用 delphi 去接 store procedure 回傳的 DataSet.,好處是日後你只要改 store procedure 即可.
前端不用改 (除非你要改 GUI 界面或多加參數)
[code sql]
if exists(select ... from ax005 where axx05.發票號碼 = 傳入的參數) then
select ... from axx04, axx05, axx01, axx02 where .....
else if (exists(select ... from cxx16 whre cxx16.發票號碼 = 傳入的參數) then
select ... from cxx16,axx01,cxx17 where ....
else
return null
[/code]
PS:兩年多沒摸資料庫了,語法忘光了,所以以上的 store procedure 語法僅供參考,

2.若純脆只想減少 Query 的次數,可以只下一道 sql 就好.做法是把兩道 Sql 用 Union 指令串起來,讓 (axx04, axx05, axx01, axx02) 及 (cxx16,axx01,cxx17) 一併回傳,當然,你要再多一道虛擬欄位,以知道該筆資料是從 ax005 還是 cxx16 來.若 Sql 指令回傳空的 Dataset,就表示沒有資料.如此,原來要下兩次的 SQL 指令,就可以變成只要下次就好
lisahsu7488
一般會員


發表:9
回覆:3
積分:2
註冊:2007-10-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-06-13 10:12:38 IP:210.243.xxx.xxx 訂閱
版大,不好意思,可以再請教您一個問題嗎?
是否可推幾本store procedure 和到delphi設定的參考書籍…謝謝
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-06-13 13:01:25 IP:211.23.xxx.xxx 訂閱
1.Store Procedure 的語法會跟資料庫比較相關,雖然觀念大同小異,但語法上卻是差異很大,最好找你現在用的資料(EX:MS-SQL or Oracle)的書.
2.不管是 Delphi 連 store procedure 的設定或是 store procedure 的撰寫,其實都算入門的功能,一般的書裡都會有提到,我沒有辦法跟你說那本好,因為入門書的時代離我很遠了
3.提供你我買書的方法:跑一趟天瓏書局,花個半天或一天,把相關書籍的目錄都看過一遍,你就可以知道入門需要知道什麼,然後找你能看懂的書,就是該本書的講法是很讓你懂的,有提供大量 sample code 給你參考.
ps:我認為入門書應該像字典一樣,越厚好越,表示講的範圍越多,也許沒有什麼很深的技術,但卻能幫助你建立一個大觀念.至於技術或做法,上網找很容易的.
===================引 用 lisahsu7488 文 章===================
版大,不好意思,可以再請教您一個問題嗎?
是否可推幾本store procedure 和到delphi設定的參考書籍…謝謝
系統時間:2024-04-27 0:47:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!