DSO - Days Sales Outstanding(销售未结天数)

使用穷举法计算销售额反映在当前期间应收帐款中的天数。

返回值

此例程计算一个数值,其表示销售额反映在当前期间交易应收帐款数字中的天数。包含的 DSO 子例程做出以下假定:

  • 应收帐款和销售额都是正数。

  • 提供的参数是完全定义的视点(例如,帐户/C1/C2/C3/C4/ICP),因为该例程使用 HS.GETCELL 函数。

  • 该例程计算的天数在时间上尽可能向后回溯。但是,如果任何期间的周期销售值为负值或零值,则停止计算。

语法

CALL DSO (strDSO,strDEBTOR,strSALES,strDIP)

表 12-9 DSO 函数的语法

参数 有效值

strDSO

包含自定义维和公司内维的完全定义帐户。此帐户是计算的目标帐户。

strDEBTOR

包含自定义维和公司内维的完全定义帐户。此帐户是当前期间交易应收帐款的源帐户。

strSALES

包含自定义维和公司内维的完全定义帐户。此帐户是销售额的源帐户。

专门排除对频率的引用。

strDIP

包含自定义维和公司内维的完全定义帐户。此帐户是期间天数的源帐户。

此帐户默认为在 [None] 实体中。

详细说明

该例程采用当前期间的应收帐款帐户(第 2 个参数)和销售额帐户(第 3 个参数)的值并对其进行比较。如果其中一个值为零或负数,则停止计算。对于应收帐款值超过累计销售额值的每个后续期间(从当前期间往回算),该例程将按期间帐户(第 4 个参数)中指定的天数将该期间的天数加到累积总计中。

以这种方式穷举了所有应收帐款值后,按照未到期应收帐款值占周期销售额值的比例计算最后期间的天数。

最后,该例程将累积总计过帐到目标帐户(第 1 个参数)。

示例

该示例计算所示月份的未结总天数。

表 12-10 DSO 函数的示例

Month 应收帐款 期间销售额 月份中的天数 DSO 的公式 DSO 总计

9 月

12,000

2,500

30

100%

30

8 月

不适用

1,750

31

100%

31

7 月

不适用

2,250

31

100%

31

6 月

不适用

2,500

30

100%

30

5 月

不适用

2,000

31

100%

31

4 月

不适用

2,250

30

2000/2250

26.7

总计

不适用

不适用

不适用

不适用

179.7

示例脚本

' Use within the calculation section:
' 1. Standard use
CALL DSO("A#DSO","A#TradeDebtors.C1#AllAges.C2#[None].I#[ICP Top","A#TotalSales.C1#[None].C2#AllProducts.I#[ICP Top]", "A#DIP")
' 2. Use with a common custom dimension
set vPRODUCT = ARRAY("C2#PRODUCT1","C2#PRODUCT2", ….. ,"C2#PRODUCTn")
FOR EACH iITEM IN vPRODUCT
CALL DSO("" A#DSO.""&iITEM,"" A#TradeDebtors.C1#AllAges.I#[ICP Top].""&iITEM,"" A#TotalSales.C1#[None].I#[ICP Top]."" &iITEM,"" A#DIP"")
NEXT
' Actual script of Sub-routine
SUB DSO(strDSO,strDEBTOR,strSALES,strDIP)
DIM vTEST
DIM vDSO
DIM vCOUNT
DIM vXS_1
DIM vXS
HS.CLEAR(strDSO)
vTEST = HS.GETCELL(strDEBTOR) * HS.GETCELL(strSALES&"".W#Periodic"") * HS.GETCELL(strDIP&"".E#[None]"")
' checks if any of the parameters are zero (uses principle of X * 0 = 0)
IF vTEST = 0 THEN
EXIT SUB
ELSE
vDSO = 0
vCOUNT = 0
vXS_1 = HS.GETCELL(strDEBTOR)
vXS = vXS_1 - HS.GETCELL(strSALES&"".W#Periodic"")
' ensures that periodic sales are not negative or zero
WHILE vXS > 0 AND vXS_1 > vXS
vDSO = vDSO + HS.GETCELL(strDIP&"".E#[None].P#CUR-"" &vCOUNT)
vCOUNT = vCOUNT + 1
vXS_1 = vXS
vXS = vXS - HS.GETCELL(strSALES&"".W#Periodic.P#CUR-"" &vCOUNT)
WEND
IF vXS = vXS_1 THEN
vCOUNT = vCOUNT - 1
END IF
vDSO = vDSO + (vXS_1 / HS.GETCELL(strSALES&"".W#Periodic.P#CUR-"" &vCOUNT)*HS.GETCELL(strDIP&"".E#[None].P#CUR-"" &vCOUNT))
IF vDSO < 0 THEN
vDSO = 0
END IF
END IF
HS.EXP strDSO &"="& vDSO
END SUB