请看看这个进销存中先进先出和加权平均和函数(0分)

  • 主题发起人 主题发起人 nplang
  • 开始时间 开始时间
N

nplang

Unregistered / Unconfirmed
GUEST, unregistred user!
我刚在公共单模块写了个先进先出和加权平均和函数,头好乱,该休息一下了。请大家指点,交流。
环境:D6+SQLserver2000

我的E:npll1@163.com
//************************
// *按先进先出的方式减库存及核算利润;调用本函数时 spdm 表相应的 spam 位置已定义好
// *输入参数:进/出,单据号,日期,商品代码,商品名称,计量单位,单价,数量,供应商代码,供应商名称,有效期致
// *输出参数:temp_jhj ---- 出库时的成本价
// 用到的表:1》先进先出表(XJXC), 2》商品代码表(SPDM)3》上月库存表,4》
function xjxccl(temp_jc:boolean;temp_sl:real;temp_rq,temp_djh,temp_spdm,temp_spmc,temp_jldw,
temp_dj,temp_gysdm,temp_gysmc,temp_yxqz:string):real;
var
temp_jhj,nsl,nje:real;


begin
temp_jhj:=0;
DataM.ADODataSet1.Close;
DataM.ADODataSet1.CommandText:='select gyskhdm, gyskhmc, spdm, spmc, xsj, xsrq, jhj, jhrq from jggz
order by jhrq';
DataM.ADODataSet1.Open;
// DataM.ADODataSet1.Locate('spdm',temp_spdm,[])



if temp_jc then
begin
nsl:=temp_sl;
while not DataM.ADODataSet1.Eof do
begin
if DataM.ADODataSet1.Locate('spdm',temp_spdm,[]) and (nsl>0) then
begin
if DataM.ADODataSet1.FieldByName('sysl').Value<0 then
begin
nsl:=nsl+DataM.ADODataSet1.FieldByName('sysl').Value ;
if nsl>=0 then
begin
DataM.ADODataSet1.Edit;
DataM.ADODataSet1.FieldByName('sysl').Value:=0;
end
else
begin
DataM.ADODataSet1.edit;
DataM.ADODataSet1.FieldByName('sysl').Value:=nsl;
end;
end;
end;
DataM.ADODataSet1.Next;
end;
if nsl>0 then
begin
DataM.ADODataSet1.append;
DataM.ADODataSet1.FieldByName('djh').Value:=temp_djh;
DataM.ADODataSet1.FieldByName('rq').Value:=temp_rq;
DataM.ADODataSet1.FieldByName('gysdm').Value:=temp_gysdm;
DataM.ADODataSet1.FieldByName('gysmc').Value:=temp_gysmc;
DataM.ADODataSet1.FieldByName('spdm').Value:=temp_spdm;
DataM.ADODataSet1.FieldByName('spmc').Value:=temp_spmc;
DataM.ADODataSet1.FieldByName('jldw').Value:=temp_jldw;
DataM.ADODataSet1.FieldByName('dj').Value:=temp_dj;
DataM.ADODataSet1.FieldByName('sl').Value:=nsl;
DataM.ADODataSet1.FieldByName('sysl').Value:=nsl;
DataM.ADODataSet1.FieldByName('yxqz').Value:=temp_yxqz;
end;
end
else
begin
nsl:=temp_sl;
nje:=0;
while not DataM.ADODataSet1.Eof do
begin
if DataM.ADODataSet1.Locate('spdm',temp_spdm,[]) and (nsl>0) then
begin
if DataM.ADODataSet1.FieldByName('sysl').Value>0 then
begin
nsl:=nsl- DataM.ADODataSet1.FieldByName('sysl').Value;
if nsl<0 then
begin
nje:=nje+DataM.ADODataSet1.FieldByName('dj').Value*(DataM.ADODataSet1.FieldByName('sysl').Value+nsl);
DataM.ADODataSet1.Edit;
DataM.ADODataSet1.FieldByName('sysl').Value:=-nsl;
exit;
end
else
begin
nje:=nje+DataM.ADODataSet1.FieldByName('sysl').Value*DataM.ADODataSet1.FieldByName('dj').Value;
DataM.ADODataSet1.Edit;
DataM.ADODataSet1.FieldByName('sysl').Value:=0;
end;
end;

end;
DataM.ADODataSet1.Next;
end;
if nsl<>temp_sl then
if nsl>0 then
temp_jhj:=nje/(temp_sl-nsl)
else
temp_jhj:=nje/temp_sl
else
if DataM.table_zkc.FieldByName('bykcpj').Value<>0 then
temp_jhj:=DataM.table_zkc.FieldByName('bykcpj').Value
else
if DataM.table_zkc.FieldByName('ccj').Value<>0 then
temp_jhj:=DataM.table_zkc.FieldByName('ccj').Value
else
temp_jhj:=DataM.table_zkc.FieldByName('zjjhj').Value;
if DataM.table_zkc.FieldByName('byydpj').Value<>0 then
temp_jhj:=DataM.table_zkc.FieldByName('byydfp').Value
else
if DataM.table_zkc.FieldByName('ccj').Value<>0 then
temp_jhj:=DataM.table_zkc.FieldByName('ccj').Value
else
temp_jhj:=DataM.table_zkc.FieldByName('zjjhj').Value;
if nsl>0 then
begin
DataM.ADODataSet1.append;
DataM.ADODataSet1.FieldByName('djh').Value:=temp_djh;
DataM.ADODataSet1.FieldByName('rq').Value:=temp_rq;

DataM.ADODataSet1.FieldByName('spdm').Value:=temp_spdm;
DataM.ADODataSet1.FieldByName('spmc').Value:=temp_spmc;
DataM.ADODataSet1.FieldByName('jldw').Value:=temp_jldw;
DataM.ADODataSet1.FieldByName('dj').Value:=temp_dj;
DataM.ADODataSet1.FieldByName('sl').Value:=-nsl;
DataM.ADODataSet1.FieldByName('sysl').Value:=-nsl;

end;
end;
result:=temp_jhj;
end;
//*************************


 
怎么“此地我银三百两”就没人放一个屁?
 
说什么话。就你一个人有问题。人家就等着回答你的问题。真是莫明其妙。
 
什麼意思,我看不清
 
用function?
我的做法是做一个控制类.
 
看都没时间,更不要说运行了,你自己调试一下啦。
踢一脚
 
接受答案了.
 
后退
顶部