Asp.net 数据集和不存在的行
请帮帮新手。 我正在从存储过程中读取过去两年的月销售统计数据,并将其显示在asp.net网站上,它运行正常。Asp.net 数据集和不存在的行,asp.net,dataset,Asp.net,Dataset,请帮帮新手。 我正在从存储过程中读取过去两年的月销售统计数据,并将其显示在asp.net网站上,它运行正常。 问题是产品不经常销售,我需要弄清楚哪些月份没有销售。在这种情况下,我需要在表单元格中输入零,然后移动到数据集中的下一行。 对于…如果没有每个月的数据,每个月都不起作用。 问题是,如何移动到下一个sqlrow,以及如何在读取所有行时进行测试 sqlSelect = "EXECUTE dealer_sales_statistics @productID = '" & strProdI
问题是产品不经常销售,我需要弄清楚哪些月份没有销售。在这种情况下,我需要在表单元格中输入零,然后移动到数据集中的下一行。
对于…如果没有每个月的数据,每个月都不起作用。
问题是,如何移动到下一个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
sqlSelect=“执行经销商销售统计@productID=”&strProdID.Value&“
Dim sqlConn作为新的SqlConnection(sqlConnStr)
将sqlRow设置为DataRow
sqlConn.Open()
Dim sqlAdapt作为新的SqlDataAdapter(sqlSelect、sqlConn)
Dim sqlDataSet作为新数据集()
sqlAdapt.Fill(sqlDataSet,“销售统计”)
直到sqlRow.EOF为止
如果intCounter<12,则
'每月包含最后24个月,例如“2009年12月”至“2008年1月”'
'存储过程可以返回该范围内任何月份的值'
'返回值(数据集sqlRows)的数量可以在0到24之间变化'
如果arrMonth(intCounter)=sqlRow(“月”)和sqlRow(“年”),则
strLine_1&=“”&CInt(sqlRow(“数量”)&“
arrSumma_1=arrSumma_1+CInt(sqlRow(“数量”))
sqlRow.MoveNext
其他的
strLine_1&=“0”
如果结束
其他的
“使用intCouter和相同代码在12个月内分开销售”
如果arrMonth(intCounter)=sqlRow(“月”)和sqlRow(“年”),则
strLine_2&=“”&CInt(sqlRow(“数量”)&“
arrSumma_2=arrSumma_2+CInt(sqlRow(“数量”))
sqlRow.MoveNext
其他的
strLine_2&=“0”
如果结束
如果结束
intCounter=intCounter+1
环
我认为您试图在代码中这样做是把重点放在了错误的领域。我能想到一个可能的解决方案,但它确实很混乱。相反,请重点确保存储过程返回的集合是完整的,这样您就可以迭代它们,而不用担心丢失月份。也就是说,存储过程可能返回仅由销售月份组成的集合(例如,由于内部联接),您需要对此进行更改,以便它返回所有月份
因此,与其发布VB代码,我建议您发布存储的过程以获得解决问题的帮助
作为一般指导原则,我将创建一个虚拟表,其中列出了一年中的月份(以及执行联接的月份号)。然后,使用左外部联接将该表与查询一起折叠,以确保表示所有月份。此外,在选择最终销售数字时,使用“IsNull(Val,0)作为Val”替换零,以确保没有空值(对于没有销售的月份)
同样,这只是一般性的指导,我们需要看到实际的存储过程才能真正有所帮助。下面是我如何用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
DECLARE@strTemp\u月表
(
排序INT,
月整数,
年整数
)
声明@mnth INT
设置@mnth=0
而(@mnth<24)
开始
插入@strTemp\u个月
选择年份(GETDATE())=年份(DATEADD(m,-@mnth,GETDATE())时的大小写,然后选择1或2作为排序结束,
月(DATEADD(m,-@mnth,GETDATE()),年(DATEADD(m,-@mnth,GETDATE()))
设置@mnth=@mnth+1
结束
声明@productID VARCHAR(12)
SET@productID='1234567890'
声明@strTemp\u统计表
(
排序INT,
月整数,
年内,
productno VARCHAR(35),
销售数量十进制(9,2)
)
插入@strTemp\u统计数据
选择年份(事务处理日期)=年份(GETDATE())时的情况,然后选择1或2作为排序结束,
月(交易日)表示月,年(交易日)表示年,产品号表示产品号,
合计(数量)作为销售数量
来自销售活动
其中product_number=@productID
--包括过去24个月到今天的所有交易
事务_date>=将年(DATEADD(m,-23,GETDATE())转换为字符(4))+'-'+将月(DATEADD(m,-23,GETDATE())转换为VARCHAR(2))+'-01'
按月份(交易日)、年份(交易日)、产品编号分组
选择m.sorting、m.month、m.years、COALESCE(产品编号,“无销售”)作为productno,COALESCE(kpl,0)作为saleqty
从@strTemp\u月m开始左外连接@strTemp\u统计
月数=月数,年数=年数
按1,2说明订购
感谢马克的快速回答!我会检查我的程序。这将是在线查询,所以我不能使用固定表。我可以创建一个临时表来保存最后24个月的数据,并在sql中使用COALESCE来表示空值。我现在必须离开办公室。。。有一个愉快的周末!