Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 数据集和不存在的行_Asp.net_Dataset - Fatal编程技术网

Asp.net 数据集和不存在的行

Asp.net 数据集和不存在的行,asp.net,dataset,Asp.net,Dataset,请帮帮新手。 我正在从存储过程中读取过去两年的月销售统计数据,并将其显示在asp.net网站上,它运行正常。 问题是产品不经常销售,我需要弄清楚哪些月份没有销售。在这种情况下,我需要在表单元格中输入零,然后移动到数据集中的下一行。 对于…如果没有每个月的数据,每个月都不起作用。 问题是,如何移动到下一个sqlrow,以及如何在读取所有行时进行测试 sqlSelect = "EXECUTE dealer_sales_statistics @productID = '" & strProdI

请帮帮新手。 我正在从存储过程中读取过去两年的月销售统计数据,并将其显示在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
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来表示空值。我现在必须离开办公室。。。有一个愉快的周末!