相同的datatable 2列在vb.net中合并和求和一列

相同的datatable 2列在vb.net中合并和求和一列,vb.net,merge,crystal-reports,datatables,report,Vb.net,Merge,Crystal Reports,Datatables,Report,我有5个数据表,每个数据表有3列ID、Brand、Quanity,用于导出期初、购买、销售和期末库存。应合并前3个数据表并求和,以得出给定期间的期初库存。第4个数据表用于给定时期内完成的采购。最后一个数据表是针对给定时期内完成的销售 我的问题是: 如何合并3个数据表,使用前2列并求和值 如何使用crystal reports中的表格 我的代码是: Dim con As New ClassConnection If con.Conn.State = ConnectionState.Clos

我有5个数据表,每个数据表有3列ID、Brand、Quanity,用于导出期初、购买、销售和期末库存。应合并前3个数据表并求和,以得出给定期间的期初库存。第4个数据表用于给定时期内完成的采购。最后一个数据表是针对给定时期内完成的销售

我的问题是:

如何合并3个数据表,使用前2列并求和值

如何使用crystal reports中的表格

我的代码是:

Dim con As New ClassConnection
    If con.Conn.State = ConnectionState.Closed Then con.Conn.Open()

    'To get Opening Stock in Full Quantity
    Dim sql As String = "SELECT tblBrand.B_ID AS ID, tblBrand.B_Name AS Brand," & _
    " Sum (tblOp_Details.Net_Qty) AS Quantity FROM tblOp_Stock INNER JOIN (tblBrand INNER JOIN" & _
    " tblOp_Details ON tblBrand.B_ID = tblOp_Details.B_ID) ON tblOp_Stock.Stk_ID = tblOp_Details.Stk_ID" & _
    " WHERE tblOp_Stock.God_ID = @GID GROUP BY tblBrand.B_ID, tblBrand.B_Name"

    'To get Purchases < start date and adding to the opening stock
    Dim sql1 As String = "SELECT tblBrand.B_ID AS ID, tblBrand.B_Name AS Brand," & _
    " Sum (tblPur_Details.Net_Qty) AS Quantity FROM tblPurchase INNER JOIN (tblBrand INNER JOIN" & _
    " tblPur_Details ON tblBrand.B_ID = tblPur_Details.B_ID) ON tblPurchase.Pur_ID = tblPur_Details.Pur_ID" & _
    " WHERE tblPurchase.God_ID = @GID AND tblPurchase.Rec_Date < @SDate GROUP BY tblBrand.B_ID, tblBrand.B_Name"

    'To get Sales < Start date and subtracting to the above
    Dim sql2 As String = "SELECT tblBrand.B_ID AS ID, tblBrand.B_Name AS Brand," & _
    " Sum (tblSales_Details.Net_Qty) AS Quantity FROM tblSales INNER JOIN (tblBrand INNER JOIN" & _
    " tblSales_Details ON tblBrand.B_ID = tblSales_Details.B_ID) ON tblSales.Sale_ID = tblSales_Details.Sale_ID" & _
    " WHERE tblSales.God_ID = @GID AND tblSales.Sale_Date < @SDate GROUP BY tblBrand.B_ID, tblBrand.B_Name"
    'The above 3 condition is for deriving opening stock as on given date

    'To get Purchases >= Start Date and <= Start Date
    Dim sql3 As String = "SELECT tblBrand.B_ID AS ID, tblBrand.B_Name AS Brand," & _
    " Sum(tblPur_Details.Net_Qty) AS Quantity FROM tblBrand INNER JOIN (tblPurchase INNER JOIN" & _
    " tblPur_Details ON tblPurchase.Pur_ID = tblPur_Details.Pur_ID) ON tblBrand.B_ID = tblPur_Details.B_ID" & _
    " WHERE tblPurchase.God_ID = @GID And tblPurchase.Rec_Date >= @SDate And tblPurchase.Rec_Date" & _
    " <= @EDate GROUP BY tblBrand.B_ID, tblBrand.B_Name"
    'The above condition is for deriving Purchases as on given date

    'To get Sales >= Start Date and <= Start Date
    Dim sql4 As String = "SELECT tblBrand.B_ID AS ID, tblBrand.B_Name AS Brand," & _
    " Sum(tblSales_Details.Net_Qty) AS Quantity FROM tblBrand INNER JOIN (tblSales INNER JOIN" & _
    " tblSales_Details ON tblSales.Sale_ID = tblSales_Details.Sale_ID) ON tblBrand.B_ID = tblSales_Details.B_ID" & _
    " WHERE tblSales.God_ID = @GID And tblSales.Sale_Date >= @SDate And tblSales.Sale_Date <= @EDate" & _
    " And tblSales_Details.S_Active = @SAct GROUP BY tblBrand.B_ID, tblBrand.B_Name"
    'The above condition is for deriving Sales as on given date

    Dim da As New OleDb.OleDbDataAdapter(sql, con.Conn)
    Dim da1 As New OleDb.OleDbDataAdapter(sql1, con.Conn)
    Dim da2 As New OleDb.OleDbDataAdapter(sql2, con.Conn)
    Dim da3 As New OleDb.OleDbDataAdapter(sql3, con.Conn)
    Dim da4 As New OleDb.OleDbDataAdapter(sql4, con.Conn)

    da.SelectCommand.Parameters.AddWithValue("@GID", Me.stBar_G_ID.Text)
    da1.SelectCommand.Parameters.AddWithValue("@GID", Me.stBar_G_ID.Text)
    da1.SelectCommand.Parameters.AddWithValue("@SDate", Me.dtpStart.ToString)
    da2.SelectCommand.Parameters.AddWithValue("@GID", Me.stBar_G_ID.Text)
    da2.SelectCommand.Parameters.AddWithValue("@SDate", Me.dtpStart.ToString)
    da3.SelectCommand.Parameters.AddWithValue("@GID", Me.stBar_G_ID.Text)
    da3.SelectCommand.Parameters.AddWithValue("@SDate", Me.dtpStart.ToString)
    da3.SelectCommand.Parameters.AddWithValue("@EDate", Me.dtpEnd.ToString)
    da4.SelectCommand.Parameters.AddWithValue("@GID", Me.stBar_G_ID.Text)
    da4.SelectCommand.Parameters.AddWithValue("@SDate", Me.dtpStart.ToString)
    da4.SelectCommand.Parameters.AddWithValue("@EDate", Me.dtpEnd.ToString)
    da4.SelectCommand.Parameters.AddWithValue("@SAct", "Yes")

    Dim dt As New DataTable
    Dim dt1 As New DataTable
    Dim dt2 As New DataTable
    Dim dt3 As New DataTable
    Dim dt4 As New DataTable

忽略这样一个事实,即这些操作应该在数据库而不是内存中完成,您可以使用LINQtoDataSet,它是LINQtoObject的子集

如果要连接三个表,请按ID+品牌分组,以获得数量之和:

从查询中填充合并表:

Dim dt As DataTable = dt1.Clone() ' empty, same columns
For Each x In query
    Dim row = dt.Rows.Add()
    row.SetField("Id", x.Id)
    row.SetField("Brand", x.Brand)
    row.SetField("Quantity", x.SumQuantity)
Next

我如何使用crystal reports中的表不要在一个问题中问多个问题,而是将它们分开。是否要连接三个表,然后按ID、品牌分组,以获得每组的数量总和?是否尝试使用子报告
Dim dt As DataTable = dt1.Clone() ' empty, same columns
For Each x In query
    Dim row = dt.Rows.Add()
    row.SetField("Id", x.Id)
    row.SetField("Brand", x.Brand)
    row.SetField("Quantity", x.SumQuantity)
Next