报告:计算数字范围

时间:2015-09-11 06:30:01

标签: ms-access-2013

MS Access 2013.我需要编写一份报告,显示我们存储箱内的图书数量。

购买的所有书籍都有一个独特的nbr(SaleID)。我们每箱存储25本书,100本书需要4个盒子。当我们出售书籍时,它们会从特定的盒子中删除,随着时间的推移,我们可以说出售30本书籍。然后我们可以丢弃一个盒子,并将剩下的70本书存放在三个盒子里。我们有数千本书和数百个储物盒。我需要运行一份报告,向我展示每100本书中有多少本书库存,这样我就可以减少盒子的数量(并节省存储空间)。

报告应该显示如下:

001 - 100 34(即在编号为001至100的库存中有34本书。

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));

如果有人有任何想法,我会感激你的想法 干杯 内华达州

1 个答案:

答案 0 :(得分:0)

由于您必须查询每百个项目,因此需要编码以贯穿每一百个批次。因此,请考虑从VBA循环查询创建临时表。

循环的第一次迭代创建替换先前的表,然后所有其他迭代追加到数千个批次(用于跳过迭代器的通知步骤)。顺便说一句,您的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

在打开报告的触发事件上运行此循环。但是,由于相当多的数据,如果您希望数据不经常更改,请尝试触发数据库打开。最后,使用此临时表BooksPerHundred作为报告的记录源。