计算价格 程序处理 :
有产品表TBL_Schema,产品价格有很多零件构成(TBL_SchemaDetial),零件的价格常变,此时应该更新产品的价格。
一个产品的更新要涉及 材料表(TBL_StoreMaterial,存在材料的价格) ,价格登记表(TBL_TypePiceManage , 要查两次利润和损耗)。要更新价格(TBL_Schema).
要求:客户说计算太慢,所以要测试一个最有方案
其中方法1和方法2有点区别 方法2一次查出数据, //方法1分两次查出数据,两次差不多。
/*************入口点**********/
private void UpdateSchemaNewPrice()
{
try
{
string strCon = GetSchemaCondition();
string strSql = string.Format("Select SchemaNo,PriceClass, DevelopType,NetWeight From TBL_Schema Where SchemaNo is not null And {0}",strCon);
DataSet ds = DataProvider.RunSelect(strSql);
if (ds == null || ds.Tables.Count <= 0 || ds.Tables[0].Rows.Count <= 0)
return ;
foreach (DataRow dr in ds.Tables[0].Rows)
{
int maxcount = ds.Tables[0].Rows.Count;
a_count ++ ;
string time = DateTime.Now.ToLongTimeString() + ":"+ DateTime.Now.Millisecond.ToString();
System.Diagnostics.Debug.WriteLine("当前行为:"+a_count.ToString() +"总数为:" + maxcount.ToString() + "时间:" + time);
string strSchemaNo = dr["SchemaNo"].ToString().Trim();
string strPriceClass = "C";
if (!dr.IsNull("PriceClass") && dr["PriceClass"].ToString().Trim() != "")
{
strPriceClass = dr["PriceClass"].ToString().Trim();
}
if (strSchemaNo != "" && strPriceClass != "")
{
string Developtype = dr["DevelopType"].ToString().Substring(0,2);
//add 2003-7-26 8:51 按公斤来处理利润的增量
Decimal NetWeight = (Decimal)dr["NetWeight"];
//GET NewPrice And price0MatNos;
Decimal newprice = 0.00m;
string price0MatNos = "";
bool IsNo802 = cklNo802.Items[0].Selected;
newprice = Price.GetNewPrice(strSchemaNo,strPriceClass,Developtype,NetWeight,IsNo802,ref price0MatNos);
time = DateTime.Now.ToLongTimeString() + ":"+ DateTime.Now.Millisecond.ToString();
System.Diagnostics.Debug.WriteLine("1当前行为:"+a_count.ToString() +"总数为:" + maxcount.ToString() + "时间:" + time);
//update TBL_Schema newprice,priceMemo
string UpClass = string.Format("Update TBL_Schema Set PriceClass = 'C' Where SchemaNo = '{0}' And (PriceClass = '' Or PriceClass is null)",strSchemaNo);
string Upprice = string.Format("Update TBL_Schema Set NewPrice = {0},PriceMemo = '{1}' Where SchemaNo = '{2}'",newprice.ToString(),price0MatNos,strSchemaNo);
strSql = string.Format("{0};{1}",UpClass,Upprice);
int iret = DataProvider.RunSQL(strSql);
time = DateTime.Now.ToLongTimeString() + ":"+ DateTime.Now.Millisecond.ToString();
System.Diagnostics.Debug.WriteLine("2当前行为:"+a_count.ToString() +"总数为:" + maxcount.ToString() + "时间:" + time);
}
}
labelSer.InnerHtml = "配方新价格计算完成!现在可以关闭页面!";
}
catch
{}
}
public static Decimal GetNewPrice(string strSchemaNo,string strPriceClass ,string Developtype,Decimal NetWeight,bool IsNo802,ref string price0MatNos)
{
Decimal A_Increase = 0.00m;
Decimal A_rate = 0.00m;
//方法2,
//DataSet ds = GetPriceDs(strSchemaNo);
//方法1
DataSet ds = GetPriceDs(strSchemaNo,strPriceClass,Developtype,IsNo802);
if (ds == null || ds.Tables[0].Rows.Count <= 0 || ds.Tables[1] == null)
return 0;
////获得最初成本价,没有用到
//Decimal Baseprice = Convert.ToDecimal(ds.Tables[0].Rows[0]["Baseprice"]);
Decimal SalePrice = Convert.ToDecimal(ds.Tables[0].Rows[0]["SalePrice"]);
//每分价格按公斤来计算
//sum(materialNo * weight) / netweight
SalePrice = SalePrice /NetWeight;
//方法1
try
{
A_Increase = Convert.ToDecimal(ds.Tables[2].Rows[0]["InCrease"]);
A_rate = Convert.ToDecimal(ds.Tables[3].Rows[0]["Rate"]);
}
catch
{}
//方法2
//Get_Rate_Increase(ref A_rate ,ref A_Increase,strPriceClass,Developtype);
if (A_rate == 0 && A_Increase == 0)
return 0;
Decimal Schemapice = Decimal.Round(A_rate * SalePrice,1)+ A_Increase;
decimal Schebaseprice = Decimal.Round(SalePrice,1);
//成本价大于销售价则销售价=成本价
if (Schebaseprice > Schemapice)
Schemapice = Schebaseprice;
try
{
if (ds.Tables[1] != null && ds.Tables[1].Rows.Count > 0 )
{
string MatNos = "";
foreach (DataRow dr in ds.Tables[1].Rows)
{
if (MatNos != "")
{
MatNos += ",";
}
MatNos += dr["MaterialNo"].ToString().Trim();
}
if (MatNos != "")
{
price0MatNos = string.Format("其中{0}的价格为0",MatNos);
}
}
}
catch
{}
return Schemapice;
}
/*************入口点**********/
/***************方法1********************/
public static DataSet GetPriceDs(string StrSchemaNo,string strPriceClass,string Developtype,bool IsNo802)
{
if (StrSchemaNo.Trim() == "")
return null;
string DefaultCon = string.Format(" TBL_StockMaterial.MaterialNo = TBL_SchemaDetail.MaterialNo ");
string StrCondi = string.Format(" {0} And TBL_SchemaDetail.SchemaNo = \'{1}\' ",DefaultCon,StrSchemaNo);
if (IsNo802)
{
StrCondi += string.Format(" And TBL_StockMaterial.Type <> 802 ");
}
//指导价
string Groupby = string.Format(" Group By TBL_SchemaDetail.SchemaNo ");
string Selsqlprice = string.Format(" Select Sum(TBL_StockMaterial.Price*TBL_SchemaDetail.MaterialWeight) As Baseprice ,Sum(TBL_StockMaterial.SalePrice*TBL_SchemaDetail.MaterialWeight) As SalePrice From TBL_StockMaterial INNER JOIN TBL_SchemaDetail ON ({0}) {1}",StrCondi,Groupby);
//价格备注
string sel0PriceMaterialNo = string.Format(" Select TBL_SchemaDetail.MaterialNo ,TBL_StockMaterial.SalePrice From TBL_StockMaterial INNER JOIN TBL_SchemaDetail On {0} And TBL_StockMaterial.SalePrice=0 ",StrCondi);
int DevelopTypeNo = Convert.ToInt32(Developtype)*10;
int developtypenoAdd1 = DevelopTypeNo + 1;
string fieldstr = strPriceClass;
//损耗率
string RateSql = string.Format("Select {0} as InCrease from TBL_TypePiceManage where SpeciNo = {1}",fieldstr,DevelopTypeNo);
//利润
string IncreateSql = string.Format("Select {0} as Rate from TBL_TypePiceManage where SpeciNo = {1}",fieldstr,developtypenoAdd1);
string Selsql = string.Format("{0};{1};{2};{3}",Selsqlprice,sel0PriceMaterialNo,RateSql,IncreateSql);
return DataProvider.RunSelect(Selsql);
}
/***************方法1********************/
/***************方法2********************/
private void Get_Rate_Increase(ref Decimal A_rate,ref Decimal A_Increase,string strPriceClass,string Developtype)
{
int DevelopTypeNo = Convert.ToInt32(Developtype)*10;
int developtypenoAdd1 = DevelopTypeNo + 1;
try
{
string fieldstr = strPriceClass;
string selSql0 = string.Format("Select {0} as InCrease from TBL_TypePiceManage where SpeciNo = {1}",fieldstr,DevelopTypeNo);
string selSql1 = string.Format("Select {0} as Rate from TBL_TypePiceManage where SpeciNo = {1}",fieldstr,developtypenoAdd1);
string selSql = string.Format("{0};{1}",selSql0,selSql1);
DataSet ds = DataProvider.RunSelect(selSql);
A_Increase = Convert.ToDecimal(ds.Tables[0].Rows[0]["InCrease"]);
A_rate = Convert.ToDecimal(ds.Tables[1].Rows[0]["Rate"]);
}
catch
{}
}
private DataSet GetPriceDs(string StrSchemaNo)
{
if (StrSchemaNo.Trim() == "")
return null;
string DefaultCon = string.Format(" TBL_StockMaterial.MaterialNo = TBL_SchemaDetail.MaterialNo ");
string StrCondi = string.Format(" {0} And TBL_SchemaDetail.SchemaNo = \'{1}\' ",DefaultCon,StrSchemaNo);
string Groupby = string.Format(" Group By TBL_SchemaDetail.SchemaNo ");
string Selsqlprice = string.Format(" Select Sum(TBL_StockMaterial.Price*TBL_SchemaDetail.MaterialWeight) As Baseprice ,Sum(TBL_StockMaterial.SalePrice*TBL_SchemaDetail.MaterialWeight) As SalePrice From TBL_StockMaterial,TBL_SchemaDetail Where ({0}) {1}",StrCondi,Groupby);
string sel0PriceMaterialNo = string.Format(" Select TBL_StockMaterial.MaterialNo ,TBL_StockMaterial.SalePrice From TBL_StockMaterial INNER JOIN TBL_SchemaDetail On {0} ",StrCondi);
string Selsql = string.Format("{0};{1}",Selsqlprice,sel0PriceMaterialNo);
return DataProvider.RunSelect(Selsql);
}
当前行为:603总数为:2542时间:11:02:50:671
1当前行为:603总数为:2542时间:11:02:51:93
2当前行为:603总数为:2542时间:11:02:51:218
当前行为:604总数为:2542时间:11:02:51:218
1当前行为:604总数为:2542时间:11:02:51:625
2当前行为:604总数为:2542时间:11:02:51:750
当前行为:605总数为:2542时间:11:02:51:750
1当前行为:605总数为:2542时间:11:02:52:171
2当前行为:605总数为:2542时间:11:02:52:312
当前行为:606总数为:2542时间:11:02:52:312
1当前行为:606总数为:2542时间:11:02:52:750
2当前行为:606总数为:2542时间:11:02:52:890
当前行为:607总数为:2542时间:11:02:52:890
1当前行为:607总数为:2542时间:11:02:53:359
2当前行为:607总数为:2542时间:11:02:53:484
当前行为:608总数为:2542时间:11:02:53:484
1当前行为:608总数为:2542时间:11:02:53:937
2当前行为:608总数为:2542时间:11:02:54:78
当前行为:609总数为:2542时间:11:02:54:78
1当前行为:609总数为:2542时间:11:02:54:515
2当前行为:609总数为:2542时间:11:02:54:656
当前行为:610总数为:2542时间:11:02:54:656
1当前行为:610总数为:2542时间:11:02:55:78
2当前行为:610总数为:2542时间:11:02:55:218
当前行为:611总数为:2542时间:11:02:55:218
1当前行为:611总数为:2542时间:11:02:55:640
2当前行为:611总数为:2542时间:11:02:55:781
当前行为:612总数为:2542时间:11:02:55:781
1当前行为:612总数为:2542时间:11:02:56:312
2当前行为:612总数为:2542时间:11:02:56:468
当前行为:613总数为:2542时间:11:02:56:468
1当前行为:613总数为:2542时间:11:02:56:906
2当前行为:613总数为:2542时间:11:02:57:46
当前行为:614总数为:2542时间:11:02:57:46
1当前行为:614总数为:2542时间:11:02:57:468
2当前行为:614总数为:2542时间:11:02:57:625
当前行为:615总数为:2542时间:11:02:57:625
1当前行为:615总数为:2542时间:11:02:58:62
2当前行为:615总数为:2542时间:11:02:58:187
当前行为:616总数为:2542时间:11:02:58:187
1当前行为:616总数为:2542时间:11:02:58:640
2当前行为:616总数为:2542时间:11:02:58:781
当前行为:617总数为:2542时间:11:02:58:781
1当前行为:617总数为:2542时间:11:02:59:218
2当前行为:617总数为:2542时间:11:02:59:375
当前行为:618总数为:2542时间:11:02:59:375
1当前行为:618总数为:2542时间:11:02:59:796
2当前行为:618总数为:2542时间:11:02:59:937
当前行为:619总数为:2542时间:11:02:59:937
1当前行为:619总数为:2542时间:11:03:00:359
2当前行为:619总数为:2542时间:11:03:00:515
2、利用存储过程,来计算价格
private int DoUpPriceBySP()
{
string strCondi = "";
for(int i= 0;i < cklType.Items.Count;i ++)
{
if (cklType.Items[i].Selected)
{
string aval = cklType.Items[i].Value.Trim();
if (strCondi.Trim() != "")
{
strCondi += " Or ";
}
strCondi += string.Format(" DevelopType like \''{0}%\'' ",aval);
}
}
strCondi = string.Format("( {0} )",strCondi);
string Sql = string.Format("EXEC RS_UpSchemaNewPrice '{0}',0",strCondi);
if (cklNo802.Items[0].Selected)
{
Sql = string.Format("EXEC RS_UpSchemaNewPrice '{0}',1",strCondi);
}
return DataProvider.RunSQL(Sql);
}
CREATE PROCEDURE dbo.RS_UpSchemaNewPrice
(
@strCondi varchar(300),
@Is802 int
)
AS
if (@strCondi = '')
begin
return -1
end
create table #TempDt
(
pkid int identity(1,1) not null,
SchemaNo varchar(32),
PriceClass varchar(10),
DevelopType int,
NetWeight decimal
)
create table #TempSonDt
(
pkid int identity(1,1) not null,
DecTemp decimal
)
declare @SchemaNo varchar(32),@strSel1 varchar(800)
declare @strDefCon varchar(500),@strSel varchar(800)
set @strDefCon = ' SchemaNo in (Select Schemano From TBL_SchemaDetail Inner Join TBL_StockMaterial On TBL_StockMaterial.MaterialNo = TBL_SchemaDetail.MaterialNo And TBL_StockMaterial.PriceChange = 1) '
--set @strDefCon = ' (Select Schemano From TBL_SchemaDetail Inner Join TBL_StockMaterial On TBL_StockMaterial.MaterialNo = TBL_SchemaDetail.MaterialNo And TBL_StockMaterial.PriceChange = 1) '
set @strDefCon = @strDefCon + ' And ' + @strCondi
--set @strSel = 'Select Distinct SchemaNo, PriceClass, DevelopType, NetWeight into #TempDt(SchemaNo, PriceClass, DevelopType, NetWeight) From TBL_Schema Where SchemaNo is not null And ' + @strDefCon
set @strSel = 'InSert into #TempDt(SchemaNo, PriceClass, DevelopType, NetWeight) Select Distinct SchemaNo, PriceClass, DevelopType, NetWeight From TBL_Schema Where SchemaNo is not null And ' + @strCondi
EXEC(@strSel)
declare @count int , @icount int
set @count =( select count(*) from #TempDt)
set @icount =1
Declare myCursor Cursor for
Select SchemaNo From #TempDt
Open myCursor
Fetch Next From myCursor into @SchemaNo
While (@@Fetch_Status =0)
begin
set @strSel = 'nowcount:' + convert(varchar(4),@icount) + 'maxcount' + convert(varchar(4),@count) + 'time:' + convert(varchar(30),getdate(),114)
print @strSel
insert into table1(Mycount,Memo) values(@icount,@strSel)
set @icount = @icount +1
declare @PriceClass varchar(8) ,@DevelopType int , @NetWeight decimal
declare @Rate decimal,@InCrease decimal,@NewPrice decimal,@PriceMemo varchar(200),@tempMemo varchar(200)
Select @PriceClass = PriceClass, @DevelopType = DevelopType, @NetWeight = NetWeight
From #TempDt Where SchemaNo = @SchemaNo
if (@Is802 = 1)
begin
Select @NewPrice = Sum(TBL_StockMaterial.SalePrice*TBL_SchemaDetail.MaterialWeight)
From TBL_StockMaterial
INNER JOIN TBL_SchemaDetail
ON TBL_StockMaterial.MaterialNo = TBL_SchemaDetail.MaterialNo
And TBL_SchemaDetail.SchemaNo = @SchemaNo
And TBL_StockMaterial.Type <> 802
Group By TBL_SchemaDetail.SchemaNo
end
else
begin
Select @NewPrice = Sum(TBL_StockMaterial.SalePrice*TBL_SchemaDetail.MaterialWeight)
From TBL_StockMaterial
INNER JOIN TBL_SchemaDetail
ON TBL_StockMaterial.MaterialNo = TBL_SchemaDetail.MaterialNo
And TBL_SchemaDetail.SchemaNo = @SchemaNo
Group By TBL_SchemaDetail.SchemaNo
end
set @PriceMemo = ''
set @tempMemo = ''
Declare mySonCursor Cursor for
Select TBL_SchemaDetail.MaterialNo
From TBL_StockMaterial
INNER JOIN TBL_SchemaDetail
ON TBL_StockMaterial.MaterialNo = TBL_SchemaDetail.MaterialNo
And TBL_SchemaDetail.SchemaNo = @SchemaNo
And TBL_StockMaterial.SalePrice=0
Open mySonCursor
Fetch Next From mySonCursor into @tempMemo
While (@@Fetch_Status =0)
begin
if (@PriceMemo <> '')
begin
set @PriceMemo = @PriceMemo + ','
end
set @PriceMemo = @PriceMemo + @tempMemo
Fetch Next From mySonCursor into @tempMemo
end
Close mySonCursor
Deallocate mySonCursor
if (@PriceMemo <> '')
begin
set @PriceMemo = '其中' + @PriceMemo + '的价格为0'
end
set @strSel = 'InSert into #TempSonDt(DecTemp) Select ' + @PriceClass + ' from TBL_TypePiceManage where SpeciNo = ' + convert(varchar(8),@DevelopType)
EXEC(@strSel)
Select @InCrease = DecTemp From #TempSonDt
delete From #TempSonDt
--set @InCrease =EXEC(@strSel)
set @DevelopType = @DevelopType / 10
set @DevelopType = (@DevelopType * 10) + 1
set @strSel = 'InSert into #TempSonDt(DecTemp) Select ' + @PriceClass + ' from TBL_TypePiceManage where SpeciNo = ' + convert(varchar(8),@DevelopType)
EXEC(@strSel)
Select @Rate = DecTemp From #TempSonDt
delete From #TempSonDt
--set @Rate = EXEC(@strSel)]
--每分价格按公斤来计算
--sum(materialNo * weight) / netweight
set @NewPrice = @NewPrice / @NetWeight
--(sum(materialNo * weight) / netweight ) * @Rate + @InCrease
set @NewPrice = @Rate * @NewPrice + @InCrease
Update TBL_Schema Set PriceClass = 'C' Where SchemaNo = @SchemaNo And (PriceClass = '' Or PriceClass is null)
Update TBL_Schema Set NewPrice = @NewPrice,PriceMemo = @PriceMemo Where SchemaNo =@SchemaNo
Fetch Next From myCursor into @SchemaNo
end
Close myCursor
Deallocate myCursor
delete From #TempDt
GO
414 10 nowcount:10maxcount2549time:10:13:48:403
415 11 nowcount:11maxcount2549time:10:13:48:763
416 12 nowcount:12maxcount2549time:10:13:49:140
417 13 nowcount:13maxcount2549time:10:13:49:500
418 14 nowcount:14maxcount2549time:10:13:49:873
419 15 nowcount:15maxcount2549time:10:13:50:200
420 16 nowcount:16maxcount2549time:10:13:50:577
421 17 nowcount:17maxcount2549time:10:13:50:950
422 18 nowcount:18maxcount2549time:10:13:51:293
423 19 nowcount:19maxcount2549time:10:13:51:670
424 20 nowcount:20maxcount2549time:10:13:52:043
425 21 nowcount:21maxcount2549time:10:13:52:403
426 22 nowcount:22maxcount2549time:10:13:52:750
427 23 nowcount:23maxcount2549time:10:13:53:107
428 24 nowcount:24maxcount2549time:10:13:53:483
429 25 nowcount:25maxcount2549time:10:13:53:827
/*****************线程**********/
private void threadUpdateSchemaNewPrice()
{
System.Threading.Thread thFreshPrice = new System.Threading.Thread(new System.Threading.ThreadStart(UpdateSchemaNewPrice));
thFreshPrice.Start();
}
/*****************线程**********/
最后选择用程序处理产生新价格,
1、程序有保护try...catch..一条没有成功不会,有影响
2、相差不是很大,数据库本身有很多弱点
3、asp.net可以把处理交给线程来做,做过试验,如果aspnet_wp.exe活着,不进行重新生成解决方案(生成解决方案没有影响)主页面关闭,线程能继续运行。
4、程序中控制方便可以更灵活的利用条件进行限制。
说明:还是没办法,一次要产生2000个的新价格,要用16分钟