我正在尝试将 linq 与联合多表 orderby 项目一起使用,而无需在 VB.NET 中使用 dapper 进行重复。
但是结果不是重复的,是我的代码有问题吗?请指导我。
谢谢
Public Class Form1
Private Purchase, RetSales, RetPurchase, Sales As New List(Of Invoice)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
LoadData()
End Sub
Private Laststock23, PurchaseDetails, RetSalesDetails, RetPurchaseDetails, SalesDetails As New List(Of Detail)
Private Function CreateConnection() As String
Return ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\TRIAL.accdb;Persist Security Info=False;")
End Function
Private Sub LoadData()
Using Connection = New OleDbConnection(CreateConnection())
Laststock23 = CType(Connection.Query(Of Detail)("SELECT * FROM Laststock23"), List(Of Detail))
Purchase = CType(Connection.Query(Of Invoice)("SELECT * FROM PURCHASE"), List(Of Invoice))
PurchaseDetails = CType(Connection.Query(Of Detail)("SELECT * FROM PURCHASEDETAILS"), List(Of Detail))
RetPurchase = CType(Connection.Query(Of Invoice)("SELECT * FROM RETPURCHASE"), List(Of Invoice))
RetPurchaseDetails = CType(Connection.Query(Of Detail)("SELECT * FROM RETPURCHASEDETAILS"), List(Of Detail))
Sales = CType(Connection.Query(Of Invoice)("SELECT * FROM SALES"), List(Of Invoice))
SalesDetails = CType(Connection.Query(Of Detail)("SELECT * FROM SALESDETAILS"), List(Of Detail))
RetSales = CType(Connection.Query(Of Invoice)("SELECT * FROM RETSALES"), List(Of Invoice))
RetSalesDetails = CType(Connection.Query(Of Detail)("SELECT * FROM RETSALESDETAILS"), List(Of Detail))
End Using
Dim ls = From lsd In Laststock23
Select
lsd.ITEM,
LSQ = lsd.QTY,
PIQ = 0,
SIQ = 0,
RPQ = 0,
RSQ = 0,
BLC = lsd.QTY
Order By ITEM
Dim ps = From p In Purchase
From pd In PurchaseDetails
Select
pd.ITEM,
LSQ = 0,
PIQ = pd.QTY,
SIQ = 0,
RPQ = 0,
RSQ = 0,
BLC = pd.QTY
Order By ITEM
Dim ss = From s In Sales
From sd In SalesDetails
Select
sd.ITEM,
LSQ = 0,
PIQ = 0,
SIQ = sd.QTY,
RPQ = 0,
RSQ = 0,
BLC = -sd.QTY
Order By ITEM
Order By ITEM
Dim rss = From rs In RetSales
From rsd In RetSalesDetails
Select
rsd.ITEM,
LSQ = 0,
PIQ = 0,
SIQ = 0,
RPQ = 0,
RSQ = rsd.QTY,
BLC = rsd.QTY
Order By ITEM
Dim rps = From rp In RetPurchase
From rpd In RetPurchaseDetails
Select
rpd.ITEM,
LSQ = 0,
PIQ = 0,
SIQ = 0,
RPQ = rpd.QTY,
RSQ = 0,
BLC = -rpd.QTY
Dim Card_temp = ls.Union(ps).Union(ss).Union(rps).Union(rss).OrderBy(Function(w) w.ITEM)
Dim Card As New List(Of ItemCards)
Dim RunningBalance As Integer = 0
For Each ct In Card_temp
Dim sc As New itemCards
With sc
.ITEM = ct.ITEM
.LSQ = ct.LSQ
.PIQ = ct.PIQ
.SIQ = ct.SIQ
.RPQ = ct.RPQ
.RSQ = ct.RSQ
.BLC = RunningBalance + ct.BLC
RunningBalance = .BLC
End With
Card.Add(sc)
Next
DataGridView1.DataSource = Card
End Sub
End Class
Public Class Invoice
Property INVONO() As String
Property DATEINVO() As Date
Property CUSTCODE() As String
End Class
Public Class Detail
Public Property INVONO() As String
Public Property NOD() As Integer
Public Property ITEM() As String
Public Property QTY() As Integer
End Class
Public Class ItemCards
Public Property ITEM() As String
Public Property LSQ As Integer
Public Property PIQ As Integer
Public Property SIQ As Integer
Public Property RSQ As Integer
Public Property RPQ As Integer
Public Property BLC As Integer
End Class
datagridview 中代码的结果
样本数据
桌子
LASTSTOCK23
项目 | 数量 |
---|---|
测试1000 | 5 |
测试2000 | 10 |
桌子
PURCHASE
伊沃诺 | 日期输入 | 海关代码 |
---|---|---|
PI1000 | 23 年 1 月 25 日 | 001 |
桌子
PURCHASEDETAILS
伊沃诺 | 诺德 | 项目 | 数量 |
---|---|---|---|
PI1000 | 1 | 测试1000 | 10 |
PI1000 | 1 | 测试2000 | 20 |
桌子
SALES
伊沃诺 | 日期输入 | 海关代码 |
---|---|---|
SI1000 | 23 年 1 月 25 日 | 001 |
桌子
SALESDETAILS
伊沃诺 | 诺德 | 项目 | 数量 |
---|---|---|---|
SI1000 | 1 | 测试1000 | 10 |
SI1000 | 1 | 测试2000 | 20 |
桌子
RETSALES
伊沃诺 | 日期输入 | 海关代码 |
---|---|---|
RS1000 | 23 年 1 月 25 日 | 001 |
桌子
RETSALESDETAILS
伊沃诺 | 诺德 | 项目 | 数量 |
---|---|---|---|
RS1000 | 1 | 测试1000 | 10 |
RS1000 | 1 | 测试2000 | 20 |
桌子
RETPURCHASE
伊沃诺 | 日期输入 | 海关代码 |
---|---|---|
RP1000 | 23 年 1 月 25 日 | 001 |
桌子
RETPURCHASEDETAILS
伊沃诺 | 诺德 | 项目 | 数量 |
---|---|---|---|
RP1000 | 1 | 测试1000 | 10 |
RP1000 | 1 | 测试2000 | 20 |
想要的结果
项目 | LSQ | PIQ | SIQ | RSQ | RPQ | BLC |
---|---|---|---|---|---|---|
测试1000 | 5 | 10 | 10 | 10 | 10 | 5 |
测试2000 | 10 | 20 | 20 | 20 | 20 | 10 |
您可以使用这样的简单查询:
SELECT
LSD.ITEM,
SUM(LSD.QTY) AS LSQ,
SUM(PD.QTY) AS PIQ,
SUM(SD.QTY) AS SIQ,
SUM(RSD.QTY) AS RSQ,
SUM(RPD.QTY) AS RPQ,
(LSQ+PIQ+RSQ-SIQ-RPQ) AS BLC
FROM (((LastStock23 AS LSD
INNER JOIN PurchaseDetails AS PD ON LSD.ITEM = PD.ITEM)
INNER JOIN SalesDetails AS SD ON LSD.ITEM = SD.ITEM)
INNER JOIN RetSalesDetails AS RSD ON LSD.ITEM = RSD.ITEM)
INNER JOIN RetPurchaseDetails AS RPD ON LSD.ITEM = RPD.ITEM
GROUP BY LSD.ITEM
最好将所有交易保存在一个表中,并添加交易类型字段(购买、明细、退货购买、退货明细)