<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Question Re: SAC Data Action: Implementing a Rolling Forecast with... in Technology Q&amp;A</title>
    <link>https://community.sap.com/t5/technology-q-a/sac-data-action-implementing-a-rolling-forecast-without-cumulative-data/qaa-p/14488423#M4949075</link>
    <description>&lt;P&gt;&lt;a href="https://community.sap.com/t5/user/viewprofilepage/user-id/2280916"&gt;@Hoppeno&lt;/a&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I think there is an assumption you have made that granularity is exactly same for current year actuals, plan and last year actuals which is generally not true. That explains the additive behavior. One of the below variant should work.&lt;/P&gt;&lt;P&gt;MEMBERSET [d/Measures] = "gemeldete_Umsaetze"&lt;BR /&gt;MEMBERSET [d/Datum] = BASEMEMBER([d/Datum].[h/YM], %Ziel_Jahr%)&lt;/P&gt;&lt;P&gt;DELETE()&lt;/P&gt;&lt;P&gt;DATA() = RESULTLOOKUP([d/Version] = "public.Actual", [d/Datum] = PREVIOUS(12, "MONTH")) //copy LY Actuals to all periods&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;IF RESULTLOOKUP([d/Version] = "public.Actual") !=NULL THEN // check if CY Actuals exists&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;DELETE() //clear the period&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;DATA() = RESULTLOOKUP([d/Version] = "public.Actual") // Copy CY Actuals into the period&lt;BR /&gt;ENDIF&lt;/P&gt;&lt;P&gt;OR the below&lt;/P&gt;&lt;P&gt;MEMBERSET [d/Measures] = "gemeldete_Umsaetze"&lt;BR /&gt;MEMBERSET [d/Datum] = BASEMEMBER([d/Datum].[h/YM], %Ziel_Jahr%)&lt;/P&gt;&lt;P&gt;DELETE()&lt;/P&gt;&lt;P&gt;DATA() = RESULTLOOKUP([d/Version] = "public.Actual") // Copy CY Actuals to periods&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;IF RESULTLOOKUP([d/Version] = "public.Actual", [d/Datum] = PREVIOUS(12, "MONTH")) +RESULTLOOKUP()=RESULTLOOKUP([d/Version] = "public.Actual", [d/Datum] = PREVIOUS(12, "MONTH")) THEN // Check if LY actuals + current Year plan =LY actuals, would be true for empty periods&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;DATA() = RESULTLOOKUP([d/Version] = "public.Actual",&lt;SPAN&gt;[d/Datum] = PREVIOUS(12, "MONTH")&lt;/SPAN&gt;) // Copy LY actuals&lt;BR /&gt;ENDIF&lt;/P&gt;&lt;P&gt;Hope this helps!&lt;/P&gt;&lt;P&gt;Nikhil&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Sun, 20 Sep 2026 18:43:46 GMT</pubDate>
    <dc:creator>N1kh1l</dc:creator>
    <dc:date>2026-09-20T18:43:46Z</dc:date>
    <item>
      <title>SAC Data Action: Implementing a Rolling Forecast without cumulative DATA() behavior or unbooked data</title>
      <link>https://community.sap.com/t5/technology-q-a/sac-data-action-implementing-a-rolling-forecast-without-cumulative-data/qaq-p/14486529</link>
      <description>&lt;P&gt;Hi SAP Community,&lt;/P&gt;&lt;P&gt;I am trying to implement a standard &lt;STRONG&gt;Rolling Forecast&lt;/STRONG&gt; logic inside an SAC Planning Advanced Formula Data Action.&lt;/P&gt;&lt;H3&gt;&lt;STRONG&gt;The Goal:&lt;/STRONG&gt;&lt;/H3&gt;&lt;P&gt;When planning for a specific target year (e.g., &lt;CODE&gt;%Ziel_Jahr%&lt;/CODE&gt; = 2026), the Data Action should prepare the &lt;CODE&gt;Plan&lt;/CODE&gt; version by:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;P&gt;Copying existing &lt;CODE&gt;Actual&lt;/CODE&gt; data for all elapsed months of the current year (e.g., Jan–Jul).&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;For all remaining/future months of the target year where no actuals exist yet, copying the previous year's actuals (&lt;CODE&gt;PREVIOUS(12, "MONTH")&lt;/CODE&gt;).&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;Keeping the configuration simple: &lt;STRONG&gt;Using only 1 parameter&lt;/STRONG&gt; (&lt;CODE&gt;%Ziel_Jahr%&lt;/CODE&gt;) without requiring planners to enter cut-off months manually.&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Hoppeno_0-1789632538295.png" style="width: 400px;"&gt;&lt;img src="https://community.sap.com/t5/image/serverpage/image-id/459357i18A2ED64CAF4F04F/image-size/medium/is-moderation-mode/true?v=v2&amp;amp;px=400" role="button" title="Hoppeno_0-1789632538295.png" alt="Hoppeno_0-1789632538295.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;The Code:&amp;nbsp;&lt;/P&gt;&lt;P&gt;MEMBERSET [d/Measures] = "gemeldete_Umsaetze"&lt;BR /&gt;MEMBERSET [d/Datum] = BASEMEMBER([d/Datum].[h/YM], %Ziel_Jahr%)&lt;/P&gt;&lt;P&gt;DELETE()&lt;/P&gt;&lt;P&gt;IF RESULTLOOKUP([d/Version] = "public.Actual") &amp;gt; 0 THEN&lt;BR /&gt;DATA() = RESULTLOOKUP([d/Version] = "public.Actual")&lt;BR /&gt;ELSE&lt;BR /&gt;DATA() = RESULTLOOKUP([d/Version] = "public.Actual", [d/Datum] = PREVIOUS(12, "MONTH"))&lt;BR /&gt;ENDIF&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H3&gt;&lt;STRONG&gt;The Problems Encountered:&lt;/STRONG&gt;&lt;/H3&gt;&lt;OL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Unbooked Data (&lt;CODE&gt;NULL&lt;/CODE&gt; vs &lt;CODE&gt;0&lt;/CODE&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;Future months (Sep–Dec) do not have booked records in &lt;CODE&gt;Actual&lt;/CODE&gt; (displayed as &lt;CODE&gt;–&lt;/CODE&gt; / unbooked, not numerical &lt;CODE&gt;0&lt;/CODE&gt;).&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;Because of sparse data traversal, the &lt;CODE&gt;ELSE&lt;/CODE&gt; branch is completely ignored for these months, leaving future plan months empty.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;Direct comparisons like &lt;CODE&gt;IF RESULTLOOKUP(...) == 0&lt;/CODE&gt; or &lt;CODE&gt;ISNULL(...)&lt;/CODE&gt; fail with parser errors (&lt;CODE&gt;RESULTLOOKUP cannot be used in the left operand&lt;/CODE&gt;).&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Additive &lt;CODE&gt;DATA()&lt;/CODE&gt; behavior (&lt;CODE&gt;+=&lt;/CODE&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;If I initialize the entire year first with previous year's actuals and then try to overwrite elapsed months with current actuals:&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;DATA() = RESULTLOOKUP([d/Version] = "public.Actual", [d/Datum] = PREVIOUS(12, "MONTH"))&lt;/P&gt;&lt;P&gt;IF RESULTLOOKUP([d/Version] = "public.Actual") &amp;gt; 0 THEN&lt;BR /&gt;DATA() = RESULTLOOKUP([d/Version] = "public.Actual")&lt;BR /&gt;ENDIF&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;SAC sums the values up instead of overwriting them (e.g., Jan Actual 12,138 + Jan LY 12,940 = 25,078 in Plan).&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;Subtracting the prior year value inside the &lt;CODE&gt;IF&lt;/CODE&gt; block fails because intermediate buffer states or underlying dimension mismatches prevent a clean cancellation.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Date Range / Hierarchy limitations:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;Script functions like &lt;CODE&gt;TO&lt;/CODE&gt;, &lt;CODE&gt;FIRST&lt;/CODE&gt;, or date offsets either reject cross-hierarchy usage (Year parameter vs. Month scope) or throw parser errors when combined with parameters.&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;H3&gt;&lt;STRONG&gt;Question:&lt;/STRONG&gt;&lt;/H3&gt;&lt;P&gt;What is the recommended, robust pattern in SAC Advanced Formulas to populate a rolling forecast (Current Actuals where present, LY Actuals where absent) in a single Data Action using only the Target Year parameter, without triggering cumulative addition or memory overflow?&lt;/P&gt;&lt;P&gt;Any insights or best-practice patterns would be greatly appreciated!&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Hoppeno_1-1789632635189.png" style="width: 400px;"&gt;&lt;img src="https://community.sap.com/t5/image/serverpage/image-id/459358i6E6B5C0F9859043E/image-size/medium/is-moderation-mode/true?v=v2&amp;amp;px=400" role="button" title="Hoppeno_1-1789632635189.png" alt="Hoppeno_1-1789632635189.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 17 Sep 2026 08:11:37 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/sac-data-action-implementing-a-rolling-forecast-without-cumulative-data/qaq-p/14486529</guid>
      <dc:creator>Hoppeno</dc:creator>
      <dc:date>2026-09-17T08:11:37Z</dc:date>
    </item>
    <item>
      <title>Re: SAC Data Action: Implementing a Rolling Forecast with...</title>
      <link>https://community.sap.com/t5/technology-q-a/sac-data-action-implementing-a-rolling-forecast-without-cumulative-data/qaa-p/14487230#M4949016</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;A class="" href="https://community.sap.com/t5/user/viewprofilepage/user-id/2280916" target="_blank" rel="noopener"&gt;&lt;SPAN class=""&gt;Hoppeno&lt;/SPAN&gt;&lt;/A&gt;,&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; With SAC advance formula, by default DATA() will get booked value from Actual version. So the IF clause is not needed.&amp;nbsp; Single line as below will achieve what you requested.&amp;nbsp;&lt;/P&gt;&lt;P&gt;DATA() = RESULTLOOKUP([d/Version] = "public.Actual")&lt;/P&gt;&lt;P&gt;&amp;nbsp; And standard copy step also results the same, no coding with AF needed.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Best regards, William&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 20 Sep 2026 01:25:48 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/sac-data-action-implementing-a-rolling-forecast-without-cumulative-data/qaa-p/14487230#M4949016</guid>
      <dc:creator>William_Yu1</dc:creator>
      <dc:date>2026-09-20T01:25:48Z</dc:date>
    </item>
    <item>
      <title>Re: SAC Data Action: Implementing a Rolling Forecast with...</title>
      <link>https://community.sap.com/t5/technology-q-a/sac-data-action-implementing-a-rolling-forecast-without-cumulative-data/qaa-p/14488423#M4949075</link>
      <description>&lt;P&gt;&lt;a href="https://community.sap.com/t5/user/viewprofilepage/user-id/2280916"&gt;@Hoppeno&lt;/a&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I think there is an assumption you have made that granularity is exactly same for current year actuals, plan and last year actuals which is generally not true. That explains the additive behavior. One of the below variant should work.&lt;/P&gt;&lt;P&gt;MEMBERSET [d/Measures] = "gemeldete_Umsaetze"&lt;BR /&gt;MEMBERSET [d/Datum] = BASEMEMBER([d/Datum].[h/YM], %Ziel_Jahr%)&lt;/P&gt;&lt;P&gt;DELETE()&lt;/P&gt;&lt;P&gt;DATA() = RESULTLOOKUP([d/Version] = "public.Actual", [d/Datum] = PREVIOUS(12, "MONTH")) //copy LY Actuals to all periods&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;IF RESULTLOOKUP([d/Version] = "public.Actual") !=NULL THEN // check if CY Actuals exists&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;DELETE() //clear the period&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;DATA() = RESULTLOOKUP([d/Version] = "public.Actual") // Copy CY Actuals into the period&lt;BR /&gt;ENDIF&lt;/P&gt;&lt;P&gt;OR the below&lt;/P&gt;&lt;P&gt;MEMBERSET [d/Measures] = "gemeldete_Umsaetze"&lt;BR /&gt;MEMBERSET [d/Datum] = BASEMEMBER([d/Datum].[h/YM], %Ziel_Jahr%)&lt;/P&gt;&lt;P&gt;DELETE()&lt;/P&gt;&lt;P&gt;DATA() = RESULTLOOKUP([d/Version] = "public.Actual") // Copy CY Actuals to periods&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;IF RESULTLOOKUP([d/Version] = "public.Actual", [d/Datum] = PREVIOUS(12, "MONTH")) +RESULTLOOKUP()=RESULTLOOKUP([d/Version] = "public.Actual", [d/Datum] = PREVIOUS(12, "MONTH")) THEN // Check if LY actuals + current Year plan =LY actuals, would be true for empty periods&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;DATA() = RESULTLOOKUP([d/Version] = "public.Actual",&lt;SPAN&gt;[d/Datum] = PREVIOUS(12, "MONTH")&lt;/SPAN&gt;) // Copy LY actuals&lt;BR /&gt;ENDIF&lt;/P&gt;&lt;P&gt;Hope this helps!&lt;/P&gt;&lt;P&gt;Nikhil&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 20 Sep 2026 18:43:46 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/sac-data-action-implementing-a-rolling-forecast-without-cumulative-data/qaa-p/14488423#M4949075</guid>
      <dc:creator>N1kh1l</dc:creator>
      <dc:date>2026-09-20T18:43:46Z</dc:date>
    </item>
  </channel>
</rss>

