5,909
社区成员




产品是有是否计算库存的设置,我现在用的方案是
获取当前数据集的产品的总数量
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;
这样处理的时候,数据多了 反应就特别慢,有什么好的办法
库存和账户余额类似,以前做银行应用时,会增加一个日间账户余额,是变动的。整个流程由账户余额、日间账户余额‘日间明细三个组成。日间明细随便增加、减少或删除,同时记录日间账户余额,晚上批量记账并更新账户余额,核对一致后,换日并确认账户余额继续使用。
这样的好处是,日间明细增减删不涉及真正的账务,仅仅是发生额,日终一次性写入已经确定的明细记录,还可以随时查看日间账户余额。不需要每次都去统计一下。
类似tanqth的做法,仅做参考。
进销存当然要三个表,这是逻辑问题,与数据量大小无关。
进销数据按照财务原则就是账本,是不能删改的(如果数据录入错误只能冲账),数据量大的话可以按年度保存。
入库出库的时候就直接修改库存表了,可以用存储过程实现。
专门建立一个库存表,当有出入库的时候,在库存表里记录一下库存变化。最后你需要的就是直接查询库存记录表里的数据。
还有一种,每天对库存进行一次自动汇总,需要查询时,只需要结合前一天汇总的数据与当天的出入库数据进行处理,这样需要处理的数据量会小很多。