我开发了一套MRP系统 ( 积分: 100 )

  • 主题发起人 主题发起人 littlefish_yxp
  • 开始时间 开始时间
L

littlefish_yxp

Unregistered / Unconfirmed
GUEST, unregistred user!
本人和几个搞软件的朋友,仿照金蝶K3系统开发了一套MRP系统,包含基础资料、计划系统、销售系统、采购系统、库存系统、车间管理等几个部分,现寻求合作者继续完善此系统,同时如果需要MRP的朋友,我们愿意提供服务。如有诚意我们愿意提供测试版。请打电话0769-7818052 或13712007543 QQ:36509199 联系人:于生
 
本人和几个搞软件的朋友,仿照金蝶K3系统开发了一套MRP系统,包含基础资料、计划系统、销售系统、采购系统、库存系统、车间管理等几个部分,现寻求合作者继续完善此系统,同时如果需要MRP的朋友,我们愿意提供服务。如有诚意我们愿意提供测试版。请打电话0769-7818052 或13712007543 QQ:36509199 联系人:于生
 
老大,没有生产怎么能算MRP系统?
目前的充其量只能算一个全一点的进销存系统!
 
MPR到处都是,脱离实际,没有用
 
计算物料需求(MRP)运算速度很慢,其中服务器的CPU占用老是100%,有没有什么好的解决办法?
1 其中BOM太概就五六层吧,第一层物料很多,有四五十种物料吧,
2 太概每次运算就五六种产品一起运算吧
3 其中运算结果出来需要半个小时到一个小时;
4 并且运算过程其他用户登陆系统超慢;
5 有时用户取到运算过程中用的表就会提示超时过期
老兄,请帮忙看一下这个MRP运算中有什么好的方法解决;
 
到处都是mrpII,erp.唉..不明白在做些什么?
这个东西写出来了有几个公司用得上了?有的公司赶时髦,也ERP一下,结果全部的投入换来了大量的培训,然后无功而返.
 
楼主,网上有MRP的原代码了,你的有什么特点吗?
 
哪里有MPR的原代码
 
MRP计算速度本来就慢,我的软件经过测试,计算100个订单,每个订单大概有物料20个,
总共要发时间15-20分钟.超时过期的解决办法设定ADO的CommandTimeOut=0即可.
下面是我的BOM表结构:
--BOM主表(ICBOM)
CREATE TABLE dbo.ICBOM
(
FInterID int NOT NULL, --内码
FBOMNumber varchar(300) NOT NULL, --BOM表编号
FUseStatus int DEFAULT 1073 NULL, --使用状态
FVersion varchar(300) DEFAULT '1.0' NOT NULL, --版本号
FParentID int NULL, --父结点
FItemID int NOT NULL, --物料内码
FQty decimal(28,10) NOT NULL, --数量
FYield decimal(28,10) NULL, --成品率
FCheckerID int NULL, --审核人
FCheckDate datetime NULL, --审核日期
FOperatorID int NULL, --操作人员
FEnterTime datetime NOT NULL, --建立日期
FStatus smallint NOT NULL, --状态
FCancellation bit DEFAULT 0 NOT NULL, --作废标记
FTranType int DEFAULT 50 NOT NULL, --单据类型
FRoutingID int DEFAULT 0 NOT NULL, --默认工艺路线
FNote varchar(300) DEFAULT '' NOT NULL, --备注
CONSTRAINT Prm_ICBOM
PRIMARY KEY CLUSTERED (FInterID)
ON [PRIMARY]
)

CREATE UNIQUE INDEX Unq_ICBOM
ON dbo.ICBOM(FBOMNumber)
ON [PRIMARY]
go
CREATE TRIGGER [ICBOM_DEL] ON [dbo].[ICBOM] FOR DELETE AS
DELETE a FROM ICBomChild a,DELETED b WHERE a.FInterID=b.FInterID
--BOM表从表
CREATE TABLE dbo.ICBOMChild
(
FInterID int NOT NULL, --内码
FEntryID int NOT NULL, --序号
FItemID int NOT NULL, --物料内码
FAuxQty decimal(28,10) DEFAULT 0 NOT NULL, --用量
FQty decimal(28,10) DEFAULT 0 NOT NULL, --基本单位用量
FScrap decimal(28,10) NOT NULL, --损耗率
FOperID int DEFAULT 0 NOT NULL, --工序
FMachinePos varchar(300) NULL, --工位
FNote varchar(300) NULL, --备注
FMaterielType int DEFAULT 371 NOT NULL, --物料类型
FOffSetDay decimal(28,10) DEFAULT 0 NOT NULL, --提前期偏置
FBackFlush int DEFAULT 1059 NOT NULL, --是否倒冲
FStockID int DEFAULT 0 NULL, --仓库
CONSTRAINT Prm_ICBOMChild
PRIMARY KEY CLUSTERED (FInterID,FEntryID)
ON [PRIMARY]
)

