CSDN-Ada助手 2024-03-11 16:25 采纳率: 1.6%
浏览 4

库存判断什么方案最好_(语言-javascript)

该问题来自社区帖: https://bbs.csdn.net/topics/618205801.为符合问答规范, 该问题经过ChatGPT优化
<html><body>

优化后的问题:

产品是有是否计算库存的设置,我现在用的方案是获取当前数据集的产品的总数量

function TFPOrderIn.GetProQty(ProNo: String): Real;
var
  FDMemTable1: TFDMemTable;
  ProQty: Real;
begin
  FDMemTable1 := TFDMemTable.Create(nil);
  ProQty := 0;
  if DetailData.RecordCount > 0 then
  begin
    FDMemTable1.Close;
    FDMemTable1.Data := DetailData.Data;
    FDMemTable1.Open;
    FDMemTable1.Filtered := False;
    FDMemTable1.Filter := 'ProNO=''' + ProNo + '''';
    FDMemTable1.Filtered := True;
    FDMemTable1.Open;
    FDMemTable1.First;
    while not FDMemTable1.Eof do
    begin
      ProQty := ProQty + FDMemTable1.FieldByName('Qty').AsFloat +
        FDMemTable1.FieldByName('ZQty').AsFloat;
      FDMemTable1.Next;
    end;
  end;
  Result := ProQty
end;

然后把当前的产品数量传到后台进行库存判断

//UserNo--用户名
//ProNo--产品编号
//WHNO--仓库编号
//TableName--单据类型
//BillNo--单据编号
//BillQty--前端产品数量
function CheckStockQty(UserNo, ProNo: String; WHNO: String; TableName: String;
  BillNo: String; BillQty: Real): Boolean;

var
  DSRestConnection: TDSRestConnection;
  Server: TServerMethods1Client;
  DSlIST: TFDJSONDataSets;
  FDMemTable: TFDMemTable;
  SQL: String;
begin
  try
    DSRestConnection := ConnectData();
    FDMemTable := TFDMemTable.Create(nil);
    Server := TServerMethods1Client.Create(DSRestConnection);
    SQL := 'select 1 from ProductInfo where ProNO=''' + ProNo + ''' and IsWH=1';
    DSlIST := Server.ServerGetTable(SQL, UserNo);
    FDMemTable.Close;
    FDMemTable.Data := TFDJSONDataSetsReader.GetListValue(DSlIST, 0).Data;
    FDMemTable.Open;
    //判断是否要计算库存
    if FDMemTable.RecordCount = 0 then
    begin
      Result := True;
    end
    else
    begin
      //计算库存(库存数量-单据产品数量)
      SQL := 'select a.Qty-isnull(b.qty,0) ReQty from Sys_Stock a left join ' +
        '(select ProNo,sum(qty) qty from V_Tran where DNo=''' + BillNo + ''' and DType=''' +
        TableName + ''' and ProNO=''' + ProNo + ''' group by ProNo) b on a.ProNo=b.ProNo' + ' where a.ProNO=''' + ProNo + ''' and WHNO=''' +
        WHNO + ''';';
      DSlIST := Server.ServerGetTable(SQL, UserNo);
      FDMemTable.Close;
      FDMemTable.Data := TFDJSONDataSetsReader.GetListValue(DSlIST, 0).Data;
      FDMemTable.Open;
      //库存数量-前端产品数量 
      //计算库存数量是否足够如果足够返回True,不足返回False
      if FDMemTable.FieldByName('ReQty').AsFloat+BillQty>=0 then
        Result := True
      else
        Result := False;
    end;
  finally
    Server.Free;
    DSRestConnection.Free;
  end;
end;

这样处理的时候,数据多了反应就特别慢,有什么好的办法

</body></html>
  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-11 16:25
    关注

    引自免费微信小程序:皆我百晓生

    针对您当前的库存判断方案,由于数据量较大导致性能问题,可以尝试以下几种优化策略:

    1. 索引优化

      • 在数据库表ProductInfoV_Tran以及Sys_Stock中,确保对查询条件字段如ProNoWHNODNoDType等建立索引,减少查询时间。
    2. 批量处理与合并查询

      • 尽可能在数据库端进行计算和汇总,避免将大量数据传输到前端再做处理。例如,您可以尝试重构CheckStockQty函数中的SQL语句,一次性完成库存数量减去单据产品数量的操作,并判断是否足够。
    -- 合并查询示例(假设相关表结构)
    SELECT 
      a.ProNo,
      a.WHNO,
      SUM(a.Qty) - COALESCE((
        SELECT SUM(t.qty)
        FROM V_Tran t
        WHERE t.DNo = :BillNo
          AND t.DType = :TableName
          AND t.ProNo = a.ProNo
      ), 0) AS ReQty
    FROM Sys_Stock a
    WHERE a.ProNo = :ProNo
      AND a.IsWH = 1
      AND a.WHNO = :WHNO
    GROUP BY a.ProNo, a.WHNO;
    
    -- 在Delphi客户端获取结果后直接判断ReQty值
    
    1. 缓存机制

      • 对于频繁查询且不常改变的数据(如部分产品的总库存),可以在服务器端或应用层引入缓存机制,减少数据库查询次数。
    2. 异步处理

      • 如果库存判断过程非常耗时,可以考虑将其异步化,不影响用户界面的响应速度,通过回调或者Promise来通知结果。
    3. 服务端优化

      • 如果上述优化还不能满足需求,可进一步分析数据库性能瓶颈,如是否有全表扫描的情况,是否需要增加硬件资源,或者调整数据库参数以提高查询效率。
    4. 架构层面优化

      • 可以考虑使用分布式缓存系统(Redis)存储实时的库存信息,对于高频读取请求,优先从缓存中获取。

    请根据您的实际应用场景选择合适的方法进行优化。同时,请注意,上述SQL语句仅作为参考,具体实现需根据您的数据库结构进行调整。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月11日

悬赏问题

  • ¥15 C语言设计一个简单的自动换档程序
  • ¥15 关于logstash转发日志时发生的部分内容丢失问题
  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。