DSO - 売上債権回転日数

全数法を使用して、当期借方の売上回収日数が計算されます。

戻り値

このルーチンは、当期取引の借方内における売上回収日数を表す単一の値を計算します。含まれるDSOサブルーチンでは、次のことが仮定されています:

  • 借方も売上も正数です。

  • ルーチンではHS.GETCELL関数が使用されるため、指定されるパラメータは完全に定義された視点(勘定科目/C1/C2/C3/C4/ICPなど)である。

  • ルーチンでは、可能なかぎりさかのぼって日数が計算されます。ただし、任意の期間の期別売上値が負数であるかゼロの場合には停止します。

構文

CALL DSO (strDSO,strDEBTOR,strSALES,strDIP)

表12-9 DSO関数の構文

パラメータ 有効な値

strDSO

カスタム・ディメンションと内部取引ディメンションを含む完全に定義された勘定科目。この勘定科目は計算の宛先です。

strDEBTOR

カスタム・ディメンションと内部取引ディメンションを含む完全に定義された勘定科目。この勘定科目は当期取引の借方のソースです。

strSALES

カスタム・ディメンションと内部取引ディメンションを含む完全に定義された勘定科目。この勘定科目は売上のソースです。

特に、期間単位への参照は除外されます。

strDIP

カスタム・ディメンションと内部取引ディメンションを含む完全に定義された勘定科目。この勘定科目はその期間の日数のソースです。

これは、[なし]エンティティであるとみなされます。

詳細説明

このルーチンは、現在の期間のDebtors勘定科目(パラメータ2)およびSales勘定科目(パラメータ3)の値を取得し、それらを比較します。どちらかがゼロまたは負数の場合は計算が止まります。借方の値が累積売上の値を超える連続した各期間(現在の期間からさかのぼる)では、ルーチンにより、Period勘定科目(パラメータ4)の日数に指定されているとおりに、その期間の日数が累計に追加されます。

このようにして、すべての借方の値が全数法で処理されると、最後の期間の日数は、期別売上値に対する失効前借方の一部として計算されます。

こうして、累計が宛先の勘定科目(パラメータ1)に転記されます。

この例では、表示されている月の合計未処理日数を計算しています。

表12-10 DSO関数の例

Month 借方 期別売上 月の日数 DSOの式 合計DSO

9月

12,000

2,500

30

100%

30

8月

N/A

1,750

31

100%

31

7月

N/A

2,250

31

100%

31

6月

N/A

2,500

30

100%

30

5月

N/A

2,000

31

100%

31

4月

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