CREATE TRIGGER [t_ICBomChild] ON [dbo].[ICBOMChild]
FOR INSERT,UPDATE AS
UPDATE a SET a.FQty=b.FAuxQty FROM ICBomChild a,INSERTED b
WHERE a.FInterID=b.FInterID AND a.FEntryID=b.FEntryID
--BOM多阶展开的代码
CREATE procedure PlanMutiBOMExpand
(
@BOMInterID int, --BOM表内码
@Order smallint, --排序方式 0 自然顺序 ,1 物料代码,2 物料名称
@Succeed smallint output, --是否成功
@Reason varchar(400) output --失败原因
)
AS
set nocount on
declare
@BOMMaxLevel smallint,
@BOMLevel smallint,
@SelectRows int,
@ParentBOMInterID int,
@FBOMInterID int,
@ParentNeedQty decimal(28,14),
@ParentIndex int,
@ParentItemID int,
@ParentHaveMrp int,
@ParentLevelString varchar(200),
@ParentBomLevel int,
@FItemType int

--创建临时表
create table #MutiData(
FIndex int identity, --内码
FEntryID int, --序号
FBOMInterID int, --BOM内码
FItemID int, --物料内码
FNeedQty decimal(28,14) default(0) NULL, --需求量
FBOMLevel int NULL, --阶次
FParentID int default(0) NULL, --父结点内码
FRate decimal(28,14) default(0) NULL, --比率
FScrap decimal(28,14) default(0) NULL, --损耗率
FHaveMrp smallint default(0) NULL, --展开标记
FItemType int NULL, --项的类型
FLevelstring varchar(50) NULL, --显示阶次
FOperID int NULL, --工序
FMachinePos varchar(300) NULL, --工位
FNote varchar(300) NULL, --备注
FMaterielType int NULL, --子项类型
FOffSetDay decimal(28,10) NULL, --提前期偏置
FBackFlush int NULL, --是否倒冲
FStockID int NULL --仓库
)
create table #MutiParentItem(
FIndex int identity,
FEntryID int,
FBOMInterID int,
FItemID int,
FNeedQty decimal(28,14) default(0) NULL,
FBOMLevel int NULL,
FParentID int default(0) NULL,
FRate decimal(28,14) default(0) NULL,
FScrap decimal(28,14) default(0) NULL,
FHaveMrp smallint default(0) NULL,
FItemType int,
FLevelstring varchar(50) NULL,
FOperID int NULL,
FMachinePos varchar(300) NULL,
FNote varchar(300) NULL,
FMaterielType int NULL,
FOffSetDay decimal(28,10) NULL,
FBackFlush int NULL,
FStockID int NULL
)

select @BOMMaxLevel=50
select @BOMLevel=0
select @selectRows=0
select @Succeed=0
select @Reason=''

--把要展开的BOM表放入临时表#MutiParentItem中
insert into #MutiParentItem(FBOMInterID,FItemID,FNeedQty,FBOMLevel,FParentID,FItemType)
select a.FInterID,a.FItemID,a.FQty,0,0,b.FErpClsID FItemtype from ICBOM a inner join t_ICITem b on a.FItemID=b.FItemID
where (b.FErpClsID=2 or b.FErpClsID=3 or b.FErpClsID=5) and a.FInterID=@BOMInterID
select top 1 @FBOMInterID=u1.FBOMInterID,@ParentIndex=u1.FIndex,@ParentItemID=u1.FItemID,@ParentNeedQty=u1.FNeedQty,
@ParentBOMLevel=u1.FBOMLevel,@ParentHaveMrp=u1.FHaveMrp,@ParentLevelString=u1.FLevelString,@FItemType=FItemType
from #MutiParentItem u1 order by FIndex desc

