Berechnet die Anzahl der Tage in der aktuellen Periode, an denen die Debitoren von einem Zahlungsaufschub Gebrauch gemacht haben.
Rückgabewert
Diese Routine berechnet einen einzelnen Wert, der die Anzahl der Tage darstellt, die in der Warenschuldnerposition der aktuellen Periode enthalten sind. Die enthaltene DSO-Unterroutine geht von den folgenden Annahmen aus:
Sowohl "Debtors" als auch "Sales" sind positive Zahlen.
Die angegebenen Parameter sind vollständig definierte Points of View (z.B. Account/C1/C2/C3/C4/ICP), da die Routine die Funktion HS.GETCELL verwendet.
Die Routine berechnet die Tage und geht dabei soweit wie möglich in die Vergangenheit. Sie wird jedoch angehalten, wenn der periodische Umsatzwert für eine beliebige Periode ein negativer Wert oder null ist.
Syntax
CALL DSO (strDSO,strDEBTOR,strSALES,strDIP)
Tabelle 12-9 Syntax der Funktion DSO
Parameter | Gültige Werte |
---|---|
strDSO |
Vollständig definiertes Konto mit benutzerdefinierten Dimensionen und Intercompany-Dimensionen. Dieses Konto ist das Ziel für die Berechnung. |
strDEBTOR |
Vollständig definiertes Konto mit benutzerdefinierten Dimensionen und Intercompany-Dimensionen. Dieses Konto ist die Quelle für die Warenschuldner der aktuellen Periode. |
strSALES |
Vollständig definiertes Konto mit benutzerdefinierten Dimensionen und Intercompany-Dimensionen. Dieses Konto ist die Quelle für den Umsatz. Schließen Sie Verweise auf die Häufigkeit explizit aus. |
strDIP |
Vollständig definiertes Konto mit benutzerdefinierten Dimensionen und Intercompany-Dimensionen. Dieses Konto ist die Quelle für die Anzahl der Tage in der Periode. Es wird vorausgesetzt, dass es sich in der Entity [None] befindet. |
Detaillierte Beschreibung
Diese Routine ruft die Werte aus dem Konto Debtors (Parameter 2) und dem Konto Sales (Parameter 3) für die aktuelle Periode ab und vergleicht sie. Wenn ein Wert null oder eine negative Zahl ist, wird die Berechnung angehalten. Jedes Mal, wenn der Debitorenwert in einer nachfolgenden Periode den kumulativen Umsatzwert überschreitet (rückwirkend ab der aktuellen Periode), fügt die Routine die Anzahl Tage für diese Periode gemäß der Angabe für die Tage im Konto Period (Parameter 4) zu einer laufenden Summe hinzu.
Wenn auf diese Art und Weise alle Debitorenwerte verbraucht wurden, werden die Tage der Endperiode als Anteil der nicht abgelaufenen Debitoren im Vergleich zum periodischen Umsatzwert berechnet.
Schließlich bucht die Routine die laufende Summe auf das Zielkonto (Parameter 1).
Beispiel
Im Beispiel wird die Gesamtforderungslaufzeit in Tagen für die angezeigten Monate berechnet.
Tabelle 12-10 Beispiel für die Funktion DSO
Month | Debitoren | Periodenumsatz | Tage im Monat | Formel für DSO | Summe DSO |
---|---|---|---|---|---|
September |
12.000 |
2.500 |
30 |
100 % |
30 |
August |
N/V |
1.750 |
31 |
100 % |
31 |
Juli |
N/V |
2.250 |
31 |
100 % |
31 |
Juni |
N/V |
2.500 |
30 |
100 % |
30 |
Mai |
N/V |
2.000 |
31 |
100 % |
31 |
April |
N/V |
2.250 |
30 |
2000/2250 |
26.7 |
Summe |
N/V |
N/V |
N/V |
N/V |
179.7 |
Beispielskript
' 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