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