一种复合方式的产品计量单位表达与换算方法与流程

文档序号:12271259阅读:3458来源:国知局

本发明涉及计算机技术领域,具体地说是一种实用性强、复合方式的产品计量单位表达与换算方法。



背景技术:

在ERP系统中,产品的计量单位较多,包装也是各式各样;在销售和仓储的计算机系统中,能够方便的录入数量是至关重要的。一般情况下,每种产品会有两种包装单位,如某种药品,盒是基本单位,每300盒包装成1箱;如果在ERP系统中,数量单位设置成盒,那么销售数量、或库存数量过大,发货或盘点时不易读,和实物的箱数量对比时需要人工换算;如果设置成箱,整箱的数量管理较为容易,但对于非整箱部分,还是需要人工换算,且数量在转换时会产生误差(因为无法被300整除)。

基于上述需求,本发明设计出一种复合方式的产品计量单位表达与换算方法。



技术实现要素:

本发明的技术任务是针对以上不足之处,提供一种实用性强、复合方式的产品计量单位表达与换算方法。

一种复合方式的产品计量单位表达与换算方法,其实现过程为:

首先将产品数量的计量单位设置成两个,即基本计量单位和模块计量单位;

定义两种计量单位之间的换算率,以及是否进行复核计量的标志;

结合上述两种计量单位,定义复合计量单位为“模块计量单位·基本计量单位”,使用复合计量时,模块计量单位比基本计量单位大;在数量表达中,小数点前的整数部分为模块计量单位数量,小数点后面的小数部分为基本计量单位数量;

在ERP系统录入数量时首先确定是否使用复合计量,当采取复合计量的表达方式时将其录入系统中,计算机在后台保存时把复合数量转换为基本计量单位数量;在读取后台数量展示到界面时,把基本计量单位数量转换为复合计量单位数量。

在确定是否使用复合计量时,对于非复合计量换算的,通过十进制换算率关系在两个计量单位间进行数量的乘或除进行数量换算;对于复合计量换算的,从基本单位数量向复合单位数量转换时,先算出模块计量单位的整数部分,然后算出不足一个模块计量单位数量的基本单位下的剩余数量,对两个数量通过小数点结合在一块进行表达出复合数量。

对于复合计量换算的,从复合单位数量向基本单位数量转换时,先把小数点后面的数字直接转化为整数,加上小数点前整数部分乘以换算率得到的和,即为基本单位的数量。

本发明的一种复合方式的产品计量单位表达与换算方法,具有以下优点:

本发明提供的一种复合方式的产品计量单位表达与换算方法,该方法将同类型两个计量单位的数量数据结合在一块表达,使得数量在人机交互处理中能够方便快捷,易读易懂,同时使数量数据在计算机保存和处理过程中保持整数型数字,避免浮点型数量表达方式在两个计量单位间转换过程中带来的误差,与现有十进制小数表达相比,本发明具有数量表达易读、处理无误差的特点,实用性强,适用范围广泛,易于推广。

具体实施方式

下面结合具体实施例对本发明作进一步说明。

本发明提供一种复合方式的产品计量单位表达与换算方法。解决了ERP系统中数量在两个计量单位间转换和表达的问题,使得数量的数据易于表达,易于存储,易于转换且无任何误差产生,极大方便了业务在计算机中的处理和应用,具有很好的推广应用价值。

其实现过程为:

首先定义数量数据的两个计量单位:基本计量单位、模块计量单位。

定义两个计量单位间的换算率,以及是否进行复合计量标志。

定义复合计量单位为“模块计量单位·基本计量单位”。使用复合计量时,模块计量单位比基本计量单位大;在数量表达中,小数点前的整数部分为模块计量单位数量,小数点后面的小数部分为基本计量单位数量。

对于非复合计量换算的,通过十进制换算率关系在两个计量单位间进行数量的乘或除进行数量换算。

对于复合计量换算的,从基本单位数量向复合单位数量转换时,先算出模块计量单位的整数部分,然后算出不足一个模块计量单位数量的基本单位下的剩余数量,对两个数量通过小数点结合在一块进行表达出复合数量。

对于复合计量换算的,从复合单位数量向基本单位数量转换时,先把小数点后面的数字直接转化为整数,加上小数点前整数部分乘以换算率得到的和,即为基本单位的数量。

通过上述步骤,下面以实例说明:

某种药品,盒是基本单位,每300盒包装成1箱;产品的基本计量单位为“盒”,模块计量单位为“箱”,换算率为“1箱=300盒”,为复合计量换算,复合计算单位为“箱·盒”,如3箱200盒的数量表达为 “3.200”。在系统录入数量时采取复合计算单位表达方式录入,计算机在后台保存时把复合数量转换为基本计量单位数量;在读取后台数量展示到界面时,把基本计量单位数量转换为复合计量单位数量。

本发明基于计算机代码实现,其实现代码为:

/**********************************************

功能:通用计量单位换算函数

参数:

@PValue 需要换算的数

@Conv 换算率

@Flag 方向(0-除;1-乘)

@Precision 返回数值的精度

@IsComposite 是否复合计量 0否 1是

返回值:

换算后的数值

*/

creat function uf_UnitConvertUnit

