iT邦幫忙

0

ASP.NET C# & Access 多重查詢問題

Rong 2020-06-15 02:12:541190 瀏覽

各位大大你們好, 以下問題卡了我許久, 希望能夠得到解答~

類似於查詢發票內容及UI顯示的狀況.
目前搜尋的條件 ClientID, InvoiceID, ItemName
Client Table
https://ithelp.ithome.com.tw/upload/images/20200615/20127924MbMdm2ifnm.png
InvoiceRecord Table
https://ithelp.ithome.com.tw/upload/images/20200615/20127924ubo5JnBNeI.png
InvoiceDetail Table
https://ithelp.ithome.com.tw/upload/images/20200615/20127924zfXZcqj966.png
以下是不需要搜尋條件 顯示所有結果UI
https://ithelp.ithome.com.tw/upload/images/20200616/20127924LcMG4BpxJh.png

不好意思, 內容涉及到一些客戶資料, 故馬賽克, 資料表的部分也只顯示架構.

想要做到的效果是這樣的.
假設搜尋條件設定好後, 能夠抓取到以下資料
https://ithelp.ithome.com.tw/upload/images/20200616/20127924DxKELfUpYc.png

ClientGridView 顯示資料結果的 [ClientID], [ClientNname]
選擇其中一項,
InvoiceRecordGridView 顯示 Client.[ClientID] = InvoiceRecord.[ClientID] 相符的資料, 在選擇 record 時,
InvoiceDetailGridView 顯示 InvoiceDetail.[InvoiceID] = InvoiceRecord.[InvoiceID] 相符的資料

目前做到不需搜尋, 顯示全部結果
設計的步驟是這樣的:
1.UI一開始先讀取所有客戶資料並顯示.
"SELECT * FROM 客戶資料表 WHERE 顯示 = TRUE"

2.點擊某客戶後, 填寫內容並讀取發票紀錄.
"SELECT 發票號碼, 日期, 銷售金額, 稅額, 總金額, 收款 from 發票紀錄 where 客戶編號 = '" + this.ClientIDTextBox.Text + "'"

3.點擊發票紀錄, 填寫內容並讀取發票細項.
"SELECT 項目, 數量, 單價, 金額 FROM 發票細項 WHERE 發票號碼 = '" + invoiceid + "'"

但是如果加入條件搜尋, 有些疑惑
目前想到的解決方法.
一次性先讀取所有資料
"SELECT 發票紀錄.發票號碼, 發票紀錄.日期, 發票紀錄.銷售金額, 發票紀錄.稅額, 發票紀錄.總金額, 發票紀錄.收款, 發票細項.項目, 發票紀錄.客戶編號
FROM 發票紀錄 INNER JOIN 發票細項 ON 發票紀錄.[發票號碼] = 發票細項.[發票號碼];"
分別可以獲得 發票號碼, 細項.項目, 客戶編號
然後以獲得的 客戶編號 建立新的 DataTable 放置於 GridView.DataSource
發票紀錄一同如此.

可是總覺得此作法步驟繁瑣, 有些迷惘.
是否有其他方法能夠改善
希望各位前輩能幫我解答~
小弟並非從事科技業, 程式概念均由自學, 也是第一次發文求助.
有些排版或內容表達得不是那麼完整, 還請跟我說, 非常感謝!!

1 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2020-06-15 12:23:54

先講結論
一次把三個 table 都 join 起來,接著在 WHERE 的條件加上「搜尋條件」

再講細節
簡單分成兩個部份來講,SQL 和 UI
1.SQL
SQL 的部份如下例
用兩個 INNER JOIN 把 table 全部串在一起

SELECT *
FROM invoicerecord ir
INNER JOIN client cl ON ir.clientid = cl.id
INNER JOIN invoicedetail it ON ir.id = it.id

以下是建立一些測試資料供參考

CREATE TABLE Client
    (`ID` varchar(4), `Name` varchar(8))
