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

📄 ordcomm.pas.svn-base

📁 这是一个功能齐全的,代码完整的ERP企业信息管理系统,现在上传和大家分享
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
unit OrdComm;

interface

uses
  Classes, SysUtils, Controls, Windows, Forms, ComCtrls, CommCtrl, DBGrids,
  Messages, Graphics, ADODB, ActiveX, SYSDATA, Dialogs, atScript, CommFun,
  atPascal, Variants, StdCtrls, DB;

//取得销售价格和总额折扣函数:
procedure GetSalePrice(AOrderInfo:TOrderInfo; var APriceInfo:TPriceInfo);
//取得特殊价格及总额折扣
function GetSpecPrice(ASpecNo:Integer;AOrderInfo:TOrderInfo;var APriceInfo:TPriceInfo):Boolean;
//取得特价记录的设置信息 并 检验是否符合条件
function CheckSpecInfo(ASpecNo,AItemClass,ACustClass,ACustGrade,ASaleGrade:Integer;AOrderInfo:TOrderInfo;var ASpecInfo:TSpecInfo):Boolean;

//切分字符串
procedure SplitString(s: string; Separator: char;Terms: TStringList);
//替换变量
function ReplaceVariable(AString, AAddre, ACompany, ACurrency,APlace,APayment:string;ATotal,ADiscount:Double): string;
//取得条款信息
procedure GetTerm(AAddre, ACompany, ACurrency,APlace,APayment: string;ATotal,ADiscount:Double;var Terms: TStringList);
//去掉S中的回车返行符
procedure StrTruncateCRLF(var S: string);
//取得所有客户分类列表
procedure GetAllCustClass(ADataSet: TADODataSet; AcbClass: TComboBox);
//报价单生成销售定单
procedure CreateOrder(ACode:String);
//销售定单生成采购定单
procedure CreatePurchase(ACode:String);

//加入销售产品
procedure AddItemLine(AOrderInfo:TOrderInfo;AItemInfo:TItemInfo;ADataSet:TADODataSet;AType:String='UPD');

//取得所有任务类别
procedure GetAllSellsClass(AcbClass:TComboBox);
//取得有销售类别及其所有子类的电脑编号
function GetChildSell(ATasClass:string):string;

//更新报价单的状态,当销售定单删除时,删除前调用
//AOrder:销售单号
procedure UpdataOrd500(AOrder:String);


implementation

uses PurComm;

//取得标准价格
function GetStandardOrdPrice(AOrderInfo:TOrderInfo):Double;
var
  AUnitRate,ARate,APrice:Double;
