ForecastExponentialSmoothing

Forecast Exponential Smoothing

Major Business Rule

Object Name: B3400880

Parent DLL: CMFG

Location: Client/Server

Language: C

1.Functional Description

1.1Purpose

The purpose of this program is to forecast using an exponential smoothing technique.  The program is 
called during a Forecast Generation (P34650) run, when exponential smoothing has been selected as one 

of the forecasts to be generated.


1.2Setup Notes and Prerequisites

• This program accepts the following parameters
• ##N= $N= Number of months to forecast
• ##SIM= Simulated Forecast
• ##C= $C= LastDateBucketPosition
• ##D=$D
• PntrActualValues= Array of Actual Sales and Actual Amounts
• PntrExpoForecast= Array of Expo Forecasts
• ##ABC= The processing option for P34650 that indicates to summarize by large customer
• AlphFactor = The Alpha Factor passed in.  Calculate if blank
• BetaFactor = The Beta Factor passed in.  Calculate if blank

1.3Special Logic


2.Technical Specifications

Houskeeping

1.If SimulatedForecast passed in is not equal to zero
Move MonthsBestFit to NumberOfMonths ($N)

Subtract MonthsBestFit from LastBucketPosition

End


If MonthlyVsWeekly is not equal to '1'

Move 12 to BucketsInYr

Else

Move 52 to BucketsInYr

End


2.If the LastBucketPosition is now greater than or equal to BucketsInYr

Subtract (BucketsInYr - 1) from LastBucketPostion to get $ST

Else

Clear the PntrExpoForecast array

End function

End


If ForecastAmounts = '1'

PntrActuals = PntrActualAmounts

Else

PntrActuals = PntrActualSales

End


3.Move blanks to $24M

If LastBucketPostion is greater than 2 * BucketsInYr

Subtract (2 * BucketsInYr - 1) from LastBucketPostion to get $P

Do BucketsInYr times
Add PntrActuals,$P to $TOT

End

If $TOT is not equal to zeros

Move 1 to $24M

End

EndMainLine

4.Will need the following Arrays to process this program

PntrActualSales= Actual Sales

@AV= Average Value - array with BucketsInYr elements

@AT= Average Trend - array with BucketsInYr elements

@ST= Seasonal Trend - array with BucketsInYr elements

PntrExpoForecast= Expo Forecast - array with NumberOfMonths elements


5.Clear @AV, @AT, @ST, PntrExpoForecast and move zeros to $$TOT and $$SIM


6.Calculate the total actuals for seasonal index

If Seasonality is equal to '1'
Move $ST to $X
Subtract $ST from LastBucketPositions to get $Z

Add 1 to $Z

Do $Z
Add PntrActuals,$X to $$TOT

If $24M is equal to '1'

Subtract BucketsInYr from $X to get $24

Add PntrActuals,$24 to $$TOT

End

Add 1 to $X

EndDo

End


7.Calculate Average

Move $ST to $I
Subtract $ST from LastBucketPositions to get $Z

Add 1 to $Z

Do $Z
Subtract $ST from $I to get $X

Add 1 to $X

Add 1 to $X to get $X1

If AlphaFactor is equal to zeros

If $X1 is less than 13

Divide 2 by $X1 to get $ALPHA

End

Else

If $X is equal to 1

Move 1 to $ALPHA

Else

Move AlphaFactor to $ALPHA

End

End

 Subtract $ALPHA from 1 to get $ALPH1

Move zeros to $2

If $X is greater than 1

Subtract 1 from $X to get $1X

Multiply @AV,$1X by $ALPH1 to get $2

End

Multiply PntrActuals,$I by $APLHA to get $1

Add $1 to $2 to get @AV,$X

Add 1 to $I

EndDo

8.Calculate Average Trend

Add 1 to $ST 
Move $ST to $I

Subtract $ST from LastBucketPosition to get $Z

Add 1 to $Z

Move Zeros to @AT,01

Do $Z

Subtract $ST from $I to get $X

Add 2 to $X

If BetaFactor is equal to zero

If $X is less than 8

Divide 2 by $X to get $BETA

End

Else

If $X is equal to 1

Move 1 to $BETA

Else

Move BetaFactor to $BETA

End

End

Subtract $BETA from 1 to get $BETA1

Subtract 1 from $X to get $1X

Multiply @AT,$1X by $BETA1 to get $2

Subtract @AV,$1X from @AV,$X to get $AVGD

Multiply $BETA by $AVGD to get $1

Add $1 to $2 to get @AT,$X

Add 1 to $I

EndDo


9.Calculate Seasonal Index

If Seasonality is equal to '1'
Subtract 1 from $ST
Move $ST to $I

Subtract $ST from LastBucketPosition to get $Z

Add 1 to $Z

If $$TOT is not equal to zeros

Do $Z

Subtract $ST from $I to get $X

Add 1 to $X

Move PntrActuals,$I to $ADD

If $24M is equal to 1

Subtract BucketsInYr from $I to get $24

Add PntrActuals,$24 to $ADD

End

Divide $ADD by $$TOT to get @ST,$X

Add 1 to $I

EndDo

End

End

10.Calculate New Average and Forecast for the Desired Months

If LastBucketPostion is greater than zero

Do $N times incrementing $X

Multiply @AT,BucketsInYr by $X to get $2

Add @AV,BucketsInYr to $2 to get $NAVG

If Seasonality is equal to '1'

Multiply $NAVG by BucketsInYr

Multiply $NAVG by @ST,($X mod BucketsInYr)

End

Move $NAVG to get PntrExpoForecast,$X

If ##SIM passed in is not equal to zero

Add PntrExpoForecast,$X to $$SIM

End

EndDo

End


If ##SIM is not equal to zero
Move $$SIM to ##SIM

End



^

Data Structure

D3400880 - Forecast Exponential Smoothing

Parameter NameData ItemData TypeReq/OptI/O/Both
mnNumberOfMonthsMATH01MATH_NUMERICNONENONE

- - - Good Performance Low Value. 

mnSimulatedForecastMN29D9MATH_NUMERICNONENONE

This is a generic field used as a work field in Everest.

mnLastBucketPositionMATH02MATH_NUMERICNONENONE

- - - Good Performance High Value. 

idPtrToActualValuesGENLNGIDNONENONE

General purpose ID variable.

idPtrToExpoForecastGENLNGIDNONENONE

General purpose ID variable.

mnAlphaFactorMN29D9MATH_NUMERICNONENONE

This is a generic field used as a work field in Everest.

mnBetaFactorMN29D9MATH_NUMERICNONENONE

This is a generic field used as a work field in Everest.

mnMonthsBestFitMATH04MATH_NUMERICNONENONE

Event point for Math Numeric.

cForecastAmountsEV03charNONENONE

A radio button that specifies the level at which trace/track result is to be displayed.  Select the Detail to display all transactions except IB, IX, 
and IZ types.  Or, select Derivative Lots Only to display only those transactions that may have created new derivative lot. 

cMonthlyVsWeeklyEV01charNONENONE

An option that specifies the type of processing for an event.

cSeasonalityEV01charNONENONE

An option that specifies the type of processing for an event.

Related Functions

B3401050 Forecast Accumulate Actuals

Related Tables

None