使用穷举法计算销售额反映在当前期间应收帐款中的天数。
返回值
此例程计算一个数值,其表示销售额反映在当前期间交易应收帐款数字中的天数。包含的 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