库存判断什么方案最好

daigua1987 2024-03-11 16:24:31

产品是有是否计算库存的设置,我现在用的方案是

获取当前数据集的产品的总数量

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;

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

...全文
234 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 03-11
精选
  • 打赏
  • 举报
回复
您的问题已经帮您同步至问答, 链接: https://ask.csdn.net/questions/8071767, 请您保持关注, 如果回答有帮助解决此问题, 麻烦您动动小手给相关的回答点赞, Ada会在评论区为您更新结题状态
  • 打赏
  • 举报
回复

库存和账户余额类似,以前做银行应用时,会增加一个日间账户余额,是变动的。整个流程由账户余额、日间账户余额‘日间明细三个组成。日间明细随便增加、减少或删除,同时记录日间账户余额,晚上批量记账并更新账户余额,核对一致后,换日并确认账户余额继续使用。
这样的好处是,日间明细增减删不涉及真正的账务,仅仅是发生额,日终一次性写入已经确定的明细记录,还可以随时查看日间账户余额。不需要每次都去统计一下。
类似tanqth的做法,仅做参考。

  • 打赏
  • 举报
回复

进销存当然要三个表,这是逻辑问题,与数据量大小无关。
进销数据按照财务原则就是账本,是不能删改的(如果数据录入错误只能冲账),数据量大的话可以按年度保存。
入库出库的时候就直接修改库存表了,可以用存储过程实现。

tanqth 03-11
  • 打赏
  • 举报
回复

专门建立一个库存表,当有出入库的时候,在库存表里记录一下库存变化。最后你需要的就是直接查询库存记录表里的数据。
还有一种,每天对库存进行一次自动汇总,需要查询时,只需要结合前一天汇总的数据与当天的出入库数据进行处理,这样需要处理的数据量会小很多。

daigua1987 03-11
  • 举报
回复
@tanqth 主要是数据太多了,看了一秒钟系统处理的数据大概是在35条左右,用户最多的时候会弄出2000多条数据,这样一保存,处理这个库存验证就需要几十秒才能完成,库存表是汇总后的,是否有办法把整个内存表数据放到后台执行 这样我就需要执行一次查询就可以验证库存是否充足了
tanqth 03-13
  • 举报
回复
@daigua1987 单独建立一个库存表啊。那么这个表里的数据,最多也就只有商品条目那么多。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