⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 invcomm.pas.svn-base

📁 这是一个功能齐全的,代码完整的ERP企业信息管理系统,现在上传和大家分享
💻 SVN-BASE
📖 第 1 页 / 共 4 页
字号:
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 + -