需要从一个表减去另一个VFP的值

问题描述 投票:0回答:1

我有两张表,一张是库存表,一张是销售表。
我需要使用销售表中的数据从库存表中减去商品。

常见字段是表 1(库存)中的“id”和表 2(销售)中的“id_reg”。

如果字段名称不相同,是否可以更新值,或者我是否需要将“id_reg”字段名称更改为“id”?

我尝试使用“Do … While”循环,但我很困惑。

visual-foxpro
1个回答
0
投票

关于您关于字段名称的问题,无需将“id_reg”字段名称(外键字段名称)更改为“id”(主键字段名称)。

为了实现这一目标,我们将继续进行以下假设:

  • “库存”表包含一家商店中物品的库存。
  • “库存”表包含以下字段:“id”(商品代码)、“invquant”(商品库存数量)
  • “sales”表包含以下字段:“id_reg”(商品代码)、“quantity”(销售数量)
  • 我们的目标是从每个商品的“库存”表中相应的“invquant”字段中减去“销售”表的“数量”字段中的值之和。
  • 我们需要对“销售”表中的所有商品执行此扣除操作,并且此操作只能执行一次(但值得注意的是,在实际操作中,您应该在保存每条销售记录时从库存中扣除销售数量)。

为了完成这样的任务,我们有两种主要方法:

方法一:使用SQL命令(推荐)

您可以使用 SQL 命令将“销售”表中的所有数量从“库存”表中相应的数量中扣除。

这里是推荐的 SQL 命令:

UPDATE inventory FROM (SELECT id_reg, SUM(quantity) AS totquant FROM sales GROUP BY id_reg) AS salesquant WHERE inventory.id = salesquant.id_reg SET inventory.invquant = inventory.invquant - salesquant.totquant

方法2:循环记录(不推荐)

或者,您可以逐条循环“销售”表中的记录,并从“库存”表中扣除数量。

但是,出于效率原因,不建议使用这种方法。

  USE inventory IN 0
  USE Sales IN 0
  SELECT sales
  SCAN 
    SELECT inventory
    LOCATE FOR id = Sales.id_reg 
    REPLACE invquant WITH invquant - Sales.quantity 
  ENDSCAN

注意,如果“inventory”表在“id”字段上有索引,可以按如下方式优化代码:

  USE inventory IN 0 ORDER TAG id
  USE Sales IN 0
  SELECT sales
  SCAN 
    SELECT inventory
    SEEK Sales.id_reg 
    REPLACE invquant WITH invquant - Sales.quantity 
  ENDSCAN

或者,您可以在“销售”表和“库存”表之间建立关系:

 USE inventory IN 0 ORDER TAG id
  USE Sales IN 0
  SELECT sales
  SET RELATION TO id_reg INTO inventory
  SCAN 
    SELECT inventory
    REPLACE invquant WITH invquant - Sales.quantity 
  ENDSCAN

请选择最适合您要求的方法,请记住 SQL 命令是推荐的且更有效的方法。

© www.soinside.com 2019 - 2024. All rights reserved.