基于ACCESS和ASP的SQL多个表查询与计算统计代码(二)库存管理系统

距离上一篇《基于ACCESS和ASP的SQL多个表查询与计算统计代码(一)》竟然已经一年半的时间,明日复明日呀,借着这次写库存管理系统的机会,再总结一些ACCESS和ASP的SQL问题。此次总结的要点在于把查询(Select语句)作为表(AS语句)与表或查询再次进行Select的多表查询方法,逻辑上要很注意,非常容易把自己绕进去。


一、问题的提出


【出库和入库明细的Select语句,需要写出一个库存Select查询,包括A仓、B仓和分仓。】


二、解决入库、出库的统计

那么,首先Select Sum(入库数量),并Group By 产品编号,Having(入库仓库=A仓),可以形成一个对于A仓入库的统计表,【入库统计查询】代码及结果如下。


SELECT chanpin.ID AS 序号, chanpin.CPno AS 产品编号, chanpin.CPpinpai AS 产品品牌, chanpin.CPname AS 产品名称, chanpin.CPKind AS 产品规格, chanpin.CPunit as 计数单位, SUM(inck.INnum) AS 入库数量
FROM inck INNER JOIN chanpin ON inck.INcp = chanpin.CPno
GROUP BY chanpin.ID, chanpin.CPno, chanpin.CPpinpai, chanpin.CPname, chanpin.CPKind, chanpin.CPunit, inck.ToCK
HAVING(inck.ToCK='KJC-A')


此时若【入库统计查询】直接以左链(LEFT JOIN)将出库JOIN一起的话,会由于只能采用对应仓库的方式接(ON 入库.仓库=出库.仓库)来链接,这样只会重复计算形成冗余,数据也是错误的,这并不是我需要的结果,如下看错误的测试:

SELECT chanpin.ID AS 序号, chanpin.CPno AS 产品编号, chanpin.CPpinpai AS 产品品牌, chanpin.CPname AS 产品名称, chanpin.CPKind AS 产品规格, chanpin.CPunit as 计数单位, SUM(inck.INnum) AS 入库数量, SUM(outck.OUTnum) as 出库数量 
FROM (inck INNER JOIN chanpin ON inck.INcp = chanpin.CPno) 
Left JOIN outck ON inck.ToCK=outck.FromCK 
GROUP BY chanpin.ID, chanpin.CPno, chanpin.CPpinpai, chanpin.CPname, chanpin.CPKind, chanpin.CPunit, inck.ToCK 
HAVING(inck.ToCK='KJC-A')


这是个错误的结果,从入库、出库明细来看,总入库、出库均重复计算了,数值当然是错误的。因此,不能简单的左链接来解决。


三、解决对入库出库的合并形成库存表

经过画简单的拓扑图,结论是应当把出库统计查询作为一个表来LEFT JOIN到入库统计查询里,此时对于链接的字段就不再是仓库了,而是已产品编号为链接字段,最后的结论及结果如下:


SELECT chanpin.ID AS 序号, chanpin.CPno AS 产品编号, chanpin.CPpinpai AS 产品品牌, chanpin.CPname AS 产品名称, chanpin.CPKind AS 产品规格, chanpin.CPunit as 计数单位, SUM(inck.INnum) AS 入库数量, IIF(AA.CC is not null,AA.CC,0) as 出库数量, 入库数量-出库数量 as 库存数量 
FROM (inck INNER JOIN chanpin ON inck.INcp = chanpin.CPno) 
left JOIN (select outck.outcp as BB, IIF(Sum(outck.OUTnum) is not null,Sum(outck.OUTnum),0) as CC From outck 
GROUP BY outck.outcp, outck.FromCK HAVING(outck.FromCK='KJC-A')) as AA ON inck.INcp = AA.BB 
GROUP BY chanpin.ID, chanpin.CPno, chanpin.CPpinpai, chanpin.CPname, chanpin.CPKind, chanpin.CPunit, inck.ToCK, AA.CC 
HAVING(inck.ToCK='KJC-A')

LEFT JOIN()部分为出库统计查询,作为表左链接到入库统计查询里。


完成了A仓,同理可以完成B仓。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP(Active Server Pages)是一种用于创建动态交互式网页的服务器端脚本技术。在采购管理方面,我们可以利用ASP来实现采购订单的创建、管理和记录。下面是一个简单的ASP代码示例,用于实现采购订单的创建和管理。 ```asp <% '建立数据库连接 Set conn = Server.CreateObject("ADODB.Connection") conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.Mappath("purchase.mdb") '处理提交的数据 if Request("action") = "add" then '获取数据 Dim productName, quantity, unitPrice productName = Request("productName") quantity = Request("quantity") unitPrice = Request("unitPrice") '将数据插入到数据库中 sql = "INSERT INTO purchase (productName, quantity, unitPrice) VALUES ('" & productName & "', " & quantity & ", " & unitPrice & ")" conn.Execute(sql) end if '查询数据库中的采购订单数据 sql = "SELECT * FROM purchase" Set rs = conn.Execute(sql) '显示采购订单列 %> <!DOCTYPE html> <html> <head> <title>采购订单管理</title> </head> <body> <h1>采购订单列</h1> <table> <tr> <th>产品名称</th> <th>数量</th> <th>单价</th> </tr> <% Do While Not rs.EOF %> <tr> <td><%= rs("productName") %></td> <td><%= rs("quantity") %></td> <td><%= rs("unitPrice") %></td> </tr> <% rs.MoveNext Loop %> </table> <h2>添加采购订单</h2> <form action="purchase.asp" method="POST"> <input type="hidden" name="action" value="add"> <label for="productName">产品名称:</label> <input type="text" name="productName" id="productName"><br> <label for="quantity">数量:</label> <input type="text" name="quantity" id="quantity"><br> <label for="unitPrice">单价:</label> <input type="text" name="unitPrice" id="unitPrice"><br> <input type="submit" value="添加采购订单"> </form> </body> </html> <% '关闭数据库连接 rs.Close conn.Close %> ``` 以上代码示例演示了如何使用ASP来创建采购订单管理页面,包括采购订单列的展示和新采购订单的添加。对于更复杂的采购管理系统,我们可以进一步扩展和完善这个基础框架,实现更多功能,比如采购流程管理、供应商管理、库存管理等。ASP的灵活性和强大功能使得我们可以根据实际需求定制各种采购管理系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值