在VFP8.0中,怎么有条件地删除“商品库存表”中的零库存商品(但每个编号商品保留一个批号)
在VFP8.0中,如何有条件地删除“商品库存表”中的零库存商品(但每个编号商品保留一个批号)?
在VFP8.0中,建立了“商品库存表”,字段有:商品编号、商品名称、厂牌、批号、数量、入库日期。每个商品编号的商品名称、厂牌都相同,但可以有多个批号。
现在经过一段时间商品销售,库存中有很多商品数量为零,现在需要有条件地删除零库存商品,删除条件是:
1、如果某编号的商品有某一批号有库存,则将该编号商品的所有其他批号为零库存的全部删除;
2、如果某编号的商品没有任何批号有库存,则只保留最新入库日期的那个批号,并将该编号商品的所有其他批号为零库存的全部删除。
例如:“商品库存表”数据为:
商品编号 商品名称 厂牌 批号 数量 入库日期
01 毛巾 东方毛巾厂 20120105 100 2012/05/02
01 毛巾 向阳毛巾厂 20110902 30 2012/03/12
01 毛巾 前进毛巾厂 20111103 0 2012/02/02
01 毛巾 永胜毛巾厂 20110705 0 2011/12/15
02 钢笔 东方钢笔厂 20120105 0 2011/06/02
02 钢笔 向阳钢笔厂 20110902 0 2011/12/12
02 钢笔 前进钢笔厂 20111103 0 2012/06/02
02 钢笔 永胜钢笔厂 20110705 0 2012/01/18
要求有条件地删除“商品库存表”中的零库存商品结果为:
商品编号 商品名称 厂牌 批号 数量 入库日期
01 毛巾 东方毛巾厂 20120105 100 2012/05/02
01 毛巾 向阳毛巾厂 20110902 30 2012/03/12
02 钢笔 前进钢笔厂 20111103 0 2012/06/02
敬向电脑专家请教,应如何编程?不胜感激!
------解决方案--------------------
SELECT distinct a.* FROM tts a LEFT JOIN tts b ON a.商品编号=b.商品编号 WHERE b.数量>0 AND a.数量>0;
union;
SELECT * FROM tts a WHERE NOT exists(SELECT 1 FROM tts b WHERE a.商品编号=b.商品编号 AND b.数量>0 );
AND NOT exists(SELECT 1 FROM tts b WHERE a.商品编号=b.商品编号 AND a.入库日期<b.入库日期)
------解决方案--------------------
这数据不应该删除吧,这个可流水记录呀,日后可能要查询的。
另外,这些数量为0的数据如何生成的?
------解决方案--------------------
楼主需要解决的问题和最终结果好像不一致吧
------解决方案--------------------
应该这样设计吧:
1、商品表
2、入库表
3、出库表
商品表 存放 商品名称、类型、型号、规格等信息,
想要库存时,再通过商品表、 出库表、入库表 计算得出。想得出任意日期的库存也是可以的。
优点:没有库存表,不存在增、减问题,也不存在你的问题
缺点:想要库存就必须计算才能得出。
仅供参考,请做过 进销库 的网友指正一下。
------解决方案--------------------
豆老师言之有理。
本人认为应该再增加一个表(历史记录表),用于保存某一“批号”的库存商品“数量”为零的记录(如果某一批号的库存商品销售完毕,核实销售数量如果等于库存数量,此时将该批号的库存记录及销售记录一起移到“历史记录表”中)。至于有何益处,自己去想吧。
------解决方案--------------------
分两段来处理容易理解一些:
在VFP8.0中,建立了“商品库存表”,字段有:商品编号、商品名称、厂牌、批号、数量、入库日期。每个商品编号的商品名称、厂牌都相同,但可以有多个批号。
现在经过一段时间商品销售,库存中有很多商品数量为零,现在需要有条件地删除零库存商品,删除条件是:
1、如果某编号的商品有某一批号有库存,则将该编号商品的所有其他批号为零库存的全部删除;
2、如果某编号的商品没有任何批号有库存,则只保留最新入库日期的那个批号,并将该编号商品的所有其他批号为零库存的全部删除。
例如:“商品库存表”数据为:
商品编号 商品名称 厂牌 批号 数量 入库日期
01 毛巾 东方毛巾厂 20120105 100 2012/05/02
01 毛巾 向阳毛巾厂 20110902 30 2012/03/12
01 毛巾 前进毛巾厂 20111103 0 2012/02/02
01 毛巾 永胜毛巾厂 20110705 0 2011/12/15
02 钢笔 东方钢笔厂 20120105 0 2011/06/02
02 钢笔 向阳钢笔厂 20110902 0 2011/12/12
02 钢笔 前进钢笔厂 20111103 0 2012/06/02
02 钢笔 永胜钢笔厂 20110705 0 2012/01/18
要求有条件地删除“商品库存表”中的零库存商品结果为:
商品编号 商品名称 厂牌 批号 数量 入库日期
01 毛巾 东方毛巾厂 20120105 100 2012/05/02
01 毛巾 向阳毛巾厂 20110902 30 2012/03/12
02 钢笔 前进钢笔厂 20111103 0 2012/06/02
敬向电脑专家请教,应如何编程?不胜感激!
------解决方案--------------------
SELECT distinct a.* FROM tts a LEFT JOIN tts b ON a.商品编号=b.商品编号 WHERE b.数量>0 AND a.数量>0;
union;
SELECT * FROM tts a WHERE NOT exists(SELECT 1 FROM tts b WHERE a.商品编号=b.商品编号 AND b.数量>0 );
AND NOT exists(SELECT 1 FROM tts b WHERE a.商品编号=b.商品编号 AND a.入库日期<b.入库日期)
------解决方案--------------------
这数据不应该删除吧,这个可流水记录呀,日后可能要查询的。
另外,这些数量为0的数据如何生成的?
------解决方案--------------------
楼主需要解决的问题和最终结果好像不一致吧
------解决方案--------------------
应该这样设计吧:
1、商品表
2、入库表
3、出库表
商品表 存放 商品名称、类型、型号、规格等信息,
想要库存时,再通过商品表、 出库表、入库表 计算得出。想得出任意日期的库存也是可以的。
优点:没有库存表,不存在增、减问题,也不存在你的问题
缺点:想要库存就必须计算才能得出。
仅供参考,请做过 进销库 的网友指正一下。
------解决方案--------------------
豆老师言之有理。
本人认为应该再增加一个表(历史记录表),用于保存某一“批号”的库存商品“数量”为零的记录(如果某一批号的库存商品销售完毕,核实销售数量如果等于库存数量,此时将该批号的库存记录及销售记录一起移到“历史记录表”中)。至于有何益处,自己去想吧。
------解决方案--------------------
分两段来处理容易理解一些:
- SQL code
*-- vfp9 代码 Select * From 库存表 Where 数量 <> 0 Into Cursor temp1 Select a.商品编号, Max(a.入库日期) As 入库日期 ; From 库存表 a ; Left Join temp1 b On a.商品编号 = b.商品编号 ; Where a.数量=0 And b.商品编号 Is Null ; Group By 1 Into Cursor temp2 Select * From temp1 ; Union ; Select a.* From 库存表 a ; Inner Join temp2 b ; On a.商品编号=b.商品编号 And a.入库日期=b.入库日期 ; Into Cursor 结果表
------解决方案--------------------
解决上面所述问题的笨办法:
- SQL code
*-- vfp9 代码 *-- 建样本数据 Create Cursor 库存表(商品编号 C(2), 商品名称 C(10), 厂牌 C(20), 批号 C(8), 数量 N(6), 入库日期 D) Text to cTemp NoShow 01 毛巾 东方毛巾厂 20120105 100 2012/05/02 01 毛巾 向阳毛巾厂 20110902 30 2012/03/12 01 毛巾 前进毛巾厂 20111103 0 2012/02/02 01 毛巾 永胜毛巾厂 20110705 0 2011/12/15 02 钢笔 东方钢笔厂 20120105 0 2011/06/02 02 钢笔 向阳钢笔厂 20110902 0 2011/12/12 02 钢笔 前进钢笔厂 20111103 0 2012/06/02 02 钢笔 前进钢笔厂 88888888 0 2012/06/02 && 同一天的第二笔 02 钢笔 永胜钢笔厂 20110705 0 2012/01/18 EndText Strtofile(cTemp, 'temp.txt') cTemp = '' Append From temp.txt Delimited With Blank Erase temp.txt *------ Select * From 库存表 Where 数量 <> 0 Into Cursor temp1 Select a.商品编号, Max(a.入库日期) As 入库日期 ; From 库存表 a ; Left Join temp1 b On a.商品编号 = b.商品编号 ; Where a.数量=0 And b.商品编号 Is Null ; Group By 1 Into Cursor temp2 Select a.* From 库存表 a ; Inner Join temp2 b ; On a.商品编号=b.商品编号 And a.入库日期=b.入库日期 ; Into Cursor temp2 Readwrite Index on 商品编号+Dtos(入库日期) Tag temp Unique Copy To temp Zap Delete Tag All Append From temp Erase temp.dbf Select * From temp1 ; Union ; Select * From temp2 ; Into Cursor 结果表 Use In temp1 Use In temp2 *------ Browse