DSO - 銷售未結的天數

使用窮舉法計算目前期間借項的銷售天數。

傳回值

這個常式會計算代表目前期間交易借項數值中所包含銷售天數金額的單一值。所包括的 DSO 子常式會做出以下假設:

  • 借項和銷售都是正數。

  • 提供的參數是已完全定義的檢視點 (例如,Account/C1/C2/C3/C4/ICP),因為常式會使用 HS.GETCELL 函數。

  • 常式會及時盡量往回計算天數。但是,如果任何期間的定期銷售值是負數或零值,便會停止。

語法

CALL DSO (strDSO,strDEBTOR,strSALES,strDIP)

表格 12-9 DSO 函數的語法

參數 有效值

strDSO

使用自訂維度和 Intercompany 維度完全定義的帳戶。這個帳戶是計算的目標。

strDEBTOR

使用自訂維度和 Intercompany 維度完全定義的帳戶。這個帳戶是目前期間交易借項的來源。

strSALES

使用自訂維度和 Intercompany 維度完全定義的帳戶。這個帳戶是銷售的來源。

特別排除對頻率的參照。

strDIP

使用自訂維度和 Intercompany 維度完全定義的帳戶。這個帳戶是該期間天數的來源。

這假設為位於 [無] 實體中。

詳細說明

常式會針對目前期間取用借項帳戶 (參數 2) 和銷售帳戶 (參數 3) 中的值,並加以比較。如果是零或是負數,計算便會停止。針對借項值超過累計銷售值 (從目前期間向後計算) 的各個連續期間,常式會依照 Period 帳戶 (參數 4) 的天數中指定的方式,將該期間的天數新增到執行總數中。

所有的借項值都以這種方式用完之後,最後期間的天數就會以針對定期銷售值的未到期借項比例來計算。

最後,常式會將執行總計登入到目標帳戶 (參數 1)。

範例

範例會針對所顯示的月份來計算未結天數總計。

表格 12-10 DSO 函數的範例

月份 借項 期間銷售 月中的天數 DSO 的公式 DSO 總計

九月

12,000

2,500

30

100%

30

八月

N/A

1,750

31

100%

31

七月

N/A

2,250

31

100%

31

六月

N/A

2,500

30

100%

30

五月

N/A

2,000

31

100%

31

四月

N/A

2,250

30

2000/2250

26.7

總計

N/A

N/A

N/A

N/A

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