begin
  //1.取得计量单位换算率
  AUnitRate:=GetUnitRate(AOrderInfo.CustNo,AOrderInfo.ItemNo,AOrderInfo.UnitNo);
  
  //2.取得幣別彙率
  ARate:=GetCurrencyRate(AOrderInfo.CurrNo);

  //3.取得价格
  //3A.取得需求币别的价格
  SYSDM.qryQuery.Close;
  SYSDM.qryQuery.SQL.Clear;
  SYSDM.qryQuery.SQL.Add('select top 1 O130_004 from ORD130,GLD100');
  SYSDM.qryQuery.SQL.Add('where O130_002=G100_001 and O130_001='+IntToStr(AOrderInfo.ItemNo));
  SYSDM.qryQuery.SQL.Add(' and O130_003<='+GetDateString(AOrderInfo.OrderDate));
  SYSDM.qryQuery.SQL.Add(' and G100_001='+IntToStr(AOrderInfo.CurrNo));
  SYSDM.qryQuery.SQL.Add('order by O130_003 desc');
  SYSDM.qryQuery.Open;
  if not SYSDM.qryQuery.IsEmpty then
  begin
    APrice:=SYSDM.qryQuery.FieldByName('O130_004').AsFloat;
    ARate:=1;
  end else
  //3B.取得本位币的价格,并换算成需求的币别价格,即价格=本位币价格/币别汇率
  begin
    SYSDM.qryQuery.Close;
    SYSDM.qryQuery.SQL.Clear;
    SYSDM.qryQuery.SQL.Add('select top 1 O130_004 from ORD130,GLD100');
    SYSDM.qryQuery.SQL.Add('where O130_002=G100_001 and O130_001='+IntToStr(AOrderInfo.ItemNo));
    SYSDM.qryQuery.SQL.Add(' and O130_003<='+GetDateString(AOrderInfo.OrderDate));
    SYSDM.qryQuery.SQL.Add(' and G100_002='+''''+ACurrID+'''');
    SYSDM.qryQuery.SQL.Add('order by O130_003 desc');
    SYSDM.qryQuery.Open;
    APrice:=SYSDM.qryQuery.FieldByName('O130_004').AsFloat;
  end;
  
  //4.计算价格
  APrice:=APrice*AUnitRate;
  APrice:=APrice/ARate;
  Result:=APrice;
end;

//AType:类型 0=料品分类,1=客户分类,2=地区
function IsInclude(AParent,AChild,AType:Integer):Boolean;
var
  AStringList:TStringList;
begin
  AStringList:=TStringList.Create;
  AStringList.Add(IntToStr(AParent));
  case AType of
    0:GetChild(IntToStr(AParent),'INV120','I120_004','I120_001',AStringList);
    1:GetChild(IntToStr(AParent),'ORD110','O110_003','O110_001',AStringList);
    2:GetChild(IntToStr(AParent),'ORD120','O120_003','O120_001',AStringList);
  end;
  Result:=AStringList.IndexOf(IntToStr(AChild))<>-1;
  AStringList.Free;
end;

//取得所有上级类别
//AType:类型 0=料品分类,1=客户分类,2=地区
procedure GetParentNo(AChild,AType:Integer; var AStringList:TStringList);
begin
  AStringList.Add(IntToStr(AChild));
  case AType of
    0:GetAllParent(IntToStr(AChild),'INV120','I120_004','I120_001',AStringList);
    1:GetAllParent(IntToStr(AChild),'ORD110','O110_003','O110_001',AStringList);
    2:GetAllParent(IntToStr(AChild),'ORD120','O120_003','O120_001',AStringList);
  end;
end;

//取得特价记录的设置信息 并 检验是否符合条件
function CheckSpecInfo(ASpecNo,AItemClass,ACustClass,ACustGrade,ASaleGrade:Integer;AOrderInfo:TOrderInfo;var ASpecInfo:TSpecInfo):Boolean;
begin
  Result:=False;
  SYSDM.qryQuery.Close;
  SYSDM.qryQuery.SQL.Clear;
  SYSDM.qryQuery.SQL.Add('select * from ORD140A where O140A_001='+IntToStr(ASpecNo));
  SYSDM.qryQuery.Open;
  if SYSDM.qryQuery.IsEmpty then Exit;
  ASpecInfo.AType:=SYSDM.qryQuery.FieldByName('O140A_004').AsInteger;
  ASpecInfo.AFromDate:=SYSDM.qryQuery.FieldByName('O140A_005').AsDateTime;
  ASpecInfo.AToDate:=SYSDM.qryQuery.FieldByName('O140A_006').AsDateTime;
  ASpecInfo.ACurr:=SYSDM.qryQuery.FieldByName('O140A_007').AsString;
  ASpecInfo.AIsSum:=SYSDM.qryQuery.FieldByName('O140A_008').AsBoolean;
  ASpecInfo.AItemNo:=SYSDM.qryQuery.FieldByName('O140A_011').AsInteger;
  ASpecInfo.AItemClass:=SYSDM.qryQuery.FieldByName('O140A_012').AsInteger;
  ASpecInfo.ACustNo:=SYSDM.qryQuery.FieldByName('O140A_013').AsInteger;
  ASpecInfo.ACustClass:=SYSDM.qryQuery.FieldByName('O140A_014').AsInteger;
  ASpecInfo.ACustGrade:=SYSDM.qryQuery.FieldByName('O140A_015').AsInteger;
  ASpecInfo.ASaleNo:=SYSDM.qryQuery.FieldByName('O140A_016').AsInteger;
  ASpecInfo.ASaleGrade:=SYSDM.qryQuery.FieldByName('O140A_017').AsInteger;
  ASpecInfo.ARegionNo:=SYSDM.qryQuery.FieldByName('O140A_018').AsInteger;
  ASpecInfo.AIsSame:=SYSDM.qryQuery.FieldByName('O140A_019').AsBoolean;
  ASpecInfo.ARange:=SYSDM.qryQuery.FieldByName('O140A_020').AsInteger;
  ASpecInfo.AAmtType:=SYSDM.qryQuery.FieldByName('O140A_021').AsInteger;

  //日期在生效和失效范围内
  if (AOrderInfo.OrderDate<ASpecInfo.AFromDate) or (AOrderInfo.OrderDate>ASpecInfo.AToDate) then Exit;
  //币别编号(币别相符,或为空)
  if (ASpecInfo.ACurr<>'') and (ASpecInfo.ACurr<>IntToStr(AOrderInfo.CurrNo)) then Exit;
  //料品编号(料品相符,或为空)
  if (ASpecInfo.AItemNo<>0) and (ASpecInfo.AItemNo<>AOrderInfo.ItemNo) then Exit;
  //料品分类(料品分类相符,或为空,或属于其子类)
  if (ASpecInfo.AItemClass<>0) and (ASpecInfo.AItemClass<>AItemClass) and (not IsInclude(ASpecInfo.AItemClass,AItemClass,0)) then Exit;
  //客户编号(客户相符,或为空)
  if (ASpecInfo.ACustNo<>0) and (ASpecInfo.ACustNo<>AOrderInfo.CustNo) then Exit;
  //客户分类(客户分类相符,或为空,或属于其子类)
  if (ASpecInfo.ACustClass<>0) and (ASpecInfo.ACustClass<>ACustClass) and (not IsInclude(ASpecInfo.ACustClass,ACustClass,1)) then Exit;
  //客户级别(客户级别相符,或为空)
  if (ASpecInfo.ACustGrade<>0) and (ASpecInfo.ACustGrade<>ACustGrade) then Exit;
  //销售员号(销售员相符,或为空)
  if (ASpecInfo.ASaleNo<>0) and (ASpecInfo.ASaleNo<>AOrderInfo.SaleNo) then Exit;
  //销售员级别(销售员级别相符,或为空)
  if (ASpecInfo.ASaleGrade<>0) and (ASpecInfo.ASaleGrade<>ASaleGrade) then Exit;
  //交货地区(交货地区相符,或为空,或属于其子类)
  if (ASpecInfo.ARegionNo<>0) and (ASpecInfo.ARegionNo<>AOrderInfo.RegionNo) and (not IsInclude(ASpecInfo.ARegionNo,AOrderInfo.RegionNo,2)) then Exit;
  Result:=True;
end;

//取得特殊价格及总额折扣
function GetSpecPrice(ASpecNo:Integer;AOrderInfo:TOrderInfo;var APriceInfo:TPriceInfo):Boolean;
var
  ASpecInfo:TSpecInfo;
  AItemClass,ACustClass,ACustGrade,ASaleGrade,ANo,I:Integer;
  AValue,Amount:Double;
  AStringList:TStringList;
  AIsExists:Boolean;
begin
  Result:=False;
  //1.取得料品分类、客户分类、客户级别、销售员级别
  SYSDM.qryQuery.Close;
  SYSDM.qryQuery.SQL.Clear;
  SYSDM.qryQuery.SQL.Add('select I150_005 from INV150 where I150_001='+IntToStr(AOrderInfo.ItemNo));
  SYSDM.qryQuery.Open;
  AItemClass:=SYSDM.qryQuery.Fields[0].AsInteger;
  SYSDM.qryQuery.Close;
  SYSDM.qryQuery.SQL.Clear;
  SYSDM.qryQuery.SQL.Add('select O150_010,O150_041 from ORD150 where O150_001='+IntToStr(AOrderInfo.CustNo));
  SYSDM.qryQuery.Open;
  ACustClass:=SYSDM.qryQuery.Fields[0].AsInteger;
  ACustGrade:=SYSDM.qryQuery.Fields[1].AsInteger;
  SYSDM.qryQuery.Close;
  SYSDM.qryQuery.SQL.Clear;
  SYSDM.qryQuery.SQL.Add('select H150_024 from HRM150 where H150_001='+IntToStr(AOrderInfo.SaleNo));
  SYSDM.qryQuery.Open;
  ASaleGrade:=SYSDM.qryQuery.Fields[0].AsInteger;

  //2.取得特价记录的设置信息 并 检验是否符合条件
  if not CheckSpecInfo(ASpecNo,AItemClass,ACustClass,ACustGrade,ASaleGrade,AOrderInfo,ASpecInfo) then Exit;
  APriceInfo.IsBySum:=ASpecInfo.AIsSum;

  Amount:=0;
  case ASpecInfo.AAmtType of
    0:Amount:=AOrderInfo.LineSumAmt;  //0=销售总额=定单行销售总额
    1:Amount:=AOrderInfo.LineSumAmt-AOrderInfo.LineDisAmt;  //1=定单总额=定单行销售总额-定单行总折扣额
    2:Amount:=AOrderInfo.LineSumAmt-AOrderInfo.LineDisAmt+AOrderInfo.ChargeAmt;  //2=应收总额=定单总额+特殊费用
    3:Amount:=AOrderInfo.LineSumAmt-AOrderInfo.LineDisAmt-AOrderInfo.OrdDisAmt;  //3=折后总额=定单总额-定单总折扣额
    4:Amount:=AOrderInfo.LineSumAmt-AOrderInfo.LineDisAmt+AOrderInfo.ChargeAmt-AOrderInfo.OrdDisAmt;  //4=净应收额=定单总额+特殊费用-定单总折扣额
  end;
  APriceInfo.Amount:=Amount;

  //3.依据特价类型计算其数量或金额
  AValue:=0;
  case ASpecInfo.AType of
    0:AValue:=AOrderInfo.OrderQty;  //0=基于数量的折扣率
    1:AValue:=AOrderInfo.OrderQty;  //1=基于数量的價格
    2:AValue:=AOrderInfo.OrderQty*APriceInfo.StdPrice;  //2=基于金额的折扣率
    3:AValue:=AOrderInfo.OrderQty*APriceInfo.StdPrice;  //3=基于金额的價格
  end;
  if ASpecInfo.AIsSum then AValue:=Amount;

  //4.取得应用对象的编号
  ANo:=0;
  case ASpecInfo.ARange of
    0:ANo:=AOrderInfo.ItemNo;  //0=料品编号
    1:ANo:=AItemClass;  //1=料品分类
    2:ANo:=AOrderInfo.CustNo;  //2=客户编号
    3:ANo:=ACustClass;  //3=客户分类
    4:ANo:=ACustGrade;  //4=客户级别
    5:ANo:=AOrderInfo.SaleNo;  //5=销售员号
    6:ANo:=ASaleGrade;  //6=销售员级别
    7:ANo:=AOrderInfo.RegionNo;  //7=交货地区
  end;

  //5.取得所有上级类别的编号
  AStringList:=TStringList.Create;
  case ASpecInfo.ARange of
    1:GetParentNo(ANo,0,AStringList);
    3:GetParentNo(ANo,1,AStringList);
    7:GetParentNo(ANo,2,AStringList);
  else
    AStringList.Add(IntToStr(ANo));
  end;

  //取得适用范围的编号
  AIsExists:=False;
  SYSDM.qryQuery.Close;
  SYSDM.qryQuery.SQL.Clear;
  SYSDM.qryQuery.SQL.Add('select * from ORD140B where O140B_001='+IntToStr(ASpecNo));
  SYSDM.qryQuery.Open;
  if not SYSDM.qryQuery.IsEmpty then
  begin
    //按级别一级一级向上查找
    for I:=0 to AStringList.Count-1 do
    begin
      if SYSDM.qryQuery.Locate('O140B_003',AStringList[I],[]) then
      begin
        ANo:=SYSDM.qryQuery.FieldByName('O140B_003').AsInteger;
        AIsExists:=True;
        Break;
      end;
    end;
  end;

  if (not SYSDM.qryQuery.IsEmpty) and (not AIsExists) then Exit;
  if (SYSDM.qryQuery.IsEmpty) or (ASpecInfo.AIsSame) then ANo:=0;

  SYSDM.qryQuery.Close;
  SYSDM.qryQuery.SQL.Clear;
  SYSDM.qryQuery.SQL.Add('select * from ORD140C where O140C_001='+IntToStr(ASpecNo)+' and O140C_002='+IntToStr(ANo)+' order by O140C_003 desc');
  SYSDM.qryQuery.Open;
  while not SYSDM.qryQuery.Eof do
  begin
    if AValue>=SYSDM.qryQuery.FieldByName('O140C_003').Value then
    begin
      if ASpecInfo.AIsSum then  //总额折扣
      begin
        case ASpecInfo.AType of
          0://0=基于数量的折扣率
            begin
              APriceInfo.DisAmt:=Amount*SYSDM.qryQuery.FieldByName('O140C_004').Value;
              APriceInfo.OrdPrice:=Amount*SYSDM.qryQuery.FieldByName('O140C_004').Value;
            end;
          1://1=基于数量的价格
            begin
              APriceInfo.DisAmt:=SYSDM.qryQuery.FieldByName('O140C_004').Value;
              APriceInfo.OrdPrice:=SYSDM.qryQuery.FieldByName('O140C_004').Value;
            end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -