📄 ordcomm.pas.svn-base
字号:
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 + -