全数法を使用して、当期借方の売上回収日数が計算されます。
戻り値
このルーチンは、当期取引の借方内における売上回収日数を表す単一の値を計算します。含まれる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