select @SelectRows=count(*) from #MutiParentItem
while(@BOMLevel<@BOMMaxLevel and @SelectRows>0)
begin
set @SelectRows=0
select top 1 @Parentindex=u1.FIndex,@ParentItemID=u1.FItemID,@ParentNeedQty=u1.FNeedQty,@ParentBOMLevel=u1.FBOMLevel,
@FItemType=FItemType,@ParentHaveMrp=u1.FHaveMrp,@ParentLevelString=u1.FLevelString
from #MutiParentItem u1 order by FIndex desc
if @ParentHaveMrp>0
begin
insert into #mutidata(FEntryID,FBOMInterID,FItemID,FNeedQty,FBOMLevel,FParentID,FRate,FScrap,FLevelString,FItemType,
FOperID,FMachinePos,FNote,FMaterielType,FOffSetDay,FBackFlush,FStockID)
select u1.FEntryID,u1.FBOMInterID,u1.FItemID,u1.FNeedQty,u1.FBOMLevel,u1.FParentiD,u1.FRate,u1.FScrap,
u1.FLevelstring,u1.FItemType,u1.FOperID,u1.FMachinePos,u1.FNote,u1.FMaterielType,u1.FOffSetDay,u1.FBackFlush,u1.FStockID
from #MutiParentItem u1 where u1.FIndex=@ParentIndex
delete from #MutiParentItem where FIndex=@ParentIndex
end else
begin
update #MutiParentItem set FHaveMrp=1 where FIndex=@ParentIndex
set @SelectRows=0
set @BOMLevel=@ParentBOMLevel+1
if @BOMLevel=50
select @ParentHaveMrp=1
if @Order=0 --自然排序
insert into #MutiParentItem(FEntryID,FBOMInterID,FItemID,FNeedQty,FBOMLevel,FParentiD,FRate,FScrap,FItemType,
FOperID,FMachinePos,FNote,FMaterielType,FOffSetDay,FBackFlush,FStockID)
select v2.FEntryID,v2.FInterID,v2.FItemID,convert(decimal(28,14),@ParentNeedQty)*convert(decimal(28,14),(v2.FQty/v1.FQty)) FNeedQty,
(@BOMLevel) FBOMLevel,@ParentIndex FPartentID,v2.FQty/v1.FQty FRate,v2.FScrap,t1.FErpClsID FItemType,
v2.FOperID,v2.FMachinePos,v2.FNote,v2.FMaterielType,v2.FOffSetDay,v2.FBackFlush,v2.FStockID
from ICBOM v1,ICBOMChild v2,t_ICItem t1
where v1.FItemID=@ParentItemID and v2.FInterID=v1.FInterID and v1.FUseStatus=1072 and t1.FItemID=v2.FitemID
else

if @Order=1
insert into #MutiParentItem(FEntryID,FBOMInterID,FItemID,FNeedQty,FBOMLevel,FParentiD,FRate,FScrap,FItemType,
FOperID,FMachinePos,FNote,FMaterielType,FOffSetDay,FBackFlush,FStockID)
select v2.FEntryID,v2.FInterID,v2.FItemID,convert(decimal(28,14),@ParentNeedQty)*convert(decimal(28,14),(v2.FQty/v1.FQty)) FNeedQty,
(@BOMLevel) FBOMLevel,@ParentIndex FPartentID,v2.FQty/v1.FQty FRate,v2.FScrap,t1.FErpClsID FItemType,
v2.FOperID,v2.FMachinePos,v2.FNote,v2.FMaterielType,v2.FOffSetDay,v2.FBackFlush,v2.FStockID
from ICBOM v1,ICBOMChild v2,t_ICItem t1
where v1.FItemID=@ParentItemID and v2.FInterID=v1.FInterID and v1.FUseStatus=1072 and t1.FItemID=v2.FitemID
order by t1.FNumber
else
insert into #MutiParentItem(FEntryID,FBOMInterID,FItemID,FNeedQty,FBOMLevel,FParentiD,FRate,FScrap,FItemType,
FOperID,FMachinePos,FNote,FMaterielType,FOffSetDay,FBackFlush,FStockID)
select v2.FEntryID,v2.FInterID,v2.FItemID,convert(decimal(28,14),@ParentNeedQty)*convert(decimal(28,14),(v2.FQty/v1.FQty)) FNeedQty,
(@BOMLevel) FBOMLevel,@ParentIndex FPartentID,v2.FQty/v1.FQty FRate,v2.FScrap,t1.FErpClsID FItemType,
v2.FOperID,v2.FMachinePos,v2.FNote,v2.FMaterielType,v2.FOffSetDay,v2.FBackFlush,v2.FStockID
from ICBOM v1,ICBOMChild v2,t_ICItem t1
where v1.FItemID=@ParentItemID and v2.FInterID=v1.FInterID and v1.FUseStatus=1072 and t1.FItemID=v2.FitemID
order by t1.FName
end
select @SelectRows=count(*) from #MutiParentItem
end
if @BOMLevel>=50
begin
set @Succeed=1
set @Reason='BOM结构不安全,可能出现嵌套!BOM展开无法继续!'
end
update #Mutidata set FLevelstring=replicate('.',FBOMLevel)+convert(varchar(4),FBOMLevel)

