台灣最大程式設計社群網站
線上人數
1834
 
會員總數:243308
討論主題:188090
歡迎您免費加入會員
討論區列表 >> ASP.NET >> 階層資料GRIDVIEW顯示
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
階層資料GRIDVIEW顯示
價值 : 30 QP  點閱數:386 回應數:5

樓主

小裕
初學者
137 185
2680 330
發送站內信

我寫了兩個GRIDVIEW,

GRIDVIEW 2的查詢條件為GRIDVIEW 1某個欄位(row.Cells[1].Text)的值
================================================================
SQL語法:
with directsales(MC001,MC005,MD001,MD003,MD006,MD007,MD008,lvl)
as(
--Anchor查詢
select MC001,MC005, MD001,MD003,MD006,MD007,MD008,1 as lvl
from BOMMD INNER JOIN BOMMC ON BOMMD.MD003=BOMMC.MC001 where MD001 IN ('520014-001','')
union all
--Recursive查詢
select BOMMC.MC001,BOMMC.MC005,a.MD001,a.MD003,a.MD006,a.MD007,a.MD008,lvl+1
from BOMMD a,directsales b
INNER JOIN BOMMC ON MD003=BOMMC.MC001

where a.MD001=b.MD003
)
SELECT lvl,directsales.MC005,g.MC001 ,directsales.MD001,directsales.MD003,c.MB002,c.MB003,e.MB002 as NEWMB002,e.MB003 as NEWMB003,directsales.MD006,directsales.MD007,directsales.MD008 FROM directsales
INNER JOIN (SELECT MB001,MB002,MB003 FROM INVMB) c ON directsales.MD001=c.MB001
INNER JOIN (SELECT MB001,MB002,MB003 FROM INVMB) e ON directsales.MD003=e.MB001
LEFT JOIN (SELECT MC001,MC005 FROM BOMMC WHERE MC001 LIKE '5%') g ON directsales.MD001=g.MC001

WHERE directsales.MC005='5111' OR lvl='1'

ORDER BY lvl ,directsales.MD001 DESC

輸出結果:

lvl MC005 MC001 MD001 MD003
1 5113 520014-001 520014-001 4024017131
6 5111 NULL 3024011119 3081600014
7 5111 NULL 3186700001 1101060003
7 5111 NULL 3186700001 1101060004
7 5111 NULL 3186700001 1103700009
7 5111 NULL 3081600014 1001010003


我如何讓MC001的NULL值都變成520014-001??
我想要得到MD001最源頭來源的品號都為520014-001
如:
lvl MC005 MC001 MD001 MD003
1 5113 520014-001 520014-001 4024017131
6 5111 520014-001 3024011119 3081600014
7 5111 520014-001 3186700001 1101060003
7 5111 520014-001 3186700001 1101060004
7 5111 520014-001 3186700001 1103700009
7 5111 520014-001 3081600014 1001010003




而當如我的
where MD001 IN ('520014-001')
如果不只一個,可能為('520014-001','520014-002')..甚至多個(如果GRIDVIEW 1找到的值)

在SQL可以組成那樣的結果嗎?
還是我如何在程式處理呢?


其實最初有寫出這一段,他是可以跑出結果

WITH T(MD001,MD003,MD006,MD007,MD008) AS (SELECT MD001,MD003,MD006,MD007,MD008 FROM BOMMD UNION ALL SELECT nplus1.MD001,T.MD003,T.MD006,T.MD007,T.MD008 FROM BOMMD as nplus1, T WHERE T.MD001 = nplus1.MD003)SELECT f.MC005,d.MC001 as NEWMD001,g.MB002 as FNEWMB002,B.MD001,c.MB002,c.MB003,B.MD003,e.MB002 as NEWMB002,e.MB003 as NEWMB003,T.MD006,T.MD007,T.MD008 FROM T INNER JOIN (SELECT MD001,MD003 FROM BOMMD) B on T.MD003=B.MD001 INNER JOIN (SELECT MB001,MB002,MB003 FROM INVMB) c ON B.MD001=c.MB001 INNER JOIN (SELECT MB001,MB002,MB003 FROM INVMB) e ON B.MD003=e.MB001 INNER JOIN (SELECT MC001,MC005 FROM BOMMC) d ON T.MD001=d.MC001 INNER JOIN (SELECT MC001,MC005 FROM BOMMC) f ON T.MD003=f.MC001 INNER JOIN (SELECT MB001,MB002,MB003 FROM INVMB) g ON d.MC001=g.MB001 WHERE T.MD001 IN ('520014-001','520014-002') AND f.MC005='5111' order by d.MC005,d.MC001,T.MD001

輸出結果:

MC005 NEWMD001 MD001 MD003
5111 520014-001 3024011119 3081600014
5111 520014-001 3186700001 1101060003
5111 520014-001 3186700001 1101060004
5111 520014-001 3186700001 1103700009
5111 520014-001 3081600014 1001010003

但跑在SQL查詢時間將近快30秒,而這才兩個品號,若GRIDVIEW 1的值如果是很多個,那時間耗費更長
光這兩個品號我都跑到SQL 逾時 ,根本跑不起來!
我發覺WHERE T.MD001 IN ('520014-001','520014-002')這一段下在這個地方會導致效能很差。



以上是我測試的結果,希望有人能協助我該如何處理,謝謝!
================================================================


搜尋相關Tags的文章: [ 階層資料GRIDVIEW顯示 ] ,
本篇文章發表於2017-12-27 21:13
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

MIS2000 Lab
檢舉此回應
您是不是想做出這個範例?(抱歉!您這個問題實在很長、有點亂,我只看到一半)
參考一下

GridView合併「上下列的儲存格(RowSpan)」
https://dotblogs.com.tw/mis2000lab/archive/2008/04/24/3451.aspx

GridView合併「上下列的儲存格」後,隔列變底色(AlternatingRowStyle)
https://dotblogs.com.tw/mis2000lab/archive/2008/04/24/3452.aspx

本篇文章回覆於2017-12-28 09:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
您的問題主要在SQL的處理

整理其中重點如下:


結果是


希望是



所以,關鍵的問題是在SQL中怎麼處理NULL



就醬子

^_^
本篇文章回覆於2017-12-28 11:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

小魚
檢舉此回應
SQL逾時的問題是可以處理的,
只要把CommandTimeout設成0就可以,
不會跑不起來,
不過你的問題主要還是在SQL語法的問題.
本篇文章回覆於2017-12-28 12:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應

但跑在SQL查詢時間將近快30秒,而這才兩個品號,若GRIDVIEW 1的值如果是很多個,那時間耗費更長
光這兩個品號我都跑到SQL 逾時 ,根本跑不起來!


SQL跑很久,那就需要效能調教
一般來說,可以從『觀察查詢是否有善用index』來著手

您可以把相關SQL語法,在SSMS中,透過『執行計畫』來觀察
優化後,可能有機會可以在很短的時間內就可以查出相關的資訊

您可以查詢關鍵字『SQL、Index、效能』之類的關鍵字找相關文章
或者,市面上也有『SQL效能調教』的書可以參考


^_^
本篇文章回覆於2017-12-28 16:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

小裕
檢舉此回應
這樣MC001還是會抓到跟MD001的值一樣

lvl MC005 MC001 MD001 MD003
1 5113 520014-001 520014-001 4024017131
6 5111 3024011119 3024011119 3081600014
7 5111 3186700001 3186700001 1101060003
7 5111 3186700001 3186700001 1101060004
7 5111 3186700001 3186700001 1103700009
7 5111 3081600014 3081600014 1001010003

本篇文章回覆於2017-12-29 08:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.