Add product division gateway mapping

This commit is contained in:
2026-05-29 08:49:37 +02:00
parent d3d75ccea7
commit 7e9a61f877
14 changed files with 402 additions and 44 deletions
@@ -150,3 +150,128 @@ Noch zu pruefen:
## Abgrenzung
Dieser Task ist keine Finance-Soll/Ist-Regel. Die Klassifikation kann spaeter Finance- und Management-Auswertungen ergaenzen, sollte aber fachlich getrennt von Net-Sales-Abgrenzungen bleiben.
## Nachtrag 2026-05-29 Umsetzung SAP Gateway Und Web
SAP/DDIC:
- Struktur `ZSTR_PRODSPARTE_OUT` wurde fuer den Gateway-Entity-Type verwendet.
- `PAPH1`, `WWPFA` und `WWPSP` duerfen in SE11 nicht vorausgesetzt als globale Datenelemente typisiert werden.
- Pragmatische Typisierung ist moeglich:
- `PAPH1`: `CHAR 5`
- `WWPFA`: Laenge wie `CE11000-WWPFA`
- `WWPSP`: Laenge wie `CE11000-WWPSP`
- Textfelder: z.B. `CHAR 50`
- Aktivierungsfehler bei `ZSTR_PRODSPARTE_OUT` waren durch nicht vorhandene/aktive Datenelemente fuer `PAPH1`, `WWPFA`, `WWPSP` verursacht.
SAP/ABAP:
- `ZCL_PRODSPARTE_PROVIDER` wurde als globale Klasse in SE24/quelltextbasiert angelegt.
- `Z_PRODSPARTE_REPORT` und `Z_PRODSPARTE_MAP_BUILD` wurden als Reports angelegt.
- `Z_PRODSPARTE_MAP_BUILD` hat `ZPRODSPARTE_MAP` befuellt.
- Beispielhafte Mapping-Luecken aus dem ALV-Test:
- `0509 Multistat` nicht zugeordnet
- `0540 Multistat` nicht zugeordnet
- `0519 Multistat` zugeordnet zu `0007` / `0001`
- Diese Luecken werden spaeter fachlich geprueft; technisch funktioniert der Provider.
SAP Gateway:
- Bestehender Service wird weiterverwendet:
- `ZPOWERBI_EINKAUF_SRV`
- Service Root: `http://travt762.sap.trafag.com:8000/sap/opu/odata/sap/ZPOWERBI_EINKAUF_SRV/`
- Es wurde ein zusaetzlicher Entity Type aus `ZSTR_PRODSPARTE_OUT` erstellt:
- Entity Type: `ProductDivisionRef`
- Entity Set: `ProductDivisionRefSet`
- Der bestehende Sales-EntitySet bleibt separat:
- `FinanzdataSchweizOeSet` bzw. generierte Methode `FINANZDATASCHWEI_GET_ENTITYSET`
- Diese Methode muss weiter aus `ZSCHWEIZ` lesen und darf nicht durch Produktsparten-Code ersetzt werden.
- Produktsparten-Code gehoert in die separat generierte/redefinierte Methode:
- `PRODUCTDIVISIONR_GET_ENTITYSET`
- Test-URL:
- `http://travt762.sap.trafag.com:8000/sap/opu/odata/sap/ZPOWERBI_EINKAUF_SRV/ProductDivisionRefSet`
- OData-Feldnamen aus dem Gateway sind CamelCase:
- `Matnr`
- `Maktx`
- `Paph1`
- `Paph1Text`
- `Wwpfa`
- `WwpfaText`
- `Wwpsp`
- `WwpspText`
- `IsAssigned`
- Erfolgreicher Testdatensatz aus Gateway:
- `Matnr = VCP1000`
- `Maktx = VC TRANSMITTER`
- `Paph1 = 9999`
- `Paph1Text = Zubehoer`
- `Wwpsp = UNASS`
- `WwpspText = Nicht zugeordnet`
- `IsAssigned = false`
Wichtige Gateway-Korrektur:
- Fehler `/IWFND/MED/170` trat auf, weil Service und EntitySet ohne Slash zusammengesetzt wurden.
- Falsch:
- `.../ZPOWERBI_EINKAUF_SRVProductDivisionRSet`
- Richtig:
- `.../ZPOWERBI_EINKAUF_SRV/ProductDivisionRefSet`
Webprogramm / Datenmodell:
- `SalesRecord` und `CentralSalesRecord` wurden um folgende Felder erweitert:
- `ProductHierarchyCode`
- `ProductHierarchyText`
- `ProductFamilyCode`
- `ProductFamilyText`
- `ProductDivisionCode`
- `ProductDivisionText`
- `ProductMappingAssigned`
- SQLite-Schema wurde erweitert:
- Neue Installationen erhalten die Felder in `CentralSalesRecords`.
- Bestehende Datenbanken erhalten die Felder per `DatabaseSchemaMaintenanceService`.
- `CentralSalesRecordService` schreibt und liest die neuen Felder.
- `ConfigTransferService` erhaelt die Produktfelder beim Preserve bestehender `CentralSalesRecords`.
- Excel-Export fuehrt die neuen Produktfelder im Blatt `Sales` direkt nach `Product Group`.
- Finance-Spalten im Export verschieben sich dadurch nach hinten; Tests wurden angepasst.
- Manual-Excel-Import und Auto-Match kennen die neuen Feldnamen ebenfalls.
Aktive lokale Web-Konfiguration:
- Standort:
- `Schweiz/Oesterreich`
- `TSC = ZSCHWEIZ`
- `SourceSystem = SAP`
- SAP Service URL:
- `http://travt762.sap.trafag.com:8000/sap/opu/odata/sap/ZPOWERBI_EINKAUF_SRV/`
- SAP-Quellen:
- Alias `Z`: bestehender Sales-EntitySet
- Alias `P`: `ProductDivisionRefSet`
- Join:
- `Z.Matnr = P.Matnr`
- Feldmappings:
- `ProductHierarchyCode <- P.Paph1`
- `ProductHierarchyText <- P.Paph1Text`
- `ProductFamilyCode <- P.Wwpfa`
- `ProductFamilyText <- P.WwpfaText`
- `ProductDivisionCode <- P.Wwpsp`
- `ProductDivisionText <- P.WwpspText`
- `ProductMappingAssigned <- P.IsAssigned`
Lokaler Neustart / Validierung:
- Lokaler Webprozess wurde neu gestartet.
- App antwortet lokal mit HTTP 200 auf `http://localhost:55416/`.
- Neue Spalten sind in `CentralSalesRecords` vorhanden.
- Validierung:
- `dotnet test TrafagSalesExporter.sln --verbosity minimal --artifacts-path C:\TMP\trafag-test-artifacts-productmapping`
- Ergebnis: `79/79` Tests gruen.
Naechster fachlicher/technischer Schritt:
- Standort `ZSCHWEIZ` im Export Dashboard einmal neu laufen lassen.
- Danach pruefen:
- Sind Produktfelder in `CentralSalesRecords` gefuellt?
- Stimmen Join-Treffer fuer bekannte Materialien?
- Wie viele Zeilen bleiben `UNASS` / `Nicht zugeordnet`?
- SAP-seitig muss `FINANZDATASCHWEI_GET_ENTITYSET` auf den alten `ZSCHWEIZ`-Select-Code zurueckgesetzt sein, falls er versehentlich mit Produktsparten-Code ueberschrieben wurde.
@@ -35,6 +35,33 @@ Optional fuer Gateway/DDIC:
- Struktur `ZSTR_PRODSPARTE_OUT`
- Tabellentyp `ZTT_PRODSPARTE_OUT`
## DDIC-Hinweis Zu `ZSTR_PRODSPARTE_OUT`
Wenn `ZSTR_PRODSPARTE_OUT` in SE11 angelegt wird, duerfen `PAPH1`,
`WWPFA` und `WWPSP` nicht blind als Komponententypen eingetragen werden.
In manchen SAP-Systemen sind das keine aktiven globalen Datenelemente,
sondern nur Feldnamen in der CO-PA-Tabelle `CE11000`. Dann kann die
Nametab der Struktur nicht generiert werden.
Empfohlene Anlage:
| Komponente | Komponententyp / Alternative |
| --- | --- |
| `MATNR` | `MATNR` |
| `MAKTX` | `MAKTX` |
| `PAPH1` | eigenes Datenelement `ZDE_PAPH1` mit Laenge wie `CE11000-PAPH1`; aktuell fachlich erwartet: `CHAR 5` |
| `PAPH1_TEXT` | `VTEXT` oder eigenes Text-Datenelement |
| `WWPFA` | eigenes Datenelement `ZDE_WWPFA` mit exakt gleicher Laenge wie `CE11000-WWPFA` |
| `WWPFA_TEXT` | `BEZEK` oder eigenes Text-Datenelement |
| `WWPSP` | eigenes Datenelement `ZDE_WWPSP` mit exakt gleicher Laenge wie `CE11000-WWPSP` |
| `WWPSP_TEXT` | `BEZEK` oder eigenes Text-Datenelement |
| `IS_ASSIGNED` | `BOOLE_D` oder `XFELD` |
Alternativ kann die Struktur fuer den ersten ALV-Test entfallen, weil die
Provider-Klasse intern mit `CE11000-PAPH1`, `CE11000-WWPFA` und
`CE11000-WWPSP` typisiert. Fuer Gateway/OData ist eine globale Struktur
aber sinnvoll.
## Gepruefte Anpassungen Gegenueber Erstentwurf
- Provider-Logik aus Report in globale Klasse ausgelagert.
@@ -53,3 +80,43 @@ Optional fuer Gateway/DDIC:
- Ist `CE11000` der richtige CO-PA-Einzelposten fuer den relevanten Ergebnisbereich?
- Ist Fallback-Code `UNASS` in Feld `WWPSP` lang genug/zulässig?
- Soll `VTWEG` zwingend selektiert werden statt "kleinster VTWEG gewinnt"?
## Gateway-Stand 2026-05-29
Der bestehende Gateway-Service wurde erweitert, statt einen separaten
Service zu verwenden:
- Service: `ZPOWERBI_EINKAUF_SRV`
- Service Root: `http://travt762.sap.trafag.com:8000/sap/opu/odata/sap/ZPOWERBI_EINKAUF_SRV/`
- Entity Type: `ProductDivisionRef`
- Entity Set: `ProductDivisionRefSet`
- DDIC-Struktur fuer Entity Type: `ZSTR_PRODSPARTE_OUT`
Wichtig:
- `FINANZDATASCHWEI_GET_ENTITYSET` gehoert zum bestehenden Sales-EntitySet
und muss den bisherigen `SELECT * FROM zschweiz ...` behalten.
- Produktspartenlogik gehoert in die separat generierte/redefinierte Methode
`PRODUCTDIVISIONR_GET_ENTITYSET`.
- Wenn `/IWFND/MED/170` mit einem Servicenamen wie
`ZPOWERBI_EINKAUF_SRVPRODUCTDIVISIONRSET` erscheint, fehlt in der URL der
Slash zwischen Service und EntitySet.
Korrekte Test-URL:
```text
http://travt762.sap.trafag.com:8000/sap/opu/odata/sap/ZPOWERBI_EINKAUF_SRV/ProductDivisionRefSet
```
Gateway-Feldnamen, wie sie im Web-Mapping verwendet werden:
| Gateway-Feld | Web-Zielfeld |
| --- | --- |
| `Matnr` | Join gegen `Z.Matnr` |
| `Paph1` | `ProductHierarchyCode` |
| `Paph1Text` | `ProductHierarchyText` |
| `Wwpfa` | `ProductFamilyCode` |
| `WwpfaText` | `ProductFamilyText` |
| `Wwpsp` | `ProductDivisionCode` |
| `WwpspText` | `ProductDivisionText` |
| `IsAssigned` | `ProductMappingAssigned` |
@@ -1,6 +1,6 @@
# RAG Product Mapping
Stand: 2026-05-27
Stand: 2026-05-29
## Kurzstand
@@ -14,7 +14,16 @@ Stand: 2026-05-27
## Aktueller Code-Stand
- Vorhanden: `Material`, `ProductGroup`.
- Noch nicht vorhanden: explizite Felder fuer Produkthierarchie, Produktfamilie, Produktsparte.
- Neu vorhanden in `SalesRecord` und `CentralSalesRecord`:
- `ProductHierarchyCode`
- `ProductHierarchyText`
- `ProductFamilyCode`
- `ProductFamilyText`
- `ProductDivisionCode`
- `ProductDivisionText`
- `ProductMappingAssigned`
- `CentralSalesRecords` wird per Schema-Maintenance um diese Spalten erweitert.
- Excel-Export fuehrt die neuen Produktfelder im Blatt `Sales` direkt nach `Product Group`.
- SAP-Seed-Mapping nutzt aktuell `Z.Matnr` -> `Material` und `Z.Prodh` -> `ProductGroup`.
- Zu klaeren: Ist `Z.Prodh` fachlich die Produkthierarchie?
@@ -31,11 +40,28 @@ Stand: 2026-05-27
- Eindeutige `PAPH1 -> WWPFA -> WWPSP` werden in `ZPRODSPARTE_MAP` gespeichert.
- Mehrdeutige PAPH1 werden protokolliert und nicht geschrieben.
- `ZCL_PRODSPARTE_PROVIDER` liest `MVKE-PRODH`, Texte und Mapping.
- OData-Service ruft spaeter dieselbe Provider-Klasse.
- OData-Service ruft dieselbe Provider-Klasse.
## Stand 2026-05-29
- SAP Gateway nutzt bestehenden Service `ZPOWERBI_EINKAUF_SRV`.
- Service Root: `http://travt762.sap.trafag.com:8000/sap/opu/odata/sap/ZPOWERBI_EINKAUF_SRV/`.
- Produktmapping-EntitySet: `ProductDivisionRefSet`.
- Test-Endpoint liefert Daten, z.B. `Matnr=VCP1000`, `Paph1=9999`, `Wwpsp=UNASS`.
- OData-Felder sind CamelCase: `Matnr`, `Paph1`, `Paph1Text`, `Wwpfa`, `WwpfaText`, `Wwpsp`, `WwpspText`, `IsAssigned`.
- Bestehender Sales-EntitySet bleibt `FinanzdataSchweizOeSet`.
- Wichtig: `FINANZDATASCHWEI_GET_ENTITYSET` muss weiter den alten `ZSCHWEIZ`-Select enthalten.
- Produktmapping-Code gehoert in `PRODUCTDIVISIONR_GET_ENTITYSET`.
- Lokale App-Konfiguration fuer Standort `ZSCHWEIZ`:
- Quelle `Z`: bestehender Sales-EntitySet.
- Quelle `P`: `ProductDivisionRefSet`.
- Join: `Z.Matnr = P.Matnr`.
- Mappings: `P.Paph1`, `P.Paph1Text`, `P.Wwpfa`, `P.WwpfaText`, `P.Wwpsp`, `P.WwpspText`, `P.IsAssigned`.
- Lokale App wurde neu gestartet; `http://localhost:55416/` antwortet mit HTTP 200.
- Validierung: `79/79` Tests gruen mit separatem Artefaktpfad.
## Offene Punkte Fuer Sitzung
- Quelle und Format des TR-AG-Artikelstamms.
- Normalisierung der Materialnummern.
- Struktur der Mapping-Tabelle von Kendra.
- Matching-Regeln: exakt, Prefix, Range, Prioritaet.
@@ -44,6 +70,7 @@ Stand: 2026-05-27
- `PAPH1 = MVKE-PRODH(5)` fachlich/technisch bestaetigen.
- Richtige Texttabellen fuer `WWPFA`/`WWPSP` bestaetigen.
- VKORG/VTWEG fuer TR-AG-Referenzlauf bestaetigen.
- Standort `ZSCHWEIZ` im Export Dashboard neu laufen lassen und Fuellung der neuen Produktfelder pruefen.
## Rohquelle Nur Bei Bedarf