select a.FLevelstring,a.FItemID,b.FShortNumber FItemIDNumber,b.FName,b.FModel,b.FUnitID,c.FName FUnitIDName,a.FNeedQty,a.FRate,a.FScrap,
a.FOperID,d.FName FOperIDName,a.FMachinePos,a.FNote,a.FMaterielType,e.FName FMaterielTypeName,
a.FOffSetDay,a.FBackFlush, f.FName FBackFlushName,a.FStockID,g.FName FStockIDName,b.FUseState,h.FName FUseStateName
from #MutiData a
LEFT JOIN t_ICItem b on a.FItemID=b.FItemID
LEFT JOIN t_MeasureUnit c on b.FUnitID=c.FItemID
LEFT JOIN t_SubMessage d on a.FOperID=d.FInterID
Left Join t_SubMessage e on a.FMaterielType=e.FInteriD
Left Join t_SubMessage f on a.FBackFlush=f.FInterID
left join t_Stock g on a.FStockID=g.FItemID
Left join t_SubMessage h on b.FUseState=h.FInterID
where a.FLevelstring<>'0' order by FIndex desc
drop table #MutiParentitem
drop table #MutiData
return

参考了K3的代码
 
To: chenminghong
网上有大把,我手上都不下十套,有点名气的ERP的源代码网上都能找到。
天心、鼎新、新世纪
在GOOGLE上都可以找到下载
 
关键你把它变成自己的东西,这点很重要!网上大把,没办法用
 
能做出来就行,不用吵!
想要的就联系,不想要的多知道一条信息也没什么不好的!
是吧?
 
既然做出来了
可以去推销一下
 
starfarm:
您老的联系方式?
 
计算物料需求(MRP)运算速度很慢,其中服务器的CPU占用老是100%,有没有什么好的解决办法?
1 其中BOM太概就五六层吧,第一层物料很多,有四五十种物料吧,
2 太概每次运算就五六十种产品一起运算吧
3 其中运算结果出来需要半个小时到一个小时;
4 并且运算过程其他用户登陆系统超慢;
5 有时用户取到运算过程中用的表就会提示超时过期
有没有办法解决CPU老是占用100%的问题啊? 服务器是IBM的专用服务器啊?配置已经是非常好的配置啊?
 
我觉得这种东西是理论上提提的,实际执行起来要受到很多因素的制约,编程要多去企业了解,否则程序写了没有什么用武之地,这是我的实际的经验。
我做过一个大的风动工具制造企业的erp,他有200多种机械产品,每种产品由100-300种零件组成,一个零件可能同时装在多个产品上,即借用件。其它为专用件和采购件。零件种数接近一万种。
客户的设计部的零件信息和仓库部门、销售部门、财务部门的资料历史遗留下来,一直未统一,各自编写物料信息,物料编号不统一。
而且客户备货也不是完全按照订单,而是按照月计划来备货的,这样时间充裕些。
 
我是搞物流及财务的,需要各方力量合作,请联系jlsoft@126.com并提供相关资料.QQ:303639297
 
对于我来说,能卖出去就是好东西,卖不出去就是大垃圾,所以MRP就是卖不出去。
 
后退
顶部