(

@Value decimal(20,8), /*需要换算的数*/

@Conv varchar(20), /*换算率*/

@Flag char(1), /*方向(0-除;1-乘)*/

@Precision int, /*返回数值的精度*/

@Unit1Precision int, /*原计量单位的精度*/

@IsComposite char(1) /*是否复合计量 0否 1是*/

)

returns varchar(38)

as

begin

declare @Unit1Quantity decimal(20,8) /*需要换算的数*/

declare @ConvertRatio decimal(38,20) /*换算率*/

set @Unit1Quantity = cast(@Value as decimal(20,8))

set @ConvertRatio = cast(@Conv as decimal(20,8))

if(isnull(@ConvertRatio,0) = 0) return str('0',21,isnull(@Precision,0)) /*如果换算率为0,那么可能是不换算,所以直接return 0*/

/*如果传入数量为0则直接返回0*/

if @Unit1Quantity = 0 return str('0',21,isnull(@Precision,0))

declare @ReturnResult varchar(30)/*最终返回值*/

declare @CombineFlag char(1) /*复合标志*/

declare @Unit1Pres int /*传入计量单位的精度*/

set @CombineFlag = @IsComposite /*是否复合*/

/*如果是复合计量,且方向为0 除,表示传入的数量是基本数量,待换算出的数量为复合计量*/

if(@Flag = '0' and @IsComposite = '1')

begin

set @CombineFlag = '2'

end

/*根据传入的精度计算下传入计量单位的精度*/

if @CombineFlag=1 /*复合且传入数量为复合计量*/

begin

set @Unit1Pres=len(cast(@ConvertRatio as int)-1)

end

else if @CombineFlag=2 /*复合且传入数量为基本计量*/

begin

set @Unit1Pres=0

end

else if @CombineFlag=0 /*不复合*/

begin

declare @RatioPres int

declare @Ratioint int

set @RatioPres=null

if(@Unit1Precision =0 or @Unit1Precision is null)

begin

if @ConvertRatio>=1 /*换算率大于0*/

set @Ratioint=cast((1.00000000/@ConvertRatio)*100000000 as int)

else

set @Ratioint=cast(@ConvertRatio*100000000 as int)

if (@RatioPres is null) if (@Ratioint%100000000=0) set @RatioPres =0

if (@RatioPres is null) if (@Ratioint%10000000=0) set @RatioPres =1

if (@RatioPres is null) if (@Ratioint%1000000=0) set @RatioPres =2

if (@RatioPres is null) if (@Ratioint%100000=0) set @RatioPres =3

if (@RatioPres is null) if (@Ratioint%10000=0) set @RatioPres =4

if (@RatioPres is null) if (@Ratioint%1000=0) set @RatioPres =5

if (@RatioPres is null) if (@Ratioint%100=0) set @RatioPres =6

if (@RatioPres is null) if (@Ratioint%10=0) set @RatioPres =7

if (@RatioPres is null) set @RatioPres =8

/*根据计量单位2的精度和换算率推出计量单位一的精度*/

if @Unit1Pres is null and @ConvertRatio>=1 set @Unit1Pres = @Precision + @RatioPres

if @Unit1Pres is null and @ConvertRatio<1 set @Unit1Pres = @Precision - @RatioPres

end

else

set @Unit1Pres = @Unit1Precision;

if @Unit1Pres<0 set @Unit1Pres=0

if @Unit1Pres>8 set @Unit1Pres=8

end

/******************检测是否负数****************************/

declare @NegativeFlag char(1)

if ( @Unit1Quantity<0 )

begin

set @Unit1Quantity=@Unit1Quantity*(-1);

set @NegativeFlag='1';

end

/*到这里,换算率和精度以及是否处理复合标志都已确定,开始进行换算*/

if @CombineFlag='0' and @Flag = '1' set @ReturnResult=str(round(round(@Unit1Quantity,@Unit1Pres)*@ConvertRatio,@Precision),21,@Precision)/*不复合,乘*/

else if @CombineFlag='0' and @Flag = '0' set @ReturnResult=str(round(round(@Unit1Quantity,@Unit1Pres)/cast(@ConvertRatio as decimal(20,8)),@Precision),21,@Precision)/*不复合,除*/

else if @CombineFlag='1' set @ReturnResult=str(cast(@Unit1Quantity as bigint)*@ConvertRatio+(@Unit1Quantity-cast(@Unit1Quantity as bigint))*power(10,@Unit1Pres),21,@Precision)/*复合,乘,由复合转化到非复合*/

else if @CombineFlag='2' set @ReturnResult=str(cast(@Unit1Quantity/@ConvertRatio as bigint)+(@Unit1Quantity -cast(@Unit1Quantity/@ConvertRatio as bigint)*@ConvertRatio)/power(10,@Precision),21,@Precision)/*复合,除,由非复合换算到复合*/

/**返回结果**/

if ( @NegativeFlag='1') set @ReturnResult='-'+ltrim(rtrim(@ReturnResult)); /*如果是负数*/

return rtrim(ltrim(@ReturnResult))

end

通过上述方法,将同类型两个计量单位的数量数据结合在一块表达,使得数量在人机交互处理中能够方便快捷,易读易懂,实用性强。

上述具体实施方式仅是本发明的具体个案,本发明的专利保护范围包括但不限于上述具体实施方式,任何符合本发明的一种复合方式的产品计量单位表达与换算方法的权利要求书的且任何所述技术领域的普通技术人员对其所做的适当变化或替换,皆应落入本发明的专利保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1