📄 invcomm.pas.svn-base
字号:
unit InvComm;
interface
uses
Classes, SysUtils, Controls, Windows, Forms, ComCtrls,CommCtrl,DBGrids, DB,
Messages, Graphics, ADODB, ActiveX, SYSDATA, Dialogs, StdCtrls, Variants;
//取得料品的库存单位
//AItemNo:料品电脑编号
function GetInvUnit(AItemNo:Integer):Integer;
//取得料品的采购单位
//AItemNo:料品电脑编号
procedure GetPurUnit(AItemNo:Integer;var APurUnit:Integer;APurUnitID,APurUnitName:String; var APurRate:Double);
//取得料品的销售单位
//AItemNo:料品电脑编号
procedure GetOrdUnit(AItemNo:Integer;var AOrdUnit:Integer;AOrdUnitID,AOrdUnitName:String; var AOrdRate:Double);
//取得料品的库存数量、单位价格、库存金额
//AWhsNo:仓库电脑编号
//ALocNo:库位电脑编号
//AItemNo:料品电脑编号
procedure GetItemQPA(AWhsNo,ALocNo,AItemNo:Integer;var AQty,APrice,AAmount:Double);
//更新库存余额表(INV501)
//进出单据和转仓单据新增、修改、删除时调用
//调用说明:
// 该函数必须再更新完库存流水(INV500)表后,才可调用
// 新增时,在单据保存后调用一次
// 修改时,在单据保存前调用一次,在单据保存后再调用一次
// 删除时,在单据删除前调用一次
// 注:该函数中已按“移动加权平均法”计算出库存单价
//ACode:单据编号
//AType:单据类型,'INV500'=出入仓单,'INV510'=转仓单
procedure UpdateBanlance(ACode,AType:String);
//更新料品流水帐表(INV500)的库存数量(I500_014)、库存单价(I500_015)、库存金额(I500_016)字段
//进出单据和转仓单据新增、修改、删除时调用
//调用说明:
// 新增时,在单据保存后调用一次
// 修改时,在单据保存前调用一次,在单据保存后再调用一次
// 删除时,在单据删除前调用一次
// 注:该函数中已按“移动加权平均法”计算出库存单价
//ACode:单据编号
//AType:单据类型,'INV500'=出入仓单,'INV510'=转仓单
//AMode: 更新状态,ADD=新增,DEL=删除
procedure UpdateInvBookBanlance(ACode,AType,AMode:String);
//更新与进出仓单关联的来源单据(采购定单、销售定单、车间定单、进出仓单)的已收发量及单据状态
//ACode:单据编号
//AMode: 更新状态,ADD=新增,DEL=删除
procedure UpdateOrderData(ACode,AMode:String);
//更新流水帐表
//ACode:单据编号
//AType:单据类型,'INV500'=出入仓单,'INV510'=转仓单
//AMode: 更新状态,ADD=新增,DEL=删除
procedure UpdateInv500(ACode,AType,AMode:String;ASeqNo:Integer);
//更新相关的数据,当进出仓单更新时
//ACode:单据编号
//AType:单据类型,'INV500'=出入仓单,'INV510'=转仓单
//AMode: 更新状态,ADD=新增,DEL=删除
procedure UpdateInv500B(ACode,AType,AMode:String;ASeqNo:Integer);
//更新进出仓单的应收发数量 I500B_013
//在新增、修改、删除进出仓单时,必须更新其后面的进出仓单的应收发数量
//ACode:单据编号
procedure UpdateInv500BOrdQty(ACode:string);
//查看料品是否已经设置了期初建账
function IsItemIni(AWhsNo,ALocNo,AItemNo:Integer):Boolean;
//设置了期初建账的料品是否已经被其他单据使用
function IsItemUsed(AwhsNo,AlocNo,AitemNo:Integer):Boolean;
//判断库存是否足够出库
function CheckQty(ACustNo,AWhsNo,ALocNo,AItemNo,AUnitNo,AType:Integer;ANum:double;AOrderNo:string):Boolean;
//更新盘点计划的“盘点完成”标识
//ACode: 盘点汇报单号
procedure UpdateCountFlag(ACode:String;ABoolean:Boolean);
//取得料品的期初库存、单价、金额
procedure GetItemOpenValue(AWhsNo,ALocNo,AItemNo:Integer;ADate:TDateTime;var ABanlance,APrice,AAmount:Double);
//取得所有物料的出入数量及库存数量
procedure GetAllItemInvBalance(ADOQuery:TADOQuery;AWhsNo,ALocNo:Integer;AFromDate,AToDate:TDateTime);
//取得仓库的料品的期初数量
procedure GetOpenData(ADataSet:TADODataSet;AWhsNo,ALocNo:Integer;AFromDate:TDateTime);
//入仓&出仓数量
procedure GetInOutData(ADataSet:TADODataSet;AWhsNo,ALocNo:Integer;AFromDate,AToDate:TDateTime);
//取得所有仓库和库位列表
procedure GetAllWhs(AcbWhs:TComboBox); overload;
//取得所有仓库和库位列表
procedure GetAllWhs(ADataSet:TADODataSet;AcbClass:TComboBox); overload;
//取得最后的盘点日期
function GetLastCountDate(AItemNo:Integer):TDateTime;
//反写料品资料表中的盘点日期字段 INV150.I150_038=INV610A.I610A_004
procedure UpdateLastDate(AType,ACode:String);
implementation
uses CommFun;
//取得料品的库存单位--从料品资料中取得库存单位?
//AItemNo:料品电脑编号
function GetInvUnit(AItemNo:Integer):Integer;
begin
SYSDM.qryQuery.Close;
SYSDM.qryQuery.SQL.Clear;
SYSDM.qryQuery.SQL.Add('select I150_011 from INV150');
SYSDM.qryQuery.SQL.Add('where I150_001='+IntToStr(AItemNo));
SYSDM.qryQuery.Open;
if SYSDM.qryQuery.IsEmpty then
begin
ShowMsg('UMS10000455'); //无效的料品编号,料品资料表中不存在该料品的相关信息
Abort;
end;
Result:=SYSDM.qryQuery.Fields[0].AsInteger;
end;
//取得料品的采购单位
//AItemNo:料品电脑编号
procedure GetPurUnit(AItemNo:Integer;var APurUnit:Integer;APurUnitID,APurUnitName:String; var APurRate:Double);
begin
SYSDM.qryQuery.Close;
SYSDM.qryQuery.SQL.Clear;
SYSDM.qryQuery.SQL.Add('select I150_012,I150_013,I140_002,I140_003 from INV150,INV140');
SYSDM.qryQuery.SQL.Add('where I150_012=I140_001 and I150_001='+IntToStr(AItemNo));
SYSDM.qryQuery.Open;
if SYSDM.qryQuery.IsEmpty then
begin
ShowMsg('UMS10000455'); //无效的料品编号,料品资料表中不存在该料品的相关信息
Abort;
end;
APurUnit:=SYSDM.qryQuery.FieldByName('I150_012').AsInteger;
APurUnitID:=SYSDM.qryQuery.FieldByName('I140_002').AsString;
APurUnitName:=SYSDM.qryQuery.FieldByName('I140_003').AsString;
APurRate:=SYSDM.qryQuery.FieldByName('I150_013').AsFloat;
end;
//取得料品的销售单位
//AItemNo:料品电脑编号
procedure GetOrdUnit(AItemNo:Integer;var AOrdUnit:Integer;AOrdUnitID,AOrdUnitName:String; var AOrdRate:Double);
begin
SYSDM.qryQuery.Close;
SYSDM.qryQuery.SQL.Clear;
SYSDM.qryQuery.SQL.Add('select I150_014,I150_015,I140_002,I140_003 from INV150,INV140');
SYSDM.qryQuery.SQL.Add('where I150_012=I140_001 and I150_001='+IntToStr(AItemNo));
SYSDM.qryQuery.Open;
if SYSDM.qryQuery.IsEmpty then
begin
ShowMsg('UMS10000455'); //无效的料品编号,料品资料表中不存在该料品的相关信息
Abort;
end;
AOrdUnit:=SYSDM.qryQuery.FieldByName('I150_014').AsInteger;
AOrdUnitID:=SYSDM.qryQuery.FieldByName('I140_002').AsString;
AOrdUnitName:=SYSDM.qryQuery.FieldByName('I140_003').AsString;
AOrdRate:=SYSDM.qryQuery.FieldByName('I150_015').AsFloat;
end;
//取得料品的库存数量、单位价格、库存金额
//AWhsNo:仓库电脑编号
//ALocNo:库位电脑编号
//AItemNo:料品电脑编号
procedure GetItemQPA(AWhsNo,ALocNo,AItemNo:Integer;var AQty,APrice,AAmount:Double);
begin
SYSDM.qryQuery.Close;
SYSDM.qryQuery.SQL.Clear;
SYSDM.qryQuery.SQL.Add('select I501_005,I501_006,I501_007 from INV501');
SYSDM.qryQuery.SQL.Add('where I501_001='+IntToStr(AWhsNo));
SYSDM.qryQuery.SQL.Add(' and I501_002='+IntToStr(ALocNo));
SYSDM.qryQuery.SQL.Add(' and I501_003='+IntToStr(AItemNo));
SYSDM.qryQuery.Open;
AQty:=SYSDM.qryQuery.FieldByName('I501_005').AsFloat;
APrice:=SYSDM.qryQuery.FieldByName('I501_006').AsFloat;
AAmount:=SYSDM.qryQuery.FieldByName('I501_007').AsFloat;
end;
//更新库存余额表(INV501)
//进出单据和转仓单据新增、修改、删除时调用
//调用说明:
// 该函数必须再更新完库存流水(INV500)表后,才可调用
// 新增时,在单据保存后调用一次
// 修改时,在单据保存前调用一次,在单据保存后再调用一次
// 删除时,在单据删除前调用一次
// 注:该函数中已按“移动加权平均法”计算出料品的库存单价
//ACode:单据编号
//AType:单据类型,'INV500'=出入仓单,'INV510'=转仓单
procedure UpdateBanlance(ACode,AType:String);
var
AFromQuery,AToQuery:TADOQuery;
AWhsNo,ALocNo,AItemNo:Integer;
AQty,AAmount:Double;
AHasLoc,AOutHasLoc,AInHasLoc:Boolean;
begin
AFromQuery:=TADOQuery.Create(nil);
AFromQuery.Connection:=SYSDM.ADOC;
AToQuery:=TADOQuery.Create(nil);
AToQuery.Connection:=SYSDM.ADOC;
//1.删除料品的库存余额记录(仅处理单据中包含的所有料品)
AFromQuery.Close;
AFromQuery.SQL.Clear;
if AType='INV500' then //出入仓单
begin
AHasLoc:=IsExists('select 1 from INV110,INV500A where I110_002=I500A_010');
AFromQuery.SQL.Add('delete from INV501 where ');
AFromQuery.SQL.Add('exists(select 1 from INV500A,INV500B where I500A_001=I500B_001 and');
AFromQuery.SQL.Add(' I501_001=I500A_010 and I501_003=I500B_003 and I500A_001='+''''+ACode+'''');
if AHasLoc then AFromQuery.SQL.Add(' and I501_002=I500B_008 ');
AFromQuery.SQL.Add(')');
end else
if AType='INV510' then //转仓单
begin
AOutHasLoc:=IsExists('select 1 from INV110,INV510A where I110_002=I510A_005');
AInHasLoc:=IsExists('select 1 from INV110,INV510A where I110_002=I510A_007');
AFromQuery.SQL.Add('delete from INV501 where ');
AFromQuery.SQL.Add('exists(select 1 from INV510A,INV510B where I510A_001=I510B_001 and');
AFromQuery.SQL.Add(' I501_001=I510A_005 and I501_003=I510B_003 and I510A_001='+''''+ACode+'''');
if AOutHasLoc then AFromQuery.SQL.Add(' and I501_002=I510B_010 ');
AFromQuery.SQL.Add(') or ');
AFromQuery.SQL.Add('exists(select 1 from INV510A,INV510B where I510A_001=I510B_001 and');
AFromQuery.SQL.Add(' I501_001=I510A_007 and I501_003=I510B_003 and I510A_001='+''''+ACode+'''');
if AInHasLoc then AFromQuery.SQL.Add(' and I501_002=I510B_011 ');
AFromQuery.SQL.Add(')');
end;
AFromQuery.ExecSQL;
//2.更新料品的库存余额记录(仅处理单据中包含的所有料品)
AToQuery.Close;
AToQuery.SQL.Clear;
AToQuery.SQL.Add('select * from INV501');
AToQuery.Open;
AFromQuery.Close;
AFromQuery.SQL.Clear;
if AType='INV500' then //出入仓单
begin
AFromQuery.SQL.Add('select I500_007 as FWhsNo,I500_008 as FLocNo,I500_009 as FItemNo,I500_010 as FUnitNo,I500_004 as FType,sum(I500_011) as FQty,I500_012 as FPrice,sum(I500_013) as FAmount');
AFromQuery.SQL.Add('from INV500 where I500_001='+''''+ACode+'''');
AFromQuery.SQL.Add('group by I500_007,I500_008,I500_009,I500_010,I500_004,I500_012');
AFromQuery.SQL.Add('order by I500_007,I500_008,I500_009,I500_010,I500_004,I500_012');
end else
if AType='INV510' then //转仓单
begin
AFromQuery.SQL.Add('select I500_007 as FWhsNo,I500_008 as FLocNo,I500_009 as FItemNo,I500_010 as FUnitNo,I500_004 as FType,sum(I500_011) as FQty,I500_012 as FPrice,sum(I500_013) as FAmount');
AFromQuery.SQL.Add('from INV500 where I500_001='+''''+ACode+'''');
AFromQuery.SQL.Add('group by I500_007,I500_008,I500_009,I500_010,I500_004,I500_012');
AFromQuery.SQL.Add('order by I500_007,I500_008,I500_009,I500_010,I500_004,I500_012');
end;
AFromQuery.Open;
while not AFromQuery.Eof do
begin
AWhsNo:=AFromQuery.FieldByName('FWhsNo').AsInteger;
ALocNo:=AFromQuery.FieldByName('FLocNo').AsInteger;
AItemNo:=AFromQuery.FieldByName('FItemNo').AsInteger;
if not AToQuery.Locate('I501_001;I501_002;I501_003',VarArrayOf([AWhsNo,ALocNo,AItemNo]),[]) then
AToQuery.Append
else
AToQuery.Edit;
AToQuery.FieldByName('I501_001').Value:=AWhsNo; //仓库编号
AToQuery.FieldByName('I501_002').Value:=ALocNo; //库位编号
AToQuery.FieldByName('I501_003').Value:=AItemNo; //料品编号
AToQuery.FieldByName('I501_004').Value:=AFromQuery.FieldByName('FUnitNo').Value; //计量单位
AQty:=AFromQuery.FieldByName('FQty').Value;
AAmount:=AFromQuery.FieldByName('FAmount').AsFloat;
if AFromQuery.FieldByName('FType').AsInteger=2 then //0=期初,1=入库,2=出库,3=调整
begin
AQty:=AQty*-1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -