我有一个进销存程序,在出库验单的时候减库存,现在有个问题
我的数据结构如下kc(库存表)bh(序号):这是库存里的唯一标识
spdm:商品编码
kcl:库存量
***********************************
ckd(出库表)
djh:单据号
spdm:商品名称
bh:对应库存中这个商品的bh,这样就能确定唯一的这个张品了,即使有编码相同的不怕了,因为他们的bh肯定是不一样的。
sl:出库数量
******************************************
现在有这几个问题
1。在出库验单的时候显示的是这一张单据的汇总(一张单号下可能会有多个商品,但在出库验单界面只显示单号,进价合计,售价合计),通过虚选择拟加上flag(标识)来确定哪张单号进行出库(就类似打√和不打√的)。所以这是第一个循环 来一张一张单号的判断是否确认出库
2。正因为每张单号中可能会有多个商品,所以当判断到第一张单允许出库时,还要有个循环---循环找这张单中有几个商品。
当循环到第一张单的第一个商品时,还需要根据这个商品的bh来确定这个商品在库存的数量!------是的!对了 我是为了相减库存的
有以上问题 所以我的代码大至上是分2部分,一部分是update出库表,将未验单状态改成已验单状态,另一部分是循环减库存了,
但我现在的代码,只能对某一张单中的第一个商品减库存,如果该单的商品不止一个,他就不能再减了,请大家指点一下
我个人觉得是我begin end的结构有点问题,也就是有个end放错位置了,所有才不循环 请大家看看
procedure Tckys.btn6Click(Sender: TObject);
var i,kcl,j:Integer; d1:TDateTime; djh,spdm:string;
begin
d1:=u_pubvar.gettime(dm.qrygetdate);
qry_v_sumckd.First;
if dbgrdh1.SelectedField.AsBoolean=True then
begin
for i:=1 to qry_v_sumckd.RecordCount do
begin
try
dm.con1.BeginTrans;
with qry_kc do
begin
Close;
SQL.Clear;
SQL.Add('update ck_ckd set yd_date=:a,yd_user=:b,flag=1 where djh=:c');
Parameters.ParamByName('a').Value:=d1;
Parameters.ParamByName('b').Value:=dm.strngfld_userbm.Text;
Parameters.ParamByName('c').Value:=qry_v_sumckd.Fields[1].Text;
ExecSQL;
end;////////////////////////以上更新更新ckd中状态//////////////////////
with qry_djh do  //在ckd中找该djh中的出库商品明细
begin
close;
SQL.Clear;
SQL.Add('select * from ck_ckd where djh=:a');
Parameters.ParamByName('a').Value:=qry_v_sumckd.Fields[1].Text;
Open;
end;
///////////////查找该单号中有多少条记录/////////////////////////////
qry_djh.First;
for j:=1 to qry_djh.RecordCount do   //在明细单中循环找商品
begin
with qry_findkc do //打开库存表找该商品库存
begin
close;
SQL.Clear;
SQL.Add('select * from ck_kc where djh=:a');
Parameters.ParamByName('a').Value:=qry_djh.Fields[13].Text;
Open;
end;
kcl:=qry_findkc.Fields[3].AsInteger-qry_djh.Fields[8].AsInteger; //用库存量-请领量
if kcl>=0 then    //如果值大于0
begin
with qry_kc do
begin
close;
SQL.Clear;
SQL.Add('update ck_kc set kcl=:a where djh=:b and ckdm=:c');
Parameters.ParamByName('a').Value:=kcl;
Parameters.ParamByName('b').Value:=qry_djh.Fields[13].Text;
Parameters.ParamByName('c').Value:=qry_djh.Fields[2].Text;
ExecSQL;
end;
end              //如果库存小于0
else
begin
djh:='';
djh:='单据:'+qry_v_sumckd.Fields[1].Text+'验单失败!'+#13+'商品:【 '+qry_djh.Fields[5].Text+' 】  请领 '+qry_djh.Fields[8].Text+' '+qry_djh.Fields[7].Text+#13+'当前库存中该商品只剩余 '+qry_findkc.Fields[3].Text+' '+qry_djh.Fields[7].Text;
Application.MessageBox(PChar(djh),'实创软件',48);
dm.con1.Cancel;
Exit;
end;
qry_findkc.Next;
end;
djh:='';
djh:='单据:'+qry_v_sumckd.Fields[1].Text+'验单成功!';
dm.con1.CommitTrans;
Application.MessageBox(PChar(djh),'实创软件',64);
except
djh:='';
djh:='单据:'+qry_v_sumckd.Fields[1].Text+'验单失败!';
dm.con1.Cancel;
Application.MessageBox(PChar(djh),'实创软件',16);
Exit;
end;
qry_v_sumckd.Next;
end;
end;
with qry_v_sumckd do
begin
Close;
Open;
end;
end;
procedure Tckys.btn7Click(Sender: TObject);
begin
qry_findkc.Close;
qry_v_sumckd.Close;
qry_kc.Close;
qry_djh.Close;
tbl_dwdm.Close;
close;
end;