我应该使用Sharepoint Number列类型来存储货币值吗?

时间:2009-11-06 13:38:39

标签: sharepoint currency

在SharePoint中,我可以创建“Number”类型的列表列。我需要存储货币金额,并希望能够使用此列类型而不必创建新列。

SharePoint是否存储和操作此类型的值(例如,在列表视图中对值进行求和时)以防止精度损失(即不是某种近似浮点类型)?

我查看了货币列,但它们似乎强制显示一个在我的应用程序中没有意义的货币单位(我怀疑它们在发动机罩下存储为'数字')。

2 个答案:

答案 0 :(得分:7)

虽然不是决定性的,但基于以下测试,它看起来像SharePoint以适合货币计算的方式处理数字(至少使用WSS 3.0 / SQL Server 2005),即使它们大致存储。但是,超过15个有效数字的值可能会出现舍入错误

测试存储和检索资金

三个数字列(FirstSecondThird)分别包含3.7,3.65和0.05(来自here的.Net示例)和一个计算列(返回一个单行文本),使用以下公式:=IF(First=Second+Third,"Success","Failure")。在查看列表时,计算列会显示成功

货币计算测试

带有公式=0.1+0.1+0.1=0.3的是/否计算列(来自here的.Net示例)。在查看列表时,计算列显示

测试存钱和计算我

在名为TestList的列表中,自定义数字列(CustomNumber)包含304253.3251(来自Microsoft White Paper的SQL Server示例)。它存储在类型AllUserData的数据库表float1,列float中(SQL Server 2005)。 float是近似数据类型。

运行以下查询:

DECLARE @ListName UNIQUEIDENTIFIER
SET @ListName = (SELECT tp_Id FROM AllLists WHERE tp_Title = 'TestList')

SELECT CAST(float1 as NUMERIC(18, 11)) AS CustomNumber 
FROM AllUserData 
WHERE tp_ListId = @ListName

SELECT float1 AS CustomNumber
FROM AllUserData 
WHERE tp_ListId = @ListName

给出以下结果:

CustomNumber
304253.32510000002

CustomNumber
304253.3251

创建一个公式为=CustomNumber*100000000000的计算列,可能会显示30425332510000002实际的错误值,显示30,425,332,510,000,000.00000的正确值(从用户的角度来看) 即可。我假设这种行为是由于代码读取数据库中的float值,使用适当的小数位数进行转换为numeric并使用.Net Decimal类型操作内存中的值

但是,suggestions在SQL Server 2000上计算错误可能会在这种情况下出现,因为版本之间的float值的行为已经改变。

测试资金存储和检索II

根据上一个测试的结果,将以下值添加到CustomNumber列:9999999999999999。

这个16位有效数字值在列表(和编辑)视图中显示为10,000,000,000,000,000 (使用正确显示15位数的值)。

检查AllUserData表显示该值未正确存储在数据库中并运行以下查询:

DECLARE @f FLOAT
SET @f = 9999999999999999
SELECT CAST(@f as NUMERIC(20, 0))

给出结果:

10000000000000000

这表明SQL Server在插入时将数字四舍五入。

答案 1 :(得分:0)

号码打算以这种方式使用,是的。在对值进行求和时,您不应该遇到精度损失的问题。