如何在 VB.NET 中使用 dapper 从股票卡进行余额栏计算

问题描述 投票:0回答:1

我正在尝试用 VB.NET 中的 dapper 来平衡股票卡的列计算。我有下面的代码,但它还不正确:

请指导我。

谢谢

Public Class Form2
    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim scs As New Stockcardservice()
        DataGridView1.DataSource = scs.LoadData("A")
    End Sub
End Class
Public Class Stockcardservice
    Private Function CreateConnection() As String
        Return ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Stockcard2.accdb;Persist Security Info=False;")
    End Function
    Public Function LoadData(ByVal code As String) As IEnumerable(Of DTOStockcard)
        Dim sql = $"SELECT DetailUNION.InvoNo,DetailUNION.InvoDate, DetailUNION.Transaction,DetailUNION.[No], DetailUNION.CodeProduct, DetailUNION.Info, DetailUNION.Remark, DetailUNION.NameSC, Sum(IIf(Transaction='Purchase',Qty,0)) AS [IN], Sum(IIf(Transaction='Sales',Qty,0)) AS OUT
FROM (SELECT [No], InvoDate, Purchase.Invono,CodeProduct, Qty, Info,Remark,NameSC,Transaction 
    FROM PurchaseDetail INNER JOIN Purchase 
    ON Purchase.Invono = PurchaseDetail.Invono
    UNION 
    SELECT [No], InvoDate, Sales.Invono,CodeProduct, Qty,Info,Remark,NameSC,Transaction 
    FROM SalesDetail INNER JOIN Sales 
    ON Sales.Invono = SalesDetail.Invono
)  AS DetailUNION
WHERE (((DetailUNION.CodeProduct)='{code}'))
GROUP BY DetailUNION.InvoDate, DetailUNION.Transaction, DetailUNION.InvoNo, DetailUNION.[No], DetailUNION.CodeProduct, DetailUNION.Info, DetailUNION.Remark, DetailUNION.NameSC;"
        Using _conn = New OleDbConnection(CreateConnection())
            Return _conn.Query(Of DTOStockcard)(sql).ToList()
        End Using
    End Function
End Class
Public Class DTOStockcard
    Public Property InvoNo() As String
    Public Property InvoDate() As Date
    Public Property Transaction() As String
    Public Property No() As Integer
    Public Property CodeProduct() As String
    Public Property Info() As String
    Public Property Remark() As String
    Public Property NameSC() As String
    Public Property [IN] As Integer
    Public Property OUT As Integer
    Public Property BALANCE As Integer
End Class

上述代码的结果

因沃诺 参与 交易 没有 代码产品 信息 备注 姓名SC 平衡
1000 23 年 10 月 18 日 购买 1 A 白色 再次重复 测试1 50 0
1000 23 年 10 月 18 日 销售 1 A 白色 测试10 25 0
1001 23 年 10 月 19 日 购买 2 A 棕色 测试2 25 0
1001 23 年 10 月 19 日 销售 2 A 白色 测试20 15 0
1002 23 年 10 月 20 日 销售 1 A 棕色 测试30 25 0

想要的结果

因沃诺 参与 交易 没有 代码产品 信息 备注 姓名SC 平衡
1000 23 年 10 月 18 日 购买 1 A 白色 再次重复 测试1 50 50
1000 23 年 10 月 18 日 销售 1 A 白色 测试10 25 25
1001 23 年 10 月 19 日 购买 2 A 棕色 测试2 25 50
1001 23 年 10 月 19 日 销售 2 A 白色 测试20 15 35
1002 23 年 10 月 20 日 销售 1 A 棕色 测试30 25 10
vb.net linq datagridview dapper
1个回答
0
投票

当我们可以从原始表中调整数据时,无需使用复杂的查询。

课程:

Public Class Invoice
    Property Invono() As Integer
    Property Invodate() As Date
    Property Transaction() As String
    Property Remark() As String
    Property NameSC() As String
End Class
    
Public Class Detail
    Public Property InvoNo() As String
    Public Property No() As Integer
    Public Property CodeProduct() As String
    Public Property Info() As String
    Public Property Qty() As Integer
End Class
    
Public Class StockCard
    Public Property InvoNo As String
    Public Property InvoDate As Date
    Public Property Transaction As String
    Public Property No As Integer
    Public Property CodeProduct As String
    Public Property Info As String
    Public Property Remark As String
    Public Property NameSC As String
    Public Property [IN] As Integer
    Public Property [OUT] As Integer
    Public Property BALANCE As Integer
End Class

数据声明:

Private Purchase, Sale As New List(Of Invoice)
Private PurchaseDetails, SaleDetails As New List(Of Detail)

使用 Dapper 加载数据:

Using Connection = New OleDbConnection(My.Settings.Cons)
    Purchase = Connection.Query(Of Invoice)("SELECT * FROM Purchase")
    PurchaseDetails = Connection.Query(Of Detail)("SELECT * FROM PurchaseDetails")
    Sale = Connection.Query(Of Invoice)("SELECT * FROM Sale")
    SaleDetails = Connection.Query(Of Detail)("SELECT * FROM SaleDetails")
End Using

创建 StockCard(对于 CodeProduct=A):

Dim ps = From p In Purchase
         From pd In PurchaseDetails
         Where pd.InvoNo = p.Invono And pd.CodeProduct = "A"
         Select
             Invono = p.Invono,
             Invodate = p.Invodate,
             p.Transaction,
             pd.No,
             pd.CodeProduct,
             pd.Info,
             p.Remark,
             p.NameSC,
             [IN] = pd.Qty,
             [OUT] = 0,
             BALANCE = pd.Qty
         Order By Invono, Invodate


Dim ss = From s In Sale
         From sd In SaleDetails
         Where sd.InvoNo = s.Invono And sd.CodeProduct = "A"
         Select
             Invono = s.Invono,
             Invodate = s.Invodate,
             s.Transaction,
             sd.No,
             sd.CodeProduct,
             sd.Info,
             s.Remark,
             s.NameSC,
             [IN] = 0,
             [OUT] =
             sd.Qty,
             BALANCE = -sd.Qty
         Order By Invono, Invodate

Dim Card_temp = ps.Union(ss).OrderBy(Function(w) w.Invono).ThenBy(Function(w) w.Invodate)

Dim Card As New List(Of Stockcard)

Dim RunningBalance As Integer = 0

For Each ct In Card_temp
    Dim sc As New StockCard
    With sc
        .InvoNo = ct.Invono
        .InvoDate = ct.Invodate
        .Transaction = ct.Transaction
        .No = ct.No
        .CodeProduct = ct.CodeProduct
        .Info = ct.Info
        .Remark = ct.Remark
        .NameSC = ct.NameSC
        .IN = ct.IN
        .OUT = ct.OUT
        .BALANCE = RunningBalance + ct.BALANCE
        RunningBalance = .BALANCE
    End With
    Card.Add(sc)
Next

DGV_Result.DataSource = Card

© www.soinside.com 2019 - 2024. All rights reserved.