数据集和非现有行

时间:2009-12-18 13:43:29

标签: asp.net dataset

请帮助新手。 我正在从存储过程中读取过去两年的销售统计数据,在asp.net网站上显示它并且工作得很好 问题在于不经常销售的产品我需要弄清楚哪个月没有任何销售。在这种情况下,我需要在表格单元格中放置零并移动到数据集中的下一行 因为......如果没有每个月的数据,每个人都不会这样做 问题是,如何移动到下一个sqlrow以及如何测试所有行已被读取?

sqlSelect = "EXECUTE dealer_sales_statistics @productID = '" & strProdID.Value & "'"
Dim sqlConn As New SqlConnection(sqlConnStr)
Dim sqlRow As DataRow
sqlConn.Open()
Dim sqlAdapt As New SqlDataAdapter(sqlSelect,sqlConn)
Dim sqlDataSet As New DataSet()
sqlAdapt.Fill(sqlDataSet, "sales_statistics")  
Do Until sqlRow.EOF  
 If intCounter < 12 Then
 ' arrMonth contains last 24 months, e.g. "12_2009" to "1_2008"'
 ' stored procedure can return values for any month between that range'
 ' amount of returned values (DataSet sqlRows) can vary from 0 to 24'
  If arrMonth(intCounter) = sqlRow("month") & "_" & sqlRow("year") Then
   strLine_1 &= "<td>" & CInt(sqlRow("qty")) & "</td>"
   arrSumma_1 = arrSumma_1 + CInt(sqlRow("qty"))
   sqlRow.MoveNext
  Else
   strLine_1 &= "<td class='cell'>0</td>"
  End If
 Else
 'using intCouter and same code to separate sales in 12 month periods'
  If arrMonth(intCounter) = sqlRow("month") & "_" & sqlRow("year") Then
   strLine_2 &= "<td>" & CInt(sqlRow("qty")) & "</td>"
   arrSumma_2 = arrSumma_2 + CInt(sqlRow("qty"))
   sqlRow.MoveNext
  Else
   strLine_2 &= "<td>0</td>"
  End If
 End If
 intCounter = intCounter + 1
Loop

2 个答案:

答案 0 :(得分:2)

我认为您通过尝试在代码中执行此操作来专注于错误的区域。我可以想到一个可能的解决方案,但它真的很混乱。相反,要专注于确保存储过程返回的集合是完整的,这样您就可以迭代它们而不用担心丢失数月。也就是说,存储过程可能只返回由销售(例如由于内部联接)的月份组成的集合 - 并且您需要更改它以使其返回所有月份。

因此,我建议您发布存储过程以获得解决问题的帮助,而不是发布VB代码。

作为通用指南,我将通过创建一个包含列出的年份月份的虚拟表(以及执行连接的月份数字)来实现此目的。然后,使用左外连接将该表折叠到查询中,以确保表示所有月份。此外,在选择最终销售数据时,通过使用“IsNull(Val,0)as Val”来替换零,确保没有空值(对于没有销售的月份)。

同样,这只是一般指导,我们需要看到实际的sproc真正有用。

答案 1 :(得分:0)

以下是我用SQL解决这个问题的方法。我创建了持有最近24个月的动态临时表和另一个临时表,销售数据为0到24个月。也许这会帮助有类似问题的人。 (下面的代码在sql server中作为存储过程)。谢谢你的帮助马克!

DECLARE @strTemp_months TABLE 
( 
    sorting INT,
    months INT,
    years INT
)

DECLARE @mnth INT
SET @mnth = 0

WHILE (@mnth < 24)
    BEGIN
        INSERT @strTemp_months
        SELECT CASE WHEN YEAR(GETDATE()) = YEAR(DATEADD( m , -@mnth , GETDATE())) THEN 1 ELSE 2 END AS sorting, 
            MONTH(DATEADD( m , -@mnth , GETDATE())), YEAR(DATEADD( m , -@mnth , GETDATE()))
        SET @mnth = @mnth + 1
END

DECLARE @productID VARCHAR(12) 
SET @productID = '1234567890'

DECLARE @strTemp_statistics TABLE 
( 
    sorting INT, 
    months INT, 
    years INT, 
    productno VARCHAR(35),
    salesqty DECIMAL(9,2)
)

INSERT @strTemp_statistics 
SELECT CASE WHEN YEAR(transaction_date) = YEAR(GETDATE()) THEN 1 ELSE 2 END AS sorting, 
        MONTH(transaction_date) AS months, YEAR(transaction_date) AS years, product_number AS productno, 
        SUM(qty) AS salesqty
FROM sales_events

WHERE product_number = @productID
    -- including all transactions from last 24 full months until today
    AND transaction_date >= CAST(YEAR(DATEADD( m , -23 , GETDATE())) AS CHAR(4)) +  '-' + CAST(MONTH(DATEADD( m , -23 , GETDATE())) AS VARCHAR(2)) +  '-01' 
GROUP BY MONTH(transaction_date), YEAR(transaction_date), product_number

SELECT m.sorting, m.months, m.years, COALESCE(productno, 'No Sales') AS productno, COALESCE(kpl, 0) AS salesqty
FROM @strTemp_months m LEFT OUTER JOIN @strTemp_statistics s
    ON m.months = s.months AND m.years = s.years
ORDER BY 1, 2 DESC