+++ Dieser Bug entstand als Klon von Bug 16509 +++ Der Laufzeitfehler ITAB_DUPLICATE_KEY entsteht durch fehlende Bewertungskennzeichen (kzbws) in, durch die Migration auf S/4 erzeugten, MATDOC Ausgleichs Materialbelegen (Typ MIG_DELTA in der MATDOC). Dies führt im Vertreterobjekt NSDM_E_MSSQ der MSSQ zu doppelten Einträgen mit demselben, eigentlich eindeutigen, Schlüssel. Durch Lesen dieses Vertreterobjektes und anschließendes verschieben in eine interne hashed Tabelle mit demselben Schlüssel, tritt der Fehler auf.
Migrationsschritte zu S/4 der SAP für Materialbelege: Die Schritte der Migration sind in SAP Note 2238690 https://me.sap.com/notes/2238690/D erklärt. 1. (PARRUN_MKPF1_S4) Zuerst werden die Materialbelege aus MSEG und MKPF in die neue Tabelle MATDOC migriert 2. (PARRUN_MKPF2_S4) Die Aggregat Tabellen (z.B. MSSQ, MSSA, MSSQH, MSSAH, ...) werden in S/4HANA nicht mehr benötigt, da die Werte zur Laufzeit aus den Materialbelegen (MATDOC) ermittelt werden. Deshalb werden diese nicht direkt migriert. Um sicherzustellen, dass die in den Aggregat Tabellen gespeicherten Werte in S/4HANA wieder genau so berechenbar sind, wird dies in diesem Schritt geprüft. Dazu werden die bereits in 1. migrierten Materialbelege aus der MATDOC passend selektiert und aggregiert und mit den Werten aus den Aggregats-Tabellen verglichen. Treten hier Unterschiede auf, so liegt das meistens an bereits im Ursprungssystem archivierten Belegen. Um diese Unterschiede auszugleichen und so die Werte aus den Aggregatstabellen wieder korrekt aus den MATDOC Belegen berechnen zu können werden MIG_DELTA Einträge in der MATDOC angelegt die genau dies tun. 3. (PARRUN_FILL_EXTRACT_S4 ) In diesem Schritt wird dann aus den in Schritt 1 und 2 erzeugten Einträgen der MATDOC die Tabelle MATDOC_EXTRACT gefüllt. Diese Tabelle enthält eine auf Perioden und Bestandstrennende Merkmale verdichtete Sicht der MATDOC Belege und wird z.B. genutzt, um Performanter zur Laufzeit aktuelle Bestände zu ermitteln. 4. (PARRUN_MKPF3_S4) Im letzten Schritt werden Periodensätze (PERFY) in der Tabelle MATDOC_EXTRACT erzeugt. Diese Sätze zeigen nachher an welche Perioden in einem Buchungskreis zur Verfügung stehen Beispiel MSSQ für ein PSP-Element 1234 mit 2 MSSQ Einträgen einmal mit Bewertungskennzeichen M ein Bestand von 1 und einmal mit Bewertungskennzeichen leer mit Bestand -1: 1. Der Materialbeleg für das PSP-Element 1234 mit einem Bestand von 1 und der Bewertung M (separate Bewertung mit Bezug zum Projekt) wird in die MATDOC migriert (MDOC Einrag) 2. Beim Vergleich mit der Aggregat Tabelle MSSQ kommt es für dieses PSP-Element zu einer Abweichung: Aggregation aus MATDOC = 1 Bestand, in der MSSQ ist für dieses PSP-Element kein Eintrag vorhanden. SAP geht dementsprechend von einem Bestand von 0 aus. Grund für den fehlenden Eintrag könnte z.B. eine Archivierung sein. Um den Bestand wieder auf 0 gerade zu ziehen legt SAP nun einen MIG_DELTA Satz in der MATDOC an, der die Differenz von 1 mit einer Menge von -1 ausgleicht (MIG_DELTA Eintrag). In dem neu angelegten Ausgleichsbeleg ist aber das Bewertungskennzeichen kzbws leer. Das könnte daran liegen, dass SAP versucht dies über die PSP-Element Stammdaten (Tabelle PRPS) zu ermitteln, die Stammdaten aber auch nicht mehr vorhanden sind. 3. Die 2 Belege (original und Ausgleichsbeleg) werden dann aus der MATDOC in die MATDOC_EXTRACT verdichtet. Da sie aber unterschiedliche Bewertungen haben (M und leer) werden auch dort 2 Einträge angelegt. Ursache des Problems sind dementsprechend nicht vollständig archivierte Daten (ein Beleg wurde nicht archiviert, die MSSQ und wahrscheinlich PRPS Einträge jedoch schon) und das Problem, dass SAP in der Migration für den Ausgleichsbeleg (MIG_DELTA) das Bewertungskennzeichen nicht korrekt ermittelt und wegschreibt. Das führt in den SAP Transaktionen wahrscheinlich zu keinem Problem, da der Projektbestand auf 0 ist und ja eigentlich schon im R/3 System archiviert wurde. Um diesen Fehler zu beheben kann in der MATDOC und der MATDOC_EXTRACT in den durch die Migration erzeugten Ausgleichs- MIG_DELTA Sätzen das Bewertungskennzeichen kzbws dem Auszugleichenden Beleg entsprechend angepasst werden. In diesem Fall von leer auf M. Mit diesem Geradeziehen der Daten kann der Kennzahlenaufbau wieder lauffähig gemacht werden.