在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、出库表
商品表 存放 商品名称、类型、型号、规格等信息,
想要库存时,再通过商品表、 出库表、入库表 计算得出。想得出任意日期的库存也是可以的。
优点:没有库存表,不存在增、减问题,也不存在你的问题
缺点:想要库存就必须计算才能得出。

仅供参考,请做过 进销库 的网友指正一下。
------解决方案--------------------
豆老师言之有理。
本人认为应该再增加一个表(历史记录表),用于保存某一“批号”的库存商品“数量”为零的记录(如果某一批号的库存商品销售完毕,核实销售数量如果等于库存数量,此时将该批号的库存记录及销售记录一起移到“历史记录表”中)。至于有何益处,自己去想吧。
------解决方案--------------------
分两段来处理容易理解一些:
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