;
    
INSERT INTO Client
    (`ID`, `Name`)
VALUES
    ('CL01', 'Brad'),
    ('CL02', 'Angel'),
    ('CL03', 'Jeniffer')
;


CREATE TABLE InvoiceRecord
    (`ID` varchar(5), `Date` int, `ClientID` varchar(4), `Moa` int)
;
    
INSERT INTO InvoiceRecord
    (`ID`, `Date`, `ClientID`, `Moa`)
VALUES
    ('INV01', 20200614, 'CL01', 11000),
    ('INV02', 20200614, 'CL02', 12000),
    ('INV03', 20200615, 'CL02', 13000),
    ('INV04', 20200614, 'CL03', 14000),
    ('INV05', 20200615, 'CL03', 15000),
    ('INV06', 20200616, 'CL03', 16000)
;


CREATE TABLE InvoiceDetail
    (`ID` varchar(5), `Item` varchar(8), `Amount` int, `UnitPrice` int)
;
    
INSERT INTO InvoiceDetail
    (`ID`, `Item`, `Amount`, `UnitPrice`)
VALUES
    ('INV01', 'Item0101', 1, 10000),
    ('INV01', 'Item0102', 1, 1000),
    ('INV02', 'Item0201', 1, 6000),
    ('INV02', 'Item0202', 1, 6000),
    ('INV03', 'Item0301', 1, 4000),
    ('INV03', 'Item0301', 2, 3000),
    ('INV03', 'Item0301', 3, 1000),
    ('INV04', 'Item0401', 1, 6000),
    ('INV04', 'Item0402', 2, 1500),
    ('INV04', 'Item0403', 3, 1000),
    ('INV04', 'Item0404', 4, 500),
    ('INV05', 'Item0501', 1, 15000),
    ('INV06', 'Item0601', 1, 16000)
;

2.UI
UI 的部份看你的設計而定

以「客戶名稱」「發票號碼」「物品名稱」三個欄位為例(日期範圍我先略過,你自己加進去)
你要決定兩件事情:
1.如果是「完全相符」就用=(如下ir.id);如果是「部份相符」就用LIKE(如下 cl.name)
2.三個條件是「同時成立」就用AND;「其中之一成立」就用OR(如下例)

SELECT *
FROM invoicerecord ir
INNER JOIN client cl ON ir.clientid = cl.id
INNER JOIN invoicedetail it ON ir.id = it.id
WHERE cl.name like 'B%'
OR ir.id = 'INV03'
OR it.item like 'Item02%'

最後多嘴一點
如果你還會來這裡問 SQL 的問題
最好先在SQL Fiddle把資料建好
會提高這裡真正的高手回答的意願

Rong iT邦新手 5 級 ‧ 2020-06-15 23:48:55 檢舉

謝謝你!

我瞭解需要3個table串在一起, 比較容易設定條件.
不過 GridView.Datasource 應該要怎麼放置內容呢?
是透過 3個 串在一起的 table 得到的 DataTable 去篩選(Distinct之類的方法?), 還是建立新的 DataTable 再從 table 直接放入其中並顯示呢?

我覺得我可能表達的不是那麼完整, 內文修改了些.

再次感謝你!!

PPTaiwan iT邦新手 2 級 ‧ 2020-06-16 10:58:36 檢舉

你可以以查詢出來的 TSQL 語法來顯示 GridView 上的欄位,就可以直接顯示出來了。

任何的語法最後的結果可以直接丟到 GridView 都可以顯示出來,如果沒有出現就多試試,還是上 Microsoft Doc 上可以找到更多的應用..

Rong iT邦新手 5 級 ‧ 2020-06-16 20:46:08 檢舉

PPTaiwan
這我瞭解. 我的意思是在這一筆資料如何篩選.
後來我研究了一下, 目前應該會使用 distinct 去做篩選.
已經有些方向了, 感謝你~

我要發表回答

立即登入回答