Seite 1 von 32 Verifizieren der Geschäftsregeln (Schritt 4.1) Die Abarbeitung der bekannten Geschäftsregeln kann jetzt auf der Basis der bereits vollzogenen Erfahrungen mit dem Datenmodell und dem Datenbestand erfolgen. Es werden überwiegend Data Rules bzw. View-Definitionen sein, mit denen man die Regeln überprüft. Die Ergebnisse aller Analysen sind am Ende der Regelüberprüfung in der Template-Liste T2.50 zusammengefasst. Regel R1 R1: Produkte_Stamm: Bestand muss immer größer sein als Min_Bestand Für die Regel wird eine Data Rule erzeugt und angewendet. Die Regel sieht wie folgt aus: Die Regel R1 im Expression-Editor der Data Rule Definition Die Zuordnung der Spalten der Tabelle PRODUKTE_STAMM zu den Parametern der Data Rule: Die Regel-Parameter Das Ergebnis zeigt, dass die Regel nur zu 20,55 % befolgt wurde. Auswertung der Data Rule zur Überprüfung der Geschäftsregel 1. Nur etwa 20 % der Sätze erfüllen diese Regel. Seite 2 von 32 Regel R2 R2: Wenn Artikelnr = NULL dann Produktnummer NOT NULL und (Status = 2 oder Status =3) oder Wenn Artikelnr NOT NULL dann Produktnummer = NULL und Status = 1 Auch hier wird wieder eine Data Rule definiert: Data Rule-Definition Regel R2 Das Ergebnis für die Regel R2 Die Regel ist zu 84,55 % erfüllt. Das bedeutet bei ca. 15% aller verkauften Objekte der Service GmbH gibt es eine Grauzone, in der nicht gemessen werden kann, ob es sich bei den Verkäufen um Artikel, Dienstleistungen oder Finanzangebote handelt. Regel R3 R3: Wenn Kundenkarte = 1 dann Status = ‚P‘ Die Data Rule hierzu: Die Regel R3 Seite 3 von 32 Das Beispiel zeigt, dass die Regel „komplett“ definiert werden muss. „Komplett“ bedeutet hier, dass auch die Gegenaussage miteinbezogen werden muss. Betrachtet man sich das Ergebnis, so erfüllen nur 19,19 % diese Bedingung, es wird gleichzeitig eine Aussage darüber getroffen, warum die übrigen diese Bedingung nicht erfüllen. Wenn die Bedingung nicht erfüllt ist, dann müsste in dem Feld Kundenkarte eine 1 stehen und in dem Feld Status ein „F“. Alles andere wäre gültig. Das Ergebnis von R3 Die Regel ist nur zu 19,19 % erfüllt. Der Grund für diese hohe Zahl an Defekten ist bereits bei der Analyse zur 1. Normalform sichtbar geworden: Das Feld Status wird sehr stark noch für andere Zwecke verwenden, nämlich zur Darstellung der Qualität der Kundenbeziehung. Damit kann die Anforderung des Marketing nach der Messbarkeit des Erfolgs der Kundenkarte nicht erfüllt werden. Regel R4 R4: Wenn Zahlungsziel in der Vergangenheit überschritten wurde, dann max. 1000€ sonst 2000€. Bei Jahresumsatz > 10000 € / Jahr Kreditlimit 4000 € Die Abarbeitung dieser Regel ist recht komplex und wir werden sie aufgrund mehrerer Umstände auch nicht lösen können. Zur Lösung diese Regel könnte man eine View-Definition verwenden. Aber weil sie so komplex ist, sollte man die Lösung in mehrere Teilschritte gliedern. Dafür bietet sich dann wieder ein klassisches Mapping des Warehouse Builders an. 1. Zunächst einmal muss festgestellt werden, ob ein Kunde sein Zahlungsziel bereits einmal überschritten hatte. Um die Prüfung überschaubar zu halten würde man das Ergebnis sogar zunächst in einer temporären Tabelle ablegen (bei einer View-Definition in einem Zwischen-Set als Sub-Query formuliert). Um das herauszufinden muss man die Bestelldaten aller Käufe mit den Zahlungseingängen abgleichen und feststellen, ob die Frist, die für den Kunden gilt, einmal überschritten worden ist. Diese Frist hängt natürlich, wie wir bereits wissen, von dem Feld Status (P oder F) und dem Besitz einer Kundenkarte ab. 2. In einem zweiten Set hält man dann fest, wie hoch die säumigen Zahlungen des Kunden sind, und ob der Kunde sich noch innerhalb der laufenden Zahlungsfrist befindet. 3. In dem letzten Schritt führt man beide Sets zusammen. Seite 4 von 32 Die vorherigen Analysen haben jedoch bereits ergeben, dass wichtige Voraussetzungen nicht erfüllt sind: - Das Feld für die Kundenkarte nicht immer gepflegt (nur zu ca. 20%) - Das Statusfeld in der Kundentabelle entspricht nicht der 1. Normalform - Die Zahlungen sind nicht auf Positionslevel heruntergebrochen. Damit kann gar nicht vollständig geprüft werden, wann ein Kunde überhaupt gezahlt hat und ob er bereits säumig gewesen ist. Resümee: Die Regel ist nicht prüfbar. Regel R5 R5: Firmenrabatt darf nur gefüllt sein, wenn Status = ‚F‘ Die wird wieder über eine Data Rule geprüft: Die formulierte Data Rule Das Ergebnis von Regel R5 Die Regel ist nur zu 59.30 % erfüllt. Zu berücksichtigen ist, dass das Feld Normalform entspricht. Status nicht der 1. Regel R6 R6: Wenn Kundenkarte = 1 und Status = ‚P’ dann Zahlungsziel = Lieferdatum + 20 Wenn Kundenkarte = 0 und Status = ‚P’ dann Zahlungsziel = Lieferdatum + 10 Wenn Status = ‚F’ dann Zahlungsziel = Lieferdatum + 30 Die Regel birgt ähnlich wie die Regel 4 eine besondere Schwierigkeit. Der zu prüfende Gegenstand ist an keiner Stelle in den Daten nieder gelegt, sondern ist von Zuständen in den Bewegungsdaten abhängig. Die Tatsache, ob jemand sein Zahlungsziel eingehalten hat oder nicht, hängt von dem Zeitpunkt seiner Bezahlung ab. Es gibt lediglich eine allgemeine Regel, die angewendet werden kann. das Zahlenmaterial, das zu prüfen ist muss berechnet werden. Auch das ist ein Fall, für den man die Integration des Profiling in die Datenbank bzw. in OWB nutzen kann. Es wird zunächst eine View-Definition erzeugt. Diese wirkt wie eine Entscheidungstabelle, auf die dann eine Data Rule angesetzt werden kann. Seite 5 von 32 create view VW_Regel_6 as select B.bestellnr Bestnr, sum(B.bestell_total) Rechnung , NVL(sum(z.bestell_total),0) zahlung, (sum(B.bestell_total) - NVL(sum(z.bestell_total),0)) offen, NVL(max(z.Zahltag -z.Bestelldatum-15),999) Zahlzeit, b.kundencode, ks.status Status, KS.Kundenkarte Karte from bestellung B, Zahlung z, Kunden_Stamm KS where b.kundencode= z.kundencode (+) and b.Kundencode = KS.kundennr (+) group by (B.bestellnr,B.kundencode,ks.status,KS.Kundenkarte) order by B.bestellnr Wenn die View-Definition ausgeführt wird, erscheint die folgende Relation: Ergebnis der View-Definition Die Regel, die jetzt auf diese Definition angewendet werden kann lautet: View Definition Ergebnis von Rule_6 Das Zahlungsziel ist von nur 10,64 % der Kunden eingehalten worden. Seite 6 von 32 Dieses Ergebnis müsste noch weiter daraufhin überprüft werden, ob es sich ändert, wenn das fehlerhafte Status-Feld korrigiert wird? Grundsätzlich gelten hier die Bedenken die bereits zu Regel 4 genannt wurden. Regel R7 R7: Bestellung / Best_Position: Die einzelnen Positionswerte müssen aufaddiert den gleichen Wert ergeben wie der komplette Bestellwert Diese Regel kann in zwei Varianten überprüft werden. Die erste arbeitet wieder mit Hilfe einer View-Definition, deren Ergebnis allerdings mit anderen Analyse-Techniken im Profiliner ausgewertet werden kann, z. B. mit Aggregation oder Domain. Die View-Definition: Create view VW_REGEL_7 as Select case B.bestell_total - sum(p.gesamt_pos_preis) when 0 then 'Rule_7_OK' else 'Rule_7_Falsch' end rule_7, B.BESTELLNR bestellnr, B.bestell_total Total, sum(p.gesamt_pos_preis) sum_Pos from Bestellung B, Best_Position P where B.BESTELLNR = P.BESTELLNR group by B.bestellnr,B.bestell_total Das Ergebnis der View-Definition: Ergebnis der View-Definition Dieses Zwischenergebnis kann man jetzt leicht auswerten, indem man die View-Definition als solche in z. B. in der Aggregation anzeigt: Seite 7 von 32 Ergebnis der Regel 7 . Bei 1,8 % stimmt die Summe der Positionswerte nicht mit dem Bestell_TotalWert in der Parent-Tabelle überein Die zweite Variante kommt ohne eine View-Definition aus. Hier definierte man eine Data Rule und verwendet eine SQL-Abfrage innerhalb der Regel. Für jeden „THIS-Wert“ innerhalb der Regeldefinition wird eine SQL-Abfrage abgesetzt. Die Data Rule wird später auf die BESTELLUNG-Tabelle angesetzt und dort werden für jede Bestellnummer die abhängigen Sätze der BEST_POSITION über die SQLAbfrage ermittelt. Data Rule mit eingebundener SQL-Query Seite 8 von 32 Ergebnis der Data Rule mit eingebetteter SQL-Abfrage Das Ergebnis dieser Variante ist natürlich das gleiche wie zuvor. Diese Lösung hat allerdings den Reiz, dass sie vollständig mit Bordmitteln des Profilers auskommt und sie zeigt die Mächtigkeit der Data Rule-Technik, die nur durch den Datenbankkontext möglich ist. Regel R8 R8: Orphans: Bestellpositionen müssen einer Bestellung zugeordnet werden können. Hier hilft die Referential-Analyse, denn sie zeigt in der Spalte „Orphans“ den Wert für die Anzahl der „Waisenkinder“, in diesem Fall 0. Zu allen Bestellungen gibt es abhängige Bestellpositionssätze und es gibt keine einzelnen Positionssätze als sog. „Waisen“ (Orphans) Die manuelle Kontroll-Nativ-SQL-Abfrage: select Anz_Pos_Pro_Best, count(Anz_Pos_Pro_Best) from (select count(*) Anz_Pos_Pro_Best from (Select B.BESTELLNR A,P.Posnummer B from Bestellung B,Best_Position P where B.BESTELLNR = P.BESTELLNR group by B.bestellnr,P.Posnummer) group by A) group by Anz_Pos_Pro_Best order by Anz_Pos_Pro_Best Regel R9 R9: Childless Parents: Bestellungen müssen mindestens eine Position haben. Seite 9 von 32 Diese Regel kann leicht über eine Referential-Analyse überprüft werden, bei der die Bestelltabelle als „Lokale“ Tabelle gewählt wird und die abhängige die Remote-Tabelle darstellt. Sie ist zu 100% erfüllt. Regel R10 R10: Bestellung (Wert, Produkte) = Lieferung (Wert, Produkte) Diese Regel betrifft 2 Tabellen. Zunächst kann festgestellt werden, dass sich beide Tabellen auf der selben Granularitäts-Ebene befinden, also beide auf dem Level von Bestellungen bzw. Bestellnummern. Es gilt BESTELLUNG.Bestellnr = LIEFERUNG.Bestellnr. Auch diese Regel kann man wieder mit einer Data Rule und einer eingebetteten SQL-Abfrage überprüfen. Die Regel wird so formuliert, dass sie an eine Tabelle angehängt werden kann und die SQL-Subquery auf die andere Tabelle zielt. Data Rule für Regel 10 Das Ergebnis besagt, dass nur für aufzeigen. 45.45 % der Bestellungen die Lieferungen analoge Werte Regel R11 R11: Einkaufsmenge = Absatzmenge + Lagerbestand Diese Regel kann nicht überprüft werden, weil es in dem Datenmaterial keine Informationen über die Einkaufsaktivitäten gibt. Es wurde bereits durch die Vollständigkeitsanalyse festgestellt, dass Daten zu dem Geschäftsobjekt „Beauftragung / Order“ fehlen. Regel R12 R12: Wenn Bestell_Position für Produkt mit Status 2 oder 3, dann 1:1 Beziehung zwischen Bestellung und Bestell_Position. Dienstleistungen dürfen also nur einzeln als Position auftreten. Dieser Punkt ist schwieriger zu ermitteln, denn es sind 3 Aspekte zu prüfen: - eine Feldabhängigkeit zwischen zwei Tabellen (PK/FK-Prüfung) - eine bestimmte Kardinalität (es darf nur einen abhängigen Satz geben), - eine bestimmte Kardinalität ist nur in definierten Fällen richtig (bei Status = 2 oder 3, das sind Dienstleistungen). Die Komplexität sollte man mit den zusätzlichen Datenbank-Mitteln innerhalb des OWB minimieren. Zunächst kann man über eine View-Definition einen Zusammenhang zwischen der Anzahl von Positionssätzen zu den jeweiligen Bestellungen herstellen. - Seite 10 von 32 create view Best_Anz_Pos as select Bestellnummer , count(B) Anzahl_Pos from (Select B.BESTELLNR Bestellnummer ,P.Posnummer B from Bestellung B,Best_Position P where B.BESTELLNR = P.BESTELLNR) Group by Bestellnummer; Diese View kann man selbst wieder profilen. Eine Domain-Analyse zu der neu erstellten View-Definition zeigt bereits, dass es in dem Datenbestand nur wenige Bestellungen mit nur einer Position gibt. D. h. entweder sind kaum Dienstleistungen verkauft worden, oder die Regel wurde nicht eingehalten. Die „signifikant“ geringe Häufigkeit von nur einer Position lässt einen Fehler vermuten, denn es kann aufgrund der Erwartung der Fachmitarbeiter nicht sein, dass es so wenige Dienstleistungen im Vertrieb gegeben hat. Weitere Nachforschungen müssen her. Ergebnis einer Domain-Analyse auf die View-Definition. Häufigkeit der Bestell_Positionen pro Bestellung. Es gibt nur 4 Bestellungen mit einer Position. Laut Regel müssten dies die Dienstleistungen sein. Dieser Wert ist viel zu gering. Hier kann ein Fehler vermutet werden. Eine alternative Darstellung zeigt den Zustand noch deutlicher: Die Verteilung der Häufigkeit von Positionssätzen zu Bestellungen. Es fehlt der Wert 0 und 1weil ihr Vorkommen zu gering ist. Hier wurde die graphische Auswertung alternativ zur Tabellendarstellung gewählt. Um auch die letzte offene Frage zu klären, wird die View-Definition um eine weitere Spalte ergänzt. Seite 11 von 32 Verkaufte Dienstleistungen sind an dem Status-Feld in der Child-Tabelle BEST_POSITION zu erkennen. Status 2 und 3 bedeutet Dienstleistung. Das ist zusätzlich abzufragen und in einer weiteren Spalte in der View-Definition zu vermerken. Die erweiterte View-Definition: create view Best_Anz_Pos_Status as select Bestellnummer , count(B) Anzahl_Pos, sum(Dienstleistung) DL from (Select B.BESTELLNR Bestellnummer , P.Posnummer B, (case P.status when 2 then 1 when 3 then 1 else 0 end) Dienstleistung from Bestellung B,Best_Position P where B.BESTELLNR = P.BESTELLNR ) Group by Bestellnummer order by Bestellnummer ; Zum Verständnis der View-Definition: In der View-Definition wurde auf der Positions-Ebene das Status-Feld ausgewertet und das Flag „1“ gesetzt, wenn es sich um eine Dienstleistung handelt (also bei Status = 2 oder 3 -> CASEAnweisung). Das Flag wird auf der Gruppen-Ebene addiert und darf in der Summe nie höher als 1 ergeben, wenn die Regel „Pro Bestellung nur 1 Dienstleistung und sonst nichts anderes“ erfüllt sein soll. Diese neue View-Definition kann zwar ebenfalls mit dem Profiling-Verfahren gemessen werden, aber die SUM()-Operation in der View-Definition ergibt noch falsche Werte. Sie ergibt nur in der gemeinsamen Betrachtung mit der Anzahl der Positionen Sinn. Wir müssen also eine Spaltenübergreifenden Bewertung durchführen, was wir am leichtesten über ein Rule-Objekt im Warehouse Builder erreichen. Mit den Rules kann man bequem Bedingungen mit AND / OR verknüpfen. Die Regel (Rule_Objekt) hat die Form: Rule zur Prüfung dass bei Dienstleistungsverkäufen nur eine Bestell_Position pro Bestellung aufgeführt werden darf. Die Anwendung des Rule-Objektes zeigt, dass nur 0,4 % der Sätze die Bedingung erfüllen, obwohl es wesentlich mehr verkaufte Dienstleistungen geben müsste. Seite 12 von 32 Nur 0,4 % aller Bestellungen erfüllen die Regel „nur 1 Position im Fall von Status = 2 oder 3“ Die Verteilung der Häufigkeit der verkauften Diensstleistungen wenn nach Status = 2 und Status = 3 (Domain-Analyse) Damit ist die Regel 12 nur zu 0,4 Prozent erfüllt. Regel R13 R13: Verkaufspreis – Rabatt > Einkaufspreis wenn Status (Kunde) = ‚P’ und Verkaufspreis – Kundendiscount > Einkaufspreis wenn Status = ‚F’ Diese Regel kann nicht überprüft werden, da keine Einkaufsdaten vorliegen. Regel R14 R14: Eine Bestellung muss immer eindeutig einem Kunden zuzuordnen sein. Diese Regel ist über die Referential-Analyse überprüfbar und zu 100% richtig. Die Überprüfung der Regel 14 über die Referential Analyse Regel R15 R15: Seite 13 von 32 Wenn Artikelnr in Bestell_Pos not NULL und Status (Kunde) = ‚P’ dann Status (Produkte_Stamm = 1 oder 3. Wenn Produktenummer in Bestell_Pos not Null und Status (Kunde) = ‚F’ dann Status (Produkte_Stamm) = 2 Wenn Produktenummer in Bestell_Pos not Null und (Produkte_Stamm) = 3 dann Status (Kunde) = ‚F’ oder ‚P’ Diese Regel will prüfen, ob die verschiedenen Produktgattungen auch wirklich für die entsprechenden Zielgruppen verkauft wurden. Die Lösung gelingt auch hier wieder über eine View-Definition. Die View Definition Create VIEW VW_REGEL_15 as Select substr(p.artikelnummer,1,10) Artikelnummer, substr(p.produktnr,1,15) Produktnummer, substr(p.status,1,5) Produkt_Status, substr(k.status,1,5) Kunden_Status from Bestellung B, Best_Position P, kunden_Stamm k where B.BESTELLNR = P.BESTELLNR and B.kundencode = K.kundennr Das Ablaufergebnis der Viewdefinition: Ergebnis der View-Definition VW_Regel_15 Auf diese View-Definition wird die folgende Data Rule angewendet: Data Rule zum Prüfen der Verwendung von Artikelnummer und Produktenummer Seite 14 von 32 Die Auswertung zur Regel 15. Nur 21 % kommen mit dem verwirrenden Vertauschspiel von Artikelnummer und Produktnummer zurecht. Nur 21,47 % der Verkaufsdaten erfüllen die Regel 15. Auch hier sollte wieder das fehlerhafte Statusfeld in der Kundentabelle berücksichtigt werden. Prüfungen der Geschäftsregeln 15/32 Abarbeitung der benannten Schwachstellen (Schritt 4.2) Bildung von Problem-Komplexen und Priorisierung (Schritt 4.2.2) T1-7-Bekannte Probleme und Schwachstellen Proble m benann t von Vertrieb Marketi ng Buchhal tung Controlli ng Beschreibung Problem-Komplex ProblemKomplexe Priorität keine Zahlen über „sich lohnende Produkte“. keine oder falsche artikelgruppenbezogenen Berichte Korrekte Artikelgruppenberichte sind nur mühsam erstellbar Auswertungen über Sparten sind nicht möglich zu wenig Daten über Kunden trotz Kundenkarte Kundenkarte ist sinnlos. Verkaufszahlen und Kundenkarte ohne Zusammenhang Umsatz / Produkt 2 Umsatz /Artikel_Gruppe 1 Gewährung von Rabatten und Discounts ist nicht nachvollziehbar Warum werden offene Rechnungen nicht gezahlt Lieferungen können nicht nachverfolgt werden Spediteursrechnungen sind nicht nachvollziehbar Retouren können nicht nachvollzogen werden Zusammenhänge von Bestellung, Zahlung und Lieferung sind nicht klar Ganze Produktmengen verschwinden einfach Es fehlt eine einfache Auswertmöglichkeit Einzelne Produkte liefern sehr hohe Verluste, obwohl sie zu den Rennern gehören Auswertungen über Sparten sind nicht möglich mühsam erstellte Listen zu Einkaufs- und Verkaufspreisen auf Produktebene Zuordnung von Produkten zu Lieferanten ist nicht möglich Kunde / Discount LösungsStrategie Umsatz /Artikel_Gruppe Umsatz / Sparte Kunde / Kundenkarte Gewinn / Kunde Rechnungen + Zahlungen Lieferungen 5 4 Spediteursrechnun gen / Detaillierung Lieferungen / Retouren Lieferung, Rechnungen, Zahlungen Lagerlogistik 3 Auswertung zu Verkäufen und Einkäufen Auswertung Einkaufsdaten und Produkte °°°°°°°°(wegkopierte Problemkomplexe) Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln 16/32 Problemkomplex 1 – Fehlerhafte Auswertungen aufgrund fehlerhafter ProduktHierarchie °°°° + alter Komplex 2 Das Orphans-Problem Bereits bei der Analyse von Hierarchien (Phase 3) wurden Orphans festgestellt. Es gab Produkte, die nicht auf der Artikelgruppenebene vertreten sind und auch Artikelgruppen, die nicht auf der Ebene der Artikelsparten zu sehen sind. Das führt automatisch zu falschen Auswerteergebnissen. Das wurde durch die Referential Analyse festgestellt. Eine Lösung besteht natürlich in der Ergänzung der jeweiligen Parent-Tabellen. Zu Testzwecken kann man sich eine View-Definition erstellen, mit der man die korrekte Situation simulieren kann. Diese Arbeit mit SQL hat lediglich den Zweck herauszufinden, wie groß die nicht erkannten Werte in Auswertungen durch fehlerhafte Daten sind. Das Verfahren wird hier einmal durchgespielt, um den möglichen Weg zu zeigen. Die Entwicklung der SQL-Kommandos ist natürlich nur möglich, weil durch die vorher gemachten Analysen die Struktur der Defekte bekannt ist. Ohne die vorherigen Analysen zu Kardinalitäten und Orphans wären die komplexen SQLs sicher nicht denkbar. Eine Fehlerbehebung in Form von SQL sähe etwa so aus: Create View VW_Sparte_Ersatz as Select Artikelspartennr,ARTIKELSPARTENNAME from artikelsparte union select Artikelspartennr,'--> Sparte noch nicht erfasst <--' from artikel_gruppe where Artikelspartennr not in (select Artikelspartennr from artikelsparte); Das Ergebnis liefert z. B. ARTIKELSPARTENNR ARTIKELSPARTENNAME ---------------- ------------------------------------1 Nonfood 2 Food 3 Dienstleistung 4 --> Sparte noch nicht als erfasst <-- Die gleiche Ersatz-View-Definition muss auch auf der Artikelgruppenebene erfolgen: Create view vw_Gruppe_Ersatz as Select substr(ARTIKELGRUPPENNR,1,14) Artikelgruppe, substr(ARTIKELGRUPPENNAME,1,20) Gruppenname, ARTIKELSPARTENNR from artikel_gruppe union select substr(ARTIKELGRUPPENNR,1,14) , '--> Gruppe nicht erfasst <--', 0 from Produkte_Stamm where ARTIKELGRUPPENNR not in (select ARTIKELGRUPPENNR from artikel_gruppe); Ersatz-View-Definition für die Gruppenebene Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln 17/32 Man erhält eine Auswertung wir diese: ARTIKELGRUPPE GRUPPENNAME ARTIKELSPARTENNR -------------- ---------------------------- ---------------1 Haushaltswaren 1 10 Sonst_Finanzdienstle 3 100 --> Gruppe nicht erfasst <-0 11 Vermietungen 4 2 Heimwerker 1 3 Gartenbedarf 1 4 KFZ-Zubehoer 1 5 Computerteile 1 6 Elektroartikel 1 7 Vermittlung_Darlehen 3 8 Vermittlung_Handwerk 3 9 Vermittlung_Sonst_Di 3 Durch diese neue Ersatz-View-Definition ist jetzt eine neue Sparte entstanden, die natürlich auch auf der Spartenebene sichtbar sein muss. Also wird die Ersatz-View-Definition für die Sparten nocheinmal verändert: Create View VW_Sparte_Ersatz as Select Artikelspartennr, ARTIKELSPARTENNAME from artikelsparte union select Artikelspartennr, '--> Sparte noch nicht erfasst <--' from vw_Gruppe_Ersatz where Artikelspartennr not in (select Artikelspartennr from artikelsparte) Modifizierte Ersatz-View-Definition für die Spartenebene Jetzt erhält man ein korrektes Bild aller Artikelgruppen und Sparten, wie sie in der Tabelle PRODUKTE_STAMM genutzt werden kann: ARTIKELSPARTENNR ARTIKELSPARTENNAME ---------------- --------------------------------0 --> Sparte noch nicht erfasst <-1 Nonfood 2 Food 3 Dienstleistung 4 --> Sparte noch nicht erfasst <-- Auswertungen können jetzt über diese Ersatz-View-Definitionen stattfinden. Die Auswertung vor der Korrektur hatte folgendes Ergebnis: select sum(P.gesamt_pos_Preis) Gruppensumme, G.Artikelgruppennr Gruppennummer, substr(G.Artikelgruppenname,1,20) Gruppenname, G.ARTIKELSPARTENNR Spartenr from best_Position P , Produkte_Stamm S, Artikel_gruppe G where (p.produktnr = s.Produktnummer or P.Artikelnummer = S.Artikelnr) and (s.Artikelgruppennr = G.Artikelgruppennr) group by G.Artikelgruppennr,G.Artikelgruppenname,G.ARTIKELSPARTENNR Auswertung auf Artikelgruppen-Ebene vor Korrektur Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln 18/32 GRUPPENSUMME GRUPPENNUMMER GRUPPENNAME SPARTENR ------------ ------------- -------------------- ---------0 10 Sonst_Finanzdienstle 3 4866 2 Heimwerker 1 19444 4 KFZ-Zubehoer 1 19096 1 Haushaltswaren 1 0 7 Vermittlung_Darlehen 3 34697 3 Gartenbedarf 1 15187 6 Elektroartikel 1 1476000 5 Computerteile 1 Und mit dieser Korrektur: select sum(P.gesamt_pos_Preis) Gruppensumme, G.ARTIKELGRUPPE Gruppennummer, substr(G.GRUPPENNAME,1,20) Gruppenname, G.ARTIKELSPARTENNR Spartenr from best_Position P , Produkte_Stamm S, vw_Gruppe_Ersatz G where (p.produktnr = s.Produktnummer or P.Artikelnummer = S.Artikelnr) and (s.Artikelgruppennr = G.ARTIKELGRUPPE) group by G.ARTIKELGRUPPE,G.GRUPPENNAME,G.ARTIKELSPARTENNR Die korrigierte Auswertung über die Ersatz-View-Definition Das korrigierte Ergebnis, das auf der Ersatz-View-Definition basiert lautet: GRUPPENSUMME -----------19096 34697 0 0 4866 1476000 19444 15187 8236 GRUPPENNUMMER -------------1 3 7 10 2 5 4 6 100 GRUPPENNAME SPARTENR -------------------- ---------Haushaltswaren 1 Gartenbedarf 1 Vermittlung_Darlehen 3 Sonst_Finanzdienstle 3 Heimwerker 1 Computerteile 1 KFZ-Zubehoer 1 Elektroartikel 1 --> Gruppe nicht erf 0 Man sieht, dass die Gruppennummer 100 zusätzlich in dem Gesamtergebnis auftaucht. Die Auswertung eine Ebene höher auf den Sparten: select ARTIKELSPARTENNAME, sum(P.gesamt_pos_Preis) Spartensumme, G.ARTIKELSPARTENNR Spartenr from best_Position P , Produkte_Stamm S, Artikel_gruppe G, artikelsparte S where (p.produktnr = s.Produktnummer or P.Artikelnummer = S.Artikelnr) (s.Artikelgruppennr = G.Artikelgruppennr) and G.ARTIKELSPARTENNR = S.ARTIKELSPARTENNR group by S.ARTIKELSPARTENNAME,G.ARTIKELSPARTENNR and Das Ergebnis: ARTIKELSPARTENNAME SPARTENSUMME Stand/letzte Änderung 07.04.2017 SPARTENR 257773842 Prüfungen der Geschäftsregeln 19/32 ------------------ ------------ ---------Nonfood 1569290 1 Dienstleistung 0 3 select substr(SE.ARTIKELSPARTENNAME,1,15) Sparte, sum(P.gesamt_pos_Preis) Spartensumme, G.ARTIKELSPARTENNR Spartenr from best_Position P , Produkte_Stamm S, vw_Gruppe_Ersatz G, vw_Sparte_Ersatz SE where (p.produktnr = s.Produktnummer or P.Artikelnummer = S.Artikelnr) and (s.Artikelgruppennr = G.ARTIKELGRUPPE) and (g.ARTIKELSPARTENNR = se.ARTIKELSPARTENNR) group by SE.ARTIKELSPARTENNAME,G.ARTIKELSPARTENNR Das korrekte Spartenergebnis: SPARTE SPARTENSUMME SPARTENR --------------- ------------ ---------Nonfood 1569290 1 Dienstleistung 0 3 --> Sparte noch 8236 0 Man erkennt den in den Gesamtauswertungen noch nicht berücksichtigten Wert für die noch nicht richtig erfasste Sparte, hier 8236. Fehler aufgrund unterschiedlicher Herleitungsmethoden Die Auswertung zeigt für die Sparte Dienstleistungen den Wert 0. Bereits bei der Auswertung auf Gruppenebene konnte für den Wert 7 und 10, das sind Finanzdienstleistungen, der Wert 0 erkannt werden. Das würde bedeuten, dass keine Dienstleistungen verkauft worden sind. Die Finanzdienstleistungen haben die Produktnummern K5000 /K10000 / K15000 und S10000 wie ein Blick in die PRODUKTE_STAMM-Tabelle zeigt (Domain-Analysen bzw. Anzeigen der Tabelle). Für diese Produktnummern kann man sich die Domain-Analyse für die Tabelle BEST_POSITION ansehen, und wird feststellen, dass doch welche verkauft wurden. Ein Blick in die PRODUKTE_STAMM-Tabelle zeigt die Nummern der Finanzdienstleistungen. Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln 20/32 Domain-Analyse zu den verkauften Produkten. Die Finanzdienstleistungen sind im Bereich von 1,3 bis 1,6 % aller verkauften Produkte verkauft worden. Sie erscheinen aber nicht in den Auswertungen auf Produktgruppen- und Spartenebene. Die Ursache für das Problem kann man an der PRODUKTE_STAMM-Tabelle über die Felder Stueckpreis und Einzelpreis ablesen. Der Umsatz-Wert in den oben gemachten Auswertungen wird in der Tabelle BEST_POSITION über das Feld Gesamt_Pos_Preis ermittelt. Dieses Feld ist in den Positionssätzen durch die Multiplikation von Menge und Preis entstanden. Das hat bereits die Analyse zur funktionalen Abhängigkeit ergeben (3. Normalformprüfung in Phase 3). Hier liegt das Problem. Bei den Finanzdienstleistungen gibt es keinen Einzelpreis. Das Feld ist leer. Also gibt es auch in der Tabelle BEST_POSITION keinen Wert. Die Ursachen sind sicher in der operativen Anwendung zu suchen. Offensichtlich sind die Finanzdienstleistungen später in das Firmenportfolio übernommen worden. Für die Berechnung des Preises gibt es einen anderen Algorithmus. Da diese Darlehen über ein separates Verfahren abgearbeitet werden, ist es nur für Auswertungen ein Problem, wenn das Feld Gesamt_Pos_Preis leer bleibt. Der Gewinn bei den Darlehen kommt über den Jahreszins zustande und muss über eine Zinsberechnung ermittelt werden. Numerische Daten müssen auch rechenbar sein Bei dem Versuch die Umsätze der Finanzdienstleistungen im nachhinein zu berechnen, tritt eine weitere Schwierigkeit auf. Die Werte in dem Feld Stueckpreis sind für Finanzdienstleistungen nicht rechenbar, denn ein „%“-Zeichen folgt dem Wert. Eine Pattern-Analyse zeigt die Verhältnisse deutlich auf. Hier sind zwei Informationen in einem Feld zu finden: Einmal der Wert und zum zweiten die Einheit bzw. die Art des Wertes. Diese zweite Information sollte in einem zweiten Feld (z. B. Einheit) zu finden sein. Diese Konstruktion stellt eine Hürde für einfache Zugriffe dar, die Information ist nicht leicht zugreifbar. Erst über eine aufwendige Umwandlung steht der Wert zur Verfügung. Die Patternanalyse zeigt für das Feld Stueckpreis in der Tabelle PRODUKTE_STAMM, dass dieses Feld nicht „rechenbar“ ist. Das „%“-Zeichen führt zu einem alphanumerischen Wert. Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln 21/32 Auch für dieses Problem wieder eine Alternativermittlung, um die Konsequenzen für Auswertungen zu bewerten. Die Ermittlung der Umsätze über die Finanzdienstleistungen kann über diese SQL-Abfrage erfolgen: Select sum(F.preis) Gruppensumme, substr(F.artikelgruppennr,1,10) Gruppennummer, F.Gruppenname Gruppenname, substr(F.Sparte,1,25) Spartenr from VW_Finanz_Produkte F, BEST_POSITION P where P.produktnr in ('K5000','K10000','K15000','S10000') and P.produktnr = f.Produkt group by f.artikelgruppennr,F.Gruppenname,F.Sparte Die komplette Abfrage für alle Artikelgruppen, also jetzt inklusive der Finanzdienstleistungen, lautet jetzt: Select * from ( (Select sum(F.preis) Gruppensumme, substr(F.artikelgruppennr,1,10) Gruppennummer, F.Gruppenname Gruppenname, substr(F.Sparte,1,25) Spartenr from VW_Finanz_Produkte F, BEST_POSITION P where P.produktnr in ('K5000','K10000','K15000','S10000') and P.produktnr = f.Produkt group by f.artikelgruppennr,F.Gruppenname,F.Sparte ) UNION (select sum(P.gesamt_pos_Preis) Gruppensumme, substr(G.ARTIKELGRUPPE,1,10) Gruppennummer, substr(G.GRUPPENNAME,1,20) Gruppenname, substr(G.ARTIKELSPARTENNR,1,25) Spartenr from best_Position P , Produkte_Stamm S, vw_Gruppe_Ersatz G where (p.produktnr = s.Produktnummer or P.Artikelnummer = S.Artikelnr) and (s.Artikelgruppennr = G.ARTIKELGRUPPE) and (G.ARTIKELGRUPPE not in (7,10)) group by G.ARTIKELGRUPPE,G.GRUPPENNAME,G.ARTIKELSPARTENNR ) ) Das Ergebnis im Beispieldatenbestand liefert GRUPPENSUMME -----------4866 8236 15187 19096 19444 34697 GRUPPENNUM ---------2 100 6 1 4 3 Stand/letzte Änderung 07.04.2017 GRUPPENNAME ------------------------Heimwerker --> Gruppe nicht erf Elektroartikel Haushaltswaren KFZ-Zubehoer Gartenbedarf SPARTENR -------------------1 0 1 1 1 1 257773842 Prüfungen der Geschäftsregeln 66000 10 128500 7 1476000 5 22/32 Sonst_Finanzdienstleistun 3 Vermittlung_Darlehen 3 Computerteile 1 Auf die Summierung auf Spartenlevel kann hier verzichtet werden. Die Gruppen 7 und 10 ergeben zusammen ~ 195000 €. Das sind fast 10% des gesamten Umsatzes. Dieser Wert wäre ohne eine genaue Analyse zu den Basisdaten in den Auswertungen nicht erschienen. Diese Berechnung wurde an dieser Stelle durchgeführt, um die Auswirkungen von fehlerhaften Basisdaten auf aggregierte Auswerteergebnisse aufzuzeigen. Auch das noch so schöne Business Intelligence Tool hat hier keine Chance solche Fehler zu eliminieren. Die Ursachen für die Probleme sind erkannt. Gelöst werden kann dies nur, indem die Ertragssumme auch Produktgruppen gerecht ermittelt werden. Hierzu ein Zitat aus dem (CIO Magazin, 2007) „Dass aber die Ergebnisse von BI-Lösungen immer nur so gut sein können, wie die der verarbeiteten Daten, setzt sich .... nur langsam durch.“ Problemkomplex 2 – Meßbarkeit des Absatzes einzelner Produkte Durch die Übernahme von anderen Unternehmen und den Ausbau der Geschäftsbereiche, sind neue Produktarten in das Portfolio hinzugekommen. Allerdings lebten die Originalnummerierungen fort. So gibt es das Feld „Artikelnr“ und das Feld „Produktnummer“. Damit man dennoch mit den Produktinformationen arbeiten kann, hat man ein Status-Feld eingeführt, in dem festgehalten wird, welches Nummernfeld gilt. Allein diese Konstruktion stellt einen Datenqualitätsmangel dar. Sie widerspricht der Anforderung der Handhabbarkeit. von Daten. Es wurde bereits eine Geschäftsregel (R2) formuliert, um den Umgang mit den unterschiedlichen Nummern zu steuern. R2: Wenn Artikelnr = NULL dann Produktnummer NOT NULL und (Status = 2 oder Status =3) oder Wenn Artikelnr NOT NULL dann Produktnummer = NULL und Status = 1 Bei der Überprüfung dieser Regel ist deutlich geworden, dass diese Regel nur zu ~85% eingehalten wird. Die weitere Überprüfung dieses Zusammenhangs ergibt: Das Statusfeld ist für alle Produkte mit einem Wert gefüllt. Das zeigt die Domain-Analyse auf das Statusfeld: Domain-Analyse für Produkt-Status Die Data-Rule-Analyse (Rule R2) findet zwei Probleme: Einmal sind es die bereits bekannten Finanzdienstleistungen ('K5000','K10000','K15000','S10000'), die unter Produktnummer erfasst sind und dennoch unter Status den Wert 1 verzeichnet haben. Zum anderen gibt es 7 Sätze, die weder eine Produktnummer noch eine Artikelnummer haben. Data-Rule-Analyse für den Zusammenhang Produktnunner / Artikelnr / Status (Überschriften sind korrigiert, da sie im Tool falsch angezeigt werden) Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln 23/32 Hier schließt sich die Frage an, wie sind diese Produkte in den Bestellungen behandelt worden. D. h. die Regel R2 darf nicht nur auf die PRDOKTE_STAMM-Tabelle angesetzt werden. Mit ihr sind auch die Bewegungsdaten, also BEST_POSITION, zu prüfen. Zudem kann man noch eine Reihe weiterer Regeln formulieren, um die Situation der Verwendung von Produkt/Artikelnummern in den Bestelldaten zu verifizieren. Hilfsmittel: Entscheidungstabellen An diesem Fall kann die Verwendung von Entscheidungstabellen in der Kombination mit den Data Rules gut demonstrieren. Die unterschiedlichen Kombinationsmöglichkeiten der Felder „Artikelnr“, „Prodnr“ und „Status“ lassen sich als Entscheidungstabelle formulieren. Damit wird mit Sicherheit jede Fehlervariante erfasst. Eine solche Entscheidungstabelle sieht für den hier betrachteten Problemkomplex so aus: Entscheidungstabelle für die möglichen Regelverletzungen in der BEST_POSITION-Tabell bei der Verwendung der unterschiedlichen Artikelnummierung (Felder Artikelnr/Prodnr/Status) Für jede Entscheidungszeile definiert man eine Data Rule. Für die Benennung der Data Rules sollte die Namensvergabe sprechend gewählt werden. Die Namen erscheinen in der Rules-Sektion des Profile Result-Fensters und man kann die Werte entsprechend leicht ablesen bzw. vergleichen. Achtung bei der Namensvergabe stehen nur 30 Zeichen zur Verfügung, man muss also z. T. stark gekürzte Namensteile nutzen. Auswertung der Data Rules zu den verschiedenen Varianten in der Entscheidungstabelle Hier gibt es eine Reihe von Ergebnissen: Für 10,38 % der Bestell-Positionen sind keine Umsatz-Messungen möglich, weil weder Artikelnr noch Produktnr gepflegt sind. Sie lassen sich nicht auf die Produkt-Stammdaten zurückführen und tauchen daher auch später nicht mehr in produktbezogenen Umsatzauswertungen auf. Um dennoch eine Zuordnung für Auswertezwecke zu erreichen, müssten die entsprechenden Werte manuell nachgetragen werden. Andere Spalten müssten Hinweise auf die richtigen Nummern geben. Aus dem Vorpunkt kann geschlossen werden, dass die Summe aller Best_Positionen mit Artikelnr = NOT NULL und Best_Positionen mit Produktnr = NOT NULL kleiner sein müsste, als die Komplettsumme. Eine Überprüfung mit reinem SQL ergibt, dass das nicht der Fall ist. Für diesen Effekt kann es zwei Ursachen geben: Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln o o 24/32 Es gibt Sätze in denen Artikelnr und Prodnr gleichzeitig gefüllt sind. Das ist nicht der Fall, wie die entsprechende Data Rule zeigt. Es gibt doppelte Produktnummern in der PRODUKTE_STAMM-Tabelle. Das ist der Fall, wie die Domain-Analyse zur PRODUKTE_STAMM-Tabelle zeigt. Damit werden automatisch bestimmte Umsätze verdoppelt. Hier hilft nur eine Dublettenbereinigung in den Produktstamm-Daten. Doppelte Produktnummern Das dritte erkannte Problem sind die BEST_POSITIONEN, die unter Produktnr einen Eintrag besitzen aber unter Status den Wert 1 tragen. Das sind die Finanzdienstleistungen. Hier sollten die Stammdaten einfach manuell korrigiert werden. Problemkomplex 3 – Vergleichbarkeit von Daten (Ein-/Verkaufsdaten) Bei der Bearbeitung dieses Komplexes gilt der erste Blick wieder den Stammdaten. Hier betrachtet man die eingetragenen Einkaufs- und Verkaufspreise, weil sie die Grundlage für die Bewegungsdaten darstellen. Um das zu klären, muss zunächst jedoch eine Art Bestandsaufnahme gemacht werden. Hilfsmittel: Fragen formulieren Im folgenden wird ein weiteres Verfahren vorgestellt. Um Sachzusammenhänge, die man prüfen will, griffiger zu machen, formuliert man zunächst Fragen. Diese Fragen sollten einfache Aussagen gebildet werden. Man kann sie bereits so wählen, dass im Folgenden Data Rules sehr leicht daraus abgeleitet werden können. Zu dem gestellten Problem formuliert man also die Frage: Liegen alle Stammdaten vor? Das sind Einkaufsstueckpreis, Einkaufseinzelpreis, Stueckpreis und Einzelpreis. Bereits ein Blick in die Aggregation-Analyse zeigt, dass ein großer Teil der Daten unbrauchbar ist. Allerdings zeigt die Aggregation-Analyse für Einkaufsstueckpreis und Einkaufseinzelpreis die gleiche Häufigkeit von NULLs, also fehlenden Werte. Das lässt vermuten, dass es hier einen Zusammenhang zu einer anderen Größe geben muss. Die Zahl 76,7% wird auch bei anderen Attributen wieder gefunden. Daraufhin kann eine weitere Frage formuliert werden: -> Um welche Art von Produkten handelt es sich, wenn diese Felder nicht ausgefüllt sind? und - > Wenn Spalten ausgefüllt sind, sind sie in einer bestimmten Häufigkeit ausgefüllt? Dahinter steckt der Versuch herauszufinden, ob zumindest für einen Teil der Produkte gültige Preisaussagen getroffen werden können. Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln 25/32 Blick auf die Stammdaten zu den Einkaufs- und Verkaufspreisen Ein Indikator hierfür kann wieder das Status-Feld sein, das ja mal eingeführt wurde, um Artikel und Produkte zu unterscheiden. Hier helfen Rules. Überprüfung der Abhängigkeit bei den Vorkommen von Einzelpreis und Stückpreis Die erste Regel (EINZEL_AND_ESTUECK_NULL_ST_1) überprüft das gleichzeitige Fehlen von Werten bei beiden Preisarten und gleichzeitigem Statuswert 1. Das Vorkommen von 57,53 % bestätigt die Vermutung, dass es sich hier um Artikel mit Artikelnummern handelt. Alles andere sind Varianten mit Produkt-Status 2 oder 3 oder einfach nur abweichende Werte. D. h. bei Artikeln mit einer Artikelnummer fehlt der Einzelpreis. Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln 26/32 Ein Ergebnis hier ist, dass für die mit einer Artikelnummer gekennzeichneten Einträge nicht überprüft werden können, denn es liegen keine Einkaufspreise vor. Für eine weitere Analyse kann man sich also auf die Einträge mit Status 2 oder 3 beschränken. Die Regel E_EINZEL_AND_E_STUECK_P_NULL bestätigt mit 76,71%, dass tatsächlich beide Felder immer gleichzeitig leer sind. Aus der Functional Dependency – Analyse wissen wir bereits, dass es innerhalb der Tabelle BEST_POSITION eine funktionale Abhängigkeit zwischen der verkauften Menge und dem Preisfeld der Tabelle gibt. Diese Functional Dependency – Analyse kann man über eine View-Definition und unter Berücksichtigung der vorher festgestellten fehlerhaften Produktdaten auch auf die PRODUKTE_STAMM-Tabelle ausweiten. create view VW_EV_Preis_Check as select substr(p.produktnummer,1,25) Produktnummer, substr(p.EINKAUFS_STUECKPREIS,1,15) E_stueckpreis , substr(p.EINKAUFS_EINZELPREIS,1,15) E_einzelpreis , substr(p.STEUCKPREIS,1,15) V_stueckpreis , substr(p.EINZELPREIS,1,15) V_einzelpreis , b.PREIS pos_EInzel_Preis, b.GESAMT_POS_PREIS, b.BESTELLMENGE POS_BESTELLMENGE from produkte_Stamm p, best_position b where artikelnr is null and b.PRODUKTNR = p.Produktnummer Die View-Definition zum Vergleichen von Einkaufs und Verkaufspreisen Zur Sicherheit wird zunächst eine Data Type-Analyse zu der neuen View-Definition vorgenommen: Es fällt auf, dass einzelne Werte in den Stammdaten nicht „rechenbar“ sind. In dem Verkaufsstückpreis sind %-Werte enthalten. Das sind die Finanzprodukte, der entgültige Umsatz muss hier über eine zusätzliche Formel zunächst ermittelt werden. Nicht rechenbare Daten in den Preisfeldern. Diese View-Definition bietet diese zusammenhängende Sicht auf Produkt und Bewegungsdaten. Auch diese ViewDefinition wird dem Profiling-Vorgang mit dem Ziel der Erkennung von Abhängigkeiten unterworfen. Zusammenführung von Ein- und Verkaufsdaten in einer View-Definition Doppelte Stammdatendatensätze Die Functional Dependency – Auswertung zeigt dann ganz beiläufig die nächste Unsauberkeit: Offensichtlich gibt es in den Stammdaten nicht nur doppelte Produktsätze, sondern auch doppelte Produktsätze mit unterschiedlichen Preisangaben. Das Produkt „20557-Fischer-Buesum“ ist mit zwei unterschiedlichen Einkaufs_Stueckpreis- und Einkaufs_Einzelpreis-Angaben vorhanden. Das könnte auch noch richtig sein, wenn sich der Preis zwischenzeitlich geändert hätte. Aber dann müsste sich auch der Gesamt_Pos_Preis in Abhängigkeit von Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln 27/32 der Menge ebenfalls ändern. Diese Änderung findet aber nicht statt. Der teuere Einkaufspreis ist zwar als Verkaufspreis übernommen worden, die Berechnung des Gesamtpreises, also Verkaufspreis mal Menge, ist falsch. Als Ursache kann man vermuten, dass bei der Berechnung des Gesamtpreises auf die Stammdaten zurückgegriffen wurde, aber aufgrund des nicht eindeutigen Zugriffsverfahrens der „falsche“ Satz erwischt wurde. Zur Lösung müsste in den Produktstammdaten gekennzeichnet sein, welcher Preis für eine jeweilige Verkaufsaktion gilt. Functional Dependency Ausschnitt. „20557-Fischer Buesum“ ist zweimal, allerdings mit unterschiedlichen Verkaufspreisen, jedoch mit gleichen Gesamt-Positions-Werten, vorhanden. Betrachten wir noch ein weiteres Phänomen: Gefunden wird eine Abhängigkeit zwischen der Bestellmenge und dem Einzel_Preis deren Multiplikation zu 100% den Gesamt_Preis pro Position ergeben. Das ist sicher richtig. Betrachten wir jedoch den Verkaufs_Einzelpreis, also die Information, die über den View aus den Stammdaten kommt, dann finden wir zwar auch eine Abhängkeit, allerdings nur zu 85,1 %. Bei der Suche nach den abweichenden Werten, entdecken wir auch hier, dass zwischen dem Einzelpreis in den Bewegungsdaten (BEST_POSITION) und dem Verkaufseinzelpreis in den Stammdaten (PREDUKTE_STAMM) bei einzelnen Produkten Unterschiede bestehen. Und zwar genau bei 14,9 % aller Bestellpositionen. Die Functional Dependency Analyse zeigt Unterschiede in den Beziehungen von Bestellmenge und Einzelpreisen. Die Data Drill-Anzeige für die von der Abhängigkeitsregel abweichenden Sätze zeigt, wo die Unterschiede liegen. In den Bewegungsdaten sind andere Einzelpreise verwendet worden, als in den Stammdaten Mit der hier genutzten View-Definition kann jetzt auch sehr leicht überprüft werden, ob sich Einkaufs- und Verkaufspreise in einer entsprechenden Relation befinden. Hier definiert man wieder eine einfache Data Rule, die misst, wie oft der Verkaufspreis wirklich höher als der Einkaufspreis ist. Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln 28/32 Das Ergebnis listet tatsächlich einige Ausreißer auf. Bei über 34 % der messbaren Bewegungsdatensätze wurden offensichtlich Dinge verkauft, deren Einkaufspreis höher als der Verkaufspreis lag. Die Zahl erscheint zunächst sehr hoch. Es sollte jedoch berücksichtigt werden, dass bei dieser Messung nur die Produkte mit einer eingetragenen Produktnummer in der Betrachtung enthalten sind. Bei den mit einer Artikelnummer gekennzeichneten Produkten, gibt es keine dokumentierten Ein- und Verkaufspreise. In über 34% der mit einer Produktnummer dokumentierten Produkte liegen die Verkaufspreise höher als die Einkaufspreise. Um eine Kommastelle vertan Hier lohnt ein Blick in das Data Drill Panel, denn die Unterschiede zwischen Ein- und Verkaufspreisen fallen nicht immer gleich gravierend aus. Es gibt 3 Fälle, bei denen es sich offensichtlich um ein verschobenes Komma und damit um eine 10ner Potenz handelt Das Produkt „20556-Fischer-Buesum“ ist ein solcher Fall. Tatsächlich wurde hier mit dem um eine Stelle verschobenen, falschen Verkaufspreis multipliziert, so dass der Gesamtpositions_Preis auch falsch ist. Hier geht sehr viel Geld verloren. Überlagerte Defekte verstecken sich gegenseitig Bei dem Produkt „20557-Fischer-Buesum“ haben wir wieder die Situation, dass die Einzel-Positions-Werte (POSEINZEL_PREIS), also der Einzelpreis aus den Bewegungsdaten nicht dem Einzelpreis aus den Stammdaten (V_EINZELPREIS) folgt. Das Phänomen hatten wir oben bereits festgestellt. Hier ist es jedoch noch zusätzlich durch das Problem mit dem verschobenen Komma überlagert. Die Folgen der Fehler wirken sich in zwei Richtungen aus und heben sich gegenseitig auf Die übrigen Fälle sind nicht so gravierend aber dennoch falsch. Ein kurioser Fall zeigt, dass sich die Bilanz auch wieder in die entgegengesetzte Richtung drehen kann. Das Produkt „4432-Knoll-Hannover“ besitzt als Verkaufs_Einzelpreis den Wert 0 und im Einkauf steht eine Zahl 1300. Aber bei der Berechnung des tatsächlichen Gesamtwertes der Position (POS_GESAMT_PREIS) entsteht wieder ein fast verdoppelter Einkaufswert. Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln 29/32 Kurioser Fall: Zu seinen Gunsten verrechnet Hilfsmittel: Regeln ableiten Komplexe Zusammenhänge, an denen mehrere Faktoren beteiligt sind, löst man zunächst, indem man eine klare Definition der beteiligten Größen festlegt. Die Größen erhalten Namen und man schreibt sie nebeneinander. Daraus leitet man dann Formeln ab, mit denen man die Abhängigkeit zwischen diesen Größen nachbildet. Letztlich läuft die Analyse des aktuellen Problems auf den rechnerischen Vergleich der folgenden 7 Größen hinaus: Einkaufs einzelpreis Einkaufs Stueckpreis Verkaufseinzelpreis Verkaufsstückpreis Verkaufsmenge Stückzahl Verkaufspreis EEP bezogen auf die handelbar e Einheit ESP Das ist der tatsächliche Einzelpreis des jeweiligen Handelsgut es. Er dient als Rechenbasi s, wenn auf sich ändernde Handelsein heiten umgerechn et werden muss. VEP Das ist wieder der Einzelpreis pro Handelseinh eit. VSP Das ist der tatsächliche Einzelpreis unabhängig von Handelseinheit en VM Das ist die Menge der Verkauften Handelsein heiten. SZ Anzahl Stück pro Handelsein heit VP Rechnungs -preis aus Menge mal Verkaufseinzelpreis Tabelle zur Verdeutlichung der Einflussfaktoren zur Berechnung des Endpreises Diese Größen müssten im Unternehmen dokumentiert sein. Das Beispiel zeigt, dass dies nicht immer der Fall war. Denn in einigen Rechenergebnisse konnte man bereits anhand der Zahlenwerte sehen, dass zur Berechnung des Rechnungswertes für den Kunden der Stueckpreise zu Grunde gelegt wurde. Nicht aber der wesentliche höhere Einzelpreis, der ja eine Obermenge des Stückpreises darstellt. Im Verlauf der Analyse sollte aber zu einem bestimmten Zeitpunkt Klarheit über diese Größen sein. Aus dieser Tabelle kann man schließlich leicht die gültigen Regeln bzw. Formeln ableiten: z. B.: EEP >= ESP EEP < VEP VP = VM * VEP VEP= VSP*SZ VP = VSP*SZ*VM Diese Regeln lassen sich wieder wie oben gezeigt in Data Rules formulieren, und über das Profiling prüfen. Problemkomplex 4 – Liefervorgänge Folgende Fragestellungen sollten hier beantwortet werden: -> Wird bei einer Bestellung auch geliefert? Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln 30/32 -> Werden gelieferte Waren auch gezahlt? Zur Überprüfung kann man wieder eine Data Rule in Verbindung mit einer View-Definition nutzen. Die View-Definition: create view VW_Best_Lief as select b.Bestelldatum best_Bestelldatum, L.Bestelldatum Lief_Bestelldatum, L.Lieferdatum Lief_Lieferdatum, B.Bestell_Total best_Bestell_Total, L.Bestell_Total Lief_Bestell_Total, L.Lieferkosten Lief_Lieferkosten, L.Brutto_Betrag Lief_Brutto_Betrag from bestellung B, lieferung L where b.Bestellnr = L.Bestellnr Diese View-Definition liefert die folgenden Werte: Die View-Definition zur Analyse der Zusammenhänge von Bestellungen und Lieferungen. Die Data Rules können fast 1:1 zu den oben formulierten Fragen definiert werden. Danach wird festgestellt: Allen Bestellungen folgt auch eine Lieferung. Zumindest gibt es einen entsprechenden Liefersatz. Alle Bestellungen sind auch geliefert worden Die weitere Überprüfung läuft jetzt wie in den Beispielen zuvor. Über eine Domainanalyse auf die View-Definition stellt man fest, dass bei 14,9 % keine Zahlungen vorliegen. Bei einer weiteren Analyse dieser Nicht-Zahler wird man auf Reklamationen stoßen, die nicht im System enthalten sind. Diese können auch nicht als Datenqualitätsmängel identifiziert werden. Die Daten sind einfach nicht da und die Lieferung erscheint als eine zu zahlende Lieferung. Hier müsste der Lieferprozess verbessert werden. Um weitere Prüfungen durchzuführen stellt man auch hier wieder Datenregeln auf, um Abhängigkeiten zu prüfen. Problemkomplex 5 – Kundenkartenauswertungen Die Auswertungen rund um die Kundenkarte erfolgt nach den gleichen bereits vorgestellten Verfahren. Zunächst stellt man die interessierenden Fragestellungen auf: -> Wie viele Kunden besitzen eine Kundenkarte? -> Erzielt man mit Kartenbesitzern mehr Umsatz, als mit Kunden ohne Karten? -> Was sind hilfreiche Informationen über Kunden? Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln 31/32 -> Liegen diese hilfreichen Informationen bei Kundenkartenbesitzern vor? Dann wird man wieder passende View-Definitionen und Data Rules formulieren. Das ist aber eine Wiederholung der Verfahren von zuvor und wird hier nicht mehr vorgestellt. Zusammenfassung der Ergebnisse der Analyse der Problemkomplexe (PK 1-4) Zusammenfassung zu den Problemkomplexen und Lösungen Aspekt PK 1 Orphans in Artikelgruppen und Artikelsparten Die Einnahmen für Finanzdienstleistungen können nicht richtig gemessen werden Orphans in Produktestamm Maßnahmen Fehlende Artikelgruppen definieren Fehlende Spartennummern definieren Erfassen der Einnahmen von Finanzdienstleistungen mit separaten Spalten in den entsprechenden Tabellen Feld Stueckpreis in Produkte_Stamm in zwei Felder auflösen: in ein Wertefeld und ein Einheitenfeld. Artikelgruppennummern pflegen PK 2 Es gibt doppelte Produktnummern. Dies führt bei Auswertungen zu diesen Produkten zu doppelten Umsätzen, die in Wirklichkeit nicht da sind. Finanzdienstleistungen haben den Produkt_Status-Wert von 1, obwohl sie einen Wert von 3 haben müssten. Das führt zu verfälschten Auswerten. Finanzdienstleistungen werden als solche nicht erkannt. Deduplizieren Produktstammdaten von Für Artikel mit Artikelnummern und Status = 1 lassen sich keine Preisherleitungsregeln überprüfen, da es hierfür in den Daten keine Einkaufspreise gibt. Bei doppelten Produkte-Stammsätzen ist nicht klar erkennbar, ob diese Sätze einfach nur doppelt sind, oder ob es sich um eine Variante mit einem anderen Preis handelt. Unabhängig davon, wird dennoch der Preis von immer nur einem Satz für die Berechnung herangezogen. Bei etwa einem Drittel der Produkte mit Produktnummern werden die Waren zu niedrigeren Preisen verkauft, als sie eingekauft wurden. Die Differenzen sind unterschiedlich stark. Durch weitere Rechenfehler zu Gunsten des Unternehmens wird der entstandene Verlust wieder minimiert. Preise nachpflegen Fehlende Zahlungen entpuppen sich als Reklamationen, die jedoch nicht gemessen werden können, da sie nirgends erfasst sind. Erfassung von Reklamationen und Zuordnung zu Bestellungen auf Positionsebene. Korrektur des Status-Wertes bei Finanzprodukten von 1 auf 3 PK 3 Berechnung von Gesamt_Pos_Preis überprüfen. Alle Algorithmen, die diesen Wert berechnen, müssen ihre Grunddaten aus identischen Quellen beziehen. Auf korrektes Beziehen von Grunddaten bei der Berechnung achten. Klare Definition von Kenngrößen z. B. Einzelpreis und Stueckpreis. PK 4 Stand/letzte Änderung 07.04.2017 257773842 Prüfungen der Geschäftsregeln 32/32 Zusammenfassung der Erfahrungen mit der Service GmbH (Phase 4) Abschließend sollte man die gesammelten Analyseergebnisse zusammenfassen. Dies geschieht u. a. in einem allgemeinen Bericht, in dem die gefundenen Problembereiche skizziert werden. Ein solcher Bericht ist für das verantwortliche Management geeignet und sollte auch Aussagen über das Ausmaß der Qualitätsprobleme beinhalten. Wirklich hilfreich sind natürlich die Einzelergebnisse, da nur durch sie konkrete Korrekturmaßnahmen gefunden werden können. Das ist eine Zusammenstellung der Templates, der Abarbeitung der Geschäftsregeln und schließlich die Ergebnisse aus der Bearbeitung der Problemkomplexe. Das muss in dieser Unterlage nicht noch einmal aufgelistet werden. Generelle Empfehlungen Die Produkte_Stamm-Verschlüsselung muss komplett überarbeitet werden. Es sollten neue, über alle Produktgurppen hinweg eindeutige Schlüssel vergeben werden. Wenn dies aus unterschiedlichen Gründen nicht gelingt, so sollte es möglich sein über eine entsprechende Konkatenierung von historischen Schlüsseln und einer Referenznummer diese Eindeutigkeit herzuleiten. Eine Data Warehouse kann helfen Ein einfache Lösung kann für viele Bedürfnisse aus den Fachabteilungen erstellt werden. Es ist die Erstellung einer separaten Datenhaltung in Form eines Data Warehouses. Ein solches Data Warehouse müsste in seinen Auswertedatenmodellen folgende Informationen liefern. Alternatives Datenmodell speziell für Auswertezwecke optimiert. Die grauen Kästen sind die Bewegungsdaten Das hier abgebildete Datenmodell ist zunächst redundanzfrei (mit Ausnahme der denormalisierten Strukturen in den Produkte- und Kundenstammdaten). Die Bewegungsdaten befinden sich Ausnahmslos auf dem Level von Bestellpositionen. Die zentrale Tabelle, die alle Informationen zusammenhält ist die Bestelltabelle. Stand/letzte Änderung 07.04.2017 257773842