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

資料展開疑問, 用SQL處理還是用BCB好??

尚未結案
Dip
一般會員


發表:6
回覆:4
積分:2
註冊:2004-04-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-10 17:29:07 IP:210.243.xxx.xxx 未訂閱
小弟遇上一些問題,請大大們指引條明路. DB內容為 A1,BB A1,CC A1,DD A2,GG ... ... CC,XX CC,YY 現要建樹成為以下模型. A1 |---BB |---CC | |--XX | |--YY | |---DD 那麼要用SQL語法還是用BCB來處理呢? 疑問1. 使用SQL語法,第一層是沒問題,但要如何將結果再處理一次呢?. 做Temp再聯合嗎?似乎行又似乎不可行.因為考慮到多個多層就覺得不可行了. 疑問2. BCB中,Query後結果是放在何處呢??小弟想一一取出處理. 小弟是BCB新手,不敢祈求大大們動手寫,但請大大們一定要給個重點提示.拜謝!!
chrischung73
一般會員


發表:5
回覆:13
積分:3
註冊:2004-03-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-11 12:22:14 IP:211.21.xxx.xxx 未訂閱
Dear Dip: 我想使用TTreeView來展示應該沒錯吧. 只是如何擷取資料讓你傷腦筋. 只用一次SQL是不大可能辦到的(請SQL command高手們指教) 因此你可以用遞迴迴圈來讀取資料. 全部一股腦放到TTreeView中, 但這個方法有個問題是, 資料量多時須花費許多時間等待, 甚至可能有memory overflow 的情況 另外的方法是, 先展示第一層資料, 配合TTreeView的 Event (也許是OnExpanding), 於使用者要展開第一層某筆記錄時, 再擷取加入該筆記錄的第二層. 這是我以前的經驗, BCB我沒有真正implement過...也許有更好的更新的方式
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-11 14:04:37 IP:203.95.xxx.xxx 未訂閱
Hi, 請參考 Fishman 兄的大作, http://delphi.ktop.com.tw/topic.php?TOPIC_ID=44484
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-11 16:56:38 IP:211.162.xxx.xxx 未訂閱
Sorry,打攪各位大大一下,插個花,可以查考一下TATSU版大的經典: http://delphi.ktop.com.tw/topic.php?topic_id=46469    建議您在KTop搜尋裏打入:TreeView,會得到許多不錯的idea喲 < class="code"> =============== 人生在勤,不索何获? ===============
------
人生在勤,不索何获?
Dip
一般會員


發表:6
回覆:4
積分:2
註冊:2004-04-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-13 23:59:46 IP:211.23.xxx.xxx 未訂閱
目前的想法是,採用T-SQL 自訂遞迴函式展開各層. 再存入暫存表內.再一一賦予 KeyField & ParentField值.  (因為預定要用DevExpress dxDBTreeView顯示.) 最後再裝入MSSQL預存程序中. 看看能不能解決BCB上的效率問題.  取自Fishman大的Oracle遞迴式的 SQL Command. BCB不成,就從SQL下手. 山不轉路轉,路不轉,我就不玩了.. 但目前還在自習 > 請大大們對此構想給點意見吧!!讓小弟少繞點路. 小弟我目前
Dip
一般會員


發表:6
回覆:4
積分:2
註冊:2004-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-11 14:37:31 IP:210.243.xxx.xxx 未訂閱
嘿~小弟解決了. 速度極快 分享給各位嘗嘗.    原始文件取自完全剖析Microsoft SQL 7.0. Ron Soukup.
 
-- 用來記錄報告階層與目前雇員的變數
DECLARE @level int, @current int
-- 這個表格的作用像是堆疊. 我們將雇員推(push)的堆疊上,
-- 直到我們處理完它們的報告.
CREATE TABLE #stack 
(depth_level int, emp_no int)
-- 這個暫存表格會用來記錄報告鏈.
-- identity自動的將它順過並允許我們
-- 最終以單一的結果集回傳這個階層.
CREATE TABLE #orgchart
(seq_no        int    IDENTITY
org_level      int    NOT NULL
emp_id         int    NOT NULL
)
-- 假設我們知道確實僅有一個員工
--(CEO)會是他自己的經理人.
-- 合理情況下可以修改這個, 但需要一些方法
-- 來知道從何處開始.
-- 我們會設定ROWCOUNT為1來確定, 但這不是必要的
-- 因為我們知道這件事.
-- 在這個批次中, 我們會假設我們從階層1開始作為
-- depth_level.
SET ROWCOUNT 1
SELECT @level=1, @current=emp_no FROM emp_mgr WHERE emp_no=mgr_no
SET ROWCOUNT 0
INSERT INTO #stack(depth_level, emp_no)VALUES(@level, @current)
    
WHILE(@level > 0) -- 如果還有剩下任何階層就執行
    BEGIN
    
    -- 判斷我們所在的階層是否還有任何列
    IF EXISTS(SELECT * FROM #stack WHERE depth_level=@level)
        BEGIN
        -- 取得目前階層的第一個emp_no
        SET ROWCOUNT 1
        SELECT @current=emp_no FROM #stack
        WHERE depth_level=@level
        SET ROWCOUNT 0
        -- 將雇員放在暫存表格上以便 
        -- 稍後我們能夠執行單一的查詢與join.
        -- 我們可以在這裡對每一個雇員做SELECT, 但是
        -- 但這樣的結果集是沒有效率的.
        -- 這個orgchart暫存表格是自動的順過
        -- 藉由identity. 這是暫存表格的關鍵
        -- 用來在這裡提供解決方案.
        INSERT INTO #orgchart(ORG_LEVEL, EMP_ID)
            SELECT @level, @current 
                --從堆疊中刪除掉剛處理過的列 
        DELETE FROM #stack 
        WHERE depth_level=@level AND emp_no=@current
        -- 取得堆疊中的新列藉由找出任何人報告給
        -- 目前的: 除了報告給自己的最頂端雇員
        INSERT INTO #stack
            SELECT @level   1, emp_no
            FROM emp_mgr
            WHERE mgr_no=@current
            AND mgr_no <> emp_no
        -- 如果有任何列被找到並且插入, 會有一個階層
        -- 是在這個雇員之下, 所以增加階層
        IF @@ROWCOUNT > 0
            SELECT @level=@level   1
        END
    ELSE
        -- 沒有任何階層在這個雇員之下, 所以提出(pop up)一個 
        SELECT @level=@level- 1 
    END
-- 現在join這個 #org_chart來取得雇員姓名與職稱
-- 將雇員與經理人相接成一個字串, 依照階層來縮排
-- 使用SPACE()*level*5來對每個階層縮排5個字元, 除了
-- 第一層.
SELECT "Manager -> Employees"=
SPACE((O.org_level - 1)* 5)  E.emp_name   ',    '  E.emp_title
FROM #orgchart AS O
JOIN emp_mgr AS E ON(E.emp_no=O.emp_id)
ORDER BY O.SEQ_NO
DROP TABLE #stack, #orgchart    
結果.
Manager -> Employees
John Smith,   CEO
    Mark Burke,   President
          Dave Edgerton,   VP-Operations
               Rick Eckhart,   Albany Plant Manager
系統時間:2024-04-27 20:23:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!