报表:统计记录条数,在一个数字范围之间
Report: Counting number of records, between a number range
MS Access 2013。我需要写一份报告,显示我们储物箱中的书籍数量。
所有购买的图书都被赋予一个唯一的 nbr (SaleID)。我们每盒存放 25 本书,100 本书需要 4 盒。当我们出售书籍时,它们会从特定的盒子中取出,随着时间的推移,假设售出了 30 本书。然后我们可以丢弃一个盒子,将剩下的 70 本书放在三个盒子里。我们有数千本书和数百个储物箱。我需要 运行 一份报告,显示每 100 本书有多少本书,这样我就可以减少盒子的数量(并节省存储空间 space)。
报告应如下所示:
001 - 100 34(即 34 本书有库存,编号范围为 001 到 100。
101 - 200 35(库存 35 本书)
201 - 300 22(库存 22 本书)
301 - 400 60(库存 60 本书)
等等
下面的查询符合我的要求,我在其中输入要查询的一百本书的条件。但是我需要在报告上写一行,代表每百本书,代表我们持有的所有书籍。
SELECT tblSale.BookInStock, Count(tblSale.BookInStock) AS [Total Books]
FROM tblSale
WHERE (((tblSale.SaleID) Between 4201 And 4300))
GROUP BY tblSale.BookInStock
HAVING (((tblSale.BookInStock)=Yes));
如果有人有任何想法,我将不胜感激
干杯
新
由于您必须查询每百个项目,因此需要对每百个批次 运行 进行编码。因此,考虑从 VBA 循环查询创建临时 table。
循环的第一次迭代创建 table 替换之前的循环,然后所有其他迭代在您的数千个批次中添加数百个批次(注意用于跳过迭代器向前的步骤)。顺便说一句,您的 HAVING
子句条件已移至 WHERE
子句。
Dim i As Long
Dim sqlStr As String
Dim db As DAO.Database
Dim tbl As TableDef
Set db = CurrentDb
For Each tbl in db.TableDefs
If tbl.Name = "BoxBooksPerHundred" Then
db.TableDefs.Delete(tbl.Name)
End If
Next tbl
For i = 1 to 4300 Step 100 ' ADJUST AS NEEDED
If i = 1 Then
' MAKE-TABLE QUERY
strsql= "SELECT '" & i & " - " & i + 100 & "' AS [HundredRange], tblSale.BookInStock," _
& " Count(tblSale.BookInStock) AS [Total Books]" _
& " INTO BoxBooksPerHundred FROM tblSale" _
& " WHERE (((tblSale.BookInStock)=Yes)) And" _
& " (((tblSale.SaleID) Between " & i & " And " & i + 100 & "))" _
& " GROUP BY '" & i & " - " & i + 100 & "', tblSale.BookInStock;"
db.Execute strSQL, dbFailOnError
Else
' APPEND QUERY
strsql= "INSERT INTO BoxBooksPerHundred (HundredRange, BookInStock, [Total Books])"
& " SELECT '" & i & " - " & i + 100 & "' AS [HundredRange], tblSale.BookInStock," _
& " Count(tblSale.BookInStock) AS [Total Books]" _
& " FROM tblSale" _
& " WHERE (((tblSale.BookInStock)=Yes)) And" _
& " (((tblSale.SaleID) Between " & i & " And " & i + 100 & "))" _
& " GROUP BY '" & i & " - " & i + 100 & "', tblSale.BookInStock;"
db.Execute strSQL, dbFailOnError
End If
Next i
Set tbl = Nothing
Set db = Nothing
运行 这个循环在打开报告的触发事件上。但是由于数据量很大,如果您希望数据不会经常更改,请尝试在打开数据库时触发。最终,使用此临时 table、BooksPerHundred 作为报告的记录源。
MS Access 2013。我需要写一份报告,显示我们储物箱中的书籍数量。
所有购买的图书都被赋予一个唯一的 nbr (SaleID)。我们每盒存放 25 本书,100 本书需要 4 盒。当我们出售书籍时,它们会从特定的盒子中取出,随着时间的推移,假设售出了 30 本书。然后我们可以丢弃一个盒子,将剩下的 70 本书放在三个盒子里。我们有数千本书和数百个储物箱。我需要 运行 一份报告,显示每 100 本书有多少本书,这样我就可以减少盒子的数量(并节省存储空间 space)。
报告应如下所示:
001 - 100 34(即 34 本书有库存,编号范围为 001 到 100。
101 - 200 35(库存 35 本书)
201 - 300 22(库存 22 本书)
301 - 400 60(库存 60 本书) 等等
下面的查询符合我的要求,我在其中输入要查询的一百本书的条件。但是我需要在报告上写一行,代表每百本书,代表我们持有的所有书籍。
SELECT tblSale.BookInStock, Count(tblSale.BookInStock) AS [Total Books]
FROM tblSale
WHERE (((tblSale.SaleID) Between 4201 And 4300))
GROUP BY tblSale.BookInStock
HAVING (((tblSale.BookInStock)=Yes));
如果有人有任何想法,我将不胜感激 干杯 新
由于您必须查询每百个项目,因此需要对每百个批次 运行 进行编码。因此,考虑从 VBA 循环查询创建临时 table。
循环的第一次迭代创建 table 替换之前的循环,然后所有其他迭代在您的数千个批次中添加数百个批次(注意用于跳过迭代器向前的步骤)。顺便说一句,您的 HAVING
子句条件已移至 WHERE
子句。
Dim i As Long
Dim sqlStr As String
Dim db As DAO.Database
Dim tbl As TableDef
Set db = CurrentDb
For Each tbl in db.TableDefs
If tbl.Name = "BoxBooksPerHundred" Then
db.TableDefs.Delete(tbl.Name)
End If
Next tbl
For i = 1 to 4300 Step 100 ' ADJUST AS NEEDED
If i = 1 Then
' MAKE-TABLE QUERY
strsql= "SELECT '" & i & " - " & i + 100 & "' AS [HundredRange], tblSale.BookInStock," _
& " Count(tblSale.BookInStock) AS [Total Books]" _
& " INTO BoxBooksPerHundred FROM tblSale" _
& " WHERE (((tblSale.BookInStock)=Yes)) And" _
& " (((tblSale.SaleID) Between " & i & " And " & i + 100 & "))" _
& " GROUP BY '" & i & " - " & i + 100 & "', tblSale.BookInStock;"
db.Execute strSQL, dbFailOnError
Else
' APPEND QUERY
strsql= "INSERT INTO BoxBooksPerHundred (HundredRange, BookInStock, [Total Books])"
& " SELECT '" & i & " - " & i + 100 & "' AS [HundredRange], tblSale.BookInStock," _
& " Count(tblSale.BookInStock) AS [Total Books]" _
& " FROM tblSale" _
& " WHERE (((tblSale.BookInStock)=Yes)) And" _
& " (((tblSale.SaleID) Between " & i & " And " & i + 100 & "))" _
& " GROUP BY '" & i & " - " & i + 100 & "', tblSale.BookInStock;"
db.Execute strSQL, dbFailOnError
End If
Next i
Set tbl = Nothing
Set db = Nothing
运行 这个循环在打开报告的触发事件上。但是由于数据量很大,如果您希望数据不会经常更改,请尝试在打开数据库时触发。最终,使用此临时 table、BooksPerHundred 作为报告的记录源。