OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMENEN OPERATIVEN DATEN OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN INHALTSVERZEICHNIS: 1 EINFÜHRUNG ........................................................................16 1.1 ZIEL DER ARBEIT ............................................................................. 16 1.2 VORGEHENSWEISE ........................................................................... 16 2 DATENMODELLIERUNG ........................................................17 2.1 SEMANTISCHES DATENMODELL ........................................................ 17 2.1.1 ENTITÄTEN (ENTITIES) .......................................................................... 18 2.1.2 ENTITÄTSMENGEN (ENTITY SETS) ........................................................ 18 2.1.3 ATTRIBUTE UND SCHLÜSSEL .................................................................. 19 2.1.4 BEZIEHUNGEN (RELATIONSHIPS) .......................................................... 20 2.1.5 KARDINALITÄTEN VON BEZIEHUNGEN .................................................. 21 2.1.5.1 1-1 BEZIEHUNGEN........................................................................... 21 2.1.5.2 1-N BEZIEHUNGEN .......................................................................... 22 2.1.5.3 M-N BEZIEHUNGEN......................................................................... 22 2.1.5.4 DIE REKURSIVE BEZIEHUNG ........................................................ 22 2.2 LOGISCHES DATENMODELL .............................................................. 23 2.2.1 ALLGEMEINES ........................................................................................ 23 2.2.2 DATENMODELLE..................................................................................... 24 2.2.2.1 HIERARCHISCHES DATENMODELL.............................................. 24 2.2.2.2 NETZWERKDATENMODELL ........................................................... 25 2.2.2.3 RELATIONALES DATENMODELL ................................................... 25 2.2.2.4 OBJEKTORIENTIERTES DATENMODELL ..................................... 26 2.2.2.5 OBJEKTRELATIONALES DATENMODELL..................................... 27 2.2.3 ÜBERFÜHRUNG DES ER-MODELLS INS RELATIONALE MODELL .......... 27 2.2.3.1 DIE UMSETZUNG DER 1:1 BEZIEHUNG....................................... 29 2.2.3.2 DIE UMSETZUNG DER 1:N BEZIEHUNG ...................................... 30 2.2.3.3 DIE UMSETZUNG DER M:N BEZIEHUNG..................................... 30 -2- OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 2.2.3.4 2.3 DIE UMSETZUNG EINER REKURSIVEN BEZIEHUNG................. 31 PHYSISCHES DATENMODELL............................................................. 31 3 SQL UND DATENBANKEN ....................................................32 3.1 DATENBANKEN ................................................................................ 32 3.1.1 ENTWICKLUNGSGESCHICHTE DER DATENBANKSYSTEME .................... 32 3.1.2 BEGRIFFSDEFINITIONEN ........................................................................ 32 3.1.3 ANFORDERUNGEN EINES DATENBANKSYSTEMS .................................... 33 3.2 SQL ALS STANDARDISIERTE DATENBANKSPRACHE ............................. 34 3.2.1 GESCHICHTLICHES ................................................................................. 34 3.2.2 DAS RELATIONALE MODELL ................................................................. 36 3.2.2.1 RELATIONALE DATENSTRUKTUR ................................................. 36 3.2.2.1.1 DOMÄNEN:.................................................................................... 36 3.2.2.1.2 RELATIONEN: ............................................................................... 36 3.2.2.1.3 EIGENSCHAFTEN VON RELATIONEN ............................................ 37 3.2.2.2 RELATIONALE INTEGRITÄT ........................................................... 38 3.2.2.2.1 SCHLÜSSELKANDIDAT (CANDIDATE KEY).................................... 38 3.2.2.2.2 PRIMÄRSCHLÜSSEL (PRIMARY KEY)............................................ 38 3.2.2.2.3 FREMDSCHLÜSSEL (FOREIGN KEY).............................................. 38 3.2.2.2.4 ENTITÄTSINTEGRITÄT .................................................................. 38 3.2.2.2.5 REFERENZIELLE INTEGRITÄT (REFERENTIAL INTEGRITY) ........ 38 3.2.2.3 RELATIONALE DATENMANIPULATION ........................................ 39 3.2.2.4 NORMALFORMEN ............................................................................ 40 3.2.2.4.1 ERSTE NORMALFORM (1NF) ....................................................... 40 3.2.2.4.2 ZWEITE NORMALFORM (2NF)..................................................... 40 3.2.2.4.3 DRITTE NORMALFORM (3NF) ..................................................... 40 3.2.2.4.4 BOYCE-CODD-NORMALFORM (BCNF) ....................................... 41 3.2.2.4.5 VOR- UND NACHTEILE DER NORMALISIERUNG .......................... 41 3.2.2.5 SICHTEN (VIEWS) ............................................................................. 41 -3- OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 3.2.2.5.1 TERMINOLOGIE ............................................................................ 41 3.2.2.5.2 ZWECK VON SICHTEN .................................................................. 42 3.2.2.5.3 AKTUALISIERUNG VON SICHTEN ................................................. 42 SQL NACH DEM STANDARD SQL 99 ..................................................... 42 3.2.3 3.2.3.1 SQL ALS DDL..................................................................................... 43 3.2.3.1.1 ERZEUGEN VON DBMS-OBJEKTEN (CREATE)......................... 43 3.2.3.1.2 ÄNDERN VON DBMS-OBJEKTEN (ALTER)................................ 43 3.2.3.1.3 VERGABE VON RECHTEN (GRANT) ........................................... 44 3.2.3.1.4 ENTZIEHEN VON RECHTEN (REVOKE) ..................................... 44 3.2.3.2 SQL ALS DML .................................................................................... 44 3.2.3.2.1 DIE SELECT ABFRAGE............................................................... 44 3.2.3.2.2 DIE INSERT ANWEISUNG ........................................................... 45 3.2.3.2.3 DIE UPDATE ANWEISUNG ......................................................... 45 3.2.3.2.4 DIE DELETE ANWEISUNG .......................................................... 45 3.2.3.3 SQL ALS DCL..................................................................................... 45 4 ERP-SYSTEME ......................................................................46 5 DAS DATA WAREHOUSE ......................................................47 5.1 DAS KONZEPT DES DATA WAREHOUSE ............................................. 47 5.2 ARCHITEKTUR EINES DATAWAREHOUSE ............................................ 48 5.2.1 OPERATIVE DATEN ................................................................................ 49 5.2.2 EXTERNE DATENBANKEN....................................................................... 50 5.2.3 DIE METADATEN .................................................................................... 50 5.2.4 DIE DATENPUMPEN ................................................................................ 50 5.2.5 DER DATAWAREHOUSE MANAGER........................................................ 50 5.2.6 ZUGRIFFSWERKZEUGE FÜR DEN ENDBENUTZER................................... 50 5.2.6.1 WERKZEUGE FÜR BERICHTE UND ABFRAGEN ......................... 51 5.2.6.2 WERKZEUGE ZUR ENTWICKLUNG VON ANWENDUNGEN ....... 51 5.2.6.3 EXECUTIVE INFORMATION SYSTEM WERKZEUGE (EIS) .......... 51 -4- OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 5.2.6.4 DECISION SUPPORT SYSTEME (DSS)............................................ 52 5.2.6.5 ONLINE ANALYTICAL PROCESSING WERKZEUGE (OLAP) ....... 52 5.2.6.6 DATA MINING WERKZEUGE .......................................................... 52 5.3 OPERATIVE UND ANALYTISCHE DATEN .............................................. 53 5.4 AUFBAUEN UND AKTUALISIEREN EINES DATAWAREHOUSE AUS DEN DATENQUELLEN ......................................................................................... 55 5.4.1 KLASSISCHE VORGEHENSWEISE BEIM AUFBAUEN UND AKTUALISIEREN EINES DATAWAREHOUSE ........................................................................................ 55 5.4.2 NEUE ANSÄTZE FÜR DAS AUFBAUEN UND AKTUALISIEREN DER MATERIALISIERTEN SICHTEN ................................................................................ 55 5.4.2.1 DER WHIPS PROTOTYP................................................................... 56 5.4.2.2 DER SUMMARY TABLE ANSATZ ..................................................... 58 5.4.2.3 DER MULTIPLE VIEW MAINTENANCE POLICIES ANSATZ ........ 59 5.5 INFORMATIONSFLÜSSE IN EINEM DATA WAREHOUSE ......................... 60 5.5.1 INFLOW ................................................................................................... 60 5.5.2 UPFLOW .................................................................................................. 61 5.5.3 DOWNFLOW ............................................................................................ 61 5.5.4 OUTFLOW ............................................................................................... 61 5.5.5 METAFLOW ............................................................................................ 61 5.6 PROBLEME IM DATA WAREHOUSE .................................................... 62 5.7 VORTEILE EINES DATAWAREHOUSE................................................... 63 5.8 ANFORDERUNGEN AN EIN DATENBANKSYSTEM FÜR EIN DATAWAREHOUSE ...................................................................................... 64 5.9 DATA MARTS .................................................................................... 66 5.10 DIE MODELLIERUNG EINES DATAWAREHOUSE ............................... 67 5.10.1 MODELLTHEORIE ................................................................................... 67 5.10.2 ATTRIBUTE ............................................................................................. 68 5.10.3 DIMENSIONEN UND HIERARCHIEN ......................................................... 68 5.10.4 DIE DATENWÜRFEL ................................................................................ 69 -5- OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 5.10.5 OPERATOREN ......................................................................................... 70 5.10.6 SLICE AND DICE ..................................................................................... 71 5.10.7 NAVIGATION DURCH DEN DATENBESTAND............................................ 72 5.10.8 KONZEPTIONELLE ODER SEMANTISCHE MODELLIERUNG ................... 73 5.10.8.1 GRAPHISCHE MODELLIERUNG ................................................ 73 5.10.8.2 HALBGRAPHISCHE MODELLIERUNG ...................................... 75 5.10.8.2.1 GITTER ....................................................................................... 75 5.10.8.2.2 AGGREGATION PATH ARRAY .................................................... 76 5.10.9 LOGISCHE UND PHYSIKALISCHE MODELLIERUNG ............................... 76 5.10.9.1 STAR-SCHEMA .............................................................................. 76 5.10.9.2 FACT CONSTELLATION-SCHEMA.............................................. 78 5.10.9.3 SNOWFLAKE-SCHEMA ................................................................ 79 5.10.9.4 GALAXY-SCHEMA......................................................................... 80 5.10.9.5 DAS UNIMU-SCHEMA.................................................................. 81 6 DIE MODELLIERUNGSMETHODE AGGREGATION PATH ARRAY.........................................................................................83 7 FORSCHUNGSSCHWERPUNKT UND ERGEBNISSE ................90 7.1 DAS GRUNDPROBLEM UND DER LÖSUNGSANSATZ ............................. 90 7.2 DIE VORGEHENSWEISE..................................................................... 91 7.3 ABGRENZUNG DER PHASEN DER BETRACHTUNG................................ 92 7.4 VERWANDTE ALGORITHMEN IM PROBLEMZUSAMMENHANG ............... 94 7.4.1 KÜRZESTE UND LÄNGSTE WEGE ............................................................ 94 7.4.1.1 BEGRIFFSBESTIMMUNGEN ........................................................... 94 7.4.1.1.1 GRAPHEN ...................................................................................... 94 7.4.1.1.2 EINGANGS- UND AUSGANGSGRAD ............................................... 95 7.4.1.1.3 WEG, ZYKLUS .............................................................................. 95 7.4.1.1.4 KNOTEN- UND KANTENWERTE .................................................... 95 7.4.1.1.5 KLASSIFIZIERUNG VON GRAPHEN ................................................ 96 -6- OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.4.1.2 KÜRZESTE WEGE VON EINEM KONTEN IM GRAPHEN ZU ALLEN ANDEREN ............................................................................................. 96 7.4.1.2.1 ALGORITHMUS VON DIJKSTRA .................................................... 97 7.4.1.2.2 ALGORITHMUS VON BELLMANN-FORD ..................................... 103 7.4.1.2.3 KÜRZESTE WEGE FÜR EINEN AZYKLISCHEN GRAPHEN ........... 104 7.4.1.3 KÜRZESTE WEGE ZWISCHEN ALLEN KONTEN IM GRAPHEN 106 7.5 KOSTENBASIERENDE ABFRAGEBEARBEITUNG IN RELATIONALEN SYSTEMEN ................................................................................................ 108 7.6 DIE HEURISTIKEN .......................................................................... 116 7.6.1 EINTEILUNG DER KOSTEN.................................................................... 116 7.6.2 KOSTENSCHÄTZFUNKTION DER ABFRAGEPHASE................................ 117 7.6.2.1 BEGRIFFSDEFINITIONEN............................................................. 117 7.6.2.2 WERTEBEREICHE UND BEDINGUNGEN.................................... 118 7.6.2.3 FUNKTION....................................................................................... 118 7.6.2.4 BESCHREIBUNG DER KOSTENSCHÄTZFUNKTION .................. 118 7.6.3 KOSTENSCHÄTZFUNKTIONEN DER MATERIALISIERUNGSPHASE ........ 118 7.6.3.1 BEGRIFFSDEFINITIONEN............................................................. 118 7.6.3.2 WERTEBEREICHE UND BEDINGUNGEN.................................... 119 7.6.3.3 FUNKTION....................................................................................... 119 7.6.3.4 BESCHREIBUNG DER KOSTENSCHÄTZFUNKTION .................. 120 7.6.4 GESAMTKOSTEN ................................................................................... 120 7.6.4.1 BEGRIFFSDEFINITIONEN............................................................. 120 7.6.4.2 WERTEBEREICHE UND BEDINGUNGEN.................................... 121 7.6.4.3 FUNKTION....................................................................................... 121 7.6.5 ZUFÄLLIGE KOSTEN............................................................................. 121 7.6.6 HEURISTIK VON ALEXANDER PROSSER ........................................... 123 7.6.7 HEURISTIK VON THOMAS ACHS......................................................... 127 7.6.7.1 PSEUDOCODE DER HEURISTIK .................................................. 127 7.6.7.2 BESCHREIBUNG DER HEURISTIK............................................... 134 -7- OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.6.7.3 7.7 DEMONSTRATIVES BEISPIEL ....................................................... 134 DIE DETERMINISTISCHE LÖSUNG .................................................... 147 7.7.1 MATHEMATISCHE GRUNDLAGEN ........................................................ 147 7.7.1.1 PERMUTATION ............................................................................... 147 7.7.1.2 KOMBINATION................................................................................ 147 7.7.2 DER ALGORITHMUS FÜR DIE PERMUTATION ...................................... 148 7.7.3 DER ALGORITHMUS FÜR DIE KOMBINATION ...................................... 152 7.7.4 DER ALGORITHMUS DER FUNKTION GETRIGHTORDER .................... 156 7.7.5 DER ALGORITHMUS DER FUNKTION KOSTENFUERSETBERECHNEN. 161 7.8 DIE ENTWICKLUNGSUMGEBUNG UND DIE APPLIKATION .................. 164 7.8.1 AUSWAHL DER ENTWICKLUNGSUMGEBUNG ....................................... 164 7.8.2 ENTWURF DER BENUTZERSCHNITTSTELLE ......................................... 165 7.8.2.1 DAS HAUPTMENU.......................................................................... 165 7.8.2.2 DIE EINGABEMASKE (INPUT SCREEN) ...................................... 166 7.8.2.3 DIE PRÄSENTATIONSMASKE (APA SCREEN) ............................. 167 7.8.2.4 DIE AUSWAHLMASKE DER REQUIRED CUBES (SELECTION SCREEN)168 DATENMODELLIERUNG DER APPLIKATION ......................................... 169 7.8.3 7.8.3.1 AUSWAHL DER DATENBANK........................................................ 169 7.8.3.2 SEMANTISCHE DATENMODELLIERUNG.................................... 170 7.8.3.3 LOGISCHE DATENMODELLIERUNG........................................... 173 7.8.3.4 PHYSISCHE DATENMODELLIERUNG ......................................... 176 7.8.3.4.1 FORMALE SQL-ANWEISUNGEN LAUT SQL 99 ......................... 176 7.8.3.4.2 MICROSOFT SQL SPEZIFISCHE SQL ANWEISUNGEN ............... 178 7.8.3.5 GENERIEREN DER CREATE TABLE ANWEISUNGEN IN DER SOFTWARE ...................................................................................................... 184 7.8.3.5.1 DAS STAR-SCHEMA .................................................................... 184 7.8.3.5.2 DAS FACT CONSTELLATION SCHEMA ....................................... 186 7.8.3.5.3 BEISPIELHAFTES UMSETZEN DER TABLES DURCH DAS PROGRAMM .................................................................................................. 187 -8- OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.8.3.5.3.1 DIE AUSGANGSPOSITION ........................................................ 187 7.8.3.5.3.2 DIE SCRIPTS FÜR DAS STAR SCHEMA ....................................... 189 7.8.3.5.3.3 DIE SCRIPTS FÜR DAS FACT CONSTELLATION SCHEMA ............ 193 7.9 ERGEBNISSE DER TESTS DER HEURISTIKEN ..................................... 200 7.9.1 PROBLEME BEI TESTEN DER HEURISTIK ............................................. 200 7.9.2 GESAMTÜBERSICHT ÜBER DIE ERGEBNISSE ........................................ 202 7.9.3 DIE ERGEBNISSE IM DETAIL ................................................................ 204 7.9.3.1 VORGABEN UND ERGEBNISSE TEST 1 ....................................... 204 7.9.3.1.1 VORGABEN.................................................................................. 204 7.9.3.1.2 LÖSUNG DER HEURISTIK............................................................ 204 7.9.3.1.3 DETERMINISTISCHE LÖSUNG ..................................................... 205 7.9.3.1.4 VERGLEICH DER ERGEBNISSE ................................................... 205 7.9.3.2 VORGABEN UND ERGEBNISSE TEST 2 ....................................... 205 7.9.3.2.1 VORGABEN.................................................................................. 205 7.9.3.2.2 LÖSUNG DER HEURISTIK............................................................ 206 7.9.3.2.3 DETERMINISTISCHE LÖSUNG ..................................................... 206 7.9.3.2.4 VERGLEICH DER ERGEBNISSE ................................................... 207 7.9.3.3 VORGABEN UND ERGEBNISSE TEST 3 ....................................... 207 7.9.3.3.1 VORGABEN.................................................................................. 207 7.9.3.3.2 LÖSUNG DER HEURISTIK............................................................ 207 7.9.3.3.3 DETERMINISTISCHE LÖSUNG ..................................................... 208 7.9.3.3.4 VERGLEICH DER ERGEBNISSE ................................................... 208 7.9.3.4 VORGABEN UND ERGEBNISSE TEST 4 ....................................... 209 7.9.3.4.1 VORGABEN.................................................................................. 209 7.9.3.4.2 LÖSUNG DER HEURISTIK............................................................ 209 7.9.3.4.3 DETERMINISTISCHE LÖSUNG ..................................................... 210 7.9.3.4.4 VERGLEICH DER ERGEBNISSE ................................................... 210 7.9.3.5 VORGABEN UND ERGEBNISSE TEST 5 ....................................... 211 7.9.3.5.1 VORGABEN.................................................................................. 211 -9- OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.5.2 LÖSUNG DER HEURISTIK............................................................ 211 7.9.3.5.3 DETERMINISTISCHE LÖSUNG ..................................................... 212 7.9.3.5.4 VERGLEICH DER ERGEBNISSE ................................................... 212 7.9.3.6 VORGABEN UND ERGEBNISSE TEST 6 ....................................... 213 7.9.3.6.1 VORGABEN.................................................................................. 213 7.9.3.6.2 LÖSUNG DER HEURISTIK............................................................ 213 7.9.3.6.3 DETERMINISTISCHE LÖSUNG ..................................................... 214 7.9.3.6.4 VERGLEICH DER ERGEBNISSE ................................................... 214 7.9.3.7 VORGABEN UND ERGEBNISSE TEST 7 ....................................... 215 7.9.3.7.1 VORGABEN.................................................................................. 215 7.9.3.7.2 LÖSUNG DER HEURISTIK............................................................ 215 7.9.3.7.3 DETERMINISTISCHE LÖSUNG ..................................................... 216 7.9.3.7.4 VERGLEICH DER ERGEBNISSE ................................................... 216 7.9.3.8 VORGABEN UND ERGEBNISSE TEST 8 ....................................... 217 7.9.3.8.1 VORGABEN.................................................................................. 217 7.9.3.8.2 LÖSUNG DER HEURISTIK............................................................ 217 7.9.3.8.3 DETERMINISTISCHE LÖSUNG ..................................................... 218 7.9.3.8.4 VERGLEICH DER ERGEBNISSE ................................................... 218 7.9.3.9 VORGABEN UND ERGEBNISSE TEST 9 ....................................... 219 7.9.3.9.1 VORGABEN.................................................................................. 219 7.9.3.9.2 LÖSUNG DER HEURISTIK............................................................ 219 7.9.3.9.3 DETERMINISTISCHE LÖSUNG ..................................................... 220 7.9.3.9.4 VERGLEICH DER ERGEBNISSE ................................................... 220 7.9.3.10 VORGABEN UND ERGEBNISSE TEST 10 ................................. 221 7.9.3.10.1 VORGABEN................................................................................ 221 7.9.3.10.2 LÖSUNG DER HEURISTIK.......................................................... 221 7.9.3.10.3 DETERMINISTISCHE LÖSUNG ................................................... 222 7.9.3.10.4 VERGLEICH DER ERGEBNISSE ................................................. 222 7.9.3.11 VORGABEN UND ERGEBNISSE TEST 11 ................................. 223 - 10 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.11.1 VORGABEN................................................................................ 223 7.9.3.11.2 LÖSUNG DER HEURISTIK.......................................................... 223 7.9.3.11.3 DETERMINISTISCHE LÖSUNG ................................................... 224 7.9.3.11.4 VERGLEICH DER ERGEBNISSE ................................................. 224 7.9.3.12 VORGABEN UND ERGEBNISSE TEST 12 ................................. 225 7.9.3.12.1 VORGABEN................................................................................ 225 7.9.3.12.2 LÖSUNG DER HEURISTIK.......................................................... 225 7.9.3.12.3 DETERMINISTISCHE LÖSUNG ................................................... 226 7.9.3.12.4 VERGLEICH DER ERGEBNISSE ................................................. 226 7.9.3.13 VORGABEN UND ERGEBNISSE TEST 13 ................................. 227 7.9.3.13.1 VORGABEN................................................................................ 227 7.9.3.13.2 LÖSUNG DER HEURISTIK.......................................................... 227 7.9.3.13.3 DETERMINISTISCHE LÖSUNG ................................................... 228 7.9.3.13.4 VERGLEICH DER ERGEBNISSE ................................................. 228 7.9.3.14 VORGABEN UND ERGEBNISSE TEST 14 ................................. 229 7.9.3.14.1 VORGABEN................................................................................ 229 7.9.3.14.2 LÖSUNG DER HEURISTIK.......................................................... 230 7.9.3.14.3 DETERMINISTISCHE LÖSUNG ................................................... 231 7.9.3.14.4 VERGLEICH DER ERGEBNISSE ................................................. 231 7.9.3.15 VORGABEN UND ERGEBNISSE TEST 15 ................................. 232 7.9.3.15.1 VORGABEN................................................................................ 232 7.9.3.15.2 LÖSUNG DER HEURISTIK.......................................................... 232 7.9.3.15.3 DETERMINISTISCHE LÖSUNG ................................................... 233 7.9.3.15.4 VERGLEICH DER ERGEBNISSE ................................................. 233 7.9.3.16 VORGABEN UND ERGEBNISSE TEST 16 ................................. 233 7.9.3.16.1 VORGABEN................................................................................ 233 7.9.3.16.2 LÖSUNG DER HEURISTIK.......................................................... 234 7.9.3.16.3 DETERMINISTISCHE LÖSUNG ................................................... 236 7.9.3.16.4 VERGLEICH DER ERGEBNISSE ................................................. 237 - 11 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.17 VORGABEN UND ERGEBNISSE TEST 17 ................................. 238 7.9.3.17.1 VORGABEN................................................................................ 238 7.9.3.17.2 LÖSUNG DER HEURISTIK.......................................................... 239 7.9.3.17.3 DETERMINISTISCHE LÖSUNG ................................................... 240 7.9.3.17.4 VERGLEICH DER ERGEBNISSE ................................................. 240 7.9.3.18 VORGABEN UND ERGEBNISSE TEST 18 ................................. 241 7.9.3.18.1 VORGABEN................................................................................ 241 7.9.3.18.2 LÖSUNG DER HEURISTIK.......................................................... 241 7.9.3.18.3 DETERMINISTISCHE LÖSUNG ................................................... 242 7.9.3.18.4 VERGLEICH DER ERGEBNISSE ................................................. 242 8 CONCLUSIO .........................................................................242 9 LITERATUR .........................................................................244 10 ABBILDUNGSVERZEICHNIS .............................................250 11 TABELLENVERZEICHNIS .................................................254 12 ANHANG ...........................................................................255 12.1 QUELLCODE DER ANWENDUNG................................................... 255 12.1.1 PROGRAMM QUELLCODE APAWIN ................................................... 255 12.1.2 UNIT APA_ANALYSEUNIT.DFM ........................................................... 255 12.1.3 UNIT APA_ANALYSEUNIT.PAS ............................................................ 256 12.1.4 UNIT APA_APPLICATIONUNIT.DFM .................................................... 259 12.1.5 UNIT APA_APPLICATIONUNIT.PAS ..................................................... 262 12.1.6 UNIT APA_DIALOGUNIT.DFM .............................................................. 282 12.1.7 ENDUNIT APA_DIALOGUNIT.PAS ......................................................... 282 12.1.8 UNIT APA_GRIDUNIT.DFM .................................................................. 283 12.1.9 UNIT APA_GRIDUNIT.PAS ................................................................... 292 12.1.10 UNIT APA_HELPUNIT.DFM.............................................................. 388 12.1.11 UNIT APA_HELPUNIT.PAS ............................................................... 389 12.1.12 UNIT APA_INPUT_DIMENSIONUNIT.DFM ....................................... 390 - 12 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 12.1.13 UNIT APA_INPUT_DIMENSIONUNIT.PAS......................................... 391 12.1.14 UNIT APA_INPUT_HIERARCHYUNIT.DFM ...................................... 392 12.1.15 UNIT APA_INPUT_HIERARCHYUNIT.PAS ....................................... 393 12.1.16 UNIT APA_INPUT_REQBLOCKUNIT.DFM ........................................ 395 12.1.17 UNIT APA_INPUT_REQBLOCKUNIT.PAS ......................................... 396 12.1.18 UNIT APA_INPUT_SCREENUNIT.DFM ............................................. 397 12.1.19 UNIT APA_INPUT_SCREENUNIT.PAS............................................... 401 12.1.20 UNIT APA_KEYUNIT.DFM ............................................................... 412 12.1.21 UNIT APA_KEYUNIT.PAS ................................................................ 413 12.1.22 UNIT APA_OPTIONSUNIT.DFM ........................................................ 414 12.1.23 UNIT APA_OPTIONSUNIT.PAS ......................................................... 416 12.1.24 UNIT APA_PARAMETERUNIT.DFM .................................................. 417 12.1.25 UNIT APA_PARAMETERUNIT.PAS ................................................... 425 12.1.26 UNIT APA_PROCESSUNIT.DFM ........................................................ 434 12.1.27 UNIT APA_PROCESSUNIT.PAS ......................................................... 435 12.1.28 UNIT APA_SCREENUNIT.DFM ......................................................... 437 12.1.29 UNIT APA_SCREENUNIT.PAS ........................................................... 438 12.1.30 UNIT APA_SELECTIONUNIT.DFM .................................................... 440 12.1.31 UNIT APA_SELECTIONUNIT.PAS ..................................................... 444 12.1.32 UNIT APA_SHOW_COSTSUNIT.DFM ................................................ 458 12.1.33 UNIT APA_SHOW_COSTSUNIT.PAS ................................................. 459 12.1.34 UNIT APA_SQLUNIT.DFM ................................................................ 462 12.1.35 UNIT APA_SQLUNIT.PAS ................................................................. 463 12.2 QUELLCODES DER HILFEDATEIEN ............................................... 464 12.2.1 INDEX.HTM ........................................................................................... 464 12.2.2 APA_GRID_SCREEN.HTM ................................................................... 465 12.2.3 APA_INPUT_SCREEN.HTM .................................................................. 467 12.2.4 APA_INSTALL.HTM ............................................................................. 469 12.2.5 APA_MAINMENU.HTM ........................................................................ 470 - 13 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 12.2.6 APA_SELECTION_SCREEN.HTM ......................................................... 471 - 14 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN VORWORT UND DANKSAGUNGEN: Das Thema der Dissertation und das Verfassen einer Dissertation ist eine zeitaufwendige Tätigkeit. Durch die vielen Stunden, welche man in diese Arbeit investiert, wird unwillkürlich anderes vernachlässigt. Dies zieht sich vom beruflichen bis in den privaten Bereich. Das heißt, dass man auf seinem Wege bis hin zum Abschließen der Arbeit viele Menschen vernachlässigt. Ihnen gebührt Dank und Anerkennung, da sie somit einen Teil zu dieser Arbeit beigetragen haben. Dabei möchte ich mich besonders bei Professor Prosser bedanken. Wäre er nicht an mich herangetreten, hätte ich das Doktoratsstudium gar nicht begonnen. Zusätzlich danke ich ihm auch für seine Unterstützung und Hilfe beim Verfassen und für so manchen hilfreichen Tipp oder Denkanstoß. Weiters muss natürlich auch erwähnt werden, dass meine Arbeit auch unmittelbar auf die Arbeit von Professor Prosser und Frau Ossimitz aufbaut. Besonderer Dank gilt auch Professor Janko dafür, dass er die Zweitbeurteilung dieser Arbeit übernommen hat. Denn es ist bei solch speziellen Themen nicht sehr einfach einen Beurteiler zu finden. Der wichtigste Mann, welcher einen enormen Anteil am Gelingen dieser Arbeit hat, ist mein Großvater Georg ACHS, der mich jeden Tag auf das Neue motiviert hat und darauf aufmerksam gemacht hat, täglich ein neues Puzzlesteinchen zum Vollenden der Arbeit hinzuzufügen. Ohne ihn und seine täglichen Ermunterungen wäre diese Arbeit nie vollendet worden. Sehr großer Dank gilt auch meinen Eltern, Gerlinde und Hans Georg ACHS, welche mich beruflich entlasten konnten und mir zu jeder Zeit eine Stütze gewesen sind. Ein besonderer Dank an dieser Stelle speziell meiner Mutter für das fachmännische Korrekturlesen der Arbeit. Auch meine Großmütter, meine Schwester, meine Großtanten, weitere Verwandte und Freunde will ich erwähnen und mich zusätzlich entschuldigen, dass ich sie, auf Grund dieser Arbeit, des Öfteren versetzt und vernachlässigt habe. Ich werde mich bessern. Thomas ACHS, Gols im JUNI 2004 - 15 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 1 EINFÜHRUNG 1.1 ZIEL DER ARBEIT Das Planen und Entwickeln eines optimalen Data Warehouse-Systems ist ein Ansinnen vieler Wissenschaftler und Forscher aus unterschiedlichen Bereichen. Zahlreiche Publikationen wurden zu diesem Thema verfasst und in den letzten Jahren veröffentlicht. In dieser Literatur wird versucht eine Heuristik zu entwickeln, welche eine Lösung nahe am Optimum für das Materialisierungsproblem im Datawarehouse liefert. In der Vergangenheit wurde in zahlreichen Publikationen Annahmen, wie unbegrenzte Ressourcen oder rasche Zugriffszeit getroffen, welche in der realen Welt allerdings nicht vorhanden sind. Die Vision, welche hinter dieser Arbeit steckt, ist es, ein Instrument zu entwickeln, welches diese limitierenden Faktoren mitberücksichtigt, bzw. dieses versucht. Dabei hat sich insbesonders die Modellierungsmethode des Aggregation Path Arrays von Prosser und Ossimitz [vgl. Prosser/Ossimitz (2001)] als geeignet erwiesen, in diesem Problembereich einen Lösungsansatz zu finden. Vor allem ist diese Methode durch die einfache graphische Darstellungsfähigkeit besonders für informationstechnische Darstellung geeignet. Dabei ist es auch unerfahrenen Endbenutzer möglich, das Design eines Warehouses zu bewerkstelligen. Aus diesem Grund ist die Methode auch für Schulungs- und Ausbildungszwecke besonders geeignet. Die kostenminimale physische Bereitstellung der wichtigen Informationen für die Entscheidungsträger in Unternehmen stellt das Ziel dieser Arbeit dar. Dabei ist ein Optimierungsproblem zu lösen, welches limitierende Zeit- und Speicherressourcen bei gleichzeitigem Berücksichtigen wichtiger Information beachtet. Leider ist diese Information nicht immer als homogen anzusehen. Es gibt beispielsweise wichtige Information, welche für das Überleben einer Organisation notwendig ist und Information, welche wichtig, aber nicht ständig verfügbar sein muss. Der Versuch einen Lösungsansatz für diese Problematik zu finden, stellt das Herzstück meiner Arbeit dar. 1.2 VORGEHENSWEISE Der Kern der Arbeit stellt das praktische Darstellen des Aggregation Path Arrays (APA) dar. Dabei wird eine Software-Applikation (Quellcode im Anhang) ausprogrammiert, welche ein benutzerunterstützendes Design des Data Warehouses ermöglicht. Zusätzlich soll nach der Eingabe der benötigten Informationen, welche sich durch so genannte „Required cubes“ manifestieren, der Benutzer bei der Auswahl der zu materialisierenden und somit physisch in der Datenbank lagernden Information - 16 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN unterstützt werden. Dies soll, da die Optimierung ein sehr komplexes Lösungsproblem darstellen kann, heuristisch gelöst werden. Im Vergleich dazu werden Algorithmen ausgetestet, welche zwar eine ideale Lösung liefern, aber für komplexe Problemstellungen sehr lange Berechnungszeiten erfordern. Abschließend werden die Ergebnisse verglichen, um eine Bewertung des heuristischen Ansatzes zu treffen. Im Vorfeld wird relevante Literatur zum Konnex aufbereitet, welche die Grundlage zum Verstehen der Zusammenhänge darstellt. 2 DATENMODELLIERUNG Für die Modellierung von Daten ist es zweckmäßig, sich die verschiedenen Betrachtungsebenen für Daten und Informationen zu veranschaulichen. Dabei versucht man eine betriebswirtschaftliche Problemstellung in mehreren Stufen abzubilden. Diese sind das • Fachkonzept (semantisches Datenmodell): Auf dieser Ebene befindet sich die ER-Diagramm-Ebene. • DV-Konzept (logisches Datenmodell): Dies beschreibt die Daten eines Informationssystems auf der Ebene der Datenbanken. • Technische Implementierung (physisches Datenmodell): Auf dieser Ebene betrachtet man die reale Ausbildung der Datenbank, wie die SQL-Anweisungen. Wie durch den hierarchischen Aufbau angedeutet werde ich mich bei meinen Ausführungen vom semantischen Modell bis zur endgültigen Implementierung der Datenbank und der Tables (Tabellen) vortasten. 2.1 SEMANTISCHES DATENMODELL Ein vielfach bewährtes Werkzeug zur Erstellung von relationalen Datenbanken ist das Entity Relationship Modell, kurz ER-Modell genannt. Dieses Modell wurde von P. Chen im Jahre 1976 vorgestellt. Das ER-Modell verhindert Redundanzen bis auf Fremdschlüssel auch relationenübergreifend. [vgl. Schicker (1999) S.136f ] Um mit dem ER-Modell nach Chen arbeiten zu können sind im Vorfeld eine Reihe von Begriffen zu klären und auszuformulieren. Diese Vokabel werden bei der Modellierung verwendet und können als Bausteine für das ER-Diagramm angesehen werden. Wir werden das ER-Modell für unsere Arbeit einsetzen. Deshalb soll es auch hier im Detail erläutert werden. Alternative Modellierungsmethoden sind insbesondere das „ERModell nach der Notation „Barker“ oder die „Unified Modeling Language“ [vgl. Cordts (2002) S. 35ff]. Für detaillierte weiterführende Ausführungen über semantische - 17 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Datenmodellierung verweise ich auf Baldi (1999) S. 76ff, Fischer et al. (2000) S. 105ff, Janko (1998) S. 335ff, Kemper (1999), S. 33ff und Meier (2001) S. 16ff. 2.1.1 ENTITÄTEN (ENTITIES) Wie der Name schon sagt, ist der grundlegendste Baustein des ER-Diagramms die Entität (Gegenstand). Entitäten sind wohlunterscheidbare physisch oder gedanklich existierende Konzepte der zu modellierenden Welt. Entitäten werden im Diagramm durch Rechtecke dargestellt. Abbildung 1: Symbol für Entitätstyp Man unterscheidet folgende Arten von Entitätstypen: Super- und Subentitätstypen: Superentitätstypen fassen gemeinsame Attributsmengen von Subentitätstypen zusammen. Offensichtlich ist der Entitätstyp „Auftrag“ ein Superentitätstyp, da er Attribute der Subentitätstypen „Kundenauftrag“, „Fertigungsauftrag“, „Beschaffungsauftrag“ usw. zusammenfasst. Siehe dazu auch Entitätsmengen 2.1.2. Fundamentale Entitätstypen: Existieren um ihrer selbst willen. Die Entitäten fundamentaler Entitätstypen repräsentieren eindeutige Objekte der realen Welt. Beispiele für solche Entitätstypen sind „Geschäftspartner“ oder „Artikel“. Entitäten assoziativer Entitätstypen: Drücken einen fachlichen Zusammenhang zwischen fundamentalen Entitäten aus und haben eigene Attribute. Sie haben eine Art „Zwitterfunktion“, da sie auch als Beziehungstypen angesehen werden können. Ein Beispiel für einen solchen Entitätstyp ist „Auftragsposition“, der auch als Beziehungstyp zwischen „Auftrag“ und „Artikel“ angesehen werden kann. 2.1.2 ENTITÄTSMENGEN (ENTITY SETS) Ähnliche Entitäten können zu Entitätsmengen zusammengefasst werden. So könnten die Subentitäten Kunde, Lieferant und Bank unter Superentität Geschäftspartner zusammengefasst werden. - 18 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 2: Super- und Subentitätstypen mit „is a“ Operator [Quelle: Rautenstrauch/Schulze (2003) S. 237] Für die Modellierung von Super- und Subentitätstypen wird der „is a“- Operator als Dreieck eingeführt. Auf der Spitze des Dreiecks wird der Superentitätstyp und auch der Unterseite werden die Subentitätstypen notiert. Die Erzeugung von Superentitätstypen durch Zusammenfassen gemeinsamer Attributsmengen verschiedener Entitätstypen wird Generalisierung und das „Herausziehen“ von Subentitätstypen mit disjunkten eigenen Attributsmengen wird Spezialisierung genannt. 2.1.3 ATTRIBUTE UND SCHLÜSSEL Entitätstypen werden durch Attribute, d.h. Eigenschaften bzw. Merkmale, charakterisiert. Eine bestimmte Entität ist durch spezifische Werte für die Attribute gekennzeichnet. Ein Attributstyp Kunde besitzt beispielsweise die Attribute Name, Straße, Wohnort und Kundennr. In der graphischen Darstellung werden Entitäten durch Ellipsen dargestellt. Abbildung 3: Entitätsmenge mit Attributen - 19 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Bestimmte Attribute werden benutzt, um Entitäten voneinander zu unterscheiden. Hierfür eignen sich aber nur solche Attribute oder Attributkombinationen, die Eindeutigkeit gewährleisten. Solche Attribute oder Attributkombinationen werden auch als Schlüsselkandidaten bezeichnet, da sie sich für Primärschlüssel in den späteren Tabellen nahezu anbieten. Primärschlüssel werden in ER-Diagrammen unterstrichen dargestellt. Jedes Attribut hat einen Wertebereich (Datentyp). So kann ein Attribut beispielsweise einen Zeitpunkt (Geburtsdatum), eine Zahl (Mahnstufe), einen Text (Name) usw. bezeichnen. Man kann einfache Attribute, die aus einer einzelnen Komponente mit einer unabhängigen Existenz bestehen (wie Geschlecht oder Gehalt) und zusammengesetzte Attribute, die aus mehreren Komponenten zusammengesetzt sind, die wiederum eine eigene Existenz besitzen, unterteilen (z.B. Das Attribut Adresse besteht aus Strasse, Postcode und Ort). [vgl. Connolly et al. (2002) S 186f] 2.1.4 BEZIEHUNGEN (RELATIONSHIPS) Eine Beziehung (auch als Relation bezeichnet) ist eine Verknüpfung zwischen verschiedenen Entitäten. So kann z.b. die Entität „Kunden“ mit der Entität „Konto“ in Beziehung stehen, indem der Kunde ein Konto besitzen kann. Anhaltspunkt dafür, was als Entitätstyp und was als Beziehungstyp bezeichnet werden kann, ist die Verwendung von Substantiven bzw. von Verben. Entitätstypen werden in der Regel mit Substantiven; Beziehungstypen in der Regel mit Verben bezeichnet. [vgl. Heinrich (2001), S. 246] Normalerweise verknüpft man jeweils zwei Entitäten über eine Relation. In diesem Fall spricht man von einer zweiwertigen oder binären Relation. Abbildung 4: Einfaches Symbol eines Beziehungstyps für einfache Darstellbarkeit Abbildung 5: Formal richtiges Beziehungssymbol der ER-Modell Konvention - 20 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Die Bedeutung, die einem Entitätstyp in einer Beziehung zukommt, nennt man auch seine Rolle. Die Rolle des Entitätstypen „Kunde“ im obigen Beispiel ist „Kontoinhaber“. Wenn ein Entitätstyp mehrere Beziehungen eingeht, kann er auch mehrere Rollen einnehmen. 2.1.5 KARDINALITÄTEN VON BEZIEHUNGEN Die semantische Aussagekraft eines Datenmodells bezüglich der Abbildung der betrieblichen Realität kann durch die Angabe der Kardialität eines Beziehungstyps gesteigert werden. Die Kardialität ist eine quantitative Spezifikation für die Menge der auftretenden Beziehungen. Beziehungen kann man grundsätzlich in Kann-Beziehungen und Muss-Beziehungen einteilen. Bei einer Kann-Beziehung müssen nicht alle Objekte eines Objektsatzes durch die Beziehung angesprochen werden. Dadurch muss nicht jeder Artikel im Lager gleichzeitig als Position in einer Bestellung auftauchen. Bei einer Muss-Beziehung ist dies aber sehr wohl der Fall. So muss z.b. jeder Mitarbeiter einer Unternehmung einer Abteilung zugeordnet werden. [vgl. Morcinek (2002) S. 218f] Grad 1 zu 1 1 zu N Ausprägung "Kann" "Muss" Beziehung Beziehung [1,1] [0,1] [1,*] [0,*] Tabelle 1: Kombinationen von Grad und Ausprägung Grundsätzlich lassen sich folgende Kardinalitäten unterscheiden: 2.1.5.1 1-1 BEZIEHUNGEN Einer Entität wird genau eine Entität zugeordnet. Beispiel: Ein Mitarbeiter hat genau einen Hauptwohnsitz. „Diese Beziehungen sind in der Realität eher selten anzutreffen, da Entitäten zwischen denen eine solche Beziehung besteht, theoretisch in einer Entität zusammengefasst werden können“ [vgl. Rautenbach/ Schulze (2003) S. 131] . Abbildung 6: 1:1 Beziehung zwischen Kunde und Hauptwohnsitz - 21 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 2.1.5.2 1-N BEZIEHUNGEN Einer Entität werden mehrere oder eine Entität zugeordnet. Beispiel: In einer Abteilung können mehrere Mitarbeiter arbeiten. Abbildung 7: 1:n Beziehung zwischen Abteilung und Mitarbeiter 2.1.5.3 M-N BEZIEHUNGEN Mehrere Entitäten werden mehreren anderen Entitäten zugeordnet. Beispiel: Ein Mitarbeiter bearbeitet mehrere Projekte. Ein Projekt wird von mehreren Mitarbeitern bearbeitet. Abbildung 8: m:n Beziehung zwischen Mitarbeiter und Projekt 2.1.5.4 DIE REKURSIVE BEZIEHUNG Eine rekursive Beziehung ist eine Beziehung von Entitäten des gleichen Typs. Standardbeispiel ist die Beziehung „ist Vorgesetzter von“ eines Entitätstyps „Mitarbeiter“. Zu beachten ist hier auch die alternative Darstellungsmöglichkeit von Beziehungen durch eine Raute (im Unterschied zu der in Abbildung 6 verwendeten einfachen Darstellung). - 22 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 9: Rekursiver Beziehungstyp [Quelle: Rautenstrauch/Schulze (2003) S. 237] 2.2 LOGISCHES DATENMODELL 2.2.1 ALLGEMEINES Ein logisches Modell beschreibt die Daten eines Informationssystems auf der Ebene des DV-Konzepts. Unter den logischen Datenmodellen spielen vor allem vier Modelle eine Rolle: • Hierarchisches Datenmodell • Netzwerkdatenmodell • Relationales Datenmodell • Objektorientiertes Datenmodell • Objektrationonales Datenmodell Das in der Praxis wichtigste Datenmodell ist das „Relationale Modell“. Dieses werde ich auch als Basis für meine Datenmodellierung der Applikation verwenden, da mit Microsoft SQL als Datenbank für unsere Anwendung und das Datawarehouse eine relationale Datenbank gewählt wurde. - 23 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 2.2.2 DATENMODELLE 2.2.2.1 HIERARCHISCHES DATENMODELL Das hierarchische Datenbankmodell basiert auf der mathematischen Baumstruktur. Wenn wir die einzelnen Dateien einer hierarchischen Datenbank als Knoten bezeichnen, so gelten folgende Vereinbarungen: Wie bei Verzeichnisstrukturen der meisten Betriebssysteme gibt es eine Wurzel. Dieser Knoten hat keinen Vorgänger und leitet alle anderen ab. Hat ein Knoten keinen Nachfolger wird er als Blatt bezeichnet. Abbildung 10: Firmenhierarchie - 24 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Vorteile: • Einfacher Aufbau • Sehr kurze Zugriffszeiten • Minimale Redundanz Nachteile: • Strukturveränderungen kaum möglich • Komplexe Programmierung 2.2.2.2 NETZWERKDATENMODELL Das Netzwerkmodell beruht wie das hierarchische Modell auf der Graphentheorie, allerdings gibt es keine hierarchische Struktur und jeder Knoten kann mit jedem Knoten verbunden sein. Analog zur Abbildung 10 könnte also ein Arbeiter auch Mitglied in zwei Abteilungen sein. Vorteile: • Kurze Zugriffszeiten • Geringe Redundanz Nachteile: • Strukturveränderungen nicht einfach • Relativ komplexe Programmierung 2.2.2.3 RELATIONALES DATENMODELL Das relationale Modell, das von Codd entwickelt wurde, basiert auf einer mathematischen Grundlage, der Relationenalgebra. Eine relationale Datenbank besteht ausschließlich aus Tabellen. Ein Zugriff erfolgt immer über diese Tabellen. Die Zusammenhänge zwischen den Tabellen werden über Beziehungen hergestellt. Diese Beziehungen werden über Primär- und Fremdschlüssel abgebildet. Das relationale Datenmodell ist tupelorientiert, die Information wird durch Relationen repräsentiert. Eine Relation R ( A1 , A2 ,..., An ) ist eine bekannte Menge von n-Tupeln, wobei n-Tupel eine Anordung von n atomaren, das heißt einfachen (nicht weiter zerlegbaren) Attributen (attributes) A1 , A2 ,..., An ist. [vgl. Schneider/Weber (2000) S. 471] - 25 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Vorteile: • Leichte Änderbarkeit des Datenbankaufbaus • Mathematisch fundiert • Leicht programmierbar und verwaltbar Nachteile: • Häufig viele Ein-/Ausgaben notwendig • Erfordert eine hohe Rechnerleistung • Erzeugt Redundanz • Komplizierte Objekte müssen erst in viele Tabellen zerlegt und beim Abfragen wiederum mühevoll rekonstruiert werden. Das relationale Modell ist das in der Praxis am häufigsten vorkommende Modell. Relationale Datenbanken sind die wichtigsten Datenbankanwendungen in der heutigen Zeit. Aus diesem Grund werde ich im Kapitel, das sich mit SQL beschäftigt im speziellen auf die Grundlagen des relationalen Datenmodells und der Relationenalgebra eingehen. 2.2.2.4 OBJEKTORIENTIERTES DATENMODELL Eine objektorientierte Datenbank besteht ausschließlich auf Objekten. Ein Objekt ist entweder ein realer Gegenstand oder ganz allgemein ein abstrakter Gegenstand. Da viele Objekte auch in Tabellenform gespeichert werden können, werden objektorientierte Datenbanken häufig als eine Erweiterung relationaler Datenbanken angesehen. Dies trifft aber nur teilweise zu. Der Haupteinsatz von Objektorientierten Datenbankmanagementsystemen liegt in der Bereitstellung von Datenbankeigenschaften für objektorientierte Anwendungen, insbesondere für solche, die durch die traditionellen Datenmodelle und –systeme nur unzureichend unterstützt wurden. Beispiele für solche Anwendungsgebiete sind Entwurfsanwendungen (CAD, CASE), GeoInformationssysteme (GIS), wissenschaftliche Anwendungen und Gebäudetechnik (Facility Management). Ein signifikantes Eindringen in die traditionellen Anwendungsbereiche relationaler Systeme ist ihnen jedoch nicht gelungen. [vgl. Geppert (2002) S. 30f] - 26 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Vorteile: • Objektorientierter Aufbau • Universell einsetzbar • Noch relativ einfach programmierbar und verwaltbar • (teilweise) kompatibel zu relationalen Datenbanken Nachteile: • relativ viele Ein-/Ausgaben notwendig • erfordert eine relativ hohe Rechenleistung • teilweise recht komplexer Aufbau 2.2.2.5 OBJEKTRELATIONALES DATENMODELL Das objektrelationale Datenmodell steht als hybride Konstruktion zwischen dem relationalen und dem Objektdatenmodell. Das relationale Datenmodell wird dabei um folgende Elemente des Objektdatenmodells erweitert: Strukturierte Objekte: Aus den vorhandenen Datentypen können komplexere (nicht atomare) Strukturen definiert werden. Untertypen: Aus existierenden Typen können durch Spezialisierung neue gebildet werden (Untertypen). Diese erben alle Charakteristika des Obertyps. Erweitertes und erweiterbares Typsystem: Erweiterungen des relationalen Datenmodells um neue Typen (z.b. für Multimediadateien). Das Typsystem kann durch selbst definierte Typen erweitert werden. Referenzen: Zwischen den Datenelementen (d.h. Tupeln) können Beziehungen definiert werden, die nicht über Fremdschlüsselbeziehungen abgedeckt werden. [vgl. Schneider/Werner (2000) S. 475f] 2.2.3 ÜBERFÜHRUNG DES ER-MODELLS INS RELATIONALE MODELL Auf der Erfahrung ergibt sich eine bestimmte Vorgehensweise beim Umsetzen des ERModells ins relationale Modell. Für die Umsetzung bestehen aber Freiheitsgrade und - 27 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Gestaltungsmöglichkeiten bei der Wahl der Relationen und ihrer Attribute. Das heißt die Umsetzung kann auch weit von diesen „Standardregeln“ der Umsetzung abweichen. Häufig wird für jeden Entitätstyp zunächst eine eigene Tabelle angelegt. Beziehungen werden dadurch abgebildet, dass in einer Tabelle ein Verweis auf einen Eintrag in einer anderen Tabelle eingefügt wird. Enthält eine Tabelle in einem Attribut oder einer Attributkombination einen Verweis auf eine andere Tabelle, so werden diese Attribute auch Fremdschlüssel (foreign key oder Sekundärschlüssel) genannt, da sie einen Verweis auf den Primärschlüssel einer anderen Relation darstellen. Jeder Wert eines Fremdschlüssels sollte auch als Wert im Primärschlüssel einer anderen Relation vorkommen. Diese Eigenschaft eines Relationenmodells bezeichnet man auch als referenzielle Integrität. - 28 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Die einzelnen Beziehungstypen werden üblicherweise im Relationenmodell wie folgt behandelt: 2.2.3.1 DIE UMSETZUNG DER 1:1 BEZIEHUNG Bei einer 1:1 Beziehung wird eine beliebige der beiden für die Entitätstypen erstellten Tabellen um die Attributsspalte(n) des Primärschlüssels der anderen Tabelle ergänzt. Dabei muss jedoch überdacht werden, ob es sich bei dieser 1:1 Beziehung tatsächlich um zwei Entitäten handelt oder ob diese Entitäten eigentlich dasselbe Objekt verkörpern.[vgl. Connolly et al. (2002) S. 279] Abbildung 11: Beispielhafte Umsetzung einer 1:1 Beziehung in das Realtionenmodell in der vereinfachten Darstellung der Beziehung [Quelle: Baldi (1999), S. 84 ] - 29 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 2.2.3.2 DIE UMSETZUNG DER 1:N BEZIEHUNG Bei einer 1:n Beziehung wird die Tabelle der „n-Seite“ um die Attributsspalten des Primärschlüssels der anderen Tabelle erweitert. Abbildung 12: Beispielhafte Umsetzung einer 1:n Beziehung in das Relationenmodell in der vereinfachten Darstellung der Beziehung [Quelle: Baldi (1999), S. 84] 2.2.3.3 DIE UMSETZUNG DER M:N BEZIEHUNG Bei einer m:n Beziehung wird eine zusätzliche Tabelle eingeführt, die als Attribute die Primärschlüsselattribute beider Entitätstypen erhält. Der Primärschlüssel dieser neuen Relation ergibt sich aus der Kombination der beiden Ursprungsprimärschlüssel. - 30 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 13: Beispielhafte Umsetzung einer m:n Beziehung in das Relationenmodell in der vereinfachten Darstellung der Beziehung [Quelle: Baldi (1999), S. 84 ] 2.2.3.4 DIE UMSETZUNG EINER REKURSIVEN BEZIEHUNG Eine rekursive Beziehung wird analog zu einer 1:1 oder 1:n Beziehung umgesetzt. Die einzige Unterscheidung zwischen den oben angeführten Varianten ist, dass bei der rekursiven Beziehung die Zeiger auf die gleiche Tabelle zeigen. Deshalb funktioniert die Generierung dieser Tabelle analog. 2.3 PHYSISCHES DATENMODELL Das physische Datenmodell beschreibt die Daten des Informationssystems auf der Ebene der technischen Implementierung. Das physische Datenmodell bezieht sich auf eine konkrete Datenbank und die Tables, welche real physisch in der Datenbank durch „CREATE TABLE“ Anweisungen erzeugt werden. Diese SQL-Anweisungen werden beispielhaft im Kapitel 7.8.3.4 erläutert. - 31 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 3 SQL UND DATENBANKEN 3.1 DATENBANKEN 3.1.1 ENTWICKLUNGSGESCHICHTE DER DATENBANKSYSTEME Im Laufe der Jahrzehnte wurde eine ganze Reihe von Konzepten entwickelt, die Datenbestände möglichst sicher, effizient und eventuell benutzerfreundlich verwalten können. Die Kernidee war Daten und Anwendungsprogramme zu trennen. Im Jahre 1959 entwickelten Techniker der Firma IBM das Ramac-System, das man vielleicht als frühen Vorläufer nachfolgender Datenbanksysteme bezeichnen darf. Mit diesem System wird erstmalig der nichtsequentielle Datenzugriff verwirklicht. Ein echter theoretischer Ansatz zur Datenbankverwaltung wird aber erst Anfang der Sechziger Jahre entwickelt. Der Mathematiker Bachmann entwirft und veröffentlicht in den Jahren 1961 bis 1964 Datenstrukturdiagramme; er formuliert außerdem Beziehungen zwischen den Daten, der Begriff der Beziehungstypen (sets) wird bereits hier geprägt. Dies ist die Grundlage für das von der Codasyl-Gruppe (Vereinigung der wichtigsten amerikanischen Computerhersteller und Computeranwender) im Jahre 1971 verabschiedete Netzwerk Datenmodell. 1970 stellt E. Codd das relationale Datenbankmodell vor. Im Jahre 1976 veröffentlichte Peter S. Chen zum Thema Datenbankentwurf das Entity-Realtionsship Prinzip. Der entscheidende Schritt für die relationale Datenbankwelt war im Jahre 1973 die Entwicklung des Systems R von IBM. Dieses Datenbanksystem beinhaltete eine Anfragesprache namens SEQUEL, die im Laufe der Projektentwicklung in SQL umbenannt wurde, mit welcher wir uns auch in dieser Arbeit im Detail befassen wollen. 3.1.2 BEGRIFFSDEFINITIONEN Die Begriffe Datenbank, Dateisystem, Datei usw. werden heute oft sehr sorglos und ohne begriffliche Abgrenzung verwendet. Um diesem Abhilfe zu schaffen will ich diese Begriffe hiermit im Vorfeld entsprechend definieren. Datei Eine Datei ist ein Datenbestand, der unter einem Dateinamen im Allgemeinen auf einem externen Datenträger gespeichert ist. Dieser Datenbestand kann auch als Strom von Bits interpretiert werden. Eine Datei hat immer einen Namen, um sie von anderen Dateien unterscheiden zu können. [vgl. Rautenstrauch et al. (2003) S. 99] - 32 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Daten Daten sind Informationen, die in digitaler Form auf Softwaresystem abgespeichert wurden. Daten können unformatiert (Text) oder formatiert sein. Datenbank Management System (DBMS) “Das DBMS (deutsch: Datenbankverwaltungssystem) ist eine spezielle Software, mit der größere, gemeinsame Datenbestände (Datenbank) aufgebaut, manipuliert und kontrolliert werden können“ [vgl. Fischer et al. (2000), S. 110]. Somit ist das DBMS die Gesamtheit aller Programme zur Erzeugung, Verwaltung und Manipulation der Daten [vgl. Schneider/Werner (2000) S. 469]. Datenbank Eine Datenbank ist eine Sammlung von Daten, die untereinander in einer logischen Beziehung stehen und von einem eigenen Datenbankverwaltungssystem (DBMS) verwaltet werden. Kurz formuliert ein Datenbanksystem besteht aus Daten und einem Datenbankmanagementsystem. [vgl. Schicker (1999), S. 46] 3.1.3 ANFORDERUNGEN EINES DATENBANKSYSTEMS Anforderungen an ein Datenbanksystem sind: Sammlung logisch verbundener Daten: Da Daten auf mehrere Dateien verteilt sind, muss das Datenbanksystem diese Dateien zusammenfügen, um die Information zu gewinnen. Speicherung der Daten mit möglichst wenig oder keiner Redundanz: Redundanz ist das mehrfache Speichern ein und der selben Information. Dies kann bei Änderungen zu Differenzen führen und sollte vermieden werden. Deswegen sollte das Datenbankverwaltungssystem die nicht vermeidbaren redundanten Daten automatisch anpassen. Abfragemöglichkeit und Änderbarkeit der Daten Diese selbstverständliche Forderung schließt ein, dass das Abfragen und Ändern der Daten entsprechend schnell ausgeführt wird. Logische Unabhängigkeit der Daten von ihrer physischen Struktur: Es genügt nicht, dass die Datenbank für die optimale Speicherung der Daten sorgt, der Benutzer will darüber hinaus nicht einmal wissen, wie die Daten physisch abgespeichert sind. Zugriffsschutz: Betriebssysteme kennen nur den Schutz von Dateien, nicht den Schutz von einzelnen Daten innerhalb der Datei. Dieser interne Schutz ist aber bei sensiblen Daten, wie den Personaldaten erforderlich. Zusätzlich ergibt sich die Entwicklung verschiedener - 33 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Sichten (Views) der Benutzer abhängig von den Rechten, welche diese besitzen [vgl. Schneider/Werner (2000) S. 470]. Integrität: Integrität kommt von INTEGER und bedeutet hier, dass alle gespeicherten Daten korrekt sein müssen. Mehrfachzugriff: Auf die Forderung nach Datenzugriffen von mehreren Rechnern oder Terminals aus kann in der Regel heute nicht mehr verzichtet werden. Zuverlässigkeit: Das bedeutet Sicherheit vor unerlaubten Zugriffen. Ausfallssicherheit: Bedeutet Sicherheit der Daten in allen nur erdenklichen Fällen, wie Rechnerausfall oder Zerstörung durch Feuer. Kontrolle: Die Datenbank muss ständig Angaben über ihren momentanen Zustand machen können. Diese Angaben sind z.B. Anzahl der Benutzer, Auslastung der Festplatten oder Auslastung des DBMS. Die Anforderungen an ein Datenbanksystem können zum Teil auch als die Vorteile eines Datenbanksystems interpretiert werden. Tatsache ist, das der Einsatz von Datenbanksystemen einen enormen Leistungssprung in der Softwareentwicklung gebracht hat. 3.2 SQL ALS STANDARDISIERTE DATENBANKSPRACHE 3.2.1 GESCHICHTLICHES Mit SQL steht eine Sprache zur Verfügung, mit der alle Funktionen auf relationalen Datenbanken ausgeführt werden können. Basis von SQL ist die Relationenalgebra, die eine mathematisch vollständige und konsistente Beschreibung sämtlicher auf relationalen Datenbanken anwendbaren Operationen bietet. Seit 1974 IBM mit SEQUEL die erste relationale Datenbanksprache auf den Markt brachte, hat sich die in den Folgejahren daraus entwickelte Sprache SQL weiter verbreitet, um sich schließlich ab 1982 als ANSI-Standard allgemein durchzusetzen. Seit dem ist eine ständige Weiterentwicklung im Fluss. 1987 wurde der ANSI-Standard SQL-1 geschaffen und 1989 der verbesserte ANSI-Standard SQL-2. Die ISO schloss sich dieser Standardisierung an, und auch in der deutschen Norm DN66315 ist SQL-2 - 34 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN festgelegt. In den Weiterentwicklungen SQL-3 und SQL-4 wurden schließlich objektorientierte Konzepte integriert. SQL-1 und SQL-2 sind nicht zu den prozeduralen Sprachen der dritten Generation zu rechnen, da sie keine allgemeinen Methoden zur Formulierung von Algorithmen enthalten. So gibt es keine Schleifenkonstrukte und ähnliches. Als Ausgleich dafür besteht aber die Möglichkeit mit Embedded SQL , SQL-Statements in prozedurale oder objektorientierte Sprachen einzubetten. Erst durch SQL-3 wurde SQL vollständig und es kann auch mit SQL jeder Algorithmus ausgedrückt werden. SQL ist eine Sprache der vierten Generation (4GL). Das heißt in SQL wird nicht beschrieben, wie ein Datenbankzugriff zu erfolgen hat, es wird vielmehr beschrieben, was der Anwender beabsichtigt. Vor der Ausführung von SQL-Anweisungen muss daher eine algorithmische Umsetzung in prozedurale Anweisungen erfolgen, da nur solche durch einen Computer ausführbar sind. Das hat den großen Vorteil, dass SQL auf allen Arten von Datenbanken einsetzbar ist. Seit Jahren arbeitet nun ein Herstellerkonsortium namens SQL Access Group an der Definition von Einrichtungen zur Verbesserung der Interoperabilität zwischen unterschiedlichen SQL-Implementierungen. Sie versuchen somit den Standard laufend zu aktualisieren und zu verbessern. Die aktuelle Sprachversion von SQL heißt SQL-99. Das entsprechende Standarddokument ist Ende des Jahres 1999 in Kraft getreten – als offizielles Publikationsdatum wird der 15. November 1999 angegeben – und hat damit das bisher gültige Standarddokument aus dem Jahre 1992 abgelöst. Die SQL-Standardisierungskommission vermeidet es, von Relationen, Tupeln und Attributen zu sprechen. Statt dessen werden Ausdrücke wie Tabelle, Zeile und Spalte verwendet. Um bei einer sauberen Begriffsverwendung zu bleiben werde ich versuchen die Begriffe anschließend kurz zu definieren und aufzulisten. Relationaler Ausdruck Relation (Menge) Tupel Attribut SQL-Ausdruck Tabelle Zeile Spalte Tabelle 2: Gegenüberstellung von relationalen und SQL-Ausdrücken [Quelle: Pernul/Unland (2001) S. 263] SQL wurde als mengenorientierte Sprache konzipiert und hat damit den Vorteil enorm benutzerfreundlich zu sein. Der Benutzer kann in einer Sprache, die an die Englische Sprache angelehnt ist, seine Anforderungen an die Datenbank formulieren und erhält eine entsprechende Ergebnismenge geliefert. - 35 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN SQL ist sowohl eine DDL (Data Definition Language), eine DML (Data Manipulation Language) als auch eine DCL (Data Control Language). Diese Unterscheidung ist sehr wichtig und essentiell und sollte jedem Benutzer von SQL ständig im Bewusstsein bleiben. Für zusätzliche Publikationen über die Historie von SQL verweise ich auf Goos (2000), S. 108ff, Härder/Rahm (2001) S. 531, Hartmut (2000), S. 691f und Redaktion Toolbox (2002) S. 597ff. 3.2.2 DAS RELATIONALE MODELL Das Relationale Modell, welches als das bedeutendste Datenmodell der Jetztzeit gilt, geht auf E.F. Codd zurück, der mit Recht als Schöpfer des Relationenmodells bezeichnet werden kann. In seiner zukunftsweisenden Abhandlung „A relational model of data banks“ (1970) stellte er erstmals das Relationenmodell vor. Auf Grund der Bedeutung und realen Anwendung im Zuge meiner Arbeit, will ich detaillierter und ausführlicher auf die Begriffe und Grundlagen dieses Modells eingehen. 3.2.2.1 RELATIONALE DATENSTRUKTUR 3.2.2.1.1 DOMÄNEN: Im relationalen Modell werden die Daten als Relationen repräsentiert. Eine Relation ist auf Domänen definiert. Eine Domäne • stellt einen Wertevorrat bereit. Die Werte werden dabei als atomar (skalar, elementar) vorausgesetzt. • hat einen Namen. Diese Eigenschaften gelten im wesentlichen auch für Datentypen, wie sie in höheren Programmiersprachen unterstützt werden. Tatsächlich kann man sich eine Domäne als eine Art Datentyp vorstellen. Das Domänenkonzept unterscheidet sich aber dahingehend, dass der Domänenname von Benutzer selbst definiert wird. 3.2.2.1.2 RELATIONEN: Eine Relation über den Domänen D1, D2, ...., Dn besteht aus einem Relationenkopf (heading) und einem Relationenrumpf (body). Der Relationenkopf besteht aus einer festen, im Zeitablauf nicht änderbaren Menge von Attributen A1, A2,..., An, so dass jedes Attribut Ai genau einer der zugrundeliegenden - 36 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Domänen entspricht. Die (feste) Anzahl n der Attribute wird als Grad (degree) der Relation bezeichnet. Der Relationenrumpf besteht aus einer variablen, im Zeitablauf veränderlichen Menge von n-Tupeln, wobei jedes n-Tupel wiederum eine Menge von (Attribut:Wert)-Paaren (Ai : vi ), i=1,...,n ist. Für jedes Paar (Ai : vi ) ist vi ∈ Di. Die Anzahl der n-Tupel wird Kardinalität der Relation genannt. • Ein Attribut Ak hat einen innerhalb der Relation eindeutigen Namen, • der einen Bezug zur zugrundeliegenden Domäne Dk herstellt, • einen Bezug zum dazugehörigen Wert vk herstellt. [vgl. Panny/Taudes (2000) S. 23f] Abbildung 14: Relationale Datenstruktur [in Anlehnung: Panny/Taudes (2000) S. 23] 3.2.2.1.3 EIGENSCHAFTEN VON RELATIONEN Für Relationen nach der obigen Definition ergeben sich folgende Eigenschaften: • Es kann niemals mehrfach auftretende identische Tupel in einer Relation geben. • Die Tupel einer Relation sind nicht geordnet. • Auch die Attribute einer Relation sind nicht geordnet. • Alle Attributswerte sind atomar. - 37 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 3.2.2.2 RELATIONALE INTEGRITÄT 3.2.2.2.1 SCHLÜSSELKANDIDAT (CANDIDATE KEY) Sei R eine Relation mit den Attributen A1, A2,..., An.. Die Menge K= {Ai1, Ai2,..., Aim}, m>=1, heißt Schlüsselkandidat von R genau dann, wenn unabhängig vom Zeitpunkt (also über die gesamte Lebensdauer der Relation R) gilt: • Eindeutigkeit: Zu keinem Zeitpunkt gibt es zwei Tupel mit demselben Wert für K. • Minimalität: Keines der Attribute Ai1, Ai2,..., Aim kann weggelassen werden, ohne die Eindeutigkeit von K zu verliehren. 3.2.2.2.2 PRIMÄRSCHLÜSSEL (PRIMARY KEY) Für jede gegebene Relation R muss einer der Schlüsselkandidaten als Primärschlüssel festgelegt werden. Die übrigen Schlüsselkandidaten heißen Alternativschlüssel (alternative keys). 3.2.2.2.3 FREMDSCHLÜSSEL (FOREIGN KEY) Ein Fremdschlüssel ist ein Menge von Attributen einer Relation R2. Es gibt nun in der Datenbank eine Relation R1, so dass jeder in R2 auftretende Fremdschlüsselwert auch als Primärschlüsselwert in R1 vorkommt. Die Relationen R1 und R2 sind nicht notwendigerweise verschieden. 3.2.2.2.4 ENTITÄTSINTEGRITÄT Für jede definierte Relation muss ein Primärschlüssel festgelegt sein. Kein zum Primärschlüssel einer Relation gehörendes Attribut, darf Nullwerte annehmen. 3.2.2.2.5 REFERENZIELLE INTEGRITÄT (REFERENTIAL INTEGRITY) Sei R2 eine Relation, die mit einem Fremdschlüssel F auf die Relation R1 mit dem Primärschlüssel P zeigt. Für jeden in R2 auftretenden Wert von F muss gelten: • Er enthält entweder in keiner seiner Komponenten einen Nullwert oder alle seine Komponenten sind mit Nullwerten markiert. • Wenn er vollständig definiert ist, muss in R1 ein Tupel existieren, welches diesen Wert als P-Wert aufweist. - 38 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Es ist durchaus erlaubt und möglich, dass R1 und R2 identisch sind. In einem solchen Fall spricht man von einem Selbstbezug. 3.2.2.3 RELATIONALE DATENMANIPULATION Man unterscheidet grundsätzlich zwei Arten der Datenmanipulation: die Mutation und die Abfrage. Während bei der Abfrage nichts am Zustand der Daten oder Tupel verändert wird, ist die Mutation das Hinzufügen, Ändern und Löschen von Daten. Die Operationen der Relationenalgebra werden nach Panny/Taudes [vgl. Panny/Taudes (2000) S. 31f] wie folgt eingeteilt: • Selektion: Extrahiert bestimmte Tupel aus einer Relation und bildet somit eine horizontale Teilrelation. • Projektion: Extrahiert bestimmte Attribute aus einer Relation und bildet somit eine vertikale Teilrelation. • Produkt: Erzeugt aus zwei Relationen eine neue Relation, die aus allen möglichen Tupeln besteht, welche man durch Verketten eines Tupels der ersten Relation mit einem Tupel der zweiten Relation bilden kann. • Vereinigung: Erzeugt aus zwei Relationen eine neue Relation, welche die Tupel beider Relationen enthält. • Differenz: Erzeugt aus zwei Relationen eine neue Relation, welche die gemeinsamen Tupel beider Relationen enthält. • Verbund: Erzeugt aus zwei Relationen eine neue Relation, die aus allen möglichen Tupeln besteht, welche man durch Verketten eines Tupels der ersten Relation mit einem Tupel der zweiten Relation bilden kann, so dass jedes dieser Paare eine vorgegebene Bedingung erfüllt. • Division: Erzeugt aus zwei Relationen eine neue Relation. Nehmen wir fürs erste vereinfachend an, die Dividendenrelation habe Grad 2 (sei binär) und die Divisorrelation habe Grad 1 (sei unär). Dann besteht die Quotientenrelation aus - 39 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN all jenen Werten des einen Attributs der binären Relation, für die alle Werte der unären Relation im zweiten Attribut vorkommen. 3.2.2.4 NORMALFORMEN Normalformen stellen ein Messverfahren für die Qualität und Güte eines Relationsschemas dar. Sie helfen, Anomalien zu entdecken und damit Redundanzen zu vermeiden [vgl. Pernul/Unland (2001) S. 140ff]. Die Unterscheidung der Normalformen basieren auf Codd (1970). In der Folge wird auf die wichtigsten Typen von Normalformen eingegangen.. 3.2.2.4.1 ERSTE NORMALFORM (1NF) Die Wertebereiche aller Attribute des Relationsschemas müssen atomar sein. Die erste Normalform verlangt, dass alle Attibutwerte aus einem unstrukturierten Wertebereich stammen. Mengen, Aufzähltypen, Wiederholungsgruppen oder komplex strukturierte Wertebereiche sind nicht zugelassen. 3.2.2.4.2 ZWEITE NORMALFORM (2NF) Die zweite Normalform bedeutet, dass es keine Teilmenge eines Schlüsselkandidaten geben darf, die ein nicht primes Attribut funktional bestimmt. Um die zweite Normalform überprüfen zu können, muss man zuvor alle Schlüsselkandidaten ermitteln, denn nur Attribute, die in keinem Schlüsselkandidaten enthalten sind, können die zweite Normalform verletzen. 3.2.2.4.3 DRITTE NORMALFORM (3NF) Die dritte Normalform setzt die zweite Normalform voraus und fordert zusätzlich, dass zwischen einem nicht-primen Attribut und einem Schlüsselkandidaten keine transitive funktionale Abhängigkeit existieren darf. Funktionale Abhängigkeiten sind im Relationenmodell die wichtigste Klasse von Einschränkungen. Sie werden verwendet, um die Anzahl der mathematisch möglichen Tupel (kartesisches Produkt der Attributswertebereiche) auf die Menge der semantisch sinnvollen Tupel einzuschränken. Die funktionale Abhängigkeit X → Y (X bestimmt Y funktional) gilt im Schema R, falls alle beliebigen Tupel t1 , t 2 aus der Relation r(R), die in ihren X-Werten übereinstimmen, auch in ihren Y-Attributen identische Werte aufweisen. - 40 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 3.2.2.4.4 BOYCE-CODD-NORMALFORM (BCNF) Die Boyce-Codd-Normalform setzt die dritte Normalform voraus. Sie ist die einzige Normalform, die durch gültige funktionale Abhängigkeiten und nicht durch nicht-prime Attribute verletzt werden kann. In Relationsschemata in der Boyce-Codd-Normalform gibt es keine nennenswerten Anomalien mehr. 3.2.2.4.5 VOR- UND NACHTEILE DER NORMALISIERUNG Nachteile der Normalisierung: • Unübersichtlichere und schwieriger zu handhabende Datenbanken, da durch die Normalisierung mehr Tabellen entstehen. • Höhere Antwortzeiten durch die Notwendigkeit, Views einzuführen sowie Joins bei Datenbankabfragen zu verwenden. Vorteile der Normalisierung: • Verminderung von Redundanz durch Auslagerung von redundanter Information in separate Tabellen. • Weniger Anomalien. • Mehr Konsistenz. • Speicherplatzersparnis. [vgl. Kleinschmidt/Rank (2002) S. 78] 3.2.2.5 SICHTEN (VIEWS) Ein View kann auch als virtuelle Relation bezeichnet werden, welche nicht selbständig besteht, sondern dynamisch von einer oder mehreren Grundrelationen abgeleitet wird. Eine Sicht kann durch Operationen wie die Auswahl, Projektion und Verknüpfung der relationalen Algebra oder anderen Berechnungen aus den Werten der Grundrelationen erzeugt werden. 3.2.2.5.1 TERMINOLOGIE „Eine Sicht ist das dynamische Ergebnis einer oder mehrerer relationaler Operationen, die an einer Grundrelation ausgeführt wurden, um eine andere Relation zu erzeugen. Eine Sicht ist eine virtuelle Relation, die nicht tatsächlich in der Datenbank vorhanden ist, sondern auf die Anfrage des einzelnen Benutzers zu Zeit der Anfrage erzeugt wird.“ [vgl. Connolly et al. (2002) S. 138] - 41 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 3.2.2.5.2 ZWECK VON SICHTEN Der Zweck, bzw. die Vorteile von Sichten sind: • Teile der Datenbank bleiben vor bestimmten Benutzern verborgen. Dies liefert einen leistungsfähigen und flexiblen Sicherheitsmechanismus. • Es erlaubt den Benutzern, auf eine ihren Bedürfnissen angepasste Weise auf die Daten zuzugreifen, so dass dieselben Daten für verschiedene Benutzer zur selben Zeit auf unterschiedliche Weise sichtbar sind. • Er kann komplexe Operationen an Grundrelationen vereinfachen. Wenn eine Sicht zum Beispiel als Verknüpfung zweier Relationen definiert ist, kann der Benutzer nun die einfacheren Operationen der Auswahl und Projektion an der Sicht durchführen. Das Datenbanksystem übersetzt sie in die entsprechenden Operationen an der Verknüpfung. [vgl. Connolly et al. (2002) S. 138f] 3.2.2.5.3 AKTUALISIERUNG VON SICHTEN Alle Aktualisierungen einer Grundrelation sollten sich unmittelbar in allen Sichten widerspiegeln, die sich auf diese Grundrelation beziehen. Ebenso sollte die zugrunde liegende Grundrelation die Änderung anzeigen, wenn eine Sicht aktualisiert wird. Es gibt jedoch Einschränkungen in Bezug auf die Art der Änderungen, die mit Hilfe von Sichten durchgeführt werden können. Aktualisierungen mit Hilfe einer Sicht sind zulässig, wenn eine einfache Abfrage bezogen auf eine einzelne Grundrelation benutzt wird, die entweder den Primärschlüssel oder einen Schlüsselkandidaten der Grundrelation enthält. Aktualisierungen mit Hilfe von Sichten sind nicht zulässig, wenn mehrere Grundrelationen betroffen sind. Aktualisierungen mit Hilfe von Sichten sind nicht zulässig bei Aggregations- oder Gruppierungs-Operationen. 3.2.3 SQL NACH DEM STANDARD SQL 99 SQL als Datenbanksprache stellt die sprachliche Schnittstelle zum Anwender dar. Damit stellt sie Beschreibungsmittel für die strukturellen und manipulativen Aspekte der Daten bereit. Entsprechend werden üblicherweise die Teilsprachen Datendefinitionssprache (DDL), Datenmanipulationssprache (DML) und Datenkontrollsprache (DCL) der Datenbanksprache SQL unterschieden und unten - 42 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN erläutert. Als weiterführende Literatur sei dabei Achilles (2000) S.119ff, Houlette (2001) S. 59ff, Marsch/Fritze (1999) S. 57ff und Panny/Taudes (2000) S. 71ff genannt. 3.2.3.1 SQL ALS DDL Ursprünglich gingen die ersten Versionen von SQL von der Vorstellung aus, dass die Struktur einer Datenbank zeitlich festgeschrieben und durch die Struktur der Tabellen und Zugriffsrechte festgelegt ist. Deshalb war ursprünglich nur vorgesehen Datenbankobjekte anzulegen, nicht aber sie zu ändern oder zu löschen. Dies wurde erst in späterer Folge in den Standard integriert. Zum Erzeugen, Ändern und Löschen von DBMS-Objekten (Datenbankmanagementsystem-Objekten) sieht der Standard drei Kategorien von Anweisungen vor, die CREATE-, die ALTER- und die DROP-Anweisungen. Um Zugriffsrechte an den erzeugten DBMS-Objekten zu vergeben bzw. zu entziehen, stehen die GRANT- bzw. REVOKE-Anweisung zur Verfügung Im Anschluss möchte ich Anhand der TABLE Anweisungen für jede einzelne Kategorie exemplarisch die Struktur der SQL-Anweisungen demonstrieren, da eine intensivere Betrachtung jedes einzelnen DBMS-Objektes (also auch Indizes, Views, …) separat den Rahmen dieser Arbeit sprengen würde und diese analog betrachtet werden können. 3.2.3.1.1 ERZEUGEN VON DBMS-OBJEKTEN (CREATE) Syntax: CREATE TABLE table_name ( {spalten_name {domain_name | datentyp} [spalten_constraint] [DEFAULT voreinstellung] [COLLATE anordnung] | table_contraint }, … ); 3.2.3.1.2 ÄNDERN VON DBMS-OBJEKTEN (ALTER) Syntax: ALTER TABLE tabellen_name { ADD [COLUMN] spaltendefinition } | { ALTER [COLUMN] spalten_name {{ SET DEFAULT default } | { DROP DEFAULT }} } | { DROP [COLUMN] spalten_name {RESTRICT | CASCADE}} | { ADD table_constraint } - 43 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN | { DROP CONSTRAINT constraint_name {RESTRICT | CASCADE}} Löschen von DBMS-Objekten (DROP) Syntax: DROP TABLE table_name { CASCADE | RESTRICT } 3.2.3.1.3 VERGABE VON RECHTEN (GRANT) Syntax: GRANT { ALL PRIVILEGES | SELECT | DELETE | { INSERT [(spalte [, ...])} | { UPDATE [(spalte [, ...])} | { REFERENCES [(spalte [, ...])} } [, ...] ON [ TABLE ] table_name TO { benutzer1 [, benutzer2, …] } | PUBLIC [ WITH GRANT OPTION] 3.2.3.1.4 ENTZIEHEN VON RECHTEN (REVOKE) Syntax: REVOKE [ GRANT OPTION FOR] Recht [, …] ON objekt FROM { benutzer1 [, benutzer2, …] } | PUBLIC { CASCADE | RESTRICT} 3.2.3.2 SQL ALS DML SQL als Datenmanipulationssprache unterstützt sowohl Abfragen (SELECT), als auch Mutationen (INSERT, UPDATE, DELETE), welche die zugrunde liegenden Tabellen verändern. 3.2.3.2.1 DIE SELECT ABFRAGE Die Abfrage ist das mächtigste und vielseitigste Instrument das SQL zu bieten hat. Man hat mit einer SQL Abfrage unglaubliche Möglichkeiten, die jedoch in den wenigsten Fällen benutzt werden. Zumeist beschränken sich die Anwender auf einfachste Abfragen. Syntax: SELECT [ ALL | DISTINCT ] selektionsliste FROM tabellenreferenzen - 44 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN [ WHERE suchbedingung ] [ GROUP BY spaltenliste ] [ HAVING gruppensuchbedingung ] 3.2.3.2.2 DIE INSERT ANWEISUNG Syntax: INSERT INTO tabelle [ spalte i [, spalte j, ...])] { select_anweisung | tab_konstruktor | { DEFAULT VALUES } 3.2.3.2.3 DIE UPDATE ANWEISUNG Syntax: UPDATE tabelle SET spalte i = { ausdruck i | NULL | DEFAULT } [, spalte j = { ausdruck j | NULL | DEFAULT } ...] [ WHERE suchbedingung ] 3.2.3.2.4 DIE DELETE ANWEISUNG Syntax: DELETE FROM tabelle [ WHERE suchbedingung] 3.2.3.3 SQL ALS DCL SQL ist auch eine Datenkontrollsprache (DCL), die dazu dient die Transaktionseinheiten festzulegen und Sperren auf die benutzten Datenbankobjekte anzufordern. Im vollen Sprachumfang von SQL-99 sind eigene Verbindungsanweisungen (connection statements) vorgesehen mit Hilfe derer der Benutzer den Auf- bzw. Abbau und die Verwaltung von SQL-Verbindungen explizit steuern kann. Insbesondere sind nun im Prinzip auch mehrere gleichzeitig bestehende Verbindungen zu mehreren SQLServern und sogar serverübergreifende Transaktionen möglich. In Core SQL, das den Sprachkern von SQL-99 darstellt, kann aber für einen SQL-Agenten immer nur eine einzige Verbindung bestehen. - 45 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Zu jeder SQL-Verbindung gehört auch eine SQL-Sitzung (SQL Session). Sie wird mit dem Aufbau der Verbindung gestartet und mit dem Abbruch der SQL-Verbindung beendet. Dabei sind folgende zum Kontext einer Sitzung gehörende Bestandteile von Relevanz: • Die Benutzerkennung der SQL-Sitzung • Der Default-Katalogname • Der Default-Schemaname • Der SQL-Pfad Diese zum Kontext der Sitzung gehörenden Charakteristika können nicht verändert werden und haben einen Readonly Status. Die entsprechenden, zu Beginn der Sitzung gesetzten Werte bleiben notwendigerweise bis zum Ende der Sitzung in Kraft. Den Kern der Datenkontrolle bildet jedoch die Kontrolle über die Transaktionen. Eine Transaktion umfasst eine Folge von nacheinander auszuführenden SQL-Anweisungen. In Core SQL wird eine Transaktion durch die erste Anweisung gestartet, die den Rahmen der Transaktion voraussetzt. Es gibt zwei Anweisungen um eine Transaktion abzuschließen: COMMIT und ROLLBACK. Wird eine Transaktion durch COMMIT beendet, werden alle Mutationen dauerhaft gespeichert. Wird eine Transaktion durch ROLLBACK abgeschlossen, wird die Datenbank in den konsistenten Zustand vor der Transaktion zurückgesetzt. Keine der im Rahmen der Transaktion durchgeführten Anweisungen hat einen Effekt. 4 ERP-SYSTEME ERP-Systeme (Enterprise Resource Planning) sind betriebliche Planungs- und Steuerungssysteme. Wichtige Bestandteile dieser industriellen, meist sehr umfangreichen, Softwaresysteme sind die Produktionsplanung und –steuerung, die bedarfs- und verbrauchsgesteuerte Materialdisposition, die Fakturierung, die Kundenbetreuung, die Buchhaltung und Projektplanung. Als führende Hersteller sind SAP, PeopleSoft, Baan, Oracle und Edwards zu nennen. [vgl. Schneider/Werner S. 726] Für unser Projekt sind die ERP-Systeme als Quelle für unsere Daten für das Data Warehouse anzusehen. Diese ERP-Systeme bestehen aber wiederum aus unterschiedlichen Datenbanken, wodurch eine einheitliche Datenschnittstelle über die Einführung von Übertragungsregeln der Datentransformationsprozesse festgelegt werden müssen [vgl. Seemann et al. (2001) S. 27]. - 46 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 5 DAS DATA WAREHOUSE 5.1 DAS KONZEPT DES DATA WAREHOUSE Unternehmen sind heutzutage prozess- oder transaktionsorientiert. Durch viele Standardsoftwareanbieter werden Geschäftsprozesse durch das Erfassen von Transaktionen abgebildet und erfasst. In Management- und Informationssystemen, die der Entscheidungsunterstützung und Entscheidungsfindung dienen, benötigt man jedoch detaillierte Daten, die es erlauben, die Informationen vieler Geschäftsprozesse als Ganzes zu analysieren. Diese, zumeist aggregierten, Daten erlauben erst aus der Fülle der Transaktionsdaten Informationen zu gewinnen. Diese Informationen sind höchst wertvoll für die Entscheidungsträger eines Unternehmens, da erst diese Informationen eine fundierte strategische oder taktische Entscheidung ermöglichen. Data Warehousing hat darüber hinaus die Aufgabe, aus Daten nicht nur Informationen abzuleiten, sondern diese Informationen in Wissen weiterzuentwickeln und dann in Aktionen zu wandeln. Mit einem Data Warehouse werden also Unternehmensprozesse (Geschäftsprozesse) kontrolliert und gesteuert. Somit stellt der Data Warehouse Ansatz den Übergang vom reinen Datenmanagement hin zur höheren Entwicklungsstufe des Informationsmanagements dar. [vgl. Martin (1998) S. 11 ff] „Ein Data Warehouse ist ein umfassendes Konzept zur Entscheidungsunterstützung von Mitarbeitern aller Bereiche und Ebenen“ [vgl. Stock (2000) S. 51]. Somit hat ein Data Warehouse folgende Merkmale: • Orientierung an den unternehmensbestimmenden Sachverhalten (subjektorientiert): Typische Subjekte der Betrachtung sind z.B. Kunden, Produkte, Lieferanten. Man fokussiert inhaltliche Kernbereiche der Organisation. • Zeitraumbezug (zeitabhängig): Es werden Daten benötigt, welche die Entwicklung eines Unternehmens über einen bestimmten Zeitraum repräsentieren und damit zum Erkennen von Trends herangezogen werden können. Dies geschieht meist durch Einbindung des betrachteten Zeitraumes in die entsprechenden Schlüssel der Daten. • Struktur- und Formatvereinheitlichung (integriert und vereinheitlicht): Dieses Merkmal wird erfüllt durch einheitliche Konventionen (bezüglich Namensgebung, Dateiattributen, etc.), einheitliche Datenformate (z.B. Werteinheiten) und semantischer Integrität (z.B. Angleichen unterschiedlicher Kontenrahmen, Währungsumrechnungen, etc.). Ziel ist eine konsistente Datenmenge im Data Warehouse. - 47 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN • Nicht-Volatilität – nur lesender Zugriff (beständig bzw. dauerhaft): Dauerhafte Speicherung über größere Zeiträume. Die wichtigsten Operationen sind das Downloaden und die Datenabfrage. „Derartige Data Warehouse Systeme sind heute nicht als fertiges Produkt verfügbar, sondern unternehmensindividuell zu konzipieren und zu realisieren, weshalb es angebracht erscheint, eher von einem Data Warehouse Konzept als von einem Data Warehouse System zu sprechen“ [vgl. Gabriel/Röhrs (2003) S. 340]. Für eine analoge Definition der Merkmale des Datawarehouse und auch für zusätzliche Ausführung verweise ich auf Kemper (1999) S. 458ff, Mertens (2000) S. 20, Schneider/Werner (2000) S. 526 oder Shaw (2000), S. 502ff. 5.2 ARCHITEKTUR EINES DATAWAREHOUSE In diesem Abschnitt will ich einen Überblick über die Architektur und die wesentlichen Komponenten in einem Data Warehouse geben. Dazu wurde eine typische Architektur im Data Warehouse in Abbildung 15 graphisch dargestellt. - 48 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 15: Die Architektur eine Data Warehouse [Quelle: in Anlehnung an Posser/Ossimitz (2001) S. 26] 5.2.1 OPERATIVE DATEN Das Datawarehouse wird durch eine Reihe von unterschiedlichen operativen Datenquellen gespeist. Diese individuellen Datenbanken können auf unterschiedlichen Systemen in unterschiedlichen Formaten vorliegen. - 49 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 5.2.2 EXTERNE DATENBANKEN Dies können Datenbanken von externen Anbieter oder frei zugängliche Datenquellen sein, welche in das Datawarehouse integriert werden. 5.2.3 DIE METADATEN Meta-Daten enthalten die Aufzeichnungen darüber, wie die operativen Daten aufgebaut sind, wie die Daten im Data Warehouse aufgebaut sind und wie externe Quellen in das Data Warehouse integriert werden. Meta-Daten sind Datenbanken, die ein Bestandteil des Data Warehouse sind. Sie sind vor allem für die Datenbankadministratoren des Data Warehouse von Bedeutung. 5.2.4 DIE DATENPUMPEN Datenpumpen (Transaktionsprogramme, Lademanager, Frontend-Komponente) führt alle mit dem Extrahieren und Laden der Daten in das Data Warehouse verbundenen Tätigkeiten aus. Dazu gehören einfache Umwandlungen der Daten, um diese für die Eingabe in das Warehouse vorzubereiten. 5.2.5 DER DATAWAREHOUSE MANAGER Der Data Warehouse Manager führt alle mit der Verwaltung der Daten im Warehouse verbundenen Tätigkeiten aus. Dabei ist diese Software insbesondere für folgende Tätigkeiten zuständig: • Analyse der Daten, um die Konsistenz zu gewährleisten • Umformen und Zusammenführen von Quelldaten aus der temporären Speicherung in Data Warehouse Tabellen • Erstellen von Indizes und Ansichten der Basistabellen • Denormalisierung (falls erforderlich) • Aggregatbildung (falls erforderlich) • Anlegen von Sicherheitskopien und Archivieren der Daten [vgl. Connolly et al. (2002) S. 915] 5.2.6 ZUGRIFFSWERKZEUGE FÜR DEN ENDBENUTZER Der vorrangige Zweck eines Data Warehouse besteht darin, den Benutzern Information zu liefern, damit sie fundierte Entscheidungen fällen können. Diese Endbenutzer - 50 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN müssen über Zugriffswerkzeuge mit dem Data Warehouse interagieren können, um die ad hoc und Routineanalysen effizient zu unterstützen. Anschließend sind diese in fünf Gruppen eingeteilt, wobei zu bemerken ist, dass es in der Praxis sehr oft zu Überschneidungen zwischen den Gruppen kommt. [vgl. Connolly et al. S. 916ff] 5.2.6.1 WERKZEUGE FÜR BERICHTE UND ABFRAGEN Die wichtigsten Werkzeuge für den Benutzer sind diejenigen, die ihm die Informationen liefern. Es erfolgt die Eingabe einer Benutzeranforderung und eine entsprechende graphische oder textorientierte Präsentation der Ergebnisse. Üblicherweise werden von den Anwendungen im Hintergrund SQL-Statements generiert, welche die Informationen aus dem Data Warehouse abfragen. Zusätzlich ist jedoch zu bemerken, dass diese Werkzeuge ihre Datenbasis nicht nur aus dem Data Warehouse erhalten, sondern zum Teil auch Daten aus den operativen Systemen direkt in die Präsentation einbeziehen. 5.2.6.2 WERKZEUGE ZUR ENTWICKLUNG VON ANWENDUNGEN Da leider sehr oft Standardanwendungsprogramme für individuelle Benutzeranforderungen ungeeignet sind, gibt es Werkzeuge die Benutzern mit ausreichender Fachkenntnis erlauben hauseigene Abfrage- und Präsentationstools zu entwickeln. 5.2.6.3 EXECUTIVE INFORMATION SYSTEM WERKZEUGE (EIS) Executive Information Systems sind ursprünglich zur Unterstützung strategischer Entscheidungsfindung auf höchster Ebene entwickelt worden. Sie haben jedoch ihren Schwerpunkt erweitert und unterstützen jetzt alle Verwaltungsebenen. EIS-Werkzeuge standen ursprünglich mit Großrechnern in Zusammenhang, die Benutzer in die Lage versetzten, individualisierte graphische Entscheidungsunterstützungswerkzeuge zu erstellen, die einen Überblick über die Organisationsdaten und Zugriff auf externe Datenquellen bereitstellen sollten. Auf dem heutigen Markt ist die Abgrenzung zwischen EIS-Werkzeugen und anderen entscheidungsunterstützenden Werkzeugen noch weniger klar, weil EIS-Entwickler zusätzliche Abfragefähigkeiten einbauen und Anwendungen für Geschäftsbereiche wie Vertrieb, Marketing und Finanzen liefern. Beispiele für EIS-Werkzeuge sind Lightship von Pilot Software Inc., Forest and Trees von Platinum Technologies und Express Analyser von Oracle. - 51 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 5.2.6.4 DECISION SUPPORT SYSTEME (DSS) Ein DSS ist ein System, welches für die taktische und strategische Entscheidungsunterstützung zur Verfügung gestellt wird. Techniken wie Sensibilitätsoder What If Analysen stehen im Vordergrund solcher Anwendungen. Je nach speziellem Anwendungsgebiet (Liquitätsmanagement, Portfoliomanagement, Bonitätsprüfung, etc.) werden wieder unterschiedliche Anwendungssysteme entwickelt. [vgl. Dippold et al. S. 189] 5.2.6.5 ONLINE ANALYTICAL PROCESSING WERKZEUGE (OLAP) Online Analytical Processing Werkzeuge basieren auf den Konzepten mehrdimensionaler Datenbanken und erlauben dem erfahrenen Benutzer, die Daten mit Hilfe komplexer mehrdimensionaler Ansichten zu analysieren. Der Begriff OLAP wurde von Codd im Jahre 1993 geprägt; er bezeichnete eine Architektur, die komplexe analytische Anwendungen unterstützt. OLAP Architekturen werden heute mit Hilfe spezialisierter mehrdimensionaler Datenbanktechnologie, einer eng begrenzten Datenmenge und einer individuell angepassten Benutzerschnittstelle implementiert. 5.2.6.6 DATA MINING WERKZEUGE Als Data Mining wird der Prozess bezeichnet, bei dem große Data Warehouses oder Data Marts durchforstet werden. Dabei wird mit statistischen und mathematischen Methoden, sowie Methoden der künstlichen Intelligenz operiert und versucht neue Korrelationen, Muster oder Trends zu entdecken. Data Mining besitzt das Potential, die Fähigkeiten der OLAP-Werkzeuge abzulösen, da seine Hauptanziehungskraft in der Fähigkeit liegt, anstelle retrospektiver Modelle vorhersehende Modelle zu erstellen. Dadurch versucht man durch Data Mining Werkzeuge den Gap zwischen dem reinen Generieren der Daten und dem Verstehen der selben zu schließen. Dieser Prozess kann automatisch oder semiautomatisch passieren und sollte einen ökonomischen Vorteil bringen. [vgl. Witten/Eibe (2000) S. 1ff] Data Mining Techniken können grundsätzlich in fünf verschiedene Klassen unterteilt werden: • Predictive Modeling: Man versucht festzustellen, ob einige Felder in der Datenbank auf anderen Feldern basieren. Dies wird durch Regressionsanalyse bei numerischen Werten und durch Klassifizierung bei kategorischen Werten versucht. • Clustering: Diese Methode wird auch gelegentlich als “Segmentation“ bezeichnet. Dazu - 52 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN wird eine Anzahl vom Clustern definiert und die Daten entsprechend eingeordnet. • Data summarization: Dabei wird versucht die Daten zu summieren, in Gruppen aufzuteilen und zu analysieren. Ein sehr treffendes Beispiel wäre die KonsumentenwarenkorbAnalyse, wo man zu erkennen versucht, welche Produkte gemeinsam mit welchen gekauft werden. • Dependency modelling: Man versucht funktionelle Zusammenhänge zwischen den Datenfelder festzustellen. • Change and deviation detection: Diese Methoden werden für sequenzielle Informationen, wie Zeitreihen oder genetische Pläne, verwendet. [vgl. Džeroski/Lavrač (2001) S. 34ff] 5.3 OPERATIVE UND ANALYTISCHE DATEN In Datenbanksystemen unterscheidet man operative und analytische Datenbanken. Diese Unterscheidung ist besonders in dem Konnex Data Warehouse eine essentielle. Operative Datenbanksysteme sind Systeme, die den laufenden Geschäftsbetrieb (Transaktionsdaten) erfassen und verwalten. Diese werden auch als Online Transaction Processing (OLTP) Datenbanksysteme bezeichnet. Operative Daten sind unübersichtlich, weil sie eine Vielfalt von Details unterschiedlicher Anwendungen enthalten. In analytischen Datenbanksystemen werden umfangreiche Auszüge aus operativen Daten periodenweise erzeugt und entweder zusammengefasst (aggregiert) oder detailliert zur flexiblen Analyse bereitgestellt. Deshalb enthalten analytische Systeme im Gegensatz zu operativen Systemen auch historische Daten. [vgl. Lusti, Markus (1999), S. 123 ff] Eigenschaften Operative Daten Data Warehouse Prozess transaktionsintensiv abfrageintensiv Benutzer große Anzahl relativ geringe Anzahl Umfang meist nur aktuelle Daten aktuelle und historische Daten ständig aktualisiert sporadisch aktualisiert Aktualisierung - 53 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN funktionell subjektorientiert und verdichtet normal systemabhängig Datenbanksystem Daten werden regelmäßig aktualisiert intervallweise Aktualisierung der Daten Datenmodel Daten sind normalisiert, Modellierung aufgrund der Transaktionen Daten sind nicht normalisiert, Modellierung aufgrund der Dimensionen des Subjektes Anwendungsbereich definiert durch den Bereich der operativen Transaktionsanwendung (statisch, detailliert) liefert ein flexibles, erweiterbares EntscheidungsUnterstützungsinstrument (flexibel, aggregiert) Entwicklung meist werden OLTP-Systeme eingesetzt Data Warehouse wird wiederholt erzeugt und entwickelt Zuordnung eindeutige Prozesshierarchie der Benutzer zuordenbar komplexe Benutzerhierarchie unterschiedlicher Entscheidungsebenen Hohe Verfügbarkeit geringe Verfügbarkeit Identifikationskriterium eindimensional mehrdimensional Datenmanipulation zeilenbezogen / aktualisierend sichtspezifisch / analysierend Integration Datenqualität Verfügbarkeit Tabelle 3: Vergleich operative Daten und Data Warehouse [in Anlehnung: Connolly et al. (2002) S. 910; Prosser, Ossimitz (2000 a), S. 11] - 54 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 5.4 AUFBAUEN UND AKTUALISIEREN EINES DATAWAREHOUSE AUS DEN DATENQUELLEN 5.4.1 KLASSISCHE VORGEHENSWEISE BEIM AUFBAUEN UND AKTUALISIEREN EINES DATAWAREHOUSE Der Aufbau eines Data Warehouse beginnt mit einer Auswahl der geeigneten Attribute aus den operativen Datenbanksystemen. Zusätzlich werden diese meist durch Informationen aus unternehmensexternen Quellen, z. B. Anbieter von Marktforschungsergebnissen, ergänzt. Sowohl externe, als auch interne Daten werden vor ihrer Integration in ein Data Warehouse transformiert. Dabei werden zuerst die Daten ohne Veränderungen direkt aus den operationalen und externen Datenquellen kopiert. In einem weiteren Schritt wird Irrelevantes weggelassen, Neues hinzugefügt und Bestehendes umgeordnet oder verdichtet. Die Daten liegen dann in einer so genannten Basisfaktentabelle (BFT) vor. Dieser Vorgang wird durch sogenannte Datenpumpen (siehe 5.2.4) durchgeführt. Das Durchsuchen einer Basisfaktentabelle mit vielen Einträgen kostet allerdings Zeit und kann auch nicht beliebig beschleunigt werden. Daher werden in einem Data Warehouse meist vorgefertigte Aggregate hinterlegt. Diese werden in wenig und stark zusammengefasste Daten unterteilt [vgl. Connolly et al. (2002) S. 915f]. Diese aggregierten, zusammengefassten Daten können mit dem Synonym des materialisierten View bezeichnet werden. Transformationen, die Aufnahme historischer und externer Daten, sowie die gleichzeitige Haltung von Detaildaten und Aggregaten führen dazu, dass analytische Datenbanken in der Regel größer werden als ihre operativen Quellen. Wie und in welcher Art und Weise die operativen Daten verändert, aggregiert oder umgeordnet werden, ist abhängig vom konzeptionellen Modell des Data Warehouse, welches sich wiederum aus den Benutzeranforderungen ergibt. 5.4.2 NEUE ANSÄTZE FÜR DAS AUFBAUEN UND AKTUALISIEREN DER MATERIALISIERTEN SICHTEN Eine Datawarehouse enthält große Mengen an Information, welche aus unterschiedlichen Datenquellen stammt. Üblicherweise werden die Daten im Warehouse mit den Daten in den Datenquellen in regelmäßigen Intervallen aktualisiert und die neuen Aggregate erzeugt und gespeichert. Allerdings ist das Zeitfenster für das Aktualisieren beschränkt. Deshalb gibt es unterschiedlichste Ansätze dieses Problem zu lösen oder zu umgehen. - 55 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 5.4.2.1 DER WHIPS PROTOTYP Der Ansatz der WHIPS (Warehousing Information Project at Stanford), welcher an der Stanford University entwickelt wurde, geht von der in Abbildung 16 angeführten Struktur aus. Dabei werden als die Hauptkomponenten des Warehouse die „Data Querying & Analysis“ Komponente, verantwortlich für die Erfüllung der Informationsbedürfnisse der Benutzer und die „Data Integration“ Komponente, welche für die Datensammlung und die Erzeugung der materialisierten Sichten verantwortlich ist, angeführt. Diese zwei Komponenten können nicht unabhängig voneinander gesehen werden. So basiert die Auswahl der materialisierten Sichten, welche durch den Data Integrator materialisiert werden, auf den erwarteten Bedürfnissen der Benutzer. Abbildung 16: Die Basisarchitektur des WHIPS Systems [Quelle: Labio et al. (1997) S. 557] In Abbildung 17 wird die Data Integration Komponenten näher beleuchtet. Dabei wurde in Stanford jedes Modul als CORBA Objekt implementiert. Das relationale Modell wurde für das Warehouse verwendet. - 56 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 17: Die WHIPS System Architektur für Warehouse Maintenance [Quelle: Labio et at (1997) S. 558] Jede Quelle hat einen Wrapper und einen Monitor. Der Monitor hat die Aufgabe die Datenquelle zu überwachen und bei Änderungen in der Basisdatenquelle den Integrator darüber in Kenntnis zu setzen. In Stanford wurden triggerbasierende Monitore für die relationalen Datenquellen und Snapshot Monitore für andere Datenquellen, wo nur periodische Aktualisierungen möglich sind, eingesetzt. Der Wrapper hat die Aufgabe die Abfragen der unterschiedlichen Datenquellen zu übersetzen. Stellt also der Query Processor eine Anfrage an einen Wrapper, übersetzt er diese Query entsprechend der zugrunde liegenden Datenquelle. Die zentrale Rolle hat der Integrator inne. Er erhält die Änderungsmeldungen der Monitore, weiß welche Querys von den gemeldeten Datenquellen betroffen sind und benachrichtigt die entsprechenden View Manager die betroffenen materialisierten Sichten, bzw. Tupel im Data Warehouse zu aktualisieren. Die View Manager senden ihre Information an einen Wrapper, welcher die Daten in das Format der Data Warehouse Tabellen wandelt und speichert. [vgl. Labio et al. (1997) S. 557ff] - 57 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 5.4.2.2 DER SUMMARY TABLE ANSATZ Materialisierte Sichten in einem Data Warehouse können grundsätzlich auf zwei Arten aktualisiert werden. Entweder man erzeugt den materialisierten View komplett neu oder man arbeitet die Änderungen seit dem letzten Updatevorgang ein. Mumick et al. (1997) unterteilen dazu den Updatevorgang in einen Propagate Vorgang und einen Refresh Vorgang. Beim Propagate Vorgang werden so genannte Summary-Delta Tables erzeugt. Diese Tables enthalten alle Änderungen, welche sich seit dem letzten Updatevorgang ergeben haben. Man unterscheidet zwei Tables: • Den Pos_ins Table, welcher die neuen, bzw. veränderten Tupel des BFT enthält und • den Pos_del Table, welcher alle gelöschten Tupel enthält, welche aus dem BFT entfernt werden müssen. Beim Refresh Vorgang werden nun diese Änderungen der Delta-Summary Tables in die eigentlichen materialisierten Views geschrieben. Der Vorteil dieser Methode ist, dass während des Propagate Vorganges das Datawarehouse uneingeschränkt zur Verfügung steht, da die Abfragetabellen nicht berührt werden. Erst beim Refresh Vorgang ist das Warehouse nicht verfügbar. Dadurch kann die Gesamtzeit der Nichtverfügbarkeit deutlich gesenkt werden. Die Delta-Summary Methode funktioniert aber bei verschiedenen Aggregaten unterschiedlich. Mumick et al. (1997) unterscheiden grundsätzlich drei Klassen von Aggregaten: • Distributive (SQL Funktionen COUNT, SUM, MIN und MAX) • Algebraic (SQL Funktion AVG) und • Holistic (Median, …) Ein Nachteil der Delta-Summary Methode ist die Tatsache, dass nur distributive Funktionen verarbeitet werden können. Holistische Funktionen können grundsätzlich nicht verarbeitet werden. Algebraische Funktionen können zum Teil simuliert werden indem z.B. der Mittelwert aus Summe durch Anzahl berechnet wird (SUM/COUNT). Auch die Funktionen MIN und MAX sind nur eingeschränkt einsetzbar. Sollte z.B. das aktuelle MIN oder MAX Tupel in der Menge der gelöschten Tupel sein, ist es nicht möglich das neue MIN oder MAX Tupel zu bestimmen ohne den gesamten Table neu zu erzeugen. Dies kann zwar durch einen Algorithmus automatisiert werden, vermindert - 58 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN jedoch den Zeitgewinn, welcher durch die Delta-Summary Methode erzielt werden könnte. prepare-insertions prepare-deletions 1 -1 case when expr is null then case when expr is null then COUNT(expr) 0 else 1 0 else -1 -expr SUM(expr) expr MIN(expr) expr expr MAX(expr) expr expr COUNT(*) Tabelle 4: Änderungen der Aggregate nach Funktionen [Quelle: Mumick et al. (1997) S.105] In Tabelle 4 sind die Änderungen der Aggregattabellen abhängig von den jeweiligen Funktionen aufgelistet. Wird z.B. der Wert 10 im Delta Summary Insert Table errechnet, wird dieser Wert zum materialisierten View addiert. Wird z.B. der Wert 10 im Delta Summary Delete Table errechnet, wird dieser Wert vom materialisierten View subtrahiert. [vgl. Mumick et al. (1997) S.100ff] 5.4.2.3 DER MULTIPLE VIEW MAINTENANCE POLICIES ANSATZ Dieser Ansatz berücksichtigt, dass die Quelldaten, aus welchen die Daten importiert werden, sehr unterschiedlich sein können. Durch diese unterschiedliche Behandlung der materialisierten Views soll ein Perfomancegewinn erzielt werden. Dabei werden die Views in drei unterschiedliche Klassen eingeteilt: • Immediate Views: Diese können ständig aktualisiert werden, sobald sich eine Quelldatenbank, bzw. ein Quelldatensatz ändert. • Deferred Views: Diese Views werden bei Anfrage des Users materialisiert. Das führt zu langsameren Abfragen, aber schnelleren Update Vorgängen. • Snapshot Views: Diese werden periodisch durch einen asynchronischen Prozess aktualisiert. Dadurch ist die Aktualität der Daten nicht garantiert. Diese unterschiedlichsten Views können wiederum in Viewgroups zusammengefasst werden. Diese Viewgroups von Colby et al. (1997) sind definiert dass • die Aktualisierung eines Views in einer Viewgroup keine Aktualisierungen in einer anderen Viewgroup auslöst - 59 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN • es möglich sein muss, eine Query abzufragen ohne einen Join mit einem Table außerhalb der Viewgroup zu machen. [vgl. Colby et al. (1997) S.405ff] 5.5 INFORMATIONSFLÜSSE IN EINEM DATA WAREHOUSE Connoly et al. (2002) teilen die Informationsflüsse in einem Data Warehouse in fünf primäre Informationsflüsse: Prozess Inflow Upflow Downflow Outflow Metaflow Beschreibung Extrahieren, Laden und Reinigen der Quelldaten Erhöhen des Wertes der Daten im Warehouse durch Zusammenfassen, Verpacken und Verteilung Archivieren und Sichern der Daten im Warehouse Die Daten für Endbenutzer verfügbar machen Verwalten der Metadaten Tabelle 5: Informationsflüsse im Data Warehouse [Quelle: Connolly et al. (2002) S. 918ff] 5.5.1 INFLOW Der Inflow befasst sich damit, Daten aus den Quellsystemen zu übernehmen, die in das Data Warehouse geladen werden sollen. Da die Quelldaten überwiegend durch OLTP Systeme erzeugt werden, müssen sie für den Zweck des Data Warehouse neu aufgebaut werden. Dazu gehört Folgendes: • Reinigen der „verunreinigten“ Daten. • Neustrukturieren der Daten. Zum Beispiel durch Hinzufügen und/oder Löschen von Feldern und Denormalisierung. • Gewährleisten, dass die Quelldaten in sich und mit den bereits im Data Warehouse befindlichen Daten konsistent sind. Um den Inflow effizent zu verwalten, müssen Mechanismen festgelegt werden, um zu ermitteln, wann man mit dem Extrahieren der Daten beginnt, die erforderlichen Umwandlungen ausführt und Konsistenzprüfungen vornimmt. Beim Extrahieren der Daten aus dem Quellsystem muss man unbedingt dafür sorgen, dass sich die Daten in einem konsistenten Zustand befinden, um eine konsistente Ansicht der Firmendaten zu bekommen. Die Datenextraktionssoftware sollte vollständig automatisch funktionieren und in der Lage sein, das Auftreten von Problemen und Fehlern zu melden. - 60 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 5.5.2 UPFLOW Mit dem Upflow sind folgende Aktivitäten verknüpft: • Zusammenfassen der Daten durch Auswahl, Projezieren, Verknüpfen und Gruppieren relationaler Daten zu Ansichten, die für den Endbenutzer bequemer und hilfreicher sind. Das Zusammenfassen geht über einfache relationale Operationen hinaus - es umfasst ausgefeilte statistische Analysen einschließlich der Feststellung von Trends, der Clusterbildung und des Sampling. • Verpacken der Daten durch Konvertieren der zusammengefassten oder detaillierten Daten in sinnvollere Formen wie zum Beispiel Arbeitsblätter, Textdokumente, Diagramme oder Animationen. • Verteilung der Daten an geeignete Gruppen, um ihre Verfügbarkeit und Zugänglichkeit zu erhöhen. 5.5.3 DOWNFLOW Die Archivierung alter Daten spielt bei der Aufrechterhaltung von Effizenz und Leistung des Data Warehouse durch Auslagern der älteren Daten eine wichtige Rolle. Der Informations-Downflow umfasst die Prozesse, welche sicherstellen, dass der aktuelle Zustand des Data Warehouse nach Datenverlust oder Soft- bzw. Hardwarefehlern wieder hergestellt werden kann. 5.5.4 OUTFLOW Der Outflow ist die Stelle, an der die Organisation den wirklichen Wert des Data Warehouse wahrnimmt. Zum Outflow gehören folgende Schlüsselaktivitäten: • Das Zugreifen, das sich mit der Erfüllung der Anforderungen der Endbenutzer hinsichtlich der benötigten Daten befasst. • Das Übermitteln, das sich mit der aktiven Übermittlung der Information an die Rechner der Endbenutzer beschäftigt. Dies kann von periodischen Reports bis zu Veröffentlichungs- und Abonnementsprozessen reichen. 5.5.5 METAFLOW Der Metaflow ist der Prozess, welcher Metadaten bewegt. Also Daten über die anderen Informationsflüsse. Um den sich ändernden Geschäftsbedürfnissen gerecht zu werden, ändern sich herkömmliche Systeme ständig. Der Metaflow muss sich deshalb fortlaufend mit diesen Änderungen befassen. - 61 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 5.6 PROBLEME IM DATA WAREHOUSE • Unterschätzen der Ressourcen für das Laden der Daten Viele Entwickler unterschätzen die für das Extrahieren, Reinigen und Laden der Daten in das Warehouse erforderliche Zeit, die bis zu 80% der Gesamtentwicklungszeit ausmachen kann, obwohl bessere Datenreinigungsund Datenverwaltungswerkzeuge diese Zeit reduzieren könnten. • Unentdeckte Probleme mit Quellsystemen Unentdeckte Probleme im Zusammenhang mit den Quellsystemen, die das Data Warehouse speisen, werden irgendwann aufgedeckt, möglicherweise erst nach Jahren. Der Entwickler muss entscheiden, ob sie innerhalb des Data Warehouse und/oder in den Quellsystemen behoben werden sollen. Beim Eingeben der Einzelheiten können einige Felder beispielsweise eine NULL zulassen, was dazu führen kann, dass Mitarbeiter unvollständige Daten eingeben, obwohl diese verfügbar und geeignet sind. • Fehlende Aufzeichnungen der erforderlichen Daten Warehouse-Projekte zeigen häufig Bedarf für Daten, die in den bestehenden Quellsystemen nicht aufgezeichnet wurden. Die Organisation muss entscheiden, ob die operativen Systeme geändert werden oder ein System für die Aufzeichnung der fehlenden Information erstellt werden soll. • Gestiegener Bedarf für Endbenutzer Nachdem die Endbenutzer Abfrage- und Berichtswerkzeuge bekommen haben, kann die Anforderung von Unterstützung durch die für Dienste zuständigen Mitarbeiter steigen statt sinken. Das liegt am wachsenden Wissen der Benutzer über die Fähigkeiten und den Wert des Data Warehouse. • Datenhomogenisierung Data Warehousing in großen Umfang kann enorme Anforderung in Bezug auf die Datenhomogenisierung haben. Insbesondere ist darauf zu achten die Daten durch die Homogenisierung nicht zu verfälschen. • Hoher Ressourcenbedarf Das Data Warehouse kann viel Speicherplatz auf der Festplatte belegen. • Datenbesitz Sensible Daten sollten auch nach der Implementierung eines Data Warehouse nur gewissen Benutzern zugänglich sein. - 62 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN • Hoher Pflegeaufwand Data Warehouses sind Systeme mit hohem Pflegeaufwand, die oft in Kostenkalkulationen einen erheblichen Posten einnehmen können. • Projekte mit langer Dauer Der Aufbau eines Warehouse kann bis zu drei Jahre dauern. Dies wird oft unterschätzt und verursacht Komplikationen. • Komplexität der Integration Komplexe Unternehmensstrukturen führen zu komplexen Data Warehouse Systemen. Das stellt Entwickler oft vor unübersichtliche und nahezu unlösbare Fragestellungen. [vgl. Connolly et al. S. 912f] 5.7 VORTEILE EINES DATAWAREHOUSE Als Vorteile eines effizienten und effektiven Informationsmanagements durch ein Datawarehouse lassen sich nach Fritz (1997) folgende Punkte herausstellen: • Reduzierung der Kosten für Entscheidungsprozesse: Durch Automatisierung der Datenbeschaffung und Datenkonsolidierung lassen sich redundante Informationsbeschaffung und langwierige Diskussionen über inkonsistente oder inkompatible Daten vermeiden. Gleichzeitig genügt es, den Mitarbeitern eine einzige Quelle für die Generierung von Managementinformationen zur Verfügung zu stellen. • Verbesserung der Qualität der Information: Durch die zentrale Speicherung von Daten aus unterschiedlichsten internen und externen Quellen wird es möglich, umfangreiche Analysen durchzuführen. Bisher nicht bekannte Zusammenhänge werden durch eine Integration der Data Mining Verfahren aufgedeckt. • Flexibilität der Informationsgewinnung: Neue Führungsinformationssysteme, die Data Warehouse- und Data MiningKonzepte verbinden, können den Bedarf an Führungsinformationen besser befriedigen, denn sie sind auf die interaktive Informationsgewinnung ausgelegt und erleichtern die Interpretation der Daten. Im Gegensatz zu vorgefertigten Reports, wie sie von klassischen Management-Informationssystemen generiert wurden, bieten sie anwenderfreundliche, interaktive Analysemöglichkeiten. [vgl. Fritz (1997) S. 2] - 63 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 5.8 ANFORDERUNGEN AN EIN DATENBANKSYSTEM FÜR EIN DATAWAREHOUSE Die speziellen Anforderungen an ein für Data Warehousing geeignetes relationales Datenbanksystem sind nach Connolly et al. (2002): • Ladeleistung: Data Warehouses erfordern das regelmäßige inkrementelle Laden neuer Daten in engen Zeitfenstern. Die Leistung des Ladeprozesses sollte in hundert Millionen Zeilen oder in Gigabyte pro Sekunde gemessen werden, und das Geschäft sollte nicht durch eine Obergrenze eingeschränkt werden. • Ladeverarbeitung: Zum Laden neuer oder aktualisierter Daten in das Data Warehouse sind viele Schritte erforderlich: Datenkonvertierung, Filterung, Neuformatierung, Integritätsprüfung, physische Speicherung, Indizierung und Aktualisierung der Metadaten. Obwohl jeder Schritt in der Praxis atomar sein mag, sollte der Ladeprozess als geschlossene, nahtlose Arbeitseinheit erscheinen. • Sicherung der Datenqualität: Die Verlagerung auf faktenbasierte Verwaltung verlangt höchste Datenqualität. Das Warehouse muss trotz „unsauberer“ Quellen und gewaltiger Datenbankgrößen lokale und globale Konsistenz sowie referenzielle Integrität gewährleisten. Laden und Vorbereiten sind zwar notwendige Schritte, reichen aber nicht aus. Die Fähigkeit, die Abfragen der Endbenutzer zu beantworten, bildet den Erfolgsmaßstab einer Data Warehouse Anwendung. Mit der Beantwortung einer größeren Menge von Fragen neigen die Analysten dazu, kreative und komplexere Fragen zu stellen. • Abfrageleistung: Faktenbasierte Verwaltung und Ad-hoc-Analyse dürfen durch die Leistung des relationalen Data Warehouse Datenbanksystems weder gebremst noch verhindert werden. Umfangreiche, komplexe Abfragen für geschäftliche Schlüsseloperationen müssen in einem vernünftigen Zeitraum abgeschlossen werden. • Terabyte-Skalierbarkeit: Die Größe von Data Warehouse steigt enorm; sie beginnt bei wenigen oder mehreren hundert Gigabyte und erreicht mehrere Terabyte (1012 Byte) oder Perabyte (1015 Byte). Das relationale Datenbanksystem darf keine architekturbedingten Einschränkungen der Datenbankgröße aufweisen und sollte modulare und parallele Verwaltung unterstützen. Falls ein Fehler auftritt, sollte - 64 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN es fortlaufende Verfügbarkeit gewährleisten und Mechanismen für die Wiederherstellung bieten. Es muss Massenspeichergeräte wie optische Platten und Geräte zur hierarchischen Speicherverwaltung unterstützen. Die Abfrageleistung sollte schließlich nicht von der Größe der Datenbank, sondern von der Komplexität der Abfrage abhängen. • Benutzermengen-Skalierbarkeit: Das derzeitige Denken geht dahin, dass der Zugriff auf ein Data Warehouse auf relativ wenige Benutzer aus der Geschäftsleitung beschränkt ist. Das wird angesichts der Erkenntnis des Nutzens von Data Warehouses wahrscheinlich nicht so bleiben. Es lässt sich vorhersehen, dass das relationale Datenbanksystem für das Data Warehouse in Zukunft in der Lage sein sollte, mehrere hundert oder sogar tausend Benutzer zu verkraften und gleichzeitig eine akzeptable Abfrageleistung beizubehalten. • Das vernetzte Data Warehouse: Data Warehouse-Systeme sollten zur Zusammenarbeit in einem umfangreicheren Data Warehouse-Netzwerk fähig sein. Das Data Warehouse muss Werkzeuge zur Koordination der Bewegung von Datenteilmengen zwischen den Warehouses besitzen. Die Benutzer sollten von einer einzelnen Client-Workstation aus Einblick in mehrere Data Warehouses haben und mit diesen arbeiten können. • Warehouse-Administration: Der sehr große Umfang und die zeitzyklische Natur des Data Warehouse verlangt einfache und flexible Administration. Das relationale Datenbanksystem muss Steuerelemente besitzen, um Ressourcengrenzen, eine Rückbelastungskontierung (zur Zuweisung von Kosten an die Benutzer) und das Setzen von Prioritäten für Abfragen (zur Erfüllung der Bedürfnisse unterschiedlicher Benutzerklassen und Aktivitäten) implementieren zu können. Außerdem muss es die Verfolgung der Arbeitsbelastung und die Feinabstimmung vorsehen, damit sich die Systemressourcen auf maximale Leistung und maximalen Durchsatz optimieren lassen. Der am deutlichsten sicht- und messbare Wert für die Implementierung eines Data Warehouse zeigt sich im unbehinderten, kreativen Zugriff auf die Daten. • Integrierte dimensionale Analyse: Die Leistungsfähigkeit mehrdimensionaler Ansichten ist weithin akzeptiert, und um die höchstmögliche Leistung für relationale OLAP-Werkzeuge bereitzustellen, muss im relationalen Datenbanksystem des Warehouse dimensionale Unterstützung gegeben sein. Das Datenbanksystem muss das - 65 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN schnelle und einfache Erstellen im voraus berechneter Zusammenfassungen unterstützen, die in umfangreichen Data Warehouses üblich sind und Pflegewerkzeuge zur Automatisierung der Erstellung dieser Aggregatwerte bereitstellen. Die dynamische Berechnung von Aggregatwerten sollte mit den interaktiven Leistungsbedürfnissen des Endbenutzers übereinstimmen. • Erweiterte Abfragefunktionalität: Die Endbenutzer verlangen erweiterte analytische Berechnungen, sequenzielle und vergleichende Analysen und konsistenten Zugriff auf detaillierte und zusammengefasste Daten. Die Verwendung von SQL kann in einer Client/Server-Umgebung mit „Zeig-und-klick“-Werkzeugen wegen der Komplexität der Benutzerabfragen manchmal unpraktisch oder sogar unmöglich sein. Das relationale Datenbanksystem muss einen vollständigen und erweiterten Satz analytischer Operationen zur Verfügung stellen. [vgl. Connolly et al. (2002) S. 922f] 5.9 DATA MARTS Zeitgleich mit dem Aufkommen der Data Warehouses entstand auch das verwandte Konzept der Data Marts. Ein Data Mart ist eine Teilmenge eines Data Warehouses, welche die Bedürfnisse einer bestimmten Abteilung oder Geschäftsfunktion erfüllt. Ein Data Mart enthält diese Teilmenge der Daten normalerweise in Form von zusammengefassten Informationen über eine bestimmte Abteilung oder Geschäftsfunktion. Der Data Mart kann selbständig oder zentral mit dem Data Warehouse verknüpft sein. Data Warehouses und Data Marts unterscheiden sich durch folgende Merkmale: • Ein Data Mart konzentriert sich ausschließlich auf die Bedürfnisse von Benutzern, die mit einer Abteilung oder Geschäftsfunktion zu tun haben. • Data Marts enthalten normalerweise im Unterschied zu Data Warehouses keine detaillierten operativen Daten. • Da Data Marts im Vergleich mit Data Warehouses weniger Information enthalten, sind sie einfacher zu verstehen, und man kann sich in ihnen leichter bewegen. [vgl. Connolly et al. (2002) S. 927f] - 66 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 5.10 DIE MODELLIERUNG EINES DATAWAREHOUSE 5.10.1 MODELLTHEORIE Bei der Modellierung wird aus einem Problembereich, dem Original, durch Abbilden, Verkürzen und Vereinfachen mit einer gegebenen Pragmatik ein Modell gebildet. Man unterscheidet isomorphe (ohne Informationsverlust) und homomorphe (mit Informationsverlust) Abbildung von realen Systemen. Das Metamodell ist kein Modell eines Modells, sondern ein Modell eines Modellbereichs, d.h. einer Menge gleichartiger, nach der gleichen Technik erstellter Modelle. [vgl. Kaiser (2000)] Abbildung 18: Das Modellsystem [Quelle: Kaiser (2000)] Man unterscheidet drei Phasen der Modellierung: • Konzeptionelles Modell: z.B. Entity Relationsmodell, Dimensional Fact (DF) Modell • Umsetzung in ein logisches Modell: z.B. relationales Modell , Star Schema • Physischer Entwurf: Implementierung des konkreten Modells In jeder Phase der Modellierung stehen den Entwicklern unterschiedlichste Werkzeuge zur Verfügung. - 67 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 19: Phasen der Modellierung [Quelle: Kaiser (2000)] 5.10.2 ATTRIBUTE Attribute stellen die Grundeinheiten für die Analyse dar. Attribute entsprechen in einer relationalen Datenbank den Spalten. Typische Attribute eines Kunden wären z.B. Kundennummer, Anrede, Name, Adresse, usw. In einem Data Warehouse unterscheidet man 3 Typen von Attributen: • Hierarchiestufen: Identifizieren ein Aggregationslevel (z.B. Kundengruppe, Region, Staat, usw.). • Schlüsselfelder, Indikator, „Fact-Attribute“: Sind Attribute, die aggregiert werden können (z.B. Umsatz, Stück, Liter, Kilogramm, usw.). • Nicht-aggregierbare Attribute: Sind Attribute, die zusätzliche Informationen geben (z.B. Name des Kunden, Adresse des Kunden, usw.). 5.10.3 DIMENSIONEN UND HIERARCHIEN Die Dimension bestimmt die Granularität der . Sie ist ein meist symbolisches und diskretes Attribut, das die Auswahl, Zusammenfassung und Navigation eines Schlüsselfeldes erlaubt. Jede Dimension hat mindestens eine Hierarchiestufe. Man spricht von der Skalierbarkeit der Dimensionen (z.B. Tag, Monat, Jahr). Zu jeder Hierarchiestufe existiert eine konkrete Ausprägung (z.B. Staat, Land, Bezirk, Ort, - 68 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Strasse) und damit kann man für jede Hierarchiestufe eine Aggregation der Facts vornehmen (z.B. Umsatz pro Bezirk, Umsatz pro Ort, usw.). Abbildung 20: Einfache Hierarchie am Beispiel eines Kunden Die Zeit ist eine Dimension, die immer in jedem Data Warehousesystem vorkommt. Systeme mit mehr als zwei Dimensionen nennt man multidimensionale Systeme. Dimensionen und Hierarchien können relativ übersichtlich allgemein formal in der Notation d yx dargestellt werden. Wobei y im Intervall 0 → ∞ liegt und die Dimension repräsentiert. Die Variable x im Intervall 0 → ∞ gibt die Hierarchiestufe wieder. So stellt z.B. das Element d 32 die 3 Hierarchiestufe der Dimension 4 dar. 5.10.4 DIE DATENWÜRFEL Bei der Kombination von zwei Dimensionen entsteht eine klassische Tabelle, wie sie von dem relationalen Datenmodell her bekannt ist. Durch das Hinzufügen einer dritten Dimension entsteht ein dreidimensionaler Raum, der typischerweise in der Form eines Würfels (cube) modelliert wird. Jede Kante des Würfels bildet eine Dimension ab (siehe Abbildung 21) und ist durch deren Elemente in ihrer Länge fest skaliert. Wenn mehr als 3 Dimensionen verwendet werden, spricht man auch von einem Hyper-Würfel (hypercube). Dabei ist zwar das geometrische Vorstellungsvermögen erschöpft, gedanklich aber sind mehr als dreidimensionale Kombinationen problemlos nachzuvollziehen, wenn die darin enthaltenen Dimensionen den realen Datenstrukturen entsprechen. Mathematisch kann ein Würfel mit n Dimensionen auch als Vektor (v) mit n Elementen aufgefasst werden, wobei jedes Element des Vektors einer Hierarchiestufe einer Dimension entspricht. - 69 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 21: Darstellung eines Würfels (cube) mit den Dimensionen Zeit, Artikel und Kunden [ in Anlehnung: Prosser/Ossimitz (2000), S. 18] 5.10.5 OPERATOREN Würfel entstehen durch die Kombination von Dimensionen und deren Ausprägungen (Hierarchiestufen). Mögliche Inhalte ergeben sich aus dem Kartesischen Produkt der Hierarchiestufen . Bei z.B. 1000 Kunden und 5 Jahren über alle Artikel (Würfel X) erhält man 5000 mögliche Einträge für diesen Würfel. Diese Einträge enthalten die aggregierten Werte der Schlüsselfelder oder Facts (z.B. Summe Umsatz/Kunden und Jahr für alle Artikel). Es gibt aber neben der Summe noch eine Reihe andere Operatoren, die in Tabelle 6 kurz darstellt sind. Operator Sum Average Minimum Maximum Nominal NO NO NO NO Ordinal NO (YES) YES YES Interval NO YES YES YES Rational YES YES YES YES Tabelle 6: Operatoren und Zahlentypen [in Anlehnung: Prosser, Ossimitz (2000 a), S. 20] Nominale Kennzahlen sind durch Zahlen dargestellte Codewerte, wie etwa das Geschlecht oder klassische True-or-False-Aussagen (0 für männlich, 1 für weiblich). Diese Kennzahlen können nicht aggregiert werden und sind für Key Figures ungeeignet. - 70 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Ordinale Zahlentypen sind klassischerweise Ratings, wie etwa ein Schulnotensystem oder die Bewertung von Meinungsforschungsumfragen. Durch die ordinalen Kennzahlen wird nur eine Reihenfolge ausgedrückt, es wird jedoch keine Aussage über die Differenz zwischen den Werten gegeben. Deshalb kann normalerweise kein Mittelwert gebildet werden, obwohl das beim Schulnotensystem mit einer Kombination der Schulnoten mit einem gewissen Prozentsatz an richtigen Antworten zum Teil möglich ist. Intervallkennzahlen und Rationalkennzahlen sind beide metrisch. Der Unterschied liegt darin, dass Intervallkennzahlen einen Nullpunkt besitzen. Als bekanntestes Beispiel ist hier die Temperatur zu nennen. [vgl. Prosser/Ossimitz (2003) S. 32] 5.10.6 SLICE AND DICE OLAP-Systeme bieten Anwendern individuelle und flexible Sichten auf „ihre“, für sie, interessanten Daten. Dies wird durch Isolieren einzelner Schichten aus dem gesamten Datenpool vollzogen. Slice beschreibt dabei das „Schneiden“ eines bestimmten Ausschnitts (etwa einer Periode) aus der Zeitdimension, wodurch der betrachtete Datenwürfel neu determiniert wird. Zum anderen besteht die Möglichkeit, diesen Würfel von verschiedenen Seiten zu betrachten. So erhält der Anwender durch „Drehen“, „Kippen“ oder „Würfeln“ (Dice) jeweils eine neue Perspektive. Mit Slice und Dice werden die Anwender bei typischen Geschäftsfragen unterstützt. (z.B. Welche Kunden im Burgenland haben einen Umsatz über 100 000 ?). [vgl. Schinzer et al. (1997), S. 40 ] Abbildung 22: Selektion der Daten durch das Slice-Verfahren [Quelle: Schinzer et al. (1997), S. 40] - 71 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Die Abbildung 22 stellt deutlich die verschiedenen Möglichkeiten des Slice Verfahrens dar. Man sieht, dass unterschiedliche Anwender unterschiedliche Sichtweisen auf das Datenmodell benötigen. 5.10.7 NAVIGATION DURCH DEN DATENBESTAND Beim Navigieren durch den Datenbestand unterscheidet man wie in Abbildung 23 angeführt folgende Möglichkeiten: • Drill Down: Die Möglichkeit von hoch aggregierten Kennzahlen auf niedrigere Aggregationsstufen zu wechseln, um so zusätzliche Detailinformationen zu erhalten. • Roll up: Die Möglichkeit Kennzahlen niedriger Aggregationsstufe weiter zu aggregieren. • Drill Across (Drill Through): Die Möglichkeit bei einem beliebigen Schnitt durch den Datenwürfel auch die benachbarten Dimensionselemente (z.B. andere Region, anderer Kunden, anderes Produkt) zu betrachten. Abbildung 23: Die Navigation durch die Navigationsebenen [in Anlehnung: Prosser, Ossimitz (2000 a), S. 24 ] - 72 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 5.10.8 KONZEPTIONELLE ODER SEMANTISCHE MODELLIERUNG 5.10.8.1 GRAPHISCHE MODELLIERUNG Es gibt nicht viele Methoden ein Data Warehouse zu modellieren. Als eine der wichtigsten wird hier das Dimensional Fact (DF) Modell von Golfarelli, Maio und Rizzi genannt [vgl. Golfarelli et al. (1998)]. Dieses Modell besteht aus baumartigen „FactSchemas“, die aus Schlüsselfeldern, Dimensionen und Hierarchien bestehen. Artikeltyp Hierarchie Größe Artikel Nicht-aggregierbare Attribute Adresse ZEIT Monat Verkauf Verkaufte Menge Umsatz Tag Kunde Gruppe Schlüsselfelder Abbildung 24: Einfaches Modell eines dreidimensionalen „Fact-Schema“ [in Anlehnung: Prosser, Ossimitz, (2000 a), S. 29] Die Modellierung mit dem „Fact-Schema“ beginnt mit der Auswahl der Facts (Schlüsselfelder, Kennzahlen), die für die Betrachtung interessant erscheinen. Danach wird für jedes Schlüsselfeld ein Attributbaum entwickelt (siehe Abbildung 25). - 73 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 25: Attributsbaum vor Pruning und Grafting [in Anlehnung: Prosser, Ossimitz, (2000 a), S. 33] Dieser wird durch „Pruning“ und „Grafting“ vereinfacht. Der Zweck des „Pruning“ und „Grafting“ ist eine Vereinfachung des Modells. Beim „Pruning“ wird dabei ein kompletter Unterbaum vom Baum abgetrennt und aus der Betrachtung des „FactSchemas“ entfernt. Es ist natürlich dann auch unmöglich Daten dieses Unterbaumes zu aggregieren. Beim „Grafting“ werden nur einzelne Attribute, die uninteressante Information enthalten entfernt. In Abbildung 26 sehen sie wie durch „Grafting“ das Attribut „Rechnr“ entfernt wurde. Abschließend werden die Dimensionen, Hierarchien und „Fact-Attribute“ festgelegt. Abbildung 26: Attributsbaum nach Pruning und Grafting [in Anlehnung: Prosser, Ossimitz, (2000 a), S. 34] - 74 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 5.10.8.2 HALBGRAPHISCHE MODELLIERUNG 5.10.8.2.1 GITTER Um eine systematische Planung der Datenwürfel durchführen zu können, benötigt man zuerst die Menge der möglichen Datenwürfel. Diese kann durch ein Gitter dargestellt werden. In Abbildung 27 sieht man ein Beispiel für ein Gitter mit 3 Dimensionen (Kunden, Artikel, Zeit). Die Dimensionen unterteilen sich in folgende Hierarchiestufen: • Kunden: Kunde individuell (K_id), Kundengruppe (K_gr), Kunden gesamt (K_*) • Artikel: Artikel individuell (A_id), Artikelgruppe (A_gr), Artikel gesamt (A_*) • Zeit: Tag (Z_t), Monat (Z_m), Jahr (Z_j), Zeit gesamt (Z_*) Abbildung 27: Gitter [in Anlehnung: Prosser, Ossimitz (2000 a), S. 40] Die Darstellung der Würfel in einem Gitter bringt viele Vorteile. Diese sind: • Jede Kombination der Hierarchiestufen der Dimensionen kann separat dargestellt werden • Man kann relativ leicht erkennen, welcher Würfel aus welchen Würfeln abgeleitet werden kann • Das Gitter zeigt alle Kombinationsmöglichkeiten • Das Gitter zeigt alle Kombinationsmöglichkeiten redundanzfrei. Der große Nachteil des Gitters ist jedoch, dass es relativ rasch mit steigender Anzahl der Dimensionen und Hierarchien zu komplex und unübersichtlich wird. [vgl. Prosser/Ossimitz (2001) S.55] - 75 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Allgemein ergibt sich die Größe eines Gitterverbandes aus Anzahl(Knoten)= ∏ n kn kn.....Anzahl der Hierarchiestufen in Dimension n Für weiterführende Literatur zum Gitter siehe Crawley/Dilworth (1973). 5.10.8.2.2 AGGREGATION PATH ARRAY Da das Gitter nicht für die Darstellung sehr komplexer mehrdimensionaler Strukturen geeignet ist, liegt es auf der Hand, eine Methode zu nutzen, welche die Vorteile des Gitters mit einer einfachen übersichtlichen Darstellung von anderen Modellierungsmethoden kombiniert. Das Ergebnis ist die von Prosser und Ossimitz entwickelte Methode des APA (Aggregation Path Array). Dieser Methode wurde unten der Abschnitt 6 gewidmet und wird dort entsprechend erläutert. Deshalb soll sie hier nur der systematischen Einordnung willen angeführt werden. 5.10.9 LOGISCHE UND PHYSIKALISCHE MODELLIERUNG 5.10.9.1 STAR-SCHEMA Das Star-Schema ist eine der bekanntesten Modellierungstechniken für ein Data Warehouse. Es besteht aus zwei Arten von Tabellen, dem „Fact-Table“ und dem Dimension-Table. Der Name Star-Schema rührt daher, dass die Dimension-Tables sternförmig um das zentrale „Fact-Table“ (Basisfaktentabelle) angeordnet sind. (siehe Abbildung 28). Die Anzahl der Tabellen entspricht immer der Summe von Dimensionen und dem „Fact-Table“. - 76 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 28: Star-Schema mit „Fact-Table“ (gelb) und vier Dimension-Tables [In Anlehnung: Prosser, Ossimitz (2000 a), S. 51] Zentraler Dreh- und Angelpunkt des Star-Schemas ist das „Fact-Table“. Es erfasst jede Transaktion in einer eigenen Zeile, wodurch es zur größten Tabelle des Schemas wird. Ein Dimensionselement jeder Dimension und mehrere numerische Kennzahlen (measures) stellen die Spalten des „Fact-Table“ dar, wodurch eine Transaktion eindeutig definiert wird. Anhand des Dimensionselements ist eine Verbindung zum entsprechenden Dimension-Table gewährleistet, entsprechend einem Primärschlüssel. Dort sind die verschiedenen Aggregationsstufen definiert, über die die Transaktionen des „Fact-Table“ konsolidiert werden können. [vgl. Schnizer et al., (1997), S. 48 f] Es gibt jedoch auch Nachteile des Star-Schemas. Es führt zu einem großen und teuren Bedarf an Plattenspeicher, hervorgerufen durch die Mehrfachspeicherung von Informationen. Große Dimension-Tables wirken sich sehr nachteilig auf die Performance aus. Aus diesem Grund wurde auch das Snowflake-Schema entwickelt. - 77 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 29: Das klassische Star-Schema [In Anlehnung: Prosser/Ossimitz (2000a ) S. 51] 5.10.9.2 FACT CONSTELLATION-SCHEMA Beim klassischen Star-Schema kommt es bei großen Datenmengen zu Performanceproblemen. Besonders der große Base Fact Table bereitet Schwierigkeiten, da auch alle Aggregate im Base Fact Table gespeichert werden. Deshalb wurde das Fact Constellation-Schema entwickelt, welches eine Abänderung des Star-Schemas darstellt. Dabei werden die aggregierten Daten und die nicht aggregierten Daten separat gespeichert. Deshalb unterscheidet man Aggregated Fact Tables (AFT) für die Aggregate und den Basic Fact Table für die atomaren Daten. Als Vorteile des Fact Constellation Schemas ist folgendes zu nennen: • Das Level Attribut wird nicht mehr benötigt. • Die Performance ist bedingt durch die separate Speicherung der Aggregate verbessert. Als Nachteile des Fact Constellation-Schemas ist zu nennen: • Mit der Anzahl der Dimensionen steigt auch die Anzahl der AFT rapide an. Dadurch wird das Model sehr komplex und schwerer aufzubauen und zu warten. - 78 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN • Die Abfragen über mehrere Aggregate und/oder atomare Daten erfordert komplexere Joins. Im Fact Constellation-Schema sind die Dimensionstabellen nach wie vor denormalisiert. Dies kann bei großen Dimensionstabellen, welche viele Hierarchien enthalten, auch zu Performanceproblemen führen. [vgl. Prosser/Ossimitz (2001) S. 73ff] Abbildung 30: Das Fact Constellation-Schema [Quelle: Prosser/Ossimitz (2001) S. 76] 5.10.9.3 SNOWFLAKE-SCHEMA Beim Snowflake-Schema, das eine Erweiterung des Star-Schemas darstellt, wird zusätzlich zur Normalisierung des „Fact-Tables“, eine Normalisierung der DimensionTables vorgenommen. Die Dimensionsattribute werden nicht mehr wie beim Star Schema in einer einzigen Tabelle pro Dimension gehalten, sondern es gibt für jedes Dimensionsattribut eine eigene Tabelle. In den Dimension-Tables stehen nur noch die Attributsschlüssel (z.B. MonatID), die auf die dazugehörigen Attribut-Tables verweisen. - 79 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 31: Snowflake-Schema mit Attribut-Tables [in Anlehnung: Prosser, Ossimitz (2000a), S. 62] Die Vorteile des Snowflake-Schemas liegen in der reduzierten Anzahl der zu bearbeitenden Zeilen – mit der entsprechenden Auswirkung auf die Performance – und in der Einsparung der Plattenkapazität. Nachteile liegen in der komplexeren Datenstruktur. [vgl. Schnizer et al. (1997) S. 50 f] 5.10.9.4 GALAXY-SCHEMA Beziehen sich mehrere unterschiedliche Fakten auf die gleiche Dimensionen, wobei zwei Dimensionen genau dann gleich sind, wenn ihre komplexen und Basisobjekttypen gleich sind, dann wird eine Dimension mit den entsprechenden Fakten verbunden, da Dimensionen nicht redundant implementiert werden. Das durch derartige Verbindungen entstandene Schema wird Galaxy-Schema genannt. Ein Galaxy-Schema repräsentiert aus Sicht der OLAP-Anwendung eine Multicube-Architektur. Eine MulticubeArchitektur ist dadurch gekennzeichnet, dass verschiedene Hypercubes gemeinsame Dimensionen haben. Die Abbildung 32 zeigt die Zusammenhänge zwischen GalaxySchema und Mulitcube-Architektur.[vgl. Rautenstrauch/Schulze (2003) S. 332] - 80 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 32: Galaxy-Schema und Multitube-Architektur [Quelle: Rautenstrauch/Schulze (2003) S. 334] 5.10.9.5 DAS UNIMU-SCHEMA Das Unimu- Schema (Uniformes Datenschema für multidimensionale Daten) wurde an der Universität Leipzig entwickelt. Dabei wurde dieses Schema beim praktischen Einsatz in einem Energieunternehmen entwickelt. Dabei wurde in folgenden Schritten vorgegangen: • Uniformierung der Datenstruktur für die analyseorientierte Zusammenfassung dimensionsbezogener, betriebswirtschaftlicher Kennzahlen in einer Tabelle. • Zerlegung der Datenstruktur in eine Fakttabelle sowie je eine Tabelle für die (uniforme) Zeitdimension und die (uniforme) Objektdimension unter Nutzung des Star-Schemas. • Bildung einer Dimensionstabelle für Kennzahlen basierend auf dem SnowflakeSchema. • Hierarchische Verknüpfung von Dimensionspositionen durch die Ergänzung von Hierarchietabellen. Das Unimu-Schema basiert auf einer dreidimensionalen Modellierung betriebswirtschaftlicher Kenngrößen: • Zeitdimension: Jeder Fakt ist mit einer uniform verwendbaren Zeit_id versehen. Beliebige zeitbezogene Aggregate können somit in einer Fakttabelle abgelegt - 81 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN werden. Die zeitliche Dimensionierung kann individuell für alle Kombinationen von Kennzahl- und Objektdimensionen festgelegt werden. • Kennzahldimension: Die Kennzahlen werden in einer Dimension zusammengefasst. Neue Kennzahlen können so ohne Datenmodelländerung und Anpassung der Präsentationsanwendung hinzugefügt werden. Nicht sinnvolle Kombinationen von Kennzahlen und Objekten (z.B. Preis pro Produktgruppe) können ausgeschlossen werden. Die flexible Modellierung ist allerdings mit dem Nachteil einer umfangreichen Fakttabelle verbunden. Objektdimension: Durch die Modellierung erfolgt eine Trennung in logische und semantische Dimensionen. Semantische Dimensionen sind z.B. Kunden, Produkte und Regionen. Logische Dimensionen entsprechen oder ergeben sich aus der Verknüpfung semantischer Dimensionen (z.B. Kunden pro Region). Abbildung 33: Das Unimu-Schema [Quelle: Ehrenberg/Heine (1998) S. 507] Der große Vorteil des Unimu-Schemas ist, dass Dimensionen als Daten und nicht als Datenstrukturen verwaltet werden. Dadurch können neue Kennzahlen, neue Objektdimensionen und neue zeitliche Granularitäten ohne Schemaänderungen abgebildet werden.[vgl. Ehrenberg/Heine (1998) S. 503ff] - 82 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 6 DIE MODELLIERUNGSMETHODE AGGREGATION PATH ARRAY Die von Prosser und Ossimitz entwickelte Methode des APA (Aggregation Path Array) versucht die Modellierungsmethode des Gitters entsprechend zu verbessern. Dabei versucht man im Gitter nicht die gesamten Kombinationen der Dimensionen in ihren Hierarchiestufen darzustellen, sondern man gibt für jede Zelle im Gitter nur die geänderte Hierarchiestufe der Dimension (Attributsnamendarstellung) bzw. die Dimension, die sich geändert hat, an (Kurznotation). Deshalb ergibt jede Zeile alle möglichen Aggregationsschritte aller Dimensionen wieder. Es wird von Zeile zu Zeile nur die Reihenfolge der Aggregationsschritte verändert. Das führt jedoch zu Redundanzen zwischen den einzelnen Zeilen. Diese werden dann in einem zweiten Schritt entfernt bzw. ausgemerzt oder, wie in dem unten beschriebenen Algorithmus, in einem Schritt vollzogen. [vgl. Prosser/Ossimitz (2000b), S. 10 ff] In Abbildung 34 sieht man das analoge Beispiel des Gitters (siehe Abbildung 27) für ein APA mit 3 Dimensionen (Kunden, Artikel, Zeit). 1 1 1 1 1 1 2 2 3 1 1 1 2 2 3 2 3 3 2 2 3 2 3 3 3 3 3 2 3 3 3 3 3 3 3 2 3 3 3 3 3 2 3 2 2 3 3 2 3 2 2 1 1 1 3 2 2 1 1 1 1 1 1 K_gr K_gr K_gr K_gr K_gr K_gr A_gr A_gr Z_m K_* K_* K_* A_gr A_gr Z_m A_* Z_m Z_y A_gr A_gr Z_m A_* Z_m Z_y Z_m Z_y Z_* A_* Z_m Z_y Z_m Z_y Z_* Z_y Z_* A_gr Z_m Z_y Z_* Z_y Z_* A_gr Z_* A_* A_* Z_y Z_* A_gr Z_* A_* A_* K_gr K_gr K_gr Z_* A_* A_* K_* K_* K_* K_* K_* K_* Abbildung 34: Darstellung des APA des Praxisbeispiels in Kurznotation (links) und mit Attributsnamen (rechts) nicht redundanzfrei [in Anlehnung: Prosser, Ossimitz, (2000 a), S. 43] Die Dimensionen unterteilen sich in folgende Hierarchiestufen: • Kunden: Kunde individuell (K_id), Kundengruppe (K_gr), Kunden gesamt (K_*) • Artikel: Artikel individuell (A_id), Artikelgruppe (A_gr), Artikel gesamt (A_*) • Zeit: Tag (Z_t), Monat (Z_m), Jahr (Z_j), Zeit gesamt (Z_*) Dabei gibt jede Zelle, wie oben erwähnt, die Änderung einer Hierarchiestufe an. Allgemein beginnt jede Zeile mit den Dimensionen in der Ausgangshierarchiestufe 0 - 83 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN ( d10 , d 20 , d 30 oder K_id, A_id, Z_d). In werterer Folge wird in jeder Spalte der Zeile für eine weitere Dimension die Hierarchiestufe um eins erhöht bis in der letzten Spalte jeder Zeile die Endsituation mit allen Dimensionen in der höchsten Hierarchiestufe steht (z.B. d 12 , d 22 , d 33 oder K_*, A_*, Z_*). So ergibt die markierte Zelle in Abbildung 34 die Kombination d11 , d 22 , d 31 oder K_gr, A_*, Z_d. Jede Zelle im Gitter enthält aus Übersichtlichkeitsgründen nur die Hierarchiestufe, die im Vergleich zum Vorgänger links in derselben Zeile hochgezählt wurde. Damit kann man aber für jede Zelle relativ leicht den Würfel generieren, der dargestellt wird. Das geschieht indem man die höchste bis dahin in der Zeile links von der Zelle angeführte Hierarchiestufe der bereits zumindest einmal aggregierten Dimensionen nimmt und für die anderen Dimensionen die niedrigste Hierarchiestufe einsetzt. Für unseren markierten Würfel wäre somit die konkrete Ausprägung d11 , d 22 , d 30 oder K_gr, A_*, Z_d. Für die formale Definition des Permutationsalgorithmus [vgl. Prosser/Ossimitz (2000b), S 12ff ], der zum Array in Abbildung 34 führt, benötigen wir zunächst die Definition eines Verschiebeoperators der folgenden Form: Gegeben sei ein Array von Zeilenvektoren, von denen alle dieselben Elemente dn, allerdings in einer anderen Reihenfolge beinhalten; ein Element dn kommt in einem Zeilenvektor nur einmal vor. Das Array bestehe zunächst nur aus einer Zeile: z1=(d1, d2, d3, ...., dn-1, dn). Wir bilden nun eine zweite Zeile und definieren dafür den Verschiebeoperator V der Form V (d a → d b z − r ) mit r ∈ N+, sodass die aktuelle Zeile z aus Zeile (z-r) abgebildet wird, indem alle Elemente im Vektor vor da hinter db verschoben werden, die Elemente dazwischen um eine Position nach links aufrücken und alle Elemente, die ursprünglich nach db lagen, wieder unverändert bleiben. Damit erzeugt die Operation V (d 2 → d n −1 z − 1) in Zeile z =2 den Vektor z2 = (d1, d3, ...., dn-1, d2, dn). Mit Hilfe diese Verschiebeoperators kann nun folgendes Array gebildet werden: z =1 ( d11 ,..., d 1i (1) ,..., d n1− 2 ,..., d ni (−n2− 2) , d n1−1 ,..., d ni (−n1−1) , d n1 ,..., d ni ( n ) ) markiere Elemente d11 ,..., d ni ( n ) /* Der Zähler für die Hierarchiestufen in Dimension n sei als k[n] bezeichnet, */ /* wobei i(n)-k[n] die aktuell bearbeitete Hierarchiestufe in n bezeichnet; */ k[1]=0 do unitl i(1)-k[1]<0 k[2]=0 - 84 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN do until i(2)-k[2]<0 … k[n-2]=0 do until i(n-2)-k[n-2]<0 /* Solange i(n-2)-k[n-2]>0 ist, also eine Hierarchiestufe d n1− 2 oder höher angesprochen */ /* wird, wird der Verschiebeoperator angewandt; wenn i(n-2)-k[n-2]=0, dann wird nur */ /*noch die innere Schleife durchgeführt; ein Verschieben gibt es nicht mehr, da d n1 */ /*nicht im Array ist. Die analoge Überlegung gilt für alle Dimensionen m < (n1).*/ /* Zunächst werden ausschließlich Dimensionen n und n-1 permutiert. */ perform _ procedure(inner _ loop) if i(n − 2) − k[n − 2] > 0 z ← z +1 V (d ni (−n2−2)−k [ n −2] → d ni ( n ) z − (i (n − 1) + 1)) markierte Elemente d n1−1 ,K, d ini ( n ) end if k[n − 2] ← k[n − 2] + 1 end do K if i (2) − k (2) > 0 z ← z +1 ( V (d ni (−n2− 2 ) − k [ n − 2 ] → d ni ( n ) z − (i (n − 1) + 1) ) markiere Elemente d 31 ,K , d ni ( n ) end if k [ 2] ← k [ 2] + 1 end do if i (1) − k[1] > 0 z ← z +1 r = n −1 ⎞ ⎛ V ⎜⎜ d 1i (1) − k [1] ← d ni ( n ) z − ∏ (i (r ) + 1) ⎟⎟ r =2 ⎠ ⎝ 1 i(n) markierte Elemente d 2 , K , d n end if k[1] ← k[1] + 1 end do - 85 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN /* Die markierten v sind die redundanzfreie Menge v ∈ RF.*/ procedure (inner_loop) /* Diese Schleife realisiert die Permutation der Dimensionen n und (n-1) */ k[n − 1] = 0 do until k[n − 1] = i[n − 1] z ← z +1 ( ) V d ni (−n1−1) − k [ n −1] → d ni ( n ) z − 1 1 n markierte Elemente d , K , d ni ( n ) k[n − 1] ← k[n − 1] + 1 end do end _ procedure Der Verband in Abbildung 34 stellt aber die nicht redundanzfreie Kombination aller Dimensionen und Hierarchiestufen dar. Abbildung 35 stellt die redundanzfreie Menge des Praxisbeispiels durch farbliche Markierung dar. 1 1 1 1 1 1 2 2 3 1 1 1 2 2 3 2 3 3 2 2 3 2 3 3 3 3 3 2 3 3 3 3 3 3 3 2 3 3 3 3 3 2 3 2 2 3 3 2 3 2 2 1 1 1 3 2 2 1 1 1 1 1 1 K_gr K_gr K_gr K_gr K_gr K_gr A_gr A_gr Z_m K_* K_* K_* A_gr A_gr Z_m A_* Z_m Z_y A_gr A_gr Z_m A_* Z_m Z_y Z_m Z_y Z_* A_* Z_m Z_y Z_m Z_y Z_* Z_y Z_* A_gr Z_m Z_y Z_* Z_y Z_* A_gr Z_* A_* A_* Z_y Z_* A_gr Z_* A_* A_* K_gr K_gr K_gr Z_* A_* A_* K_* K_* K_* K_* K_* K_* Abbildung 35: Darstellung des APA des Praxisbeispiels in Kurznotation (links) und mit Attributsnamen (rechts) redundanzfreie Menge farblich markiert [in Anlehnung: Prosser, Ossimitz (2000 a), S. 43] Die redundanzfreie Menge aus einem fertig generierten Array, wie in Abbildung 35, erhält man, wenn man folgenden Algorithmus vollzieht: (1) Der Pfad in Zeile 1 des Array stellt alle Element das erste Mal dar und gehört somit gesamt zur redundanzfreien Menge. (2) Danach durchläuft man die nächste Zeile von links nach rechts und vergleicht jede Zelle mit der Zelle in der unmittelbar übergeordneten Zeile. Dieser Ablauf wird bis zum ersten Auftreten einer Ungleichheit der beiden Zellen durchgeführt, wobei all diese Zellen unmarkiert bleiben. Mit dem Auftreten der ersten Ungleichheit werden alle - 86 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN folgenden Zellen bis zum Auftreten der obersten Hierarchiestufe der letzten Dimension (in diesem Fall das Element Z_* oder d 33 ) markiert. Alle Zellen rechts von dieser Zelle bleiben unmarkiert. (3) Punkt 2 wird für alle Zeilen bis zur letzten Zeile durchlaufen. Als Ergebnis sieht man die in Abbildung 35 dargestellte farblich markierte redundanzfreie Menge an Würfeln. Diese Menge gibt somit die vollständige und redundanzfreie Menge (i. e. sie enthält alle aus dem Basiswürfel ableitbaren Vektoren). Für einen Beweis siehe Prosser/Ossimitz (2000b) Anhang. Eine weitere im Data Warehouse Management entscheidende Frage ist, welche Würfel interessant für den Anwender und welche davon zu materialisieren sind. Hier ergibt sich ein Zielkonflikt zwischen der Performance (möglichst viele Würfel zu materialisieren, um schnelle Abfragen zu haben) und den Kosten für unnötige Datenhaltung und Prozessorarbeitsstunden. Das Finden einer optimalen Lösung, die ja von Anwender zu Anwender völlig verschieden sein kann, unterstützt das APA in relativ übersichtlicher Art und Weise. So könnte eine anwenderspezifische Anforderung für die interessanten Würfel lauten: „ Ich benötige einen Monatsbericht für alle Artikelgruppen mit einem kompletten Drill Down aller Artikel unabhängig von Kunden (a). Zusätzlich will ich für jeden individuellen Kunden einen Jahresbericht für alle Artikel haben (b).“ Abbildung 36: Darstellung der interessanten Würfel [in Anlehnung: Prosser, Ossimitz (2000 b), S. 17 ] Abbildung 36 stellt die Würfel, welche die Anforderungen erfüllen, getrennt nach Bereich a und Bereich b markiert, dar. Dies sind die Würfel, die für die Abfrage benötigt werden. - 87 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Zusätzlich stellt sich nun die Frage, welche Würfel nun tatsächlich physisch materialisiert werden sollen, da es aus Speicherplatzgründen in den seltensten Fällen möglich ist, alle interessanten Würfel zu materialisieren. Deshalb kann diese Frage nur beantwortet werden, wenn man die Derivate der einzelnen Würfel betrachtet. Das APA kann dabei zur Bestimmung der Derivate eines Vektors verwendet werden: /* Bestimme die Anzahl der Spalten des Arrays */ s max = ∑ i (n) n /*Bestimme die Anzahl der Zeilen des Arrays */ z max = r = n −1 ∏ (i(r ) − 1) r =1 /* Abarbeiten aller Zeilen bis zum Ende des Arrays in zmax erreicht ist */ z =1 do until z > z max s = s max , ende = 0 do until s = 0 or ende = 1 ( if array _ element ( z , s ) = d mj ( m ) ∈v ) markiere Zelle s in z ende = 1 else s ← s − 1 end if end do z ← z +1 end do Alle Zellen (=Vektoren) w, die markiert oder rechts der markierten Zelle ihrer Zeile im Array liegen sind Derivate von v, w ∈ A(v). A(v) ∩ RF wäre die redundanzfreie Menge an Derivaten. [vgl. Prosser/Ossimitz (2000b) S. 18f ] Zum Algorithmus: Zunächst werden Zeilen- und Spaltenanzahl in zmax bzw. smax hinterlegt. Da nur auf Elemente im APA abgefragt wird, wird die unterste Hierarchieebene ignoriert. Dies ist aber sinnvoll, da sich aus der untersten immer alle anderen Hierarchiestufen der Dimensionen ableiten lassen – für die Herleitung der Derivatsmengen sind daher nur die Dimensionen mit einer Hierarchiestufe größer oder gleich 1 im Vektor entscheidend. Markiert wird von rechts kommend (Beginn bei smax) - 88 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN in jeder Zeile jene Zelle, in der das erste Mal ein Element aus v einer Stufe ≥ 1 vorkommt. [vgl. Prosser/Ossimitz (2000b) S. 18] Wir gehen von dem in Abbildung 36 angeführten Beispiel aus und versuchen nun die Menge der zu materialisierenden Würfel abzuleiten. Dabei betrachten wir zuerst die Derivativmenge Bereich x des Würfels x (blau markiert). Wir sehen, dass zwar der Bereich a vollständig mit den Derivativen des Würfels x abgedeckt ist. Der Bereich b jedoch nicht aus dem Würfel x abgeleitet werden kann. Abbildung 37: Anzeigebeispiel der Derivative (Bereich x) des Würfels x [in Anlehnung: Prosser, Ossimitz (2000 b), S. 17] Abbildung 38: Anzeigebeispiel der Derivate (Bereich y) des Würfels y [in Anlehnung: Prosser, Ossimitz (2000 b), S. 17] - 89 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Genauso betrachten wir die Derivatsmenge (Bereich y) des Würfels y (blau markiert) in Abbildung 38. Dabei ist zu erkennen das der Würfel y zwar den Bereich b abdeckt, den Bereich a jedoch nicht tangiert. Damit ist es notwendig zumindest zwei Würfel zu materialisieren. Deshalb versuchen wir ein Materialisieren beider Würfel in Abbildung 39 darzustellen. Die Gesamtderivatsmenge von Bereich x und Bereich y wird rechts von der dicken Linie dargestellt. Abbildung 39: Anzeigebeispiel der Derivate (Bereich x + y) der Würfels x und y [in Anlehnung: Prosser, Ossimitz (2000 b), S. 17] Im Moment gibt es für die Bestimmung der zu materialisierenden Würfel aus den interessanten Würfel keinen wissenschaftlich ausgereiften Algorithmus. Deshalb können die zu materialisierenden Würfel im Moment nur durch Austesten bestimmt werden. Dies soll sich durch die in Abschnitt 7 beschrieben Heuristik ändern. 7 FORSCHUNGSSCHWERPUNKT UND ERGEBNISSE 7.1 DAS GRUNDPROBLEM UND DER LÖSUNGSANSATZ Der zentrale Fokus beim Aufbau von Data Warehouse-Konzepten sollte auf den Nutzen für den Anwender gelegt werden. Aus diesem Grund ist neben dem leichten, intuitiven Zugang unbedingt besonderes Augenmerk auf hohe Flexibilität und Schnelligkeit bei der Bearbeitung von Endbenutzerabfragen zu legen. Durch die Bestimmung der richtigen zu materialisierenden Würfel, sollen diese Anforderungen befriedigt werden. - 90 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Das Grundproblem der Bestimmung der zu materialisierenden Würfel (materialized cubes) unter Betrachtung der Menge der interessanten Würfeln (required cubes), welche die benötigte Information enthalten, ist also ein Optimierungsproblem. Im einfachsten Fall, in welchem keine Restriktionen hinsichtlich Ladezeit zum Aufbau des Data Warehouse oder Speicherplatz bestehen, würden grundsätzlich die interessanten Würfel und die zu materialisierenden Würfel identisch sein. Das heißt alle benötigten Würfel würden auch physisch materialisiert. Damit wäre auch für den Benutzer die minimale Zugriffszeit auf die Information garantiert. Es kann sogar sinnvoll sein noch zusätzliche Würfel zu materialisieren, da sie die Materialisierungszeit nachfolgender Würfel minimieren. In der Praxis ist jedoch festzustellen, dass sowohl hinsichtlich des Speicherplatzes wobei dieses Problem von Tag zu Tag an Bedeutung verliert, da die Kosten für Speicher im Zeitablauf rapide sinken - aber im besonderen hinsichtlich der Ladezeit der Daten, welche für das Data Warehouse veranschlagt werden muss, Begrenzungen gelten. Durch die immer stärker werdende multinationale Unternehmensführung wird es immer schwieriger die Zeit für die Generierung und die Updates der Daten in einem Data Warehouse zu planen. Das eigentliche Problem ergibt sich daraus, dass während des Updates oder Neuaufbaus des Data Warehouses der Zugriff auf dieses nicht möglich ist. Wurden bei nationalen Unternehmen diese Updates einfach während der Nacht erledigt, kann dies beispielsweise von einer weltweit operierenden Fluglinie, welche die Daten immer an einem bestimmten Punkt der Welt gerade benötigt, nur sehr schwer erledigt werden. So bleiben für diese Unternehmen oft nur Zeitbereiche von wenigen Stunden pro Woche oder Tag, um ihre Daten auf den neusten Stand zu bringen. Aus diesem Grund besteht ein Optimierungsproblem, welches sich aus Konflikt der schnellstmöglichen Abfragezeit und der schnellstmöglichen Aktualisierungs- bzw. Aufbauzeit ergibt. Für diese Problem einen Lösungsansatz zu finden stellt den Kern meiner Forschungsarbeit dar. 7.2 DIE VORGEHENSWEISE Um das Problem angreifbar, modellierbar und damit erforschbar zu machen gehe ich von einigen Annahmen aus. Diese sind: • Bei verteilten Datenbanken, welche sich auf unterschiedlichen Servern weltweit befinden, kann die Zeit für das Abfragen und Speichern eines Cubes von Würfel zu Würfel total unterschiedlich sein. Diese Information steht dem Benutzer und auch dem Planer eines Data Warehouses oft gar nicht zur Verfügung. Deshalb gehe ich von einer durchschnittlichen Zugriffszeit pro Transaktion aus. Diese ist durch den Benutzer für jedes Data Warehouse individuell festzustellen (z. B. - 91 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN durch zufällige Abfrageprobeläufe) und als Berechnungsbasis in das von mir entwickelte Gleichungssystem, bzw. die Software einzugeben. Diese durchschnittliche Zugriffszeit kann sich natürlich im Zeitablauf ändern und somit auch zu Veränderungen im Aufbau des Data Warehouse Systems führen. • Es besteht ein linearer Zusammenhang zwischen den in den Cubes gespeicherten Daten. Wird zum Beispiel in einem Cube der Jahresumsatz in einer FLOAT Variablen mit 8 Byte gespeichert, ist der benötigte Speicherplatz in einem anderen Cube, in welchem der Monatsumsatz gespeichert wird zwölf mal so groß. Das mag in der Praxis nicht immer stimmen, da moderne Datenbankmanagementsysteme mit ihren Query Optimizern zumeist automatische Indizes erzeugen. Geht man aber von einem einfachen Modell aus sehr wohl. Diese Vereinfachung des Models ist jedoch zwingend notwendig um die Komplexität des Problems zu bereinigen und eine wissenschaftliche Untersuchung zu ermöglichen. • Es besteht ein linearer Zusammenhang zwischen der Anzahl der Tupel im Table der abzufragenden Datenbank und der Abfragezeit. Empirische Untersuchungen von Dunemann (2002) belegen diese Annahme, da eine sehr starke Korrelation zwischen diesen beiden Werten besteht. • Es besteht ein linearer Zusammenhang zwischen der Anzahl der Tupel in der Ergebnismenge einer GROUP BY Abfrage und der Abfragezeit der Query. Diese Annahme wird ebenfalls von Dunemann (2002) untermauert, welcher eine Korrelation festgestellt hat. Diese ist allerdings nicht so stark wie bei der Korrelation zwischen Anzahl der Tupel in der abzufragenden Datenbank und Abfragezeit. Eine genaue Beschreibung dieser Studie wird in Kapitel 7.5 behandelt. 7.3 ABGRENZUNG DER PHASEN DER BETRACHTUNG Beim Aufbau und beim Update eines Datawarehouse unterscheiden wir 3 verschiedene Phasen: • Phase des Aufbaus des BFT aus den operativen und externen Datenquellen • Aufbau der materialisierten Sichten aus dem BFT • Abfragen der Informationen aus dem BFT oder den materialisierten Sichten - 92 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 40: Abgrenzung der Phasen der Betrachtung In meinen Überlegungen gehe ich von einer abgeschlossenen ersten Phase aus. Das heißt der Aufbau des BFT aus operativen und externen Systemen muss in jedem Fall erfolgen und hat auf die Auswahl der zu materialisierenden Sichten keinen Einfluss. Deshalb wird diese Phase und die Zeit, welche für diese Phase benötigt wird, nicht in die Betrachtungen aufgenommen. In der zweiten Phase, in der die materialisierten Sichten erzeugt werden, besteht eine strikte Zeitbeschränkung, da bis zur neuen Aggregation die Würfel nicht zur Verfügung stehen, bzw. unrichtige Information enthalten. Die dritte Phase umfasst die Abfragen der Benutzer bis zum neuerlichen Aufbau des Warehouse. Dabei werden die Gesamtkosten der Abfragen in dieser Periode durch das Produkt der Abfragekosten mit den geschätzten Anzahl der Abfragen errechnet. Dadurch werden auch wichtige Cubes früher materialisiert, da Kosten eingespart werden können. - 93 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.4 VERWANDTE ALGORITHMEN IM PROBLEMZUSAMMENHANG In diesem Abschnitt versuche ich bestehende Algorithmen zu präsentieren, welche einen Beitrag zur Lösung der Problemstellung liefern können. Dabei versuche ich bestehende, in der Literatur erwähnte, Algorithmen möglichst detailliert zu beschreiben. Unsere Aufgabe besteht unter anderem darin eine gute Heuristik zur Bestimmung der zu materialisierenden Würfel zu finden. Um die Qualität dieser Heuristik zu bewerten bedarf es jedenfalls der Bestimmung der optimalen Lösung. Dies soll durch diese Algorithmen programmtechnisch umgesetzt und überprüft werden. Zusätzlich werden Auszüge dieser Algorithmen in den Heuristiken der Software verwendet. 7.4.1 KÜRZESTE UND LÄNGSTE WEGE Im Problemkreis der kürzesten und längsten Wege versucht man ein reales System oder ein zu lösendes Problem durch Graphen darzustellen. Standardaufgaben der Graphentheorie in diesem Kontext sind die als „Single source path“-Problem bekannte Bestimmung aller kürzesten Wege von einem Knoten zu allen anderen und die Bestimmung kürzester Wege zwischen allen Knoten, auch als „All pairs shortest path“Problem („Finde die mit den geringsten Kosten verbundene Möglichkeit, alle Punkte zu verbinden.“) bekannt. In der Praxis, sowie auch in dem von uns behandelten Problemkontext, werden als Weg die Kosten angesetzt und die Problemstellung von einem kürzesten Weg Problem in ein minimales Kostenproblem gewandelt. [vgl. Sedgewick (2002) S. 513f ] Durch den hierarchischen Aufbau der Dimensionen und Hierarchien können die materialisierten Würfel als Graphen ansehen werden (siehe auch Kapitel 5.10.8.2.1). Diese werden durch Kanten verbunden, welche die Materialisierungskosten von einem Aggregat einer niederen Hierarchiestufe auf ein Aggregat einer höheren Hierarchiestufe symbolisieren. 7.4.1.1 7.4.1.1.1 BEGRIFFSBESTIMMUNGEN GRAPHEN Abstrakt fasst ein Graph D zwei Mengen zusammen: die Menge V der Knoten und die Menge E der Kanten. Wir schreiben D= (V,E). Eine Kante ist ein geordnetes Paar von Konten. In der Schreibweise (v,w) bezeichnet v den Anfangskonten und w den Endknoten der Kante. In der Veranschaulichung - 94 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 41: Graph mit zwei Knoten zeigt die Spitze des verbindenden Pfeils auf den Endknoten w. v hat die Bedeutung des Vorgängers (Parents) von w und w die des Nachfolgers (Derivative) von v. v und w werden als adjazent oder benachbart bezeichnet und die Kante (v,w) heißt inzident zu den beiden Knoten v und w. Kanten, die den Knoten v als Anfangsknoten haben, werden auch als Ausgangsknoten von v und solche, die den Knoten v als Endknoten haben, als Eingangskanten dieses Knotens bezeichnet. Ein Graph mit n Knoten hat im Maximum n2 und im Minimum 0 Kanten. [vgl. Reß/Viebeck (2000) S. 364f] 7.4.1.1.2 EINGANGS- UND AUSGANGSGRAD Als Grad eines Knotens eines Graphen bezeichnet man die Summe der Kanten, die den Knoten als Ausgangsknoten (ausgehende Kanten) oder als Endknoten (eingehende Kanten) haben. Die Anzahl der eingehenden Kanten heißt Eingangsgrad (indegree) und die Anzahl der ausgehenden Kanten Ausgangsgrad (outdegree) des Knotens. [vgl. Reß/Viebeck (2000) S. 365f] 7.4.1.1.3 WEG, ZYKLUS Eine Folge von Knoten v1, v2, … vn heißt Weg (path) von v1 nach vn, wenn der Endpunkt der Kante (vi-1, vi) mit dem Anfangspunkt der Kante (vi, vi+1) für 1<i<n zusammenfällt. Die Länge des Weges ist gleich der Anzahl seiner Kanten. Kommt jeder Knoten längs eines Weges nur einmal vor, sprechen wir von einem einfachen Weg. Ein einfacher Weg, der geschlossen ist, bei dem also der erste und letzte Knoten zusammenfallen, heißt (einfacher) Zyklus. Wir bezeichnen einen Graphen, der einen Zyklus hat, als zyklisch und im anderen Fall als azyklisch. Ein einzelner Knoten lässt sich als Weg der Länge Null interpretieren. Ein azyklischer Graph ist asymmetrisch und irreflexiv. Ein Knoten w heißt von einem Knoten v aus erreichbar, wenn es einen Weg von v nach w gibt. Die Bezeichnung „ist erreichbar“ ist transitiv und reflexiv. [vgl. Reß/Viebeck (2000) S. 366] 7.4.1.1.4 KNOTEN- UND KANTENWERTE Anstelle von Nummern können Knoten auch durch Namen oder Schlüssel identifiziert werden. Je nach Aufgabenstellung kann man den Knoten weitere Informationen zuordnen. Auch Kanten können Werte (auch als Gewichte bezeichnet) haben, z.B. Kosten wie Entfernungen oder Reisezeiten in einem Verkehrsnetz. Man spricht dann von bewerteten oder gewichteten Graphen. Positive Gewichte werden auch als Kosten - 95 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN bezeichnet. Die Knoten und Kantenwerte eines Graphen sind jeweils vom gleichen Datentyp. [vgl. Reß/Viebeck (2000) S. 366f] 7.4.1.1.5 KLASSIFIZIERUNG VON GRAPHEN Zur Klassifizierung von Graphen führen Reß/Viebeck (2000) folgende Begriffe ein [vgl. Reß/Viebeck (2000) S. 363]: Ein Graph heißt • symmetrisch, wenn mit der Kante (v,w) immer auch die Kante (w,v) für alle Knoten v und w impiziert ist, d.h. in symmetrischen Graphen besteht eine Verbindung zwischen zwei Knoten immer in beiden Richtungen. Ein Beispiel ist ein Straßennetz, in dem Verkehr in beiden Richtungen möglich ist. • asymmetrisch, wenn die Existenz der Kante (v,w), v ≠ w , die Existenz der Kante (w,v) ausschließt. In asymmetrischen Graphen besteht somit eine Verbindung zwischen zwei verschiedenen Knoten immer nur in einer Richtung. Ein Beispiel ist ein Straßennetz, das nur Einbahnverkehr zulässt. • reflexiv, wenn jeder Knoten des Graphen mit sich selbst verbunden ist, wenn also (v,v) für alle v gilt. • irreflexiv, wenn die Existenz der Kante (v,v) für alle Knoten v ausgeschlossen ist. • transitiv, wenn aus der Existenz der Kanten (v,w) und (w,z) die Existenz der Kante (v,z) folgt. Eine typische transitive Relation ist v<w, z.B. in der Leseart „v geht w voraus“. 7.4.1.2 KÜRZESTE WEGE VON EINEM KONTEN IM GRAPHEN ZU ALLEN ANDEREN Wir betrachten einen gewerteten Graphen, dessen Gewichte positiv sind, und befassen uns mit der Aufgabe, für einen beliebigen Startknoten s die kürzesten Wege zu allen anderen Knoten im Graphen zu bestimmen. Offensichtlich kann man den kürzesten Abstand eines Knotens w vom Startknoten s einfach berechnen, wenn für jeden Vorgängerknoten v von w der kürzeste Abstand von s bekannt ist. Der kürzeste Weg von s nach w führt dann über den Vorgängerknoten v von w, für den die Summe der Abstände von s nach v und von v nach w am kürzesten ist. Der Knoten s hat von sich selbst den Abstand 0, der ein kürzester ist. Bezeichnen wir den Wert der Kante (v,w) mit c(v,w) und die kürzeste Entfernung eines Knotens w von dem Startknoten s mit d(s,w), so gelten die Rekursionsgleichungen: - 96 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN • d(s,s) = 0 • d(s,w) = min {d(s,v)+c(v,w)} für v ∈ V (w) wobei V(w) die Menge der Vorgängerknoten von w bedeutet. Es stellt sich die Frage, wie man eine Reihenfolge der Knoten finden kann, damit die Rekursion auch ausführbar wird. Eine Lösung dazu liefert der Algorithmus von Dijkstra. Für azyklische Graphen findet man eine Reihenfolge einfach durch topologisches Sortieren der Kanten. [vgl. Reß/Viebeck (2000) S. 403ff] 7.4.1.2.1 ALGORITHMUS VON DIJKSTRA Dieser Algorithmus gilt für einen allgemeinen Graphen, er muss nicht azyklisch sein. Bei diesem Ansatz ist jeder der Knoten eines Graphen entweder ein innerer Knoten, Randknoten oder äußerer Knoten. Für die inneren Knoten ist bereits ihr kürzester Abstand zum Startknoten s bekannt. Randknoten sind Knoten, für die man einen Weg von s kennt, der aber noch nicht ein kürzester sein muss. Für äußere Knoten kennt man noch keinen von s ausgehenden Weg. Zu Beginn ist der Startknoten s, der von sich selbst den minimalen Abstand Null hat, der einzige innere Knoten und die direkten Nachfolgerknoten bilden die Menge der Randknoten. Alle anderen Knoten sind äußere Knoten. Die Menge der inneren Knoten wächst nun schrittweise von innen nach außen, indem unter allen Randknoten derjenige mit dem kürzesten Abstand von s als nächster innerer Knoten genommen wird. Seine Nachfolger werden, soweit sie bisher noch äußere Knoten sind, zu neuen Randknoten. Für Randknoten, die erneut erreicht werden, kann sich ein neuer, kürzerer Abstand von s ergeben, der dann den bisherigen kürzesten Weg ersetzt. Wir demonstrieren das Verfahren am Beispiel des folgenden Graphen und bestimmen die kürzesten Wege des Knotens a zu allen anderen Knoten. - 97 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 42: Bewerteter Graph [Quelle: Reß/Viebock (2000) S. 404] Im ersten Schritt wird a zum inneren Knoten und seine Nachfolgerknoten b, c und d werden zu Randknoten. Die verbleibenden Knoten e und f sind äußere Knoten. Unter den Randknoten hat c den minimalen Abstand von a und c wird somit zum nächsten inneren Knoten. Einen kürzeren Weg zu irgendeinem anderen Knoten kann es nicht geben, da dieser notwendigerweise über die Knoten b oder d gehen müsste und d und b von a aus keine kürzere Entfernung als c haben. Unter den bereits bekannten Wegen von a nach b, c und d gibt es jetzt den kürzeren für d, der von a über c nach d führt. Wir merken diesen kürzeren Weg nach d. Der Knoten f wird als Nachfolger vom Knoten c zu einem Randknoten. Als nächsten inneren Knoten bestimmen wir den Knoten b, der unter den Randknoten dieses Schrittes den minimalen Abstand von a hat. Die weiteren Schritte sind aus der folgenden Tabelle ersichtlich. - 98 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Innere Knoten Knoten Minimaler Abstand von s 1 a 0 2 a c 0 2 3 a c b a c b d a c b d f a c b d f e 0 2 4 0 2 4 5 0 2 4 5 6 0 2 4 5 6 7 Schrittfolge 4 5 6 b c d b d f d f Randknoten vorläufig minimaler Abstand von s 4 2 6 4 5 8 5 7 f e 6 7 d d e 7 d Knoten Vorgänger a a a a c c c b äußere Knoten e f e e Tabelle 7: Berechnung der kürzesten Wege von einem Knoten in einem Graph zu allen anderen [Quelle: Reß/Viebeck (2000) S. 405] In der folgenden Implementation des Algorithmus von Dijkstra für einen bewerteten Graphen in Adjazenzlistendarstellung sehen wir die Arrays distance und parent, beide von der Länge D.GetNumVertices, vor. parent ist von Typ VPostition und distance vom Typ float. Für einen Knoten v mit der Ordnungsnummer i zeigt parent[i]!=NULL auf den Vorgängerknoten, der auf dem zuletzt durchlaufenen Weg zum Knoten v liegt. Und enthält distance[i] die bisher für v ermittelte Entfernung vom Startknoten. Die Initialwerte sind parent[i]=NULL und distance[i]=0. Am Schluss weist distance[i] den kürzesten Weg des Kontens v vom Startknoten s aus. Die Gewichte liegen als floatWerte in den jeweiligen Kanten vor. Für die Speicherung der Randknoten ist eine Prioritätswarteschlange am geeignetsten. Jeder Record der Schlange merkt einen Randknoten und dessen bisher ermittelten Abstand vom Startknoten. Die Records seien Objekte der Klasse PriorityRecord. Wir interpretieren den Abstand als Schlüssel (Priorität) und den Randknoten (Typ - 99 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN VPosition) als zugehörigen Wert eines solchen Records und führen die Prioritätswarteschlange als Objekt PriorityQueue ein. Die Operation FindMin der Klasse PriorityQueue liefert den Record mit dem minimalen Prioritätswert, d.h. dem kürzesten Abstand vom Startknoten. Die Elementfunktionen GetVertex() und GetKey() der Klasse PriorityRecord bestimmen in einem Record dieses Typs den Randknoten und seine bisherige kürzeste Entfernung vom Startknoten. Zu Beginn wird die Prioritätswarteschlange durch einen ersten Eintrag für den Startknoten s mit dem Abstandswert NULL initialisiert. Das Programm Dijkstra entnimmt in einer äußeren Schleife den jeweils nächsten Eintrag aus der Prioritätswarteschlange. Dieser bezeichnet unter allen Randknoten denjenigen mit dem kürzesten Abstand zum Startknoten und er wird zum nächsten inneren Knoten v. In einer inneren Schleife werden dann nacheinander für die Kanten a des Knotens v der jeweilige Endknoten w bestimmt, für den dann aus dem Abstandswert des Knotens v, erhöht um den Wert der Kante a, seine Entfernung vom Startknoten bestimmt wird. Ist w bisher noch unbesucht, wird für ihn ein Eintrag in der Prioritätswarteschlange mit dem ermittelten Abstandswert vorgenommen. Ist w aber bereits Randknoten, so werden im Fall eines neuen kürzeren Abstands vom Startknoten die Werte distance und parent des Knotens sowie die Priorität in der Warteschlange entsprechend fortgeschrieben. Void Dijkstra(Graph<Record, float> &D, VPostition<Record, float>s) //berechnet die kürzesten Wege in D vom Knoten s aus { int n=D.GetNumVertices(),i,j; //Anzahl Knoten PriorityQueue<PriorityRecord,float>q(n); //Prioritätswarteschlangen für Randknoten VPosition<Record,float<v,w; Aposition<Record,float>a; PriorityRecord r; Float *distance=new float[n]; Vposition<Record,float> *parent=new Vpostition<Record,float>[n]; - 100 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN //Speicherplatz für Array distance und parent float distv, dista, distw,distnew; Ord(D); //Ordnungsnummer Knoten generieren NotVisited(D); //Knoten unbesucht markieren For (i=0; i<n; i++) distance[i]=0; D.SetVisited(s,true); //s besucht PriorityRecord *p=new PriorityRecord(s,0); //Startrecord für Priorityschlange q.Insert(*p); //speichern in Prioritätsschlange q while (!q.IsEmpty()) //Randknoten vorhanden? { //JA q.DeleteMin(r); //nächster Eintrag aus q nach r v=r.GetVertex(); //nächster innerer Knoten v i=D.GetOrd(v); //Ordnungsnummer des Randknotens v distv=distance[i]; //Entfernung v von s a=D.FirstArc(v); //Erste von v ausgehende Kante while (a.Pos()) { w=D.Endpoint(a); //Endknoten w der Kante a j=D.GetOrd(w); //Ordnungsnummer des Endknoten w distw= distance[j]; //bisherige kürzeste Entfernung für w von s - 101 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN dista=D.GetArc(a); //Abstandswert der Kante a distnew=distv+dista; //neue Entfernung von s für w if (!D.IsVisited(w)) { //neuer Randknoten p=new PriorityRecord(w,distnew); q.Insert (*p); //neuer Randknoten D.SetVisited(w,true); //Knoten w besucht Parent[j]=v; //v ist der Vorgänger von w distance[j]=distnew; //bisherige kürzeste Entferung von s für w } else //w bereits Randknoten if (distw>distnew) { //neue kürzeste Entfernung für w von s p=new PriorityRecord(w,distw); //Suchargument q.DecreasePriority(*p,distnew); //neuen kürzesten Abstand für w in q eintragen distance[j]=distnew; //neue kürzeste Entferung parent[j]=v; //neuer Vorgänger } a=D.NextArc(v,a); //nächste Kante für Knoten v } - 102 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN } } Die Prioritätswarteschlange nimmt, da jeder ihrer Records nur einen Knoten enthält, insgesamt n = V Records auf. Bei der Zeitanalyse für die Prioritätswarteschlange ist dann von n Insert- und n DeleteMin-Operationen auszugehen. Die innere Schleife wird für jede der e = E Kanten des Graphen ausgeführt. Dabei wird höchstens eine Insertoder eine IncreasePriority-Operation ausgeführt. Bei Implementation der Prioritätswarteschlange als Heap kostet jede dieser Operationen O(log n) . Der Aufwand für den Algorithmus ist somit von der Ordnung O((n + e) log n) . 7.4.1.2.2 ALGORITHMUS VON BELLMANN-FORD Dijkstras Algorithmus funktioniert nur, wenn die Kantengewichte keine negativen Werte annehmen können. Dies kann man sich leicht daran verdeutlichen, dass eine lokal ungünstige nächste Kante durch eine darauf folgende negativ gewichtete Kante nachträglich zu einer besseren Verbindung führt. Dies kann zum Beispiel für Graphen die Gewinne und Verlust abbilden sollen, aber zu falschen Ergebnissen führen. Deshalb wurde der Algorithmus von Bellmann-Ford entwickelt. Dieser funktioniert nach einem komplett anderen Prinzip: In mehreren Durchläufen wird jeweils die beste bisher mögliche Verbindung bestimmt, wobei der i-te Durchlauf alle Pfade der Länge i berücksichtigt. Der längste Pfad ohne Zyklus hat eine Länge von E − 1 , so dass man diesen Prozess nach E − 1 Durchläufen abschließen kann. Als Optimierung kann man das Verfahren vorzeitig beenden, wenn in einem Durchlauf keinerlei Änderungen zur vorherigen Wertebelegung mehr aufgetreten ist. Algorithm BF(G,s) //ein Graph G mit einem Startknoten s// D[s]:=0; For i:=1 to E − 1 do For each (u, v) ∈ E do //gerichtete Kanten// if D[u ] + γ ((u, v)) < D[v] then D[v] := D[u ] + γ ((u, v)) fi - 103 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN od od [vgl. Saake/Sattler (2002) S. 427ff] 7.4.1.2.3 KÜRZESTE WEGE FÜR EINEN AZYKLISCHEN GRAPHEN Der folgende Absatz soll den oben beschriebenen Algorithmus umgelegt auf einen azyklischen Graphen, welcher in unserer Problemstellung auftritt, zeigen. Damit wird versucht das Problem und die Lösungsmöglichkeiten näher zu fokussieren. Wir führen die Rekursion d ( s, s ) = 0 d ( s, w) = min{d ( s, v) + c(v, w)} für v ∈ V ( w) mit den topologisch sortierten Knoten direkt aus. Für Graphen der Abbildung 42 bildet die Folge der Knoten a–c–b–d–f–e eine topologische Ordnung. Wir nehmen den ersten Knoten der Ordnung als Startknoten. Schrittfolge Knoten v 1 a 2 c 3 b 4 d 5 6 f e Vorläufiger minimaler minimaler Abstand Nachfolger w Abstand Knoten w von Knoten w von s s c 2 2 b 4 d 6 b 4 4 d 5 f 8 d 5 5 f 7 e 7 6 f 6 e 7 7 Tabelle 8: Berechnung der kürzesten Wege für einen azyklischen Graphen [Quelle: Reß/Viebeck (2000) S. 408] Die Knoten werden nacheinander in topologischer Ordnung betrachtet und es wird sofort ihre kürzeste Entfernung vom Startknoten s bestimmt. Das Ergebnis zeigt Tabelle 8. Das Programm ShortestPath ermittelt wie das Programm Dijstra die kürzeste Entfernung eines Knotens v vom Startknoten s sukzessive in der Arrayvariablen distance[i], i bezeichnet die Ordnungsnummer des Knotens v. Der Initialwert für distance[i] ist 0; die Bedingung dafür ist !D.IsVisited(v). Immer dann, wenn sich durch - 104 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Hinzunahme des nächsten Knotens ein kürzerer Abstand von s ergibt oder sich in distance[i] noch der Initialwert befindet, wird der bisherige Wert durch den neuen ersetzt. Die Knoten werden in Folge ihrer topologischen Ordnung berechnet. Zum Schluss stehen im Array distance für alle Knoten des Graphen die kürzesten vom Startknoten s ausgehenden Wege. Die Laufzeit des Programms ist O(n * e) . Void ShortestPath(Graph<Record,float> &D) { unsigned n=D.GetNumVertices(),i,j; VPosition<Record,float>v,w; APosition<Record,float>a; VPosition<Record,float>*ord=new VPosition<Record,float>[n]; //Knoten in Sortierordung float *distance=new float[n]; //bisher kürzeste Abstände float dista,distnew; TopSort(D); //topologisches Sortieren NotVisited(D); //Knoten unbesucht v=D.FirstVertex(); //Initalisieren Arraywerte while (v.Pos()) { i=D.GetOrd(v); //Sortierindex Knoten v ord[i]=v; //Knoten v in Array ord distance[i]=0; v=D.NextVertex(v); } for (i=0; i<n; i++) { v=ord[i]; //Knoten v a=D.FirstArc(v); //erste Kante von Knoten v while (a.Pos()) - 105 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN { w=D.Endpoint(a); //Endpunkt w der Kante a j=D.GetOrd(w); //Index vom Endknoten dista=D.GetArc(a); //Wert dista von Kante a distnew=distance[i]+dista;//Entfernung w von s if (!D.IsVisited(w)) {//Knoten noch unbesucht D.SetVisited(w,true); //Konten besuchen distance[j]=distnew; //Entfernung setzen } else if (distnew<distance[j]) distance[j]=distnew; //neue kürz. Entferung a=D.NextArc(v,a); } } } 7.4.1.3 KÜRZESTE WEGE ZWISCHEN ALLEN KONTEN IM GRAPHEN Die Aufgabe, für jedes Knotenpaar v und w im Graphen D den kürzesten Weg von v nach w zu berechnen, ließe sich natürlich lösen, dass der Algorithmus von Dijkstra iterativ auf jeden Knoten des Graphen angewendet wird. Es gibt aber einen einfacheren Algorithmus, welcher das Problem direkt löst. Zusätzlich gilt der Algorithmus allgemein für beliebig bewertete Graphen, d.h. auch im Fall negativer Gewichte. Der Ansatz ist ähnlich dem das Verfahrens von Wahrshall und beruht auf der Idee, ausgehend für ein beliebiges Knotenpaar vi und vj festzustellen, ob es einen oder mehrere Wege von vi nach vj gibt und welches der kürzeste ist. Ausgehend von der - 106 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Kostenmatrix C0 [i, j ] wird dieser Prozess so lange wiederholt, bis sich die Matrix nicht mehr ändert. Die letzte Matrix enthält dann die kürzesten Wege zwischen je zwei Knoten von D. Für C0 gilt: C0 [i, j ] = 0 und C0 [i, j ] = ∞ , falls keine Kanten von vi nach vj existiert. Beim Übergang von C k −1[i, j ] nach Ck [i, j ] sind zwei Fälle zu unterscheiden: Es wurde noch kein Weg von vi nach vj festgestellt, d.h. C k −1[i, j ] = ∞ . Gibt es einen Weg von vi nach vk und einen Weg von vk nach vj, so führt auch ein Weg von vi nach vj . Es wird Ck [i, j ] = C k −1[i, k ] + C k −1[k , j ] . Abbildung 43: Darstellung der Knoten und Kanten Es existiert ein Weg von vi nach vj , d.h. H k −1[i, j ]! = ∞ , und ein weiterer, der über vk führt und kürzer ist. Dann wird Ck [i, j ] = C k −1[i, k ] + C k −1[k , j ] . Der Algorithmus von Floyd setzt die Kostenmatrix des Graphen voraus. Das Zeichen ∞ wird durch die größte Zahl des Datentyps der Kantenwerte simuliert. void Floyd(Graph<Record,float> &D) { int n=D.GetNumVertices(),i,j=0,k; int iter=1; float C=new float[n*n],h; boolean b; D.CostMatrix(C); //Initialisierung for (i=0;i<n;i++) //C[i,j] =0 setzen { C[j]=0; j+=n+1; } while (1) { b=false; - 107 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN for (i=0;i<n;i++) for (j=0;j<n;j++) { if (j==i) continue; for (k=0;k<n;k++) { if (k==i || k==j) continue; if (C[i*n+k]==MAXFLOAT || C[k*n+j]==MAXFLOAT) continue; else { h=C[i*n+k]+C[k*n+j]; if (h<C[i*n+j]) { C[i*n+j]=h; b=true; //Matrix geändert } } } } if (!b) break; //Änderung der Matrix C? iter++; } } [vgl. Reß/Vieböck (2000) S. 410ff] 7.5 KOSTENBASIERENDE ABFRAGEBEARBEITUNG IN RELATIONALEN SYSTEMEN SQL als nicht-prozedurale und mengenorientierte Zugriffsprache für relationale Datenbanksysteme ist unter anderem dadurch charakterisiert, dass in einem SQL- 108 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Statement nur beschrieben wird, welche Daten der Benutzer bzw. das Anwendungsprogramm vom Datenbanksystem geliefert haben möchte. Es wird in keinem Fall im SQL-Statement beschrieben, wie das Datenbanksystem diese Daten finden soll. Dies ist die Aufgabe eines so genannten Zugriffs-Optimierers oder englisch Query Optimizer. Da in der entwickelten Software für die Planung des Aufbaues eines Datawarehouse mit Microsoft SQL eine relationale Datenbank als Basis definiert wurde, sind die Kosten für die Abfrage ein Punkt, welcher beleuchtet werden muss. Dabei soll es meiner Software möglich sein, durch die Eingaben des Benutzers näherungsweise Aussagen über die benötigte Zeit der Abfrage zu liefern. Die Kalkulation dieser Kosten wird im Normalfall vom Query Optimizer durchgeführt. Leider veröffentlichen Datenbankhersteller die Kostenfunktionen, bzw. die Funktionalität dieser Query Optimizer nicht, da die Performance eines Datenbankmanagementsystems im entscheidenden Maße von der Arbeitsweise des jeweiligen Optimizers abhängt. Im Gegenteil, die Funktionen und Arbeitsweise des Query Optimizers werden von den Datenbankherstellern als Betriebsgeheimnis angesehen. [vgl. Müller-Angstenberger (1994) S. 1] Durch diese Geheimhaltung sind in der Literatur nur grobe Schätzverfahren über die Kosten, bzw. die Abfragezeit einer Abfrage vorhanden. Diese zum Teil sehr unterschiedlichen Ansätze will ich nun vorstellen. Heuristische Optimierungstechniken sind darauf ausgerichtet, in der Mehrzahl der Fälle innerhalb kurzer Laufzeit gute Ergebnisse – d.h. nahezu optimale Anfrageauswertungspläne – zu liefern. Ein Kostenmodell stellt Funktionen zur Verfügung, die den Aufwand, d.h. die Laufzeit, der Operatoren der physischen Algebra abschätzen. Dazu werden diverse Parameter wie Indexe, Ballungen, Kardinalitäten und Verteilungen benötigt. [vgl. Kemper/Eickler (1996) S. 211f] Abbildung 44: Funktionsweise eines Kostenmodells [Quelle: Kemper/Eickler (1996) S. 212] - 109 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Grundsätzlich muss entschieden werden, ob die Daten sequentiell oder über einen Index gesucht werden sollen. Voraussetzung für einen Indexzugriff ist selbstverständlich das Vorhandensein eines geeigneten Index. Stehen für den Zugriff prinzipell mehrere Alternativen zur Auswahl, so wird der Optimizer abschätzen, welche Zugriffsmethode die günstigere, d.h. die kostengünstigere ist. Dazu dient laut Müller-Angstenberger (1994) folgende Formel: Kosten des Zugriffs = X * Anzahl IOs + Y * CPU Verbauch Dieses grobe Modell besagt, dass pro Zugriff die Kosten der zu erwartenden IOs sowie die Kosten des zu erwartenden CPU Verbrauchs geschätzt und gewichtet werden. Das Ergebnis sind die geschätzten Gesamtkosten. [vgl. Müller-Angstenberger (1994) S. 2] Die Kosten aller Zugriffe ergeben sich somit aus der Summe der Einzeloperationen. Das gewählte Maß kann, bevor die Anfrage tatsächlich ausgeführt worden ist, nur geschätzt werden. Eine exakte Bestimmung setzt die Durchführung der Anfrage voraus, da nur dadurch die getroffenen Annahmen über die Verteilung der Daten auf dem Sekundärspeicher überprüft werden können. Ein solches Maß ist laut Dunemann (2002) „die Anzahl der Festplattenzugriffe, da anzunehmen ist, dass dieser Wert mit der Gesamtlaufzeit der Anfrage korreliert. Hierzu wird zum einen unterstellt, dass Verarbeitungen im Hauptspeicher so schnell ablaufen, dass sie einen vernachlässigbar geringen Anteil an der Beantwortungszeit der Anfrage ausmachen. Zum anderen wird bei einer Anfrage angenommen, dass das Ergebnis nicht wieder auf die Festplatte geschrieben wird, sondern von einer Applikation konsumiert wird. Somit kann für die Kostenschätzung auf die Eigenschaften der Eingangsdatenmengen abgestellt werden, während die Form des Ergebnisses nur für die Kosten der nachfolgenden Operationen relevant ist.“ [vgl. Dunemann (2002) S. 56] Einen ähnlichen Ansatz finden Harinarayan et al. (1996), welche die Abfragezeit als proportional zur Anzahl der Zeilen ansehen, die abgearbeitet werden [Harinarayan et al. (1996) S. 4]. Dabei wird folgendes lineares Kostenmodell entwickelt: T=m*S+c Dabei ist T die Laufzeit der Anfrage mit der Größe S. Und c gibt die Fixkosten (fixe Zeit) wieder. In dem empirischen Modell ermittelten Harinarayan et al. beispielhaft die Fixkosten mit 2.07 Sekunden durch experimentelles Austesten in einer Datenbank. m ist das Verhältnis der Abfragezeit zu der Größe S der Abfrage nach Abzug der Fixkosten. In der Tabelle werden die Ergebnisse von Harinarayan et al. präsentiert: - 110 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Source From cell itself From view (supplier) From view (part, supplier) From view (part, supplier, customer) Size 1 10000 800000 6000000 Time (sec.) Ratio 2,07 not applicable 2,38 0,000031 20,77 0,000023 226,23 0,000037 Tabelle 9: Entwicklung der Query Response Time im Verhältnis zur Size [Quelle: Harinarayan et al. (1996) S. 11] Es gibt eine Reihe unterschiedlicher heuristischer Ansätze, wie die Kosten für eine Anfrage geschätzt werden können. Zur Schätzung der Eingangsdatenmenge ist aber zumeist auch die Menge der selektieren Tupel in der Gesamtmenge von Belang. Kessler (1997) teilt dabei die Schätzverfahren, welche die Anzahl der Tupel einer Relation, die ein bestimmtes Selektionsprädikat erfüllen, schätzen, in fünf prinzipielle Vorgehensweisen ein [vgl. Kessler (1997) S. 182ff]: • Es wird eine Gleichverteilung der Attributwerte angenommen. Mittels Statistikformeln wird die Zahl der Tupel geschätzt. Dabei wird eine Gleichverteilung der Attributwerte angenommen und für jede Relation und jedes Attribut die Anzahl der Tupel in der Relation, die Anzahl verschiedener Attributwerte, der kleinste Attributwert, der größte Attributwert und die Intervallbreite (entspricht größter minus kleinster Attributwert) ermittelt und in einer Min-Max-Statistik gespeichert. Ausgehend von diesen Werten wird die Selektivität der einzelnen Prädikattypen geschätzt und durch Multiplikation von der Anzahl der Tupel in der Relation und Selektivität die erwartete Anzahl der qualitativen Tupel geschätzt. • Es wird eine Ungleichverteilung, die durch eine geeignete Wahrscheinlichkeitsverteilung approximiert werden kann, angenommen. Die Zahl der Tupel wird wieder durch Anwendung von Formeln der Statistik geschätzt. (siehe letzter Absatz) • Die Ungleichverteilung der Attributwerte wird durch ein Histogramm beschrieben. Aus diesem wird die Zahl der Tupel berechnet. Grundsätzlich lassen sich vollständige und komprimierte Histogramme unterscheiden. In einem vollständigen Histogramm wird von jedem einzelnen Attributwert erfasst, wie oft er auftritt. Der Vorteil dieser Histogramme ist ihre Exaktheit. Der Nachteil ist die große Datenmenge, welche zu speichern ist. In einem komprimierten - 111 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Histogramm wird die Datenmenge eingeschränkt, indem das Gesamtintervall in n halboffene, nicht notwendigerweise gleich große Teilintervalle aufgeteilt wird. Für jedes Teilintervall i wird ein Eintrag erzeugt. Dieser enthält den größten Attributswert, die Anzahl der Tupel und die Anzahl verschiedener Attributwerte im Intervall. Zusätzlich wird ein Eintrag (Teilintervall 0) mit der unteren Grenze des Intervall 1 angelegt. • Es wird keine Annahme über die Attributwertverteilung gemacht. Die Zahl der qualifizierten Tupel wird durch Multiplikation der Gesamtzahl der Tupel mit einer für die einzelnen Prädikatstypen heuristisch festgelegten Selektivität ermittelt. • Zum Zeitpunkt, zu dem eine Anfrage optimiert wird, wird auf die Relation zugegriffen und aus ihr eine Stichprobe, bestehend aus einer bestimmten Anzahl Tupel, entnommen. Ausgehend von dieser Stichprobe wird hochgerechnet, wie viele Tupel sich insgesamt qualifizieren werden. Die unterschiedlichen Ansätze zielen alle auf eine Kostenschätzung durch die Schätzung der Seitenzugriffe ab. Da in unserem Datawarehouse für das Materialisieren der Würfel typischerweise so genannte GROUP BY Abfragen durchgeführt werden, werden alle Tupel, bzw. Blöcke des Tables gelesen. Somit ergibt sich die Anzahl der Readoperationen RS für das Scannen des Table aus RS = Anzahl der Tupel im Table count(r)/ Anzahl der Tupel pro ReadBlock Ein ähnlicher Ansatz findet sich auch bei Kessler (1997). Zusätzlich werden jedoch noch Read Operationen für die GROUP BY Operation benötigt. Dabei kann die Schätzfunktion von Dunemann (2002) verwendet werden. ⎛ count (r ) ⎞ count ( γL (r )) ≈ min⎜⎜ , ∏ (distinct (r , a ) )⎟⎟ 2 a∈L ⎝ ⎠ [vgl. Dunemann (2002) S. 74] Damit sagt Dunemann, dass die Anzahl der Tupel einer GROUP BY Operation gleich dem Produkt der einmaligen Einträge der Tabellen sind oder wenn diese nicht bekannt mit der halben Tupelanzahl geschätzt wird. Diese sind in meiner Software durch den Benutzer einzugeben und in der Regel bekannt. So weiß der Benutzer, welcher eine - 112 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN GROUP BY Abfrage über Kundengruppe und Mitarbeiter haben möchte, sowohl die Anzahl der Kundengruppen als auch die Anzahl der Mitarbeiter. Für im Zeitablauf ändernde Voraussetzungen beim Aufbau des Warehouse ist eine Anpassung der Struktur durchzuführen. Denn eine Zunahme der Anzahl der Mitarbeiter führt zu einer Veränderung der Struktur und kann eine veränderte Auswahl der materialisierten Würfel bedeuten. Des weiteren muss die Sortierung der GROUP BY Ergebnisse beachtet werden. Dabei hängt nach Dunemann die Zeit für die Sortierung sehr stark von der Verfügbarkeit des Hauptspeichers ab. Kann dieser alle zu sortierenden Tupel aufnehmen, erfolgt die Sortierung nach dem Einlesen ohne weitere Plattenzugriffe. Die Kosten sind also identisch mit der eines Scans. Ist der Hauptspeicher nicht ausreichend, muss ein anderes Verfahren zum Einsatz kommen, welches auf der Festplatte sortiert. So kann das Verfahren Merge-Sort, welches bei großen Datenbeständen Einsatz findet, mit folgenden geschätzten Kosten verwendet werden: cos t E ( MergeSort (rclustered )) = 3 * blocks(rclustered ) [vgl. Dunemann (2002) S. 60] Dabei ergeben sich die Kosten einer Sortierung durch die Multiplikation der Anzahl der Clustered Blocks mit drei. Wenn man diese Kostenschätzung auf die GROUP BY Anfrage anwendet, wäre dies: cos t E ( MergeSort L (cube)) = cos t E (FactScands ( cube ) (cube )) + 2 * cos t E (FactScanlocal (cube )) Damit wären die Kosten für eine GROUP BY Abfrage einmal das Lesen des gesamten Abfragewürfels und zwei mal die IO Kosten (Schreiben und Lesen) für den neuen materialisierten Würfel. [vgl. Dunemann (2002) S. 165] Die komplettesten Ansätze, speziell auf die Bewertung der CPU Kosten in GROUP BY Abfragen von Datawarehouse Systemen zugeschnitten, finden sich bei Jianzhong (1999). Sie definieren R(D1, D2, …, Dn; M) als eine multidimensionales Dataset. Die Dimensionsreihenfolge von R ist dabei Di1 , Di2 ,..., Din und Di j entspricht dem i-ten Element in der j-ten Dimension. Die Aggregation von R(D1, D2, …, Dn; M) ergibt eine Group-by Dimensionsmenge {A1 , A2 ,..., Ak } ⊆ {D1 , D2 ,..., Dn } und eine Aggregationsfunktion F. Damit ist S ( A1 , A2 ,..., Ak ; F ( M ) ) das Ergebnisset, wo die - 113 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Kosten F(M) durch die Kennzahlen von R in die Aggregationsfunktion F eingesetzt und errechnet werden. Jianzhong et al. (1999) beschreiben mehrere Aggregationsalgorithmen. Allerdings betreffen diese Algorithmen komprimierte Daten, sodass einige Dekomprimierungsbzw. Komprimierungsschritte in den Kostenfunktionen angeführt werden, welche nicht unbedingt notwendig sind. Ich möchte den von ihnen vorgestellten G-Aggregationsalgorithmus, den M-Algorithmus und den Prefix-Algorithmus hier erwähnen. G steht dabei für „genereller“ Algorithmus, da er in allen Situationen eingesetzt werden kann. Dabei wird die Transpositionsphase und die Aggregationsphase unterschieden. Der MAggregationsalgorithmus beschreibt die G-Aggregation in dem Fall, wenn das Aggregationsergebnis in den Speicher passt. Der Präfix-Algorithmus hat den Vorteil durch die Situation, dass die Group by Dimensionen ein Prefix der Dimensionsordnung D1 , D2 , K , Dn des Datasets R(D1 , D2 , K , Dn ; M ) ist. Dadurch kann die Aggregation in einem Schritt im Hauptspeicher durchgeführt werden. Abbildung 45: Beispielhafte Arbeitsabfolge im G-Algorithmus [Quelle: Jianzhong (1999) S. 654] Die Kostenschätzungen der Algorithmen für die CPU Kosten lauten wie folgt: ⎛ ⎡ ⎡N ⎤ ⎡ N ⎤ ⎤ ⎞⎟ CPU G = 2 Nn + ⎢ ⎥ B log 2 B + ⎜⎜ N + 2 N r ⎢log w ⎢ ⎥⎦ ⎥ ⎟ log 2 W BW ⎣B⎦ ⎣ ⎣ ⎦⎠ ⎝ CPU M = 2 Nn + Nh + N r CPU Pr efix = N (2n + 1) + N r N … Anzahl der Tupel im Abfragetable n … Anzahl der Dimensionen - 114 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN B … Anzahl der Tupel pro Block N r … Anzahl der Tupel in der Ergebnistabelle W … Anzahl der benötigten Buffer h … Anzahl der Berechnungen der Hashing Berechnung [vgl. Jianzhong (1999) S. 653ff] Dunemann (2002), welcher in seinen Betrachtungen die CPU Kosten für die Abfragen ignoriert, hat einige bemerkenswerte praktische Untersuchungen über den Zusammenhang von Größe der BFT (Anzahl der Tupel in der BFT - count facts ) und der Laufzeit (Kosten) einer GROUP BY Abfrage sowie über den Zusammenhang von der Größe der Ergebnis-GROUP BY Tabelle (Anzahl der Tupel in den materialisierten Sichten - count cells ) durchgeführt. Dabei errechnet er die Anzahl der count cells aus einer Zeitdimension einem Quartal (13 Wochen) sowie 27 Kostenarten, 20 Organisationseinheiten und einer Kennzahl folgende Formel: count cells = M * Zeit * Kostenart * Organisation =(1+1)*(13+1)*(27+1)*(20+1) = 16464 Dabei wird pro Dimension ein Element für undefinierte Werte berücksichtigt. Der Zusammenhang der Kosten (beziehungsweise der Laufzeit) mit der Anzahl der count facts ergibt sich nach den Ergebnissen der Tests wie folgt: count facts 1000 2000 3000 4000 5000 6000 7000 Laufzeit 6,360 8,686 10,790 13,486 16,484 22,063 3,707 Somit ergibt sich ein Korrelationskoeffizient von ρ =0,986. Je dichter dieser Wert bei 1 liegt, desto eindeutiger ist die Korrelation. Ähnliche Tests wurden mit größeren Tabellen durchgeführt und brachten ähnliche Ergebnisse. Zur Untersuchung der Korrelation zwischen count cells und der Laufzeit werden durch Dunemann (2002) folgende Ergebnisse präsentiert: count cells 16464 31572 47040 62328 77616 92904 Laufzeit 13,486 38,510 67,868 91,401 118,867 135,671 - 115 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Das Ergebnis der linearen Reggressionsanalyse ist ρ =0,998. Damit besteht ein starker Zusammenhang für Kostenschätzungen. Die Auswertung für die größeren Datenwürfel bestätigte das Ergebnis, welches für die kleinen Datenwürfel ermittelt worden ist. Allerdings konnte eine geringere Korrelation festgestellt werden. Deshalb trifft Dunemann (2002) die Schlussfolgerung, das bei größeren Datenwürfeln der Einfluß der count cells im Verhältnis zum Einfluss der count facts geringer ist. [vgl. Dunemann (2002) S.235ff] Grundsätzlich kann festgestellt werden, dass über die Kostenschätzungen für Abfragen in der Literatur Uneinigkeit besteht. Dies ist vermutlich darauf zurückzuführen, dass die Kosten, bzw. die Zeit für eine Abfrage sehr stark von den aktuellen Eigenschaften der Datenbank abhängen. Trotzdem sind einige Ansätze zu finden, welche ich in einer weiter unten angeführten Kostenfunktion für meine Berechnungen verwende möchte. 7.6 DIE HEURISTIKEN 7.6.1 EINTEILUNG DER KOSTEN Um eine Auswahl der zu materialisierenden Würfel treffen zu können, ist es notwendig, die Kosten für diese Würfel zu berechnen. Dazu habe ich Kostenschätzfunktionen, welche sehr realitätsnah aber auch nicht zu komplex sein sollen, -da sie die Grundparameter für die Software darstellen, welche im Lehrbetrieb eingesetzt werden soll- entwickelt. Diese Kostenschätzfunktionen basieren auf den Ausführungen in Kapitel 7.5 und haben grundsätzlich auf das Ergebnis der Bewertung der Heuristik keinen Einfluss. Es ist auch möglich eine Bewertung der Heuristik mit zufällig hinterlegten Kosten durchzuführen (siehe dazu Kapitel 7.6.5). Ich möchte die Funktionen aber trotzdem sehr praxisnah ausformulieren, damit die Software nicht nur für die Lehre und Forschung einsetzbar ist -und nur Aufschluss über die Bewertung der Heuristiken gibt - sondern auch für die Entwicklung eines richtigen Warehouse eingesetzt werden kann. Somit liefert die Software realitätsnahe Ergebnisse. Allerdings ist natürlich diese Kostenfunktion für den praktischen Einsatz nicht ausreichend. Deshalb erscheint es für Datenbankentwickler sinnvoll ihre geheimen Query Optimizer Funktionen mit meiner Heuristik zu kombinieren und ein Endanwenderprodukt zu programmieren. Die Suche nach einer Kostenfunktion ist aber nicht der Kern meiner Forschung und einer Verbesserung der Kostenfunktion in nachfolgender Forschungstätigkeit steht jedenfalls nichts im Wege. Nach meinem Ansatz unterscheide ich zwischen Kosten für die Materialisierung eines Würfels aus einem anderen Würfel oder dem BFT und den Kosten für das Abfragen eines Würfels. Diese Unterscheidung ist deshalb essentiell, da die Kosten für die - 116 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Materialisierung während des Aufbaues des Warehouse auftreten, die Kosten für die Abfragen jedoch beim Benutzen des Warehouse durch den User (siehe dazu Kapitel 7.3). Es gibt für mich ein Zeitlimit und Speicherplatzlimit auf der Materialisierungsebene. Zusätzlich will ich aber den Ansatz von Prosser durch ein Zeitlimit für Abfragen auf der Userebene erweitern, da auch die Zeitanforderungen der Benutzer hinsichtlich Wartezeit auf Ergebnisse einbezogen werden sollten. Dieses Zeitlimit ist aber nicht zwingend. Das heißt, es kann durchaus die eine oder andere Abfrage länger als die durchschnittliche gewünschte Wartezeit der User sein. Allerdings ist die durchschnittliche Abfragedauer aller Abfragen limitiert. Dazu werden die Würfel, welche für die Benutzer interessant sind, entsprechend der Wartezeit und der Abfragehäufigkeit klassifiziert. Somit ergibt sich folgende Kostenfunktion: Gesamtkosten = Kosten der Abfragephase + Kosten der Materialisierungsphase 7.6.2 KOSTENSCHÄTZFUNKTION DER ABFRAGEPHASE Ich betrachte hierbei die Kosten für die Abfrage eines Würfels w welcher ein Derivativ des Würfels v ist. Dieser Würfel w muss also durch eine Abfrage des Würfels v errechnet werden. Analog ist eine Abfrage eines Würfels w aus dem Base Fact Table zu sehen. Die Abfrage eines materialisierten Würfels w ist nach meiner Definition 0, da er nicht errechnet werden muss, sondern bereits aggregiert vorliegt. 7.6.2.1 BEGRIFFSDEFINITIONEN AnztupelQUERY … Anzahl der Tupel in der abzufragenden Tabelle, bzw. des Joins AnztupelGROUPBY … Anzahl der Tupel, welche in dem materialisierten View gespeichert werden AvTime IO … Durchschnittliche Zeit für die IO Operation eines Tupels AvTimeCPU … Durchschnittliche CPU Zeit für einen Sortierungsschritt in der Group By Abfrage AvtimeMAX … durchschnittlich verfügbare Zeit pro Abfrage (maximale durchschnittliche Wartezeit des Benutzers) - 117 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.6.2.2 • WERTEBEREICHE UND BEDINGUNGEN Wertebereich von AnztupelQUERY , AvTimeCPU , AnztupelGROUPBY , AvTime IO und AvtimeMAX : 0 ≤ x ≤ ∞ 7.6.2.3 FUNKTION ⎧ AvTime IO * (AnzTupel QUERY + 2 * ( AnzTupel GROUPBY ))⎫ Kosten = ⎨ ⎬+ AvtimeMAX ⎭ ⎩ ⎧ [AnzTupel GROUPBY * log 2 AnzTupel GROUPBY ]* AvTimeCPU ⎫ ⎨ ⎬ AvtimeMAX ⎩ ⎭ 7.6.2.4 BESCHREIBUNG DER KOSTENSCHÄTZFUNKTION Die Abfragekosten werden mit dem Ausnutzungsgrad der Abfragezeit bewertet. Wenn also die Benutzer eine Abfragezeit mit durchschnittlich 10 Sekunden benötigen, gibt eine Aussage der Abfragekosten von 0,8 eine durchschnittliche Abfragedauer von 8 Sekunden an. Dabei werden die Anzahl der Tupel, zuerst beim Table Scan in den Hauptspeicher gelesen und dann wird der CPU Zeit beim Sortieren und Aggregieren durch eine Schätzformel berechnet und mit der durchschnittlichen IO Zeit pro Operation multipliziert. Diese Schätzformel ist stark vereinfacht. Für den Zweck im Lehrbetrieb gut Ergebnisse zu erhalten aber jedenfalls ausreichend. 7.6.3 KOSTENSCHÄTZFUNKTIONEN DER MATERIALISIERUNGSPHASE Die Kosten der Materialisierung versuche ich, in Anteilen der durch die Materialisierung verbrauchten Ressourcen an den Gesamtressourcen, zu berechnen. Je geringer der Ressourcenverbrauch der Materialisierung, desto kostengünstiger ist die Materialisierung. Dieser Ansatz ermöglicht die Kosten nicht in absoluten Zahlen, wie etwa in einer Währung, darzustellen zu müssen. Die realen Kosten einer Abfrage sind von unzähligen Parametern, wie Datenbankhersteller, Datenbank, Indizes, Hardewareparametern, Betriebssystemen, usw. abhängig und ändern sich auch im Zeitablauf. 7.6.3.1 BEGRIFFSDEFINITIONEN AnztupelQUERY … Anzahl der Tupel in der abzufragenden Tabelle, bzw. des Joins - 118 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN AnztupelGROUPBY … Anzahl der Tupel, welche in dem materialisierten View gespeichert werden AvTime IO … Durchschnittliche Zeit für die IO Operation eines Tupels AvTimeCPU … Durchschnittliche CPU Zeit für einen Sortierungsschritt in der Group By Abfrage AvTime STORE … Durchschnittliche Zeit zum Speichern eines Tupels in dem materialisierten View time MAX … Maximal verfügbare Zeit space MAX … Maximal verfügbarer Speicherplatz AvSizeSTORE … Durchschnittlicher Speicherplatz beim Speichern eines Tupels im materialisierten View weight TIME … Gewichtung der Zeit weight SPACE … Gewichtung des Speicherplatzes 7.6.3.2 • WERTEBEREICHE UND BEDINGUNGEN Wertebereich von AnztupelQUERY , Anztupel STORE , AvTime IO , AnztupelQUERY , AvTime STORE , AvSizeSTORE und AvTimeCPU : 0 ≤ x ≤ ∞ • Wertebereich von time MAX , space MAX : 0 < x ≤ ∞ • Wertebereich von weight TIME , weight SPACE : 0 ≤ x ≤ 1 • Es gilt die Nebenbedingung: weight TIME + weight SPACE =1 7.6.3.3 FUNKTION ⎧ AvTimeIO * (AnzTupelQUERY + 2 * ( AnzTupelGROUPBY ))⎫ Kosten = ⎨ ⎬ * weightTIME + Avtime MAX ⎩ ⎭ ⎧ [ AnzTupelGROUPBY * log 2 AnzTupelGROUPBY ]* AvTimeCPU ⎫ ⎨ ⎬ * weightTIME + AvtimeMAX ⎩ ⎭ ⎧ AvSizeSTORE * AnzTupel GROUPBY ⎫ ⎬ * weight SPACE ⎨ space MAX ⎭ ⎩ - 119 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Die Kosten werden durch den Ressourcenverbrauch von Zeit und Speicherplatz bewertet. Durch die Gewichtungsfaktoren weight SPACE für den Gewichtungsfaktor des Speicherplatzes und weight TIME für den Gewichtungsfaktor der Zeit kann der Benutzer die Kosten für Zeit und Speicherplatz gewichten. Der Speicherplatzverbrauch wird in Anteilen des verbrauchten Speicherplatzes ( AvSizeSTORE * Anztupel STORE ) am Gesamtspeicherplatz space MAX ausgedrückt. Auf Seiten der Zeitdimension wird der Zeitverbrauch in Anteilen am Gesamtzeitverbrauch für die Read/Write Operationen und für die CPU Operationen berechnet. Dazu wird die Durchschnittliche Zeit für IO Operationen pro Tupel mit der Anzahl der zu lesenden und schreibenden Tupel multipliziert. Diese Anzahl der Tupel berechnet sich nach Dunemann (2002) (siehe auch Kapitel 7.5) für eine GROUP BY Abfrage einmal durch das Lesen des gesamten Abfragewürfels und zwei mal die IO Kosten (Schreiben und Lesen) für den neuen materialisierten Würfel. Der Anteil des Zeitverbrauches durch das Sortieren der Group by Tupels wird durch die Anzahl der Sortierungsschritte multipliziert mit der durchschnittlichen CPU Zeit pro Sortierungsschritt geschätzt und anschließend gewichtet. 7.6.3.4 BESCHREIBUNG DER KOSTENSCHÄTZFUNKTION Die Materialisierungskosten werden in Anteilen am Ressourcenverbrauch bewertet und anschließend noch nach ihrer Wichtigkeit bewertet. So kann der Benutzer stufenlos entscheiden, ob er das Speicherplatzlimit oder das Zeitlimit höher bewerten will. Die Berechnung der Zeit ergibt sich durch Addieren der Zeit für das Abfragen, für die Group by Abfrage des Würfels und der Zeit für das Speichern des neuen Würfels in der Datenbank. Der Speicherplatz wird einfach durch Multiplikation der durchschnittlichen Größe eines Tupels mit der Anzahl der zu speichernden Tupel ermittelt. 7.6.4 GESAMTKOSTEN Die Gesamtkosten ergeben sich durch Addieren und Gewichten der Abfragekosten und der Materialisierungskosten. 7.6.4.1 BEGRIFFSDEFINITIONEN KostenQUERY n … Kosten der Abfrage KostenMATERALISIERENm … Kosten der Materaliserung des zu materialisierenden Würfels m weight QUERY … Gewichtung der Abfragekosten - 120 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN weight MATERALISIEREN …Gewichtung der Materalisierungskosten … Zähler aller zu materialisierenden Würfel m Anz n … Häufigkeit der Abfrage n durch den Benutzer pro Zeitintervall … Zähler aller abzufragenden Würfel n 7.6.4.2 WERTEBEREICHE UND BEDINGUNGEN • Wertebereich von KostenQUERY n , KostenMATERALISIEREN m , n , m, Anz n : 0 ≤ x ≤ ∞ • Wertebereich von weight QUERY , weight MATERALISIEREN : 0 ≤ x ≤ 1 • Es gilt die Nebenbedingung: weight QUERY + weight MATERALISIEREN =1 7.6.4.3 FUNKTION [ ] Kosten = ∑ KostenQUERYn * Anz n * weight QUERY + ∑ Kosten MATERALISIEREN n m * weight MATERALISIEREN m 7.6.5 ZUFÄLLIGE KOSTEN Um eine wissenschaftlich fundierte Aussage über die Wertigkeit und Funktionalität der Heuristik zu treffen, will ich ein Austesten der Heuristik mit zufällig gewählten Kosten durchführen. Dies soll auch die Unabhängigkeit der Heuristik von den Kostenschätzfunktionen unterstreichen. Dabei können die Kosten grundsätzlich völlig unstrukturiert zufällig gewählt sein und die Heuristik muss die gleichen Ergebnisse liefern als die deterministische Lösung. Allerdings will ich, um die Kosten an die realen Verhältnisse anzupassen, einige Nebenbedingungen beachten. - 121 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 46: Schematische Aufstellung der Würfel und Kostenfunktionen In Abbildung 46 gebe ich eine Aufstellung eines exemplarischen Kostenbaumes. Ich unterscheide Würfel der ersten Ebene V, welche nur aus dem BFT materialisiert werden können, und Würfel der zweiten Ebene W, welche aus dem BFT oder aus einem Würfel der Ebene V materialisiert werden können. Diese Aufstellung kann natürlich um beliebige Ebenen erweitert werden. Dabei gehe ich von folgenden Grundannahmen aus: • Eine Kostenfunktion f() symbolisiert Kosten für die Materialisierung oder die Abfrage eines Würfels, in welchem eine Kante endet aus dem Würfel oder dem BFT, aus welchem die Kante entspringt. • Die Kosten für die Materialisierung oder die Abfrage eines Würfels der Ebene V ist immer größer als die Kosten für die Materialisierung oder die Abfrage eines Würfels der Ebene W direkt aus dem BFT, wenn die Anzahl der Group by Dimensionen von V größer ist als die Anzahl der GROUP BY Dimensionen von W. Das ergibt sich daraus, dass die CPU Kosten für eine Berechnung höher sind und die Größe der Ergebnistabelle V wesentlich mehr Tupels enthält. Haben V und W gleich viele GROUP BY Dimensionen hat V immer mehr Tupels als W in der Ergebnistabelle. Deshalb ist auch bei gleicher Anzahl der GROUP BY Dimensionen f(BFT,W) immer teurer als f(BFT,V). Forderung: ( f ( BFT ,Vx) f f ( BFT , Wy ) ). • Die Kosten für die Materialisierung oder die Abfrage eines Würfels W aus der Vorgängerebene V ist immer kleiner oder gleich den Kosten für die - 122 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Materialisierung des Würfels W aus dem BFT. Diese Forderung ergibt sich daraus, dass ein Aggregat immer weniger Einträge besitzt als der BFT und damit die Berechnungskosten (Tablescan und CPU Aggregations- und Sortierungskosten) kleiner sind. Forderung:( f (Vx, Wx) p f ( BFT ,Wx) ) • Die Kosten für die Materialisierung oder die Abfrage eines Würfels der höheren Ebene W aus der Vorgängerebene V ist immer kleiner als die Kosten für die Materialisierung oder die Abfrage eines Würfels der niederen Ebene V aus deren Vorgängerebene U, wenn es sich um die gleiche Aggregationsdimension handelt. Das heißt eine Aggregation vom BFT → Kundengruppe ist immer teurer als eine Aggregation von Kundengruppe → Kunden total . Diese Forderung ergibt sich daraus, dass z.B. die Abfrage einer Kundendatei mit 50000 Einträgen immer länger dauert als eine Abfrage eines materialisierten Würfels Kundengruppe mit 5 Einträgen bei 5 Kundengruppen. Da aber eine nachfolgende Hierarchiestufe nie mehr Einträge haben kann als eine vorhergehende, ergibt sich oben angeführte Forderung. Forderung: ( f (Vx, Wy ) p f (Uz, Vx) ) • Die Kosten für das Materialisieren eines Würfels W1 aus dem Würfel V1 sind immer höher als die Kosten für das Abfragen des Würfels W1 aus dem materialisierten Würfel V. Diese Forderung ist schlüssig, da das Materialisieren auch ein Abfragen beinhaltet. Allerdings sind noch zusätzlich Operationen wie etwa Speichern, Sortieren, etc. notwendig, welche die höheren Kosten bedingen. Forderung: Abfragekosten<=Materialisierungskosten 7.6.6 HEURISTIK VON ALEXANDER PROSSER Prosser führt zwei limitierende Bedingungen in seiner Heuristik an: • Das begrenzte Zeitfenster für das Laden der operativen Daten in das Warehouse und Updaten der materialisierten Würfel (timemax) • Die maximal verfügbare Speicherkapazität (spacemax) Er definiert M als die Menge der materialisierten Würfel und v als den ersten Cube, welcher materialisiert wird. Da noch kein anderer Würfel bis dato materialisiert wurde, wird der Cube v direkt aus dem BFT (Base Fact Table) generiert. Dabei fallen die Materialisierungskosten CM an. Dadurch können alle Cubes, welche Derivate von v sind, die Cubes w ( w ∈ A(v) ), direkt aus v generiert werden. Das führt bei allen Cubes w zu einer schnelleren Abfrage. In Extremfällen kann der Geschwindigkeitsunterschied zwischen einer sofortigen Anzeige und einer Wartezeit von Stunden oder Tagen sein. Diese Abfragezeit wird durch technische Parameter, Benutzeranforderungen, den - 123 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Kosten der Erstellung von einem Würfel zum anderen oder direkt aus dem BFT, der Anzahl der Tables über die ein Join gemacht werden muss, der Anzahl der Dateneinträge, welche durchsucht werden müssen, dem Grad der weiteren Aggregation und der Index Struktur, beeinflusst. Ein Query Optimizer kann benutzt werden, um diese Information zu liefern, welche benutzt werden kann um die Kosten zwischen den Würfeln δ (v, w) zu schätzen. Die Kosten für die Materialisierung von v aus dem BFT wären dann C M (v) = δ ( BFT , v) . Analog sind die Kosten für das Materialisieren von w aus v aus einer Abfrage C Q ( w) = δ (v, w) . Die Kosten für weitere Abfragen und Berechnungen basierend auf w werden nicht betrachtet, da diese ohnehin anfallen. Als Berechnungsgrundlage haben wir eine Menge von interessanten Würfeln (required cubes) und die relative Wichtigkeit f(w) für jeden Würfel. Der marginale Nettoeffekt E(.), wenn nur v als einziger Würfel im APA betrachtet wird, ist die Differenz zwischen den Kostenverminderung, durch die Tatsache das alle Derivate w ∈ A(v) von v direkt aus v anstatt vom BFT berechnet werden können, im Vergleich zu den Kosten für die Materialisierung von v. Wird v vom BFT als der erste Cube materialisiert gilt: E ( M = {}, v) = ∑ [ f ( w) * (δ ( BFT , w) − δ (v, w))] − δ ( BFT , v) w ≠ v, w ∈ A(v) w Dabei ist es nicht notwendig w ∈ A(v) auf die interessanten Würfel zu beschränken, da die uninteressanten Würfel die relative Wichtigkeit von f(w) = 0 haben. Die Kosten für die Materialisierung der Menge M = {v} beträgt somit C ( M ) = δ ( BFT , v) + ∑ f (w) * δ ( BFT , w) + ∑ f (w) * δ (v, w) w∉A ( v ) w≠v w∈A ( v ) Deshalb kann das Optimierungsproblem definiert werden als: min → C (M ), s * t * space(M ) ≤ space max , s * t * time( M ) ≤ timemax M Für dieses Problem definiert Prosser die Heuristik wie folgt: Berechne E(BFT,v) für jeden Würfel im APA und definiere v mit dem höchsten E(BFT,v) als ersten Würfel welcher M zugesetzt wird. Somit ist M1={v} Führe die folgende Prozedur durch: Spaceortime_limit_reached ← false /* k is used as a counter for the iterations */ k=1 do until spaceortime_limit_reached=true - 124 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN // define the set of all cubes which can be derived from any materialized cube at stage k define A( M k ) = U A( x) x∈M k /* the net effect of each single cube which has not been materialized yet is computed*/ do for all w ∈ M k /* the u ∈ A(w) may already be in the derivative set of materialized cubes */ ^ define U k ( w) = {u / u ∈ A( w)^ u ∈ A( M k )} define U k ( w) = {u / u ∈ A( w)^ u ∉ A( M k )} /* is cube w itself a derivative of another cube which has already been materialized?*/ if w ∉ A( M k ) /* no → w can only be built from the BFT */ E ( M k , w) = ∑ [max(0, u∈Uˆ ∑ [ f (u ) * (δ ( BFT , u ) − δ (w, u ))] + u∈U f (u ) * (δ ( x, u ) − δ ( w, u )) | ∀x ∈ M k / u ∈ A( x) )] − δ ( BFT , w) else /* yes → w will be built from the existing cube with the least distance measure in that case U k must be empty*/ E ( M k , w) = ∑ [max(0, u∈U f (u ) * (δ ( x, u ) − δ ( w, u ) | ∀x ∈ M k / u ∈ A( x) )] − min (δ ( x, w) | ∀x ∈ M k / w ∈ A( x) ) end if end do /* now the net effect off all cubes not materialized at step k is known, the best one is chosen */ - 125 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN choose w → max(E ( M k , w) )∑ M k +1 = M k ∪ {w} if space(M k +1 ) ≥ spacemax or time(M k +1 ) ≥ timemax spaceortime_limit_reached ← true materialize M k else k ← k + 1 end if end do Der Algorithmus startet mit M 1 = {v} . Danach werden so lange neue Würfel materialisiert bis entweder das Zeitlimit oder das Speicherlimit erreicht ist. In jedem Durchlauf wird zuerst k, der Nettoeffekt jedes individuellen Würfels w ∉ M k berechnet. Da wir an einem Performanceanstieg interessiert sind, welcher sich aus der Möglichkeit ergibt, die Derivative u ∈ A(w) nun direkt aus w zu erzeugen. Natürlich kann es sein, dass diese Würfel u auch ein Derivativ eines anderen Würfels x ∈ M k sind, welcher auch bereits bis zum Durchlauf k materialisiert wurde. Deswegen werden U und Û entsprechend definiert. Zu beachten ist jedoch, dass beide Werte abhängig von dem aktuellen Zustand der Menge M k und dem Würfel w, welcher aktuell betrachtet wird, sind. Dabei werden zwei Fälle unterschieden: Wenn w kein Derivativ eines Würfels ist, welcher bereits gewählt wurde ( w ∈ A( M k ) ), ist der Nettoeffekt E ( M k , w) im Durchlauf k • für u ∈ U k (w) (also Würfel, welche sonst direkt vom BFT erzeugt werden müssten) die Kostenersparnis, welche sich durch Erzeugen von u aus w anstatt direkt vom BFT ( δ (BFT , u ) − δ (w, u ) gewichtet mit f(u)) ergibt. • für alle u ∈ Uˆ k ( w) (also Würfel, welche ein Derivative eines bereits für die Materialisierung ausgewählten Würfels x sind) durch die Kostenersparnis repräsentiert, welche sich aus dem Erzeugen von u aus w anstatt aus x ergibt, wobei x bei mehreren Derivativen den Würfel mit den minimalen Materialisierungskosten repräsentiert. Dabei wird unterstellt, dass eine Kostenersparnis da ist, sonst wird diese mit 0 bewertet. Daraus ergibt sich die logische Formulierung max (0, f (u ) * (δ ( x, u ) − δ ( w, u ) ) | ∀x ∈ M k / u ∈ A( x) ) . Diese wird für - 126 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN alle u ∈ Uˆ aussummiert und wenn dieser Nettoeffekt positiv ist zum Nettoeffekt von w hinzugezogen. Da w ∉ A( M k ) wird der Würfel direkt aus dem BFT mit den Kosten δ (BFT , w) materialisiert. Wenn w ein Derivative eines Würfels ist, welcher bereits im Durchlauf k für die Materialisierung ausgewählt wurde, bedeutet dies, dass keine „neuen“ Würfel gebildet werden können. Die Materialisierung vom w macht also nur dann Sinn, wenn einige Würfel bedeutend schneller materialisiert werden können als zuvor. Der Nettoeffekt der Materialisierung von w leitet sich deshalb ab durch: • Berechnen der Nettoeffekte für alle u ∈ Uˆ k ( w) wie oben. • Berechnen der Erzeugungskosten für w als die minimalen möglichen Kosten δ ( x, w) aus allen Würfeln x, aus welchen w errechnet werden kann ( w ∈ A(x) ). Nachdem der Nettoeffekt aller Würfel w im APA berechnet wurde, wird jener mit dem maximalen Verbesserungsbetrag gewählt und der Menge M k +1 zugesetzt. Wenn weder das Zeitlimit oder das Speicherlimit überschritten wird, wird weitergesucht und der Durchlauf von vorne begonnen. Sonst wird die Suche abgebrochen und M k als Ergebnismenge der zu materialisierenden Würfeln festgelegt. 7.6.7 HEURISTIK VON THOMAS ACHS 7.6.7.1 PSEUDOCODE DER HEURISTIK {1. Vorbereitungen für die Iterationen} Erzeuge Menge R der Required Cubes Erzeuge Menge D der Derivative Cubes durch Hinzufügen aller nicht redundanten Würfel, welche mindestens 1 Derivative haben, welches wiederum in der Menge R enthalten sind. P=R ∪ D //Vereinige die Menge R und die Menge D zur Menge P der PossibleCubes für die Materialisierung. MaxSets:=20; //setzt die maximalen Sets, welche kontrolliert werden auf 20 – je höher man - 127 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN diesen Wert setzt umso genauer wird die Heuristik. NewSetsforeachiteration:= 3; //bestimmt die zusätzlichen Sets pro Iterationsstep Setcounter:=-1; //zählt die aktuellen Wege, welche kontrolliert werden Setcount:=1;//Anzahl der Wege {Ende der Vorbereitungen für die Iterationen} {2. Iterationen der Sets} Repeat; {2.1 Vorbereiten des Startsets für die Iteration} If Setcounter=-1 then MatCube={} // Beim ersten Set ist die Menge der bereits materialisierten Würfel leer Else begin //Betrachte das nächste Set und errechne das verbleibende Limit MatCube=Sets[Setcounter]; Berechne Limits of MatCube; End; {Ende 2.1. Vorbereiten des Startsets für die Iteration} {2.2. Beginn der Iteration des aktuellen Sets} While limitreached(MatCube)=false do begin - 128 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN For each Cube c ∈ P do begin //Ist der Cube c noch nicht materialisiert If bereitsmaterialisiert(c)=false then begin MinMatCosts:= MatCosts(BFT); //Die minimalen Materialisierungskosten sind die Kosten für die Materialisierung des Cubes aus dem BFT MerkeMatCube:=BFT; //MerkeMatCube enthält den Cube aus dem c erzeugt werden kann. Wenn nicht aus einem bereits materialisierten Cube abgeleitet werden kann, dann leite aus BFT ab (Standard) {2.2.1 Feststellen des Cubes aus dem der Cube c materialisiert wird: Dazu kontrolliere alle bereits materialisierten Cubes z, ob c aus z abgeleitet werden kann} For each Cube z ∈ MatCube do begin; if kannabgeleitetwerden(c,z)=true then begin //Kann der Cube aus einem bereits materialisierten Cube z erzeugt werden //Merke dir den Cube mit den minimalen Materialisierungskosten if (MatCosts(z)<MinMatCosts) then begin MerkeMatCube:=z; MinMatCosts:= MatCosts(z); End; - 129 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN End; //if kannabgeleitetwerden(c,z) End;//Ende von z ∈ MatCube {Ende 2.2.1 Feststellen des Cubes aus dem der Cube c materialisiert wird} {2.2.2 Festellen der Derivative und der Summe der Abfragekosten der Derivative für den Cube c} Summequery:=0; //Die Abfragekosten sind 0 for each Cube x ∈ R do begin //Kontrolliere alle Required Cubes if x is derivative von c then begin //Wenn der required Cube x ein Derivative von c ist, dann beachte die Querykosten MinQueryCosts:= QueryCosts(MerkeMatCube); //Merken der minimalen Querykosten. Diese sind die Kosten für die Materialisierung aus dem Vorgänger von c. MerkeQueryCube:=MerkeMatCube; //Wenn es keinen besseren Cube y gibt wird der required cube x aus dem Vorgänger von c abgefragt, solange c noch nicht besteht. //Feststellen, ob es einen besseren Cube y gibt und speichern in MerkeQueryCubes for Each y ∈ MatCube do begin If (MinQueryCosts>QueryCosts(x,y) //Abfragekosten des required Cubes x aus dem bereits materialisierten Cube y then begin - 130 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN MerkeQueryCube:=y;//Markiere den Cube y als Abfragecube von x MinQueryCosts:=QueryCosts(y); End; //Ende von if End; //Ende von for Each y ∈ MatCube {2.2.2.1 Berechnen der Verbesserung der Abfragekosten durch das Materialisieren von c} Summequery:= Summequery+max(0, //Kosten für Abfrage von x ((GetQueryCosts(MerkeQueryCube,x)//Kosten für das Abfragen aus c GetQueryCost(c,x)))*Häufigkeit der Abfrage); {Ende 2.2.2.1 Berechnen der Verbesserung der Abfragekosten durch das Materialisieren von c} end; //ist ein Derivative end; //Ende von Each Cube x ∈ R {Ende 2.2.2 Festellen der Derivative und der Summe der Abfragekosten der Derivative für den Cube c} {2.2.3 Berechnen der Verbesserung der Gesamtkosten durch das Materialisieren von c} δK(c)=SummeQuery - GetMatCosts(MerkeMatCube); //Kostenersparnis δK(c) ist die Ersparnis bei den Abfragen (SummeQuery) minus der Materialisierungskosten für den Würfel c - 131 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN {Ende 2.2.3 Berechnen der Verbesserung der Gesamtkosten durch das Materialisieren von c} End; //Ende von If bereitsmaterialisiert(c)=false End;//von each c ∈ P {2.2.4 Gibt es einen Cube c mit Positivem δK(c) (Kostenersparnis) und innerhalb der Limits: True- dann setze den c mit Max(δK(c)) dem aktuellen Set zu; False – dann schließe das Set ab} if ( ∀ c ∈ P ∃ max(δK(c))>0)and(Limitreached(c)=false) then Begin; MatCube.add(c)//Addiere den Cube zum aktuellen Set {2.2.4.1 Gibt es noch NewSetsForEachIteration Cubes, welche das Limit erfüllen dann wähle die NewSetsForEachIteration besten Cubes und eröffne neue Sets solange bis MaxSets erreicht.} for counter:=1 to Settiefe do begin; setcount:=setcount+1; If setcount<MaxSets then AddNewSet; {Bei AddNewSet wird im neuen Set die Menge MatCube der bis jetzt materialisieren Würfel abgelegt. Nur beim letzten Cube, welcher in der Sequenz hinzugesetzt wird, wird nicht der beste sonder der zweitbeste, bzw. drittbeste usw Cube genommen. Das führt dazu, dass bei besonders schiefen Verteilungen, wo z.B. der erste Würfel mit Max(δK(c)) nicht in der optimalen Menge der zu materialisierten Würfel enthalten ist, die Iteration beim neuen Set nicht in eine falsche Richtung läuft so wie beim aktuellen Set.} End;//Ende von Counter - 132 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN {Ende 2.2.4.1 Gibt es noch NewSetsForEachIteration Cubes, welche das Limit erfüllen dann wähle die NewSetsForEachIteration besten Cubes und eröffne neue Sets solange bis MaxSets erreicht.} End //Ende von if ( ∀ c ∈ P ∃ max(δK(c))>0) and (Limitreached(c)=false) else limitreached:=true; //Else abbrechen: Gibt es keinen Cube, welcher einen positiven Kostenbeitrag bringt und in das Limit passt, dann schließe das Set ab. {Ende 2.4 Gibt es einen Cube c mit Positivem δK(c) (Kostenersparnis) und innerhalb der Limits: True- dann setze den c mit Max(δK(c)) dem aktuellen Set zu; False – dann schließe das Set ab} End;//Ende von limitreached=false {Ende 2.2. Der Iteration des aktuellen Sets} Sets[Setcounter]:=MatCube; //Merke dir das neue Set der Materialisierten Würfel in Sets[Setcounter] Setcounter:=Setcounter+1; //Setze den Zeiger auf das nächste Set Until Setcounter>=MaxSets; //Die Schleife läuft so lange bis die maximale Anzahl von Sets (MaxSets – wird vom Benutzer festgelegt) kontrolliert ist {Ende 2. Iterationen der Sets} - 133 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN {3. Berechne die Gesamtkosten für jedes Set} For Setcounter:=0 to Setcount do begin CalculateCostsforEachSet(Sets); End; {Ende 3. Berechne die Gesamtkosten für jedes Set} {4. Materialisiere jenes Set mit den minimalen Kosten} Materialize Set MinCosts(Sets); {Ende 4. Materialisiere jenes Set mit den minimalen Kosten} 7.6.7.2 BESCHREIBUNG DER HEURISTIK Zu Beginn wird die Menge P der Possible Cubes berechnet, welche alle Required Cubes und alle Parent Cubes (Vorgänger der Required Cubes – somit ist der Required Cube ein Derivative des Parent Cubes) umfasst. Dann wird MaxSets als die Menge der zu kontrollierenden Sets und NewSetsforEachIteration als Anzahl der neuen Sets pro Iterationsschritt durch den Benutzer definiert. Der Parameter Setcounter gibt die Nummer des aktuelle betrachteten Cubesets an und Setcount gibt die Anzahl der bereits berechneten Cubesets an. Nach der Vorbereitungsphase wird die Schleife für die Iterationen gestartet Costimproofmentc = ∑ max{0, [getquery(min(P(x ), x ) − getquery(c, x ))]* Anz } x x∈ A ( c ) − getbuild (min (P(c) ), c ) 7.6.7.3 DEMONSTRATIVES BEISPIEL In diesem Abschnitt wird ein demonstratives Beispiel für die Funktionsweise der Heuristik gegeben. Dabei gehen wir von dem in Abbildung 48 angeführten APA aus. Die Eingabemaske des Input Screens mit den Dimensionen und Hierarchien findet sich in Abbildung 47. Wir gehen dabei von einem APA mit 3 Dimensionen und zwei Hierarchiestufen in der ersten Dimension, drei Hierarchiestufen in der zweiten Dimension und drei Hierarchiestufen in der dritten Dimension aus. Das ergibt eine Anzahl von 23 potentiellen Cubes von diesen sind 9 Required Cubes. Das Ergebnis der Heuristik wird in Abbildung 48 dargestellt. Die Anzahl der maximal möglichen Sets wurde mit 20 definiert und die maximal mögliche neue Setanzahl pro Iterationsschritt - 134 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN wurde mit 4 definiert. Im Vorfeld darf jedoch vorweggenommen werden, dass die Limits so gewählt wurden, dass sich eine Lösung von 6 Cubes ergibt und nur 18 mögliche Lösungswege vorhanden sind. Im Beispiel liefert die Heuristik eine 100 % richtige Lösung. Abbildung 47: Dimensionen und Hierarchien des DemoAPA Abbildung 48: DemoAPA mit Lösung Die Heuristik beginnt mit der Auswahl der Possible Cubes und dem Starten der Iteration. Im ersten Durchlauf wird der Fokus auf das Set 1 gesetzt, welches leer ist. - 135 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Dann beginnt die Iteration. Im ersten Iterationsschritt wird der Gewinn der Materialisierung eines jeden Cubes unabhängig von den anderen Cubes berechnet. Als bester Cube (mit der höchsten Gesamtkostenverringerung) würde der Cube 1:3 festgestellt und dem Set 1 zugesetzt. 1. Schritt: Finde den ersten Cube im aktuellen Set (1) Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Costs Abbildung 49: Schritt 1 der Heuristik nach Thomas ACHS Als nächstes beginnt die Phase des Zusetzens der nächstbesten Cubes. Dabei wird der zweitbeste Cube dem Set 2, der drittbeste Cube dem Set 3,der viertbeste Cube dem Set 4 und der fünftbeste Cube dem Set 5 als erster Cube zugesetzt bis entweder kein anderer Cube einen positiven Kostenbeitrag in der aktuellen Iterationsstufe liefern kann oder die maximale Anzahl der Cubes, welche zugesetzt werden dürfen (NewSetsForEachIteration – wird durch den Benutzer definiert) erreicht ist. - 136 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 2. Schritt: Zusetzen des zweitbesten bis fünftbesten Cubes in neue Sets, wenn sie positiven Nutzen haben und in das Limit passen Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 2 0:3 3 1:4 4 2:3 5 0:5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Costs Abbildung 50: Schritt 2 der Heuristik nach Thomas ACHS Im Schritt 3 ist nun die erste Iteration abschlossen und nun wird im nächsten Schritt der Wert aller Cubes unter Berücksichtigung dessen, dass der Cube 1:3 bereits im Set 1 materialisiert wurde, berechnet und der beste ausgewählt. Dies ist der Cube 1:4. 3. Schritt: Finde den nächsten Cube im aktuellen Set (1) Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2 0:3 3 1:4 4 2:3 5 0:5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Costs Abbildung 51: Schritt 3 der Heuristik nach Thomas ACHS Dann werden die Sets mit den zweitbesten, drittbesten, usw. Cubes als Cube 2 zugesetzt. An Position 1 steht der beste Cube des ersten Sets. - 137 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 4. Schritt: Eröffne neue Sets mit den zweitbesten bis fünftbesten Cubes in Position 2, wenn sie positiven Nutzen haben und in das Limit passen Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2 0:3 3 1:4 4 2:3 5 0:5 6 1:3 2:3 7 1:3 0:5 8 1:3 0:3 9 1:3 2:4 10 11 12 13 14 15 16 17 18 19 20 Costs Abbildung 52: Schritt 4 der Heuristik nach Thomas ACHS Beim dritten Iterationsschritt kristallisiert sich der Cube 2:0 als beste Cube für das Set 1 heraus. Deshalb wird dieser dem Set 1 zugesetzt. 5. Schritt: Finde nächsten Cube im aktuellen Set (1) Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2:0 2 0:3 3 1:4 4 2:3 5 0:5 6 1:3 2:3 7 1:3 0:5 8 1:3 0:3 9 1:3 2:4 10 11 12 13 14 15 16 17 18 19 20 Costs Abbildung 53: Schritt 5 der Heuristik nach Thomas ACHS Im Anschluss werden wiederum die neuen Sets mit dem nächstbesten Cubes in Phase 3 zugesetzt. Dabei ist zu beachten, dass die ersten beiden Cubes aus dem Set 1 übernommen werden und nur in der letzten Position die nächstbesten Cube zugesetzt werden. - 138 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 6. Schritt: Eröffne neue Sets mit den zweitbesten bis fünftbesten Cubes in Position 3, wenn sie positiven Nutzen haben und in das Limit passen Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2:0 2 0:3 3 1:4 4 2:3 5 0:5 6 1:3 2:3 7 1:3 0:5 8 1:3 0:3 9 1:3 2:4 10 1:3 1:4 0:3 11 1:3 1:4 1:2 12 1:3 1:4 0:5 13 1:3 1:4 0:0 14 15 16 17 18 19 20 Costs Abbildung 54: Schritt 6 der Heuristik nach Thomas ACHS In Abbildung 55 (7. Schritt) wird die vierte Iteration gestartet und der Cube 1:2 als der nächste beste Cube gefunden und dem Set zugesetzt. 7. Schritt: Finde nächsten Cube im aktuellen Set (1) Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2:0 1:2 2 0:3 3 1:4 4 2:3 5 0:5 6 1:3 2:3 7 1:3 0:5 8 1:3 0:3 9 1:3 2:4 10 1:3 1:4 0:3 11 1:3 1:4 1:2 12 1:3 1:4 0:5 13 1:3 1:4 0:0 14 15 16 17 18 19 20 Costs Abbildung 55: Schritt 7 der Heuristik nach Thomas ACHS Abermals werden die nächsten besten Cubes in Schritt 8 in den neuen Sets hinzugefügt. - 139 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 8. Schritt: Eröffne neue Sets mit den zweitbesten bis fünftbesten Cubes in Position 4, wenn sie positiven Nutzen haben und in das Limit passen Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2:0 1:2 2 0:3 3 1:4 4 2:3 5 0:5 6 1:3 2:3 7 1:3 0:5 8 1:3 0:3 9 1:3 2:4 10 1:3 1:4 0:3 11 1:3 1:4 1:2 12 1:3 1:4 0:5 13 1:3 1:4 0:0 14 1:3 1:4 2:0 0:5 15 1:3 1:4 2:0 0:0 16 1:3 1:4 2:0 2:2 17 1:3 1:4 2:0 1:5 18 19 20 Costs Abbildung 56: Schritt 8 der Heuristik nach Thomas ACHS Im fünften Iterationsschritt wird der Cube 2:2 als bester gefunden. Dieser wird zugesetzt und die Kontrolle der nächstbesten Cubes gestartet. 9. Schritt: Finde nächsten Cube im aktuellen Set (1) Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2:0 1:2 2:2 2 0:3 3 1:4 4 2:3 5 0:5 6 1:3 2:3 7 1:3 0:5 8 1:3 0:3 9 1:3 2:4 10 1:3 1:4 0:3 11 1:3 1:4 1:2 12 1:3 1:4 0:5 13 1:3 1:4 0:0 14 1:3 1:4 2:0 0:5 15 1:3 1:4 2:0 0:0 16 1:3 1:4 2:0 2:2 17 1:3 1:4 2:0 1:5 18 19 20 Costs Abbildung 57: Schritt 9 der Heuristik nach Thomas ACHS Die maximale Anzahl der Sets wurde vom Benutzer mit 20 Sets definiert. Dadurch ist nach dem Zusetzen des zweitbesten Cubes zum Set 18, des drittbesten Cubes zum Set 19 und des vierbesten Cubes zum Set 20 keine weiteren Sets. - 140 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 10. Schritt: Eröffne neue Sets mit den zweitbesten bis fünftbesten Cubes in Position 5, wenn sie positiven Nutzen haben (Hinweis: Nach dem Set 20 ist die maximale Anzahl der Sets erreicht. Neue Sets werden nur so lange eröffnet, solange es Cubes gibt, die eine positiven Nutzen bringen und in das Limit passen oder die Anzahl der maximalen Sets erreicht ist. Deshalb werden keine neuen Sets mehr eröffnet) Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2:0 1:2 2:2 2 0:3 3 1:4 4 2:3 5 0:5 6 1:3 2:3 7 1:3 0:5 8 1:3 0:3 9 1:3 2:4 10 1:3 1:4 0:3 11 1:3 1:4 1:2 12 1:3 1:4 0:5 13 1:3 1:4 0:0 14 1:3 1:4 2:0 0:5 15 1:3 1:4 2:0 0:0 16 1:3 1:4 2:0 2:2 17 1:3 1:4 2:0 1:5 18 1:3 1:4 2:0 1:2 1:5 19 1:3 1:4 2:0 1:2 2:4 20 1:3 1:4 2:0 1:2 3:2 Costs Abbildung 58: Schritt 10 der Heuristik nach Thomas ACHS Damit ist die Aufbauphase der Sets abgeschlossen und es erfolgt die Berechnungsphase für das aktuelle und alle folgenden Sets. Im Moment befinden wir uns noch im Set 1 und suchen den nächsten Cube, welcher den besten Beitrag bringt und in die Limits passt. Dieser ist 2:4. 11. Schritt: Finde nächsten Cube im aktuellen Set (1) Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2:0 1:2 2:2 2:4 2 0:3 3 1:4 4 2:3 5 0:5 6 1:3 2:3 7 1:3 0:5 8 1:3 0:3 9 1:3 2:4 10 1:3 1:4 0:3 11 1:3 1:4 1:2 12 1:3 1:4 0:5 13 1:3 1:4 0:0 14 1:3 1:4 2:0 0:5 15 1:3 1:4 2:0 0:0 16 1:3 1:4 2:0 2:2 17 1:3 1:4 2:0 1:5 18 1:3 1:4 2:0 1:2 1:5 19 1:3 1:4 2:0 1:2 2:4 20 1:3 1:4 2:0 1:2 3:2 Costs Abbildung 59: Schritt 11 der Heuristik nach Thomas ACHS - 141 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Im Schritt 12 finden wir den Cube 2:3 als siebenten Cube des Sets 1, welcher den höchsten positiven Beitrag zu Kostenverringerung bringt und in die Limits passt. 12. Schritt: Finde nächsten Cube im aktuellen Set (1) Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2:0 1:2 2:2 2:4 2:3 2 0:3 3 1:4 4 2:3 5 0:5 6 1:3 2:3 7 1:3 0:5 8 1:3 0:3 9 1:3 2:4 10 1:3 1:4 0:3 11 1:3 1:4 1:2 12 1:3 1:4 0:5 13 1:3 1:4 0:0 14 1:3 1:4 2:0 0:5 15 1:3 1:4 2:0 0:0 16 1:3 1:4 2:0 2:2 17 1:3 1:4 2:0 1:5 18 1:3 1:4 2:0 1:2 1:5 19 1:3 1:4 2:0 1:2 2:4 20 1:3 1:4 2:0 1:2 3:2 Costs Abbildung 60: Schritt 12 der Heuristik nach Thomas ACHS Nach dem Zusetzen des siebenten Cubes findet sich kein Cube mehr, welcher einen positiven Beitrag bringt und in die Limits passt. Deshalb wird das Set 1 als abgeschlossen betrachtet und der Fokus auf das Set 2 gelegt. 13. Schritt:Limit im Set 1 erreicht. Setze den Setcounter+1 (=2). Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2:0 1:2 2:2 2:4 2:3 2 0:3 3 1:4 4 2:3 5 0:5 6 1:3 2:3 7 1:3 0:5 8 1:3 0:3 9 1:3 2:4 10 1:3 1:4 0:3 11 1:3 1:4 1:2 12 1:3 1:4 0:5 13 1:3 1:4 0:0 14 1:3 1:4 2:0 0:5 15 1:3 1:4 2:0 0:0 16 1:3 1:4 2:0 2:2 17 1:3 1:4 2:0 1:5 18 1:3 1:4 2:0 1:2 1:5 19 1:3 1:4 2:0 1:2 2:4 20 1:3 1:4 2:0 1:2 3:2 Costs Abbildung 61: Schritt 13 der Heuristik nach Thomas ACHS Da nun das Set 2 den Fokus hat, wird analog zum Set 1 immer der beste Cube zugesetzt, welcher in die Limits passt. - 142 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 14. Schritt:Berechne das noch vorhandene Limit nach der Berücksichtigung der bereits im neuen Set enthaltenen Cubes und starte die Iteration des neuen Sets. Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2:0 1:2 2:2 2:4 2:3 2 0:3 3 1:4 4 2:3 5 0:5 6 1:3 2:3 7 1:3 0:5 8 1:3 0:3 9 1:3 2:4 10 1:3 1:4 0:3 11 1:3 1:4 1:2 12 1:3 1:4 0:5 13 1:3 1:4 0:0 14 1:3 1:4 2:0 0:5 15 1:3 1:4 2:0 0:0 16 1:3 1:4 2:0 2:2 17 1:3 1:4 2:0 1:5 18 1:3 1:4 2:0 1:2 1:5 19 1:3 1:4 2:0 1:2 2:4 20 1:3 1:4 2:0 1:2 3:2 Costs Abbildung 62: Schritt 14 der Heuristik nach Thomas ACHS Dies wird so lange durchgeführt bis kein Cube mehr dem Set 2 zugesetzt werden kann und der Fokus wandert auf das Set 3 usw. 15. Schritt: Finde nächsten Cube im aktuellen Set (2) Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2:0 1:2 2:2 2:4 2:3 2 0:3 1:3 3 1:4 4 2:3 5 0:5 6 1:3 2:3 7 1:3 0:5 8 1:3 0:3 9 1:3 2:4 10 1:3 1:4 0:3 11 1:3 1:4 1:2 12 1:3 1:4 0:5 13 1:3 1:4 0:0 14 1:3 1:4 2:0 0:5 15 1:3 1:4 2:0 0:0 16 1:3 1:4 2:0 2:2 17 1:3 1:4 2:0 1:5 18 1:3 1:4 2:0 1:2 1:5 19 1:3 1:4 2:0 1:2 2:4 20 1:3 1:4 2:0 1:2 3:2 Costs Abbildung 63: Schritt 15 der Heuristik nach Thomas ACHS Im Schritt 95 sehen wir das bereits fast vollendete Lösungsgitter der Sets 1 bis 20. Das Set 20 wird im Schritt 97 endgültig abgeschlossen. - 143 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 95. Schritt: Finde nächsten Cube im aktuellen Set (20) Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2:0 1:2 2:2 2:4 2:3 2 0:3 1:3 1:4 2:0 1:2 2:4 2:3 3 1:4 1:3 2:3 2:0 1:2 2:2 2:4 4 2:3 1:3 1:4 2:0 1:2 2:2 2:4 5 0:5 1:3 1:4 2:0 2:2 2:4 2:3 6 1:3 2:3 0:3 1:4 2:0 1:2 2:4 7 1:3 0:5 1:4 2:0 2:2 2:4 2:3 8 1:3 0:3 1:4 2:0 1:2 2:4 2:3 9 1:3 2:4 2:3 2:0 1:2 2:2 10 1:3 1:4 0:3 2:3 2:0 1:2 2:4 11 1:3 1:4 1:2 2:0 2:2 2:4 2:3 12 1:3 1:4 0:5 2:3 0:3 2:0 2:4 13 1:3 1:4 0:0 2:0 2:4 2:3 14 1:3 1:4 2:0 0:5 2:3 2:4 2:2 15 1:3 1:4 2:0 0:0 1:0 2:4 2:3 16 1:3 1:4 2:0 2:2 1:2 2:4 2:3 17 1:3 1:4 2:0 1:5 2:4 1:2 2:3 18 1:3 1:4 2:0 1:2 1:5 2:4 2:3 19 1:3 1:4 2:0 1:2 2:4 2:2 2:3 20 1:3 1:4 2:0 1:2 2:4 2:2 Costs Abbildung 64: Schritt 95 der Heuristik nach Thomas ACHS 96. Schritt: Finde nächsten Cube im aktuellen Set (20) Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2:0 1:2 2:2 2:4 2:3 2 0:3 1:3 1:4 2:0 1:2 2:4 2:3 3 1:4 1:3 2:3 2:0 1:2 2:2 2:4 4 2:3 1:3 1:4 2:0 1:2 2:2 2:4 5 0:5 1:3 1:4 2:0 2:2 2:4 2:3 6 1:3 2:3 0:3 1:4 2:0 1:2 2:4 7 1:3 0:5 1:4 2:0 2:2 2:4 2:3 8 1:3 0:3 1:4 2:0 1:2 2:4 2:3 9 1:3 2:4 2:3 2:0 1:2 2:2 10 1:3 1:4 0:3 2:3 2:0 1:2 2:4 11 1:3 1:4 1:2 2:0 2:2 2:4 2:3 12 1:3 1:4 0:5 2:3 0:3 2:0 2:4 13 1:3 1:4 0:0 2:0 2:4 2:3 14 1:3 1:4 2:0 0:5 2:3 2:4 2:2 15 1:3 1:4 2:0 0:0 1:0 2:4 2:3 16 1:3 1:4 2:0 2:2 1:2 2:4 2:3 17 1:3 1:4 2:0 1:5 2:4 1:2 2:3 18 1:3 1:4 2:0 1:2 1:5 2:4 2:3 19 1:3 1:4 2:0 1:2 2:4 2:2 2:3 20 1:3 1:4 2:0 1:2 3:2 2:4 2:3 Costs Abbildung 65: Schritt 96 der Heuristik nach Thomas ACHS - 144 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 97. Schritt:Limit im Set 20 erreicht. Setze den Setcounter+1 (=21). Setcounter überschreitet die Anzahl der Sets (Setcount). Deshalb beende die Iterationsphase. Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 1 1:3 1:4 2:0 1:2 2:2 2:4 2:3 2 0:3 1:3 1:4 2:0 1:2 2:4 2:3 3 1:4 1:3 2:3 2:0 1:2 2:2 2:4 4 2:3 1:3 1:4 2:0 1:2 2:2 2:4 5 0:5 1:3 1:4 2:0 2:2 2:4 2:3 6 1:3 2:3 0:3 1:4 2:0 1:2 2:4 7 1:3 0:5 1:4 2:0 2:2 2:4 2:3 8 1:3 0:3 1:4 2:0 1:2 2:4 2:3 9 1:3 2:4 2:3 2:0 1:2 2:2 10 1:3 1:4 0:3 2:3 2:0 1:2 2:4 11 1:3 1:4 1:2 2:0 2:2 2:4 2:3 12 1:3 1:4 0:5 2:3 0:3 2:0 2:4 13 1:3 1:4 0:0 2:0 2:4 2:3 14 1:3 1:4 2:0 0:5 2:3 2:4 2:2 15 1:3 1:4 2:0 0:0 1:0 2:4 2:3 16 1:3 1:4 2:0 2:2 1:2 2:4 2:3 17 1:3 1:4 2:0 1:5 2:4 1:2 2:3 18 1:3 1:4 2:0 1:2 1:5 2:4 2:3 19 1:3 1:4 2:0 1:2 2:4 2:2 2:3 20 1:3 1:4 2:0 1:2 2:4 2:2 2:3 Costs Abbildung 66: Schritt 97 der Heuristik nach Thomas ACHS Nachdem alle Sets im Schritt 97 abgeschlossen sind, erfolgt die Kostenberechnung für jedes Set separat. Dabei wird die Materialisierungsreihenfolge der Cubes entsprechend eine kostenminimalen Materialisierung berechnet. Deshalb haben auch das Set 1, 3 , 4, 11, 16 und 19 die gleichen Kosten, da es sich im Prinzip um die gleiche Menge an Cubes handelt, nur in unterschiedlicher Reihenfolge. Die Heuristik berechnet aber die Kosten immer in der Reihenfolge der minimalen Materialisierungskosten einer Menge. Aus diesem Grund müssen die gleichen Kosten entstehen. - 145 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 98. Berechne die Kosten für jedes Set. Diese bestehen aus den Materialisierungskosten pro Set und den Abfragekosten der Required Cubes beeinflusst durch die Auswahl des Sets. Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 Costs 1 1:3 1:4 2:0 1:2 2:2 2:4 2:3 155.136,00 2 0:3 1:3 1:4 2:0 1:2 2:4 2:3 561.381,00 3 1:4 1:3 2:3 2:0 1:2 2:2 2:4 155.136,00 4 2:3 1:3 1:4 2:0 1:2 2:2 2:4 155.136,00 5 0:5 1:3 1:4 2:0 2:2 2:4 2:3 484.339,00 6 1:3 2:3 0:3 1:4 2:0 1:2 2:4 561.381,00 7 1:3 0:5 1:4 2:0 2:2 2:4 2:3 484.339,00 8 1:3 0:3 1:4 2:0 1:2 2:4 2:3 561.381,00 9 1:3 2:4 2:3 2:0 1:2 2:2 135.898,00 10 1:3 1:4 0:3 2:3 2:0 1:2 2:4 561.381,00 11 1:3 1:4 1:2 2:0 2:2 2:4 2:3 155.136,00 12 1:3 1:4 0:5 2:3 0:3 2:0 2:4 966.857,00 13 1:3 1:4 0:0 2:0 2:4 2:3 1.483.283,00 14 1:3 1:4 2:0 0:5 2:3 2:4 2:2 484.339,00 15 1:3 1:4 2:0 0:0 1:0 2:4 2:3 1.478.603,00 16 1:3 1:4 2:0 2:2 1:2 2:4 2:3 155.136,00 17 1:3 1:4 2:0 1:5 2:4 1:2 2:3 333.905,00 18 1:3 1:4 2:0 1:2 1:5 2:4 2:3 333.905,00 19 1:3 1:4 2:0 1:2 2:4 2:2 2:3 155.136,00 20 1:3 1:4 2:0 1:2 3:2 2:4 2:3 468.248,00 Abbildung 67: Schritt 98 der Heuristik nach Thomas ACHS Anschließend wird das Set mit den minimalen Kosten materialisiert. Dieses ist in unserem Beispiel das Set 9 mit den minimalen Kosten von 135898. 99. Wähle das kostengünstigste Set und materialisiere das Set. Set Cube1 Cube2 Cube3 Cube4 Cube5 Cube6 Cube7 Costs 1 1:3 1:4 2:0 1:2 2:2 2:4 2:3 155.136,00 2 0:3 1:3 1:4 2:0 1:2 2:4 2:3 561.381,00 3 1:4 1:3 2:3 2:0 1:2 2:2 2:4 155.136,00 4 2:3 1:3 1:4 2:0 1:2 2:2 2:4 155.136,00 5 0:5 1:3 1:4 2:0 2:2 2:4 2:3 484.339,00 6 1:3 2:3 0:3 1:4 2:0 1:2 2:4 561.381,00 7 1:3 0:5 1:4 2:0 2:2 2:4 2:3 484.339,00 8 1:3 0:3 1:4 2:0 1:2 2:4 2:3 561.381,00 9 1:3 2:4 2:3 2:0 1:2 2:2 135.898,00 10 1:3 1:4 0:3 2:3 2:0 1:2 2:4 561.381,00 11 1:3 1:4 1:2 2:0 2:2 2:4 2:3 155.136,00 12 1:3 1:4 0:5 2:3 0:3 2:0 2:4 966.857,00 13 1:3 1:4 0:0 2:0 2:4 2:3 1.483.283,00 14 1:3 1:4 2:0 0:5 2:3 2:4 2:2 484.339,00 15 1:3 1:4 2:0 0:0 1:0 2:4 2:3 1.478.603,00 16 1:3 1:4 2:0 2:2 1:2 2:4 2:3 155.136,00 17 1:3 1:4 2:0 1:5 2:4 1:2 2:3 333.905,00 18 1:3 1:4 2:0 1:2 1:5 2:4 2:3 333.905,00 19 1:3 1:4 2:0 1:2 2:4 2:2 2:3 155.136,00 20 1:3 1:4 2:0 1:2 3:2 2:4 2:3 468.248,00 Abbildung 68: Schritt 99 der Heuristik nach Thomas ACHS - 146 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.7 DIE DETERMINISTISCHE LÖSUNG 7.7.1 MATHEMATISCHE GRUNDLAGEN Im Zuge der Bestimmung der deterministischen Lösung ist es notwendig, für alle möglichen Mengen von materialisieren Cubes die Kosten zu berechnen und die Menge auszuwählen, welche die geringsten Kosten hat. Dabei spielt die Rangfolge der materialisierten Cubes in der Menge eine Rolle. Spielt die Anordnung der Elemente in einer Menge eine Rolle, nennt man diese eine Folge [vgl. Witt (2001) S. 137]. Wenn der Cube a vor dem Cube b materialisiert wurde und b ein Derivative von a ist, die Materialisierungskosten für die Folge < a ,b > geringer sind als die Materialisierungskosten < b,a >. Das führt dazu, dass die Materialisierungssequenz von enormer Bedeutung sein kann. 7.7.1.1 PERMUTATION Wir betrachten dabei die Auswahl von Folgen, in denen ein Element höchstens einmal vorkommen darf. Dies ist schlüssig, da ein Würfel nur einmal materialisiert werden kann. Bei dieser speziellen Art der Permutation spricht man von der Permutation ohne Wiederholung [vgl. Witt (2001) S. 137]. Sei M eine Menge mit M = n und k ∈ N 0n . Ein k-Permutation von M ist eine Folge < x1 ,..., xk > mit xi ∈ M und xi ≠ x j für i ≠ j , mit 1 ≤ i, j ≤ k . Weiters sei P(n, k ) die Anzahl der k-Permutationen, die aus n-elementigen Menge gebildet werden kann. n k −1 i = n − k +1 i =0 P (n, k ) = n(n − 1)(n − 2)...(n − k + 1) = ∏ i = ∏ (n − i ) = n! (n − k )! [vgl. Witt (2001) S. 137f] 7.7.1.2 KOMBINATION Im Gegensatz zur Permutation spielt bei der Kombination die Reihenfolge der Elemente in der Menge keine Rolle. Wir gehen wieder von der Kombination ohne Wiederholung aus, was bedeutet, dass jedes Element in der Menge nur einmal vorkommt. Sei M eine Menge mit M = n und k ∈ N 0n . Ein k-Kombination von M ist eine Teilmenge von M mit k Elementen. Weiters sei K (n, k ) die Anzahl der kKombinationen, die aus der Menge M gebildet werden können. K ( n, k ) = n! k!*(n − k )! - 147 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN [vgl. Witt (2001) S. 141f] 7.7.2 DER ALGORITHMUS FÜR DIE PERMUTATION {1. Vorbereitungen für die Permutation} Erzeuge Menge R der Required Cubes Erzeuge Menge P der Possible Cubes, welche die Menge der nicht redundanten Würfel umfasst und gib jedem Würfel einen Nummer. Erzeuge Countliste (array of longint) als die Teilmenge der Menge P mit den Nummern der Possible Cubes. anzcube=count(P) //Gibt die Anzahl der Elemente in der Menge P der Possible Cubes an. Alwaysspacemaxreached=true//Abbruchbedingung Cubepos=1 maxpos=0 aktpos=0 {Ende 1. Vorbereitungen für die Permutation} if (anzcube>0) then begin {2. Beginn der Permutationsschleife} ende=false While (ende=false) do begin {2.1. Beginn der Unterpermutationsschleife für den letzten Zähler} Repeat if (Cubepos>anzcube) then begin {2.1.1 Wenn in der aktuellen Cursorposition das Maximum erreicht ist} - 148 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Cubepos=1 Countliste[aktpos]=cubepos; aktpos=aktpos+1 if aktpos>maxpos then maxpos=aktpos if aktpos<anzcube then begin repeat; if cubepos>anzcube then begin if cubepos>anzcube then begin cubepos=1 Countliste[aktpos]:=cubepos aktpos=aktpos+1 if aktpos>maxpos then maxpos=aktpos end; if Countliste[aktpos]=0 then begin //Neue Zählung if Alwaysspacemaxreached=true then ende=true // Wenn alle Cubes dieses Durchlaufs z.B. 8 Cubes das Speichermax überschritten haben hat es keinen Sinn auch noch 9 Cubes zu kontrollieren. Alwaysspacemaxreached=true cubepos=1 Countliste[aktpos]=Cubepos end else begin //Springe auf gespeicherte Position Countliste[aktpos]= Countliste[aktpos]+1 Cubepos=Countliste[aktpos] end until (Cubepos<=anzcube); if (Cubepos<>anzcube) then begin //Setze den Zähler ganz links auf 0 - 149 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Cubepos=1 aktpos:=0 Countliste[aktpos]=Cubepos end //Ende if (cubepos<>anzcube) end //Ende if aktpos<anzcube else begin ende=true end {Ende 2.1.1 Wenn in der aktuellen Cursorposition das Maximum erreicht ist} end // Ende von if (Cubepos>anzcube) else begin // Beginn von if (Cubepos>anzcube)=false {2.1.2 Wenn in der aktuellen Cursorposition das Maximum nicht erreicht} aktpos=0; istok=true //Feststellen,ob jedes Element in der Folge nur einmal vorkommt for zahler:=0 to maxpos do begin //Es wird von der Position bis zum Ende kontrolliert da die ersten Positionen schon verglichen wurden for zahler2:=zahler to maxpos do begin if ((zahler2<>zahler)and (Countliste[zahler2]=Countliste[zahler])) then istok=false end // von for zahler2 end // von for zahler if istok=true then begin - 150 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Spaceleft=spaceleft(Countliste) //Feststellen des Speicherplatzes nach der Materialisierung vom Countliste Spaceleftfirstcubes= spaceleft(Countliste[0..maxpos-1]) //Berechnen von spacemax von allen Würfeln ausser dem aktuellen Würfel. Das heißt bei z.B. 8 Cubes wird nur der spaceleft von Cube 1 bis 7 berechnet if Spaceleftfirstcubes<0 then begin //Ist der Speicherplatz der Sequenz von z.B. Cube 1 bis 7 erschöpft, macht es keinen Sinn alle 8 Cubes durchzukontrollieren. if aktpos=0 then begin Countliste[0]=anzcube-1 end end If (spaceleft>0) then begin Alwaysspacemaxreached=false kostenmerk= KostenfuerSetberechnen(Countliste) if (kostenmerk>0) then begin if (kostenmerk<Mincosts) or (Mincosts=0) then begin Mincosts=kostenmerk /Merke die minimalen Kosten MinCountliste=Countliste //Merke die Teilmenge Spaceleft=spaceleft(Countliste) //Merke den Speicherplatz, welcher nach der Materialisierung der Countliste bleibt timeleft=timeleft(Countliste) //Merke die Zeit, welche nach dem Materialisieren der Countliste noch bleibt. End //Ende von (kostenmerk<Mincosts) or (Mincosts=0) End //Ende von if (kostenmerk>0) - 151 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN End//Ende von If (spaceleft>0) end //Ende von istok Cubepos=Cubepos+1 Countliste[aktpos]=Cubepos {Ende 2.1.2 Wenn in der aktuellen Cursorposition das Maximum nicht erreicht ist} end //Ende von if (Cubepos>anzcube)=false until (Cubepos>anzcube) {Ende 2.1. Ende der Unterpermutationsschleife für den letzten Zähler} End; {Ende 2. Beginn der Permutationsschleife} End //von if (anzcube>0) 7.7.3 DER ALGORITHMUS FÜR DIE KOMBINATION {1. Vorbereitungen für die Kombination} Erzeuge Menge R der Required Cubes Erzeuge Menge P der Possible Cubes, welche die Menge der nicht redundanten Würfel umfasst und gib jedem Würfel einen Nummer. Erzeuge Countliste (array of longint) als die Teilmenge der Menge P mit den Nummern der Possible Cubes. Mincosts=0 anzcube=count(P) //Gibt die Anzahl der Elemente in der Menge P der Possible Cubes an. - 152 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN {Ende 1. Vorbereitungen für die Kombination} {2. Algorithmus für die Kombination} lang=0 //gibt den aktuellen Wert für k (Anzahl der Kombinationen an – lang=k-1) Countliste[0]=1; //Startwert für die Kombination ist der Cube 1 Ende=false; //Abbruchwert {2.2. Laufe durch die Kombination bis ende=true} repeat; alwaysspacemaxreached:=true; //Wenn alle Kombinationen von z.B. 7 Cubes das Speicherlimit überschreiten, wird auch eine Kombination von 8 Cubes den Speicherwert jedenfalls überschreiten. Darum Abbruch bei alwaysspacemaxreached. aktpos=0 //Gibt den Cursor auf das erste Element der Countliste istok=true {2.2.1 Durchlaufe alle Kombinationen mit dem aktuellen lang Wert} repeat //(neuespalte=true)or(ende=true) neuespalte=false {2.2.1.1 Istok=true} if (istok=true) then begin Spaceleft=spaceleft(Countliste) //Feststellen des Speicherplatzes nach der Materialisierung vom Countliste Spaceleftfirstcubes= spaceleft(Countliste[0..maxpos-1]) //Berechnen von spacemax von allen Würfeln ausser dem aktuellen Würfel. Das heißt bei z.B. 8 Cubes wird nur der spaceleft von Cube 1 bis 7 berechnet - 153 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if Spaceleftfirstcubes<0 then begin //Ist der Speicherplatz der Sequenz von z.B. Cube 1 bis 7 erschöpft, macht es keinen Sinn alle 8 Cubes durchzukontrollieren. if aktpos=0 then Countliste[aktpos]=anzcube end If (spaceleft>0) then begin Alwaysspacemaxreached=false Getrightorder(Countliste) //Stelle die kostenminimale Reihenfolge der Cubes mit einem abwandelten Algorithmus von Dijkstra her kostenmerk= KostenfuerSetberechnen(Countliste) if (kostenmerk>0) then begin if (kostenmerk<Mincosts) or (Mincosts=0) then begin Mincosts=kostenmerk /Merke die minimalen Kosten MinCountliste=Countliste //Merke die Teilmenge Spaceleft=spaceleft(Countliste) //Merke den Speicherplatz, welcher nach der Materialisierung der Countliste bleibt timeleft=timeleft(Countliste) //Merke die Zeit, welche nach dem Materialisieren der Countliste noch bleibt End //Ende von (kostenmerk<Mincosts) or (Mincosts=0) End //Ende von if (kostenmerk>0) End//Ende von If (spaceleft>0) End //Ende von if (istok=true) {Ende 2.2.1.1 Istok=true} {2.2.1.2. Ist in der aktuellen Position (aktpos) das Maximum erreicht oder nicht} - 154 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if countliste[aktpos]>=(anzcube-aktpos) then begin {2.2.1.2.1 Setze alle cubes vom aktpos und kleiner auf 1} Countliste[aktpos]=1 x=aktpos repeat Countliste[x]=1 x=x-1; until x=-1 {Ende 2.2.1.2.1 Setze alle cubes vom aktpos und kleiner auf 1} aktpos=aktpos+1 if countliste[aktpos]=0 then neuespalte=true Countliste[aktpos]:=countliste[aktpos]+1 {2.2.1.2.2. Finde den nächsten Cube, welcher nicht das Maximum hat} repeat; if Countliste[aktpos]>(anzcube-aktpos) then begin aktpos=aktpos+1 if (aktpos>anzcube) then begin aktpos=anzcube ende=true end if Countliste[aktpos]=0 then neuespalte=true Countliste[aktpos]= Countliste[aktpos]+1 end until (Countliste[aktpos]<=(anzcubeaktpos))or(ende=true); {Ende 2.2.1.2.2. Finde den nächsten Cube, welcher nicht das Maximum hat} {2.2.1.2.3.Feststellen, ob alle links richtig sind - 155 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN x=aktpos-1 istok=true repeat if x>=0 then begin Countliste[x]=Countliste[x+1]+1 end x=x-1 until x<0; {Ende 2.2.1.2.3.Feststellen, ob alle links richtig sind aktpos=0 End //Ende von if countliste[aktpos]>=(anzcubeaktpos) else begin Countliste[aktpos]=countliste[aktpos]+1 aktpos=0 end {Ende 2.2.1.2. Ist in der aktuellen Position (aktpos) das Maximum erreicht oder nicht} until (neuespalte=true)or(ende=true) {Ende 2.2.1. Durchlaufe alle Kombinationen mit dem aktuellen lang Wert} if alwaysspacemaxreached=true then ende=true lang=lang+1 until (ende=true)or(lang>anzcube) {Ende 2.2. Laufe durch die Kombination bis ende=true} 7.7.4 DER ALGORITHMUS DER FUNKTION GETRIGHTORDER Cost x = ∑ max{0, [getbuild (min(P(z ), z ) − getbuild (x, z ))]} z∈A ( x ) Empfange Parameter Listecubes als Menge der zu materialisierten und zu ordnenden Cubes - 156 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Definiere die Knoten mittels Knotendeklationszeiger= ^Knotendeklaration als Zeiger auf ein Record Knotendeklaration = record Knoten:longint; spalte:longint; zeile:longint; MaxAbstand:Extended; Parent:longint; end; Definiere Randknoten als Menge von Knoten Definiere Innere_Knoten als Menge von Knoten {1. Erzeuge die Menge der Randknoten und berechne die Kosten} for zahler:=0 to Listecubes.Count-1 do begin //Die Cubes können nur aus dem BFT erzeugt werden Kostengewinn:=0; for zahler2:=0 to Listecubes.count-1 do begin if (isderivat(Listecubes[zahler].spalte, Listecubes[zahler].zeile, Listecubes[zahler2].spalte, Listecubes[zahler2].zeile)=true) then begin //Der Kostengewinn ergibt sich daraus, dass sich die Derivative zahler2 in Zukunft aus dem Cube zahler ableiten lässen. Kostengewinn=Kostengewinn+ (//Da noch kein Würfel materialisiert wurde, werden alle vom BFT erzeugt max(0,getbuild(-1,-1, Listecubes[zahler2].spalte, Listecubes[zahler2].zeile))getbuild(Listecubes[zahler].spalte, Listecubes[zahler].zeile), Listecubes[zahler2].spalte, Listecubes[zahler2].zeile))) - 157 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; //isderivat(… end // von zahler2 //Erzeugen und Speichern des Cube New(Knoten) Knoten^.Knoten=zahler; Knoten^.MaxAbstand=Kostengewinn; Knoten^.Parent=-1; Knoten^.spalte= Listecubes[zahler].spalte Knoten^.zeile= Listecubes[zahler].zeile Randknoten.Add(Knoten); end; {Ende 1. Erzeuge die Menge der Randknoten und berechne die Kosten} {2. Durchlaufen der Randknoten bis die Menge der Randknoten leer ist und alle Knoten in der Menge der Innere_Knoten sind.} repeat { 2.1.Feststellen des neuen Randknotens mit dem minmalen Abstand und Überstellen dieses Knotens von den Randknoten zu den Inneren Knoten} zahlermerk:=-1;costmerk:=0; for zahler=0 to Randknoten.Count-1 do begin Knoten= Randknoten.Items[zahler] if (Knoten^.MaxAbstand>costmerk) or(zahlermerk=-1) then begin zahlermerk=zahler costmerk:=Knoten^.MaxAbstand; end; end; //Zusetzen des Würfels zu Inneren Knoten - 158 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Knotenmerk=Randknoten.Items[zahlermerk]; Innere_Knoten.Add(Knotenmerk); Randknoten.Delete(zahlermerk); {Ende 2.1.Feststellen des neuen Randknotens und Überstellen dieses Knotens von den Randknoten zu den Inneren Knoten} if Randknoten.Count>0 then begin {2.2. Durchlaufe die aktuelle Menge der Randknoten} for zahler=0 to Randknoten.count-1 do begin Knoten= Randknoten.items[zahler]; {2.2.1 Stelle fest, ob die Randknoten Derivative von dem neuen Inneren Knoten sind. Wenn ja und die Kosten sind geringer als die vom BFT, dann ändere Kosten. Ist jedoch der neue Innere Cube ein Derivative von dem Randknoten, müssen die Kosten neu berechnet werden.} if (isderivat(Knotenmerk^.spalte,Knotenmerk^.zeile, Knoten^.spalte,Knoten^.zeile)=true) or (isderivat(Knoten^.spalte,Knoten^.zeile, Knotenmerk^.spalte,Knotenmerk^.zeile)=true) then begin {2.2.1.1 Durchlaufe alle Randknoten und suche Parent} Kostengewinn:=0; for zahler2:=0 to Randknoten.Count-1 do begin Knoten2:=Randknoten.Items[zahler2] //Stelle fest, ob dieser Randknoten ein Derivat ist if (isderivat(Knoten^.spalte,Knoten^.zeile, Knoten2^.spalte,Knoten2.zeile)=true) and(Knoten^.Knoten<>Knoten2^.Knoten) then begin //Finde das Kostenminimale Parent von Knoten2 Parentvonderivat=-1 Parentvonderivatcostmerk:=getbuild(-1,-1, Knoten2.spalte,Knoten2^.zeile) for zahler3:=0 to Innere_Knoten.count-1 do begin - 159 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Knoten3:=Innere_Knoten.Items[zahler3] if (isderivat(Knoten3^.spalte,Knoten3^.zeile, Knoten2^.spalte,Knoten2^.zeile)=true)and (Knoten3^.Knoten<>Knotenmerk^.Knoten)and (Knoten3^.Knoten<>Knotenmerk^.Knoten)then begin costmerk:=getbuild(Knoten3^.spalte, Knoten3^.zeile, Knoten2^.spalte, Knoten2^.zeile) if (costmerk<Parentvonderivatcostmerk) then begin Parentvonderivat=zahler3 Parentvonderivatcostmerk=costmerk end //von costmerk<parentvorderivatcostmerk end //isderivat end //von Zahler3 if parentvonderivat<>-1 then begin Knoten3:=Innere_Knoten.Items[parentvonderivat] Kostengewinn:=Kostengewinn+max(0,(( getbuild(Knoten3^.spalte, Knoten3^.zeile, Knoten2^.spalte, Knoten2^.zeile) getbuild(Knoten^.spalte, Knoten^.zeile, Knoten2^.spalte, Knoten2^.zeile)))) end else begin Kostengewinn:=Kostengewinn+max(0,((getbuild(-1,1, Knoten2^.spalte, Knoten2^.zeile)getbuild(Knoten^.spalte, Knoten^.zeile, Knoten2^.spalte, Knoten2^.zeile)))) end; end;//End von isderivative end //zahler2 {Ende 2.2.1.1 Durchlaufe alle Randknoten und suche Parent} end //isdervative {Ende 2.2.1 Stelle fest, ob die Randknoten Derivative von dem neuen Inneren Knoten sind. Wenn ja und die Kosten sind geringer als die vom BFT, dann ändere Kosten. Ist jedoch - 160 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN der neue Innere Cube ein Derivative von dem Randknoten, müssen die Kosten neu berechnet werden} end //zahler {Ende 2.2. Durchlaufe die aktuelle Menge der Randknoten} end // Ende von Randknoten.count>0 until Randknoten.Count=0 {Ende 2. Durchlaufen der Randknoten bis die Menge der Randknoten leer ist und alle Knoten in der Menge der Innere_Knoten sind.} {3. Übergebe die Sequenz der Inneren Randknoten} Result:=Innere_Randknoten {Ende 3. Übergebe die Sequenz der Inneren Randknoten} 7.7.5 DER ALGORITHMUS DER FUNKTION KOSTENFUERSETBERECHNEN Diese Funktion berechnet die Kosten eines an die Funktion übergebenen Menge von Materialisierten Würfel und einer an die Funktion übergebenen Menge von Required Cubes. Dabei werden die Materialisierungs- und die Abfragekosten berechnet und zurückgegeben. Wird das Zeitlimit der Materialisierung überschritten, wird als Wert 0 zurückgeben. Empfange Parameter MatCubes als Menge der zu materialiserten Cubes Empfange Parameter ReqCubes als Menge der required Cubes {1. Feststellen, ob die Cubes die Spacemaxbedingung erfüllen} spaceleft=calculatespacemaxof(Countliste) timeleft=Maxavailabletime {Ende 1. Feststellen, ob die Cubes die Spacemaxbedingung erfüllen} - 161 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if spaceleft>0 then begin {2. Kosten berechnen} SummeKosten=0 {2.1 Ersten Cube zusetzen} aktspalte=MemoryCubes[Countliste[0]].spalte //Spaltenwert des ersten Cubes aktzeile=MemoryCubes[Countliste[0]].zeile //Zeilenwert des ersten Cubes newcosts=getbuild(-1,-1,aktspalte,aktzeile) //Der erste Cube wird aus dem BFT (-1,-1) erzeugt. Deshalb sind die newcosts gleich den Materialisierungskosten aus dem BFT SummeKosten=SummeKosten+newcosts Memorywuerfel.Add(aktspalte,aktzeile) timemax=timemax-newcosts //Vermindere Timemax um die Materialisierungszeit des ersten Cube {Ende 2.1 Ersten Cube zusetzen} {2.2 Weitere Cubes zusetzen} for x= 1 to Maxpos do begin aktspalte:=MemoryCubes[Countliste[x]].spalte; aktzeile:=MemoryCubes[Countliste[x]].zeile; {2.2.1 Kann der Cube aus einem bereits materialisierten Cube abgeleitet werden} if isderivatof(Memorywuerfel)=true then begin newminderivatspalte:=GetMinDerivatOfSpalte(aktspa lte,aktzeile) newminderivatzeile:=GetMinDerivatOfZeile(aktspalt e, aktzeile) newcosts=getbuild(newminderivatspalte, newminderivatzeile,aktspalte,aktzeile); SummeKosten=SummeKosten+newcosts Memorywuerfel.Add(aktspalte,aktzeile); timemax:=timemax-newcosts - 162 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end {Ende 2.2.1 Kann der Cube aus einem bereits materialisierten Cube abgeleitet werden} {2.2.2 Der Cube kann nicht aus einem bereits materialisierten Cube abgeleitet werden} else begin newcosts=getbuild(-1,-1,aktspalte,aktzeile) SummeKosten=SummeKosten+newcosts Memorywuerfel.Add(aktspalte,aktzeile); timemax:=timemax-newcosts end {Ende 2.2.2 Der Cube kann nicht aus einem bereits materialisierten Cube abgeleitet werden} end //Ende von for x=1 … {Ende 2.2 Weitere Cubes zusetzen} {2.3 Berechnen der Kosten für die Abfragen aller Required Cubes} for zahler=0 to MemoryReqCubescount.count-1 do begin spalte=MemoryReqCubes[zahler].spalte zeile=MemoryReqCubes[zahler].zeile {2.3.1. Wenn der Cube aus den materialisierten Cubes abgefragt werden kann} if isderivatof(Memorywuerfel)=true then begin newminderivatspalte= GetMinDerivatOfSpalte(spalte,zeile) newminderivatzeile= GetMinDerivatOfZeile(spalte,zeile) newcosts= ((getquery( newminderivatspalte, newminderivatzeile, spalte, zeile)) *APA[spalte,zeile].gewicht);//Häufigkeit der Abfrage (globale Variable APA) SummeKosten=SummeKosten+newcosts end {Ende 2.3.1. Wenn der Cube aus den materialisierten Cubes abgefragt werden kann} {2.3.2. Wenn der Cube nur aus dem BFT abgefragt werden kann} - 163 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN else begin newcosts=((getquery(-1,-1,spalte,zeile)) *APA[spalte,zeile].gewicht) //Häufigkeit der Abfrage (globale Variable APA) SummeKosten=SummeKosten+newcosts End {Ende 2.3.2. Wenn der Cube nur aus dem BFT abgefragt werden kann} end; {Ende 2.3 Berechnen der Kosten für die Abfragen aller Required Cubes} {Ende 2. Kosten berechnen} if (timemax<0) then begin; Summekosten=0 end end //Ende von spacemax>0 {3. Übergeben der Kosten} Result=SummeKosten Spaceleft=spacemax //Globale Variable spaceleft Timeleft=timemax //Globale Variable timeleft {Ende 3. Übergeben der Kosten} 7.8 DIE ENTWICKLUNGSUMGEBUNG UND DIE APPLIKATION 7.8.1 AUSWAHL DER ENTWICKLUNGSUMGEBUNG Die Auswahl der Entwicklungsumgebung ging mit der Auswahl des Betriebssystems analog. Das Ziel war natürlich eine Anwendung zu gestalten, welche auf möglichst vielen Betriebssystemen lauffähig ist. Die Hauptanwenderzielgruppe sind die Studenten der Wirtschaftsuniversität Wien, welche die Anwendung in den Seminaren als Fortbildungsinstrument nutzen sollen. Da die Rechner der Wirtschaftsuniversität auf Windows laufen wurde somit ein Windowslauffähiges Programm als Mindestanforderung an die Programmierumgebung definiert. Schließlich fiel die - 164 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Entscheidung auf eine im Besitz des Autors befindliche Version vom Borland Delphi (siehe auch www.borland.com) Version 7.0 for .NET. Dieser Softwarecompilier produziert sowohl Windows lauffähige Version, als auch, über Kylix compiliert, eine Linux lauffähige Version des Programms. Zusätzlich steht die Produktion der .NET fähigen Delphi Version Octane unmittelbar bevor. Dann wäre eine Compilierung auf .NET möglich. In den ersten Versionen des Programms wurde zusätzlich eine Datenbank integriert. Allerdings ist eine Installation eines Programms mit einem Datenbanktreiber auf den Rechner der Universität nur mit Administratorrechten möglich. Deshalb wurde die Datenbank wieder entfernt und auf eine Speicherung der Daten in einfachen Datenfiles mit eigener Indexprogrammierung ausgewichen. 7.8.2 ENTWURF DER BENUTZERSCHNITTSTELLE Die Benutzerschnittstelle der Software soll in übersichtlicher Weise dem Benutzer – zumeist Studenten – die Möglichkeit bieten, das System des APA zu verstehen und ein Datawarehouse zu modellieren. Ich will dabei die wichtigsten modularen Schnittstellen kurz vorstellen. 7.8.2.1 DAS HAUPTMENU Das Hauptmenü des APA Programmes ist übersichtlich gestaltet. Die wichtigsten Unterscreens des Programmes, der Input Screen, der APA Grid Screen und APA Selection Screen werden entsprechend der logischen Abfolge im Zentrum angeordenet. Zusätzlich gibt das Hauptmenü unter dem Punkt File die Möglichkeit APAs zu laden und zu speichern. Unter dem Menupunkt Screens können alle Screens separat aufgerufen werden. Der Punkt Berechnung ermöglicht das Erstellen der Zufallskosten und einige Analysetools für das APA Grid. Im Unterpunkt Settings ist es möglich, die Optionen für das Programm und die Parameter für die Heuristik bzw. die deterministische Lösung einzustellen. Im Menüpunkt Help findet man eine ausführliche Dokumentation des Software Tools, welches unerfahrenen Benutzern beim Einstieg in die Software begleiten soll. - 165 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 69: Das Hauptmenu des APA Programmes 7.8.2.2 DIE EINGABEMASKE (INPUT SCREEN) Die Eingabemaske ermöglicht dem Benutzer das Eingeben und Ordnen der Dimension und Hierarchien. Zusätzlich werden die Key Figures eingegeben, welche für das Generieren der SQL Statements benötigt werden. Die Hierarchien werden mit der Anzahl ihrer Ausprägungen gespeichert. Dadurch können im Hintergrund Berechnungen über Tupelanzahl der einzelnen Tabellen durchgeführt werden. - 166 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 70: Der APA Input Screen 7.8.2.3 DIE PRÄSENTATIONSMASKE (APA SCREEN) Die Präsentationsmaske des APA Grid ist das umfangreichste Modul im Programm. Es erlaubt dem Benutzer nicht nur das Betrachten und Analysieren des APA, sondern auch Ausführen einer Reihe von Analysetools und Anzeigen von Hintergrundinformation. Dabei können die Funktionen über das Hauptmenü oder für zellenbasierende Funktionen über das Popup Menu aufgerufen werden. Zusätzlich sind Buttons für häufige Funktionen unter dem Hauptmenü angeordnet. - 167 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 71: Die Präsentationsmaske des APA Grid 7.8.2.4 DIE AUSWAHLMASKE DER REQUIRED CUBES (SELECTION SCREEN) Der APA Selection Screen soll den Benutzer unterstützen, die „Required Cubes“ im APA, welche für ihn interessant sind, zu finden. Dies ist besonders bei großen APAs mit zahlreichen Dimensionen und Hierarchiestufen von Bedeutung, da die Übersichtlichkeit durch Benutzen des APA Selection Screen bestehen bleibt. Zusätzlich können Roll Ups oder Drill Down über Dimensionen durchgeführt werden und in einem Eingabeschritt markiert werden. - 168 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 72: Die Auswahlmaske der Required Cubes 7.8.3 DATENMODELLIERUNG DER APPLIKATION 7.8.3.1 AUSWAHL DER DATENBANK Die Auswahl der Hauptdatenbank für die Applikation wurde auf den Vorschlag von Prof. Prosser mit Microsoft SQL fixiert. Das Ziel ist es nicht nur die Eingaben in die APA Software speichern zu können, sondern auch die CREATE TABLE Anweisungen für die BFT und Zusatztabellen (bei Fact Constellation Schema) zu generieren. Zusätzlich war mein Ansinnen jedoch, die Daten der Applikation für weitere Datenbanken (MySql, Paradox) und sogar als Textfile sichern zu können. Dies ist besonders für die weltweite Benutzung essentiell. Die Endversion des Programms wurde aber ohne eine Datenbankanbindung produziert, da die Installation der Datenbank auf der Universität nicht ohne Administratorrechte durchgeführt werden kann und das Ziel eine universell einsetzbare Anwendung im Vordergrund stand. Trotzdem sollte eine Endbenutzerversion des Programms mit eine leistungsfähigen Datenbank kombiniert werden. Dies ist besonders im vernetzten betrieblichen Einsatz notwendig, wo für den einzelnen Benutzer unterschiedliche Benutzerrechte gelten. - 169 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.8.3.2 SEMANTISCHE DATENMODELLIERUNG Die Semantische Datenmodellierung beschreibt die Daten als ER Diagramm. Das folgende ER-Diagramm soll die Grundlage der Daten in einer MS SQL Datenbank darstellen. Diese Datenbanken werden jedoch nicht von der im Anhang beschriebenen Software real verwendet, da diese im Lehrbetrieb auf der Wirtschaftsuniversität verwendet werden soll und das Anlegen von Benutzerrechten für jeden Studenten eine große administrative Aufgabenstellungen bedeuten würde. Allerdings will ich exemplarisch diese Variante durchdiskutieren. Sollte jedoch diese Software jemals zu einem Endanwenderprodukt für den Verkauf aufgewertet werden, bildete diese Datenmodellierung die Grundlage und gibt zusätzlich ein gutes demonstratives Beispiel für die klassische Datenmodellierung. - 170 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 73: ER-Diagramm für die APA Datenbank Das ER-Diagramm besteht aus einer Reihe von Entitäten und Beziehungen. Aus Gründen der besseren Übersicht und klaren Lesbarkeit wurden die Attribute in dieser Darstellung entfernt. Die Entität „Administrator“ steht mit der Entität „Benutzer“ in einer m:n Beziehung. Es soll ein Systemadministrator mehrere Benutzer bearbeiten können und ein Benutzer soll von mehreren Systemadministratoren bearbeitet werden können. Die Entität „Benutzer“ besitzt mehrere „Gitter“. Ein Benutzer kann also mehrere Data Warehouse Modelle parallel bearbeiten. Ein „Gitter“ wird aber immer nur einem Benutzer zugeordnet. - 171 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Das „Gitter“ enthält oder besteht aus vielen „Zellen“. Diese Zellen kann man sich ähnlich einer Zelle in einem Tabellenkalkulationsprogramm vorstellen. Die Entität „Zelle“ repräsentiert aber wiederum einen speziellen „Würfel“ (Cube) im multidimensionalen Data Warehouse. Wobei jede „Zelle“ immer nur einen „Würfel“ repräsentieren kann. Ein „Würfel“ hat wiederum spezifische Eigenschaften, die ihn beschreiben. Er besteht aus einer Reihe von Dimensionen, die wiederum eine bestimmte Hierarchiestufe haben. Dies wird mit der „virtuellen“ Entität „Dimension auf einer Hierarchiestufe“ ausgedrückt. Ein „Würfel“ kann sich aus mehreren Dimensionen mit einer bestimmten Hierarchiestufe zusammensetzen. Eine Dimension kann aber nur einmal in einem Würfel vorkommen. Deshalb ist die Beziehung zwischen der Entität „Würfel“ und der Entität „Dimension auf einer Hierarchiestufe“ eine 1:n Beziehung. Das „Gitter“ wird generiert aus mehreren „Dimensionen“, die wiederum mehrere „Hierarchiestufen“ haben können. Deshalb gibt es sowohl eine 1:n Beziehung zwischen der Entität „Gitter“ und „Dimensionen“, als auch zwischen der Entität „Dimensionen“ und „Hierarchiestufen“. „Dimensionen“ werden mehrmals von der Entität „Dimension auf einer Hierarchiestufe“ verwendet. Die Entität „Dimension auf einer Hierarchiestufe“ kann aber nur eine Dimension haben. Ähnlich die Situation auf der Seite der Hierarchiestufen. Die Entität „Hierarchiestufe“ kann mehrmals in der Entität „Dimension auf einer Hierarchiestufe“ verwendet werden. Die Entität „Dimension auf einer Hierarchiestufe“ hat im Namen schon enthalten, dass die Dimension nur auf einer Hierarchiestufe sein kann. Zum Entwickeln der Benutzeranforderungen wurden zusätzlich noch 3 Entitäten in das ER-Diagramm eingefügt. Die Entität „Benutzeranforderungen“ repräsentiert unterschiedliche Benutzeranforderungen einem Gitter. Dies können Finanzkennzahlen, Lagerstandsabfragen, kundenbezogene Kennzahlen, etc. sein. Diese kann der Benutzer in der Entität „Benutzeranforderungen“ separat gruppieren und übersichtlich behandeln. Natürlich soll es dem Benutzer gestattet sein mehrere Benutzeranforderungen an ein Gitter zu stellen. Deshalb ist die Beziehung zwischen der Entität „Gitter“ und der Entität „Benutzeranforderungen“ eine 1:n Beziehung. Diese Benutzeranforderungen werden jedoch in mehrere Blöcke unterteilt, die wiederum aus mehreren Detailanforderungen bestehen können. Eine beispielhafte Detailanforderung wäre „Die Kunden gruppiert nach Bundesland“ (Das würde der Dimension „Kunden“ auf der Hierarchiestufe „Bundesland“ entsprechen). Ein fertiger Block wäre z.B. „Alle Umsätze der Kunden pro Bundesland (erste Detailanforderung), aller Artikeln (zweite Detailanforderung – höchste Hierarchiestufe der Artikeln) und in der Zeitspanne pro Monat mit einem „RollUp“ bis zum Jahr (dritte Detailanforderung). - 172 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Natürlich können nur wieder Dimensionen und Hierarchien für die Detailanforderungen verwendet werden, die in der Entität „Dimensionen“ bzw. in der Entität „Hierarchiestufen“ angelegt wurden. Dies wird durch die 1:n Beziehungen zwischen „Hierarchiestufen“ und „Detailanforderungen“ und „Dimensionen“ und „Detailanforderungen“ ausgedrückt. 7.8.3.3 LOGISCHE DATENMODELLIERUNG Die Ableitung des APA Relationenmodells aus dem APA ER-Modells erfolgt analog nach der oben beschriebenen Standardvorgehensweise beim Entwickeln von relationalen Datenbanksystemen [vgl. Riordan (2000) S.149ff]. Die Entitäten wurden in Tabellen umgesetzt. Eine zusätzliche Tabelle wurde für die Beziehung zwischen Administratoren (APA_Admin) und Benutzern (APA_User) erzeugt. Die Umsetzung erfolgt mit dem Microsoft SQL 2000 Server. Auf Grund der Umsetzung des ER Diagramms enthält die Datenbank folgende Tables mit Primärschlüsseln. - 173 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Table Beschreibung Primärschlüssel APA_Admin Administratoren AdminID Beziehung m:n Beziehung zwischen Administratoren und Benutzern AdminID APA_Admin_User APA_User APA_Dimension UserID Benutzer und Besitzer des UserID Gitters GitterID Dimensionen des Gitters DimensionID APA_Hierarchy GitterID Hierarchien der einzelnen DimensionID Dimensionen eines Gitters Hierarchylevel APA_Gitter Daten über das Gitter APA_Cells Zellen des Gitters und deren Daten GitterID GitterID Row Column APA_Cube GitterID Hierarchiestufen der Row einzelnen Dimensionen des Column Gitters DimensionID APA_Req Anforderungsliste des Benutzer für ein bestimmtes Gitter APA_ReqBlock GitterID Reqirement Block für jedes ReqID APA_req Objekt BlockID GitterID ReqID GitterID APA_Detailreq Detailanforderungen jedes ReqID Blocks BlockID DetailreqID Tabelle 10: : Beschreibung der Tables der APA Datenbank - 174 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 74: Ableitung des APA Relationenmodells aus dem APA ER-Modell - 175 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.8.3.4 PHYSISCHE DATENMODELLIERUNG Das physische Datenmodell beschreibt die Daten des Informationssystems auf der Ebene der technischen Implementierung. Das physische Datenmodell bezieht sich auf ein konkretes Datenbankprodukt. Im Zuge dieser Arbeit wird Microsoft SQL 2000 Server als Datenbankprodukt fixiert. Im folgenden werde ich deshalb auf die konkreten physischen Ausprägungen im Sinne der „CREATE TABLE“ Anweisungen eingehen, welche auf den Notationen von Barth (2002) S. 127ff und Taylor (2001) S. 41 ff basieren. 7.8.3.4.1 FORMALE SQL-ANWEISUNGEN LAUT SQL 99 CREATE TABLE APA_Admin ( AdminID INTEGER NOT NULL , Admindescription VARCHAR(25) NOT NULL , PRIMARY KEY (AdminID) ); CREATE TABLE APA_Admin_User ( AdminID INTEGER NOT NULL , UserID INTEGER NOT NULL, PRIMARY KEY (AdminID, UserID) ); CREATE TABLE APA_Cells ( GitterID INTEGER NOT NULL , Row INTEGER NOT NULL , Column INTEGER NOT NULL , Short_Description VARCHAR(8) NOT NULL , Caption VARCHAR(8) NOT NULL , DimensionID INTEGER NOT NULL , HierarchyID INTEGER NOT NULL , Interesting BIT NOT NULL , Materialized BIT NOT NULL , Derivative BIT NOT NULL , Linetop BIT NOT NULL , Linebottom BIT NOT NULL , Lineleft BIT NOT NULL , Lineright BIT NOT NULL , Boldtop BIT NOT NULL , Boldbottom BIT NOT NULL , Boldleft BIT NOT NULL , Boldright BIT NOT NULL, PRIMARY KEY (GitterID) ); CREATE TABLE APA_Cube ( - 176 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN GitterID INTEGER NOT NULL , Row INTEGER NOT NULL , Column INTEGER NOT NULL , DimensionID INTEGER NOT NULL , Hierarchylevel INTEGER NOT NULL, PRIMARY KEY (GitterID, Row, Column, DimensionID) ); CREATE TABLE APA_Detailreq ( GitterID INTEGER NOT NULL , ReqID INTEGER NOT NULL , BlockID INTEGER NOT NULL , DetailReqID INTEGER NOT NULL , DimensionID INTEGER NOT NULL , Hierarchylevel INTEGER NOT NULL , Methode VARCHAR(10), EndHierarchylevel INTEGER NULL, PRIMARY KEY (GitterID, RegID, BlockID, DetailreqID) ); CREATE TABLE APA_Dimension ( GitterID INTEGER NOT NULL , DimensionID INTEGER NOT NULL , Dimension_Description VARCHAR(40), PRIMARY KEY (GitterID, DimensionID) ); CREATE TABLE APA_Gitter ( GitterID INTEGER IDENTITY (1, 1) NOT NULL , Description VARCHAR(40) NOT NULL , UserID INTEGER NOT NULL , Rowcount INTEGER NOT NULL , Columncount INTEGER NOT NULL, PRIMARY KEY (GitterID) ); CREATE TABLE APA_Hierarchy ( GitterID INTEGER NOT NULL , DimensionID INTEGER NOT NULL , Hierarchylevel INTEGER NOT NULL , Short_Description VARCHAR(8) NOT NULL , Long_Description] VARCHAR(50), PRIMARY KEY (GitterID, DimensionID, Hierarchielevel) ); CREATE TABLE APA_Req ( GitterID INTEGER NOT NULL , ReqID INTEGER IDENTITY (1, 1) NOT NULL , ReqDecription VARCHAR(30), - 177 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN PRIMARY KEY (GitterID, RegID) ); CREATE TABLE APA_ReqBlock ( GitterID INTEGER NOT NULL , ReqID INTEGER NOT NULL , BlockID INTEGER IDENTITY (1, 1) NOT NULL , Description VARCHAR (30), PRIMARY KEY (GitterID, ReqID, BlockID) ); CREATE TABLE APA_User ( UserID INTEGER IDENTITY (1, 1) NOT NULL , Description VARCHAR(50) NOT NULL , Password VARCHAR(15) NOT NULL, PRIMARY KEY (UserID) ); 7.8.3.4.2 MICROSOFT SQL SPEZIFISCHE SQL ANWEISUNGEN Jeder Datenbankhersteller unterstützt zwar SQL als Standard, verwendet aber leider oft eigene Dialekte und Formatsyntax für seine Datenbankprodukte. Um dem Rechnung zu tragen, dass meine Anwendung auf Microsoft SQL als Datenbank abzielt, will ich hier die spezifischen SQL Anweisungen, die auf Grund der in Abbildung 36 dargestellten relationalen Struktur entwickelt wurden, hier anführen. Zusätzlich zu den „CREATE TABLE“ Anweisungen werden im Script auch am Beginn überprüft, ob die Tabellen vorhanden sind (if exists) und gegebenenfalls gelöscht. Überprüfungen: if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_Admin_User_APA_Admin]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[APA_Admin_User] DROP CONSTRAINT FK_APA_Admin_User_APA_Admin GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_Cube_APA_Cells]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[APA_Cube] DROP CONSTRAINT FK_APA_Cube_APA_Cells GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_Cube_APA_Dimension]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) - 178 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN ALTER TABLE [dbo].[APA_Cube] DROP CONSTRAINT FK_APA_Cube_APA_Dimension GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_Detailreq_APA_Dimension]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[APA_Detailreq] DROP CONSTRAINT FK_APA_Detailreq_APA_Dimension GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_Hierarchy_APA_Dimension1]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[APA_Hierarchy] DROP CONSTRAINT FK_APA_Hierarchy_APA_Dimension1 GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_Cells_APA_Gitter]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[APA_Cells] DROP CONSTRAINT FK_APA_Cells_APA_Gitter GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_Dimension_APA_Gitter]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[APA_Dimension] DROP CONSTRAINT FK_APA_Dimension_APA_Gitter GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_Req_APA_Gitter]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[APA_Req] DROP CONSTRAINT FK_APA_Req_APA_Gitter GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_Cube_APA_Hierarchy]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[APA_Cube] DROP CONSTRAINT FK_APA_Cube_APA_Hierarchy GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_Detailreq_APA_Hierarchy]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) - 179 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN ALTER TABLE [dbo].[APA_Detailreq] DROP CONSTRAINT FK_APA_Detailreq_APA_Hierarchy GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_Detailreq_APA_Hierarchy1]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[APA_Detailreq] DROP CONSTRAINT FK_APA_Detailreq_APA_Hierarchy1 GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_ReqBlock_APA_Req]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[APA_ReqBlock] DROP CONSTRAINT FK_APA_ReqBlock_APA_Req GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_Detailreq_APA_ReqBlock]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[APA_Detailreq] DROP CONSTRAINT FK_APA_Detailreq_APA_ReqBlock GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_Admin_User_APA_User]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[APA_Admin_User] DROP CONSTRAINT FK_APA_Admin_User_APA_User GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_APA_Gitter_APA_User]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[APA_Gitter] DROP CONSTRAINT FK_APA_Gitter_APA_User GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[APA_Admin]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[APA_Admin] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[APA_Admin_User]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[APA_Admin_User] - 180 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[APA_Cells]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[APA_Cells] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[APA_Cube]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[APA_Cube] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[APA_Detailreq]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[APA_Detailreq] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[APA_Dimension]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[APA_Dimension] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[APA_Gitter]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[APA_Gitter] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[APA_Hierarchy]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[APA_Hierarchy] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[APA_Req]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[APA_Req] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[APA_ReqBlock]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[APA_ReqBlock] GO - 181 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[APA_User]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[APA_User] GO CREATE TABLE Anweisungen: CREATE TABLE [dbo].[APA_Admin] ( [AdminID] [int] NOT NULL , [Admindescription] [char] (25) COLLATE Latin1_General_CI_AS NOT NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[APA_Admin_User] ( [AdminID] [int] NOT NULL , [UserID] [int] NOT NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[APA_Cells] ( [GitterID] [int] NOT NULL , [Row] [int] NOT NULL , [Column] [int] NOT NULL , [Short_Description] [char] (250) COLLATE Latin1_General_CI_AS NULL , [Caption] [char] (8) COLLATE Latin1_General_CI_AS NOT NULL , [DimensionID] [int] NOT NULL , [HierarchyID] [int] NOT NULL , [Interesting] [bit] NOT NULL , [Materialized] [bit] NOT NULL , [Derivative] [bit] NOT NULL , [Linetop] [bit] NOT NULL , [Linebottom] [bit] NOT NULL , [Lineleft] [bit] NOT NULL , [Lineright] [bit] NOT NULL , [Boldtop] [bit] NOT NULL , [Boldbottom] [bit] NOT NULL , [Boldleft] [bit] NOT NULL , [Boldright] [bit] NOT NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[APA_Cube] ( [GitterID] [int] NOT NULL , [Row] [int] NOT NULL , - 182 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN [Column] [int] NOT NULL , [DimensionID] [int] NOT NULL , [Hierarchylevel] [int] NOT NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[APA_Detailreq] ( [GitterID] [int] NOT NULL , [ReqID] [int] NOT NULL , [BlockID] [int] NOT NULL , [DetailReqID] [int] NOT NULL , [DimensionID] [int] NOT NULL , [Hierarchylevel] [int] NOT NULL , [Methode] [char] (10) COLLATE Latin1_General_CI_AS NULL , [EndHierarchylevel] [int] NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[APA_Dimension] ( [GitterID] [int] NOT NULL , [DimensionID] [int] NOT NULL , [Dimension_Description] [char] (40) COLLATE Latin1_General_CI_AS NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[APA_Gitter] ( [GitterID] [int] IDENTITY (1, 1) NOT NULL , [Description] [char] (40) COLLATE Latin1_General_CI_AS NOT NULL , [UserID] [int] NOT NULL , [Rowcount] [int] NOT NULL , [Columncount] [int] NOT NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[APA_Hierarchy] ( [GitterID] [int] NOT NULL , [DimensionID] [int] NOT NULL , [Hierarchylevel] [int] NOT NULL , [Short_Description] [char] (8) COLLATE Latin1_General_CI_AS NOT NULL , [Long_Description] [char] (50) COLLATE Latin1_General_CI_AS NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[APA_Req] ( - 183 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN [GitterID] [int] NOT NULL , [ReqID] [int] IDENTITY (1, 1) NOT NULL , [ReqDecription] [char] (30) COLLATE Latin1_General_CI_AS NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[APA_ReqBlock] ( [GitterID] [int] NOT NULL , [ReqID] [int] NOT NULL , [BlockID] [int] IDENTITY (1, 1) NOT NULL , [Description] [char] (30) COLLATE Latin1_General_CI_AS NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[APA_User] ( [UserID] [int] IDENTITY (1, 1) NOT NULL , [Description] [char] (50) COLLATE Latin1_General_CI_AS NOT NULL , [Password] [char] (15) COLLATE Latin1_General_CI_AS NOT NULL ) ON [PRIMARY] GO 7.8.3.5 GENERIEREN DER CREATE TABLE ANWEISUNGEN IN DER SOFTWARE Unsere Software kann dem Benutzer SQL-Scripts generieren, welche dieser direkt an einen Microsoft SQL Server schicken kann und damit die Tables, bzw. die Aggregate erzeugt werden. Dabei wollen wir die zwei einfachsten Schemata, das Star und das Fact Constellation Schema, umsetzen. 7.8.3.5.1 DAS STAR-SCHEMA Das Star-Schema wird durch einen BFT, in welchem auch die Aggregate gespeichert werden, charakterisiert. Die Dimensionstabellen sind sternförmig um diesen BFT angeordnet. Wichtig ist das Level Attribut, da dieses eine Unterscheidung zwischen atomaren und aggregierten Daten erlaubt. - 184 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 75: Der Aufbau eines Star Schemas als Basis der CREATE TABLE Anweisungen I_Key K0001 K0001 K0001 K0001 K0001 K0001 K0001 K0002 K0002 K0002 K0002 K0003 K0003 K0003 K0003 K0003 K5000 K5000 K5000 K5700 K5700 K9999 K9999 K9999 K9999 C_Key K00001 K00001 K00001 K00002 K00002 K00002 K00003 K00001 K00001 K00001 K00001 K00001 K00001 K00001 K00002 K00003 K00001 K00002 K00003 K00002 K00003 K00001 K00002 K00003 K99999 P_Key K000001 K900001 K999001 K000001 K000002 K900001 K000001 K000001 K000002 K900001 K999001 K000002 K900001 K999001 K000001 K000001 K000001 K000001 K000001 K000001 K000001 K000001 K000001 K000001 K000001 Qty_Sold Revenue 1000 1200 19000 22800 110100 110101 700 840 980 1470 17890 21468 900 1080 1111 1667 1100 1650 17150 25725 89600 134400 10000 9000 16900 15210 96100 86490 20000 18000 4000 3600 2111 2867 700 840 900 1080 20000 18000 4000 3600 2111 2867 20700 18840 4900 4680 27711 26387 Tabelle 11: Beispielhafter BFT für die Anwendung - 185 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN C_Key K00001 K00002 K00003 K19999 K29999 K99999 C_cu 9876543 9874321 8912345 * * * C_description Woolworth K-Mart Mc Donalds * * * C_gr 1 1 2 1 2 * C_gr_description foodstore foodstore fastfood foodstore fastfood * level 0 0 0 1 1 2 address 207, View Rd, NSW, 9910 12, Creek Ave, NSW, 6677 403, Flood St, NSW, 1109 Tabelle 12: Beispielhafter Customer-Dimensionstable für die Anwendung I_Key K0001 K0002 K0003 K5000 K5700 K9999 I_it 1234567 12345789 2345678 * * * I_description Oranges Naval - S. A. Banana Rosa - Victoria Milk - Dairy Farmers * * * I_ty 1 1 2 1 2 * I_ty_description level fruits 0 fruits 0 diary 0 fruits 1 diary 1 * 2 Tabelle 13: Beispielhafter Items-Dimensionstable für die Anwendung P_Key K000001 K000002 K000003 K000170 K000171 K900001 K900002 K900003 K900006 K999001 P_d 1 2 3 170 171 * * * * * P_description 1-Jan-2000 2-Jan-2000 3-Jan-2000 18-Jun-2000 19-Jun-2000 * * * * * P_m 1 1 1 6 6 1 2 3 6 * P_m_description Jan, 2000 Jan, 2000 Jan, 2000 June, 2000 June, 2000 Jan, 2000 Feb, 2000 March, 2000 June, 2000 * P_y 1 1 1 1 1 1 1 1 1 1 P_y_description 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 level 0 0 0 0 0 1 1 1 1 2 Tabelle 14: Beispielhafter Time-Dimensionstable für die Anwendung 7.8.3.5.2 DAS FACT CONSTELLATION SCHEMA Bei Fact Constellation-Schema werden die Aggregate in separaten Fact Tables (FT) gespeichert. Das führt zu mehreren, aber kleineren Tabellen. - 186 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 76: Beispielhafte Auflistung der Dimension Tables und der Fact Tables beim Fact Constellation-Schema 7.8.3.5.3 7.8.3.5.3.1 BEISPIELHAFTES UMSETZEN DER TABLES DURCH DAS PROGRAMM DIE AUSGANGSPOSITION Wir gehen für wie in 7.6.7.3 von einem Demo APA aus und domonstrieren die Ergebnisse der SQL Scripts. Unser APA hat 3 Dimensionen (Agenten, Kunden, und Zeit). Diese haben wiederum unterschiedliche Hierarchiestufen, welche in Abbildung 77 im Detail aufgelistet sind. Zusätzlich haben wir den „Key figure“ Umsatz vom Typ - 187 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Money. Abbildung 77: Input Screen des Demo APA Die Heuristik ergibt das in Abbildung 78 angeführte Ergebnis. Dabei werden 6 materialisierte Würfel erzeugt. Nun kann der BFT, die Dimension Tabellen und die aggregierten Views in unterschiedlichen physischen Tabellenstrukturen abgespeichert werden. Ich habe in der Software die Strukturen für das Star-Schema und das Fact Constellation-Schema integriert. Die Ergebnisse werden in den nachfolgenden Kapiteln aufgelistet. Dabei wird beim Star-Schema ein BFT und drei Dimension Tables erzeugt. Die materialisierten Würfel werden im BFT integriert und durch hinzufügen des LevelAttributes kann man durch Querys unterscheiden, ob es sich um atomare Daten oder einen aggregierten Würfel handelt. Beim Fact Constellation-Schema enthält der BFT nur die atomaren Daten. Die Dimensionstabellen enthalten zusätzlich Fremdschlüsselwerte für jede Hierarchiestufe. Die materialisierten Sichten werden in separaten Aggregated Fact Tables gespeichert. - 188 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 78: APA Grid Screen des Demo APA 7.8.3.5.3.2 DIE SCRIPTS FÜR DAS STAR SCHEMA if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_BFT_Agenten_table]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[BFT] DROP CONSTRAINT FK_BFT_Agenten_table GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Agenten_table]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[Agenten_table] GO CREATE TABLE [dbo].[Agenten_table] ( [Agenten_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL , [A_id] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [A_id_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [A_*] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [A_*_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [level] [bigint] NOT NULL ) ON [PRIMARY] GO - 189 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN ALTER TABLE [dbo].[Agenten_table] WITH NOCHECK ADD CONSTRAINT [PK_Agenten_table] PRIMARY KEY CLUSTERED ( [Agenten_id] ) ON [PRIMARY] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_BFT_Kunden_table]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[BFT] DROP CONSTRAINT FK_BFT_Kunden_table GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Kunden_table]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[Kunden_table] GO CREATE TABLE [dbo].[Kunden_table] ( [Kunden_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL , [K_id] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [K_id_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [K_gr] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [K_gr_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [K_*] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [K_*_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [level] [bigint] NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[Kunden_table] WITH NOCHECK ADD CONSTRAINT [PK_Kunden_table] PRIMARY KEY CLUSTERED ( [Kunden_id] ) ON [PRIMARY] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_BFT_Zeit_table]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) - 190 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN ALTER TABLE [dbo].[BFT] DROP CONSTRAINT FK_BFT_Zeit_table GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Zeit_table]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[Zeit_table] GO CREATE TABLE [dbo].[Zeit_table] ( [Zeit_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL , [Z_t] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Z_t_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [Z_m] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Z_m_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [Z_y] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Z_y_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [Z_*] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Z_*_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [level] [bigint] NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[Zeit_table] WITH NOCHECK ADD CONSTRAINT [PK_Zeit_table] PRIMARY KEY CLUSTERED ( [Zeit_id] ) ON [PRIMARY] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[BFT]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[BFT] GO CREATE TABLE [dbo].[BFT] ( [Agenten_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL , - 191 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN [Kunden_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL , [Zeit_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL , [Umsatz] [MONEY] NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[BFT] WITH NOCHECK ADD CONSTRAINT [PK_BFT] PRIMARY KEY CLUSTERED ( [Agenten_id], [Kunden_id], [Zeit_id] ) ON [PRIMARY] GO ALTER TABLE [dbo].[BFT] ADD CONSTRAINT [FK_BFT_Agenten_table] FOREIGN KEY ( [Agenten_id] ) REFERENCES [dbo].[Agenten_table] ( [Agenten_id] ) ON UPDATE CASCADE GO ALTER TABLE [dbo].[BFT] ADD CONSTRAINT [FK_BFT_Kunden_table] FOREIGN KEY ( [Kunden_id] ) REFERENCES [dbo].[Kunden_table] ( [Kunden_id] ) ON UPDATE CASCADE GO ALTER TABLE [dbo].[BFT] ADD CONSTRAINT [FK_BFT_Zeit_table] FOREIGN KEY ( [Zeit_id] ) REFERENCES [dbo].[Zeit_table] ( [Zeit_id] ) ON UPDATE CASCADE GO - 192 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.8.3.5.3.3 DIE SCRIPTS FÜR DAS FACT CONSTELLATION SCHEMA if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_BFT_Agenten_table]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[BFT] DROP CONSTRAINT FK_BFT_Agenten_table GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Agenten_table]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[Agenten_table] GO CREATE TABLE [dbo].[Agenten_table] ( [Agenten_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL , [A_id] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [A_id_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [A_*] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [A_*_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , ) ON [PRIMARY] GO ALTER TABLE [dbo].[Agenten_table] WITH NOCHECK ADD CONSTRAINT [PK_Agenten_table] PRIMARY KEY CLUSTERED ( [Agenten_id] ) ON [PRIMARY] GO CREATE INDEX [IX_A_id] ON [dbo].[Agenten_table]([A_id]) ON [PRIMARY] GO CREATE INDEX [IX_A_*] ON [dbo].[Agenten_table]([A_*]) ON [PRIMARY] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_BFT_Kunden_table]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[BFT] DROP CONSTRAINT FK_BFT_Kunden_table GO - 193 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Kunden_table]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[Kunden_table] GO CREATE TABLE [dbo].[Kunden_table] ( [Kunden_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL , [K_id] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [K_id_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [K_gr] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [K_gr_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [K_*] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [K_*_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , ) ON [PRIMARY] GO ALTER TABLE [dbo].[Kunden_table] WITH NOCHECK ADD CONSTRAINT [PK_Kunden_table] PRIMARY KEY CLUSTERED ( [Kunden_id] ) ON [PRIMARY] GO CREATE INDEX [IX_K_id] ON [dbo].[Kunden_table]([K_id]) ON [PRIMARY] GO CREATE INDEX [IX_K_gr] ON [dbo].[Kunden_table]([K_gr]) ON [PRIMARY] GO CREATE INDEX [IX_K_*] ON [dbo].[Kunden_table]([K_*]) ON [PRIMARY] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_BFT_Zeit_table]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) ALTER TABLE [dbo].[BFT] DROP CONSTRAINT FK_BFT_Zeit_table GO - 194 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Zeit_table]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[Zeit_table] GO CREATE TABLE [dbo].[Zeit_table] ( [Zeit_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL , [Z_t] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Z_t_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [Z_m] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Z_m_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [Z_y] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Z_y_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , [Z_*] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Z_*_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL , ) ON [PRIMARY] GO ALTER TABLE [dbo].[Zeit_table] WITH NOCHECK ADD CONSTRAINT [PK_Zeit_table] PRIMARY KEY CLUSTERED ( [Zeit_id] ) ON [PRIMARY] GO CREATE INDEX [IX_Z_t] ON [dbo].[Zeit_table]([Z_t]) ON [PRIMARY] GO CREATE INDEX [IX_Z_m] ON [dbo].[Zeit_table]([Z_m]) ON [PRIMARY] GO CREATE INDEX [IX_Z_y] ON [dbo].[Zeit_table]([Z_y]) ON [PRIMARY] GO - 195 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN CREATE INDEX [IX_Z_*] ON [dbo].[Zeit_table]([Z_*]) ON [PRIMARY] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[BFT]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[BFT] GO CREATE TABLE [dbo].[BFT] ( [Agenten_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL , [Kunden_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL , [Zeit_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL , [Umsatz] [MONEY] NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[BFT] WITH NOCHECK ADD CONSTRAINT [PK_BFT] PRIMARY KEY CLUSTERED ( [Agenten_id], [Kunden_id], [Zeit_id] ) ON [PRIMARY] GO ALTER TABLE [dbo].[BFT] ADD CONSTRAINT [FK_BFT_Agenten_table] FOREIGN KEY ( [Agenten_id] ) REFERENCES [dbo].[Agenten_table] ( [Agenten_id] ) ON UPDATE CASCADE GO ALTER TABLE [dbo].[BFT] ADD CONSTRAINT [FK_BFT_Kunden_table] FOREIGN KEY ( [Kunden_id] ) REFERENCES [dbo].[Kunden_table] ( [Kunden_id] ) ON UPDATE CASCADE GO - 196 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN ALTER TABLE [dbo].[BFT] ADD CONSTRAINT [FK_BFT_Zeit_table] FOREIGN KEY ( [Zeit_id] ) REFERENCES [dbo].[Zeit_table] ( [Zeit_id] ) ON UPDATE CASCADE GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FT A_*K_idZ_m]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[FT A_*K_idZ_m] GO CREATE TABLE [dbo].[FT A_*K_idZ_m] ( [A_*] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [K_id] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Z_m] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Umsatz] [MONEY] NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[FT A_*K_idZ_m] WITH NOCHECK ADD CONSTRAINT [PK_FT A_*K_idZ_m] PRIMARY KEY CLUSTERED ( [A_*] , [K_id] , [Z_m] ) ON [PRIMARY] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FT A_idK_*Z_t]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[FT A_idK_*Z_t] GO CREATE TABLE [dbo].[FT A_idK_*Z_t] ( [A_id] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , - 197 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN [K_*] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Z_t] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Umsatz] [MONEY] NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[FT A_idK_*Z_t] WITH NOCHECK ADD CONSTRAINT [PK_FT A_idK_*Z_t] PRIMARY KEY CLUSTERED ( [A_id] , [K_*] , [Z_t] ) ON [PRIMARY] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FT A_*K_*Z_t]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[FT A_*K_*Z_t] GO CREATE TABLE [dbo].[FT A_*K_*Z_t] ( [A_*] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [K_*] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Z_t] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Umsatz] [MONEY] NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[FT A_*K_*Z_t] WITH NOCHECK ADD CONSTRAINT [PK_FT A_*K_*Z_t] PRIMARY KEY CLUSTERED ( [A_*] , [K_*] , [Z_t] ) ON [PRIMARY] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FT A_*K_idZ_y]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[FT A_*K_idZ_y] - 198 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN GO CREATE TABLE [dbo].[FT A_*K_idZ_y] ( [A_*] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [K_id] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Z_y] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Umsatz] [MONEY] NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[FT A_*K_idZ_y] WITH NOCHECK ADD CONSTRAINT [PK_FT A_*K_idZ_y] PRIMARY KEY CLUSTERED ( [A_*] , [K_id] , [Z_y] ) ON [PRIMARY] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FT A_idK_*Z_m]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[FT A_idK_*Z_m] GO CREATE TABLE [dbo].[FT A_idK_*Z_m] ( [A_id] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [K_*] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Z_m] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Umsatz] [MONEY] NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[FT A_idK_*Z_m] WITH NOCHECK ADD CONSTRAINT [PK_FT A_idK_*Z_m] PRIMARY KEY CLUSTERED ( [A_id] , [K_*] , [Z_m] ) ON [PRIMARY] GO - 199 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FT A_idK_grZ_y]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[FT A_idK_grZ_y] GO CREATE TABLE [dbo].[FT A_idK_grZ_y] ( [A_id] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [K_gr] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Z_y] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL , [Umsatz] [MONEY] NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[FT A_idK_grZ_y] WITH NOCHECK ADD CONSTRAINT [PK_FT A_idK_grZ_y] PRIMARY KEY CLUSTERED ( [A_id] , [K_gr] , [Z_y] ) ON [PRIMARY] GO 7.9 ERGEBNISSE DER TESTS DER HEURISTIKEN Um die Funktionalität der Heuristik zu überprüfen, ist es essentiell die richtige Lösung deterministisch durch einen Algorithmus zu bestimmen. Diese Algorithmen wurden in den vorhergehenden Kapiteln eingehend behandelt. Dabei wurde sowohl bei der Permutation als auch bei der Kombination gleiche Ergebnisse erzielt. 7.9.1 PROBLEME BEI TESTEN DER HEURISTIK Der erste Ansatz war das Testen der Ergebnisse der Heuristik im Vergleich zu den Ergebnissen der deterministischen Lösung durch die Permutation. Dabei wurden alle möglichen Sequenzen der zu materialisierenden Cubes unter der Berücksichtigung der Reihenfolge der Cubes berechnet und die kostenminimale Lösung mit der Heuristik verglichen. Unglücklicherweise dauert das Berechnen dieser deterministischen Lösung sehr lange. Das führte sogar bei kleinen APA zu Berechnungszeiten über 1 Jahr. - 200 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Deshalb wurde in einem zweiten Schritt der Ansatz über die Kombination gewählt. Dabei wurde die Materialisierungsreihenfolge der Cubes nicht beachtet. Das führte zu wesentlich weniger Sequenzen, welche in einem zweiten Schritt dann durch den Algorithmus von Dijkstra, welcher in den Algorithmus GetRightOrder eingebaut wurde, in die optimale Reihenfolge gebracht. Dadurch konnten akzeptable Berechnungszeiten von 3 bis 4 Wochen Berechnungszeit für kleine bis mittelgroße APA erreicht werden. Durch den Einsatz von 4 Rechnern parallel wurden die unten angeführten Ergebnisse erreicht. Zusätzlich wurde eine spezielle eine Abbruchbedingung eingeführt. Wenn die Kombination von z.B. 6 Cubes in jeder möglichen Kombination immer die Spacemax Bedingung überschritten hat, ist logischerweise auch bei einer Kombination von 7 Cubes das Spacemax Limit überschritten. Deshalb konnte die Berechnung früher gestoppt werden. Aus diesem Grund wurde auch in den empirischen Probeläufen von einem sehr geringen verfügbaren Speicherplatz ausgegangen. Nur so konnten die Berechnungszeiten von bis zu 4 Wochen erreicht werden. Die Menge der betrachteten Cubes wurden auf die so genannten „Possible Cubes“ eingeschränkt. Dabei würden aus der Gesamtmenge aller Cubes jene Cubes ausgeklammert, welche jedenfalls keinen positiven Beitrag zur Berechnung der Required Cubes leisten könnten. So sieht man in Abbildung 79 die mit schwarz markierten Menge der Possible Cubes. Der beispielhaft aktivierte Cube (4:2): K_gr; A_*; Z_* bringt dabei keinen zusätzlichen Nutzen für die Materialisierung der Required Cubes, da keines seiner Derivative ein Required Cube ist. Aus diesem Grund befindet sich dieser Cube nicht in der Menge der Possible Cubes. - 201 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 79: Demonstrative Anzeigen der Possible Cubes 7.9.2 GESAMTÜBERSICHT ÜBER DIE ERGEBNISSE Bezeichnung Kosten KostenSpaceleft Timeleft übereinstimmung Übereinstimmung Übereinstimmung Test1 Strukturierte Zufallskosten 100 % 100 % 100 % Test2 Strukturierte Zufallskosten 100 % 100 % 100 % Test3 Strukturierte Zufallskosten 100 % 100 % 100 % Test4 Strukturierte Zufallskosten 100 % 100 % 100 % Test5 Strukturierte Zufallskosten 100 % 100 % 100 % - 202 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Test6 Strukturierte Zufallskosten 100 % 100 % 100 % Test7 Strukturierte Zufallskosten 100 % 100 % 100 % Test8 Total Random Zufallskosten 100 % 100 % 100 % Test9 Total Random Zufallskosten 100 % 100 % 100 % Test10 Total Random Zufallskosten 100 % 100 % 100 % Test11 Total Random Zufallskosten 100 % 100 % 100 % Test12 Total Random Zufallskosten 100 % 100 % 100 % Test13 Mit Kostenfunktion 100 % 100 % 100 % Test14 Total Random Zufallskosten 100 % 100 % 100 % Test15 Total Random Zufallskosten 100 % 100 % 100 % Test16 Mit Kostenfunktion 100 % 100 % 100 % Test17 Strukturierte Zufallskosten 100 % 100 % 100 % Test18 Mit Kostenfunktion 4,53 % 10,73 % 26,33 % - 203 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3 DIE ERGEBNISSE IM DETAIL 7.9.3.1 7.9.3.1.1 Required Cubes: 1 2 3 4 5 6 7 8 7.9.3.1.2 VORGABEN UND ERGEBNISSE TEST 1 VORGABEN 3:0 K_*; A_*; G_*; Z_t 3:2 K_*; A_id; G_*; Z_m 4:2 K_*; A_id; G_*; Z_y 2:4 K_gr; A_*; G_*; Z_t 1:7 K_gr; A_id; G_b; Z_m 2:7 K_gr; A_id; G_b; Z_y 3:7 K_gr; A_id; G_b; Z_* 1:10 K_id; A_id; G_*; Z_m count 10000 10000 10000 10000 10000 10000 10000 10000 Parameter Spacemax 500000 Timemax 2500000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 64 New set on each iteration 4 Max Sets 20 LÖSUNG DER HEURISTIK - 204 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.1.3 DETERMINISTISCHE LÖSUNG 7.9.3.1.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 971499585 971499585 0,00% Space left 185952 185952 0,00% Time left 40415 40415 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 1. 7.9.3.2 7.9.3.2.1 Required Cubes: 1 2 3 4 5 6 7 8 VORGABEN UND ERGEBNISSE TEST 2 VORGABEN 4:1 K_*; A_*; G_b; Z_m 5:1 K_*; A_*; G_b; Z_y 6:1 K_*; A_*; G_b; Z_* 3:7 K_gr; A_*; G_b; Z_m 4:7 K_gr; A_*; G_b; Z_y 2:14 K_id; A_gr; G_*; Z_m 3:14 K_id; A_gr; G_*; Z_y 4:14 K_id; A_gr; G_*; Z_* count 1000 1000 1000 1000 1000 1000 1000 1000 Parameter Spacemax 100000 Timemax 1500000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 64 New set on each iteration 4 Max Sets 20 - 205 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.2.2 LÖSUNG DER HEURISTIK 7.9.3.2.3 DETERMINISTISCHE LÖSUNG - 206 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.2.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 2951750032 2951750032 0,00% Space left 335040 335040 0,00% Time left 1399968 1399968 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 1. 7.9.3.3 7.9.3.3.1 Required Cubes: 1 2 3 4 5 6 7 8 7.9.3.3.2 VORGABEN UND ERGEBNISSE TEST 3 VORGABEN 0:0 K_gr; A_id; G_b; Z_t 1:0 K_*; A_id; G_b; Z_t 4:0 K_*; A_*; G_*; Z_m 5:0 K_*; A_*; G_*; Z_y 6:0 K_*; A_*; G_*; Z_* 1:10 K_id; A_id; G_*; Z_m 2:10 K_id; A_id; G_*; Z_y 3:10 K_id; A_id; G_*; Z_* count 1000 1000 1000 1000 1000 1000 1000 1000 Parameter Spacemax 500000 Timemax 1500000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 64 New set on each iteration 4 Max Sets 20 LÖSUNG DER HEURISTIK - 207 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.3.3 DETERMINISTISCHE LÖSUNG 7.9.3.3.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 2950860 2950860 0,00% Space left 2265920 2265920 0,00% Time left 1489441 1489441 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 2. - 208 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.4 7.9.3.4.1 Required Cubes: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 7.9.3.4.2 VORGABEN UND ERGEBNISSE TEST 4 VORGABEN 0:0 K_gr; A_id; Z_t 1:0 K_*; A_id; Z_t 2:0 K_*; A_*; Z_t 2:1 K_*; A_id; Z_m 1:2 K_gr; A_*; Z_t 2:2 K_gr; A_*; Z_m 3:2 K_gr; A_*; Z_y 1:3 K_gr; A_id; Z_m 2:3 K_gr; A_id; Z_y 0:4 K_id; A_*; Z_t 1:4 K_id; A_*; Z_m 2:4 K_id; A_*; Z_y 0:5 K_id; A_id; Z_m 1:5 K_id; A_id; Z_y 2:5 K_id; A_id; Z_* count 10000 1000 1000 1000 10000 1000 1000 1000 1000 1000 1000 1000 10000 10000 10000 Parameter Spacemax 500000000 Timemax 1500000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 900 New set on each iteration 4 Max Sets 20 LÖSUNG DER HEURISTIK - 209 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.4.3 DETERMINISTISCHE LÖSUNG 7.9.3.4.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 253922 253922 0,00% Space left 212414000 212414000 0,00% Time left 1246080 1246080 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 1. - 210 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.5 7.9.3.5.1 Required Cubes: 1 2 3 4 5 6 7 8 9 7.9.3.5.2 VORGABEN UND ERGEBNISSE TEST 5 VORGABEN 2:0 A_*; K_*; Z_t 1:2 A_*; K_id; Z_m 2:2 A_*; K_id; Z_y 3:2 A_*; K_id; Z_* 1:3 A_id; K_*; Z_t 2:3 A_id; K_*; Z_m 2:4 A_id; K_gr; Z_y 1:5 A_id; K_id; Z_y 2:5 A_id; K_id; Z_* count 10000 1000 1000 1000 10000 10000 10000 1 1 Parameter Spacemax 500000000 Timemax 1500000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 900 New set on each iteration 4 Max Sets 20 LÖSUNG DER HEURISTIK - 211 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.5.3 DETERMINISTISCHE LÖSUNG 7.9.3.5.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 99578 99578 0,00% Space left 42400400 42400400 0,00% Time left 1438916 1438916 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 1. - 212 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.6 7.9.3.6.1 Required Cubes: 1 2 3 4 5 6 7 8 9 10 11 12 13 7.9.3.6.2 VORGABEN UND ERGEBNISSE TEST 6 VORGABEN 0:0 K_gr; A_id; Z_t 1:0 K_*; A_id; Z_t 2:0 K_*; A_gr; Z_t 1:3 K_gr; A_gr; Z_t 2:3 K_gr; A_*; Z_t 1:5 K_gr; A_id; Z_m 2:5 K_gr; A_id; Z_y 3:5 K_gr; A_id; Z_* 0:6 K_id; A_gr; Z_t 1:6 K_id; A_*; Z_t 3:6 K_id; A_*; Z_y 4:6 K_id; A_*; Z_* 2:7 K_id; A_gr; Z_y count 1000 1000 10000 1000 1000 10000 10000 10000 1 1000 10000 10000 1000 Parameter Spacemax 58000000 Timemax 1500000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 900 New set on each iteration 4 Max Sets 20 LÖSUNG DER HEURISTIK - 213 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.6.3 DETERMINISTISCHE LÖSUNG 7.9.3.6.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 2639020 2639020 0,00% Space left 1461847 1461847 0,00% Time left 2576200 2576200 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. In der Materialisierungsreihenfolge wurde jedoch eine andere Reihenfolge gewählt. Dies beeinflusst aber nicht die Kosten. Die Heuristik lieferte den richtigen Wert im Lösungsweg 1. - 214 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.7 7.9.3.7.1 Required Cubes: 1 2 3 4 5 6 7 8 9 10 11 12 13 7.9.3.7.2 VORGABEN UND ERGEBNISSE TEST 7 VORGABEN 3:0 K_*; G_*; Z_t 2:3 K_gr; G_*; Z_t 3:3 K_gr; G_*; Z_m 4:3 K_gr; G_*; Z_y 5:3 K_gr; G_*; Z_* 1:5 K_gr; G_b; Z_m 2:5 K_gr; G_b; Z_y 3:5 K_gr; G_b; Z_* 1:6 K_id; G_*; Z_t 2:6 K_id; G_*; Z_m 3:6 K_id; G_*; Z_y 4:6 K_id; G_*; Z_* 1:8 K_id; G_b; Z_y count 10000 10000 10000 10000 10000 1000 1000 1000 10000 10000 10000 10000 10000 Parameter Spacemax 8000000 Timemax 1500000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 120 New set on each iteration 4 Max Sets 20 LÖSUNG DER HEURISTIK - 215 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.7.3 DETERMINISTISCHE LÖSUNG 7.9.3.7.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 1278025457 1278025457 0,00% Space left 997040 997040 0,00% Time left 14824543 14824543 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 2. - 216 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.8 7.9.3.8.1 Required Cubes: 1 2 3 4 5 6 7 8 9 10 11 12 13 7.9.3.8.2 VORGABEN UND ERGEBNISSE TEST 8 VORGABEN 3:0 K_*; G_*; Z_t 2:3 K_gr; G_*; Z_t 3:3 K_gr; G_*; Z_m 4:3 K_gr; G_*; Z_y 5:3 K_gr; G_*; Z_* 1:5 K_gr; G_b; Z_m 2:5 K_gr; G_b; Z_y 3:5 K_gr; G_b; Z_* 1:6 K_id; G_*; Z_t 2:6 K_id; G_*; Z_m 3:6 K_id; G_*; Z_y 4:6 K_id; G_*; Z_* 1:8 K_id; G_b; Z_y count 10000 10000 10000 10000 10000 1000 1000 1000 10000 10000 10000 10000 10000 Parameter Spacemax 8000000 Timemax 1500000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 120 New set on each iteration 4 Max Sets 20 LÖSUNG DER HEURISTIK - 217 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.8.3 DETERMINISTISCHE LÖSUNG 7.9.3.8.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 29369605 29369605 0,00% Space left 592760 592760 0,00% Time left 14920395 14920395 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 2. - 218 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.9 7.9.3.9.1 Required Cubes: 1 2 3 4 5 6 7 8 9 10 11 12 13 7.9.3.9.2 VORGABEN UND ERGEBNISSE TEST 9 VORGABEN 0:0 K_gr; A_id; Z_t 1:0 K_*; A_id; Z_t 2:0 K_*; A_gr; Z_t 1:3 K_gr; A_gr; Z_t 2:3 K_gr; A_*; Z_t 1:5 K_gr; A_id; Z_m 2:5 K_gr; A_id; Z_y 3:5 K_gr; A_id; Z_* 0:6 K_id; A_gr; Z_t 1:6 K_id; A_*; Z_t 3:6 K_id; A_*; Z_y 4:6 K_id; A_*; Z_* 2:7 K_id; A_gr; Z_y count 1000 1000 10000 1000 1000 10000 10000 10000 1 1000 10000 1000 1000 Parameter Spacemax 58000000 Timemax 1500000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 900 New set on each iteration 4 Max Sets 20 LÖSUNG DER HEURISTIK - 219 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.9.3 DETERMINISTISCHE LÖSUNG 7.9.3.9.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 641966243 641966243 0,00% Space left 2432200 2432200 0,00% Time left 1261075 1261075 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 2. - 220 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.10 VORGABEN UND ERGEBNISSE TEST 10 7.9.3.10.1 Required Cubes: 1 2 3 4 5 6 7 8 9 10 11 7.9.3.10.2 VORGABEN 2:0 K_*; A_*; G_*; Z_t 2:2 K_*; A_id; G_*; Z_m 1:3 K_*; A_id; G_b; Z_m 2:3 K_*; A_id; G_b; Z_y 3:3 K_*; A_id; G_b; Z_* 0:4 K_id; A_*; G_b; Z_t 1:4 K_id; A_*; G_*; Z_t 0:6 K_id; A_id; G_*; Z_t 1:6 K_id; A_id; G_*; Z_m 2:6 K_id; A_id; G_*; Z_y 3:6 K_id; A_id; G_*; Z_* count 1000 10000 1000 1000 1000 1000 10000 1 1000 1000 1000 Parameter Spacemax 200000000 Timemax 1500000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 840 New set on each iteration 4 Max Sets 15 LÖSUNG DER HEURISTIK - 221 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.10.3 DETERMINISTISCHE LÖSUNG 7.9.3.10.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 275596808 275596808 0,00% Space left 21788960 21788960 0,00% Time left 1252172 1252172 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 1. - 222 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.11 VORGABEN UND ERGEBNISSE TEST 11 7.9.3.11.1 Required Cubes: 1 2 3 4 5 6 7 8 9 10 7.9.3.11.2 VORGABEN count 3:2 K_*; A_gr; G_*; Z_m 2:3 K_*; A_gr; G_b; Z_m 3:3 K_*; A_gr; G_b; Z_y 1:4 K_*; A_id; G_*; Z_t 2:5 K_*; A_id; G_b; Z_y 1:6 K_id; A_*; G_b; Z_t 2:6 K_id; A_*; G_*; Z_t 2:7 K_id; A_*; G_b; Z_m 2:8 K_id; A_gr; G_*; Z_m 1:10 K_id; A_id; G_*; Z_m 1 10000 1 10000 10000 1000 1000 10000 10000 10000 Parameter Spacemax 200000000 Timemax 1500000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 840 New set on each iteration 4 Max Sets 15 LÖSUNG DER HEURISTIK - 223 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.11.3 DETERMINISTISCHE LÖSUNG 7.9.3.11.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 447157299 447157299 0,00% Space left 1328590 1328590 0,00% Time left 27595880 27595880 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 1. - 224 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.12 VORGABEN UND ERGEBNISSE TEST 12 7.9.3.12.1 Required Cubes: 1 2 3 4 5 6 7 8 9 10 11 12 13 VORGABEN 3:0 K_*; G_*; Z_t 2:3 K_gr; G_*; Z_t 3:3 K_gr; G_*; Z_m 4:3 K_gr; G_*; Z_y 5:3 K_gr; G_*; Z_* 1:5 K_gr; G_b; Z_m 2:5 K_gr; G_b; Z_y 3:5 K_gr; G_b; Z_* 1:6 K_id; G_*; Z_t 2:6 K_id; G_*; Z_m 3:6 K_id; G_*; Z_y 4:6 K_id; G_*; Z_* 1:8 K_id; G_b; Z_y 7.9.3.12.2 count 10000 10000 10000 10000 10000 1000 1000 1000 10000 10000 10000 10000 10000 Parameter Spacemax Timemax Zeitkosten Size per Tupel in Bytes: New set on each iteration Max Sets LÖSUNG DER HEURISTIK - 225 - 8000000 15000000 1 bis 100000 120 6 20 OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.12.3 DETERMINISTISCHE LÖSUNG 7.9.3.12.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 2873774 2873774 0,00% Space left 591320 591320 0,00% Time left 14926226 14926226 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 8. - 226 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.13 VORGABEN UND ERGEBNISSE TEST 13 7.9.3.13.1 Required Cubes: 1 2 3 4 5 6 7 7.9.3.13.2 VORGABEN 2:0 C_*; A_gr; T_d 3:1 C_*; A_gr; T_m 2:3 C_gr; A_*; T_d 3:3 C_gr; A_*; T_m 2:4 C_gr; A_gr; T_m 2:5 C_gr; A_id; T_y 1:6 C_id; A_*; T_d count 10000 10000 10000 10000 10000 10000 10000 Parameter New set on each iteration 2 Max Sets 50 average time to store a tupel in time units 2 average time for io in time units 2 average time for CPU instructions in time units 0,002 max time 1500000 average time to query in timeunits 100 average size of a tupel in bytes 900 max space in bytes 58000000 time weight 75% query weight 63% LÖSUNG DER HEURISTIK - 227 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.13.3 DETERMINISTISCHE LÖSUNG 7.9.3.13.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 1549,136539 1549,136539 0,00% Space left 2339500 2339500 0,00% Time left 396,7110032 396,7110032 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 29. Damit zeigt dieser Testlauf am deutlichsten die Grenzen der Heuristik auf. Wäre in den Parameter die Anzahl der Lösungswege auf eine geringere Anzahl als 29 gesetzt worden, wäre das Ergebnis unrichtig. Deshalb wird im Test 18 dieses Beispiel nochmals mit neuen Parametern ausgetestet. - 228 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.14 VORGABEN UND ERGEBNISSE TEST 14 7.9.3.14.1 Required Cubes: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 VORGABEN 0:0 K_gr; A_id; G_b; Z_t 1:0 K_*; A_id; G_b; Z_t 2:0 K_*; A_*; G_b; Z_t 2:3 K_*; A_id; G_b; Z_m 3:3 K_*; A_id; G_b; Z_y 1:4 K_gr; A_*; G_b; Z_t 1:6 K_gr; A_id; G_*; Z_t 2:6 K_gr; A_id; G_*; Z_m 3:6 K_gr; A_id; G_*; Z_y 4:6 K_gr; A_id; G_*; Z_* 0:8 K_id; A_*; G_b; Z_t 1:8 K_id; A_*; G_*; Z_t 1:9 K_id; A_*; G_b; Z_m 2:9 K_id; A_*; G_b; Z_y 3:9 K_id; A_*; G_b; Z_* 0:10 K_id; A_id; G_*; Z_t 0:11 K_id; A_id; G_b; Z_m 1:11 K_id; A_id; G_b; Z_y 2:11 K_id; A_id; G_b; Z_* count 1000 1000 1000 1000 1 10000 10000 10000 10000 10000 10000 10000 1000 1000 1000 10000 10000 10000 10000 Parameter Spacemax 20000000 Timemax 25000000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 500 New set on each iteration 4 Max Sets 40 - 229 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.14.2 LÖSUNG DER HEURISTIK - 230 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.14.3 DETERMINISTISCHE LÖSUNG 7.9.3.14.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 1686650247 1686650247 0,00% Space left 9990000 9990000 0,00% Time left 24616192 24616192 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 1. - 231 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.15 VORGABEN UND ERGEBNISSE TEST 15 7.9.3.15.1 Required Cubes: 1 2 3 4 5 6 7 8 9 10 11 7.9.3.15.2 VORGABEN count 1:0 K_*; A_id; Z_t 3:0 K_*; A_*; Z_t 4:1 K_*; A_gr; Z_y 3:2 K_*; A_id; Z_y 4:3 K_gr; A_*; Z_y 2:4 K_gr; A_gr; Z_m 3:4 K_gr; A_gr; Z_y 2:6 K_id; A_*; Z_m 3:6 K_id; A_*; Z_y 1:7 K_id; A_gr; Z_m 2:8 K_id; A_id; Z_* 1 1000 10000 1000 1 1000 1 10000 1000 1 1 Parameter Spacemax 58000000 Timemax 1500000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 900 New set on each iteration 6 Max Sets 20 LÖSUNG DER HEURISTIK - 232 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.15.3 DETERMINISTISCHE LÖSUNG 7.9.3.15.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 32747425 32747425 0,00% Space left 9287500 9287500 0,00% Time left 1291048 1291048 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 3. 7.9.3.16 VORGABEN UND ERGEBNISSE TEST 16 7.9.3.16.1 Required Cubes: 1 2 3 4 5 6 7 8 9 VORGABEN count 4:3 K_*; G_l; A_gr; Z_t 3:6 K_*; G_b; A_gr; Z_t 4:9 K_*; G_bez; A_*; Z_m 2:12 K_gr; G_l; A_id; Z_t 3:19 K_gr; G_b; A_gr; Z_m 2:21 K_gr; G_bez; A_*; Z_t 1:24 K_id; G_l; A_id; Z_t 2:31 K_id; G_b; A_gr; Z_m 0:33 K_id; G_bez; A_gr; Z_t 1 1000 1000 10000 1 1000 10000 10000 10000 Parameter Spacemax 8000000 Timemax 4000000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 840 New set on each iteration 4 Max Sets 30 - 233 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.16.2 LÖSUNG DER HEURISTIK - 234 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN - 235 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.16.3 DETERMINISTISCHE LÖSUNG - 236 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.16.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 6198642 6198642 0,00% Space left 3934362 3934362 0,00% Time left 271760 271760 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 1. - 237 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.17 VORGABEN UND ERGEBNISSE TEST 17 7.9.3.17.1 Required Cubes: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 VORGABEN 0:0 K_gr; A_id; G_b; Z_t 1:0 K_*; A_id; G_b; Z_t 2:0 K_*; A_*; G_b; Z_t 2:2 K_*; A_id; G_*; Z_t 2:3 K_*; A_id; G_b; Z_m 1:4 K_gr; A_*; G_b; Z_t 2:4 K_gr; A_*; G_*; Z_t 2:6 K_gr; A_id; G_*; Z_m 3:6 K_gr; A_id; G_*; Z_y 4:6 K_gr; A_id; G_*; Z_* 1:8 K_id; A_*; G_*; Z_t 2:8 K_id; A_*; G_*; Z_m 3:8 K_id; A_*; G_*; Z_y 4:8 K_id; A_*; G_*; Z_* 0:11 K_id; A_id; G_b; Z_m 1:11 K_id; A_id; G_b; Z_y 2:11 K_id; A_id; G_b; Z_* count 10000 10000 10000 10000 10000 1 1 10000 10000 10000 10000 1000 1000 1000 10000 10000 10000 Parameter Spacemax 50000000 Timemax 25000000 Zeitkosten 1 bis 100000 Size per Tupel in Bytes: 500 New set on each iteration 4 Max Sets 20 - 238 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.17.2 LÖSUNG DER HEURISTIK - 239 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.17.3 DETERMINISTISCHE LÖSUNG 7.9.3.17.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 1067776407 1067776407 0,00% Space left 14619500 14619500 0,00% Time left 24903780 24903780 0,00% Es konnte eine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den richtigen Wert im Lösungsweg 1. - 240 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.18 VORGABEN UND ERGEBNISSE TEST 18 7.9.3.18.1 Required Cubes: 1 2 3 4 5 6 7 7.9.3.18.2 VORGABEN 2:0 C_*; A_gr; T_d 3:1 C_*; A_gr; T_m 2:3 C_gr; A_*; T_d 3:3 C_gr; A_*; T_m 2:4 C_gr; A_gr; T_m 2:5 C_gr; A_id; T_y 1:6 C_id; A_*; T_d count 10000 10000 10000 10000 10000 10000 10000 Parameter New set on each iteration 2 Max Sets 50 average time to store a tupel in time units 2 average time for io in time units 2 average time for CPU instructions in time units 0,002 max time 1500000 average time to query in timeunits 100 average size of a tupel in bytes 900 max space in bytes 58000000 time weight 75% query weight 63% LÖSUNG DER HEURISTIK - 241 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 7.9.3.18.3 DETERMINISTISCHE LÖSUNG 7.9.3.18.4 VERGLEICH DER ERGEBNISSE Parameter Heuristik Deterministisch Abweichung Kosten 1619,256708 1549,136539 -4,53% Space left 2088400 2339500 10,73% Time left 1016362,41 804498,9363 -26,33% Es konnte keine eindeutige Übereinstimmung festgestellt werden. Die Heuristik lieferte den Wert im Lösungsweg 4. Damit zeigt dieser Testlauf am deutlichsten die Grenzen der Heuristik auf. Wäre in den Parameter die Anzahl der Lösungswege auf eine größere Anzahl als 29 gesetzt worden, wäre das Ergebnis richtig. 8 CONCLUSIO Das Ziel und die Vision, die am Beginn dieser Arbeit stand, war es eine Heuristik zu entwickeln, welche die Auswahl der zu materialisieren Cubes treffen kann, diese zu Testen, die Test zu analysieren und zu bewerten. Deshalb war die Arbeit eine von sehr viel praktischer Programmiertätigkeit geprägte. Zusätzlich wurden jedoch in den Kapiteln 1 bis 6 die methodischen und inhaltsbezogenen Grundlagen zum Abhandeln der Arbeit gelegt. Dabei bin ich im Kapitel 1 speziell auf die Ziele, welche diese Arbeit begründen, eingegangen. Im Kapitel 2 wurde dann auf die Datenmodellierung eingegangen, da mit dem Aggregation Path Array eine Modellierungsmethode für - 242 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Datawarehousesysteme als Werkzeug benutzt wird. Diese Modellierungsmethode wurde im Kapitel 6 im Detail behandelt. Im Kapitel 3 wurde dann speziell auf Datenbanken und SQL eingegangen, da im Prinzip ein Datawarehouse eine große Datenbank darstellt. Kapitel 4 beschäftigt sich kurz mit ERP-Systemen im Allgemeinen, wobei ich hier nicht in die Tiefe gegangen bin, da es für unsere Fragestellung grundsätzlich unerheblich ist, woher die Daten stammen. Allerdings wird die von mir entwickelte Software im Lehrbetrieb der Universität in Kombination mit einem ERP System eingesetzt werden. Kapitel 5 geht im Speziellen auf das Datawarehouse ein. Das Kapitel 7 beschäftigt sich dann auf den eigentlichen Forschungsgegenstand. Dabei wird meine Heuristik präsentiert, beschrieben und begründet. So wird insbesondere der Algorithmus von Dijkstra verwendet, um eine Materialisierungsreihenfolge der Cubes zu finden. Zur Bestimmung der deterministischen Lösung wurde ein Ansatz über die Permutation und ein Ansatz über die Kombination in Verbindung mit Dijkstra vorgestellt. Beide liefern das gleiche Ergebnis. Dabei hat die Kombination bei kleinen APAs Geschwindigkeitsvorteile und die Permutation bei großen. Das Bestimmen der deterministischen Lösungen hat sehr viel Rechenzeit in Anspruch genommen (ca 3 bis 4 Wochen pro Ergebnis). Durch den Einsatz von vier unterschiedlichen Rechnern wurde versucht dieses Problem in den Griff zu bekommen und abschließend können nun immerhin 18 Lösungen präsentiert werden. Die Ergebnisse, welche in Kapitel 7.9.2 aufgelistet sind brachten außergewöhnlich gute Ergebnisse. So konnte fast immer eine 100 % Übereinstimmung der heuristischen und deterministischen Lösung erreicht werden. Allerdings konnte im Test 18 aufgezeigt werden, dass die Genauigkeit der Heuristik von der Anzahl der Testläufe abhängt. Somit kann gezeigt werden, dass die Genauigkeit der heuristischen Lösung durch den Benutzer einstellbar ist. Dabei besteht ein Konflikt zwischen Berechnungszeit und Genauigkeit. Ausserdem muss beachtet werden, dass nur kleine APAs mit relativ geringen Speicher- bzw. Zeitlimits getestet wurden, um die Rechenzeit für die deterministische Lösung gering zu halten. Deshalb wäre es interessant zusätzliche Testläufe in eine zukünftige Forschungsarbeit einzubauen. Diesbezügliche Vorgespräche wurden mit Professor Prosser bereits geführt. Der Zeitgewinn durch den Einsatz der Heuristik, welche bei den vorgestellten APAs zwischen 2 und 30 Sekunden Berechnungszeit, im Vergleich zu 3 bis 4 Wochen Berechnungszeit der deterministischen Lösung, benötigt, ist enorm. Das macht die Heuristik für namhafte Softwarefirmen interessant. Deshalb wäre es in einem nächsten Schritt sinnvoll die Heuristik mit dem Produkt eines Datenbankherstellers zu kombinieren. Dabei könnte auch unmittelbar auf die Kostenfunktionen des Query Optimizers des Herstellers zugegriffen werden. Dies wäre nach meiner Ansicht für den praktischen Einsatz der Software jedenfalls notwendig. - 243 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Zusätzlich zur rein wissenschaftlichen Arbeit wurde eine Softwareanwendung entwickelt, welche didaktisch eingesetzt werden soll. Diese Anwendungen möchte ich als höchste gelungen bezeichnen, da sie optimal für die Bedürfnisse der Studenten maßgeschneidert wurde. Damit kann jeder Student in praktischer Tätigkeit die Modellierung und die Entwicklung eines Datawarehouse vollziehen. Der Sourcecode sowie die Hilfedatei im HTML Format befinden sich im Anhang und stellten einen maßgeblichen Arbeitszeitanteil an dieser Arbeit dar. 9 LITERATUR Achs, T. L., (2002), Erstellung eines Java-basierten Programms zur Implementierung des Aggregationspfadarrays – Diplomarbeit an der Wirtschaftsuniversität Wien Anahory, Sam, Murray, Dennis, (1997), Data Warehouse - Planung, Implementierung und Administration, Addision-Wesley-Logman, Bonn; Reading, Massachusetts u.a.. Archilles, A., (2000), SQL – Standardisierte Datenbanksprache vom PC bis zum Mainframe, 7. Aufl., Oldenbourg Wissenschaftsverlag GmbH, München Baldi, St., (1999), Grundlagen der Wirtschaftsinformatik, 2. Aufl., Oldenbourg Verlag, München Barth, M., Karl, G., (2002), MySQL, DATA BECKER GmbH & Co. KG, Düsseldorf Codd, E.F., (1970), A Relational Model of Data for Large Shared Data Banks“, CACM Colby, L., Kawaguchi, A., Lieuwen, F., Mumick, I., Ross, K., (1997), Supporting Multiple View Maintenance Policies, In: Joan Peckham (Ed.): SIGMOD 1997, Proceedings ACM SIGMOD International Conference on Management of Data, May 13-15, 1997, Tucson, Arizona, USA. ACM Press 1997, SIGMOD Record 26(2), June 1997, S. 405 - 416 Connolly, T., Begg, C., Strachan, A., (2002), Datenbanksysteme, Addision-Wesely Verlag, ein Imprint der Peason Education Deutschland GmbH, München Cordts, S., (2002), Datenbankkonzepte in der Praxis, Addison-Wesley Verlag ein Imprint der Pearson Education Deutschland GmbH, München Crawley, P., Dilworth, R.P. (1973), Algebraic theory of lattice, Englewood Cliffs, New Jersey - 244 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Dippold, R., Meier, A., Ringgenberg, A., Schnider, W., Schwinn, K., Unternehmensweites Datenmanagement, (2001), 3. Aufl., Friedr. Vieweg & Sohn Verlagsgesellschaft mbH, Braunschweig/Wiesbaden Dunemann, O., (2002), Anfrageoptimierung für OLAP-Anwendungen in virtuellen Data Warehouses, Tenea Verlag für Medien, Berlin Džeroski, S., Lavrač, N., (2001), Relational Data Mining, Springer Verlag, Berlin et al. Ehrenberg, D., Heine, P., (1998), Konzept zur Datenintegration für Management Support Systeme auf der Basis uniformer Datenstrukturen, In: Wirtschaftsinformation 40. (1998), 6, S. 503-512 Falkowksi, B., (2002), Business Computing – Grundlagen und Standardsoftware, Springer Verlag, Berlin u.a. Fischer, J., Herold, W., Dangelmaier, W., Nastansky, L.; Suhl, L.; (2000), Bausteine der Wirtschaftsinformatik, 2. Aufl., Erich Schmidt Verlag GmbH & Co., Berlin Fritz, M., (1997), Data Warehouse Technologie, In: Datenbank-Management, InterestVerlag, Augsburg Gabriel, R., Röhrs, H.P., (2003), Gestaltung und Einsatz von Datenbanksystemen, Springer Verlag, Berlin et al. Geppert, A., (2002), Objektrelationale und objektorientierte Datenbankkonzepte und – systeme, dpunkt.verlag GmbH, Heidelberg Golfarelli, M., Maio, D., Rizzi, S. (1998), Conceptual Design on data warehouses from E/R Schemas; in: Proceeding of Hawaii International Conference On System Sciences, January 6-9, 1998, Kona, Hawaii, ftp://ftp-db.deis.unibo.it/pub/hicss98.pdf (22.02.2001) Goos, G., (2000), Vorlesungen über Informatik – Band 1, 3. Aufl., Springer-Verlag Berlin, u.a. Günther, H. O., Tempelmeier, H. (1997), Produktion und Logistik, 3. Aufl., SpringerVerlag, Berlin u.a. Hansen, H.R., (1996), Wirtschaftsinformatik I; 7. Auflage, Lucius & Lucius, Stuttgart Härder, T., Rahm, E., (2001), Datenbanksysteme, 2. Aufl., Springer-Verlag Berlin u.a. - 245 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Harinarayan, V., Rajaraman, A., Ullmann, J.D., (1996), Implementing Data Cubes Efficiently, In Proceedings of ACM SIGMOD Conference, Montreal, Canada, June 1996 Hartmut, E., (2000), Grundlagen und Konzepte der Informatik, 2. Aufl., Friedr. Vieweg & Sohn Verlagsgesellschaft mbH, Braunschweig, Wiesbaden Heinrich, L. J., (2002) Wirtschaftsinformatik, 2. Aufl., Oldenbourg Wissenschaftsverlag GmbH, München Houlette, F., (2002), SQL- IT Tutorial, mitp-Verlag, Bonn Janko, W., H., (1998), Informationswirtschaft 1, 2. Aufl., Springer-Verlag, Berlin u.a. Jianzhong, L., Doron, R., Jaideep, S., (1999), Aggregation Alogrithms for Very Large Compressed Data Warehouses, In: Proceedings of the 25th Very Large Database Conference, Edinburgh, Scotland, 1999, Morgan Kaufmann Publishers, Orlando Kaiser, A. (2000), Skriptum zur Lehrveranstaltung Management und Informationssysteme, Institut für Informationswirtschaft, http://exai3.wuwien.ac.at/~kaiser/mis/ (20.11.2000) Kemper, A., Eickler, A., (1996), Datenbanksysteme – Eine Einführung, Oldenbourg Verlag, München, Wien Kemper, A., Eickler, A., (1999), Datenbanksysteme, 3. Aufl., Oldenbourg Verlag, München Kleinschmidt, P., Rank, C., (2002), Relationale Datenbanksysteme – Eine praktische Einführung, 2. Aufl., Springer Verlag Berlin et al. Labio, W. J., Zhuge, Y., Wiener, J.L., Gupta, H., Garcia-Molina, H., Widom, J., (1997), The WHIPS Prototype for Data Warehous Creation and Maintenance, Joan Peckham (Ed.): SIGMOD 1997, Proceedings ACM SIGMOD International Conference on Management of Data, May 13-15, 1997, Tucson, Arizona, USA. ACM Press 1997, SIGMOD Record 26(2), June 1997, S. 557 -559 Lusti, M. (1999), Data Warehousing und Data Mining, 1. Aufl., Springer-Verlag, Berlin u.a. Marsch, J., Fritze, J., (1999), Erfolgreiche Datenbankanwendung mit SQL, 5. Aufl., - 246 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Friedr. Vieweg & Sohn Verlagsgesellschaft mbH, Braunschweig, Wiesbaden Martin, W. (1998), Data Warehousing, 1. Aufl., Internat. Thomson Publ., Bonn u.a. Meier, A., (2001), Relationale Datenbanken, 4. Auflage, Springer-Verlag, Berlin u.a. Mertens, P., Wieczorrek, H. W., (2000), Data X Strategien - Data Warehouse, Data Mining und operationale Systeme für die Praxis, Springer-Verlag, Berlin u.a. Morcinek, P., (2002), SQL, Data Becker GmbH & Co. KG, Düsseldorf Müller-Angstenberger, J. W., (1994), Die Arbeitsweise des DB2-Optimizers, In: Datenbank-Management, Interest-Verlag, Augsburg Mumick, I., Quass, D., Mumick, B., (1997), Maintenance of Data Cubes and Summary Tables in a Warehouse,In: Joan Peckham (Ed.): SIGMOD 1997, Proceedings ACM SIGMOD International Conference on Management of Data, May 13-15, 1997, Tucson, Arizona, USA. ACM Press 1997, SIGMOD Record 26(2), June 1997, S. 100 - 111 Panny, W., Taudes, A., (2000), Einführung in den Sprachkern von SQL-99, SpringerVerlag, Berlin u.a. Pernul, G., Unland, R., (2001), Datenbanken im Unternehmen, Oldenbourg Wissenschaftsverlag GmbH, München, Wien Prosser, A., Ossimitz, M. L., (2000a), Analytical Logistics Information System SAP BW – Teaching Material for the Department of Production Management ), WS 00/01, Prosser, A., Ossimitz, M. L., (2000b), Eine Methode zur konzeptionellen Modellierung multidimensionaler Datenstrukturen im Data Warehouse (Handout) Prosser, A., Ossimitz, M. L., (2001), Data Warehouse Management – Using SAP BW, Facultas Verlags- und Buchhandels AG, Wien Prosser, A., Ossimitz, M. L., (2002), Data Warehouse Management – Teaching Material for the Department of Production Management ), WS 02/03, Rautenstrauch, C., Schulze, T., (2003), Informatik für Wirtschaftswissenschaftler und Wirtschaftsinformatiker, Springer-Verlag Berlin u.a. Redaktion Toolbox, (2002), Datenbanken mit Delphi, C&L Computer und Literaturverlag, Böblingen - 247 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Reß, H., Viebeck, G., (2000), Datenstrukturen und Algorithmen, Carl Hanser Verlag, München, Wien Riordan, R. M., (2000), Microsoft SQL Server 2000 Programmierung, Microsoft Press Deutschland, Unterschleißheim Saake, G., Sattler, K., (2002), Algorithmen & Datenstrukturen – Eine Einführung mit Java, dpunkt.verlag GmbH, Heidelberg Schicker, E., (1999), Datenbanken und SQL, 2. Aufl., B.G. Teuber, Stuttgart, Leibzig Schneider, U., Werner, D., (2000), Taschenbuch der Informatik, 3. Aufl., Carl Hanser Verlag, München, Wien Sedgewick, R., (2002), Algorithmen, 2. Aufl., Addison-Wesley, München et al. Seemann, A., Schmalzridt, B., Lehmann, P., (2001), SAP Business Information Warehouse, Galileo Press, Bonn Shaw, M.; Blanning, R., Strader, T., Whinston, A., (2000), Handbook on electronic commerce, Springer-Verlag Berlin u.a. Stock, W., (2000), Informationswirtschaft, Oldenburg Wissenschaftsverlag GmbH, München Taylor, G. A., (2001), SQL für Dummies, 2. Aufl., mitp-Verlag ein Geschäftsbereich der verlag moderne industrie Buch AG & Co. KG, Landsberg Vossen, G., (2000), Datenmodelle, Datenbanksprachen und Datenbankmanagementsysteme, 4. Aufl., Oldenbourg Verlag, München, Wien Widenius, M., Axmark, D., (2002), MySQL- Das offizielle Handbuch, Die Deutsche Bibliothek Witt, K., (2001), Algebraische Grundlagen der Informatik – Zahlen –Strukturen – Codierung – Verschlüsselung, Friedr. Vieweg & Sohn Verlagsgesellschaft mbH, Braunschweig / Wiesbaden Witten, I.H., Eibe, F., (2000), Data mining: practical machine learning tools and techniques with Java implementations, Morgan Kaufmann Publishers, San Francisco Yang, J., Karlapalem, K., Li, Q., (1997), Algorithms for Materialized View Design in - 248 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Data Warehousing Environment, In: Proceedings of the 23rd VLDB Conference Athens, Greece ftp://www.vldb.org/conf/1997/P136.PDF (22.02.2001) - 249 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 10 ABBILDUNGSVERZEICHNIS Abbildung 1: Symbol für Entitätstyp.............................................................................. 18 Abbildung 2: Super- und Subentitätstypen mit „is a“ Operator [Quelle: Rautenstrauch/Schulze (2003) S. 237].................................................................... 19 Abbildung 3: Entitätsmenge mit Attributen.................................................................... 19 Abbildung 4: Einfaches Symbol eines Beziehungstyps für einfache Darstellbarkeit .... 20 Abbildung 5: Formal richtiges Beziehungssymbol der ER-Modell Konvention ........... 20 Abbildung 6: 1:1 Beziehung zwischen Kunde und Hauptwohnsitz ............................... 21 Abbildung 7: 1:n Beziehung zwischen Abteilung und Mitarbeiter ................................ 22 Abbildung 8: m:n Beziehung zwischen Mitarbeiter und Projekt ................................... 22 Abbildung 9: Rekursiver Beziehungstyp [Quelle: Rautenstrauch/Schulze (2003) S. 237] ................................................................................................................................ 23 Abbildung 10: Firmenhierarchie..................................................................................... 24 Abbildung 11: Beispielhafte Umsetzung einer 1:1 Beziehung in das Realtionenmodell in der vereinfachten Darstellung der Beziehung [Quelle: Baldi (1999), S. 84 ]..... 29 Abbildung 12: Beispielhafte Umsetzung einer 1:n Beziehung in das Relationenmodell in der vereinfachten Darstellung der Beziehung [Quelle: Baldi (1999), S. 84]...... 30 Abbildung 13: Beispielhafte Umsetzung einer m:n Beziehung in das Relationenmodell in der vereinfachten Darstellung der Beziehung [Quelle: Baldi (1999), S. 84 ]..... 31 Abbildung 14: Relationale Datenstruktur [in Anlehnung: Panny/Taudes (2000) S. 23] 37 Abbildung 15: Die Architektur eine Data Warehouse [Quelle: in Anlehnung an Posser/Ossimitz (2001) S. 26] ................................................................................ 49 Abbildung 16: Die Basisarchitektur des WHIPS Systems [Quelle: Labio et al. (1997) S. 557] ......................................................................................................................... 56 Abbildung 17: Die WHIPS System Architektur für Warehouse Maintenance [Quelle: Labio et at (1997) S. 558] ....................................................................................... 57 Abbildung 18: Das Modellsystem [Quelle: Kaiser (2000)]............................................ 67 Abbildung 19: Phasen der Modellierung [Quelle: Kaiser (2000)] ................................. 68 Abbildung 20: Einfache Hierarchie am Beispiel eines Kunden ..................................... 69 Abbildung 21: Darstellung eines Würfels (cube) mit den Dimensionen Zeit, Artikel und Kunden [ in Anlehnung: Prosser/Ossimitz (2000), S. 18] ...................................... 70 - 250 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 22: Selektion der Daten durch das Slice-Verfahren [Quelle: Schinzer et al. (1997), S. 40] .......................................................................................................... 71 Abbildung 23: Die Navigation durch die Navigationsebenen [in Anlehnung: Prosser, Ossimitz (2000 a), S. 24 ] ....................................................................................... 72 Abbildung 24: Einfaches Modell eines dreidimensionalen „Fact-Schema“ [in Anlehnung: Prosser, Ossimitz, (2000 a), S. 29]...................................................... 73 Abbildung 25: Attributsbaum vor Pruning und Grafting [in Anlehnung: Prosser, Ossimitz, (2000 a), S. 33] ....................................................................................... 74 Abbildung 26: Attributsbaum nach Pruning und Grafting [in Anlehnung: Prosser, Ossimitz, (2000 a), S. 34] ....................................................................................... 74 Abbildung 27: Gitter [in Anlehnung: Prosser, Ossimitz (2000 a), S. 40]....................... 75 Abbildung 28: Star-Schema mit „Fact-Table“ (gelb) und vier Dimension-Tables [In Anlehnung: Prosser, Ossimitz (2000 a), S. 51]....................................................... 77 Abbildung 29: Das klassische Star-Schema [In Anlehnung: Prosser/Ossimitz (2000a ) S. 51] ........................................................................................................................... 78 Abbildung 30: Das Fact Constellation-Schema [Quelle: Prosser/Ossimitz (2001) S. 76] ................................................................................................................................ 79 Abbildung 31: Snowflake-Schema mit Attribut-Tables [in Anlehnung: Prosser, Ossimitz (2000a), S. 62] ......................................................................................... 80 Abbildung 32: Galaxy-Schema und Multitube-Architektur [Quelle: Rautenstrauch/Schulze (2003) S. 334].................................................................... 81 Abbildung 33: Das Unimu-Schema [Quelle: Ehrenberg/Heine (1998) S. 507] ............. 82 Abbildung 34: Darstellung des APA des Praxisbeispiels in Kurznotation (links) und mit Attributsnamen (rechts) nicht redundanzfrei [in Anlehnung: Prosser, Ossimitz, (2000 a), S. 43] ...................................................................................................... 83 Abbildung 35: Darstellung des APA des Praxisbeispiels in Kurznotation (links) und mit Attributsnamen (rechts) redundanzfreie Menge farblich markiert [in Anlehnung: Prosser, Ossimitz (2000 a), S. 43] ......................................................................... 86 Abbildung 36: Darstellung der interessanten Würfel [in Anlehnung: Prosser, Ossimitz (2000 b), S. 17 ] ...................................................................................................... 87 Abbildung 37: Anzeigebeispiel der Derivative (Bereich x) des Würfels x [in Anlehnung: Prosser, Ossimitz (2000 b), S. 17] .......................................................................... 89 - 251 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 38: Anzeigebeispiel der Derivate (Bereich y) des Würfels y [in Anlehnung: Prosser, Ossimitz (2000 b), S. 17] .......................................................................... 89 Abbildung 39: Anzeigebeispiel der Derivate (Bereich x + y) der Würfels x und y [in Anlehnung: Prosser, Ossimitz (2000 b), S. 17] ...................................................... 90 Abbildung 40: Abgrenzung der Phasen der Betrachtung ............................................... 93 Abbildung 41: Graph mit zwei Knoten........................................................................... 95 Abbildung 42: Bewerteter Graph [Quelle: Reß/Viebock (2000) S. 404] ....................... 98 Abbildung 43: Darstellung der Knoten und Kanten ..................................................... 107 Abbildung 44: Funktionsweise eines Kostenmodells [Quelle: Kemper/Eickler (1996) S. 212] ....................................................................................................................... 109 Abbildung 45: Beispielhafte Arbeitsabfolge im G-Algorithmus [Quelle: Jianzhong (1999) S. 654] ....................................................................................................... 114 Abbildung 46: Schematische Aufstellung der Würfel und Kostenfunktionen ............. 122 Abbildung 47: Dimensionen und Hierarchien des DemoAPA..................................... 135 Abbildung 48: DemoAPA mit Lösung ......................................................................... 135 Abbildung 49: Schritt 1 der Heuristik nach Thomas ACHS ........................................ 136 Abbildung 50: Schritt 2 der Heuristik nach Thomas ACHS ........................................ 137 Abbildung 51: Schritt 3 der Heuristik nach Thomas ACHS ........................................ 137 Abbildung 52: Schritt 4 der Heuristik nach Thomas ACHS ........................................ 138 Abbildung 53: Schritt 5 der Heuristik nach Thomas ACHS ........................................ 138 Abbildung 54: Schritt 6 der Heuristik nach Thomas ACHS ........................................ 139 Abbildung 55: Schritt 7 der Heuristik nach Thomas ACHS ........................................ 139 Abbildung 56: Schritt 8 der Heuristik nach Thomas ACHS ........................................ 140 Abbildung 57: Schritt 9 der Heuristik nach Thomas ACHS ........................................ 140 Abbildung 58: Schritt 10 der Heuristik nach Thomas ACHS ...................................... 141 Abbildung 59: Schritt 11 der Heuristik nach Thomas ACHS ...................................... 141 Abbildung 60: Schritt 12 der Heuristik nach Thomas ACHS ...................................... 142 Abbildung 61: Schritt 13 der Heuristik nach Thomas ACHS ...................................... 142 Abbildung 62: Schritt 14 der Heuristik nach Thomas ACHS ...................................... 143 Abbildung 63: Schritt 15 der Heuristik nach Thomas ACHS ...................................... 143 - 252 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Abbildung 64: Schritt 95 der Heuristik nach Thomas ACHS ...................................... 144 Abbildung 65: Schritt 96 der Heuristik nach Thomas ACHS ...................................... 144 Abbildung 66: Schritt 97 der Heuristik nach Thomas ACHS ...................................... 145 Abbildung 67: Schritt 98 der Heuristik nach Thomas ACHS ...................................... 146 Abbildung 68: Schritt 99 der Heuristik nach Thomas ACHS ...................................... 146 Abbildung 69: Das Hauptmenu des APA Programmes................................................ 166 Abbildung 70: Der APA Input Screen.......................................................................... 167 Abbildung 71: Die Präsentationsmaske des APA Grid ................................................ 168 Abbildung 72: Die Auswahlmaske der Required Cubes .............................................. 169 Abbildung 73: ER-Diagramm für die APA Datenbank................................................ 171 Abbildung 74: Ableitung des APA Relationenmodells aus dem APA ER-Modell...... 175 Abbildung 75: Der Aufbau eines Star Schemas als Basis der CREATE TABLE Anweisungen ........................................................................................................ 185 Abbildung 76: Beispielhafte Auflistung der Dimension Tables und der Fact Tables beim Fact Constellation-Schema ................................................................................... 187 Abbildung 77: Input Screen des Demo APA................................................................ 188 Abbildung 78: APA Grid Screen des Demo APA........................................................ 189 Abbildung 79: Demonstrative Anzeigen der Possible Cubes....................................... 202 - 253 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 11 TABELLENVERZEICHNIS Tabelle 1: Kombinationen von Grad und Ausprägung................................................... 21 Tabelle 2: Gegenüberstellung von relationalen und SQL-Ausdrücken [Quelle: Pernul/Unland (2001) S. 263]................................................................................. 35 Tabelle 3: Vergleich operative Daten und Data Warehouse [in Anlehnung: Connolly et al. (2002) S. 910; Prosser, Ossimitz (2000 a), S. 11].............................................. 54 Tabelle 4: Änderungen der Aggregate nach Funktionen [Quelle: Mumick et al. (1997) S.105]...................................................................................................................... 59 Tabelle 5: Informationsflüsse im Data Warehouse [Quelle: Connolly et al. (2002) S. 918ff] ...................................................................................................................... 60 Tabelle 6: Operatoren und Zahlentypen [in Anlehnung: Prosser, Ossimitz (2000 a), S. 20] ........................................................................................................................... 70 Tabelle 7: Berechnung der kürzesten Wege von einem Knoten in einem Graph zu allen anderen [Quelle: Reß/Viebeck (2000) S. 405]........................................................ 99 Tabelle 8: Berechnung der kürzesten Wege für einen azyklischen Graphen [Quelle: Reß/Viebeck (2000) S. 408] ................................................................................. 104 Tabelle 9: Entwicklung der Query Response Time im Verhältnis zur Size [Quelle: Harinarayan et al. (1996) S. 11]............................................................................ 111 Tabelle 10: : Beschreibung der Tables der APA Datenbank ........................................ 174 Tabelle 11: Beispielhafter BFT für die Anwendung .................................................... 185 Tabelle 12: Beispielhafter Customer-Dimensionstable für die Anwendung ................ 186 Tabelle 13: Beispielhafter Items-Dimensionstable für die Anwendung....................... 186 Tabelle 14: Beispielhafter Time-Dimensionstable für die Anwendung ....................... 186 - 254 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 12 ANHANG 12.1 QUELLCODE DER ANWENDUNG 12.1.1 PROGRAMM QUELLCODE APAWIN program APAWin; uses Forms, APA_Applicationunit in '..\Units\APA_Applicationunit.pas' {APA_Application}, APA_Gridunit in '..\Units\APA_Gridunit.pas' {APA_Grid}, APA_Input_Dimensionunit in '..\Units\APA_Input_Dimensionunit.pas' {APA_Insert_Dimension}, APA_Input_Hierarchyunit in '..\Units\APA_Input_Hierarchyunit.pas' {APA_Insert_Hierarchy}, APA_Input_Reqblockunit in '..\Units\APA_Input_Reqblockunit.pas' {APA_Insert_Reqblock}, APA_Input_Screenunit in '..\Units\APA_Input_Screenunit.pas' {APA_Input_Screen}, APA_Keyunit in '..\Units\APA_Keyunit.pas' {APA_Insert_Key}, APA_Optionsunit in '..\Units\APA_Optionsunit.pas' {APA_Options}, APA_Parameterunit in '..\Units\APA_Parameterunit.pas' {APA_Parameter}, APA_Selectionunit in '..\Units\APA_Selectionunit.pas' {APA_Selection_Screen}, APA_Analyseunit in '..\Units\APA_Analyseunit.pas' {APA_Analyse}, APA_Screenunit in '..\Units\APA_Screenunit.pas' {APA_Screen}, APA_Show_costsunit in '..\Units\APA_Show_costsunit.pas' {APA_Showcosts}, APA_Processunit in '..\Units\APA_Processunit.pas' {APA_Show_Process}, APA_Sqlunit in '..\Units\APA_Sqlunit.pas' {APA_Sql}, APA_Dialogunit in '..\Units\APA_Dialogunit.pas' {APA_Dialog}, APA_Helpunit in '..\Units\APA_Helpunit.pas' {APA_Help}; {$R *.res} begin Application.Initialize; Application.Title := 'APA Application'; Application.CreateForm(TAPA_Screen, APA_Screen); Application.CreateForm(TAPA_Application, APA_Application); Application.CreateForm(TAPA_Grid, APA_Grid); Application.CreateForm(TAPA_Insert_Dimension, APA_Insert_Dimension); Application.CreateForm(TAPA_Insert_Hierarchy, APA_Insert_Hierarchy); Application.CreateForm(TAPA_Insert_Reqblock, APA_Insert_Reqblock); Application.CreateForm(TAPA_Input_Screen, APA_Input_Screen); Application.CreateForm(TAPA_Insert_Key, APA_Insert_Key); Application.CreateForm(TAPA_Options, APA_Options); Application.CreateForm(TAPA_Parameter, APA_Parameter); Application.CreateForm(TAPA_Selection_Screen, APA_Selection_Screen); Application.CreateForm(TAPA_Analyse, APA_Analyse); Application.CreateForm(TAPA_Showcosts, APA_Showcosts); Application.CreateForm(TAPA_Show_Process, APA_Show_Process); Application.CreateForm(TAPA_Sql, APA_Sql); Application.CreateForm(TAPA_Dialog, APA_Dialog); Application.CreateForm(TAPA_Help, APA_Help); Application.Run; end. 12.1.2 UNIT APA_ANALYSEUNIT.DFM object APA_Analyse: TAPA_Analyse Left = 220 Top = 114 Width = 696 Height = 480 Caption = 'APA_Analyse' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText - 255 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Position = poScreenCenter OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object Analysetext: TMemo Left = 0 Top = 0 Width = 688 Height = 405 Align = alClient ScrollBars = ssBoth TabOrder = 0 end object Panel1: TPanel Left = 0 Top = 405 Width = 688 Height = 41 Align = alBottom TabOrder = 1 object Button_Close: TButton Left = 16 Top = 8 Width = 75 Height = 25 Cancel = True Caption = 'Close' Default = True TabOrder = 0 OnClick = Button_CloseClick end end end 12.1.3 UNIT APA_ANALYSEUNIT.PAS unit APA_Analyseunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TAPA_Analyse = class(TForm) Analysetext: TMemo; Panel1: TPanel; Button_Close: TButton; procedure FormShow(Sender: TObject); procedure Button_CloseClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var APA_Analyse: TAPA_Analyse; implementation uses APA_Gridunit, APA_Parameterunit, APA_Applicationunit; {$R *.dfm} procedure TAPA_Analyse.FormShow(Sender: TObject); var counter, counter2,pos:longint; - 256 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN var anztupels:Int64; var anzrequired, anzmat:longint; var Countergebnisse,N,K,NK:Extended; var anznotredundant:longint; var aktzeile,aktspalte,count_of_derivates:longint; var derivspalte,derivzeile,possiblecubes:longint; begin //Anzeige der Analyse des BFT Analysetext.Lines.Clear; Analysetext.Lines.Add('Analysis of Base Fact Table (BFT):'); Analysetext.Lines.Add('=================================='); Analysetext.Lines.Add(''); //Berechnen der Tupels im BFT table anztupels:=0;anzmat:=0;anzrequired:=0;anznotredundant:=0; for counter:=0 to anzd-1 do begin; anztupels:=anztupels+countdaten[counter,0]; end; Analysetext.Lines.Add('Tupels from source: '+inttostr(anztupels)); Analysetext.Lines.Add(''); Analysetext.Lines.Add('List of Required cubes:'); Analysetext.Lines.Add('==========================='); for counter:=0 to anzzeilen-1 do begin for counter2:=0 to anzspalten-1 do begin if APA[counter2,counter].farbe=clYellow then begin anznotredundant:=anznotredundant+1; end; if APA[counter2,counter].interessant=true then begin anzrequired:=anzrequired+1; Analysetext.Lines.Add('Required cube: '+inttostr(counter2)+':'+inttostr(counter)+' '+APA[counter2,counter].kurzbez); end; end; end; Analysetext.Lines.Add('found '+inttostr(anzrequired)+' required cubes in '+inttostr(anznotredundant)+' not redundant cubes.'); Analysetext.Lines.Add(''); Analysetext.Lines.Add('List of Materialized cubes:'); Analysetext.Lines.Add('==========================='); for counter:=0 to anzzeilen-1 do begin for counter2:=0 to anzspalten-1 do begin if APA[counter2,counter].materalisieren=true then begin anzmat:=anzmat+1; Analysetext.Lines.Add('Materialized cube: '+inttostr(counter2)+':'+inttostr(counter)+' '+APA[counter2,counter].kurzbez); end; end; end; Analysetext.Lines.Add('found '+inttostr(anzmat)+' materialized cubes'); Analysetext.Lines.Add(''); Analysetext.Lines.Add('Deterministic solution:'); Analysetext.Lines.Add('==========================='); assignfile(fCountermerk,'C:\APADIR\DATA\Countermerk.dat'); {$i-} reset(fCountermerk); {$i+} if ioresult<>0 then showmessage('Can not open File Countermerk.dat'); assignfile(fCubes,'C:\APADIR\DATA\Cubes.dat'); {$i-} reset(fCubes); {$i+} if ioresult<>0 then showmessage('Can not open File Cubes.dat'); assignfile(fMerkkosten,'C:\APADIR\DATA\Merkkosten.dat'); {$i-} - 257 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN reset(fMerkkosten); {$i+} if ioresult<>0 then showmessage('Can not open File Merkkosten.dat'); try pos:=0; repeat; if (filesize(fCountermerk)>0) then begin; seek(fCountermerk,pos); read(fCountermerk,vCountermerk); seek(fCubes,round(vCountermerk.nr)-1); read(fCubes,vCubes); Analysetext.Lines.Add('Cube('+floattostr(vCountermerk.Lfnr)+'):'+floattostr(vCount ermerk.Nr)+' = (' +inttostr(vCubes.Spalte)+':'+inttostr(vCubes.Zeile)+')'); end; pos:=pos+1; until pos>=filesize(fCountermerk);; if (filesize(fMerkkosten)>0) then begin; Analysetext.Lines.Add(''); seek(fMerkkosten,0); read(fMerkkosten,vMerkkosten); Analysetext.Lines.Add('Costs: '+floattostr(vMerkkosten.Kosten)); seek(fMerkkosten,1); read(fMerkkosten,vMerkkosten); Analysetext.Lines.Add('Space left: '+floattostr(vMerkkosten.Kosten)); seek(fMerkkosten,2); read(fMerkkosten,vMerkkosten); Analysetext.Lines.Add('Time left: '+floattostr(vMerkkosten.Kosten)); end; Analysetext.Lines.Add(''); Analysetext.Lines.Add('Count of possible solution:'); Analysetext.Lines.Add('==========================='); {Berechne Possible Cubes} counter:=anzrequired; {1.b Setze Derivate zu} for aktzeile:=0 to anzzeilen-1 do begin for aktspalte:=0 to anzspalten-1 do begin if (APA[aktspalte,aktzeile].farbe=clYellow)and(APA[aktspalte,aktzeile].interessant=fa lse) then begin count_of_derivates:=0; for derivspalte:=0 to anzspalten-1 do begin; for derivzeile:=0 to anzzeilen-1 do begin; if (APA[derivspalte,derivzeile].interessant=true)and (APA[derivspalte,derivzeile].farbe=clYellow) then begin if APA_Grid.isderivat(aktspalte,aktzeile,derivspalte,derivzeile) then begin //Jetzt kontrollieren wir, ob dieser Würfel auch noch ein Derivat eines anderen Würfels count_of_derivates:=count_of_derivates+1; end;//Ende von derivat end;//Ende von interessant end;//of derivzeile end;//of derivsspalte - 258 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if count_of_derivates>=1 then begin Analysetext.Lines.Add('Possible cube: '+inttostr(aktspalte)+':'+inttostr(aktzeile)+' '+APA[aktspalte,aktzeile].kurzbez); counter:=counter+1; end; end//von Yellow else if (APA[aktspalte,aktzeile].farbe=clYellow)and(APA[aktspalte,aktzeile].interessant=tr ue) then Analysetext.Lines.Add('Possible and Required cube: '+inttostr(aktspalte)+':'+inttostr(aktzeile)+' '+APA[aktspalte,aktzeile].kurzbez); end;//aktspalte end;//aktzeile possiblecubes:=counter; Analysetext.Lines.Add('Found '+inttostr(possiblecubes)+' Possible Cubes'); {Berechne Permutation} Countergebnisse:=0; N:=1; for counter2:=1 to possiblecubes do N:=N*counter2; Analysetext.Lines.Add('Possible Combinations Permutation: '+floattostr(N)); for counter:=1 to possiblecubes do begin K:=1; for counter2:=1 to counter do K:=K*counter2; //K! NK:=1; for counter2:=1 to (possiblecubes-counter) do NK:=NK*counter2; Countergebnisse:=Countergebnisse+(N/(K*NK)); end; Analysetext.Lines.Add('Possible Combinations Kombination: '+floattostr(Countergebnisse)); finally CloseFile(fcountermerk); CloseFile(fMerkkosten); CloseFile(fCubes); end; end; procedure TAPA_Analyse.Button_CloseClick(Sender: TObject); begin Close; end; end. 12.1.4 UNIT APA_APPLICATIONUNIT.DFM object APA_Application: TAPA_Application Left = 158 Top = 115 ActiveControl = APA_Input_Screen_button BorderStyle = bsSingle Caption = 'APA Application' ClientHeight = 522 ClientWidth = 704 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] Menu = APA_Menu OldCreateOrder = False Position = poScreenCenter OnActivate = FormActivate OnCloseQuery = FormCloseQuery - 259 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN PixelsPerInch = 96 TextHeight = 13 object Image1: TImage Left = 0 Top = 0 Width = 704 Height = 522 Align = alClient Picture.Data = { 07544269746D61702EEB1000424D2EEB1000000000003600000028000000C302 00000A0200000100180000000000F8EA1000C30E0000C30E0000000000000000 . . . . . . . . . . . . . . . 5E4C5A5E4C5A5E4C5A5E4C5A5E4D5A5E4D5A5E4D5A5E4D5A5E4D5A5E4D5A5E4D 5A5E4D5A5E4E5A5E4E5A5E4E5A5E4E5B5E4E5B5E6E7C80000000} end object APA_Input_Screen_button: TButton Left = 40 Top = 152 Width = 75 Height = 25 Caption = 'Input Screen' TabOrder = 0 OnClick = APA_Input_Screen_buttonClick end object APA_Grid_button: TButton Left = 40 Top = 408 Width = 75 Height = 25 Caption = 'APA Grid' TabOrder = 1 OnClick = APA_Grid_buttonClick end object Button_Apa_Selection: TButton Left = 328 Top = 280 Width = 123 Height = 25 Caption = 'APA Selection Screen' TabOrder = 2 OnClick = Button_Apa_SelectionClick end object APA_Menu: TMainMenu Left = 528 Top = 8 object File1: TMenuItem Caption = 'File' object Open1: TMenuItem Caption = 'Open' OnClick = Open1Click end object Save1: TMenuItem Caption = 'Save' OnClick = Save1Click end object Saveas1: TMenuItem Caption = 'Save as ...' OnClick = Saveas1Click end object Exit1: TMenuItem Caption = 'Exit' OnClick = Exit1Click end end object Screens1: TMenuItem Caption = 'Screens' object InputScreen1: TMenuItem Caption = 'Input Screen' OnClick = InputScreen1Click end object APAGridScreen1: TMenuItem Caption = 'APA Grid Screen' - 260 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN OnClick = APAGridScreen1Click end object APASelectionScreen1: TMenuItem Caption = 'APA Selection Screen' OnClick = APASelectionScreen1Click end end object Berechnungen1: TMenuItem Caption = 'Random costs' object GeneriereZufallskosten1: TMenuItem Caption = 'Build random costs' OnClick = GeneriereZufallskosten1Click end object ShowRandomCosts1: TMenuItem Caption = 'Show random costs' OnClick = ShowRandomCosts1Click end object Restrictedcosts1: TMenuItem AutoCheck = True Caption = 'Restricted costs' Checked = True OnClick = Restrictedcosts1Click end end object Analyse1: TMenuItem Caption = 'Analyse' object AnalyseAPA1: TMenuItem Caption = 'Analyse APA' OnClick = AnalyseAPA1Click end end object Settings1: TMenuItem Caption = 'Settings' object Parameter1: TMenuItem Caption = 'Parameters' OnClick = Parameter1Click end object Options1: TMenuItem Caption = 'Options' OnClick = Options1Click end end object Help1: TMenuItem Caption = 'Help' object HelpfilesAPAprogram1: TMenuItem Caption = 'Help files APA program' OnClick = HelpfilesAPAprogram1Click end object HelpfilesforMainmenu1: TMenuItem Caption = 'Help files for Main menu' OnClick = HelpfilesforMainmenu1Click end end end object APASavedialog: TSaveDialog DefaultExt = 'apa' Filter = 'APA File|*.apa' InitialDir = 'c:\APADIR\Save' Left = 272 Top = 168 end object APAOpendialog: TOpenDialog DefaultExt = 'apa' Filter = 'APA File|*.apa' InitialDir = 'c:\APADIR\Save' Left = 368 Top = 120 end end - 261 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 12.1.5 UNIT APA_APPLICATIONUNIT.PAS unit APA_Applicationunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ExtCtrls, Math, ComCtrls, ShellCtrls; type Countertype= record Lfnr:Extended; Nr:Extended; end; type Cubestype= record Lfnr:Extended; Spalte:Longint; Zeile:Longint; Required:Longint; end; type Kostentype= record VonSpalte:Longint; VonZeile:Longint; ZuSpalte:Longint; ZuZeile:Longint; Query:Extended; Build:Extended; end; type Merkkostentype= record Lfnr:Extended; Kosten:Extended; end; type ReqCubestype= record Lfnr:Extended; Spalte:Longint; Zeile:Longint; end; type TAPA_Application = class(TForm) APA_Menu: TMainMenu; File1: TMenuItem; Open1: TMenuItem; Save1: TMenuItem; Saveas1: TMenuItem; Exit1: TMenuItem; Screens1: TMenuItem; InputScreen1: TMenuItem; APAGridScreen1: TMenuItem; APASelectionScreen1: TMenuItem; Berechnungen1: TMenuItem; Settings1: TMenuItem; Parameter1: TMenuItem; Options1: TMenuItem; Image1: TImage; APA_Input_Screen_button: TButton; APA_Grid_button: TButton; Button_Apa_Selection: TButton; APASavedialog: TSaveDialog; APAOpendialog: TOpenDialog; GeneriereZufallskosten1: TMenuItem; ShowRandomCosts1: TMenuItem; Restrictedcosts1: TMenuItem; Analyse1: TMenuItem; - 262 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN AnalyseAPA1: TMenuItem; Help1: TMenuItem; HelpfilesAPAprogram1: TMenuItem; HelpfilesforMainmenu1: TMenuItem; Shelldir: TShellTreeView; procedure Kostensortieren(); function findkosten(vonspalte,vonzeile,zuspalte,zuzeile:longint):boolean; procedure Parameter1Click(Sender: TObject); procedure Lade(Filename:string); procedure Open1Click(Sender: TObject); procedure Speichern(Filename:string); procedure Saveas1Click(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure InputScreen1Click(Sender: TObject); procedure APAGridScreen1Click(Sender: TObject); procedure APASelectionScreen1Click(Sender: TObject); procedure Options1Click(Sender: TObject); procedure APA_Input_Screen_buttonClick(Sender: TObject); procedure APA_Grid_buttonClick(Sender: TObject); procedure Button_Apa_SelectionClick(Sender: TObject); procedure FormActivate(Sender: TObject); procedure GeneriereZufallskosten1Click(Sender: TObject); procedure ShowRandomCosts1Click(Sender: TObject); procedure Save1Click(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure Restrictedcosts1Click(Sender: TObject); procedure AnalyseAPA1Click(Sender: TObject); procedure HelpfilesAPAprogram1Click(Sender: TObject); procedure HelpfilesforMainmenu1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var APA_Application: TAPA_Application; first:boolean=true; APAFilename:string ='C:\APA\SAVE\Default.apa'; mustsave:boolean =false; var Fcounter:file of Countertype; vcounter:Countertype; FCountermerk:file of Countertype; vcountermerk:Countertype; FCubes:file of Cubestype; vcubes:Cubestype; FKosten:file of Kostentype; vkosten:Kostentype; FMatCubes:file of ReqCubestype; vMatcubes:reqcubestype; FReqCubes:file of ReqCubestype; vreqcubes:ReqCubestype; FMerkkosten:file of Merkkostentype; vmerkkosten:Merkkostentype; implementation uses APA_Parameterunit, APA_Selectionunit, APA_Gridunit, APA_Optionsunit, APA_Analyseunit, APA_Input_Screenunit, APA_Show_costsunit, APA_Processunit, APA_Dialogunit, APA_Helpunit; {$R *.dfm} procedure TAPA_Application.Kostensortieren(); var pos:longint; var k1,k2:Kostentype; var max:longint; begin max:=filesize(fKosten)-1; pos:=max; - 263 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN repeat; if (pos>=1) then begin seek(fKosten,pos); read(fKosten,k1); seek(fKosten,pos-1); read(fKosten,k2); if ((k1.VonSpalte=k2.vonspalte)and(k1.VonZeile=k2.vonzeile)and(k1.ZuSpalte<k2.zuspalt e)and(k1.ZuZeile=k2.zuzeile)) then pos:=pos-1 else begin if (k1.VonSpalte<k2.vonspalte) or((k1.VonSpalte=k2.vonspalte)and(k1.VonZeile<k2.vonzeile)) or((k1.VonSpalte=k2.vonspalte)and(k1.VonZeile=k2.vonzeile)and(k1.ZuSpalte<k2.zuspa lte)) or((k1.VonSpalte=k2.vonspalte)and(k1.VonZeile=k2.vonzeile)and(k1.ZuSpalte=k2.zuspa lte)and(k1.ZuZeile<k2.zuzeile)) then begin //Grösser //Austauschen seek(fKosten,pos); write(fKosten,k2); seek(fKosten,pos-1); write(fKosten,k1); pos:=pos+2; if pos>max then pos:=max; end else begin //Kleiner =OK pos:=pos-1; end; end; //von<> end; until (Pos<=1); {Ausgabe der Cubes} {pos:=0; repeat; if pos<=max-1 then begin seek(fKosten,pos); read(fKosten,k1); APA_Show_Process.ausgabe(inttostr(k1.VonSpalte)+':'+inttostr(k1.VonZeile)+':'+inttostr(k 1.ZuSpalte)+':' +inttostr(k1.ZuZeile)+':'+Floattostr(k1.Query)+':'+Floattostr(k1.Build)); end; pos:=pos+1; until pos>=max;} end; function TAPA_Application.findkosten(vonspalte,vonzeile,zuspalte,zuzeile:longint):Boolean; var pos,bereich,max:longint; var k1:Kostentype; var gefunden:booleaN; var abbruch:longint; begin {$i-} abbruch:=0; max:=filesize(fKosten)-1; gefunden:=false; pos:=trunc((filesize(fKosten)+1)/2); bereich:=pos; seek(fKosten,pos); read(fKosten,k1); repeat; if ((k1.VonSpalte=vonspalte)and(k1.VonZeile=vonzeile)and(k1.ZuSpalte=zuspalte)and(k1. ZuZeile=zuzeile)) - 264 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN then begin;bereich:=0;gefunden:=true;end else begin if (k1.VonSpalte<vonspalte) or((k1.VonSpalte=vonspalte)and(k1.VonZeile<vonzeile)) or((k1.VonSpalte=vonspalte)and(k1.VonZeile=vonzeile)and(k1.ZuSpalte<zuspalte)) or((k1.VonSpalte=vonspalte)and(k1.VonZeile=vonzeile)and(k1.ZuSpalte=zuspalte)and(k 1.ZuZeile<zuzeile)) then begin //Grösser bereich:=trunc((bereich+1)/2); pos:=pos+bereich; if pos>max then pos:=max; end else begin //Kleiner bereich:=trunc((bereich+1)/2); pos:=pos-bereich; if pos<0 then pos:=0; end; seek(fKosten,pos); read(fKosten,k1); end; //von<> if bereich=1 then abbruch:=abbruch+1; until (bereich<1)or (abbruch>2); {$i+} if ioresult<>0 then gefunden:=false; if gefunden=true then begin vKosten:=k1; Result:=true; end else begin; Result:=false; end; end; procedure TAPA_Application.Parameter1Click(Sender: TObject); begin APA_Parameter.showmodal; end; procedure TAPA_Application.Lade(Filename:string); var APA_File:TextFile; st,st2,st3:string; var first2,fehler:boolean; var counter:longint; var fStreamladen,fStreamspeichern:TFileStream; begin fehler:=false; try APA_Grid.Removedeterministicsolution1Click(self); APA_Grid.Removepossiblecubes1Click(self); APA_Show_Process.ButtonPause.Visible:=false; APA_Show_Process.show; APA_Show_Process.APA_Protocoll.Clear; APA_Show_Process.ausgabe('Loading File: '+Filename); APA_Show_Process.ausgabe('Loading APA Data ...'); APA_Application.Enabled:=false; try assignfile(APA_File,Filename); {$i-} reset(APA_File); {$i+} if ioresult<>0 then begin; - 265 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Filename:='C:\APADIR\SAVE\Default.apa'; assignfile(APA_File,'C:\APADIR\SAVE\Default.apa'); reset(APA_File); end; first2:=true; APA_Input_Screen.Eingabe.Items.Clear; st:=''; while (not eof(APA_File))and(st<>'Ende Req') do begin readln(APA_File,st); if (st<>'Ende Input')and(st<>'Ende Req')and(st<>'Ende Keybox') then begin st2:=copy(st,1,5); st3:=copy(st,6,5); st:=copy(st,11,500); if APA_Input_Screen.Eingabe.Selected<>Nil then begin while (APA_Input_Screen.Eingabe.Selected.GetNext<>nil) do APA_Input_Screen.Eingabe.Selected:=APA_Input_Screen.Eingabe.Selected.GetNext; end; if (strtoint(st3)=1) then begin if first2=true then begin APA_Input_Screen.Eingabe.Selected:=APA_Input_Screen.Eingabe.Items.Add(nil,st); APA_Input_Screen.Eingabe.Selected.ImageIndex:=strtoint(st3); APA_Input_Screen.Eingabe.Selected.SelectedIndex:=strtoint(st3); end else APA_Input_Screen.Eingabe.Selected:=APA_Input_Screen.Eingabe.Items.Add(APA_Input_Sc reen.Eingabe.Selected, st); APA_Input_Screen.Eingabe.Selected.ImageIndex:=strtoint(st3); APA_Input_Screen.Eingabe.Selected.SelectedIndex:=strtoint(st3); end else begin if APA_Input_Screen.Eingabe.Selected.Level=0 then APA_Input_Screen.Eingabe.Selected:=APA_Input_Screen.Eingabe.Items.AddChild(APA_Inp ut_Screen.Eingabe.Selected, st) else APA_Input_Screen.Eingabe.Selected:=APA_Input_Screen.Eingabe.Items.Add(APA_Input_Sc reen.Eingabe.Selected, st); APA_Input_Screen.Eingabe.Selected.ImageIndex:=strtoint(st3); APA_Input_Screen.Eingabe.Selected.SelectedIndex:=strtoint(st3); end; end; end;//Ende von while1 APA_Selection_Screen.Req.items.clear; while (not eof(APA_File))and(st<>'Ende Input') do begin readln(APA_File,st); if (st<>'Ende Input')and(st<>'Ende Req')and(st<>'Ende Selection')and(st<>'Ende Keybox') then begin st2:=copy(st,1,5); st3:=copy(st,6,5); st:=copy(st,11,500); if APA_Input_Screen.Eingabe.Selected<>Nil then begin while (APA_Input_Screen.Eingabe.Selected.GetNext<>nil) do APA_Input_Screen.Eingabe.Selected:=APA_Input_Screen.Eingabe.Selected.GetNext; end; if (strtoint(st2)=0) then begin if first2=true then begin APA_Selection_Screen.Req.Selected:=APA_Selection_Screen.Req.Items.Add(nil,st); APA_Selection_Screen.Req.Selected.ImageIndex:=strtoint(st3); APA_Selection_Screen.Req.Selected.SelectedIndex:=strtoint(st3); end else - 266 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APA_Selection_Screen.Req.Selected:=APA_Selection_Screen.Req.Items.Add(APA_Selectio n_Screen.Req.Selected, st); APA_Selection_Screen.Req.Selected.ImageIndex:=strtoint(st3); APA_Selection_Screen.Req.Selected.SelectedIndex:=strtoint(st3); end else begin if APA_Selection_Screen.Req.Selected.Level=0 then APA_Selection_Screen.Req.Selected:=APA_Selection_Screen.Req.Items.AddChild(APA_Sel ection_Screen.Req.Selected, st) else APA_Selection_Screen.Req.Selected:=APA_Selection_Screen.REq.Items.Add(APA_Selectio n_Screen.Req.Selected, st); APA_Selection_Screen.Req.Selected.ImageIndex:=strtoint(st3); APA_Selection_Screen.Req.Selected.SelectedIndex:=strtoint(st3); end; end; end;//Ende von while2 APA_Selection_Screen.Listeint.Items.Clear; while ((not eof(APA_File))and(st<>'Ende Selection')) do begin readln(APA_File,st); if (st<>'Ende Input')and(st<>'Ende Req')and(st<>'Ende Selection')and(st<>'Ende Keybox') then begin APA_Selection_Screen.Listeint.Items.Add(st); end; end;//Ende von While3 APA_Grid_button.Enabled:=true; Button_Apa_Selection.Enabled:=true; APA_Grid.bezeichnungenholen(); generiereapaneu:=true; APA_Grid.FormShow(self); //Begin while 4 Matcount:=0; while (not eof(APA_File)and(st<>'Ende Cubes')) do begin readln(APA_File,st); if (st<>'Ende Input')and(st<>'Ende Req')and(st<>'Ende Selection')and(st<>'Ende Keybox')and(st<>'Ende Cubes') then begin if copy(st,1,1)='R' then begin APA[strtoint(copy(st,2,30)),strtoint(copy(st,32,30))].interessant:=true; APA[strtoint(copy(st,2,30)),strtoint(copy(st,32,30))].gewicht:=strtofloat(copy(st, 62,30)); APA[strtoint(copy(st,2,30)),strtoint(copy(st,32,30))].gewichtlevel:=strtoint(copy( st,92,30)); end; if copy(st,1,1)='M' then begin APA[strtoint(copy(st,2,30)),strtoint(copy(st,32,30))].materalisieren:=true; APA[strtoint(copy(st,2,30)),strtoint(copy(st,32,30))].matcount:=strtoint(copy(st,6 2,30)); Matcount:=Matcount+1; end; end; end;//Ende von While4 APA_Input_Screen.Keybox.Clear; while ((not eof(APA_File))and(st<>'Ende Keybox')) do begin - 267 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN readln(APA_File,st); if (st<>'Ende Input')and(st<>'Ende Req')and(st<>'Ende Selection')and(st<>'Ende Keybox')and(st<>'Ende Cubes') then begin APA_Input_Screen.Keybox.Items.Add(st); end; end;//Ende von While5 if (not eof(APA_File)) then begin readln(APA_File,st); APA_Parameter.APA_Thomas_timestore.text:=st; readln(APA_File,st); APA_Parameter.APA_Thomas_timeio.text:=st; readln(APA_File,st); APA_Parameter.APA_Thomas_avsizeoftupel.text:=st; readln(APA_File,st); APA_Parameter.APA_Thomas_timemax.text:=st; readln(APA_File,st); APA_Parameter.APA_Thomas_spacemax.text:=st; readln(APA_File,st); APA_Parameter.APA_Thomas_Importance.Position:=strtoint(st); readln(APA_File,st); APA_Parameter.APA_Thomas_Query_Importance.Position:=strtoint(st); readln(APA_File,st); if st<>'Ende Parameter' then begin APA_Parameter.APA_Thomas_newsetsoneachiteration.text:=st; readln(APA_File,st); APA_Parameter.APA_Thomas_countofsets.text:=st; readln(APA_File,st); end; if st<>'Ende Parameter' then begin APA_Parameter.APA_Thomas_timecpu.text:=st; readln(APA_File,st); end; if st<>'Ende Parameter' then begin if st='True' then Permutation:=true else Permutation:=false; readln(APA_File,st); end; if st<>'Ende Parameter' then begin APA_Parameter.APA_Thomas_querytimemax.text:=st; readln(APA_File,st); if st='True' then APA_Grid.Userandomcosts1.Checked:=true else APA_Grid.Userandomcosts1.Checked:=false; readln(APA_File,st); end; if (not(Eof(APA_File))) then begin st:='';APA_Parameter.APA_Degrees.clear; while(not(Eof(APA_File)))and(st<>'Ende Degrees') do begin readln(APA_File,st); if st<>'Ende Degrees' then APA_Parameter.APA_Degrees.Items.Add(st); end; st:='';APA_Parameter.APA_Degreecounts.Clear; while(not(Eof(APA_File)))and(st<>'Ende Degreescount') do begin readln(APA_File,st); if st<>'Ende Degreescount' then APA_Parameter.APA_Degreecounts.items.Add(st); end; for counter:=0 to 14 do begin readln(APA_File,st); DegreeColors[counter]:=strtoint(st); end; readln(APA_File,st); for counter:=0 to 14 do begin readln(APA_File,st); Othercolors[counter]:=strtoint(st); end; readln(APA_File,st); - 268 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end;//Ende von Eof2 dient der Rückwärtskompartibilität end;//Ende von not EOF APA_Grid.materialzeichnen; finally CloseFile(APA_File); if uppercase(APAFilename)<>uppercase('C:\APADIR\SAVE\Default.apa') then APA_Application.Caption:='APA Application - '+APAFilename else APA_Application.Caption:='APA Application '; end; try APA_Show_Process.ausgabe('Loading costs'); //Lade auch die Kosten //Lade aus Spezialdatei if fileexists(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))-3)+'ape') then begin try fStreamLaden:=TFileStream.Create(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))3)+'ape',fmOpenRead); try fStreamSpeichern:=TFileStream.Create('C:\APADIR\DATA\Kosten.dat',fmCreate); fStreamSpeichern.CopyFrom(fStreamLaden, fStreamLaden.Size); finally freeandnil(fStreamSpeichern); end; finally freeandnil(fStreamLaden); end; end; APA_Show_Process.ausgabe('Loading solution costs'); //Lade aus Spezialdatei if fileexists(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))-3)+'apf') then begin try fStreamLaden:=TFileStream.Create(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))3)+'apf',fmOpenRead); try fStreamSpeichern:=TFileStream.Create('C:\APADIR\DATA\Merkkosten.dat',fmCreate); fStreamSpeichern.CopyFrom(fStreamLaden, fStreamLaden.Size); finally freeandnil(fStreamSpeichern); end; finally freeandnil(fStreamLaden); end; end; APA_Show_Process.ausgabe('Loading cubes'); //Lade aus Spezialdatei if fileexists(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))-3)+'apd') then begin try fStreamLaden:=TFileStream.Create(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))3)+'apd',fmOpenRead); - 269 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN try fStreamSpeichern:=TFileStream.Create('C:\APADIR\DATA\Cubes.dat',fmCreate); fStreamSpeichern.CopyFrom(fStreamLaden, fStreamLaden.Size); finally freeandnil(fStreamSpeichern); end; finally freeandnil(fStreamLaden); end; end; APA_Show_Process.ausgabe('Loading counter'); //Lade aus Spezialdatei if fileexists(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))-3)+'apb') then begin try fStreamLaden:=TFileStream.Create(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))3)+'apb',fmOpenRead); try fStreamSpeichern:=TFileStream.Create('C:\APADIR\DATA\Counter.dat',fmCreate); fStreamSpeichern.CopyFrom(fStreamLaden, fStreamLaden.Size); finally freeandnil(fStreamSpeichern); end; finally freeandnil(fStreamLaden); end; end; APA_Show_Process.ausgabe('Loading solution'); //Lade aus Spezialdatei if fileexists(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))-3)+'apc') then begin try fStreamLaden:=TFileStream.Create(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))3)+'apc',fmOpenRead); try fStreamSpeichern:=TFileStream.Create('C:\APADIR\DATA\Countermerk.dat',fmCreate); fStreamSpeichern.CopyFrom(fStreamLaden, fStreamLaden.Size); finally freeandnil(fStreamSpeichern); end; finally freeandnil(fStreamLaden); end; end; except showmessage('Could not load costs'); fehler:=true; end; finally APA_Application.Enabled:=true; APA_Show_Process.ButtonCancel.Caption:='Close'; if fehler=false then APA_Show_Process.Ausschalten.Enabled:=true else APA_Show_Process.ButtonCancel.Caption:='Close'; mustsave:=false; end; end; procedure TAPA_Application.Open1Click(Sender: TObject); - 270 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN begin APAOpendialog.InitialDir:= APA_Options.APA_Save_Path.Directory; If APAOpendialog.Execute then begin if mustsave=true then begin APA_Dialog.APA_Text.Caption:='You did not save your APA. Do you want to save?'; if APA_Dialog.showmodal=mryes then begin; if APAFilename='C:\APADIR\SAVE\Default.apa' then Saveas1Click(self) else Speichern(APAFilename); end; end; APAFilename:=APAOpendialog.FileName; Lade(APAFileName); end; end; procedure TAPA_Application.Speichern(Filename:string); var APA_File: TextFile; counter,counter2:longint; st:string; fStreamladen,fStreamspeichern:TFileStream; begin try APA_Show_Process.ButtonPause.Visible:=false; APA_Show_Process.show; APA_Show_Process.APA_Protocoll.Clear; APA_Show_Process.ausgabe('Saving File: '+Filename); APA_Show_Process.ausgabe('Save APA Data ...'); APA_Application.Enabled:=false; assignfile(APA_File,APAFilename); try rewrite(APA_File); APA_Show_Process.ausgabe('Save APA Input Screen'); for counter:=0 to APA_Input_Screen.Eingabe.Items.Count-1 do begin st:=APA_Grid.auffuellen(inttostr(APA_Input_Screen.Eingabe.Items[counter].Level),5)+ APA_Grid.auffuellen(inttostr(APA_Input_Screen.Eingabe.Items[counter].Imageindex),5 )+ APA_Input_Screen.Eingabe.Items[counter].Text; writeln(APA_File,st); end; writeln(APA_File,'Ende Req'); APA_Show_Process.ausgabe('Save APA Selection Screen'); for counter:=0 to APA_Selection_Screen.Req.Items.Count-1 do begin st:=APA_Grid.auffuellen(inttostr(APA_Selection_Screen.Req.Items[counter].Level),5)+ APA_Grid.auffuellen(inttostr(APA_Selection_Screen.Req.Items[counter].ImageIndex),5 )+ APA_Selection_Screen.Req.Items[counter].Text; writeln(APA_File,st); end; writeln(APA_File,'Ende Input'); for counter:=0 to APA_Selection_Screen.Listeint.Items.Count-1 do begin st:=APA_Selection_Screen.Listeint.Items[counter]; writeln(APA_File,st); end; writeln(APA_File,'Ende Selection'); APA_Show_Process.ausgabe('Save required and materialized cubes'); for counter:=0 to anzzeilen-1 do begin for counter2:=0 to anzspalten-1 do begin - 271 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if (APA[counter2,counter].interessant=true) then begin st:='R'+APA_Grid.auffuellen(inttostr(counter2),30)+APA_Grid.auffuellen(inttostr(co unter),30)+ APA_Grid.auffuellen(floattostr(APA[counter2,counter].gewicht),30)+APA_Grid.auffuel len(inttostr(APA[counter2,counter].gewichtlevel),30); writeln(APA_File,st); end; if (APA[counter2,counter].materalisieren=true) then begin st:='M'+APA_Grid.auffuellen(inttostr(counter2),30)+APA_Grid.auffuellen(inttostr(co unter),30)+ APA_Grid.auffuellen(inttostr(APA[counter2,counter].matcount),30); writeln(APA_File,st); end; end; end; writeln(APA_File,'Ende Cubes'); APA_Show_Process.ausgabe('Save APA Input Screen Keybox'); for counter:=0 to APA_Input_Screen.keybox.Items.Count-1 do begin writeln(APA_File,APA_Input_Screen.keybox.Items[counter]); end; writeln(APA_File,'Ende Keybox'); APA_Show_Process.ausgabe('Save APA Parameter'); writeln(APA_File,APA_Parameter.APA_Thomas_timestore.text); writeln(APA_File,APA_Parameter.APA_Thomas_timeio.text); writeln(APA_File,APA_Parameter.APA_Thomas_avsizeoftupel.text); writeln(APA_File,APA_Parameter.APA_Thomas_timemax.text); writeln(APA_File,APA_Parameter.APA_Thomas_spacemax.text); writeln(APA_File,inttostr(APA_Parameter.APA_Thomas_Importance.Position)); writeln(APA_File,inttostr(APA_Parameter.APA_Thomas_Query_Importance.Position)); writeln(APA_File,APA_Parameter.APA_Thomas_newsetsoneachiteration.text); writeln(APA_File,APA_Parameter.APA_Thomas_countofsets.text); writeln(APA_File,APA_Parameter.APA_Thomas_timecpu.text); if Permutation=true then writeln(APA_File,'True')else writeln(APA_File,'False'); writeln(APA_File,APA_Parameter.APA_Thomas_querytimemax.text); if APA_Grid.Userandomcosts1.Checked=true then writeln(APA_File,'True')else writeln(APA_File,'False'); writeln(APA_File,'Ende Parameter'); for counter:=0 to APA_Parameter.APA_Degrees.Items.Count-1 do begin writeln(APA_File,APA_Parameter.APA_Degrees.Items[counter]); end; writeln(APA_File,'Ende Degrees'); for counter:=0 to APA_Parameter.APA_Degreecounts.Items.Count-1 do begin writeln(APA_File,APA_Parameter.APA_Degreecounts.Items[counter]); end; writeln(APA_File,'Ende Degreescount'); for counter:=0 to 14 do begin writeln(APA_File,inttostr(DegreeColors[counter])); end; writeln(APA_File,'Ende Farben'); for counter:=0 to 14 do begin writeln(APA_File,inttostr(Othercolors[counter])); end; writeln(APA_File,'Ende Andere Farben'); finally Closefile(APA_File); APA_Application.Caption:='APA Application - '+APAFilename; - 272 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; try APA_Show_Process.ausgabe('Save costs'); //Speichere auch die Kosten //Speichere in Spezialdatei {$i-} CloseFile(fKosten); {$i+} if ioresult<>0 then APA_Show_Process.ausgabe('Close cost database'); try fStreamLaden:=TFileStream.Create('C:\APADIR\DATA\Kosten.dat',fmOpenRead); try fStreamSpeichern:=TFileStream.Create(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))3)+'ape',fmCreate); fStreamSpeichern.CopyFrom(fStreamLaden, fStreamLaden.Size); finally freeandnil(fStreamSpeichern); end; finally freeandnil(fStreamLaden); end; APA_Show_Process.ausgabe('Save solution'); //Speichere in Spezialdatei try fStreamLaden:=TFileStream.Create('C:\APADIR\DATA\Countermerk.dat',fmOpenRead); try fStreamSpeichern:=TFileStream.Create(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))3)+'apc',fmCreate); fStreamSpeichern.CopyFrom(fStreamLaden, fStreamLaden.Size); finally freeandnil(fStreamSpeichern); end; finally freeandnil(fStreamLaden); end; APA_Show_Process.ausgabe('Save cubes'); //Speichere in Spezialdatei try fStreamLaden:=TFileStream.Create('C:\APADIR\DATA\Cubes.dat',fmOpenRead); try fStreamSpeichern:=TFileStream.Create(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))3)+'apd',fmCreate); fStreamSpeichern.CopyFrom(fStreamLaden, fStreamLaden.Size); finally freeandnil(fStreamSpeichern); end; finally freeandnil(fStreamLaden); end; APA_Show_Process.ausgabe('Save counter'); //Speichere in Spezialdatei try fStreamLaden:=TFileStream.Create('C:\APADIR\DATA\Counter.dat',fmOpenRead); try fStreamSpeichern:=TFileStream.Create(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))3)+'apb',fmCreate); fStreamSpeichern.CopyFrom(fStreamLaden, fStreamLaden.Size); finally freeandnil(fStreamSpeichern); end; finally freeandnil(fStreamLaden); end; - 273 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APA_Show_Process.ausgabe('Save solution costs'); //Speichere in Spezialdatei try fStreamLaden:=TFileStream.Create('C:\APADIR\DATA\Merkkosten.dat',fmOpenRead); try fStreamSpeichern:=TFileStream.Create(ExtractFilePath(filename)+ copy(ExtractFilename(filename),1,length(ExtractFilename(filename))3)+'apf',fmCreate); fStreamSpeichern.CopyFrom(fStreamLaden, fStreamLaden.Size); finally freeandnil(fStreamSpeichern); end; finally freeandnil(fStreamLaden); end; except showmessage('Could not save costs'); end; finally APA_Show_Process.ButtonCancel.Caption:='Close'; APA_Show_Process.Ausschalten.Enabled:=true; APA_Application.Enabled:=true; mustsave:=false; end; end; procedure TAPA_Application.Saveas1Click(Sender: TObject); begin APASavedialog.InitialDir:= APA_Options.APA_Save_Path.Directory; if APASavedialog.Execute then begin APAFilename:= APASavedialog.FileName; Speichern(APAFilename); end; end; procedure TAPA_Application.Exit1Click(Sender: TObject); begin Close; end; procedure TAPA_Application.InputScreen1Click(Sender: TObject); begin APA_Input_Screen_buttonClick(self); end; procedure TAPA_Application.APAGridScreen1Click(Sender: TObject); begin APA_Grid_buttonClick(self); end; procedure TAPA_Application.APASelectionScreen1Click(Sender: TObject); begin Button_Apa_SelectionClick(self); end; procedure TAPA_Application.Options1Click(Sender: TObject); begin APA_Options.showmodal; end; procedure TAPA_Application.APA_Input_Screen_buttonClick(Sender: TObject); begin APA_Application.Hide; try APA_Input_Screen.ShowModal finally - 274 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APA_Application.Show; end; end; procedure TAPA_Application.APA_Grid_buttonClick(Sender: TObject); begin APA_Application.Hide; {Generieren des APA } try gotoInput:=false; gotoSelection:=false; bezeichnungenkontrolliert:=false; APA_Grid.bezeichnungenholen(); if bezeichnungenkontrolliert=true then begin; APA_Grid.WindowState:=wsMaximized; APA_Grid.showmodal; Button_APA_Selection.Enabled:=true; end else begin; gotoInput:=true; end; if gotoInput=true then begin;gotoInput:=false;APA_Input_Screen_button.Click;end; if gotoSelection=true then begin;gotoSelection:=false;Button_Apa_Selection.Click;end; finally APA_Application.Show; end; end; procedure TAPA_Application.Button_Apa_SelectionClick(Sender: TObject); var zahler:longint; begin APA_Application.Hide; try {Laden der möglichen Dimensionen und Hierarchiestufen} {1. Dimensionen laden} with APA_Selection_Screen do begin Dimensionbox.Items.Clear; Hierarchybox.Items.Clear; for zahler:= 0 to anzd-1 do begin Dimensionbox.Items.Add(dimbez[zahler]); end; Dimensionbox.itemindex:=0; {Füllen der Hierarchien} hierarchybox.Items.Clear; {Hole die Hierarchiestufen} for zahler:=0 to anzh[Dimensionbox.itemindex]-1 do begin Hierarchybox.Items.Add(dl[Dimensionbox.itemindex][zahler]) end; Hierarchybox.ItemIndex:=0; Methodbox.ItemIndex:=0; End_of_methodbox.Enabled:=false; end;{Ende von APA_Selection_Screen} APA_Selection_Screen.WindowState:=wsMaximized; APA_Selection_Screen.showmodal; if gotoAPA=true then begin;gotoAPA:=false;APA_Grid_Button.Click;end; finally - 275 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APA_Application.Show; end; end; procedure TAPA_Application.FormActivate(Sender: TObject); var merkfile:TextFile; st:string; var fStreamladen,fStreamspeichern:TFileStream; begin if first=true then begin; {showmessage('Dies ist eine Betaversion. Für Fehler oder unrichtige Ergebnisse wird keine Garantie übernommen. c)Thomas ACHS');} first:=false; assignfile(merkfile,'C:\APADIR\PROGRAM\Settings.tom'); try reset(merkfile); readln(merkfile,APAFilename); readln(merkfile,st); if st='True' then APA_Options.APA_Load_Last_APA.Checked:=true else APA_Options.APA_Load_Last_APA.Checked:=false; readln(merkfile,st); if st='True' then APA_Options.APA_Save_on_termination.Checked:=true else APA_Options.APA_Save_on_termination.Checked:=false; readln(merkfile,st); if st='True' then APA_Options.APA_Remove_redundancy.Checked:=true else APA_Options.APA_Remove_redundancy.Checked:=false; APA_Grid.Remove_Redundancy.Checked:=APA_Options.APA_Remove_redundancy.Checked; readln(merkfile,st); if st='True' then APA_Options.APA_Add_max_hier.Checked:=true else APA_Options.APA_Add_max_hier.Checked:=false; readln(merkfile,st); //Früher Saverandomcosts if st='True' then APA_Options.APA_Show_Link_on_Desktop.Checked:=true else APA_Options.APA_Show_Link_on_Desktop.Checked:=false; readln(merkfile,st); APA_Options.APA_Save_Path.Directory:=st; if not(eof(merkfile)) then begin readln(merkfile,st); if st='True' then APA_Options.APA_ShowScreenheuristic.Checked:=true else APA_Options.APA_ShowScreenheuristic.Checked:=false; end; finally Closefile(merkfile); end; if APA_Options.APA_Load_Last_APA.Checked=true then begin //Lade Lade(APAFilename); end else begin; Lade('c:\APADIR\Save\Default.APA'); end; if APA_Options.APA_Show_Link_on_Desktop.Checked=true then begin if fileexists(shelldir.Path+'\APAWin.lnk')=false then begin try - 276 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN fStreamLaden:=TFileStream.Create('c:\APADIR\PROGRAM\APAWin.lnk',fmOpenRead); try fStreamSpeichern:=TFileStream.Create(shelldir.Path+'\APAWin.lnk',fmCreate); fStreamSpeichern.CopyFrom(fStreamLaden, fStreamLaden.Size); finally freeandnil(fStreamSpeichern); end; finally freeandnil(fStreamLaden); end; end else begin //Löschen if fileexists(shelldir.Path+'\APAWin.lnk')=true then begin try deletefile(shelldir.Path+'\APAWin.lnk'); except showmessage('Can not remove link from Desktop'); end; end; end; end; end; end; procedure TAPA_Application.GeneriereZufallskosten1Click(Sender: TObject); var hauptspalte,hauptzeile,aktspalte,aktzeile:longint; Maxkosten, maxkosten2,KostenvomBFT, KostenvomBFT2, KostenParent,KostenParent2:longint; costmerk:longint; parentspalte,parentzeile:longint; bandbreite:longint; begin if generiereapaneu=true then begin APA_Grid.FormShow(self); end; assignfile(fKosten,'C:\APADIR\DATA\Kosten.dat'); {$i-} rewrite(fKosten); {$i+} if ioresult<>0 then begin; showmessage('cost database error ');exit;end; try APA_Show_Process.ButtonPause.Visible:=false; APA_Show_Process.show; APA_Application.Enabled:=false; bandbreite:=100000; stop:=false; APA_Show_Process.APA_Protocoll.Clear; APA_Show_Process.ausgabe('Build Costs ...'); Randomize; //Zuerst lösche alle alten Kosten aus der Tabelle APA_Show_Process.ausgabe('Clear costs...'); //Generiere alle Kanten indem von jedem Würfel die Kanten zu allen seinen Derivaten bewertet werden //und die Kosten vom BFT zu dem Würfel die max Kosten sind 10000 if APA_Application.Restrictedcosts1.Checked=true then begin //************************************** // Erster Lauf //************************************** //Bewerte alle Kosten aus dem BFT - 277 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN for hauptspalte:=0 to anzspalten-1 do begin for hauptzeile:=0 to anzzeilen-1 do begin if APA[hauptspalte,hauptzeile].farbe=clYellow then begin //Suche alle Parents und merke die die geringsten Kosten des Parents maxkosten2:=bandbreite; maxkosten:=bandbreite; for aktspalte:=0 to anzspalten-1 do begin for aktzeile:=0 to anzzeilen-1 do begin if APA[aktspalte,aktzeile].farbe=clYellow then begin if (APA_Grid.isderivat(aktspalte,aktzeile,hauptspalte,hauptzeile)=true) and (not((hauptspalte=aktspalte)and(hauptzeile=aktzeile))) then begin if findkosten(-1,-1,aktspalte,aktzeile)=true then begin if vkosten.Query<maxkosten2 then maxkosten2:=round(vkosten.query); if vkosten.Build<maxkosten then maxkosten:=round(vkosten.build); end; end;//isderivat end;//von farbe Redundant end;//Ende von aktzeile end;//Ende von aktspalte //Zufallskosten vom BFT KostenvomBFT:=1+random(maxkosten-1);//Materialisierungskosten KostenvomBFT2:=1+random(min(KostenvomBFT,maxkosten2)-1);//Abfragekosten APA_Show_Process.ausgabe('Build First BFT('+inttostr(hauptspalte)+ ':'+inttostr(hauptzeile)+'): '+inttostr(KostenvomBFT2)+'/'+inttostr(KostenvomBFT)); //Eintragen der Kosten vom BFT seek(fKosten,filesize(fKosten)); vkosten.VonSpalte:=-1; vkosten.VonZeile:=-1; vkosten.ZuSpalte:=hauptspalte; vkosten.ZUZeile:=hauptzeile; vkosten.Query:=KostenvomBFT2; vkosten.Build:=KostenvomBFT; write(fKosten,vkosten);Kostensortieren; end;//Ende von nicht Redundant end;//Ende Zeile end;//Ende von Spalte //************************************** // Zweiter Lauf - Kosten zwischen den Cubes berechnen //************************************** APA_Show_Process.ausgabe('Start second run...'); for hauptspalte:=0 to anzspalten-1 do begin for hauptzeile:=0 to anzzeilen-1 do begin if APA[hauptspalte,hauptzeile].farbe=clYellow then begin APA_Show_Process.ausgabe('Kontrolliere Cube ('+inttostr(hauptspalte)+':'+inttostr(hauptzeile)+')'); //Durchlaufen der Derivate des Würfels //Die Kosten für die Derivate können nicht größer sein als das Erzeugen aus dem BFT //oder die Kosten des Vorgängers von seinem Derivat for aktspalte:=0 to anzspalten-1 do begin for aktzeile:=0 to anzzeilen-1 do begin if APA[aktspalte,aktzeile].farbe=clYellow then begin - 278 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN If (APA_Grid.isderivat(aktspalte,aktzeile,hauptspalte,hauptzeile)=true)and (not((hauptspalte=aktspalte)and(hauptzeile=aktzeile))) //Der Parent aggregiert die gleiche Dimension then begin //Suche Maxkosten vom BFT if (findkosten(-1,-1,hauptspalte,hauptzeile)=true) then begin maxkosten:=round(vkosten.Build); maxkosten2:=round(vKosten.Query); end else begin maxkosten:=bandbreite; maxkosten2:=bandbreite; end; //Kosten der Materialisierung vom BFT costmerk:=round(APA_Grid.getbuild(-1,-1,hauptspalte,hauptzeile)); if (costmerk<maxkosten) then maxkosten:=costmerk; costmerk:=round(APA_Grid.getquery(-1,-1,hauptspalte,hauptzeile)); if (costmerk<maxkosten2) then maxkosten2:=costmerk; //Kosten einer Parents gleicher Dimension if (APA[aktspalte,aktzeile].countdimension=APA[hauptspalte,hauptzeile].countdimension ) then begin //Suche den Parent von diesem Cube, welcher die gleich Hierarchie erhöht for parentspalte:=0 to anzspalten-1 do begin; for parentzeile:=0 to anzzeilen-1 do begin; if APA_Grid.isderivat(parentspalte,parentzeile,aktspalte,aktzeile)and (parentspalte<>aktspalte)and(parentzeile<>aktzeile) then begin if (APA[aktspalte,aktzeile].countdimension=APA[parentspalte,parentzeile].countdimensi on) then begin costmerk:=round(APA_Grid.getbuild(parentspalte,parentzeile,aktspalte,aktzeile)); if (costmerk<maxkosten) then maxkosten:=costmerk; costmerk:=round(APA_Grid.getquery(parentspalte,parentzeile,aktspalte,aktzeile)); if (costmerk<maxkosten2) then maxkosten2:=costmerk; end;//gleich dimension end;//isderivat end;//parentspalte end;//parentzeile end; KostenParent:=1+random(maxkosten-1); KostenParent2:=1+random(maxkosten2-1); APA_Show_Process.ausgabe('Build from ('+inttostr(aktspalte)+':'+ inttostr(aktzeile)+') to ('+inttostr(hauptspalte)+':'+ inttostr(hauptzeile)+'): '+inttostr(Kostenparent2)+'/'+inttostr(Kostenparent)); Seek(fKosten,filesize(fKosten)); vKosten.VonSpalte:=aktspalte; vKosten.VonZeile:=aktzeile; vKosten.ZuSpalte:=hauptspalte; vKosten.ZUZeile:=hauptzeile; vKosten.Query:=KostenParent2; vKosten.Build:=KostenParent; write(fKosten,vkosten);Kostensortieren; end;// is Parent end;///is yellow - 279 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end;//aktzeile end;//aktspalte end;//Ende von nicht Redundant end;//Ende Zeile end;//Ende Spalte end // von total Random costs else begin for hauptzeile:=0 to anzzeilen-1 do begin for hauptspalte:=0 to anzspalten-1 do begin if APA[hauptspalte,hauptzeile].farbe=clYellow then begin {1.Generiere Kosten von BFT} KostenvomBFT:=1+random(bandbreite-1);//Materialisierungskosten KostenvomBFT2:=1+random(KostenvomBFT-1);//Abfragekosten APA_Show_Process.ausgabe('Build BFT('+inttostr(hauptspalte)+ ':'+inttostr(hauptzeile)+'): '+inttostr(KostenvomBFT2)+'/'+inttostr(KostenvomBFT)); //Eintragen der Kosten vom BFT seek(fKosten,filesize(fKosten)); vKosten.VonSpalte:=-1; vKosten.VonZeile:=-1; vKosten.ZuSpalte:=hauptspalte; vKosten.ZUZeile:=hauptzeile; vKosten.Query:=KostenvomBFT2; vKosten.Build:=KostenvomBFT; write(fKosten,vKosten);Kostensortieren; {2.Generiere Kosten aller Derivate} for aktspalte:=0 to anzspalten-1 do begin for aktzeile:=0 to anzzeilen-1 do begin if (APA[aktspalte,aktzeile].farbe=clYellow) then begin if (APA_Grid.isderivat(hauptspalte,hauptzeile,aktspalte,aktzeile)) then begin //Eintragen der Kosten KostenvomBFT:=1+random(bandbreite-1);//Materialisierungskosten KostenvomBFT2:=1+random(KostenvomBFT-1);//Abfragekosten APA_Show_Process.ausgabe('Build from ('+inttostr(hauptspalte)+':'+ inttostr(hauptzeile)+') to ('+inttostr(aktspalte)+':'+ inttostr(aktzeile)+'): '+inttostr(KostenvomBFT2)+'/'+inttostr(KostenvomBFT)); //Eintragen der Kosten vom BFT seek(fKosten,filesize(fKosten)); vKosten.VonSpalte:=hauptspalte; vKosten.VonZeile:=hauptzeile; vKosten.ZuSpalte:=aktspalte; vKosten.ZUZeile:=aktzeile; vKosten.Query:=KostenvomBFT2; vKosten.Build:=KostenvomBFT; write(fKosten,vKosten); Kostensortieren; end;//isderivat end;//not redundant end;//aktzeile end;//aktspalte end;//not redundant end;//hauptspalte end;//hauptzeile end; finally CloseFile(fKosten); APA_Application.Enabled:=true; end; APA_Show_Process.ButtonCancel.Caption:='Close'; APA_Showcosts.showmodal; mustsave:=true; - 280 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APA_Show_Process.ausgabe(''); APA_Show_Process.ausgabe('READY'); APA_Show_Process.ausgabe(''); end; procedure TAPA_Application.ShowRandomCosts1Click(Sender: TObject); begin APA_Showcosts.showmodal; end; procedure TAPA_Application.Save1Click(Sender: TObject); begin if uppercase(APAFilename)=uppercase('C:\APADIR\SAVE\Default.apa') then Saveas1Click(self) else Speichern(APAFilename); end; procedure TAPA_Application.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var merkfile:TextFile; begin if APA_Options.APA_Save_on_termination.Checked=true then begin if mustsave=true then Speichern(Apafilename); end; if mustsave=true then begin APA_Dialog.APA_Text.Caption:='You did not save your APA. Do you want to save?'; if APA_Dialog.showmodal=mryes then begin; Save1Click(self); end; end; assignfile(merkfile,'C:\APADIR\PROGRAM\Settings.tom'); try rewrite(merkfile); writeln(merkfile,APAFilename); if APA_Options.APA_Load_Last_APA.Checked=true then writeln(merkfile,'True') else writeln(merkfile,'False'); if APA_Options.APA_Save_on_termination.Checked=true then writeln(merkfile,'True') else writeln(merkfile,'False'); if APA_Options.APA_Remove_redundancy.Checked=true then writeln(merkfile,'True') else writeln(merkfile,'False'); if APA_Options.APA_Add_max_hier.Checked=true then writeln(merkfile,'True') else writeln(merkfile,'False'); if APA_Options.APA_Show_Link_on_Desktop.Checked=true then writeln(merkfile,'True') else writeln(merkfile,'False'); writeln(merkfile,APA_Options.APA_Save_Path.Directory); if APA_Options.APA_ShowScreenheuristic.Checked=true then writeln(merkfile,'True') else writeln(merkfile,'False'); finally Closefile(merkfile); end; end; - 281 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN procedure TAPA_Application.Restrictedcosts1Click(Sender: TObject); begin APA_Grid.Restrictedcosts1.Checked:=APA_Application.Restrictedcosts1.Checked; end; procedure TAPA_Application.AnalyseAPA1Click(Sender: TObject); begin if generiereapaneu=true then begin APA_Grid.FormShow(self); end; APA_Analyse.show; end; procedure TAPA_Application.HelpfilesAPAprogram1Click(Sender: TObject); begin APA_Help.show; APA_Help.APABrowser.Navigate('C:\APADIR\Help\index.htm'); end; procedure TAPA_Application.HelpfilesforMainmenu1Click(Sender: TObject); begin APA_Help.show; APA_Help.APABrowser.Navigate('C:\APADIR\Help\APA_Mainmenu.htm'); end; procedure TAPA_Application.FormCreate(Sender: TObject); begin CurrencyString:=''; ShortDateFormat:='dd.mm.yyyy'; LongDateFormat:='dd.mm.yyyy'; DateSeparator := '.'; ThousandSeparator:='.'; DecimalSeparator:=','; CurrencyDecimals:=2; ShortTimeFormat:='hh:nn'; LongTimeFormat:='hh:nn'; end; end. 12.1.6 UNIT APA_DIALOGUNIT.DFM object APA_Screen: TAPA_Screen Left = 220 Top = 114 Width = 696 Height = 480 Caption = 'APA_Screen' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 12.1.7 ENDUNIT APA_DIALOGUNIT.PAS unit APA_Dialogunit; interface uses - 282 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls; type TAPA_Dialog = class(TForm) APA_Text: TLabel; Panel1: TPanel; BitBtn1: TBitBtn; BitBtn2: TBitBtn; procedure Button1Click(Sender: procedure Button2Click(Sender: procedure BitBtn1Click(Sender: procedure BitBtn2Click(Sender: private { Private-Deklarationen } public { Public-Deklarationen } end; TObject); TObject); TObject); TObject); var APA_Dialog: TAPA_Dialog; implementation {$R *.dfm} procedure TAPA_Dialog.Button1Click(Sender: TObject); begin Close; end; procedure TAPA_Dialog.Button2Click(Sender: TObject); begin Close; end; procedure TAPA_Dialog.BitBtn1Click(Sender: TObject); begin Modalresult:=mrYes; end; procedure TAPA_Dialog.BitBtn2Click(Sender: TObject); begin Modalresult:=mrNo; end; end. 12.1.8 UNIT APA_GRIDUNIT.DFM object APA_Grid: TAPA_Grid Left = 12 Top = 147 Width = 909 Height = 541 Caption = 'APA Grid' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] Menu = APAGridMenu OldCreateOrder = False Position = poScreenCenter OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object APAGrid: TDrawGrid Left = 1 - 283 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Top = 65 Width = 900 Height = 381 Align = alClient ColCount = 1 DefaultDrawing = False FixedCols = 0 RowCount = 1 FixedRows = 0 Options = [] PopupMenu = Gridpopup TabOrder = 0 OnClick = APAGridClick OnDblClick = APAGridDblClick OnDrawCell = APAGridDrawCell OnMouseDown = APAGridMouseDown OnMouseMove = APAGridMouseMove OnMouseWheelDown = APAGridMouseWheelUp OnMouseWheelUp = APAGridMouseWheelUp end object Panel1: TPanel Left = 0 Top = 0 Width = 901 Height = 41 Align = alTop TabOrder = 1 OnDblClick = Panel1DblClick object Button_remove_materialized_cubes: TButton Left = 8 Top = 8 Width = 151 Height = 25 Caption = 'Remove materialized cubes' TabOrder = 0 OnClick = Button_remove_materialized_cubesClick end object Button_remove_derivatives: TButton Left = 168 Top = 8 Width = 151 Height = 25 Caption = 'Remove derivatives' TabOrder = 1 OnClick = Button_remove_derivativesClick end object Button_remove_required_cubes: TButton Left = 328 Top = 8 Width = 151 Height = 25 Caption = 'Remove required cubes' TabOrder = 2 OnClick = Button_remove_required_cubesClick end object Remove_Redundancy: TCheckBox Left = 488 Top = 8 Width = 145 Height = 23 Caption = 'Remove redundancy' TabOrder = 3 OnClick = Remove_RedundancyClick end object Button1: TButton Left = 616 Top = 8 Width = 41 Height = 25 Caption = 'Prosser' TabOrder = 4 Visible = False OnClick = Button1Click end - 284 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN object Button2: TButton Left = 664 Top = 8 Width = 33 Height = 25 Caption = 'Tom' TabOrder = 5 Visible = False OnClick = Button2Click end object Button3: TButton Left = 704 Top = 8 Width = 49 Height = 25 Caption = 'Richtig' TabOrder = 6 Visible = False OnClick = Button3Click end object Button4: TButton Left = 760 Top = 8 Width = 49 Height = 25 Caption = 'Richtig2' TabOrder = 7 Visible = False OnClick = Button4Click end end object Panel2: TPanel Left = 0 Top = 446 Width = 901 Height = 41 Align = alBottom TabOrder = 2 object Button_to_Input_Screen: TButton Left = 16 Top = 8 Width = 152 Height = 25 Caption = 'Back to Input Screen' ModalResult = 3 TabOrder = 0 OnClick = Button_to_Input_ScreenClick end object Button_to_Selection_Screen: TButton Left = 176 Top = 8 Width = 152 Height = 25 Caption = 'APA Selection Screen' ModalResult = 4 TabOrder = 1 OnClick = Button_to_Selection_ScreenClick end object Button_to_Main_Menu: TButton Left = 336 Top = 8 Width = 152 Height = 25 Caption = 'Back to Main Menu' TabOrder = 2 OnClick = Button_to_Main_MenuClick end end object StatusBar: TStatusBar Left = 0 Top = 41 Width = 901 Height = 24 Align = alTop - 285 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Panels = <> end object Panel3: TPanel Left = 0 Top = 65 Width = 1 Height = 381 Align = alLeft Caption = 'Panel3' TabOrder = 4 object ListBox1: TListBox Left = 1 Top = 42 Width = 998 Height = 338 Align = alClient ItemHeight = 13 TabOrder = 0 Visible = False OnDblClick = ListBox1DblClick end object Panel4: TPanel Left = 1 Top = 1 Width = 998 Height = 41 Align = alTop TabOrder = 1 object Button5: TButton Left = 14 Top = 8 Width = 75 Height = 25 Caption = 'Close Window' TabOrder = 0 OnClick = Button5Click end end end object Gridpopup: TPopupMenu OnPopup = GridpopupPopup Left = 248 Top = 224 object NoCubeselected1: TMenuItem Caption = 'No cube selected' end object Redundantcube1: TMenuItem Caption = 'This is a redundant cube' Visible = False end object N3: TMenuItem Caption = '-' end object Required1: TMenuItem Caption = 'Required' object Item1: TMenuItem OnClick = Item1Click end object Item2: TMenuItem Tag = 1 OnClick = Item1Click end object Item3: TMenuItem Tag = 2 OnClick = Item1Click end object Item4: TMenuItem Tag = 3 OnClick = Item1Click end object Item5: TMenuItem Tag = 4 OnClick = Item1Click end - 286 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN object Item6: TMenuItem Tag = 5 OnClick = Item1Click end object Item7: TMenuItem Tag = 6 OnClick = Item1Click end object Item8: TMenuItem Tag = 7 OnClick = Item1Click end object Item9: TMenuItem Tag = 8 OnClick = Item1Click end object Item10: TMenuItem Tag = 10 OnClick = Item1Click end object Item11: TMenuItem Tag = 10 OnClick = Item1Click end object Item12: TMenuItem Tag = 11 OnClick = Item1Click end object Item13: TMenuItem Tag = 12 OnClick = Item1Click end object Item14: TMenuItem Tag = 13 OnClick = Item1Click end object Item15: TMenuItem Tag = 14 OnClick = Item1Click end end object Notrequired1: TMenuItem Caption = 'Not required' GroupIndex = 1 OnClick = Notrequired1Click end object Materialize1: TMenuItem Caption = 'Materialize' GroupIndex = 1 OnClick = Materialize1Click end object Dematerialize1: TMenuItem Caption = 'Dematerialize' GroupIndex = 1 OnClick = Dematerialize1Click end object N2: TMenuItem Caption = '-' GroupIndex = 1 end object Showderivatives1: TMenuItem Caption = 'Show derivatives' GroupIndex = 1 OnClick = Showderivatives1Click end object ShowRedundancyfreecube1: TMenuItem Caption = 'Show redundancy free cube' GroupIndex = 1 OnClick = ShowRedundancyfreecube1Click end object Showpossiblecubes1: TMenuItem Caption = 'Show possible cubes' GroupIndex = 1 OnClick = Showpossiblecubes1Click - 287 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end object Removepossiblecubes1: TMenuItem Caption = 'Remove possible cubes' GroupIndex = 1 Visible = False OnClick = Removepossiblecubes1Click end object Showdeterministicsolution1: TMenuItem Caption = 'Show deterministic solution' GroupIndex = 1 OnClick = Showdeterministicsolution1Click end object Removedeterministicsolution1: TMenuItem Caption = 'Remove deterministic solution' GroupIndex = 1 OnClick = Removedeterministicsolution1Click end object N8: TMenuItem Caption = '-' GroupIndex = 1 end object Heuristics2: TMenuItem Caption = 'Heuristics' GroupIndex = 1 object SearchusingThomasAchsheuristic2: TMenuItem Caption = 'Search using Thomas Achs heuristic' OnClick = SearchusingThomasAchsheuristic2Click end object Alogrithm1: TMenuItem Caption = 'Alogrithm permutation' OnClick = Alogrithm1Click end object AlgorithmKombination2: TMenuItem Caption = 'Algorithm combination' OnClick = AlgorithmKombination2Click end end object BuildCubesinDatabase2: TMenuItem Caption = 'Build cubes in database for star schema' GroupIndex = 1 object GenerateCREATESQLStatements1: TMenuItem Caption = 'Generate CREATE SQL-statements BFT and dimension tables' OnClick = GenerateCREATESQLStatements1Click end end object Buildcubesindatabaseforfactconstellationschema1: TMenuItem Caption = 'Build cubes in database for fact constellation schema' GroupIndex = 1 object GenerateCREATESQLStatementsBFTanddimensiontables1: TMenuItem Caption = 'Generate CREATE SQL-statements BFT and dimension tables' OnClick = GenerateCREATESQLStatementsBFTanddimensiontables1Click end object GenerateCREATESQLStatementsformaterializedcubes1: TMenuItem Caption = 'Generate CREATE SQL-statements for materialized cubes' OnClick = GenerateCREATESQLStatementsformaterializedcubes1Click end end object GetSQLStatementtomaterializethisview1: TMenuItem Caption = 'Get SQL statement to query this cube' GroupIndex = 1 object starschema1: TMenuItem Caption = 'star schema' OnClick = starschema1Click end object factconstellationschema1: TMenuItem Caption = 'fact constellation schema' OnClick = factconstellationschema1Click end end object N4: TMenuItem Caption = '-' GroupIndex = 1 end object ShowAnalysewindow2: TMenuItem - 288 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Caption = 'Show APA analyse window' GroupIndex = 1 OnClick = ShowAnalysewindow2Click end object Showlistbox1: TMenuItem Caption = 'Show protocoll window' GroupIndex = 1 OnClick = Showlistbox1Click end object N11: TMenuItem Caption = '-' GroupIndex = 1 end object Showcosts1: TMenuItem Caption = 'Show set random costs and limits left' GroupIndex = 1 OnClick = Showcosts1Click end object ShowSetcalculatedcostsandlimitsleft1: TMenuItem Caption = 'Show set calculated costs and limits left' GroupIndex = 1 OnClick = ShowSetcalculatedcostsandlimitsleft1Click end object N6: TMenuItem Caption = '-' GroupIndex = 1 end object Getrandomcosts1: TMenuItem Caption = 'Get random costs' GroupIndex = 1 object GetbuildBFT2: TMenuItem Caption = 'Get build from BFT' GroupIndex = 1 OnClick = GetbuildBFT2Click end object GetbuildParent2: TMenuItem Caption = 'Get build from Parent' GroupIndex = 1 OnClick = GetbuildParent2Click end object N9: TMenuItem Caption = '-' GroupIndex = 1 end object GetQueryBFT2: TMenuItem Caption = 'Get query from BFT' GroupIndex = 1 OnClick = GetQueryBFT2Click end object GetQueryParent2: TMenuItem Caption = 'Get Query from Parent' GroupIndex = 1 OnClick = GetQueryParent2Click end end object Getcalculatedcosts1: TMenuItem Caption = 'Get calculated costs' GroupIndex = 1 object GetbuildBFT1: TMenuItem Caption = 'Get build from BFT' OnClick = GetbuildBFT1Click end object Getbuildfromparent1: TMenuItem Caption = 'Get build from parent' OnClick = Getbuildfromparent1Click end object N1: TMenuItem Caption = '-' end object GetqueryfromBFT1: TMenuItem Caption = 'Get query from BFT' OnClick = GetqueryfromBFT1Click end object Getqueryfromparent1: TMenuItem - 289 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Caption = 'Get query from parent' OnClick = Getqueryfromparent1Click end end object Getmaterialisationspaceofcube1: TMenuItem Caption = 'Get materialisation space of cube' GroupIndex = 1 OnClick = Getmaterialisationspaceofcube1Click end object ShowData1: TMenuItem Caption = 'Show data of cube' GroupIndex = 1 OnClick = ShowData1Click end end object langbezpopup: TPopupMenu Left = 104 Top = 272 object langbez1: TMenuItem Caption = 'langbez' end end object privatmenu: TPopupMenu Left = 760 Top = 144 object ShowButtons1: TMenuItem Caption = 'Show Buttons' OnClick = ShowButtons1Click end object ProssernurersterLauf1: TMenuItem AutoCheck = True Caption = 'Prosser nur erster Lauf' Checked = True end object Minusnehmen1: TMenuItem AutoCheck = True Caption = 'Minus nehmen' Checked = True end object tomohnederivate1: TMenuItem AutoCheck = True Caption = 'Tom ohne derivate' end object RechneThomas1: TMenuItem AutoCheck = True Caption = 'Rechne Thomas' Checked = True end object ClearDatabase1: TMenuItem Caption = 'Clear Database' end object Alwaysspacemaxbeachten1: TMenuItem AutoCheck = True Caption = 'Alwaysspacemax beachten' Checked = True end end object APAGridMenu: TMainMenu Left = 376 Top = 184 object Actions1: TMenuItem Caption = 'Actions' object Removematerializedcubes1: TMenuItem Caption = 'Remove materialized cubes' OnClick = Removematerializedcubes1Click end object Removederivatives1: TMenuItem Caption = 'Remove derivatives' OnClick = Removederivatives1Click end object Removerequiredcubes1: TMenuItem Caption = 'Remove required cubes' OnClick = Removerequiredcubes1Click end - 290 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end object Heuristics1: TMenuItem Caption = 'Heuristics && Algorithms' object SearchusingProsserheuristic1: TMenuItem Caption = 'Search using Prosser heuristic' Visible = False end object SearchusingThomasAchsheuristic1: TMenuItem Caption = 'Search using Thomas Achs heuristic' OnClick = SearchusingThomasAchsheuristic1Click end object Algorithm1: TMenuItem Caption = 'Algorithm permutation' OnClick = Algorithm1Click end object AlgorithmKombination1: TMenuItem Caption = 'Algorithm combination' OnClick = AlgorithmKombination1Click end object N7: TMenuItem Caption = '-' end object AnalyseAPA1: TMenuItem Caption = 'Show APA analyse window' OnClick = AnalyseAPA1Click end object ShowAnalyseWindow1: TMenuItem Caption = 'Show protocoll window' OnClick = ShowAnalyseWindow1Click end object Showcosts2: TMenuItem Caption = 'Show Set costs and limits left' OnClick = Showcosts2Click end object Showsetcalculatedcostsandlimitsleft2: TMenuItem Caption = 'Show set calculated costs and limits left' end object N10: TMenuItem Caption = '-' end object Showpossiblecubes2: TMenuItem Caption = 'Show possible cubes' OnClick = Showpossiblecubes2Click end object Removepossiblecubes2: TMenuItem Caption = 'Remove possible cubes' Visible = False OnClick = Removepossiblecubes2Click end object Showdeterministicsolution2: TMenuItem Caption = 'Show deterministic solution' OnClick = Showdeterministicsolution2Click end object Removedeterministicsolution2: TMenuItem Caption = 'Remove deterministic solution' Visible = False OnClick = Removedeterministicsolution2Click end end object BuildCubesinDatabase1: TMenuItem Caption = 'Build Cubes in Database' object GenerateCREATESQLStatementsforStarSchema1: TMenuItem Caption = 'Generate CREATE SQL-statements for star schema' object GenerateCREATESQLStatementsBFTanddimensiontables3: TMenuItem Caption = 'Generate CREATE SQL-statements BFT and dimension tables' OnClick = GenerateCREATESQLStatementsBFTanddimensiontables3Click end end object GenerateCREATESQLStatementsforfactconstellationschema1: TMenuItem Caption = 'Generate CREATE SQL-statements for fact constellation schema' object GenerateCREATESQLStatementsBFTanddimensiontables2: TMenuItem Caption = 'Generate CREATE SQL-statements BFT and dimension tables' OnClick = GenerateCREATESQLStatementsBFTanddimensiontables2Click end - 291 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN object GenerateCREATESQLStatementsformaterializedcubes2: TMenuItem Caption = 'Generate CREATE SQL-statements for materialized cubes' OnClick = GenerateCREATESQLStatementsformaterializedcubes2Click end end end object Randomcosts1: TMenuItem Caption = 'Random costs' object Buildrandomcosts1: TMenuItem Caption = 'Build random costs' OnClick = Buildrandomcosts1Click end object Showrandomcosts1: TMenuItem Caption = 'Show random costs' OnClick = Showrandomcosts1Click end object Restrictedcosts1: TMenuItem AutoCheck = True Caption = 'Restricted costs' Checked = True OnClick = Restrictedcosts1Click end end object Settings1: TMenuItem Caption = 'Settings' object Userandomcosts1: TMenuItem AutoCheck = True Caption = 'Use random costs' Checked = True end object Removeredundancy1: TMenuItem Caption = 'Remove redundancy' OnClick = Removeredundancy1Click end object N5: TMenuItem Caption = '-' end object Parameter1: TMenuItem Caption = 'Parameters' OnClick = Parameter1Click end object Options1: TMenuItem Caption = 'Options' OnClick = Options1Click end end object Help1: TMenuItem Caption = 'Help' object HelpforAPAGridScreen1: TMenuItem Caption = 'Help for APA Grid Screen' OnClick = HelpforAPAGridScreen1Click end object HelpforAPAProgram1: TMenuItem Caption = 'Help for APA Program' OnClick = HelpforAPAProgram1Click end end end end 12.1.9 UNIT APA_GRIDUNIT.PAS unit APA_Gridunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Menus, StdCtrls, ExtCtrls, Grids, Math; type TAPA_Grid = class(TForm) - 292 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APAGrid: TDrawGrid; Panel1: TPanel; Button_remove_materialized_cubes: TButton; Button_remove_derivatives: TButton; Button_remove_required_cubes: TButton; Remove_Redundancy: TCheckBox; Button1: TButton; Button2: TButton; Panel2: TPanel; Button_to_Input_Screen: TButton; Button_to_Selection_Screen: TButton; Button_to_Main_Menu: TButton; Gridpopup: TPopupMenu; Redundantcube1: TMenuItem; N3: TMenuItem; Required1: TMenuItem; Item1: TMenuItem; Item2: TMenuItem; Item3: TMenuItem; Notrequired1: TMenuItem; Materialize1: TMenuItem; Dematerialize1: TMenuItem; N2: TMenuItem; Showderivatives1: TMenuItem; ShowRedundancyfreecube1: TMenuItem; Showlistbox1: TMenuItem; langbezpopup: TPopupMenu; langbez1: TMenuItem; privatmenu: TPopupMenu; ProssernurersterLauf1: TMenuItem; StatusBar: TStatusBar; Minusnehmen1: TMenuItem; Item4: TMenuItem; Item5: TMenuItem; Item6: TMenuItem; Item7: TMenuItem; Item8: TMenuItem; Item9: TMenuItem; Item10: TMenuItem; Item11: TMenuItem; Item12: TMenuItem; Item13: TMenuItem; Item14: TMenuItem; Item15: TMenuItem; APAGridMenu: TMainMenu; Actions1: TMenuItem; Settings1: TMenuItem; Removematerializedcubes1: TMenuItem; Removederivatives1: TMenuItem; Removerequiredcubes1: TMenuItem; Userandomcosts1: TMenuItem; Removeredundancy1: TMenuItem; BuildCubesinDatabase1: TMenuItem; Heuristics1: TMenuItem; SearchusingProsserheuristic1: TMenuItem; SearchusingThomasAchsheuristic1: TMenuItem; tomohnederivate1: TMenuItem; Button3: TButton; RechneThomas1: TMenuItem; Algorithm1: TMenuItem; Heuristics2: TMenuItem; SearchusingThomasAchsheuristic2: TMenuItem; Alogrithm1: TMenuItem; N4: TMenuItem; BuildCubesinDatabase2: TMenuItem; GenerateCREATESQLStatements1: TMenuItem; NoCubeselected1: TMenuItem; N5: TMenuItem; Parameter1: TMenuItem; Showcosts1: TMenuItem; Button4: TButton; Options1: TMenuItem; N6: TMenuItem; ShowData1: TMenuItem; - 293 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Panel3: TPanel; ListBox1: TListBox; Panel4: TPanel; Button5: TButton; AlgorithmKombination1: TMenuItem; AlgorithmKombination2: TMenuItem; Getrandomcosts1: TMenuItem; GetbuildBFT2: TMenuItem; GetbuildParent2: TMenuItem; N9: TMenuItem; GetQueryBFT2: TMenuItem; GetQueryParent2: TMenuItem; ClearDatabase1: TMenuItem; Randomcosts1: TMenuItem; Buildrandomcosts1: TMenuItem; Showrandomcosts1: TMenuItem; N7: TMenuItem; Showcosts2: TMenuItem; N8: TMenuItem; ShowAnalyseWindow1: TMenuItem; AnalyseAPA1: TMenuItem; ShowAnalysewindow2: TMenuItem; Showpossiblecubes1: TMenuItem; Removepossiblecubes1: TMenuItem; Showpossiblecubes2: TMenuItem; Removepossiblecubes2: TMenuItem; Getmaterialisationspaceofcube1: TMenuItem; ShowButtons1: TMenuItem; GetSQLStatementtomaterializethisview1: TMenuItem; Getcalculatedcosts1: TMenuItem; GetbuildBFT1: TMenuItem; Getbuildfromparent1: TMenuItem; N1: TMenuItem; GetqueryfromBFT1: TMenuItem; Getqueryfromparent1: TMenuItem; ShowSetcalculatedcostsandlimitsleft1: TMenuItem; Showsetcalculatedcostsandlimitsleft2: TMenuItem; N10: TMenuItem; Restrictedcosts1: TMenuItem; Showdeterministicsolution1: TMenuItem; Removedeterministicsolution1: TMenuItem; Showdeterministicsolution2: TMenuItem; Removedeterministicsolution2: TMenuItem; Buildcubesindatabaseforfactconstellationschema1: TMenuItem; GenerateCREATESQLStatementsformaterializedcubes1: TMenuItem; GenerateCREATESQLStatementsBFTanddimensiontables1: TMenuItem; GenerateCREATESQLStatementsforStarSchema1: TMenuItem; GenerateCREATESQLStatementsforfactconstellationschema1: TMenuItem; GenerateCREATESQLStatementsformaterializedcubes2: TMenuItem; GenerateCREATESQLStatementsBFTanddimensiontables2: TMenuItem; GenerateCREATESQLStatementsBFTanddimensiontables3: TMenuItem; Alwaysspacemaxbeachten1: TMenuItem; Help1: TMenuItem; HelpforAPAGridScreen1: TMenuItem; N11: TMenuItem; HelpforAPAProgram1: TMenuItem; starschema1: TMenuItem; factconstellationschema1: TMenuItem; procedure generate(); procedure Erzeugungsbericht1Click(Sender: TObject); procedure APAGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure APAGridMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Showlistbox1Click(Sender: TObject); procedure Materialize1Click(Sender: TObject); procedure Notrequired1Click(Sender: TObject); procedure Dematerialize1Click(Sender: TObject); procedure Showderivatives1Click(Sender: TObject); procedure APAGridDblClick(Sender: TObject); procedure APAGridMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button_to_Input_ScreenClick(Sender: TObject); procedure Button_to_Selection_ScreenClick(Sender: TObject); - 294 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN procedure Button_to_Main_MenuClick(Sender: TObject); procedure Remove_RedundancyClick(Sender: TObject); procedure ShowRedundancyfreecube1Click(Sender: TObject); procedure Button_remove_required_cubesClick(Sender: TObject); procedure Button_remove_derivativesClick(Sender: TObject); procedure Button_remove_materialized_cubesClick(Sender: TObject); procedure ListBox1DblClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure bezeichnungenholen(); procedure materialzeichnen; function getbuild(vonspalte,vonzeile,zuspalte,zuzeile:longint):Extended; function getquery(vonspalte,vonzeile,zuspalte,zuzeile:longint):Extended; function auffuellen(st:string;anzahl:longint):string; function gettupel(aktspalte,aktzeile:longint):Extended; function getgrouptupel(parentspalte,parentzeile,aktspalte,aktzeile:longint):Extended; function deltaBftW(aktspalte,aktzeile:longint;Query:boolean):Extended; function deltaVW(spalte,zeile,aktspalte,aktzeile:longint;query:boolean):Extended; function GetMinDerivatOfSpalte(aktspalte,aktzeile:longint;Query:boolean):longint; function GetMinDerivatOfZeile(aktspalte,aktzeile:longint;Query:boolean):longint; procedure berechneProsser(); procedure Button1Click(Sender: TObject); function isderivat(spaltev,zeilev,spaltew,zeilew:longint):boolean; procedure Item1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure APAGridClick(Sender: TObject); procedure GridpopupPopup(Sender: TObject); procedure Removematerializedcubes1Click(Sender: TObject); procedure Removederivatives1Click(Sender: TObject); procedure Removerequiredcubes1Click(Sender: TObject); procedure Removeredundancy1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Algorithm1Click(Sender: TObject); procedure SearchusingThomasAchsheuristic2Click(Sender: TObject); procedure Alogrithm1Click(Sender: TObject); procedure Parameter1Click(Sender: TObject); function berechneKostenGesamt(MatCubes,ReqCubes:TStringList;Nullstellen:boolean):Extended; procedure Showcosts1Click(Sender: TObject); function GetRightOrdertom(Listecubes:TStringList):TStringList; procedure Button4Click(Sender: TObject); procedure Options1Click(Sender: TObject); procedure ShowData1Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure AlgorithmKombination1Click(Sender: TObject); procedure AlgorithmKombination2Click(Sender: TObject); procedure GetbuildBFT2Click(Sender: TObject); procedure GetbuildParent2Click(Sender: TObject); procedure GetQueryBFT2Click(Sender: TObject); procedure GetQueryParent2Click(Sender: TObject); procedure GenerateCREATESQLStatements1Click(Sender: TObject); procedure SearchusingThomasAchsheuristic1Click(Sender: TObject); procedure Panel1DblClick(Sender: TObject); procedure Buildrandomcosts1Click(Sender: TObject); procedure Showrandomcosts1Click(Sender: TObject); procedure Showcosts2Click(Sender: TObject); procedure ShowAnalyseWindow1Click(Sender: TObject); procedure AnalyseAPA1Click(Sender: TObject); procedure ShowAnalysewindow2Click(Sender: TObject); procedure Showpossiblecubes1Click(Sender: TObject); procedure Removepossiblecubes1Click(Sender: TObject); procedure Showpossiblecubes2Click(Sender: TObject); procedure Removepossiblecubes2Click(Sender: TObject); procedure Getmaterialisationspaceofcube1Click(Sender: TObject); procedure ShowButtons1Click(Sender: TObject); procedure GetbuildBFT1Click(Sender: TObject); procedure GetqueryfromBFT1Click(Sender: TObject); procedure Getbuildfromparent1Click(Sender: TObject); procedure Getqueryfromparent1Click(Sender: TObject); procedure ShowSetcalculatedcostsandlimitsleft1Click(Sender: TObject); procedure Restrictedcosts1Click(Sender: TObject); procedure Showdeterministicsolution2Click(Sender: TObject); procedure Showdeterministicsolution1Click(Sender: TObject); procedure Removedeterministicsolution1Click(Sender: TObject); - 295 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN procedure Removedeterministicsolution2Click(Sender: TObject); procedure GenerateCREATESQLStatementsBFTanddimensiontables3Click( Sender: TObject); procedure GenerateCREATESQLStatementsformaterializedcubes2Click( Sender: TObject); procedure GenerateCREATESQLStatementsBFTanddimensiontables2Click( Sender: TObject); procedure GenerateCREATESQLStatementsBFTanddimensiontables1Click( Sender: TObject); procedure GenerateCREATESQLStatementsformaterializedcubes1Click( Sender: TObject); procedure APAGridMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); procedure HelpforAPAGridScreen1Click(Sender: TObject); procedure HelpforAPAProgram1Click(Sender: TObject); procedure factconstellationschema1Click(Sender: TObject); procedure starschema1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; type TAPAField = record linieoben:boolean; linieunten:boolean; linierechts:boolean; linielinks:boolean; dickoben:boolean; dickunten:boolean; dickrechts:boolean; dicklinks:boolean; farbe:TColor; interessant:boolean; materalisieren:boolean; matcount:longint;//Gibt die Reihenfolge der Materialisierung an derivative:boolean; langbez:array of String; kurzbez:String; screenbez:String; counthier:longint;//Gibt die neue Hierarchiestufe an countdimension:longint;//Gibt die Dimension an, welche erhöht wird zeile:longint; spalte:longint; gewicht:Extended; gewichtlevel:longint; value:Extended;//Gibt den Speicherwert an value2:Extended;//Gibt den zweiten Speicherwert an hierstufe:array of longint; //Gibt die aktuelle Hierarchiestufe jeder Dimension an flag:Extended; end; var APA_Grid: TAPA_Grid; APA: array of array of TAPAField; {Das Gitter} dk: array of array of String; {Alle Kurzbezeichungen der Dimension x und der Hierarchie y} dl: array of array of String; {Alle Langbezeichnungen der Dimension x und der Hierarchie y} countdaten: array of array of longint; {Die Anzahl der Datensätze der Dimension x und der Hierarchie y} anzd:longint; {Anzahl der Dimensionen} anzh: array of longint; {Anzahl der Hierarchiestufen der Dimension x} - 296 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN dimbez: array of String; {Bezeichnung der Dimension x} zellezeile:longint; {Wert für die aktuelle Spalte im Gitter} zellespalte:longint; {Wert für die aktuelle Zeile im Gitter} anzzeilen:longint; {Anzahl Zeilen des APA gesamt} anzspalten:longint; {Anzahl der Spalten des APA gesamt} maxh:longint; {Maximale Anzahl der Hierarchiestufen einer Dimension} {Gibt die Aktuellen Bildschirmkoordinaten der Mouse an} aktx:longint; akty:longint; {Gibt die Zelle an, welche zuletzt angeklickt wurde} klickspalte:longint= -1; klickzeile:longint= -1; gotoSelection:boolean=false; gotoInput:boolean=false; {Gibt an, ob die Bezeichnungen ok sind} bezeichnungenkontrolliert:boolean; matcount:longint=0;//Gibt den aktuellen Materialisierungszähler an permutation:boolean=true; implementation uses APA_Selectionunit, APA_Parameterunit, APA_Input_Screenunit, APA_Applicationunit, APA_Processunit, APA_Sqlunit, APA_Keyunit, APA_Dialogunit, APA_Optionsunit, APA_Show_costsunit, APA_Helpunit; {$R *.dfm} type Memorycubestype= record nr:longint; spalte:longint; zeile:longint; end; var Memorywuerfel: TStringList; //Die Liste der ausgewählten Würfel// MerkeListe:array of longint; spaceleft, spaceleftfirstcubes,timeleft:Extended; Memorycubes,MemoryReqCubes:array of Memorycubestype; MemoryReqCubescount:longint; function TAPA_Grid.isderivat(spaltev,zeilev,spaltew,zeilew:longint):boolean; var counter:longint; derivat:boolean; begin; //Überprüfe, ob w ein Derivat von v ist: //Wenn alle Dimensionen von v eine Hierarchiestufe gleich oder höher //als w haben > dann ist es ein Derivat. derivat:=false; try //Standardmäßig ist es ein Derivat derivat:=true; for counter:=0 to anzd-1 do begin //Sollte eine Dimension von w eine geringere Hierachie //als v haben, kann w nicht aus v errechnet werden - 297 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if APA[spaltew,zeilew].hierstufe[counter]<APA[spaltev,zeilev].hierstufe[counter] then derivat:=false; end; finally //Übergeben des Ergebnisses if (APA[spaltev,zeilev].farbe<>clYellow)or(APA[spaltew,zeilew].farbe<>clYellow) then derivat:=false; Result:=derivat; end; end; procedure TAPA_Grid.bezeichnungenholen; var dimcounter, counter:longint; curItem:TTreeNode; merkecount:longint; abort:boolean; begin anzd:=0;abort:=false; APA_Grid.ListBox1.Clear; with APA_Input_Screen do begin APA_Grid.ListBox1.Items.Add('Feststellen der Anzahl der Dimensionen'); {********* Anzahl der Dimensionen feststellen} if Eingabe.Items.GetFirstNode<>nil then begin {Wenn überhaupt etwas eingetragen ist dann ...} CurItem := Eingabe.Items.GetFirstNode; while CurItem <> nil do begin if CurItem.HasChildren then anzd:=anzd+1; CurItem := CurItem.GetNext; end; end; {********* Anzahl der Dimensionen feststellen ENDE} APA_Grid.ListBox1.Items.Add('Es wurden '+inttostr(anzd)+' Dimensionen festgestellt!'); APA_Grid.ListBox1.Items.Add('Erzeuge das Array zum Speichern der Dimensionsbezeichnungen'); {Erzeuge das Array zum Speichern der Dimensionsbezeichnungen} dimbez:=nil; {Zuerst alte Bezeichnungen löschen, falls vorhanden} setlength(dimbez,anzd); APA_Grid.ListBox1.Items.Add('Erzeuge das Array zum Speichern der Anzahl der Hierarchiestufen pro Dimension '+inttostr(anzd)); {Erzeuge das Array zum Speichern der Anzahl der Hierarchiestufen pro Dimension} anzh:=nil; setlength(anzh,anzd); APA_Grid.ListBox1.Items.Add('Erzeuge das Array zum Speichern der Langbezeichnungen mit anzd Dimensionen '+inttostr(anzd)); {Erzeuge das Array zum Speichern der Langbezeichnungen mit anzd Dimensionen} dl:=nil; setlength(dl,anzd); APA_Grid.ListBox1.Items.Add('Erzeuge das Array zum Speichern der Kurzbezeichnungen mit anzd Dimensionen '+inttostr(anzd)); {Erzeuge das Array zum Speichern der Kurzbezeichnungen mit anzd Dimensionen} dk:=nil; setlength(dk,anzd); APA_Grid.ListBox1.Items.Add('Erzeuge das Array zum Speichern der Datensatzanzahlen mit anzd Dimensionen '+inttostr(anzd)); {Erzeuge das Array zum Speichern der Kurzbezeichnungen mit anzd Dimensionen} countdaten:=nil; setlength(countdaten ,anzd); {Dimensionsbezeichnungen und Hierarchiebezeichnungen eintragen} { und die Anzahl der Hierarchiestufen für jede Dimension eintragen} - 298 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if Eingabe.Items.GetFirstNode<>nil then begin {Wenn überhaupt etwas eingetragen ist dann ...} dimcounter:=0; CurItem := Eingabe.Items.GetFirstNode; while (CurItem <> nil)and(abort=false) do begin anzh[dimcounter]:=CurItem.Count; dimbez[dimcounter]:=CurItem.Text; APA_Grid.ListBox1.Items.Add('****************************'); APA_Grid.ListBox1.Items.Add('Die Dimension '+dimbez[dimcounter]+' '+inttostr(dimcounter)+' hat '+inttostr(anzh[dimcounter])+' Hierarchiestufen'); APA_Grid.ListBox1.Items.Add('Anzahl der Kurzbezeichnungen dieser Dimension festlegen mit '+inttostr(anzh[dimcounter])); {Anzahl der Kurzbezeichnungen dieser Dimension festlegen} setlength(dk[dimcounter],anzh[dimcounter]); APA_Grid.ListBox1.Items.Add('Anzahl der Langbezeichnungen dieser Dimension festlegen mit '+inttostr(anzh[dimcounter])); {Anzahl der Langbezeichnungen dieser Dimension festlegen} setlength(dl[dimcounter],anzh[dimcounter]); APA_Grid.ListBox1.Items.Add('Anzahl der Countdaten dieser Dimension festlegen mit '+inttostr(anzh[dimcounter])); {Anzahl der Langbezeichnungen dieser Dimension festlegen} setlength(countdaten[dimcounter],anzh[dimcounter]); CurItem:=CurItem.GetNext; counter:=0;merkecount:=0; while (CurItem <> nil)and(CurItem.HasChildren=false)and(abort=false) do begin {Eintragen der Kurzbezeichnung} dk[dimcounter,counter]:= copy(CurItem.Text,1,pos('//',CurItem.Text)-1); APA_Grid.ListBox1.Items.Add('dk['+inttostr(dimcounter)+','+inttostr(counter)+'] Kurzbezeichnung '+dk[dimcounter,counter]+' eingetragen'); {Eintragen der Langbezeichnung} dl[dimcounter,counter]:= copy(CurItem.Text,pos('//',CurItem.Text)+2,pos('::',CurItem.Text)(pos('//',CurItem.Text)+2)); APA_Grid.ListBox1.Items.Add('dl['+inttostr(dimcounter)+','+inttostr(counter)+'] Langbezeichnung '+dl[dimcounter,counter]+' eingetragen'); {Eintragen der Countdaten} countdaten[dimcounter,counter]:= strtoint(copy(CurItem.Text,pos('::',CurItem.Text)+2,255)); APA_Grid.ListBox1.Items.Add('countdaten['+inttostr(dimcounter)+','+inttostr(counte r)+'] Countdaten '+inttostr(countdaten[dimcounter,counter])+' eingetragen'); {Feststellen, ob die Anzahl der Datensätze größer ist als der Vorgänger} if (countdaten[dimcounter,counter]>merkecount)and(merkecount<>0) then begin; Showmessage('Error generating APA. Count of records in hierarchy '+dk[dimcounter,counter]+' is larger than lower hierarchy. Abort Generation!'); abort:=true; end; {Setzen von merkecount} merkecount:=countdaten[dimcounter,counter]; CurItem:=CurItem.GetNext; counter:=counter+1; end; dimcounter:=dimcounter+1; end; end; - 299 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN {********* Anzahl der Dimensionen feststellen ENDE} if abort=false then bezeichnungenkontrolliert:=true; end; end; function wuerfelvergleich (spalte,zeile:longint; akth:array of longint):boolean; var derivat: array of longint; g,x2:longint; merk:boolean; begin //Bestimme die Hierarchiestufen der Dimensionen des materialisierten Elements derivat:=nil; setlength(derivat,anzd); //Starte in Hierarchiestufe 0 for x2:=0 to anzd-1 do derivat[x2]:=0; //Belege akthier mit der maximalen Hierarchiestufe jeder Dimension for x2:=0 to spalte do derivat[APA[x2,zeile].countdimension]:=APA[x2,zeile].counthier; //Überprüfe, ob keine Hierarchiestufe der Dimension der aktuellen Zelle // kleiner als die Hierarchiestufe der Dimension der materialisierten Würfel sind// merk:=true; for g:=0 to anzd-1 do begin if (derivat[g]<akth[g]) then merk:=false; end; Result:=merk; end; procedure markierederivative(spalte,zeile:longint); var akth: array of longint; counter:longint; aktzeile, aktspalte:longint; ende: boolean; feld: array of boolean; begin //Diese Methode zeichnet die Linie für den zu materialisierenden Würfel// //Bestimme die Hierarchiestufen der Dimension des mat. Elements// akth:=nil; setlength(akth,anzd); //Alle Hierarchien starten in 0// for counter:=0 to anzd-1 do akth[counter]:=0; //Belege akthier mit der maximalen Hierarchiestufe jeder Dimension// for counter:=0 to spalte do akth[ APA[counter,zeile].countdimension]:=APA[counter,zeile].counthier; //Beginn in der ersten Zeile bestimmen // Gehe dazu die Elemente der ersten Zeile von rechts nach links durch // bis ein Würfel kein Derivat mehr ist. Dann setze den Cursor //auf das letzte Element das ein Derivat ist. aktzeile:=0;aktspalte:=anzspalten-1;ende:=false; while (aktspalte>=0)and(ende=false) do begin if wuerfelvergleich(aktspalte,aktzeile, akth)=false then begin //Wenn kein Derivat ende:=true; //Spalte links vom Derivat mach eine rechte Linie APA[aktspalte,aktzeile].linierechts:=true; - 300 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN aktspalte:=aktspalte+1; //im letzten Derivat mach eine linke Linie APA[aktspalte,aktzeile].linielinks:=true; end else aktspalte:=aktspalte-1; end; {von while} //Wenn die erste Zeile durchlaufen und ende ist immer noch false dann // starte in der ersten Spalte von links if (ende=false) then begin; aktspalte:=0; APA[aktspalte,aktzeile].linielinks:=true; end; //Der Cursor wandert zwischen den Zellen durch das Gitter. // Die Positionsmarke des Cursors befindet sich immer in der linken // unteren Ecke des Feldes. //Das Programm kontrolliert die Zellen unterhalb. // Feld[0] ist das Feld diagonal links untern. // Feld[1] ist das Feld unmittelbar darunter. //Setze beide Felder auf false feld:=nil; setlength(feld,2); feld[0]:=false; feld[1]:=false; while(aktzeile<anzzeilen-1) do begin //Kontrolliere alle 3 möglichen Zielfelder für den Cursor feld[0]:=wuerfelvergleich(aktspalte,aktzeile+1,akth); if (aktspalte<>0) then feld[1]:=wuerfelvergleich(aktspalte-1,aktzeile+1,akth) else feld[1]:=false; //Handle der Situation entsprechend //Erster Fall Cursor nach untern if (feld[0]=true)and(feld[1]=false) then begin aktzeile:=aktzeile+1; //Setze Linie links APA[aktspalte,aktzeile].linielinks:=true; if aktspalte<>0 then APA[aktspalte-1,aktzeile].linierechts:=true; end; //Zweiter Fall nach links if (feld[0]=true)and(feld[1]=true) then begin //Cursor nach links aktspalte:=aktspalte-1; //Setze Linie unten APA[aktspalte,aktzeile].linieunten:=true; //Setze Linie oben in der Zeile unterhalb if (aktzeile+1<anzzeilen) then APA[aktspalte,aktzeile+1].linieoben:=true; end; //Dritter Fall nach rechts// if (feld[0]=false)and(feld[1]=false) then begin //Cursor nach rechts //Setze Linie unten APA[aktspalte,aktzeile].linieunten:=true; //Setze Linie oben in der Zeile unterhalb if (aktzeile+1<anzzeilen) then APA[aktspalte,aktzeile+1].linieoben:=true; aktspalte:=aktspalte+1; end; end;{von while} end; - 301 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN procedure TAPA_Grid.materialzeichnen; var spalte,zeile:longint; ende:boolean; begin //Diese Methode zeichnet alle zu materialisierenden Würfel und zieht anschließend // die dicke rote Begrenzungsinie. //Alle Linien löschen for spalte:= 0 to anzspalten-1 do begin for zeile:=0 to anzzeilen-1 do begin APA[spalte,zeile].linieoben:=false; APA[spalte,zeile].linieunten:=false; APA[spalte,zeile].linielinks:=false; APA[spalte,zeile].linierechts:=false; APA[spalte,zeile].derivative:=false; APA[spalte,zeile].dickoben:=false; APA[spalte,zeile].dickunten:=false; APA[spalte,zeile].dicklinks:=false; APA[spalte,zeile].dickrechts:=false; end; //Ende von Zeilen end; //Ende von Spalten // Materialisiere alle Würfel, wo materailize = true for spalte:= 0 to anzspalten-1 do begin for zeile:=0 to anzzeilen-1 do begin if APA[spalte,zeile].materalisieren=true then begin markierederivative(spalte,zeile); end; end; //Ende von Zeilen end; //Ende von Spalten //Aussenlinie generieren for zeile:= 0 to anzzeilen-1 do begin ende:=false; for spalte:=0 to anzspalten-1 do begin if ende=false then begin //Einfärben if APA[spalte,zeile].linielinks=true then begin //Line links APA[spalte,zeile].dicklinks:=true; ende:=true; end else begin //Line links links APA[spalte,zeile].dickoben:=APA[spalte,zeile].linieoben; APA[spalte,zeile].dickunten:=APA[spalte,zeile].linieunten; APA[spalte,zeile].dicklinks:=APA[spalte,zeile].linielinks; APA[spalte,zeile].dickrechts:=APA[spalte,zeile].linierechts; //Wenn die unter Zeile nicht die letzte ist ziehe auch die //untere Linie nach if zeile<anzzeilen-1 then begin; APA[spalte,zeile+1].dickoben:=APA[spalte,zeile+1].linieoben; APA[spalte,zeile+1].dickunten:=false; APA[spalte,zeile+1].dicklinks:=false; APA[spalte,zeile+1].dickrechts:=false; end; //Wenn obere Zeile nicht außerhalb des Gitters ziehe //auch die obere Linie nach if (zeile>0) then APA[spalte,zeile-1].dickunten:=APA[spalte,zeile-1].linieunten; - 302 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; end; end; //Ende von Zeilen end; //Ende von Spalten //Alle Linien löschen for spalte:= 0 to anzspalten-1 do begin for zeile:=0 to anzzeilen-1 do begin APA[spalte,zeile].linieoben:=false; APA[spalte,zeile].linieunten:=false; APA[spalte,zeile].linielinks:=false; APA[spalte,zeile].linierechts:=false; APA[spalte,zeile].derivative:=false; end; //Ende von Zeilen end; //Ende von Spalten end; procedure ausfuellen(tozeile, tospalte, fromzeile,fromspalte, zeilemax:longint; nachunten:boolean); var zeile:longint; begin zeile:=tozeile; if (nachunten=true) then begin while (zeile<zeilemax) do begin if (APA[tospalte,zeile].Screenbez='') then begin APA[tospalte,zeile].Screenbez:=APA[fromspalte,fromzeile].Screenbez; APA[tospalte,zeile].countdimension:=APA[fromspalte,fromzeile].countdimension; APA[tospalte,zeile].counthier:=APA[fromspalte,fromzeile].counthier; APA[tospalte,zeile].gewicht:=0; APA[tospalte,zeile].gewichtlevel:=-1; end; zeile:=zeile+1; end; end else begin {nach oben} while (zeile>zeilemax) do begin if (APA[tospalte,zeile].Screenbez='') then begin APA[tospalte,zeile].Screenbez:=APA[fromspalte,fromzeile].Screenbez; APA[tospalte,zeile].countdimension:=APA[fromspalte,fromzeile].countdimension; APA[tospalte,zeile].counthier:=APA[fromspalte,fromzeile].counthier; APA[tospalte,zeile].gewicht:=0; APA[tospalte,zeile].gewichtlevel:=-1; end; zeile:=zeile-1; end; end; end; procedure zellenkop(fromx1,fromy1,fromx2,fromy2,tox,toy:longint; oben,mitfarbe:boolean); var x,y:longint; begin {Kopiere die Zellen fromx1,formy1 bis fromx2,fromy2 auf die Zelle tox,toy und folgende} if (oben=false) then toy:=toy-abs(fromy1-fromy2); for x:=min(fromx1,fromx2) to max(fromx1,fromx2) do begin for y:= min(fromy1,fromy2) to max(fromy1,fromy2) do begin - 303 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APA[tox-min(fromx1,fromx2)+x,toymin(fromy1,fromy2)+y].Screenbez:=APA[x,y].Screenbez; if mitfarbe=true then APA[tox-min(fromx1,fromx2)+x,toy-min(fromy1,fromy2)+y].farbe:=APA[x,y].farbe; APA[tox-min(fromx1,fromx2)+x,toymin(fromy1,fromy2)+y].counthier:=APA[x,y].counthier; APA[tox-min(fromx1,fromx2)+x,toymin(fromy1,fromy2)+y].countdimension:=APA[x,y].countdimension; APA[tox-min(fromx1,fromx2)+x,toy-min(fromy1,fromy2)+y].gewicht:=0; APA[tox-min(fromx1,fromx2)+x,toy-min(fromy1,fromy2)+y].gewichtlevel:=-1; end; end; end; procedure calculatecolumnscount; var counter:longint; begin {Diese Procedure berechnet die Anzahl der Spalten des gesamten APA} anzspalten:=0; for counter:=0 to anzd-1 do anzspalten:=anzspalten+(anzh[counter]-1); APA_Grid.ListBox1.Items.Add('Anzahl der Spalten des APAs berechnet mit '+inttostr(anzspalten)); end; procedure calculaterowcount; var counter:longint; begin {Diese Procedure berechnet die Anzahl der Zeilen des gesamten APA} anzzeilen:=1; for counter:=0 to anzd-1 do begin; if (anzh[counter]<>0) then anzzeilen:=anzzeilen*anzh[counter]; if (maxh<anzh[counter]) then maxh:=anzh[counter]; end; anzzeilen:=round(anzzeilen/maxh); APA_Grid.ListBox1.Items.Add('Anzahl der Zeilen des APAs berechnet mit '+inttostr(anzzeilen)); end; procedure generatedescriptions; var zeile:longint; akthier: array of longint; s:String; z,x:longint; begin APA_Grid.ListBox1.Items.Add('***********************'); APA_Grid.ListBox1.Items.Add('Generiere die Beschreibungen der Zellen'); for zeile:=0 to anzzeilen-1 do begin APA_Grid.ListBox1.Items.Add('Generiere die Beschreibungen der Zeile '+inttostr(zeile)); akthier:=nil; setlength(akthier,anzd); s:=''; for z:=0 to anzd-1 do begin;akthier[z]:=0;end; for x:=0 to anzspalten-1 do begin akthier[APA[x,zeile].countdimension]:=APA[x,zeile].counthier; //Kurzbezeichnung s:=''; for z:=0 to anzd-1 do begin s:=s+dk[z,akthier[z]]; if (z<>(anzd-1)) then s:=s+'; '; - 304 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; APA[x,zeile].kurzbez:=s; //Kurzbezeichnung generieren ENDE //Langbezeichnung generieren APA[x,zeile].langbez:=nil; setlength(APA[x,zeile].langbez,anzd); //Hierarchiestufenausprägungen generieren APA[x,zeile].hierstufe:=nil; setlength(APA[x,zeile].hierstufe,anzd); for z:=0 to anzd-1 do begin APA[x,zeile].langbez[z]:=dimbez[z]+':'+dl[z,akthier[z]]; APA[x,zeile].hierstufe[z]:=akthier[z]; end; //Langbezeichnung generieren ENDE end; end; end; procedure TAPA_Grid.generate; var zeile,spalte:longint; var feld,dimcounter,hiercounter, counter:longint; var aktuelledim,aktuellespalte,aktuellezeile,anzkop:longint; begin {APA erzeugen} APA:=nil; setlength(APA,anzspalten,anzzeilen); {APA mit Werten füllen} for zeile:=0 to anzzeilen-1 do begin for spalte:=0 to anzspalten-1 do begin APA[spalte,zeile].zeile:=zeile; APA[spalte,zeile].spalte:=spalte; APA[spalte,zeile].linieoben:=false; APA[spalte,zeile].linieunten:=false; APA[spalte,zeile].linielinks:=false; APA[spalte,zeile].linierechts:=false; APA[spalte,zeile].dickoben:=false; APA[spalte,zeile].dickunten:=false; APA[spalte,zeile].dicklinks:=false; APA[spalte,zeile].dickrechts:=false; APA[spalte,zeile].farbe:=clWhite; APA[spalte,zeile].interessant:=false; APA[spalte,zeile].materalisieren:=false; APA[spalte,zeile].derivative:=false; APA[spalte,zeile].Screenbez:=''; APA[spalte,zeile].kurzbez:=''; end; end; {Erste Zeile erzeugen} feld:=0; for dimcounter:=0 to anzd-1 do begin for hiercounter:=1 to anzh[dimcounter]-1 do begin APA[feld,0].Screenbez:=dk[dimcounter,hiercounter]; APA[feld,0].farbe:=clYellow; APA[feld,0].counthier:=hiercounter; APA[feld,0].countdimension:=dimcounter; APA[feld,0].gewicht:=0; APA[feld,0].gewichtlevel:=0; feld:=feld+1; end; end; - 305 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN {Kopieren der redundanzfreien Zellen des APA} aktuelledim:=anzd-1; aktuellespalte:=anzspalten-(anzh[aktuelledim]-1); aktuellezeile:=0; while (aktuellespalte>0) do begin {Kopiere Block Beginn} anzkop:=0; while (anzkop<anzh[aktuelledim-1]-1) do begin anzkop:=anzkop+1; zellenkop(aktuellespalte,aktuellezeile,anzspalten-1,0, aktuellespalte-anzkop,aktuellezeile+(anzkop*(aktuellezeile+1)),false,true); end; {Kopieren Block ENDE} {Auffüllen des APA mit Redundanten Zellen} for counter:=aktuellespalte-anzkop to aktuellespalte-1 do begin ausfuellen(aktuellezeile+(anzkop*(aktuellezeile+1)),(anzspalten-1)+(counter(aktuellespalte-1)),0,counter,max(aktuellezeile-1,0),false); end; for counter:=aktuellespalte-anzkop to aktuellespalte do begin ausfuellen(0,counter,0,counter,anzzeilen,true); end; {Setze aktuelle Zeile als die unterste bereits ausgefüllte Zeile} aktuellezeile:=aktuellezeile+(anzkop*(aktuellezeile+1)); {Setze Spalte als Spalte in die der letzte Kopiervorgang vollzogen wurde} aktuellespalte:=aktuellespalte-anzkop; {Vermindere den Dimensionszähler} aktuelledim:=aktuelledim-1; end; generatedescriptions; APA_Selection_Screen.Req.Items.Clear; APA_Selection_Screen.Listeint.Items.Clear; Button_remove_materialized_cubesClick(self); Removepossiblecubes1Click(self); end; procedure TAPA_Grid.Erzeugungsbericht1Click(Sender: TObject); begin listbox1.Width:=round(APA_Grid.Width/2); listbox1.Visible:=true; end; procedure TAPA_Grid.APAGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var NewRect:TRect; begin APAGrid.Canvas.Brush.Color:=APA[ACol,ARow].farbe; APAGrid.Canvas.FillRect(Rect); //Gitterzeilen APAGrid.Canvas.Brush.Color:=clLtGray; APAGrid.Canvas.Pen.Color:=clLtGray; APAGrid.Canvas.Rectangle(Rect.Left,Rect.Top,Rect.Right+1,Rect.top); APAGrid.Canvas.Rectangle(Rect.Left,Rect.Bottom-1,Rect.Right+1,Rect.Bottom); APAGrid.Canvas.Rectangle(Rect.Right-1,Rect.Top,Rect.Right,Rect.Bottom+1); APAGrid.Canvas.Rectangle(Rect.Left,Rect.Top,Rect.Left,Rect.Bottom+1); APAGrid.Canvas.Brush.Color:=APA[ACol,ARow].farbe; if (APA[ACol,ARow].flag=1) then begin - 306 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN NewRect.Left:=Rect.left; NewRect.Right:=Rect.left+13; NewRect.Top:=Rect.Bottom-13; NewRect.Bottom:=Rect.Bottom; APAGrid.Canvas.Brush.Color:=clBlack; APAGrid.Canvas.FillRect(NewRect); APAGrid.Canvas.Font.Color:=clWhite; APAGrid.Canvas.Font.Size:=4; APAGrid.Canvas.Font.Style:=[fsBold]; APAGrid.Canvas.TextOut(Rect.left+2,Rect.Bottom-11,'P'); APAGrid.Canvas.Font.Style:=[]; APAGrid.Canvas.Brush.Color:=APA[ACol,ARow].farbe; APAGrid.Canvas.Font.Color:=clBlack; APAGrid.Canvas.Pen.Color:=clBlack; end; if (APA[ACol,ARow].flag>=2)and(APA[ACol,ARow].flag<3) then begin NewRect.Left:=Rect.left; NewRect.Right:=Rect.left+13; NewRect.Top:=Rect.Bottom-13; NewRect.Bottom:=Rect.Bottom; APAGrid.Canvas.Brush.Color:=clGreen; APAGrid.Canvas.FillRect(NewRect); APAGrid.Canvas.Font.Color:=clWhite; APAGrid.Canvas.Font.Size:=4; APAGrid.Canvas.Font.Style:=[]; APAGrid.Canvas.TextOut(Rect.left+2,Rect.Bottom-11,floattostr((APA[ACol,ARow].flag2)*10000)); APAGrid.Canvas.Font.Style:=[]; APAGrid.Canvas.Brush.Color:=APA[ACol,ARow].farbe; APAGrid.Canvas.Font.Color:=clBlack; APAGrid.Canvas.Pen.Color:=clBlack; end; if (APA[ACol,ARow].interessant=true) then begin NewRect.Left:=Rect.Left; NewRect.Right:=Rect.Left+14; NewRect.Top:=Rect.Top; NewRect.Bottom:=Rect.Top+14; APAGrid.Canvas.Brush.Color:=DegreeColors[APA[ACol,ARow].gewichtlevel]; APAGrid.Canvas.FillRect(NewRect); APAGrid.Canvas.Font.Color:=clWhite; APAGrid.Canvas.Font.Size:=4; APAGrid.Canvas.Font.Style:=[fsBold]; APAGrid.Canvas.TextOut(Rect.Left+2,Rect.Top+1,'R'); APAGrid.Canvas.Font.Style:=[]; APAGrid.Canvas.Brush.Color:=APA[ACol,ARow].farbe; APAGrid.Canvas.Font.Color:=clBlack; APAGrid.Canvas.Pen.Color:=clBlack; end; if (APA[ACol,ARow].linieoben=true) then begin APAGrid.Canvas.Pen.Color:=clBlack; APAGrid.Canvas.Brush.Color:=clBlack; if (ACol<>0) then begin if (APA[ACol-1,ARow].dickoben=true)or(APA[ACol,ARow].dicklinks=true) then APAGrid.Canvas.Rectangle(Rect.Left+2,Rect.Top-2,Rect.Right+2,Rect.top+2) else APAGrid.Canvas.Rectangle(Rect.Left-2,Rect.Top-2,Rect.Right+2,Rect.top+2); end else APAGrid.Canvas.Rectangle(Rect.Left-2,Rect.Top-2,Rect.Right+2,Rect.top+2); end; - 307 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if (APA[ACol,ARow].linieunten=true) then begin APAGrid.Canvas.Pen.Color:=clBlack; APAGrid.Canvas.Brush.Color:=clBlack; if (ACol<>0) then begin if (APA[ACol-1,ARow].dickunten=true)or(APA[ACol,ARow].dicklinks=true) then APAGrid.Canvas.Rectangle(Rect.Left+2,Rect.Bottom-2,Rect.Right+2,Rect.Bottom) else APAGrid.Canvas.Rectangle(Rect.Left-2,Rect.Bottom-2,Rect.Right+2,Rect.Bottom); end else APAGrid.Canvas.Rectangle(Rect.Left-2,Rect.Bottom-2,Rect.Right+2,Rect.Bottom); end; if (APA[ACol,ARow].linierechts=true) then begin APAGrid.Canvas.Pen.Color:=clBlack; APAGrid.Canvas.Brush.Color:=clBlack; APAGrid.Canvas.Rectangle(Rect.Right-2,Rect.Top-2,Rect.Right,Rect.Bottom+2); end; if (APA[ACol,ARow].linielinks=true) then begin APAGrid.Canvas.Pen.Color:=clBlack; APAGrid.Canvas.Brush.Color:=clBlack; APAGrid.Canvas.Rectangle(Rect.Left-2,Rect.Top-2,Rect.Left+2,Rect.Bottom+2); end; if (APA[ACol,ARow].dickoben=true) then begin APAGrid.Canvas.Pen.Color:=clRed; APAGrid.Canvas.Brush.Color:=clRed; APAGrid.Canvas.Rectangle(Rect.Left-2,Rect.Top-2,Rect.Right+2,Rect.top+2); end; if (APA[ACol,ARow].dickunten=true) then begin APAGrid.Canvas.Pen.Color:=clRed; APAGrid.Canvas.Brush.Color:=clRed; APAGrid.Canvas.Rectangle(Rect.Left-2,Rect.Bottom-2,Rect.Right+2,Rect.Bottom); end; if (APA[ACol,ARow].dickrechts=true) then begin APAGrid.Canvas.Pen.Color:=clRed; APAGrid.Canvas.Brush.Color:=clRed; APAGrid.Canvas.Rectangle(Rect.Right-2,Rect.Top-2,Rect.Right,Rect.Bottom+2); end; if (APA[ACol,ARow].dicklinks=true) then begin APAGrid.Canvas.Pen.Color:=clRed; APAGrid.Canvas.Brush.Color:=clRed; APAGrid.Canvas.Rectangle(Rect.Left-2,Rect.Top-2,Rect.Left+2,Rect.Bottom+2); end; if (ACol>0)and(ARow>0) then begin if (APA[ACol-1,ARow].linieoben=true)or(APA[ACol,ARow-1].linielinks=true) or (APA[ACol,ARow].linielinks=true) then begin APAGrid.Canvas.Pen.Color:=clBlack; APAGrid.Canvas.Brush.Color:=clBlack; APAGrid.Canvas.Rectangle(Rect.Left-2,Rect.Top-2,Rect.Left+2,Rect.Top+2); end; if (APA[ACol-1,ARow].dickoben=true)or(APA[ACol,ARow-1].dicklinks=true) or (APA[ACol,ARow].dicklinks=true) then begin APAGrid.Canvas.Pen.Color:=clRed; APAGrid.Canvas.Brush.Color:=clRed; APAGrid.Canvas.Rectangle(Rect.Left-2,Rect.Top-2,Rect.Left+2,Rect.Top+2); end; end; APAGrid.Canvas.Font.Size:=8; APAGrid.Canvas.Brush.Color:=APA[ACol,ARow].farbe; APAGrid.Canvas.Font.Color:=clBlack; APAGrid.Canvas.Pen.Color:=clBlack; - 308 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if (APA[ACol,ARow].materalisieren=true) then begin; APAGrid.Canvas.Pen.Color:=clRed; APAGrid.Canvas.Brush.Color:=clRed; NewRect.Left:=Rect.Left+round((Rect.Right-Rect.Left)/6); NewRect.Right:=Rect.Right-round((Rect.Right-Rect.Left)/6); NewRect.Top:=Rect.Top+round((Rect.Bottom-Rect.Top)/6); NewRect.Bottom:=Rect.Bottom-round((Rect.Bottom-Rect.Top)/6); APAGrid.Canvas.Ellipse(NewRect); APAGrid.Canvas.Font.Size:=4; APAGrid.Canvas.Font.Color:=clWhite; APAGrid.Canvas.Brush.Color:=clBlack; if APA[ACol,ARow].matcount>9 then APAGrid.Canvas.TextOut(Rect.Right-14,Rect.bottom15,inttostr(APA[ACol,ARow].matcount)) else APAGrid.Canvas.TextOut(Rect.Right-8,Rect.bottom15,inttostr(APA[ACol,ARow].matcount)); APAGrid.Canvas.Font.Size:=8; APAGrid.Canvas.Font.Color:=clWhite; APAGrid.Canvas.Brush.Color:=clRed; end; if (APA[ACol,ARow].derivative=true) then begin; APAGrid.Canvas.Pen.Color:=clGreen; APAGrid.Canvas.Brush.Color:=clGreen; NewRect.Left:=Rect.Left+round((Rect.Right-Rect.Left)/6); NewRect.Right:=Rect.Right-round((Rect.Right-Rect.Left)/6); NewRect.Top:=Rect.Top+round((Rect.Bottom-Rect.Top)/6); NewRect.Bottom:=Rect.Bottom-round((Rect.Bottom-Rect.Top)/6); APAGrid.Canvas.Ellipse(NewRect); APAGrid.Canvas.Font.Size:=8; APAGrid.Canvas.Font.Color:=clWhite; end; if (ACol=klickspalte)and(ARow=klickzeile) then begin; APAGrid.Canvas.Pen.Color:=clBlue; APAGrid.Canvas.Brush.Color:=clBlue; NewRect.Left:=Rect.Left+round((Rect.Right-Rect.Left)/6); NewRect.Right:=Rect.Right-round((Rect.Right-Rect.Left)/6); NewRect.Top:=Rect.Top+round((Rect.Bottom-Rect.Top)/6); NewRect.Bottom:=Rect.Bottom-round((Rect.Bottom-Rect.Top)/6); APAGrid.Canvas.Ellipse(NewRect); APAGrid.Canvas.Font.Size:=8; APAGrid.Canvas.Font.Color:=clWhite; end; if (Remove_Redundancy.Checked=false)or ((Remove_Redundancy.Checked=true)and(APA[ACol,ARow].farbe=clYellow)) then begin; APAGrid.Canvas.TextOut(round((Rect.left+Rect.right)/2)round(APAGrid.Canvas.TextWidth(APA[ACol,Arow].Screenbez)/2), round((Rect.top+Rect.Bottom)/2)round(APAGrid.Canvas.TextHeight(APA[ACol,Arow].Screenbez)/2),APA[ACol,Arow].Screen bez); end; end; procedure TAPA_Grid.APAGridMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin aktx:=x;akty:=y; zellespalte:=APAGrid.MouseCoord(x,y).X; zellezeile:=APAGrid.MouseCoord(x,y).y; - 309 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if ((zellespalte<>-1)and(zellezeile<>-1)) then begin; if (Remove_Redundancy.Checked=false)or ((Remove_Redundancy.Checked=true)and(APA[zellespalte,zellezeile].farbe=clYellow)) then begin; if APA[zellespalte,zellezeile].interessant=true then begin if (APA[zellespalte,zellezeile].gewichtlevel<>-1) and(APA[zellespalte,zellezeile].gewichtlevel<APA_Parameter.APA_Degrees.Items.Count) then statusbar.SimpleText:='('+inttostr(zellespalte)+':'+inttostr(zellezeile)+'):'+APA[ zellespalte,zellezeile].kurzbez+' /Required: '+APA_Parameter.APA_Degrees.Items[APA[zellespalte,zellezeile].gewichtlevel] else statusbar.SimpleText:='('+inttostr(zellespalte)+':'+inttostr(zellezeile)+'):'+APA[ zellespalte,zellezeile].kurzbez+' /Required:'; end else statusbar.SimpleText:='('+inttostr(zellespalte)+':'+inttostr(zellezeile)+'):'+APA[ zellespalte,zellezeile].kurzbez; end else statusbar.SimpleText:='Redundant cube selected'; {Generieren der Kurzbezeichnung} end else statusbar.SimpleText:='No cell selected'; end; procedure TAPA_Grid.Showlistbox1Click(Sender: TObject); begin Panel3.Width:=round(APAGrid.Width/2); listbox1.Visible:=true; end; procedure TAPA_Grid.Materialize1Click(Sender: TObject); begin mustsave:=true; APA[zellespalte,zellezeile].materalisieren:=true; matcount:=matcount+1; APA[zellespalte,zellezeile].matcount:=matcount; materialzeichnen; APAgrid.Repaint; end; procedure TAPA_Grid.Notrequired1Click(Sender: TObject); begin mustsave:=true; APA[zellespalte,zellezeile].interessant:=false; APA[zellespalte,zellezeile].gewicht:=0; APAGrid.Repaint; end; procedure TAPA_Grid.Dematerialize1Click(Sender: TObject); var merke,zeile,spalte:longint; begin mustsave:=true; APA[zellespalte,zellezeile].materalisieren:=false; //Neu Nummerieren merke:=APA[zellespalte,zellezeile].matcount; APA[zellespalte,zellezeile].matcount:=0; for zeile:=0 to anzzeilen-1 do begin for spalte:=0 to anzspalten-1 do begin if APA[spalte,zeile].matcount>merke then begin APA[spalte,zeile].matcount:=APA[spalte,zeile].matcount-1; end; - 310 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end;//spalte end;//zeile matcount:=matcount-1; materialzeichnen; APAGrid.Repaint; end; procedure TAPA_Grid.Showderivatives1Click(Sender: TObject); var spalte,zeile:longint; begin //Alle Linien löschen for spalte:= 0 to anzspalten-1 do begin for zeile:=0 to anzzeilen-1 do begin APA[spalte,zeile].linieoben:=false; APA[spalte,zeile].linieunten:=false; APA[spalte,zeile].linielinks:=false; APA[spalte,zeile].linierechts:=false; APA[spalte,zeile].derivative:=false; end; //Ende von Zeilen end; //Ende von Spalten APA[zellespalte,zellezeile].derivative:=true; markierederivative(zellespalte,zellezeile); APAGrid.Repaint; end; procedure TAPA_Grid.APAGridDblClick(Sender: TObject); begin APAGrid.Repaint; end; procedure TAPA_Grid.APAGridMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin zellespalte:=APAGrid.MouseCoord(x,y).X; zellezeile:=APAGrid.MouseCoord(x,y).y; {klickspalte:=APAGrid.MouseCoord(x,y).X; klickzeile:=APAGrid.MouseCoord(x,y).y;} end; procedure TAPA_Grid.Button_to_Input_ScreenClick(Sender: TObject); begin gotoInput:=true; gotoSelection:=false; APA_Grid.Close; end; procedure TAPA_Grid.Button_to_Selection_ScreenClick(Sender: TObject); begin gotoInput:=false; gotoSelection:=true; APA_Grid.Close; end; procedure TAPA_Grid.Button_to_Main_MenuClick(Sender: TObject); begin Close; end; procedure TAPA_Grid.Remove_RedundancyClick(Sender: TObject); begin Removeredundancy1.Checked:=Remove_Redundancy.Checked; Apagrid.Repaint; end; procedure TAPA_Grid.ShowRedundancyfreecube1Click(Sender: TObject); - 311 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN var spalte,zeile:longint; begin klickspalte:=zellespalte;klickzeile:=zellezeile; spalte:=zellespalte;zeile:=zellezeile; while (APA[klickspalte,klickzeile].kurzbez=APA[spalte,zeile].kurzbez) and(APA[klickspalte,klickzeile].farbe<>clYellow) do begin klickzeile:=klickzeile-1;if klickzeile<0 then exit; end; APAGrid.Repaint; end; procedure TAPA_Grid.Button_remove_required_cubesClick(Sender: TObject); var zahler:longint; zeile,spalte:longint; begin mustsave:=true; zeile:=0; while (zeile<anzzeilen)do begin spalte:=0; while (spalte<anzspalten) do begin APA[spalte,zeile].interessant:=false; APA[spalte,zeile].gewicht:=0; spalte:=spalte+1; end; zeile:=zeile+1; end; with APA_Selection_Screen do begin for zahler:=0 to Listeint.Items.Count-1 do begin if (copy(Listeint.items[zahler],1,4)='Req:') then begin; Req.Items[zahler].ImageIndex:=0; Req.Items[zahler].SelectedIndex:=0; end; end; end; ApaGrid.Repaint; end; procedure TAPA_Grid.Button_remove_derivativesClick(Sender: TObject); begin mustsave:=true; zellezeile:=0; while (zellezeile<anzzeilen)do begin zellespalte:=0; while (zellespalte<anzspalten) do begin APA[zellespalte,zellezeile].derivative:=false; zellespalte:=zellespalte+1; end; zellezeile:=zellezeile+1; end; materialzeichnen; ApaGrid.Repaint; end; procedure TAPA_Grid.Button_remove_materialized_cubesClick(Sender: TObject); begin mustsave:=true; zellezeile:=0; while (zellezeile<anzzeilen)do begin zellespalte:=0; while (zellespalte<anzspalten) do begin APA[zellespalte,zellezeile].materalisieren:=false; APA[zellespalte,zellezeile].value:=0; zellespalte:=zellespalte+1; end; zellezeile:=zellezeile+1; end; materialzeichnen; ApaGrid.Repaint; - 312 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN matcount:=0; end; procedure TAPA_Grid.ListBox1DblClick(Sender: TObject); begin Panel3.Width:=1; end; procedure TAPA_Grid.FormShow(Sender: TObject); begin if generiereapaneu=true then begin APAGrid.Visible:=false; APAGrid.Enabled:=false; {Spalten berechnen} calculatecolumnscount; {Anz der Zielen berechnen} calculaterowcount; APAGrid.ColCount:=anzspalten; APAGrid.RowCount:=anzzeilen; {APA generieren} generate; APAGrid.Visible:=true; APAGrid.Enabled:=true; generiereapaneu:=false; Showdeterministicsolution2.Visible:=true; Removedeterministicsolution2.Visible:=false; end; end; function TAPA_Grid.getbuild(vonspalte,vonzeile,zuspalte,zuzeile:longint):Extended; begin with APA_Application do begin if (vonspalte<>zuspalte)or(vonzeile<>zuzeile) then begin if findkosten(vonspalte,vonzeile,zuspalte,zuzeile) then begin Result:=vKosten.Build; end//End of findkey else begin; if (vonspalte<>zuspalte)or(vonzeile<>zuzeile) then begin; APA_Show_Process.ausgabe('Da fehlen Kosten!! '+inttostr(vonspalte)+':'+inttostr(vonzeile)+'/'+inttostr(zuspalte)+':'+inttostr(z uzeile));//Später entfernen break:=true; end; Result:=0; end; end else Result:=0; end;//End of APA_Application} end; function TAPA_Grid.getquery(vonspalte,vonzeile,zuspalte,zuzeile:longint):Extended; begin with APA_Application do begin if (vonspalte<>zuspalte)or(vonzeile<>zuzeile) then begin if findkosten(vonspalte,vonzeile,zuspalte,zuzeile) then begin Result:=vKosten.Query; end//End of findkey else begin; if (vonspalte<>zuspalte)or(vonzeile<>zuzeile) then begin; - 313 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APA_Show_Process.ausgabe('Da fehlen QueryKosten!! '+inttostr(vonspalte)+':'+inttostr(vonzeile)+'/'+inttostr(zuspalte)+':'+inttostr(z uzeile));//Später entfernen break:=true;end; Result:=0; end; end else Result:=0; end;//End of APA_Application end; function TAPA_Grid.auffuellen(st:string; anzahl:longint):string; begin while (length(st)<anzahl) do begin st:='0'+st; end; result:=st; end; function TAPA_Grid.getgrouptupel(parentspalte,parentzeile,aktspalte,aktzeile:longint):Exten ded; var counter:longint; var dimcount:longint; begin; if parentspalte<>-1 then begin dimcount:=0; for counter:=0 to anzd-1 do begin if (APA[parentspalte,parentzeile].hierstufe[counter]< APA[aktspalte,aktzeile].hierstufe[counter])and (APA[aktspalte,aktzeile].hierstufe[counter]<>0) then begin dimcount:=dimcount+1; end; end; end//of -1 else begin dimcount:=0; for counter:=0 to anzd-1 do begin if (APA[aktspalte,aktzeile].hierstufe[counter]<>0) then begin dimcount:=dimcount+1 end; end; end; Result:=dimcount; end; function TAPA_Grid.gettupel(aktspalte,aktzeile:longint):Extended; var storetupels:Extended; var anztupels:Extended; var counter:longint; begin; if aktspalte<>-1 then begin //Berechne Tupels welche gespeichert werden try storetupels:=0; for counter:=0 to anzd-1 do begin storetupels:=storetupels+countdaten[counter,APA[aktspalte,aktzeile].hierstufe[coun ter]]; end; Result:=storetupels; except Result:=0; - 314 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; end else //BFT begin; //Berechne die Tupels welche abgefragt werden anztupels:=0; for counter:=0 to anzd-1 do begin; anztupels:=anztupels+countdaten[counter,0]; end; Result:=anztupels; end; end; function TAPA_Grid.deltaBftW(aktspalte,aktzeile:longint;Query:boolean):Extended; var anztupels,storetupels:Extended; //Zähler var SummeBerechnungendeltaBFTW:Extended; begin; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Berechne die Kosten für das Erzeugen des Würfels aus dem BFT table //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ anztupels:=gettupel(-1,-1); storetupels:=gettupel(aktspalte,aktzeile); try if Query= true then begin SummeBerechnungendeltaBFTW:= ( ( ( ((strtofloat(APA_Parameter.APA_Thomas_timeio.text)*(anztupels+(2*storetupels)))) ) / strtofloat(APA_Parameter.APA_Thomas_timemax.text) )+ ( (storetupels* log2(storetupels)*strtofloat(APA_Parameter.APA_Thomas_timecpu.Text)) / strtofloat(APA_Parameter.APA_Thomas_timemax.text) ) ) * (APA_Parameter.APA_Thomas_Importance.Position/100); end else begin SummeBerechnungendeltaBFTW:= ( (( ((strtofloat(APA_Parameter.APA_Thomas_timeio.text)*(anztupels+(2*storetupels)))) + (strtofloat(APA_Parameter.APA_Thomas_timestore.Text)*storetupels) ) / strtofloat(APA_Parameter.APA_Thomas_timemax.text) )+ ( (storetupels* log2(storetupels)*strtofloat(APA_Parameter.APA_Thomas_timecpu.Text)) / strtofloat(APA_Parameter.APA_Thomas_timemax.text) - 315 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN ) ) * (APA_Parameter.APA_Thomas_Importance.Position/100); SummeBerechnungendeltaBFTW:=SummeBerechnungendeltaBFTW + (( (strtofloat(APA_Parameter.APA_Thomas_timestore.text)*storetupels) / strtofloat(APA_Parameter.APA_Thomas_spacemax.text) ) * (1-(APA_Parameter.APA_Thomas_Importance.Position/100)) ); end; except showmessage('Error in Parameters'); SummeBerechnungendeltaBFTW:=0; end; Result:=SummeBerechnungendeltaBFTW; end; function TAPA_Grid.deltaVW(spalte,zeile,aktspalte,aktzeile:longint;query:boolean):Extended; var anztupels, storetupels:Extended; //Zähler var SummeBerechnungendeltaVW:Extended; begin; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Berechne die Kosten für das Berechnen des Würfels aus dem BFT table //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SummeBerechnungendeltaVW:=0; if (spalte<>aktspalte)or(zeile<>aktzeile) then begin if spalte<>-1 then begin anztupels:=gettupel(spalte,zeile); storetupels:=gettupel(aktspalte,aktzeile); try if Query=true then begin //ABfrage SummeBerechnungendeltaVW:= ( (( ((strtofloat(APA_Parameter.APA_Thomas_timeio.text)*(anztupels+(2*storetupels)))) ) / strtofloat(APA_Parameter.APA_Thomas_timemax.text) )+ ( (storetupels* log2(storetupels)*strtofloat(APA_Parameter.APA_Thomas_timecpu.Text)) / strtofloat(APA_Parameter.APA_Thomas_timemax.text) ) ) * (APA_Parameter.APA_Thomas_Importance.Position/100); end else begin //Materialisieren SummeBerechnungendeltaVW:= ( (( ((strtofloat(APA_Parameter.APA_Thomas_timeio.text)*(anztupels+(2*storetupels)))) + (strtofloat(APA_Parameter.APA_Thomas_timestore.Text)*storetupels) - 316 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN ) / strtofloat(APA_Parameter.APA_Thomas_timemax.text) )+ ( (storetupels* log2(storetupels)*strtofloat(APA_Parameter.APA_Thomas_timecpu.Text)) / strtofloat(APA_Parameter.APA_Thomas_timemax.text) ) ) * (APA_Parameter.APA_Thomas_Importance.Position/100); SummeBerechnungendeltaVW:=SummeBerechnungendeltaVW + (( (strtofloat(APA_Parameter.APA_Thomas_timestore.text)*storetupels) / strtofloat(APA_Parameter.APA_Thomas_spacemax.text) ) * (1-(APA_Parameter.APA_Thomas_Importance.Position/100)) ); end; except showmessage('Error in Parameters'); SummeBerechnungendeltaVW:=0; end; end //spalte -1 else begin SummeBerechnungendeltaVW:=deltaBftW(aktspalte,aktzeile,Query); end; end; Result:=SummeBerechnungendeltaVW; end; function TAPA_Grid.GetMinDerivatOfSpalte(aktspalte,aktzeile:longint;Query:boolean):longint; var counter:longint; New:string; derivat:longint; mincost:Extended; aus:boolean; begin try derivat:=0;mincost:=0; aus:=false; counter:=0; repeat; if counter<=Memorywuerfel.count-1 then begin New:=Memorywuerfel[counter]; if isderivat(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,aktzeile) then begin; if Userandomcosts1.Checked=false then begin if (mincost=0)or (deltaVW(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,aktzeile,Que ry)<mincost) then begin; derivat:=strtoint(copy(new,1,30)); mincost:=deltaVW(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,aktz eile,Query); end; end else begin; //Kosten aus der Datei if Query=false then begin - 317 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if (mincost=0)or (getbuild(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,aktzeile)<m incost) then begin; derivat:=strtoint(copy(new,1,30)); mincost:=getbuild(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,akt zeile); end; end else begin if (mincost=0)or (getquery(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,aktzeile)<m incost) then begin derivat:=strtoint(copy(new,1,30)); mincost:=getquery(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,akt zeile); end; end; end; end; end; counter:=counter+1; if (counter>Memorywuerfel.Count-1) then begin; aus:=true; end else begin if (Memorywuerfel[counter]=auffuellen(inttostr(aktspalte),30)+auffuellen(inttostr(akt zeile),30))and(Query=false) then aus:=true; end; until (aus=true); Result:=derivat; except Result:=0; end; end; function TAPA_Grid.GetMinDerivatOfZeile(aktspalte,aktzeile:longint;Query:boolean):longint; var counter:longint; New:string; derivat:longint; mincost:Extended; aus:boolean; begin try derivat:=0;mincost:=0; aus:=false; counter:=0; repeat; if counter<=Memorywuerfel.count-1 then begin New:=Memorywuerfel[counter]; if isderivat(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,aktzeile) then begin; if Userandomcosts1.Checked=false then begin if (mincost=0)or (deltaVW(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,aktzeile,Que ry)<mincost) then begin; derivat:=strtoint(copy(new,31,30)); mincost:=deltaVW(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,aktz eile,Query); end; end else begin; //Kosten aus der Datei - 318 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if Query=false then begin if (mincost=0)or (getbuild(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,aktzeile)<m incost) then begin; derivat:=strtoint(copy(new,31,30)); mincost:=getbuild(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,akt zeile); end; end else begin if (mincost=0)or (getquery(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,aktzeile)<m incost) then begin; derivat:=strtoint(copy(new,31,30)); mincost:=getquery(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,akt zeile); end; end; end; // von if Userandomcosts1.Checked=true end; //Ende von if isderivat(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),aktspalte,aktzeile) end; //Ende von if counter<=Memorywuerfel.count-1 counter:=counter+1; if (counter>Memorywuerfel.Count-1) then begin; aus:=true; end else begin if (Memorywuerfel[counter]=auffuellen(inttostr(aktspalte),30)+auffuellen(inttostr(akt zeile),30))and(Query=false) then aus:=true; end; until (aus=true); Result:=derivat; except Result:=0; end; end; procedure TAPA_Grid.berechneProsser(); var spaceortime_limit_reached:boolean; counter:longint; aktzeile, aktspalte:longint; spalte,zeile:longint; //gibt den aktuellen Cursor im Gitter an// spacemax:Extended; isderivatof,added:boolean; timemax:Extended; merkvalue:Extended; BerechneE:Extended; new:string; begin Button_remove_materialized_cubes.Click;//Entferne alle materialisierten Würfel aus dem APA Memorywuerfel:= TStringList.Create; //Erzeuge die Liste der ausgewählten Würfel Listbox1.Items.Clear; try {Starte HEURISTIK von Alexander PROSSER} //Setze maximalen Speicherplatz und Zeit spacemax:=strtofloat(APA_Parameter.APA_Thomas_spacemax.text); timemax:=strtofloat(APA_Parameter.APA_Thomas_timemax.text); - 319 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN spaceortime_limit_reached:=false; //Bestimmen des ersten Cube Anfang //******************************** //Schleife für alle Würfel, welche noch nicht ausgewählt wurden// for zeile:=0 to anzzeilen-1 do begin; for spalte:=0 to anzspalten-1 do begin; //zeile und spalte symbolisieren einen Würfel // v welcher zugestetz werden könnte BerechneE:=0; if (APA[spalte,zeile].farbe=clYellow) then begin; //Wenn redundanzfrei dann beginne// Listbox1.Items.Add('');listbox1.Items.Add('++++++++++++++++Kontrolliere Zelle '+inttostr(spalte)+':'+inttostr(zeile)); //Setzte den Wert für E(m) auf 0 for aktzeile:=0 to anzzeilen-1 do begin for aktspalte:=0 to anzspalten-1 do begin //aktzeile und aktspalte symbolisieren den würfel w //Feststellen ob der Würfel redundanzfrei und ausgewählt ist// if (APA[aktspalte,aktzeile].farbe=clYellow)and(APA[aktspalte,aktzeile].gewicht<>0) then begin //if //aktuelle Würfel ist ein Derivat von aktellem v if (isderivat(spalte,zeile,aktspalte,aktzeile)=true)and(APA[aktspalte,aktzeile].inter essant=true) then begin listbox1.Items.Add('Schau mir das an: ist Derivat und nicht 0 '+inttostr(aktspalte)+':'+inttostr(aktzeile)); //Berechne Summe aller Delta w if Userandomcosts1.Checked=false then begin BerechneE:=BerechneE+ ((deltaBftW(aktspalte,aktzeile,false)deltaVW(spalte,zeile,aktspalte,aktzeile,false))*(APA[aktspalte,aktzeile].gewicht)) ; listbox1.Items.Add('Berechne'+floattostr(deltaBftW(aktspalte,aktzeile,false))+'-' +floattostr(deltaVW(spalte,zeile,aktspalte,aktzeile,false))+'*'+floattostr((APA[ak tspalte,aktzeile].gewicht))); end else begin BerechneE:=BerechneE+ ((getbuild(-1,-1,aktspalte,aktzeile)getbuild(spalte,zeile,aktspalte,aktzeile))*(APA[aktspalte,aktzeile].gewicht)); listbox1.Items.Add('Berechne'+floattostr(getbuild(-1,1,aktspalte,aktzeile))+'-' +floattostr(getbuild(spalte,zeile,aktspalte,aktzeile))+'*'+floattostr((APA[aktspal te,aktzeile].gewicht))); end; end; //Wenn Derivat end; //Wenn Würfel ist redundanzfrei end;{Ende von aktspalte} end;{Ende von aktzeile} if Userandomcosts1.Checked=false then begin listbox1.Items.add('Gesamtwert für BerechneE :'+floattostr(BerechneE)); APA[spalte,zeile].value:=(BerechneE-deltaBftW(spalte,zeile,false)); listbox1.Items.Add('Wert eintragen für Zelle '+inttostr(spalte)+':'+inttostr(zeile)+': Wert: '+floattostr(APA[spalte,zeile].value)+' Gewicht: '+floattostr((APA[spalte,zeile].gewicht))); - 320 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if APA[spalte,zeile].gewicht<>0 then listbox1.Items.add('================================================='); end else begin listbox1.Items.add('Gesamtwert für BerechneE :'+floattostr(BerechneE)); APA[spalte,zeile].value:=(BerechneE-getbuild(-1,-1,spalte,zeile)); listbox1.Items.Add('Wert eintragen für Zelle '+inttostr(spalte)+':'+inttostr(zeile)+': Wert: '+floattostr(APA[spalte,zeile].value)+' Gewicht: '+floattostr((APA[spalte,zeile].gewicht))); if APA[spalte,zeile].gewicht<>0 then listbox1.Items.add('================================================='); end; end{von Redundanzfrei} else APA[spalte,zeile].value:=0; end;{For Schleife spalte} end;{For Schleife zeilen} //Materialisiere als ersten Würfel jenen mit dem besten Value //Finde den höchsten Wert merkvalue:=APA[0,0].value;aktzeile:=0;aktspalte:=0; for zeile:=0 to anzzeilen-1 do begin; for spalte:=0 to anzspalten-1 do begin; if ((APA[spalte,zeile].value>merkvalue)or((merkvalue=0)and(Minusnehmen1.Checked=true) )) and (APA[spalte,zeile].value<>0) then begin merkvalue:=APA[spalte,zeile].value;//Wert merken aktspalte:=spalte;aktzeile:=zeile;//Merken der Spalte und Zeile end; end; end; if merkvalue=0 then spaceortime_limit_reached:=true; if Userandomcosts1.Checked=false then begin timemax:=timemax-(strtofloat(APA_Parameter.APA_Thomas_timeio.text)*(gettupel(-1,1)+(2*gettupel(aktspalte,aktzeile)))+ +strtofloat(APA_Parameter.APA_Thomas_timecpu.text)*gettupel(aktspalte,aktzeile)*lo g2(gettupel(aktspalte,aktzeile))+ strtofloat(APA_Parameter.APA_Thomas_timestore.Text)*gettupel(aktspalte,aktzeile)); end else begin timemax:=timemax-getbuild(-1,-1,aktspalte,aktzeile); end; spacemax:=spacemax(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(aktspalte,aktzei le)); if (spacemax<0) or (timemax<0) then begin showmessage('Limit erreicht'); spaceortime_limit_reached:=true; end else begin new:=auffuellen(inttostr(aktspalte),30); new:=new+auffuellen(inttostr(aktzeile),30); Memorywuerfel.Add(new); APA[aktspalte,aktzeile].materalisieren:=true; matcount:=matcount+1; APA[aktspalte,aktzeile].matcount:=matcount; end; //Bestimmen des ersten Cube Ende //************************* //Festellen der Zusatzwürfeln //*************************** - 321 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if ProssernurersterLauf1.Checked=false then begin while (spaceortime_limit_reached=false) do begin; //Schleife für alle Würfel, welche noch nicht ausgewählt wurden// for zeile:=0 to anzzeilen-1 do begin; for spalte:=0 to anzspalten-1 do begin; //zeile und spalte symbolisieren einen Würfel // v welcher zugestetz werden könnte //Setzte den Wert für E(m) auf 0 BerechneE:=0; //Alle Wuerfel Value auf 0 setzen for aktzeile:=0 to anzzeilen-1 do begin; for aktspalte:=0 to anzspalten-1 do begin; APA[aktspalte,aktzeile].value:=0; end; end; if (APA[spalte,zeile].farbe=clYellow) then begin; //Wenn redundanzfrei dann beginne// Listbox1.items.add('+++++++++++'); listbox1.Items.Add('Kontrolliere zweite Schleife Zelle '+inttostr(spalte)+':'+inttostr(zeile)+': Wert: '+floattostr(APA[spalte,zeile].value)+' Gewicht: '+floattostr(APA[spalte,zeile].gewicht)); //Stelle fest, ob Würfel schon zugesetzt added:=false; for counter:=0 to Memorywuerfel.Count-1 do begin New:=Memorywuerfel[counter]; if (strtoint(copy(new,31,30))=zeile)and(strtoint(copy(new,1,30))=spalte) then added:=true; end; if added=true then listbox1.items.add('++++ Würfel schon zugesetzt ++++'); if added=false then begin; //Würfel ist noch nicht in der Menge der bereits ausgewählten Würfel// isderivatof:=false; for counter:=0 to Memorywuerfel.Count-1 do begin New:=Memorywuerfel[counter]; if isderivat(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),spalte,zeile) then begin; isderivatof:=true; Listbox1.Items.Add(copy(new,1,30)+':'+copy(new,31,30)+' kann erzeugen '+inttostr(spalte)+':'+inttostr(zeile)) end; end; if isderivatof=false then begin //ist kein Derivat Begin ++++++++++++++++++++++++ //wird also aus dem BFT berechnet //Berechne alle Zellen ein for aktzeile:=0 to anzzeilen-1 do begin for aktspalte:=0 to anzspalten-1 do begin //aktzeile und aktspalte symbolisieren den würfel w //Feststellen ob der Würfel redundanzfrei ist// if (APA[aktspalte,aktzeile].farbe=clYellow)and(APA[aktspalte,aktzeile].gewicht<>0) then begin //if //aktuelle Würfel ist ein Derivat von aktellem v - 322 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if isderivat(spalte,zeile,aktspalte,aktzeile)=true then begin listbox1.Items.add('Kontrolliere Würfel '+inttostr(aktspalte)+'.'+inttostr(aktzeile)); //Wenn u aus einem bereits materialisierten Würfel abgebildet werden kann isderivatof:=false; for counter:=0 to Memorywuerfel.Count-1 do begin New:=Memorywuerfel[counter]; if isderivat(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),spalte,zeile) then begin; Listbox1.Items.Add(copy(new,1,30)+':'+copy(new,31,30)+' ist auch ein derivat von '+inttostr(spalte)+':'+inttostr(zeile)); isderivatof:=true; end; end; if isderivatof=false then begin; if Userandomcosts1.Checked=false then begin BerechneE:=BerechneE+((deltaBftW(aktspalte,aktzeile,false)deltaVW(spalte,zeile,aktspalte,aktzeile,false))*(APA[aktspalte,aktzeile].gewicht)) ; listbox1.Items.Add('Berechne'+floattostr(deltaBftW(aktspalte,aktzeile,false))+'-' +floattostr(deltaVW(spalte,zeile,aktspalte,aktzeile,false))+'*'+floattostr((APA[ak tspalte,aktzeile].gewicht))); end//von Userkostenrandom else begin BerechneE:=BerechneE+((getbuild(-1,1,aktspalte,aktzeile)getbuild(spalte,zeile,aktspalte,aktzeile))*(APA[aktspalte,aktzeile].gewicht)); listbox1.Items.Add('Berechne'+floattostr(getbuild(1,-1,aktspalte,aktzeile))+'-' +floattostr(getbuild(spalte,zeile,aktspalte,aktzeile))+'*'+floattostr((APA[aktspal te,aktzeile].gewicht))); end; end else begin if Userandomcosts1.Checked=false then begin BerechneE:=BerechneE+ max(0,((deltaVW(GetMinDerivatOfSpalte(aktspalte,aktzeile,false), GetMinDerivatOfZeile(aktspalte,aktzeile,false),aktspalte,aktzeile,false)deltaVW(spalte,zeile,aktspalte,aktzeile,false))*(APA[aktspalte,aktzeile].gewicht)) ); listbox1.Items.Add('Berechne'+floattostr(deltaVW(GetMinDerivatOfSpalte(aktspalte,a ktzeile,false), GetMinDerivatOfZeile(aktspalte,aktzeile,false),aktspalte,aktzeile,false))+'-' +floattostr(deltaVW(spalte,zeile,aktspalte,aktzeile,false))+'*'+floattostr((APA[ak tspalte,aktzeile].gewicht))); end//von Userkosten else begin BerechneE:=BerechneE+ - 323 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN max(0,((getbuild(GetMinDerivatOfSpalte(aktspalte,aktzeile,false), GetMinDerivatOfZeile(aktspalte,aktzeile,false),aktspalte,aktzeile)getbuild(spalte,zeile,aktspalte,aktzeile))*(APA[aktspalte,aktzeile].gewicht))); listbox1.Items.Add('Berechne'+floattostr(getbuild(GetMinDerivatOfSpalte(aktspalte, aktzeile,false), GetMinDerivatOfZeile(aktspalte,aktzeile,false),aktspalte,aktzeile))+'-' +floattostr(getbuild(spalte,zeile,aktspalte,aktzeile))+'*'+floattostr((APA[aktspal te,aktzeile].gewicht))); end; end; end; //Wenn Derivat end; //Wenn Würfel ist redundanzfrei end;//Ende von aktspalte end;//Ende von aktzeile if Userandomcosts1.Checked=false then begin APA[spalte,zeile].value:=BerechneE-deltaBftW(spalte,zeile,false); listbox1.Items.add('BerechneE für '+inttostr(spalte)+':'+inttostr(Zeile)+' ist '+floattostr(BerechneEdeltaBftW(spalte,zeile,false))); end//von Userkosten else begin APA[spalte,zeile].value:=BerechneE-getbuild(-1,-1,spalte,zeile); listbox1.Items.add('BerechneE für '+inttostr(spalte)+':'+inttostr(Zeile)+' ist '+floattostr(BerechneE-getbuild(-1,1,spalte,zeile))); end; end//von ist kein Derivat ++++++++++++++++++++++ else begin//von ist ein Derivat ++++++++++++++++++++++++ listbox1.Items.Add('is a derivat Cell '+inttostr(spalte)+':'+inttostr(zeile)); for aktzeile:=0 to anzzeilen-1 do begin for aktspalte:=0 to anzspalten-1 do begin //aktzeile und aktspalte symbolisieren den würfel w //Feststellen ob der Würfel redundanzfrei ist// if (APA[aktspalte,aktzeile].farbe=clYellow) and(APA[aktspalte,aktzeile].gewicht<>0) then begin //if //aktuelle Würfel ist ein Derivat von aktellem v if isderivat(spalte,zeile,aktspalte,aktzeile)=true then begin if Userandomcosts1.Checked=false then begin BerechneE:=BerechneE+ max(0,((deltaVW(GetMinDerivatOfSpalte(aktspalte,aktzeile,false), GetMinDerivatOfZeile(aktspalte,aktzeile,false),aktspalte,aktzeile,false)deltaVW(spalte,zeile,aktspalte,aktzeile,false))*(APA[aktspalte,aktzeile].gewicht)) ); listbox1.items.add('Min Parent is '+inttostr(GetMinDerivatOfSpalte(aktspalte,aktzeile,false))+':'+ inttostr(GetMinDerivatOfZeile(aktspalte,aktzeile,false))); listbox1.Items.Add('Berechne 0 oder '+floattostr(deltaVW(GetMinDerivatOfSpalte(aktspalte,aktzeile,false), GetMinDerivatOfZeile(aktspalte,aktzeile,false),aktspalte,aktzeile,false))+'-' - 324 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN +floattostr(deltaVW(spalte,zeile,aktspalte,aktzeile,false))+'*'+floattostr((APA[ak tspalte,aktzeile].gewicht))); end//of Userkosten else begin BerechneE:=BerechneE+ max(0,((getbuild(GetMinDerivatOfSpalte(aktspalte,aktzeile,false), GetMinDerivatOfZeile(aktspalte,aktzeile,false),aktspalte,aktzeile)getbuild(spalte,zeile,aktspalte,aktzeile))*(APA[aktspalte,aktzeile].gewicht))); listbox1.items.add('Min Parent is '+inttostr(GetMinDerivatOfSpalte(aktspalte,aktzeile,false))+':'+ inttostr(GetMinDerivatOfZeile(aktspalte,aktzeile,false))); listbox1.Items.Add('Berechne 0 oder '+floattostr(getbuild(GetMinDerivatOfSpalte(aktspalte,aktzeile,false), GetMinDerivatOfZeile(aktspalte,aktzeile,false),aktspalte,aktzeile))+'-' +floattostr(getbuild(spalte,zeile,aktspalte,aktzeile))+'*'+floattostr((APA[aktspal te,aktzeile].gewicht))); end; end; //Wenn Derivat end; //Wenn Würfel ist redundanzfrei end;//Ende von aktspalte end;//Ende von aktzeile if Userandomcosts1.Checked=false then begin APA[spalte,zeile].value:=BerechneEdeltaVW(GetMinDerivatOfSpalte(spalte,zeile,false),GetMinDerivatOfZeile(spalte,zeil e,false),spalte,zeile,false); listbox1.Items.add('BerechneE für '+inttostr(spalte)+':'+inttostr(Zeile)+' ist '+floattostr(APA[spalte,zeile].value)); end//Userkosten else begin APA[spalte,zeile].value:=BerechneEgetbuild(GetMinDerivatOfSpalte(spalte,zeile,false),GetMinDerivatOfZeile(spalte,zei le,false),spalte,zeile); listbox1.Items.add('BerechneE für '+inttostr(spalte)+':'+inttostr(Zeile)+' ist '+floattostr(APA[spalte,zeile].value)); end; end;//von ist ein Derivat ++++++++++++++++++++++++++++ end; //Würfel ist noch nicht in der Liste ENDE end;//von Redundanzfrei end;//For Schleife spalte end;//For Schleife zeilen //Materialisiere als nächsten Würfel jenen mit dem besten Value //Finde den höchsten Wert merkvalue:=0;aktzeile:=0;aktspalte:=0;isderivatof:=false; for zeile:=0 to anzzeilen-1 do begin; for spalte:=0 to anzspalten-1 do begin; if ((APA[spalte,zeile].value>merkvalue)or((merkvalue=0)and(Minusnehmen1.Checked=true) )) and (APA[spalte,zeile].value<>0) then begin merkvalue:=APA[spalte,zeile].value;//Wert merken - 325 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN aktspalte:=spalte;aktzeile:=zeile;//Merken der Spalte und Zeile //Festellen, ob aus dem BFT materialisiert wird oder aus einem bereits //materialisierten Würfel for counter:=0 to Memorywuerfel.Count-1 do begin New:=Memorywuerfel[counter]; if isderivat(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)),spalte,zeile) then begin; isderivatof:=true; end; end; end; end; end; if merkvalue=0 then begin; spaceortime_limit_reached:=true; //Wenn kein Würfel einen Wert hat beenden showmessage('Alle Würfel 0'); end else begin; if isderivatof=false then begin //Wird aus dem BFT erzeugt if Userandomcosts1.Checked=false then begin timemax:=timemax(strtofloat(APA_Parameter.APA_Thomas_timeio.text)*(gettupel(-1,1)+(2*gettupel(aktspalte,aktzeile)))+ +strtofloat(APA_Parameter.APA_Thomas_timecpu.text)*gettupel(aktspalte,aktzeile)*lo g2(gettupel(aktspalte,aktzeile))+ strtofloat(APA_Parameter.APA_Thomas_timestore.Text)*gettupel(aktspalte,aktzeile)); end else begin timemax:=timemax-getbuild(-1,-1,aktspalte,aktzeile); end; spacemax:=spacemax(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(aktspalte,aktzei le)); end else begin //Wird aus bereits materialisiertem Würfel erzeugt if Userandomcosts1.Checked=false then begin timemax:=timemax-(strtofloat(APA_Parameter.APA_Thomas_timeio.text)* (gettupel(GetMinDerivatOfSpalte(aktspalte,aktzeile,false),GetMinDerivatOfZeile(akt spalte,aktzeile,false))+(2*gettupel(aktspalte,aktzeile)))+ +strtofloat(APA_Parameter.APA_Thomas_timecpu.text)*gettupel(aktspalte,aktzeile)*lo g2(gettupel(aktspalte,aktzeile))+ strtofloat(APA_Parameter.APA_Thomas_timestore.Text)*gettupel(aktspalte,aktzeile)); end else begin timemax:=timemaxgetbuild(GetMinDerivatOfSpalte(aktspalte,aktzeile,false),GetMinDerivatOfZeile(akts palte,aktzeile,false), aktspalte,aktzeile); end; spacemax:=spacemax(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(aktspalte,aktzei le)); end; end; - 326 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if timemax<0 then showmessage('timemax erreicht'); if spacemax<0 then showmessage('spacemax erreicht'); if (spacemax<0) or (timemax<0) then begin spaceortime_limit_reached:=true; end else begin new:=auffuellen(inttostr(aktspalte),30); new:=new+auffuellen(inttostr(aktzeile),30); Memorywuerfel.Add(new); APA[aktspalte,aktzeile].materalisieren:=true; matcount:=matcount+1; APA[aktspalte,aktzeile].matcount:=matcount; end; end; {(spaceortime_limit_reached=false)} end; // of ProssernurersterLauf1.checked {Starte HEURISTIK von Alexander PROSSER ENDE} finally Memorywuerfel.Free; end; materialzeichnen; APAGrid.Repaint; showmessage('Ready'); end; procedure TAPA_Grid.Button1Click(Sender: TObject); begin; mustsave:=true; berechneProsser(); end; procedure TAPA_Grid.Item1Click(Sender: TObject); begin mustsave:=true; APA[zellespalte,zellezeile].interessant:=true; APA[zellespalte,zellezeile].gewicht:=strtoint(APA_Parameter.APA_Degreecounts.Items[(Send er as TMenuItem).Tag]); APA[zellespalte,zellezeile].gewichtlevel:=(Sender as TMenuItem).Tag; APAGrid.Repaint; end; procedure TAPA_Grid.Button2Click(Sender: TObject); var PossibleCubes, SecondCubes:TStringList; var NewStringList:TStringList; var MatCubes, SecondMatCubes: TStringList; var MerkMatCubes, MerkMatCubesfertig:TList; var MyReqCubes, MyMatCubes:TStringList; var zeile,spalte, merkpos:longint; var merkcosts,merkcosts2:Extended; var Sets:array of Extended; var Setcounter, NewSetsforEachIteration, Setcount, maxSets:longint; var zahler,zahler2, zahler3, counter, zahlersecond1, zahlersecond2, merkepossecond:longint; var derivzeile,derivspalte,aktzeile,aktspalte:longint; var spaceortimelimitreached,nocubefound,bereitsmaterialisiert:boolean; var kannabgeleitetwerden:boolean; var timemax,spacemax, alttimemax,altspacemax,Summederiv, MinMatCosts, MinQueryCosts:Extended; var parentzeile,parentspalte, merkspalte,merkzeile:longint; var kannderivatabgeleitetwerden:boolean; var parentderivatzeile,parentderivatspalte:longint; var merkspaltesecond,merkzeilesecond:longint; var faktor:real; var count_of_derivates:longint; var foundbestcube:boolean; var maxvalue:Extended; var countofpaths:longint; - 327 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN var merksecondcosts:Extended; begin Button_remove_materialized_cubes.Click; assignfile(fKosten,'C:\APADIR\DATA\Kosten.dat'); {$i-} reset(fKosten); {$i+} if ioresult<>0 then begin; showmessage('cost database error ');exit;end; try APA_Grid.Enabled:=false; if (APA_Options.APA_ShowScreenheuristic.Checked) then begin APA_Show_Process.Show; APA_Show_Process.APA_Protocoll.Clear; end; listbox1.Items.Clear; {*********************************************************} {1. Vorbereitungen für die Iteration} {*********************************************************} APA_Show_Process.ausgabe('Start Thomas Achs heuristic ...'); {1.a Erzeuge die Liste der materialisierungswürdigen Würfel} PossibleCubes:=TStringList.Create(); SecondCubes:=TStringList.Create(); MerkMatCubes:=TList.Create(); MerkMatCubesfertig:=TList.Create(); MatCubes:=TStringList.Create(); SecondMatCubes:=TStringList.Create(); try APA_Show_Process.ausgabe('Search for required cubes...'); counter:=0; for aktzeile:=0 to anzzeilen-1 do begin for aktspalte:=0 to anzspalten-1 do begin if (APA[aktspalte,aktzeile].interessant=true)and (APA[aktspalte,aktzeile].farbe=clYellow) then begin//Auswählen des Würfels listbox1.Items.Add('Required Cube: '+auffuellen(inttostr(aktspalte),10)+auffuellen(inttostr(aktzeile),10)); PossibleCubes.Add(auffuellen(inttostr(aktspalte),10)+auffuellen(inttostr(aktzeile) ,10)); counter:=counter+1; end;//of Auswählen des Würfels end;//of aktspalte end;//of aktzeile APA_Show_Process.ausgabe(' Found '+inttostr(counter)+' required Cubes'); {1.b Setze Derivate zu} if tomohnederivate1.Checked=false then begin APA_Show_Process.ausgabe('Search for parent cubes or required cubes...'); counter:=0; for aktzeile:=0 to anzzeilen-1 do begin for aktspalte:=0 to anzspalten-1 do begin if (APA[aktspalte,aktzeile].farbe=clYellow)and(APA[aktspalte,aktzeile].interessant=fa lse) then begin count_of_derivates:=0; for derivspalte:=0 to anzspalten-1 do begin; for derivzeile:=0 to anzzeilen-1 do begin; if (APA[derivspalte,derivzeile].interessant=true)and (APA[derivspalte,derivzeile].farbe=clYellow) then begin if isderivat(aktspalte,aktzeile,derivspalte,derivzeile) then begin //Jetzt kontrollieren wir, ob dieser Würfel auch noch ein Derivat eines anderen Würfels count_of_derivates:=count_of_derivates+1; end;//Ende von derivat end;//Ende von interessant - 328 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end;//of derivzeile end;//of derivsspalte if count_of_derivates>=1 then begin listbox1.Items.Add('Derivat Cube: '+auffuellen(inttostr(aktspalte),10)+auffuellen(inttostr(aktzeile),10)); PossibleCubes.Add(auffuellen(inttostr(aktspalte),10)+auffuellen(inttostr(aktzeile) ,10)); counter:=counter+1; end; end;//von Yellow end;//aktspalte end;//aktzeile APA_Show_Process.ausgabe('Found '+inttostr(counter)+' parent cubes of required cubes...'); end;//of tomohnederivate1 Setcount:=1; NewSetsforEachIteration:=strtoint(trim(APA_Parameter.APA_Thomas_newsetsoneachiteration.t ext)); maxSets:=strtoint(trim(APA_Parameter.APA_Thomas_countofsets.text)); setlength(Sets,MaxSets); APA_Show_Process.ausgabe('Set of possible cubes of '+inttostr(counter)+' cubes is parent cubes union required cubes'); {1.c. Setze limits} spaceortimelimitreached:=false; timemax:=strtofloat(APA_Parameter.APA_Thomas_timemax.Text); spacemax:=strtofloat(APA_Parameter.APA_Thomas_spacemax.Text); {*********************************************************} {Ende 1. Vorbereitungen für die Iteration} {*********************************************************} {*********************************************************} {2. Iterationen der Sets} {*********************************************************} Setcounter:=-1; repeat; {*********************************************************} {2.1 Vorbereiten des Startsets für die Iteration} {*********************************************************} APA_Show_Process.ausgabe('Generate '+inttostr(Setcounter+2)+' Set'); APA_Show_Process.ausgabe('Add the best cube to the set as long as no limit reached '); if (Setcounter<=MerkMatCubes.Count-1)or(Setcounter=-1) then begin if Setcounter<>-1 then begin //Laden der MatCubes MatCubes.Clear; NewStringList:=MerkMatCubes.items[Setcounter]; MatCubes.addstrings(NewStringList); timemax:=strtofloat(APA_Parameter.APA_Thomas_timemax.Text); spacemax:=strtofloat(APA_Parameter.APA_Thomas_spacemax.Text); //Berechne Timelimits for zahler:=0 to MatCubes.Count-1 do begin aktspalte:=strtoint(copy(MatCubes[zahler],1,10)); aktzeile:=strtoint(copy(MatCubes[zahler],11,10)); //Feststellen aus wem der Würfel abgeleitet wird //? gibt es ein x? if (Userandomcosts1.Checked=false) then MinMatCosts:=deltaBftW(aktspalte,aktzeile,false) else MinMatCosts:=getbuild(-1,-1,aktspalte,aktzeile); parentzeile:=-1;parentspalte:=-1; - 329 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN for zahler2:=0 to zahler do begin if (isderivat(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2], 11,10)), aktspalte,aktzeile)=true)and(zahler<>zahler2) then begin; if (Userandomcosts1.Checked=false) then begin if (MinMatCosts> deltaVW(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2],11, 10)), aktspalte,aktzeile,false)) then begin; parentzeile:=strtoint(copy(MatCubes[zahler2],11,10)); parentspalte:=strtoint(copy(MatCubes[zahler2],1,10)); end; end//of keine Zufallskosten else begin//Wenn Zufallskosten if (MinMatCosts> getbuild(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2],11 ,10)), aktspalte,aktzeile)) then begin; parentzeile:=strtoint(copy(MatCubes[zahler2],11,10)); parentspalte:=strtoint(copy(MatCubes[zahler2],1,10)); end; end;//Ende Wenn Zufallskosten end; end; //Ende Feststellen des Würfels, welcher Materialisert werden soll und woher if (Userandomcosts1.Checked=false) then begin timemax:=timemax(strtofloat(APA_Parameter.APA_Thomas_timeio.text)*(gettupel(-1,1)+(2*gettupel(aktspalte,aktzeile)))+ +strtofloat(APA_Parameter.APA_Thomas_timecpu.text)*gettupel(aktspalte,aktzeile)*lo g2(gettupel(aktspalte,aktzeile))+ strtofloat(APA_Parameter.APA_Thomas_timestore.Text)*gettupel(aktspalte,aktzeile)); spacemax:=spacemax(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(aktspalte,aktzei le)); end else begin timemax:=timemax-getbuild(parentspalte,parentzeile,aktspalte,aktzeile);; spacemax:=spacemax(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(aktspalte,aktzei le)); end; end; end; {*********************************************************} - 330 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN {Ende 2.1 Vorbereiten des Startsets für die Iteration} {*********************************************************} {*********************************************************} {2.2. Beginn der Iteration des aktuellen Sets} {*********************************************************} spaceortimelimitreached:=false; while(spaceortimelimitreached=false)and(stop=false) do begin for zahler:=0 to PossibleCubes.Count-1 do begin aktspalte:=strtoint(copy(PossibleCubes[zahler],1,10)); aktzeile:=strtoint(copy(PossibleCubes[zahler],11,10)); SecondCubes.Clear; //Feststellen des Würfels, welcher Materialisert werden soll und woher bereitsmaterialisiert:=false; for zahler2:=0 to MatCubes.Count-1 do begin if PossibleCubes[zahler]=MatCubes[zahler2] then begin; bereitsmaterialisiert:=true; end; end; if bereitsmaterialisiert=false then begin //? gibt es ein x? kannabgeleitetwerden:=false; if (Userandomcosts1.Checked=false) then MinMatCosts:=deltaBftW(aktspalte,aktzeile,false) else MinMatCosts:=getbuild(-1,-1,aktspalte,aktzeile); parentzeile:=-1;parentspalte:=-1; {*********************************************************} {2.2.1. Feststellen des Cubes aus dem der Cube c (zahler) materialisiert wird: Dazu kontrolliere alle bereits materialisierten Cubes z (zahler2), ob c aus z abgeleitet werden kann} {*********************************************************} for zahler2:=0 to MatCubes.Count-1 do begin if isderivat(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2],1 1,10)), aktspalte,aktzeile)=true then begin; if (Userandomcosts1.Checked=false) then begin if (MinMatCosts> deltaVW(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2],11, 10)), aktspalte,aktzeile,false)) then begin; kannabgeleitetwerden:=true; parentzeile:=strtoint(copy(MatCubes[zahler2],11,10)); parentspalte:=strtoint(copy(MatCubes[zahler2],1,10)); MinMatCosts:=deltaVW(parentspalte,parentzeile,aktspalte,aktzeile,false); end; end//of keine Zufallskosten else begin//Wenn Zufallskosten if (MinMatCosts> getbuild(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2],11 ,10)), aktspalte,aktzeile)) then begin; kannabgeleitetwerden:=true; parentzeile:=strtoint(copy(MatCubes[zahler2],11,10)); - 331 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN parentspalte:=strtoint(copy(MatCubes[zahler2],1,10)); MinMatCosts:=getbuild(parentspalte,parentzeile,aktspalte,aktzeile); end; end;//Ende Wenn Zufallskosten end;//isderivat end;//for zahler2 //Ende Feststellen des Würfels, welcher Materialisert werden soll und woher {*********************************************************} {Ende 2.2.1. Feststellen des Cubes aus dem der Cube c (zahler) materialisiert wird: Dazu kontrolliere alle bereits materialisierten Cubes z (zahler2), ob c aus z abgeleitet werden kann} {*********************************************************} {*********************************************************} {2.2.2. Festellen der Derivate und der Abfragekosten der Summe der Derivate für den Cube c} {*********************************************************} Summederiv:=0;//Summe der Werte der Derivate for zahler3:=0 to PossibleCubes.Count-1 do begin derivspalte:=strtoint(copy(PossibleCubes[zahler3],1,10)); derivzeile:=strtoint(copy(PossibleCubes[zahler3],11,10)); faktor:=APA[derivspalte,derivzeile].gewicht; if APA[derivspalte,derivzeile].interessant=true then begin if isderivat(aktspalte,aktzeile,derivspalte,derivzeile)=true then //dies ist der Würfel u begin; //? kann derivat abgeleitet werden? kannderivatabgeleitetwerden:=false; if (Userandomcosts1.Checked=false) then begin if parentspalte<>-1 then MinQueryCosts:=deltaVW(parentspalte,parentzeile,aktspalte,aktzeile,false) else MinQueryCosts:=deltaBftW(aktspalte,aktzeile,false); end else MinQueryCosts:=getbuild(parentspalte,parentzeile,aktspalte,aktzeile); parentderivatspalte:=parentspalte;parentderivatzeile:=parentzeile; for zahler2:=0 to MatCubes.Count-1 do begin if isderivat(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2],1 1,10)), derivspalte,derivzeile)=true then begin; if (Userandomcosts1.Checked=false) then begin if (MinQueryCosts> deltaVW(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2],11, 10)), derivspalte,derivzeile,true)) then begin; kannderivatabgeleitetwerden:=true; parentderivatzeile:=strtoint(copy(MatCubes[zahler2],11,10)); parentderivatspalte:=strtoint(copy(MatCubes[zahler2],1,10)); MinQueryCosts:=deltaVW(parentderivatspalte,parentderivatzeile,derivspalte,derivzei le,true); end; end//of keine Zufallskosten else begin//Wenn Zufallskosten - 332 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if (MinQueryCosts> getquery(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2],11 ,10)), derivspalte,derivzeile)) then begin; kannderivatabgeleitetwerden:=true; parentderivatzeile:=strtoint(copy(MatCubes[zahler2],11,10)); parentderivatspalte:=strtoint(copy(MatCubes[zahler2],1,10)); MinQueryCosts:=getquery(parentderivatspalte,parentderivatzeile,derivspalte,derivze ile); end; end;//Ende Wenn Zufallskosten end; end; {*********************************************************} {2.2.2.1. Berechnen der Verbesserung der Abfragekosten durch das Materialisieren von c} {*********************************************************} if kannabgeleitetwerden=false then begin if kannderivatabgeleitetwerden=false then begin if (Userandomcosts1.Checked=false) then begin Summederiv:=Summederiv+ max(0,(deltaBFTw(derivspalte,derivzeile,true)Deltavw(aktspalte,aktzeile,derivspalte,derivzeile,true))) *faktor; end else begin Summederiv:=Summederiv+ max(0,(getquery(-1,-1,derivspalte,derivzeile)getquery(aktspalte,aktzeile,derivspalte,derivzeile))) *faktor; end; end else begin if (Userandomcosts1.Checked=false) then begin Summederiv:=Summederiv+max(0, (deltaVW(parentderivatspalte,parentderivatzeile,derivspalte,derivzeile,true)Deltavw(aktspalte,aktzeile,derivspalte,derivzeile,true)) *faktor); end else begin Summederiv:=Summederiv+max(0, (getquery(parentderivatspalte,parentderivatzeile,derivspalte,derivzeile)getquery(aktspalte,aktzeile,derivspalte,derivzeile)) *faktor); end; end; end else begin //kannabgeleitet werden =true if (Userandomcosts1.Checked=false) then begin Summederiv:=Summederiv+max(0, (deltaVW(parentderivatspalte,parentderivatzeile,derivspalte,derivzeile,true)Deltavw(aktspalte,aktzeile,derivspalte,derivzeile,true)) *faktor); end else begin Summederiv:=Summederiv+max(0, (getquery(parentderivatspalte,parentderivatzeile,derivspalte,derivzeile)- - 333 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN getquery(aktspalte,aktzeile,derivspalte,derivzeile)) *faktor); end; end; {*********************************************************} {Ende 2.2.2.1. Berechnen der Verbesserung der Abfragekosten durch das Materialisieren von c} {*********************************************************} end;//of isderivat end;//of ist interessant end;//of zahler3 {*********************************************************} {Ende 2.2.2. Festellen der Derivate und der Abfragekosten der Summe der Derivate für den Cube c} {*********************************************************} {*********************************************************} {2.2.3. Berechnen der Verbesserung der Gesamtkosten durch das Materialisieren von c} {*********************************************************} if kannabgeleitetwerden=false then begin if (Userandomcosts1.Checked=false) then begin //Eintragen des Wertes APA[aktspalte,aktzeile].value:=SummederivDeltaBftw(aktspalte,aktzeile,false); APA[aktspalte,aktzeile].value2:=DeltaBftw(aktspalte,aktzeile,false); end else begin //Eintragen des Wertes APA[aktspalte,aktzeile].value:=Summederiv-getbuild(-1,1,aktspalte,aktzeile); APA[aktspalte,aktzeile].value2:=getbuild(-1,-1,aktspalte,aktzeile); end; end else begin if (Userandomcosts1.Checked=false) then begin APA[aktspalte,aktzeile].value:=SummederivDeltaVW(parentspalte,parentzeile,aktspalte,aktzeile,false); APA[aktspalte,aktzeile].value2:=DeltaVW(parentspalte,parentzeile,aktspalte,aktzeil e,false); end else begin APA[aktspalte,aktzeile].value:=Summederivgetbuild(parentspalte,parentzeile,aktspalte,aktzeile); APA[aktspalte,aktzeile].value2:=getbuild(parentspalte,parentzeile,aktspalte,aktzei le); end; end; end;//of bereitsmateralisiert {*********************************************************} {Ende 2.2.3. Berechnen der Verbesserung der Gesamtkosten durch das Materialisieren von c} {*********************************************************} end;//of zahler {*********************************************************} {2.2.4 Gibt es einen Cube c mit Positivem dK(c) (Kostenersparnis) und innerhalb der Limits: True- dann setze den c mit Max(dK(c)) dem aktuellen Set zu; False - dann schließe das Set ab} {*********************************************************} maxvalue:=0; nocubefound:=true; for zahler:=0 to PossibleCubes.Count-1 do begin listbox1.items.Add('Würfel '+PossibleCubes[zahler]); - 334 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN listbox1.items.add(floattostr(APA[strtoint(copy(PossibleCubes[zahler],1,10)),strto int(copy(PossibleCubes[zahler],11,10))].value)); {if APA[strtoint(copy(PossibleCubes[zahler],1,10)), strtoint(copy(PossibleCubes[zahler],11,10))].value>maxvalue then begin} aktspalte:=strtoint(copy(PossibleCubes[zahler],1,10)); aktzeile:=strtoint(copy(PossibleCubes[zahler],11,10)); Application.ProcessMessages; //Feststellen, ob bereits materialisiert bereitsmaterialisiert:=false; for zahler2:=0 to MatCubes.Count-1 do begin if PossibleCubes[zahler]=MatCubes[zahler2] then begin; bereitsmaterialisiert:=true; listbox1.Items.Add('Schon materalisiert'); end; end; //Feststellen, ob in Limits überschritten alttimemax:=timemax;altspacemax:=spacemax; listbox1.items.Add('Try Cube '+auffuellen(inttostr(aktspalte),10)+auffuellen(inttostr(aktzeile),10)); listbox1.items.add('Value: '+floattostr(APA[aktspalte,aktzeile].value)); if (Userandomcosts1.Checked=false) then begin timemax:=timemax(strtofloat(APA_Parameter.APA_Thomas_timeio.text)*(gettupel(-1,1)+(2*gettupel(aktspalte,aktzeile)))+ +strtofloat(APA_Parameter.APA_Thomas_timecpu.text)*gettupel(aktspalte,aktzeile)*lo g2(gettupel(aktspalte,aktzeile))+ strtofloat(APA_Parameter.APA_Thomas_timestore.Text)*gettupel(aktspalte,aktzeile)); spacemax:=spacemax(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(aktspalte,aktzei le)); end else begin timemax:=timemax-APA[aktspalte,aktzeile].value2; spacemax:=spacemax(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(aktspalte,aktzei le)); end; listbox1.items.add('timemax('+floattostr(timemax)+')'); listbox1.items.add('spacemax('+floattostr(spacemax)+')'); if (timemax<0)or(spacemax<0) then begin bereitsmaterialisiert:=true;//Stelle auf bereitsmaterialisert end; timemax:=alttimemax;spacemax:=altspacemax;//Stelle Limits wieder zurück if (bereitsmaterialisiert=false)and(APA[strtoint(copy(PossibleCubes[zahler],1,10)), strtoint(copy(PossibleCubes[zahler],11,10))].value>0) then begin //Erzeuge Liste der Würfel,welche in die Limits passen SecondCubes.add(PossibleCubes[zahler]); end; if (bereitsmaterialisiert=false) then begin; if (APA[strtoint(copy(PossibleCubes[zahler],1,10)), strtoint(copy(PossibleCubes[zahler],11,10))].value>maxvalue) and(APA[strtoint(copy(PossibleCubes[zahler],1,10)), strtoint(copy(PossibleCubes[zahler],11,10))].value>0) then begin maxvalue:=APA[strtoint(copy(PossibleCubes[zahler],1,10)), - 335 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN strtoint(copy(PossibleCubes[zahler],11,10))].value; merkspalte:=strtoint(copy(PossibleCubes[zahler],1,10));//Merken der Spalte des neuen Cubes merkzeile:=strtoint(copy(PossibleCubes[zahler],11,10));//Merken der Zeile des neuen Cubes nocubefound:=false; listbox1.Items.Add('Maxvalue:'+floattostr(maxvalue)); end; end; {end;} end;//of zahler if nocubefound=false then begin listbox1.items.Add('Materialize Cube '+auffuellen(inttostr(merkspalte),10)+auffuellen(inttostr(merkzeile),10)); listbox1.items.add('Value: '+floattostr(APA[merkspalte,merkzeile].value)); listbox1.items.add('================'); //Materialisiere den besten Cube MatCubes.Add(auffuellen(inttostr(merkspalte),10)+auffuellen(inttostr(merkzeile),10 )); foundbestcube:=true; //Timemax und spacemax berechnen if (Userandomcosts1.Checked=false) then begin timemax:=timemax(strtofloat(APA_Parameter.APA_Thomas_timeio.text)*(gettupel(-1,1)+(2*gettupel(merkspalte,merkzeile)))+ +strtofloat(APA_Parameter.APA_Thomas_timecpu.text)*gettupel(merkspalte,merkzeile)* log2(gettupel(merkspalte,merkzeile))+ strtofloat(APA_Parameter.APA_Thomas_timestore.Text)*gettupel(merkspalte,merkzeile) ); spacemax:=spacemax(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(merkspalte,merkz eile)); end else begin timemax:=timemax-APA[merkspalte,merkzeile].value2; spacemax:=spacemax(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(merkspalte,merkz eile)); end; //Entferne aktuell besten Würfel aus der Liste Secondcubes zahlersecond2:=0; repeat; if SecondCubes.count>0 then begin if (SecondCubes[zahlersecond2]=auffuellen(inttostr(merkspalte),10)+auffuellen(inttost r(merkzeile),10)) then begin; SecondCubes.Delete(zahlersecond2); zahlersecond2:=SecondCubes.count; end; end; zahlersecond2:=zahlersecond2+1; until (zahlersecond2>SecondCubes.count-1); {*********************************************************} {2.2.4.1 Gibt es noch NewSetsForEachIteration Cubes, welche das Limit erfüllen dann wähle die NewSetsForEachIteration besten Cubes und eröffne neue Sets solange bis MaxSets erreicht.} {*********************************************************} //Erzeuge die neuen Wege, welche noch berechnet werden sollen - 336 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN listbox1.items.Add('Try adding '+inttostr(NewSetsforEachIteration)+' new Sets'); for zahlersecond2:=1 to NewSetsforEachIteration do begin merksecondcosts:=0; merkepossecond:=-1; merkzeilesecond:=-1;merkspaltesecond:=-1; for zahlersecond1:=0 to SecondCubes.count-1 do begin; //Finde zweitbesten Cube if (merkepossecond=1)or(merksecondcosts<APA[strtoint(copy(SecondCubes[zahlersecond1],1,10)), strtoint(copy(SecondCubes[zahlersecond1],11,10))].value) then begin merksecondcosts:=APA[strtoint(copy(SecondCubes[zahlersecond1],1,10)), strtoint(copy(SecondCubes[zahlersecond1],11,10))].value; merkspaltesecond:=strtoint(copy(SecondCubes[zahlersecond1],1,10)); merkzeilesecond:=strtoint(copy(SecondCubes[zahlersecond1],11,10)); merkepossecond:=zahlersecond1; end; end;//zahlersecond1 if (merksecondcosts>0) then begin //Neuen Weg erzeugen if (Setcount<maxSets) then begin Setcount:=Setcount+1; SecondMatCubes.Clear; SecondMatCubes.AddStrings(MatCubes); if (SecondMatCubes.Count>0) then begin SecondMatCubes[SecondMatCubes.Count-1]:= auffuellen(inttostr(merkspaltesecond),10)+auffuellen(inttostr(merkzeilesecond),10) ; listbox1.items.Add('Found '+inttostr(zahlersecond2+1)+' best Cube: '+SecondMatCubes[SecondMatCubes.Count-1]); if merkepossecond<>-1 then SecondCubes.Delete(merkepossecond); NewStringList:=TStringList.Create; NewStringList.Clear; NewStringList.AddStrings(SecondMatCubes); MerkMatCubes.Add(NewStringList); end//Ende if (SecondMatCubes.Count>0 else listbox1.items.Add('Did not found '+inttostr(zahlersecond2+2)+' best Cube'); end;//Ende if (Setcount<maxSets-1) end;//Ende if (merksecondcosts>0) end;//zahlersecond2 {*********************************************************} {Ende 2.2.4.1 Gibt es noch NewSetsForEachIteration Cubes, welche das Limit erfüllen dann wähle die NewSetsForEachIteration besten Cubes und eröffne neue Sets solange bis MaxSets erreicht.} {*********************************************************} end else spaceortimelimitreached:=true; {*********************************************************} {Ende 2.2.4 Gibt es einen Cube c mit Positivem dK(c) (Kostenersparnis) und innerhalb der Limits: True- dann setze den c mit Max(dK(c)) dem aktuellen Set zu; False - dann schließe das Set ab} {*********************************************************} end;//of spaceortimelimitreached {*********************************************************} {Ende 2.2. Beginn der Iteration des aktuellen Sets} {*********************************************************} {Speichere die MatCubes in der Liste} if MatCubes.count>0 then begin - 337 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN NewStringLIst:=TStringList.Create; NewStringList.Clear; NewStringList.AddStrings(MatCubes); NewStringList:=getrightOrdertom(NewStringList); MerkMatCubesfertig.Add(NewStringList); APA_Show_Process.ausgabe(inttostr(Setcounter+2)+' Set found contain cubes '); for counter:=0 to MatCubes.Count-1 do begin APA_Show_Process.ausgabe('Cube No '+inttostr(counter)+' ('+inttostr(strtoint(copy(MatCubes[counter],1,10)))+':'+ inttostr(strtoint(copy(MatCubes[counter],11,10)))+')'); end; end; end;//of MerkMatCubes Setcounter:=Setcounter+1; until (Setcounter>=maxSets-1)or(Setcounter>Setcount)or(stop=true);//of wayszahler {*********************************************************} {Ende 2. Iteration der Sets} {*********************************************************} APA_Show_Process.ausgabe(inttostr(Setcounter+1)+' Sets are build '); APA_Show_Process.ausgabe('Now select the set with lowest costs'); {*********************************************************} {3. Berechne die Gesamtkosten für jedes Set} {*********************************************************} {Feststellen des besten Weges} {*********************} MyReqCubes:=TStringList.Create; MyMatCubes:=TStringList.Create; try //Lege alle nicht redundaten Cubes an, und vergib eine Nummer for zeile:=0 to anzzeilen-1 do begin for spalte:=0 to anzspalten-1 do begin if APA[spalte,zeile].farbe=clYellow then begin if APA[spalte,zeile].interessant=true then begin //Speichere Required Cubes //Merke dir die Required Cubes MyReqCubes.Add(auffuellen(inttostr(spalte),10)+auffuellen(inttostr(zeile),10)); end; end; end;//end of spalte end;//end of zeilen merkcosts:=-1;merkpos:=-1; for zahler:=0 to MerkmatCubesfertig.Count-1 do begin NewStringList:=MerkmatCubesfertig.items[zahler]; MyMatCubes.Clear; MyMatCubes.AddStrings(NewStringList); merkcosts2:=berechneKostenGesamt(MyMatCubes,MyReqCubes,true); Listbox1.Items.Add(inttostr(zahler)+' Kosten: '+floattostr(merkcosts2)); listbox1.Items.Add('******************'); APA_Show_Process.ausgabe('Set '+inttostr(zahler+1)+' has costs of '+floattostr(merkcosts2)); - 338 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if (merkcosts=-1) or (merkcosts>merkcosts2) then begin Listbox1.items.add('Selected'); merkpos:=zahler; merkcosts:=merkcosts2; end; end;//Ende zahler if MerkmatCubesfertig.count=0 then showmessage('The limit is to low. It is not possible to materialize a cube.'); finally MyReqCubes.Free; MyMatCubes.Free; end; {*********************************************************} {Ende 3 Berechne die Gesamtkosten für jedes Set} {*********************************************************} {*********************************************************} {4. Materialisiere jenes Set mit den minimalen Kosten} {*********************************************************} if (merkpos<>-1)and(stop=false) then begin APA_Show_Process.ausgabe(inttostr(merkpos+1)+' sets minimizes the costs'); NewStringList:=MerkMatCubesfertig.items[merkpos]; for zahler:=0 to NewStringList.Count-1 do begin matcount:=matcount+1; APA[strtoint(copy(NewStringList[zahler],1,10)),strtoint(copy(NewStringList[zahler] ,11,10))].materalisieren:=true; APA[strtoint(copy(NewStringList[zahler],1,10)),strtoint(copy(NewStringList[zahler] ,11,10))].matcount:=matcount; end; end; {*********************************************************} {Ende 4 Materialisiere jenes Set mit den minimalen Kosten} {*********************************************************} finally Try //Freigeben der Daten for zahler:=0 to MerkMatCubes.Count-1 do begin NewStringList:=MerkMatCubes[zahler]; NewStringList.Free; end; for zahler:=0 to MerkMatCubesfertig.Count-1 do begin NewStringList:=MerkMatCubesfertig[zahler]; NewStringList.Free; end; MerkMatCubes.Free; MerkMatCubesfertig.Free; MatCubes.Free; PossibleCubes.Free; except end; end; finally APA_Grid.Enabled:=true; if APA_Show_Process.Visible=true then APA_Show_Process.ButtonCancel.Caption:='Close'; CloseFile(fKosten); materialzeichnen; APAGrid.Repaint; showmessage('Ready'); - 339 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; end; procedure TAPA_Grid.APAGridClick(Sender: TObject); var counter:longint; var NewItem: TMenuItem; begin if (zellespalte<>-1) and(zellezeile<>-1) then begin klickspalte:=-1; klickzeile:=-1; if (Remove_Redundancy.Checked=false)or ((Remove_Redundancy.Checked=true)and(APA[zellespalte,zellezeile].farbe=clYellow)) then begin; langbezpopup.Items.Clear; for counter:=0 to anzd-1 do begin; NewItem:=TMenuItem.Create(self); NewItem.Caption:=APA[zellespalte,zellezeile].langbez[counter]; langbezpopup.Items.Add(NewItem); end; langbezpopup.Popup(Mouse.CursorPos.x,Mouse.CursorPos.Y); end; end; end; procedure TAPA_Grid.GridpopupPopup(Sender: TObject); var g:longint; begin if ((zellespalte<>-1)and(zellezeile<>-1)) then begin; For g:=0 to Gridpopup.Items.Count-1 do Gridpopup.Items[g].Visible:=true; if Showpossiblecubes2.Visible=false then begin Showpossiblecubes1.Visible:=false; Removepossiblecubes1.Visible:=true; end else begin Showpossiblecubes1.Visible:=true; Removepossiblecubes1.Visible:=false; end; if Showdeterministicsolution2.Visible=false then begin Showdeterministicsolution1.Visible:=false; Removedeterministicsolution1.Visible:=true; end else begin Showdeterministicsolution1.Visible:=true; Removedeterministicsolution1.Visible:=false; end; if ((APA[zellespalte,zellezeile].farbe=clYellow)) then begin; NoCubeselected1.Visible:=false; Redundantcube1.Visible:=false; Showderivatives1.Visible:=true; Showredundancyfreecube1.Visible:=false; n3.Visible:=false; if APA[zellespalte,zellezeile].interessant=true then begin Required1.Visible:=false;Notrequired1.Visible:=true; end else begin Required1.Visible:=true;Notrequired1.Visible:=false; //Festlegen der Required Spalten for g:=0 to Required1.Count-1 do begin if g<APA_Parameter.APA_Degrees.Count then begin - 340 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Required1.Items[g].Visible:=true; Required1.Items[g].Caption:=APA_Parameter.APA_Degrees.Items[g]; end else begin Required1.Items[g].Visible:=false; end; end; end; if APA[zellespalte,zellezeile].materalisieren=true then begin Materialize1.Visible:=false;Dematerialize1.Visible:=true; end else begin Materialize1.Visible:=true;Dematerialize1.Visible:=false; end; end else begin NoCubeselected1.Visible:=false; Redundantcube1.Visible:=true;n3.Visible:=true; Required1.Visible:=false;Notrequired1.Visible:=false; Materialize1.Visible:=false; Dematerialize1.Visible:=false; Showderivatives1.Visible:=false; Showredundancyfreecube1.Visible:=true; end; end else begin For g:=0 to Gridpopup.Items.Count-1 do Gridpopup.Items[g].Visible:=false; NoCubeselected1.Visible:=true; end; end; procedure TAPA_Grid.Removematerializedcubes1Click(Sender: TObject); begin Button_remove_materialized_cubes.Click; end; procedure TAPA_Grid.Removederivatives1Click(Sender: TObject); begin Button_remove_derivatives.Click; end; procedure TAPA_Grid.Removerequiredcubes1Click(Sender: TObject); begin Button_remove_required_cubes.Click; end; procedure TAPA_Grid.Removeredundancy1Click(Sender: TObject); begin if Remove_Redundancy.Checked=false then Remove_Redundancy.Checked:=true else Remove_Redundancy.checked:=false; Remove_RedundancyClick(self); end; procedure TAPA_Grid.Button3Click(Sender: TObject); var zeile,spalte, aktzeile,aktspalte:longint; var x,aktpos,maxpos,anzcube,reqcube, anzderivative,pos,cubepos:longint; var zahler, zahler2:longint; var istok:boolean; var ende:boolean; var kostenmerk,Kostenmerkmin:Extended; var neustarten, Alwaysspacemaxreached:boolean; var Countliste:array of Longint; var GeneriereListe,GeneriereReqListe:TStringList; begin assignfile(fMatCubes,'C:\APADIR\DATA\MatCubes.dat'); assignfile(fReqCubes,'C:\APADIR\DATA\ReqCubes.dat'); assignfile(fMerkkosten,'C:\APADIR\DATA\Merkkosten.dat'); assignfile(fCounter,'C:\APADIR\DATA\Counter.dat'); assignfile(fCountermerk,'C:\APADIR\DATA\Countermerk.dat'); - 341 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN assignfile(fCubes,'C:\APADIR\DATA\Cubes.dat'); assignfile(fKosten,'C:\APADIR\DATA\Kosten.dat'); {$i-} reset(fKosten); {$i+} if ioresult<>0 then begin; showmessage('cost database error ');exit;end; assignfile(fCubes,'C:\APADIR\DATA\Cubes.dat'); Removedeterministicsolution1Click(self); mustsave:=true; APA_Show_Process.show; Application.ProcessMessages; APA_Grid.Enabled:=false; GeneriereReqListe:=TStringList.Create(); try {Rechne alle möglichen Kombinationen durch, welche im Bereich des Maximum sind} // Mache das über eine Temporäre Datei auf der Festplatte // ist zwar langsamer, aber bei großen Rechnungen hängt sich der Rechner nicht auf. with APA_Application do begin APA_Dialog.APA_Text.Caption:='Do you want to restart?'; if permutation=true then begin if APA_Dialog.showmodal=mryes then neustarten:=true else neustarten:=false; end else neustarten:=true; {1. Vorbereitungen für die Permutation} aktpos:=0;permutation:=true; if neustarten=true then begin; alwaysspacemaxreached:=false; {$i-} rewrite(fCubes); {$i+} if ioresult<>0 then begin; showmessage('Cubes database error ');exit;end; {$i-} rewrite(fReqCubes); {$i+} if ioresult<>0 then begin; showmessage('ReqCubes database error ');exit;end; {$i-} rewrite(fCounter); {$i+} if ioresult<>0 then begin; showmessage('Counter database error ');exit;end; {$i-} rewrite(fMerkkosten); {$i+} if ioresult<>0 then begin; showmessage('ReqCubes database error ');exit;end; try seek(fMerkkosten,0); vMerkkosten.Lfnr:=0; vMerkkosten.Kosten:=0; write(fMerkkosten,vMerkkosten); APA_Show_Process.ausgabe('Search for possible cubes...'); anzcube:=0; reqcube:=0; //Lege alle nicht redundaten Cubes an, und vergib eine Nummer for zeile:=0 to anzzeilen-1 do begin for spalte:=0 to anzspalten-1 do begin if APA[spalte,zeile].farbe=clYellow then begin if APA[spalte,zeile].interessant=True then begin anzcube:=anzcube+1; seek(fCubes,anzcube-1); - 342 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN vCubes.Lfnr:=anzcube; vCubes.Spalte:=spalte; vCubes.Zeile:=zeile; vCubes.Required:=1; write(fCubes,vCubes); APA_Show_Process.ausgabe('Add Cube: ('+inttostr(spalte)+':'+inttostr(zeile)+')'); end else begin anzderivative:=0; for aktzeile:=0 to anzzeilen-1 do begin for aktspalte:=0 to anzspalten-1 do begin if (APA[aktspalte,aktzeile].farbe=clYellow)and (APA[aktspalte,aktzeile].interessant=true) then begin if isderivat(spalte,zeile,aktspalte,aktzeile) then begin anzderivative:=anzderivative+1; end; end; end; end; if anzderivative>0 then begin anzcube:=anzcube+1; seek(fCubes,anzcube-1); vCubes.Lfnr:=anzcube; vCubes.Spalte:=spalte; vCubes.Zeile:=zeile; vCubes.Required:=1; write(fCubes,vCubes); APA_Show_Process.ausgabe('Add Cube: ('+inttostr(spalte)+':'+inttostr(zeile)+')'); end; end; if APA[spalte,zeile].interessant=true then begin //Speichere Required Cubes //Merke dir die Required Cubes reqcube:=reqcube+1; seek(fReqCubes,reqcube-1); vReqCubes.Lfnr:=reqcube; vReqCubes.Spalte:=spalte; vReqCubes.Zeile:=zeile; write(fReqCubes,vReqCubes); end; end; end;//end of spalte end;//end of zeilen finally CloseFile(fCubes); CloseFile(fReqCubes); CloseFile(fCounter); CloseFile(fMerkkosten); end; end//von neustarten else begin alwaysspacemaxreached:=false; end; {$i-} reset(fCubes); {$i+} if ioresult<>0 then begin; showmessage('Cubes database error ');exit;end; try anzcube:=filesize(fCubes); Setlength(Countliste,anzcube); MemoryCubes:=nil; - 343 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN setlength(MemoryCubes,anzcube); pos:=0; repeat; if (filesize(fCubes)>0) then begin seek(fCubes,pos); read(fCubes,vCubes); x:=round(vCubes.lfnr)-1; Memorycubes[x].nr:=round(vCubes.lfnr); Memorycubes[x].spalte:=vCubes.Spalte; Memorycubes[x].zeile:=vCubes.Zeile; end; pos:=pos+1; until pos>=filesize(fCubes); {$i-} reset(fReqCubes); {$i+} if ioresult<>0 then begin; showmessage('ReqCubes database error ');exit;end; try MemoryreqCubes:=nil; setlength(MemoryReqCubes,filesize(fReqCubes)); MemoryReqCubescount:=filesize(fReqCubes); pos:=0; repeat; if (filesize(fReqCubes)>0) then begin seek(fReqCubes,pos); read(fReqCubes,vReqCubes); x:=round(vReqCubes.Lfnr)-1; MemoryReqCubes[x].spalte:=vReqCubes.Spalte; MemoryReqCubes[x].zeile:=vReqCubes.Zeile; end; pos:=pos+1; until (pos>=filesize(fReqCubes)); for x:=0 to MemoryReqCubescount-1 do begin GeneriereReqListe.Add(auffuellen(inttostr(MemoryReqCubes[x].spalte),10)+auffuellen (inttostr(MemoryReqCubes[x].zeile),10)); end; APA_Show_Process.ausgabe(inttostr(anzcube)+' Cubes found'); finally CloseFile(fReqCubes); end; finally CloseFile(fCubes); end; Countliste:=nil; Setlength(Countliste,anzcube+1); MerkeListe:=nil; SetLength(Merkeliste,anzcube); if neustarten=true then begin //Zuerst alle 0 setzten for x:=0 to anzcube-1 do Countliste[x]:=0; maxpos:=0; Countliste[0]:=1; cubepos:=Countliste[0]; kostenmerkmin:=0; end// of neustarten else begin for x:=0 to anzcube-1 do Countliste[x]:=0; - 344 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN //Laden der Cubes {$i-} reset(fCounter); {$i+} if ioresult<>0 then begin; showmessage('ReqCubes database error ');exit;end; try maxpos:=-1;pos:=0; repeat; if (filesize(fCounter)>0) then begin seek(fCounter,pos); read(fCounter,vCounter); if vcounter.Lfnr<>-1 then begin maxpos:=maxpos+1; x:=round(vCounter.Lfnr); Countliste[x]:=round(vCounter.nr); if countliste[x]=0 then countliste[x]:=1; end; end else begin //Feststellen von alwaysspacemaxreached if vcounter.nr=1 then alwaysspacemaxreached:=true else alwaysspacemaxreached:=false; end; pos:=pos+1; until pos>=filesize(fCounter); cubepos:=Countliste[0] finally CloseFile(fCounter); end; {$i-} reset(fMerkkosten); {$i+} if ioresult<>0 then begin; showmessage('Merkkosten database error ');exit;end; try seek(fMerkkosten,0);read(fMerkkosten,vMerkkosten); kostenmerkmin:=vMerkkosten.Kosten; finally CloseFile(fMerkkosten); end; end; {Ende 1. Vorbereitungen für die Permutation} if anzcube>0 then begin //Kombinatorik if neustarten=true then begin Countliste[0]:=1; aktpos:=0;maxpos:=0; end//neustarten else APA_Show_Process.ausgabe('*** Start Restart ***'); {2. Beginn der Permutationsschleife} ende:=false; while (ende=false)and (stop=false) do begin repeat; Application.processmessages; if APA_Show_Process.GroupBox1.tag=1 then begin APA_Show_Process.GroupBox1.tag:=0; //Geheimticker for x:=0 to maxpos do begin - 345 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN countliste[x]:=1; end; maxpos:=maxpos+1; countliste[maxpos]:=1; end; if APA_Show_Process.GroupBox1.tag=-1 then begin APA_Show_Process.GroupBox1.tag:=0; //Geheimticker countliste[maxpos]:=0; maxpos:=maxpos-1; for x:=0 to maxpos do begin countliste[x]:=1; end; end; //Hüpfe nach links, wenn möglich // ausser bei Cube max dann nach rechts if cubepos>anzcube then begin //Hüpfe nach rechts //Speichere aktuelle Pos cubepos:=1; Countliste[aktpos]:=cubepos; aktpos:=aktpos+1; if aktpos>maxpos then maxpos:=aktpos; if aktpos<anzcube then begin repeat; if cubepos>anzcube then begin cubepos:=1; Countliste[aktpos]:=cubepos; aktpos:=aktpos+1; if aktpos>maxpos then maxpos:=aktpos; end; if Countliste[aktpos]=0 then begin //Neue Zählung if (alwaysspacemaxreached=true)and(Alwaysspacemaxbeachten1.Checked=true) then ende:=true; cubepos:=1; Countliste[aktpos]:=cubepos; alwaysspacemaxreached:=true; end else begin //Springe auf gespeicherte Position Countliste[aktpos]:=Countliste[aktpos]+1; cubepos:=Countliste[aktpos]; end; until (cubepos<=anzcube); if (cubepos<>anzcube) then begin; //Setze den Zähler ganz links auf 0 cubepos:=1;aktpos:=0;Countliste[aktpos]:=cubepos; end; //Er springt wieder in die Startzeile zurück //Alle 50000 Einträge lösche die Anzeigeliste um Speicher zu schonen if APA_Show_Process.APA_Protocoll.Items.Count>50000 then APA_Show_Process.APA_Protocoll.Items.Clear; if stop=true then stop:=false; //Hier soll nicht abgebrochen werden end//von <anzwurfel else ende:=true; end else begin //Hüpfe ganz nach Links aktpos:=0; istok:=true; //Feststellen,ob nichts gleich for zahler:=0 to maxpos do begin - 346 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN //Es wird von der Position bis zum Ende kontrolliert //da die ersten Positionen schon verglichen wurden for zahler2:=zahler to maxpos do begin if ((zahler2<>zahler)and (Countliste[zahler2]=Countliste[zahler])) then istok:=false; end; end; if istok=true then begin //Speichern //Stelle fest ob spacemax erfüllt. //Wenn ja berechne Kosten spaceleftfirstcubes:=strtofloat(APA_Parameter.APA_Thomas_spacemax.text); spaceleft:=strtofloat(APA_Parameter.APA_Thomas_spacemax.text); for x:=0 to maxpos do begin APA_Show_Process.ausgabe(' '+inttostr(countliste[x])); if countliste[x]>0 then begin spaceleft:=spaceleft(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(MemoryCubes[Coun tliste[x]-1].spalte,MemoryCubes[Countliste[x]-1].zeile)); if x<>0 then begin //Rechne den Speicherplatz ohne die letzte Ebene aus. //Wenn dieser überschritten kann der durchlauf der letzten Ebene gestoppt werden spaceleftfirstcubes:=spaceleftfirstcubes(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(MemoryCubes[Coun tliste[x]-1].spalte,MemoryCubes[Countliste[x]-1].zeile)); end; end; end;//Ende von x //Wenn überschritten setzt den Zähler der ersten auf max if (spaceleftfirstcubes<0)and(Alwaysspacemaxbeachten1.Checked=true) then begin if aktpos=0 then Countliste[0]:=anzcube-1; APA_Show_Process.ausgabe(' >>> Jump to next because spaceleft is '+floattostr(spaceleftfirstcubes)); end; //Speichern APA_Show_Process.ausgabe('Adding Seq '); if spaceleft>0 then begin GeneriereListe:=TStringList.create(); try for x:=0 to maxpos do begin if countliste[x]>0 then begin GeneriereListe.Add(auffuellen(inttostr(MemoryCubes[countliste[x]1].spalte),10)+auffuellen(inttostr(MemoryCubes[countliste[x]-1].zeile),10)); end; end; kostenmerk:=berechneKostenGesamt(GeneriereListe,GeneriereReqListe,true); finally GeneriereListe.Free; end; if kostenmerk>0 then begin - 347 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if(kostenmerkmin=0)or(kostenmerkmin>kostenmerk) then begin; Alwaysspacemaxreached:=false; {$i-} reset(fMerkkosten); {$i+} if ioresult<>0 then begin; showmessage('Merkkosten database error ');exit;end; try APA_Show_Process.ausgabe('*****************'); APA_Show_Process.ausgabe('Trage ein das Minimum '+floattostr(kostenmerk)); vMerkkosten.Kosten:=kostenmerk; vMerkkosten.Lfnr:=0; seek(fMerkkosten,0);write(fMerkkosten,vMerkkosten); kostenmerkmin:=kostenmerk; seek(fMerkkosten,1); vMerkkosten.Lfnr:=1; vMerkkosten.Kosten:=spaceleft; write(fMerkkosten,vMerkkosten); seek(fMerkkosten,2); vMerkkosten.Lfnr:=2; vMerkkosten.Kosten:=timeleft; write(fMerkkosten,vMerkkosten); finally CloseFile(fMerkkosten); end; //Speichere Counttable assignfile(fCountermerk,'c:\APADIR\DATA\Countermerk.dat'); {$i-} rewrite(fCountermerk); {$i+} if ioresult<>0 then showmessage('Can not open File Countermerk.dat'); try for x:=0 to maxpos do begin seek(fCountermerk,filesize(fCountermerk)); vCountermerk.Lfnr:=x; vCountermerk.Nr:=Countliste[x]; write(fCountermerk,vCountermerk); APA_Show_Process.ausgabe('Save Cube Pos:'+floattostr(vCountermerk.Lfnr)+' Nr:'+floattostr(vCountermerk.Nr)); end; finally CloseFile(Fcountermerk); end; end; end else APA_Show_Process.ausgabe('Ist O '); end// spaceleft>0 else APA_Show_Process.ausgabe('spacemax reached '); end;//of istok cubepos:=cubepos+1; Countliste[aktpos]:=cubepos; end;//Ende von links repeat; Application.ProcessMessages; until break=false; if (stop=true) and (aktpos<>0) then stop:=false; //Nur in der aktpos stoppen until (cubepos>anzcube)or (stop=true); if (stop=true) and (aktpos<>0) then stop:=false; //Nur in der aktpos stoppen end;//ende=true; - 348 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN {Ende 2. Beginn der Permutationsschleife} //Speichern des aktuellen Cubeliste damit man wieder weiter machen kann. //speichere aktuelle Position assignfile(fCounter,'c:\APADIR\DATA\Counter.dat'); {$i-} rewrite(fCounter); {$i+} if ioresult<>0 then showmessage('Can not open File Counter.dat'); try seek(fCounter,0); vCounter.Lfnr:=-1; if vcounter.nr=1 then if alwaysspacemaxreached=true then vcounter.Nr:=1 else vcounter.Nr:=0; write(fCounter,vCounter); for x:=0 to maxpos do begin seek(fCounter,x+1); vCounter.Lfnr:=x; vCounter.Nr:=Countliste[x]; write(fCounter,vCounter); end; finally CloseFile(fcounter); end; end;// Wenn es mindestens einen Cube gibt in der Cubeliste end;//with Apa_Application finally CloseFile(fKosten); GeneriereReqListe.Free; Showmessage('Ready'); APA_Grid.Enabled:=true; end; end; procedure TAPA_Grid.Algorithm1Click(Sender: TObject); begin if permutation=true then begin Button3.click; end else begin APA_Dialog.APA_Text.Caption:='Your last deterministic run was not a permutation. Do you want do continue? This will delete your last run!'; if APA_Dialog.showmodal=mryes then begin; Button3.Click; end; end; end; procedure TAPA_Grid.SearchusingThomasAchsheuristic2Click(Sender: TObject); begin Button2.click; end; procedure TAPA_Grid.Alogrithm1Click(Sender: TObject); begin Button3.Click; end; procedure TAPA_Grid.Parameter1Click(Sender: TObject); begin APA_Parameter.ShowModal; end; function TAPA_Grid.berechneKostenGesamt(MatCubes,ReqCubes:TStringList; Nullstellen:boolean):Extended; var x,aktspalte,aktzeile:longint; var SummeKosten:Extended; - 349 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN var zahler,counter:longint; var newcosts:Extended; var new:String; var isderivatof:boolean; var newminderivatspalte,newminderivatzeile:longint; var spalte,zeile:longint; begin // Berechne die Materialisierungskosten spaceleft:=strtofloat(APA_Parameter.APA_Thomas_spacemax.text); timeleft:=strtofloat(APA_Parameter.APA_Thomas_timemax.text); Memorywuerfel:= TStringList.Create; //Erzeuge die Liste der ausgewählten Würfel SummeKosten:=0; try for x:=0 to MatCubes.count-1 do begin aktspalte:=strtoint(copy(MatCubes[x],1,10)); aktzeile:=strtoint(copy(MatCubes[x],11,10)); spaceleft:=spaceleft(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(aktspalte,aktzei le)); end;//Ende von x if (spaceleft>0) then begin //2. Kosten der Kombination berechnen SummeKosten:=0; //2A Ersten Würfel zusetzen aktspalte:=strtoint(copy(MatCubes[0],1,10)); aktzeile:=strtoint(copy(MatCubes[0],11,10)); if (Userandomcosts1.Checked=true) then begin newcosts:=getbuild(-1,-1,aktspalte,aktzeile); end else begin newcosts:=deltaBftW(aktspalte,aktzeile,false); end; SummeKosten:=SummeKosten+newcosts; new:=auffuellen(inttostr(aktspalte),30); new:=new+auffuellen(inttostr(aktzeile),30); Memorywuerfel.Add(new); listbox1.Items.Add('Add '+new+' build from BFT'); listbox1.Items.Add('that costs '+floattostr(newcosts)); timeleft:=timeleft-newcosts; //Erster Würfel zugesetzt Ende //2B Zusätzlich Würfel zusetzen for x:=1 to MatCubes.count-1 do begin aktspalte:=strtoint(copy(MatCubes[x],1,10)); aktzeile:=strtoint(copy(MatCubes[x],11,10)); //? Kann der neue Würfel aus einem bereits materialisierten Würfel abgeleitet werden? isderivatof:=false; for counter:=0 to Memorywuerfel.count-1 do begin New:=Memorywuerfel[counter]; if isderivat(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)), aktspalte,aktzeile) then begin; isderivatof:=true; end; end; if isderivatof=true then begin //Yes leite aus diesem Würfel ab newminderivatspalte:=GetMinDerivatOfSpalte(aktspalte,aktzeile,false); newminderivatzeile:=GetMinDerivatOfZeile(aktspalte,aktzeile,false); - 350 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if (Userandomcosts1.Checked=true) then begin newcosts:=getbuild(newminderivatspalte,newminderivatzeile, aktspalte,aktzeile); end else begin newcosts:=deltaVW(newminderivatspalte,newminderivatzeile, aktspalte,aktzeile,false); end; SummeKosten:=SummeKosten+newcosts; new:=auffuellen(inttostr(aktspalte),30); new:=new+auffuellen(inttostr(aktzeile),30); listbox1.Items.Add('Add '+new+' build from ('+ inttostr(newminderivatspalte)+':'+ inttostr(newminderivatzeile)+')'); listbox1.Items.Add('that costs '+ floattostr(newcosts)); Memorywuerfel.Add(new); if Userandomcosts1.Checked=true then begin timeleft:=timeleft-newcosts; end else begin timeleft:=timeleft(strtofloat(APA_Parameter.APA_Thomas_timeio.text)*(gettupel(newminderivatspalte,ne wminderivatzeile)+(2*gettupel(aktspalte,aktzeile)))+ +strtofloat(APA_Parameter.APA_Thomas_timecpu.text)*gettupel(aktspalte,aktzeile)*lo g2(gettupel(aktspalte,aktzeile))+ strtofloat(APA_Parameter.APA_Thomas_timestore.Text)*gettupel(aktspalte,aktzeile)); end; end else begin //No leite aus dem BFT ab if (Userandomcosts1.Checked=true) then begin newcosts:=getbuild(-1,-1,aktspalte,aktzeile); end else begin newcosts:=deltaBftW(aktspalte,aktzeile,false); end; SummeKosten:=SummeKosten+newcosts; new:=auffuellen(inttostr(aktspalte),30); new:=new+auffuellen(inttostr(aktzeile),30); listbox1.Items.Add('Add '+new+' build from BFT'); listbox1.Items.Add('that costs '+floattostr(newcosts)); Memorywuerfel.Add(new); if Userandomcosts1.Checked=true then begin timeleft:=timeleft-newcosts; end else begin timeleft:=timeleft-(strtofloat(APA_Parameter.APA_Thomas_timeio.text)*(gettupel(1,-1)+(2*gettupel(aktspalte,aktzeile)))+ +strtofloat(APA_Parameter.APA_Thomas_timecpu.text)*gettupel(aktspalte,aktzeile)*lo g2(gettupel(aktspalte,aktzeile))+ strtofloat(APA_Parameter.APA_Thomas_timestore.Text)*gettupel(aktspalte,aktzeile)); end; end; end;//Ende von x Listbox1.Items.Add('Die Würfel sind'); for counter:=0 to Memorywuerfel.Count-1 do begin Listbox1.Items.add(Memorywuerfel[counter]); end; {zahler:=0; EntferneausDiss repeat; If MatCubes.count>zahler then begin //Merke Ausgangscube merkcube:=zahler; merkspalte:=strtoint(copy(MatCubes[zahler],1,10)); merkzeile:=strtoint(copy(MatCubes[zahler],11,10)); - 351 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN //Kontrolliere alle Vorgänger des aktuellen Cube zahler2:=0; merkderivat:=-1;merkderivatspalte:=-1;merkderivatzeile:=-1; repeat; if (MatCubes.count>zahler2) then begin if ((strtoint(copy(MatCubes[zahler2],1,10))<>merkspalte)or(strtoint(copy(MatCubes[zah ler2],11,10))<>merkzeile)) and(merkcube>zahler2)//Verhindert, dass nur Cubes, welche früher mat. wurden beachtet werden then begin if (isderivat(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2], 11,10)), merkspalte,merkzeile)=true) then begin; //Wenn kosten kleiner als bereits gemerkter dann merken if (Userandomcosts1.Checked=true) then begin if (merkderivat=-1) or ( (getbuild(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2],1 1,10)), merkspalte,merkzeile)< getbuild(merkderivatspalte,merkderivatzeile,merkspalte,merkzeile))) then begin merkderivat:=zahler2; merkderivatspalte:=strtoint(copy(MatCubes[zahler2],1,10)); merkderivatzeile:= strtoint(copy(MatCubes[zahler2],11,10)); end; end else begin if (merkderivat=-1) or ( (deltaVW(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2],11 ,10)), merkspalte,merkzeile,false)< deltaVW(merkderivatspalte,merkderivatzeile,merkspalte,merkzeile,false))) then begin merkderivat:=zahler2; merkderivatspalte:=strtoint(copy(MatCubes[zahler2],1,10)); merkderivatzeile:= strtoint(copy(MatCubes[zahler2],11,10)); end; end; end; end;//spalte<>spalte oder zeile<>zeile end; //<>Lfnr zahler2:=zahler2+1; until (zahler2>MatCubes.count-1)or(zahler2=merkcube); //Wenn derivat vorhanden erzeuge aus dem Derivat sonst aus BFT if merkderivat<>-1 then begin if (Userandomcosts1.Checked=true) then begin merkcosts:=getbuild(merkderivatspalte,merkderivatzeile,strtoint(copy(MatCubes[zahl er],1,10)),strtoint(copy(MatCubes[zahler],11,10))); end else begin merkcosts:=deltaVW(merkderivatspalte,merkderivatzeile,strtoint(copy(MatCubes[zahle r],1,10)),strtoint(copy(MatCubes[zahler],11,10)),false); end; SummeKosten:=SummeKosten+merkcosts; listbox1.Items.Add('Add '+inttostr(strtoint(copy(MatCubes[zahler],1,10)))+':'+inttostr(strtoint(copy(MatCu bes[zahler],11,10)))+' erzeugt aus '+ inttostr(merkderivatspalte)+':'+inttostr(merkderivatzeile)); listbox1.Items.Add('costs are '+floattostr(merkcosts)); //Berechne spaceleft und timeleft - 352 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if (Userandomcosts1.Checked=false) then begin timeleft:=timeleft-(strtofloat(APA_Parameter.APA_Thomas_timeio.text)* (gettupel(-1,1)+(2*gettupel(strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler ],11,10)))))+ +strtofloat(APA_Parameter.APA_Thomas_timecpu.text)* gettupel(strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler],11,1 0))) *log2(gettupel(strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler ],11,10))))+ strtofloat(APA_Parameter.APA_Thomas_timestore.Text)* gettupel(strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler],11,1 0)))); spaceleft:=spaceleft(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)* gettupel(strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler],11,1 0)))); end else begin timeleft:=timeleftmerkcosts; spaceleft:=spaceleft(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)* gettupel(strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler],11,1 0)))); end; end else begin if (Userandomcosts1.Checked=true) then begin merkcosts:=getbuild(-1,1,strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler],11,10))); end else begin merkcosts:=deltaBftW(strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[ zahler],11,10)),false); end; SummeKosten:=SummeKosten+merkcosts; listbox1.Items.Add('Add '+inttostr(strtoint(copy(MatCubes[zahler],1,10)))+':'+inttostr(strtoint(copy(MatCu bes[zahler],11,10)))+' erzeugt aus '+ inttostr(-1)+':'+inttostr(-1)); listbox1.Items.Add('costs are '+floattostr(merkcosts)); if (Userandomcosts1.Checked=false) then begin timeleft:=timeleft-(strtofloat(APA_Parameter.APA_Thomas_timeio.text)* (gettupel(-1,1)+(2*gettupel(strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler ],11,10)))))+ +strtofloat(APA_Parameter.APA_Thomas_timecpu.text)* gettupel(strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler],11,1 0))) *log2(gettupel(strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler ],11,10))))+ strtofloat(APA_Parameter.APA_Thomas_timestore.Text)* - 353 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN gettupel(strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler],11,1 0)))); spaceleft:=spaceleft(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)* gettupel(strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler],11,1 0)))); end else begin timeleft:=timeleftmerkcosts; spaceleft:=spaceleft(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)* gettupel(strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler],11,1 0)))); end; end; end; zahler:=zahler+1; until (zahler>MatCubes.count-1);} //3. Berechne die Abfragekosten {zahler:=0; //Zahler für ReqCubes repeat; if (zahler<ReqCubes.count) then begin //Abfragekosten addieren merkderivat:=-1;merkderivatspalte:=-1;merkderivatzeile:=-1; zahler2:=0;//Zähler für Materialisierte Würfel repeat; if (zahler2<MatCubes.Count) then begin if (isderivat(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2], 11,10)), strtoint(copy(ReqCubes[zahler],1,10)),strtoint(copy(ReqCubes[zahler],11,10)))=true ) then begin; //Wenn kosten kleiner als bereits gemerkter dann merken if (Userandomcosts1.Checked=true) then begin if (merkderivat=-1) or ((getbuild(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2], 11,10)),strtoint(copy(ReqCubes[zahler],1,10)),strtoint(copy(ReqCubes[zahler],11,10 )))< getbuild(merkderivatspalte,merkderivatzeile,strtoint(copy(ReqCubes[zahler],1,10)), strtoint(copy(ReqCubes[zahler],11,10))))) then begin merkderivat:=zahler2; merkderivatspalte:=strtoint(copy(MatCubes[zahler2],1,10)); merkderivatzeile:= strtoint(copy(MatCubes[zahler2],11,10)); end; end else begin if (merkderivat=-1) or ((deltaVW(strtoint(copy(MatCubes[zahler2],1,10)),strtoint(copy(MatCubes[zahler2],1 1,10)),strtoint(copy(ReqCubes[zahler],1,10)),strtoint(copy(ReqCubes[zahler],11,10) ),false)< - 354 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN deltaVW(merkderivatspalte,merkderivatzeile,strtoint(copy(ReqCubes[zahler],1,10)),s trtoint(copy(ReqCubes[zahler],11,10)),false))) then begin merkderivat:=zahler2; merkderivatspalte:=strtoint(copy(MatCubes[zahler2],1,10)); merkderivatzeile:= strtoint(copy(MatCubes[zahler2],11,10)); end; end; end; end; zahler2:=zahler2+1; until (zahler2>MatCubes.count-1); aktspalte:=strtoint(copy(ReqCubes[zahler],1,10)); aktzeile:=strtoint(copy(ReqCubes[zahler],11,10)); if merkderivat=-1 then begin //Erzeuge aus BFT if (Userandomcosts1.Checked=true) then begin SummeKosten:=SummeKosten+ (getquery(-1,-1,aktspalte,aktzeile)* APA[aktspalte,aktzeile].gewicht); listbox1.Items.Add('Query '+inttostr(aktspalte)+':'+inttostr(aktzeile)+' erzeugt aus '+ inttostr(-1)+':'+inttostr(-1)); listbox1.Items.Add('costs are '+floattostr((getquery(-1,1,aktspalte,aktzeile)* APA[aktspalte,aktzeile].gewicht))); end else begin SummeKosten:=SummeKosten+ (deltaBftW(aktspalte,aktzeile,true)* APA[aktspalte,aktzeile].gewicht); listbox1.Items.Add('Query '+inttostr(aktspalte)+':'+inttostr(aktzeile)+' erzeugt aus '+ inttostr(-1)+':'+inttostr(-1)); listbox1.Items.Add('costs are '+floattostr((deltaBftW(aktspalte,aktzeile,true)* APA[aktspalte,aktzeile].gewicht))); end; end else begin //Erzeuge aus dem Derivat if (Userandomcosts1.Checked=true) then begin SummeKosten:=SummeKosten+ (getquery(merkderivatspalte,merkderivatzeile,aktspalte,aktzeile)* APA[aktspalte,aktzeile].gewicht); listbox1.Items.Add('Query '+inttostr(aktspalte)+':'+inttostr(aktzeile)+' erzeugt aus '+ inttostr(merkderivatspalte)+':'+inttostr(merkderivatzeile)); listbox1.Items.Add('costs are '+floattostr((getquery(merkderivatspalte,merkderivatzeile,aktspalte,aktzeile)* APA[aktspalte,aktzeile].gewicht))); end else begin SummeKosten:=SummeKosten+ (deltaVW(merkderivatspalte,merkderivatzeile,aktspalte,aktzeile,true)* APA[aktspalte,aktzeile].gewicht); listbox1.Items.Add('Query '+inttostr(aktspalte)+':'+inttostr(aktzeile)+' erzeugt aus '+ inttostr(merkderivatspalte)+':'+inttostr(merkderivatzeile)); listbox1.Items.Add('costs are '+floattostr((deltaVW(merkderivatspalte,merkderivatzeile,aktspalte,aktzeile,true)* APA[aktspalte,aktzeile].gewicht))); end; end; end; - 355 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN zahler:=zahler+1; until (zahler>ReqCubes.count-1); } {3.Zusetzen der Querykosten} for zahler:=0 to ReqCubes.count-1 do begin; spalte:=strtoint(copy(ReqCubes[zahler],1,10)); zeile:=strtoint(copy(ReqCubes[zahler],11,10)); isderivatof:=false; for counter:=0 to Memorywuerfel.Count-1 do begin New:=Memorywuerfel[counter]; if isderivat(strtoint(copy(new,1,30)),strtoint(copy(new,31,30)), spalte,zeile) then begin; isderivatof:=true; end; end; if isderivatof=true then begin newminderivatspalte:=GetMinDerivatOfSpalte(spalte,zeile,true); newminderivatzeile:=GetMinDerivatOfZeile(spalte,zeile,true); if (Userandomcosts1.Checked=true) then begin newcosts:= ((getquery(newminderivatspalte,newminderivatzeile, spalte,zeile)) *APA[spalte,zeile].gewicht); end else begin newcosts:= ((deltaVW(newminderivatspalte,newminderivatzeile, spalte,zeile,true)) *APA[spalte,zeile].gewicht); end; SummeKosten:=SummeKosten+newcosts; listbox1.Items.Add('Reqcosts ('+inttostr(spalte)+':'+inttostr(zeile)+')'); Listbox1.items.add('Query from ('+inttostr(newminderivatspalte)+':'+ inttostr(newminderivatzeile)+')'); listbox1.Items.Add('that costs '+floattostr(newcosts)); end else begin if (Userandomcosts1.Checked=true) then begin newcosts:=((getquery(-1,-1,spalte,zeile)) *APA[spalte,zeile].gewicht); end else begin newcosts:=((deltaBftW(spalte,zeile,true)) *APA[spalte,zeile].gewicht); end; SummeKosten:=SummeKosten+ newcosts; listbox1.Items.Add('Reqcosts ('+inttostr(spalte)+':'+inttostr(zeile)+')'); Listbox1.Items.Add('Query from BFT'); listbox1.Items.Add('that costs '+floattostr(newcosts)); end; end;//of zahler if (timeleft<0) then begin; If Nullstellen=true then Summekosten:=0;APA_Show_Process.ausgabe('Timemax reached'); end; end; // von Spaceleft>0 finally Result:=SummeKosten; Memorywuerfel.free; end; end; procedure TAPA_Grid.Showcosts1Click(Sender: TObject); - 356 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN var zeile,spalte, zahler:longint; var MatCubes,ReqCubes, MatCubesSorted:TStringList; var merkeRandom:boolean; begin if matcount>0 then begin //Berechne die Kosten der aktuellen Materialsierung //auf der Basis der Zufallskosten //Nur getbuild assignfile(fKosten,'C:\APADIR\DATA\Kosten.dat'); {$i-} reset(fKosten); {$i+} if ioresult<>0 then begin; showmessage('cost database error ');exit;end; Listbox1.Items.Add(''); Listbox1.Items.Add('Berechne Kosten'); Listbox1.Items.Add(''); ReqCubes:=TStringList.Create; ReqCubes.Clear; MatCubes:=TStringList.Create; MatCubes.Clear; MatCubesSorted:=TStringList.Create; MatCubesSorted.Clear; merkerandom:=Userandomcosts1.Checked; Userandomcosts1.Checked:=true; try //Lege alle nicht redundaten Cubes an, und vergib eine Nummer for zeile:=0 to anzzeilen-1 do begin for spalte:=0 to anzspalten-1 do begin if APA[spalte,zeile].farbe=clYellow then begin if APA[spalte,zeile].interessant=true then begin //Speichere Required Cubes //Merke dir die Required Cubes ReqCubes.Add(auffuellen(inttostr(spalte),10)+auffuellen(inttostr(zeile),10)); end; if APA[spalte,zeile].materalisieren=true then begin //Speichere Mat Cubes //Merke dir die MatCubes MatCubes.Add(auffuellen(inttostr(spalte),10)+auffuellen(inttostr(zeile),10));; end; end; end;//end of spalte end;//end of zeilen for zahler:=0 to MatCubes.count-1 do MatCubesSorted.Add('free'); for zahler:=0 to MatCubes.Count-1 do begin MatCubesSorted[APA[strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler], 11,10))].matcount-1]:= MatCubes[zahler]; end; showmessage('Costs: '+floattostr(berechneKostenGesamt(MatCubesSorted,ReqCubes,false))+'; Time left: '+ floattostr(timeleft)+'; Space left: '+floattostr(spaceleft)); finally MatCubes.Free; ReqCubes.Free; MatCubesSorted.Free; Userandomcosts1.Checked:=merkerandom; - 357 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN CloseFile(fKosten); end; end //of matcount else showmessage('No materialized cubes selected'); end; function TAPA_Grid.GetRightOrdertom(Listecubes:TStringList):TStringList; type Knotendeklationszeiger= ^Knotendeklaration; Knotendeklaration = record Knoten:longint; spalte:longint; zeile:longint; MaxAbstand:Extended; Parent:longint; end; var Knoten, Knoten2, Knoten3 , Knotenmerk:Knotendeklationszeiger; var Innere_Knoten, Randknoten:TList; var zahler, zahler2, zahler3, zahlermerk:longint; var costmerk, Kostengewinn:Extended; var {Parent,} Parentvonderivat:longint; var {parentcostmerk,} Parentvonderivatcostmerk:Extended; begin //Erzeuge alle Randknoten und fülle sie mit den Kosten Randknoten:= TList.Create; Innere_Knoten:=TList.Create; try for zahler:=0 to Listecubes.Count-1 do begin //Berechne Maxabstand //Der Maxabstand ist die Kostenverbesserung der Materialisierung der Derivate von New(Knoten) //welche noch nicht materialisiert worden sind. Kostengewinn:=0; for zahler2:=0 to Listecubes.count-1 do begin if (isderivat(strtoint(copy(Listecubes[zahler],1,10)),strtoint(copy(Listecubes[zahler ],11,10)), strtoint(copy(Listecubes[zahler2],1,10)),strtoint(copy(Listecubes[zahler2],11,10)) )=true) then begin if (Userandomcosts1.Checked=true) then begin Kostengewinn:=Kostengewinn+max(0, (//Da noch kein Würfel materialisiert wurde werden alle vom BFT erzeugt getbuild(-1,1,strtoint(copy(Listecubes[zahler2],1,10)),strtoint(copy(Listecubes[zahler2],11,10 )) ) getbuild( strtoint(copy(Listecubes[zahler],1,10)),strtoint(copy(Listecubes[zahler],11,10)), strtoint(copy(Listecubes[zahler2],1,10)),strtoint(copy(Listecubes[zahler2],11,10)) ) ) ); end else begin Kostengewinn:=Kostengewinn+max(0, (//Da noch kein Würfel materialisiert wurde werden alle vom BFT erzeugt deltaBftW(strtoint(copy(Listecubes[zahler2],1,10)),strtoint(copy(Listecubes[zahler 2],11,10)),false ) deltaVW( - 358 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN strtoint(copy(Listecubes[zahler],1,10)),strtoint(copy(Listecubes[zahler],11,10)), strtoint(copy(Listecubes[zahler2],1,10)),strtoint(copy(Listecubes[zahler2],11,10)) ,false ) ) ); end; end; end; New(Knoten); Knoten^.Knoten:=zahler; Knoten^.MaxAbstand:=Kostengewinn; Knoten^.Parent:=-1; Knoten^.spalte:= strtoint(copy(Listecubes[zahler],1,10)); Knoten^.zeile:=strtoint(copy(Listecubes[zahler],11,10)); Randknoten.Add(Knoten); end; //Erzeuge Randknoten Ende repeat;//So lange durchlaufen, bis die Menge der Randknoten leer //Finde den Würfel mit dem Minimalen Abstand und setze diesen zu inneren Würfeln zu zahlermerk:=-1;costmerk:=0; for zahler:=0 to Randknoten.Count-1 do begin Knoten:= Randknoten.Items[zahler]; if (Knoten^.MaxAbstand>costmerk) or(zahlermerk=-1) then begin zahlermerk:=zahler; costmerk:=Knoten^.MaxAbstand; end; end; //Zusetzen des Würfels zu Inneren Knoten Knotenmerk:=Randknoten.Items[zahlermerk]; Innere_Knoten.Add(Knotenmerk); Randknoten.Delete(zahlermerk); if Randknoten.Count>0 then begin //Berechne die Kosten neu //Stelle fest, ob die Randknoten derivate von dem neuen Inneren Knoten sind. //Wenn ja und die Kosten sind geringer als die vom BFT dann ändere Kosten //Ist jedoch der neue Cube ein Derivat von dem Randknoten müssen die Kosten neu berechnet werden for zahler:=0 to Randknoten.Count-1 do begin Knoten:=Randknoten.Items[zahler]; if (isderivat(Knotenmerk^.spalte,Knotenmerk^.zeile,Knoten^.spalte,Knoten^.zeile)=true ) or (isderivat(Knoten^.spalte,Knoten^.zeile,Knotenmerk^.spalte,Knotenmerk^.zeile)=true ) then begin Kostengewinn:=0; //Berechne die Derivate //Durchlaufe alle Randknoten for zahler2:=0 to Randknoten.Count-1 do begin Knoten2:=Randknoten.Items[zahler2]; //Stelle fest, ob dieser Randknoten ein Derivat ist if (isderivat(Knoten^.spalte,Knoten^.zeile,Knoten2^.spalte,Knoten2.zeile)=true) and(Knoten^.Knoten<>Knoten2^.Knoten) then begin - 359 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN //Finde das Kostenminimale Parent von Knoten2 Parentvonderivat:=-1; if (Userandomcosts1.Checked=true) then begin Parentvonderivatcostmerk:=getbuild(-1,-1,Knoten2.spalte,Knoten2^.zeile); end else begin Parentvonderivatcostmerk:=deltaBftW(Knoten2.spalte,Knoten2^.zeile,false); end; for zahler3:=0 to Innere_Knoten.count-1 do begin Knoten3:=Innere_Knoten.Items[zahler3]; if (isderivat(Knoten3^.spalte,Knoten3^.zeile,Knoten2^.spalte,Knoten2^.zeile)=true) and(Knoten3^.Knoten<>Knotenmerk^.Knoten)and(Knoten3^.Knoten<>Knotenmerk^.Knoten) then begin if (Userandomcosts1.Checked=true) then begin costmerk:=getbuild(Knoten3^.spalte,Knoten3^.zeile,Knoten2^.spalte,Knoten2^.zeile); end else begin costmerk:=deltaVW(Knoten3^.spalte,Knoten3^.zeile,Knoten2^.spalte,Knoten2^.zeile,fa lse); end; if (costmerk<Parentvonderivatcostmerk) then begin Parentvonderivat:=zahler3; Parentvonderivatcostmerk:=costmerk; end; end; end;//von Zahler3 if parentvonderivat<>-1 then begin Knoten3:=Innere_Knoten.Items[parentvonderivat]; if (Userandomcosts1.Checked=true) then begin Kostengewinn:=Kostengewinn+max(0,( ( getbuild(Knoten3^.spalte,Knoten3^.zeile,Knoten2^.spalte,Knoten2^.zeile) getbuild(Knoten^.spalte,Knoten^.zeile,Knoten2^.spalte,Knoten2^.zeile) ) )); end else begin Kostengewinn:=Kostengewinn+max(0,( ( deltaVW(Knoten3^.spalte,Knoten3^.zeile,Knoten2^.spalte,Knoten2^.zeile,false) deltaVW(Knoten^.spalte,Knoten^.zeile,Knoten2^.spalte,Knoten2^.zeile,false) ) )); end; end else begin if (Userandomcosts1.Checked=true) then begin Kostengewinn:=Kostengewinn+max(0,( ( getbuild(-1,-1,Knoten2^.spalte,Knoten2^.zeile) getbuild(Knoten^.spalte,Knoten^.zeile,Knoten2^.spalte,Knoten2^.zeile) ) )); end else begin Kostengewinn:=Kostengewinn+max(0,( ( deltaBftW(Knoten2^.spalte,Knoten2^.zeile,false) deltaVW(Knoten^.spalte,Knoten^.zeile,Knoten2^.spalte,Knoten2^.zeile,false) ) )); end; end; end;//End von isderivat end; - 360 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end;//Ende von Derivat oder Parent end; end;//Randknoten.count>0 until Randknoten.Count=0;//So lange durchlaufen, bis die Menge der Randknoten leer ENDE finally Listecubes.Clear; for zahler:=0 to Innere_Knoten.Count-1 do begin Knoten:=Innere_Knoten.Items[zahler]; Listecubes.Add(auffuellen(inttostr(Knoten^.spalte),10)+auffuellen(inttostr(Knoten^ .zeile),10)); dispose(Knoten); end; for zahler:=0 to Randknoten.Count-1 do begin Knoten:=Innere_Knoten.Items[zahler]; dispose(Knoten); end; Innere_Knoten.free; Randknoten.free; Result:=Listecubes; end; end; procedure TAPA_Grid.Button4Click(Sender: TObject); var var var var var var var var var var var var var zeile,spalte,aktzeile,aktspalte,anzderivative:longint; x,aktpos,lang,anzcube,reqcube,pos:longint; zahler:longint; seqcounter:Extended; istok:boolean; ende:boolean; kostenmerk,kostenmerkmin:Extended; neustarten:boolean; Countliste:array of Longint; neuespalte:boolean; alwaysspacemaxreached, geladen:boolean; st:string; GeneriereListe, GeneriereReqListe:TStringList; begin assignfile(fMatCubes,'C:\APADIR\DATA\MatCubes.dat'); assignfile(fReqCubes,'C:\APADIR\DATA\ReqCubes.dat'); assignfile(fMerkkosten,'C:\APADIR\DATA\Merkkosten.dat'); assignfile(fCounter,'C:\APADIR\DATA\Counter.dat'); assignfile(fCountermerk,'C:\APADIR\DATA\Countermerk.dat'); assignfile(fCubes,'C:\APADIR\DATA\Cubes.dat'); assignfile(fKosten,'C:\APADIR\DATA\Kosten.dat'); mustsave:=true; Removedeterministicsolution1Click(self); {$i-} reset(fKosten); {$i+} if ioresult<>0 then begin; showmessage('cost database error ');exit;end; APA_Grid.Enabled:=false; GeneriereReqListe:=TStringList.create(); try {Rechne alle möglichen Kombinationen durch, welche im Bereich des Maximum sind} // Mache das über eine Temporäre Datei auf der Festplatte // ist zwar langsamer, aber bei großen Rechnungen hängt sich der Rechner nicht auf. - 361 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN with APA_Application do begin APA_Dialog.APA_Text.Caption:='Do you want to restart?'; if permutation=false then begin if APA_Dialog.showmodal=mryes then neustarten:=true else neustarten:=false; end else neustarten:=true; Permutation:=false; lang:=0;alwaysspacemaxreached:=false;seqcounter:=0; APA_Show_Process.APA_Protocoll.Clear; APA_Show_Process.show; Application.ProcessMessages; if neustarten=true then begin; APA_Show_Process.ausgabe('Clear Tables ...'); {$i-} rewrite(fCubes); {$i+} if ioresult<>0 then begin; showmessage('Cubes database error ');exit;end; {$i-} rewrite(fReqCubes); {$i+} if ioresult<>0 then begin; showmessage('ReqCubes database error ');exit;end; {$i-} rewrite(fCounter); {$i+} if ioresult<>0 then begin; showmessage('Counter database error ');exit;end; {$i-} rewrite(fMerkkosten); {$i+} if ioresult<>0 then begin; showmessage('ReqCubes database error ');exit;end; try seek(fMerkkosten,0); vMerkkosten.Lfnr:=0; vMerkkosten.Kosten:=0; write(fMerkkosten,vMerkkosten); APA_Show_Process.ausgabe('Search for possible cubes...'); anzcube:=0; reqcube:=0; //Lege alle nicht redundaten Cubes an, und vergib eine Nummer for zeile:=0 to anzzeilen-1 do begin for spalte:=0 to anzspalten-1 do begin if APA[spalte,zeile].farbe=clYellow then begin if APA[spalte,zeile].interessant=True then begin anzcube:=anzcube+1; seek(fCubes,anzcube-1); vCubes.Lfnr:=anzcube; vCubes.Spalte:=spalte; vCubes.Zeile:=zeile; vCubes.Required:=1; write(fCubes,vCubes); APA_Show_Process.ausgabe('Add Cube: ('+inttostr(spalte)+':'+inttostr(zeile)+')'); end else begin anzderivative:=0; for aktzeile:=0 to anzzeilen-1 do begin for aktspalte:=0 to anzspalten-1 do begin if (APA[aktspalte,aktzeile].farbe=clYellow)and (APA[aktspalte,aktzeile].interessant=true) then begin if isderivat(spalte,zeile,aktspalte,aktzeile) then begin anzderivative:=anzderivative+1; end; end; end; - 362 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; if anzderivative>0 then begin anzcube:=anzcube+1; seek(fCubes,anzcube-1); vCubes.Lfnr:=anzcube; vCubes.Spalte:=spalte; vCubes.Zeile:=zeile; vCubes.Required:=1; write(fCubes,vCubes); APA_Show_Process.ausgabe('Add Cube: ('+inttostr(spalte)+':'+inttostr(zeile)+')'); end; end; if APA[spalte,zeile].interessant=true then begin //Speichere Required Cubes //Merke dir die Required Cubes reqcube:=reqcube+1; seek(fReqCubes,reqcube-1); vReqCubes.Lfnr:=reqcube; vReqCubes.Spalte:=spalte; vReqCubes.Zeile:=zeile; write(fReqCubes,vReqCubes); end; end; end;//end of spalte end;//end of zeilen finally CloseFile(fCubes); CloseFile(fReqCubes); CloseFile(fCounter); CloseFile(fMerkkosten); end; end;//von neustarten {$i-} reset(fCubes); {$i+} if ioresult<>0 then begin; showmessage('Cubes database error ');exit;end; try anzcube:=filesize(fCubes); Setlength(Countliste,anzcube); MemoryCubes:=nil; setlength(MemoryCubes,anzcube); pos:=0; repeat; if (filesize(fCubes)>0) then begin seek(fCubes,pos); read(fCubes,vCubes); x:=round(vCubes.lfnr)-1; Memorycubes[x].nr:=round(vCubes.lfnr); Memorycubes[x].spalte:=vCubes.Spalte; Memorycubes[x].zeile:=vCubes.Zeile; end; pos:=pos+1; until pos>=filesize(fCubes); {$i-} reset(fReqCubes); {$i+} if ioresult<>0 then begin; showmessage('ReqCubes database error ');exit;end; try MemoryreqCubes:=nil; setlength(MemoryReqCubes,filesize(fReqCubes)); - 363 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN MemoryReqCubescount:=filesize(fReqCubes); pos:=0; repeat; if (filesize(fReqCubes)>0) then begin seek(fReqCubes,pos); read(fReqCubes,vReqCubes); x:=round(vReqCubes.Lfnr)-1; MemoryReqCubes[x].spalte:=vReqCubes.Spalte; MemoryReqCubes[x].zeile:=vReqCubes.Zeile; end; pos:=pos+1; until (pos>=filesize(fReqCubes)); for x:=0 to MemoryReqCubescount-1 do begin GeneriereReqListe.Add(auffuellen(inttostr(MemoryReqCubes[x].spalte),10)+auffuellen (inttostr(MemoryReqCubes[x].zeile),10)); end; finally CloseFile(fReqCubes); end; finally CloseFile(fCubes); end; Countliste:=nil; Setlength(Countliste,anzcube+1); MerkeListe:=nil; SetLength(Merkeliste,anzcube); APA_Show_Process.ausgabe(inttostr(anzcube)+' Cubes found'); if neustarten=true then begin geladen:=false; //Zuerst alle 0 setzten for x:=0 to anzcube do Countliste[x]:=0; Countliste[0]:=1; kostenmerkmin:=0; end// of neustarten else begin geladen:=true; for x:=0 to anzcube-1 do Countliste[x]:=0; //Laden der Cubes {$i-} reset(fCounter); {$i+} if ioresult<>0 then begin; showmessage('ReqCubes database error ');exit;end; try lang:=-1;pos:=0; repeat; if (filesize(fCounter)>0) then begin seek(fCounter,pos); read(fCounter,vCounter); if vcounter.Lfnr<>-1 then begin lang:=lang+1; x:=round(vCounter.Lfnr); Countliste[x]:=round(vCounter.nr); end; end else begin //Feststellen von alwaysspacemaxreached if vcounter.nr=1 then alwaysspacemaxreached:=true else alwaysspacemaxreached:=false; end; - 364 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN pos:=pos+1; until pos>=filesize(fCounter); finally CloseFile(fCounter); end; {$i-} reset(fMerkkosten); {$i+} if ioresult<>0 then begin; showmessage('Merkkosten database error ');exit;end; try seek(fMerkkosten,0);read(fMerkkosten,vMerkkosten); kostenmerkmin:=vMerkkosten.Kosten; finally CloseFile(fMerkkosten); end; end; if anzcube<>0 then begin //Kombinatorik if neustarten=true then begin Countliste[0]:=1; lang:=0; end//neustarten else APA_Show_Process.ausgabe('*** Restart ***'); ende:=false; repeat;//until (lang>=anzcube)or(ende=true) //von links nach rechts nummerieren if geladen=false then begin //Beim ersten Start nicht ausführen //wenn geladen wurde alwaysspacemaxreached:=true; end// Ende geladen=false else geladen:=false; istok:=true;aktpos:=0; repeat;//until (neuespalte=true)or(ende=true) neuespalte:=false; if istok=true then begin; //Kontrolliere //Alle 50000 Einträge lösche die Anzeigeliste um Speicher zu schonen if APA_Show_Process.APA_Protocoll.Items.Count>50000 then APA_Show_Process.APA_Protocoll.Items.Clear; seqcounter:=seqcounter+1; if alwaysspacemaxreached=true then APA_Show_Process.ausgabe('>>Add Seq: '+floattostr(seqcounter)) else APA_Show_Process.ausgabe('>Add Seq: '+floattostr(seqcounter)); //Stelle fest ob spacemax erfüllt. //Wenn ja ordne die Würfel und berechne Kosten spaceleftfirstcubes:=strtofloat(APA_Parameter.APA_Thomas_spacemax.text); spaceleft:=strtofloat(APA_Parameter.APA_Thomas_spacemax.text); for x:=0 to lang do begin APA_Show_Process.ausgabe(' '+inttostr(countliste[x])); - 365 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN spaceleft:=spaceleft(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(MemoryCubes[Coun tliste[x]-1].spalte,MemoryCubes[Countliste[x]-1].zeile)); if x<>0 then begin //Rechne den Speicherplatz ohne die letzte Ebene aus. //Wenn dieser überschritten kann der durchlauf der letzten Ebene gestoppt werden spaceleftfirstcubes:=spaceleftfirstcubes(strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(MemoryCubes[Coun tliste[x]-1].spalte,MemoryCubes[Countliste[x]-1].zeile)); end; end;//Ende von x //Wenn überschritten setzt den Zähler der ersten auf max if spaceleftfirstcubes<0 then begin if aktpos=0 then Countliste[0]:=anzcube; APA_Show_Process.ausgabe(' >>> Jump to next because spaceleft is '+floattostr(spaceleftfirstcubes)); end; if spaceleft>0 then begin // Nur wenn die Spacemax Bedingung erfüllt weiterrechnen alwaysspacemaxreached:=false; for zahler:=0 to lang do begin MerkeListe[zahler]:=countliste[zahler]; end; //Berechne Kosten GeneriereListe:=TStringList.create(); try for x:=0 to lang do begin GeneriereListe.Add(auffuellen(inttostr(MemoryCubes[countliste[x]1].spalte),10)+auffuellen(inttostr(MemoryCubes[countliste[x]-1].zeile),10)); end; for x:=0 to lang do begin APA_Show_Process.ausgabe('Unsorted: '+inttostr(x)+': ('+inttostr(strtoint(copy(GeneriereListe[x],1,10)))+':'+inttostr(strtoint(copy(Gen eriereListe[x],11,10)))+')'); end; APA_Show_Process.ausgabe('Sort Cubes ...'); GeneriereListe:=GetRightOrdertom(GeneriereListe); for x:=0 to lang do begin APA_Show_Process.ausgabe('Sorted: '+inttostr(x)+': ('+inttostr(strtoint(copy(GeneriereListe[x],1,10)))+':'+inttostr(strtoint(copy(Gen eriereListe[x],11,10)))+')'); end; kostenmerk:=berechneKostenGesamt(GeneriereListe,GeneriereReqListe,true); finally GeneriereListe.free; end; if kostenmerk>0 then begin if(kostenmerkmin=0)or(kostenmerkmin>kostenmerk) then begin; {$i-} reset(fMerkkosten); {$i+} if ioresult<>0 then begin; showmessage('Merkkosten database error ');exit;end; try - 366 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APA_Show_Process.ausgabe('*****************'); APA_Show_Process.ausgabe('Trage ein das Minimum '+floattostr(kostenmerk)); vMerkkosten.Kosten:=kostenmerk; vMerkkosten.Lfnr:=0; seek(fMerkkosten,0);write(fMerkkosten,vMerkkosten); kostenmerkmin:=kostenmerk; seek(fMerkkosten,1); vMerkkosten.Lfnr:=1; vMerkkosten.Kosten:=spaceleft; write(fMerkkosten,vMerkkosten); seek(fMerkkosten,2); vMerkkosten.Lfnr:=2; vMerkkosten.Kosten:=timeleft; write(fMerkkosten,vMerkkosten); finally CloseFile(fMerkkosten); end; //Speichere Counttable assignfile(fCountermerk,'c:\APADIR\DATA\Countermerk.dat'); {$i-} rewrite(fCountermerk); {$i+} if ioresult<>0 then showmessage('Can not open File Countermerk.dat'); try for x:=0 to lang do begin seek(fCountermerk,filesize(fCountermerk)); vCountermerk.Lfnr:=x; vCountermerk.Nr:=MerkeListe[x]; write(fCountermerk,vCountermerk); APA_Show_Process.ausgabe('Save Cube Pos:'+floattostr(vCountermerk.Lfnr)+' Nr:'+floattostr(vCountermerk.Nr)); end;//Ende von x finally CloseFile(fCountermerk); end; end;//Ende von if(Minkostcubetable['Kosten']=0) ... end;//Ende von if kostenmerk>0 then begin end//von if spacemax>0 else APA_Show_Process.ausgabe('spacemax reached'); end;// von istok if countliste[aktpos]>=(anzcube-aktpos) then begin //Setze alle cubes vom aktpos und kleiner auf 1 Countliste[aktpos]:=1; x:=aktpos; repeat; Countliste[x]:=1; x:=x-1; until x=-1; aktpos:=aktpos+1; if countliste[aktpos]=0 then neuespalte:=true; Countliste[aktpos]:=countliste[aktpos]+1; //Finde den nächsten Cube, welcher nicht das Maximum hat repeat; if Countliste[aktpos]>(anzcube-aktpos) then begin aktpos:=aktpos+1; if (aktpos>anzcube) then begin aktpos:=anzcube; - 367 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN ende:=true; end; if countliste[aktpos]=0 then neuespalte:=true; Countliste[aktpos]:=countliste[aktpos]+1; end; until (Countliste[aktpos]<=(anzcube-aktpos))or(ende=true); //Ende Finde den nächsten Cube, welcher nicht das Maximum hat //Feststellen, ob alle links richtig sind x:=aktpos-1;istok:=true; repeat; if x>=0 then begin Countliste[x]:=Countliste[x+1]+1; end; x:=x-1; until x<0; //Ende Feststellen, ob alle links richtig sind aktpos:=0; end //Ende von countliste[aktpos]>= ... else begin; Countliste[aktpos]:=countliste[aktpos]+1; aktpos:=0; end; Application.processmessages; while(break=true) do begin; Application.processmessages; end; if APA_Show_Process.Expertmode1.Checked=true then begin try repeat; st:=inputbox('Countnumber','Countnumber:',''); if st<>'' then begin x:=strtoint(st); st:=inputbox('New Countliste','New Countliste:',inttostr(Countliste[x])); Countliste[x]:=strtoint(st); end; until st=''; finally APA_Show_Process.Expertmode1.Checked:=false; end; end; if APA_Show_Process.GroupBox1.tag=1 then begin APA_Show_Process.GroupBox1.tag:=0; neuespalte:=true;//Geheimticker x:=lang+1;zahler:=0; repeat; if x>=0 then begin; zahler:=zahler+1; countliste[x]:=zahler; end; x:=x-1; until x=-1; end; if APA_Show_Process.GroupBox1.tag=-1 then begin APA_Show_Process.GroupBox1.tag:=0; //Geheimticker countliste[lang]:=0; lang:=lang-1; x:=lang;zahler:=0; repeat; if x>=0 then begin; zahler:=zahler+1; countliste[x]:=zahler; end; x:=x-1; until x=-1; - 368 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; until (neuespalte=true)or(stop=true)or(ende=true); if (alwaysspacemaxreached=true) and(Alwaysspacemaxbeachten1.Checked=true) then stop:=true; //wenn die letzten z.B. 5 Cubes in allen Kombinationen zu wenig Speicherplatz //hatten, gehen sich 6 Cubes auch nicht aus. Also Ende lang:=lang+1; until (ende=true)or(lang>=anzcube)or(stop=true); //Speichern des aktuellen Cubeliste damit man wieder weiter machen kann. //Speichern der aktuellen Position assignfile(fCounter,'c:\APADIR\DATA\Counter.dat'); {$i-} rewrite(fCounter); {$i+} if ioresult<>0 then showmessage('Can not open File Counter.dat'); try seek(fCounter,0); vCounter.Lfnr:=-1; if vcounter.nr=1 then if alwaysspacemaxreached=true then vcounter.Nr:=1 else vcounter.Nr:=0; write(fCounter,vCounter); for x:=0 to lang do begin seek(fCounter,x+1); vCounter.Lfnr:=x; vCounter.Nr:=Countliste[x]; write(fCounter,vCounter); end; finally CloseFile(fcounter); end; end;// Wenn es mindestens einen Cube gibt in der Cubeliste end;//with Apa_Application finally closeFile(fkosten); GeneriereReqListe.free; Showmessage('Ready'); APA_Grid.Enabled:=true; end; end; procedure TAPA_Grid.Options1Click(Sender: TObject); begin APA_Options.showmodal; end; procedure TAPA_Grid.ShowData1Click(Sender: TObject); var st:string; begin st:='Screenbez: '+APA[zellespalte,zellezeile].screenbez; st:=st+', Counthier:'+inttostr(APA[zellespalte,zellezeile].counthier)+', '; st:=st+'Countdim: '+inttostr(APA[zellespalte,zellezeile].countdimension)+', '; st:=st+'Weight: '+floattostr(APA[zellespalte,zellezeile].gewicht)+', '; st:=st+'Weightlevel: '+inttostr(APA[zellespalte,zellezeile].gewichtlevel)+', '; st:=st+'Matcount: '+inttostr(APA[zellespalte,zellezeile].matcount)+', '; showmessage(st); end; procedure TAPA_Grid.Button5Click(Sender: TObject); begin Panel3.Width:=1; end; procedure TAPA_Grid.AlgorithmKombination1Click(Sender: TObject); - 369 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN begin if permutation=false then begin Button4.click; end else begin APA_Dialog.APA_Text.Caption:='Your last deterministic run was a permutation. Do you want do continue? This will delete your last run!'; if APA_Dialog.showmodal=mryes then begin; Button4.Click; end; end; end; procedure TAPA_Grid.AlgorithmKombination2Click(Sender: TObject); begin Button4.Click; end; procedure TAPA_Grid.GetbuildBFT2Click(Sender: TObject); begin assignfile(fKosten,'C:\APADIR\DATA\Kosten.dat'); {$i-} reset(fKosten); {$i+} if ioresult<>0 then begin; showmessage('cost database error ');exit;end; try //Nur getbuild showmessage(floattostr(getbuild(-1,-1,zellespalte,zellezeile))); finally CloseFile(fKosten); end; end; procedure TAPA_Grid.GetbuildParent2Click(Sender: TObject); var buildcosts, merkecosts:Extended; var parentzeile,parentspalte:longint; var zeile,spalte:longint; begin assignfile(fKosten,'C:\APADIR\DATA\Kosten.dat'); {$i-} reset(fKosten); {$i+} if ioresult<>0 then begin; showmessage('cost database error ');exit;end; try //Nur getbuild merkecosts:=getbuild(-1,-1,zellespalte,zellezeile);;parentzeile:=-1;parentspalte:=-1; for zeile:=0 to anzzeilen-1 do begin for spalte:=0 to anzspalten-1 do begin if APA[spalte,zeile].materalisieren=true then begin if isderivat(spalte,zeile,zellespalte,zellezeile)=true then begin buildcosts:=getbuild(spalte,zeile,zellespalte,zellezeile); if (buildcosts<merkecosts) then begin merkecosts:=buildcosts; parentzeile:=zeile; parentspalte:=spalte; end; end; end; end;//Ende spalten end;//Ende zeilen showmessage('Build from ('+inttostr(parentspalte)+':'+inttostr(parentzeile)+') costs: '+floattostr(merkecosts)); finally CloseFile(fKosten); end; end; procedure TAPA_Grid.GetQueryBFT2Click(Sender: TObject); begin assignfile(fKosten,'C:\APADIR\DATA\Kosten.dat'); - 370 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN {$i-} reset(fKosten); {$i+} if ioresult<>0 then begin; showmessage('cost database error ');exit;end; try //Nur getquery showmessage(floattostr(getquery(-1,-1,zellespalte,zellezeile))); finally CloseFile(fKosten); end; end; procedure TAPA_Grid.GetQueryParent2Click(Sender: TObject); var querycosts, merkecosts:Extended; var parentzeile,parentspalte:longint; var zeile,spalte:longint; begin assignfile(fKosten,'C:\APADIR\DATA\Kosten.dat'); {$i-} reset(fKosten); {$i+} if ioresult<>0 then begin; showmessage('cost database error ');exit;end; try //Nur getquery merkecosts:=getquery(-1,-1,zellespalte,zellezeile);; parentzeile:=-1;parentspalte:=-1; for zeile:=0 to anzzeilen-1 do begin for spalte:=0 to anzspalten-1 do begin if APA[spalte,zeile].materalisieren=true then begin if isderivat(spalte,zeile,zellespalte,zellezeile)=true then begin querycosts:=getquery(spalte,zeile,zellespalte,zellezeile); if (querycosts<merkecosts) then begin merkecosts:=querycosts; parentzeile:=zeile; parentspalte:=spalte; end; end; end; end;//Ende spalten end;//Ende zeilen showmessage('Query from ('+inttostr(parentspalte)+':'+inttostr(parentzeile)+') costs: '+floattostr(merkecosts)); finally CloseFile(fKosten); end; end; procedure TAPA_Grid.GenerateCREATESQLStatements1Click(Sender: TObject); begin GenerateCREATESQLStatementsBFTanddimensiontables3Click(self); end; procedure TAPA_Grid.SearchusingThomasAchsheuristic1Click(Sender: TObject); begin Button2.click; end; procedure TAPA_Grid.Panel1DblClick(Sender: TObject); begin Panel1.PopupMenu:=privatmenu; end; procedure TAPA_Grid.Buildrandomcosts1Click(Sender: TObject); begin APA_Application.GeneriereZufallskosten1Click(self); end; procedure TAPA_Grid.Showrandomcosts1Click(Sender: TObject); begin APA_Showcosts.showmodal; end; - 371 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN procedure TAPA_Grid.Showcosts2Click(Sender: TObject); begin Showcosts1Click(self); end; procedure TAPA_Grid.ShowAnalyseWindow1Click(Sender: TObject); begin Showlistbox1Click(self); end; procedure TAPA_Grid.AnalyseAPA1Click(Sender: TObject); begin APA_Application.AnalyseAPA1Click(self); end; procedure TAPA_Grid.ShowAnalysewindow2Click(Sender: TObject); begin APA_Application.AnalyseAPA1Click(self); end; procedure TAPA_Grid.Showpossiblecubes1Click(Sender: TObject); var PossibleCubes:TStringList; var counter,aktzeile,aktspalte,count_of_derivates:longint; var zahler,derivspalte,derivzeile:longint; begin PossibleCubes:=TStringList.Create(); counter:=0; for aktzeile:=0 to anzzeilen-1 do begin for aktspalte:=0 to anzspalten-1 do begin if (APA[aktspalte,aktzeile].interessant=true)and (APA[aktspalte,aktzeile].farbe=clYellow) then begin//Auswählen des Würfels PossibleCubes.Add(auffuellen(inttostr(aktspalte),10)+auffuellen(inttostr(aktzeile) ,10)); counter:=counter+1; end;//of Auswählen des Würfels end;//of aktspalte end;//of aktzeile {1.b Setze Derivate zu} if tomohnederivate1.Checked=false then begin for aktzeile:=0 to anzzeilen-1 do begin for aktspalte:=0 to anzspalten-1 do begin if (APA[aktspalte,aktzeile].farbe=clYellow)and(APA[aktspalte,aktzeile].interessant=fa lse) then begin count_of_derivates:=0; for derivspalte:=0 to anzspalten-1 do begin; for derivzeile:=0 to anzzeilen-1 do begin; if (APA[derivspalte,derivzeile].interessant=true)and (APA[derivspalte,derivzeile].farbe=clYellow) then begin if isderivat(aktspalte,aktzeile,derivspalte,derivzeile) then begin //Jetzt kontrollieren wir, ob dieser Würfel auch noch ein Derivat eines anderen Würfels count_of_derivates:=count_of_derivates+1; end;//Ende von derivat end;//Ende von interessant end;//of derivzeile end;//of derivsspalte if count_of_derivates>=1 then begin PossibleCubes.Add(auffuellen(inttostr(aktspalte),10)+auffuellen(inttostr(aktzeile) ,10)); counter:=counter+1; end; end;//von Yellow - 372 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end;//aktspalte end;//aktzeile end; for zahler:=0 to PossibleCubes.count-1 do begin APA[strtoint(copy(PossibleCubes[zahler],1,10)),strtoint(copy(PossibleCubes[zahler],11,10 ))].flag:=1; end; APAGrid.Repaint; showmessage('Found '+inttostr(counter)+' possible cubes. '); Showpossiblecubes2.Visible:=false; Removepossiblecubes2.Visible:=true; end; procedure TAPA_Grid.Removepossiblecubes1Click(Sender: TObject); var aktzeile,aktspalte:longint; begin for aktzeile:=0 to anzzeilen-1 do begin for aktspalte:=0 to anzspalten-1 do begin APA[aktspalte,aktzeile].flag:=0; end; end; APAGrid.Repaint; Showpossiblecubes2.Visible:=true; Removepossiblecubes2.Visible:=false; end; procedure TAPA_Grid.Showpossiblecubes2Click(Sender: TObject); begin Showpossiblecubes1Click(self); end; procedure TAPA_Grid.Removepossiblecubes2Click(Sender: TObject); begin Removepossiblecubes1Click(self); end; procedure TAPA_Grid.Getmaterialisationspaceofcube1Click(Sender: TObject); begin showmessage('Space required: '+floattostr((strtofloat(APA_Parameter.APA_Thomas_avsizeoftupel.text)*gettupel(zel lespalte,zellezeile)))); end; procedure TAPA_Grid.ShowButtons1Click(Sender: TObject); begin Button1.Visible:=true; Button2.Visible:=true; Button3.Visible:=true; Button4.Visible:=true; end; procedure TAPA_Grid.GetbuildBFT1Click(Sender: TObject); begin //Nur delta showmessage('The Materialisation costs are '+floattostr(deltaBFTW(zellespalte,zellezeile,false))); end; procedure TAPA_Grid.GetqueryfromBFT1Click(Sender: TObject); begin //Nur delta showmessage('The Query costs are '+floattostr(deltaBFTW(zellespalte,zellezeile,true))); end; - 373 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN procedure TAPA_Grid.Getbuildfromparent1Click(Sender: TObject); var buildcosts, merkecosts:Extended; var parentzeile,parentspalte:longint; var zeile,spalte:longint; begin //Nur delta merkecosts:=deltaBFTW(zellespalte,zellezeile,false);parentzeile:=-1;parentspalte:=-1; for zeile:=0 to anzzeilen-1 do begin for spalte:=0 to anzspalten-1 do begin if APA[spalte,zeile].materalisieren=true then begin if isderivat(spalte,zeile,zellespalte,zellezeile)=true then begin buildcosts:=deltaVW(spalte,zeile,zellespalte,zellezeile,false); if (buildcosts<merkecosts) then begin merkecosts:=buildcosts; parentzeile:=zeile; parentspalte:=spalte; end; end; end; end;//Ende spalten end;//Ende zeilen showmessage('Build from ('+inttostr(parentspalte)+':'+inttostr(parentzeile)+') costs: '+floattostr(merkecosts)); end; procedure TAPA_Grid.Getqueryfromparent1Click(Sender: TObject); var querycosts, merkecosts:Extended; var parentzeile,parentspalte:longint; var zeile,spalte:longint; begin //Nur delta merkecosts:=deltaBFTW(zellespalte,zellezeile,true);; parentzeile:=-1;parentspalte:=-1; for zeile:=0 to anzzeilen-1 do begin for spalte:=0 to anzspalten-1 do begin if APA[spalte,zeile].materalisieren=true then begin if isderivat(spalte,zeile,zellespalte,zellezeile)=true then begin querycosts:=deltaVW(spalte,zeile,zellespalte,zellezeile,true); if (querycosts<merkecosts) then begin merkecosts:=querycosts; parentzeile:=zeile; parentspalte:=spalte; end; end; end; end;//Ende spalten end;//Ende zeilen showmessage('Query from ('+inttostr(parentspalte)+':'+inttostr(parentzeile)+') costs: '+floattostr(merkecosts)); end; procedure TAPA_Grid.ShowSetcalculatedcostsandlimitsleft1Click( Sender: TObject); var zeile,spalte, zahler:longint; var MatCubes,ReqCubes, MatCubesSorted:TStringList; var merkerandom:boolean; begin //Berechne die Kosten der aktuellen Materialsierung //auf der Basis der Zufallskosten if matcount>0 then begin Listbox1.Items.Add(''); Listbox1.Items.Add('Berechne Kosten'); Listbox1.Items.Add(''); ReqCubes:=TStringList.Create; ReqCubes.Clear; - 374 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN MatCubes:=TStringList.Create; MatCubes.Clear; MatCubesSorted:=TStringList.Create; MatCubesSorted.Clear; merkerandom:=Userandomcosts1.Checked; Userandomcosts1.Checked:=false; try //Lege alle nicht redundaten Cubes an, und vergib eine Nummer for zeile:=0 to anzzeilen-1 do begin for spalte:=0 to anzspalten-1 do begin if APA[spalte,zeile].farbe=clYellow then begin if APA[spalte,zeile].interessant=true then begin //Speichere Required Cubes //Merke dir die Required Cubes ReqCubes.Add(auffuellen(inttostr(spalte),10)+auffuellen(inttostr(zeile),10)); end; if APA[spalte,zeile].materalisieren=true then begin //Speichere Mat Cubes //Merke dir die MatCubes MatCubes.Add(auffuellen(inttostr(spalte),10)+auffuellen(inttostr(zeile),10));; end; end; end;//end of spalte end;//end of zeilen for zahler:=0 to MatCubes.count-1 do MatCubesSorted.Add('free'); for zahler:=0 to MatCubes.Count-1 do begin MatCubesSorted[APA[strtoint(copy(MatCubes[zahler],1,10)),strtoint(copy(MatCubes[zahler], 11,10))].matcount-1]:= MatCubes[zahler]; end; showmessage('Costs: '+floattostr(berechneKostenGesamt(MatCubesSorted,ReqCubes,false))+'; Time left: '+ floattostr(timeleft)+'; Space left: '+floattostr(spaceleft)); finally MatCubes.Free; ReqCubes.Free; MatCubesSorted.Free; Userandomcosts1.Checked:=merkerandom; end; end //of matcount else showmessage('No materialized cubes selected'); end; procedure TAPA_Grid.Restrictedcosts1Click(Sender: TObject); begin APA_Application.Restrictedcosts1.Checked:=APA_Grid.Restrictedcosts1.Checked; end; procedure TAPA_Grid.Showdeterministicsolution2Click(Sender: TObject); begin Showdeterministicsolution1Click(self); end; procedure TAPA_Grid.Showdeterministicsolution1Click(Sender: TObject); var countcube,pos:longint; var SolutionList:TStringList; begin - 375 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN assignfile(fCountermerk,'c:\APADIR\DATA\Countermerk.dat'); {$i-} reset(fCountermerk); {$i+} if ioresult<>0 then showmessage('Can not open File Countermerk.dat'); try if filesize(fCountermerk)>0 then begin SolutionList:=TStringList.Create(); assignfile(fKosten,'C:\APADIR\DATA\Kosten.dat'); {$i-} reset(fKosten); {$i+} if ioresult<>0 then begin; showmessage('cost database error ');exit;end; assignfile(fCubes,'C:\APADIR\DATA\Cubes.dat'); {$i-} reset(fCubes); {$i+} if ioresult<>0 then showmessage('Can not open File Cubes.dat'); try pos:=0; repeat; if filesize(fcountermerk)>0 then begin seek(fCountermerk,pos); read(fCountermerk,vCountermerk); seek(fCubes,round(vCountermerk.nr)-1); read(fCubes,vCubes); SolutionList.Add(auffuellen(inttostr(vCubes.Spalte),10)+auffuellen(inttostr(vCubes .Zeile),10)); end; pos:=pos+1; until pos=filesize(fCountermerk); SolutionList:=GetRightOrdertom(SolutionList); for countcube:=0 to SolutionList.Count-1 do begin APA[strtoint(copy(SolutionList[countcube],1,10)),strtoint(copy(SolutionList[countc ube],11,10))].flag:=(2+((countcube+1)/10000)) end; Showdeterministicsolution2.Visible:=false; Removedeterministicsolution2.Visible:=true; APAGrid.Repaint; finally CloseFile(fKosten); CloseFile(fCubes); SolutionList.Free; end; end else showmessage('No solution found'); finally CloseFile(fCountermerk); end; end; procedure TAPA_Grid.Removedeterministicsolution1Click(Sender: TObject); var zeile,spalte:longint; begin for spalte:=0 to anzspalten-1 do begin for zeile:=0 to anzzeilen-1 do begin if (APA[spalte,zeile].flag>=2)and(APA[spalte,zeile].flag<3) then begin APA[spalte,zeile].flag:=0; end; - 376 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; end; Showdeterministicsolution2.Visible:=true; Removedeterministicsolution2.Visible:=false; APAGrid.Repaint; end; procedure TAPA_Grid.Removedeterministicsolution2Click(Sender: TObject); begin Removedeterministicsolution1Click(self); end; procedure TAPA_Grid.GenerateCREATESQLStatementsBFTanddimensiontables3Click( Sender: TObject); var counter, counter2:longint; var Fieldnamemerk ,Fieldtypemerk:string; begin //Generiere BFT Table und Dimension Tables APA_Sql.Sqltext.lines.Clear; //1. Generiere Dimension Tables for counter:=0 to anzd-1 do begin//Counter für Dimensionen APA_Sql.Sqltext.lines.add('if exists (select * from dbo.sysobjects where id = object_id(N''[dbo].[FK_BFT_'+dimbez[counter]+'_table]'')'); APA_Sql.Sqltext.lines.add(' and OBJECTPROPERTY(id, N''IsForeignKey'') = 1)'); APA_Sql.Sqltext.lines.add('ALTER TABLE [dbo].[BFT] DROP CONSTRAINT FK_BFT_'+dimbez[counter]+'_table'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('if exists (select * from dbo.sysobjects where id = object_id(N''[dbo].['+dimbez[counter]+'_table]'') and OBJECTPROPERTY(id, N''IsUserTable'') = 1)'); APA_Sql.Sqltext.lines.add('drop table [dbo].['+dimbez[counter]+'_table]'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('CREATE TABLE [dbo].['+dimbez[counter]+'_table] ('); APA_Sql.Sqltext.lines.add(' ['+dimbez[counter]+'_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL ,'); for counter2:=0 to anzh[counter]-1 do begin//Counter für Hierarchiestufen APA_Sql.Sqltext.lines.add(' ['+dk[counter,counter2]+'] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL ,'); APA_Sql.Sqltext.lines.add(' ['+dk[counter,counter2]+'_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL ,'); end;//Counter für Hierarchiestufen APA_Sql.Sqltext.lines.add(' [level] [bigint] NOT NULL'); APA_Sql.Sqltext.lines.add(') ON [PRIMARY]'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('ALTER TABLE [dbo].['+dimbez[counter]+'_table] WITH NOCHECK ADD'); APA_Sql.Sqltext.lines.add(' CONSTRAINT [PK_'+dimbez[counter]+'_table] PRIMARY KEY CLUSTERED'); APA_Sql.Sqltext.lines.add(' ('); APA_Sql.Sqltext.lines.add(' ['+dimbez[counter]+'_id]'); APA_Sql.Sqltext.lines.add(' ) ON [PRIMARY]'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); end;//Counter für Dimensionen Ende //2. Generiere BFT Table APA_Sql.Sqltext.lines.add('if exists (select * from dbo.sysobjects where id = object_id(N''[dbo].[BFT]'')'); APA_Sql.Sqltext.lines.add('and OBJECTPROPERTY(id, N''IsUserTable'') = 1)'); APA_Sql.Sqltext.lines.add('drop table [dbo].[BFT]'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('CREATE TABLE [dbo].[BFT] ('); for counter:=0 to anzd-1 do begin - 377 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APA_Sql.Sqltext.lines.add(' ['+dimbez[counter]+'_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL ,'); end; for counter:=0 to APA_Input_Screen.Keybox.Items.Count-1 do begin Fieldnamemerk:= copy(APA_Input_Screen.Keybox.items[counter],1,pos('//',APA_Input_Screen.Keybox.ite ms[counter])-1); Fieldtypemerk:= APA_Insert_Key.APA_Field_type.Items[APA_Insert_Key.APA_Field_type.Items.IndexOf(co py(APA_Input_Screen.Keybox.items[counter],pos('//',APA_Input_Screen.Keybox.items[c ounter])+6, length(APA_Input_Screen.Keybox.items[counter])(pos('//',APA_Input_Screen.Keybox.items[counter])+6)))]; APA_Sql.Sqltext.lines.add(' end; ['+Fieldnamemerk+'] ['+Fieldtypemerk+'] NOT NULL ,'); //Beistrich entfernen APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1]:= copy(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1],1, length(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1])-1); APA_Sql.Sqltext.lines.add(') ON [PRIMARY]'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('ALTER TABLE [dbo].[BFT] WITH NOCHECK ADD'); APA_Sql.Sqltext.lines.add(' CONSTRAINT [PK_BFT] PRIMARY KEY CLUSTERED'); APA_Sql.Sqltext.lines.add(' ('); for counter:=0 to anzd-1 do begin APA_Sql.Sqltext.lines.add(' ['+dimbez[counter]+'_id],'); end; //Beistrich entfernen APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1]:= copy(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1],1, length(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1])-1); APA_Sql.Sqltext.lines.add(' ) ON [PRIMARY]'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); //3. Zusetzen der FK Schlüssel for counter:=0 to anzd-1 do begin APA_Sql.Sqltext.lines.add('ALTER TABLE [dbo].[BFT] ADD'); APA_Sql.Sqltext.lines.add(' CONSTRAINT [FK_BFT_'+dimbez[counter]+'_table] FOREIGN KEY'); APA_Sql.Sqltext.lines.add(' ('); APA_Sql.Sqltext.lines.add(' ['+dimbez[counter]+'_id]'); APA_Sql.Sqltext.lines.add(' ) REFERENCES [dbo].['+dimbez[counter]+'_table] ('); APA_Sql.Sqltext.lines.add(' ['+dimbez[counter]+'_id]'); APA_Sql.Sqltext.lines.add(' ) ON UPDATE CASCADE '); APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); end; //of counter APA_Sql.Show; end; procedure TAPA_Grid.GenerateCREATESQLStatementsformaterializedcubes2Click( Sender: TObject); var spalte,zeile,zahler:longint; var tablename:string; var counter:longint; var Fieldnamemerk ,Fieldtypemerk:string; var foundcube:boolean; begin - 378 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN {1. Für alle materialisierten Würfel} APA_Sql.Sqltext.lines.Clear; foundcube:=false; for spalte:=0 to anzspalten-1 do begin for zeile:=0 to anzzeilen-1 do begin if APA[spalte,zeile].materalisieren=true then begin tablename:='';foundcube:=true; for zahler:=0 to anzd-1 do begin tablename:=tablename+dk[zahler,APA[spalte,zeile].hierstufe[zahler]]; end; APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('if exists (select * from dbo.sysobjects where '); APA_Sql.Sqltext.lines.add('id = object_id(N''[dbo].[FT '+tablename+']'') and OBJECTPROPERTY(id, N''IsUserTable'') = 1)'); APA_Sql.Sqltext.lines.add('drop table [dbo].[FT '+tablename+']'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('CREATE TABLE [dbo].[FT '+tablename+'] ( '); for zahler:=0 to anzd-1 do begin if (anzh[zahler]-1<>APA[spalte,zeile].hierstufe[zahler]) then APA_Sql.Sqltext.lines.add(' ['+dk[zahler,APA[spalte,zeile].hierstufe[zahler]]+'] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL ,'); end; for counter:=0 to APA_Input_Screen.Keybox.Items.Count-1 do begin Fieldnamemerk:= copy(APA_Input_Screen.Keybox.items[counter],1,pos('//',APA_Input_Screen.Keybox.ite ms[counter])-1); Fieldtypemerk:= APA_Insert_Key.APA_Field_type.Items[APA_Insert_Key.APA_Field_type.Items.IndexOf(co py(APA_Input_Screen.Keybox.items[counter],pos('//',APA_Input_Screen.Keybox.items[c ounter])+6, length(APA_Input_Screen.Keybox.items[counter])(pos('//',APA_Input_Screen.Keybox.items[counter])+6)))]; APA_Sql.Sqltext.lines.add(' end; ['+Fieldnamemerk+'] ['+Fieldtypemerk+'] NOT NULL ,'); //Beistrich entfernen APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1]:= copy(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1],1, length(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1])-1); APA_Sql.Sqltext.lines.add(') ON [PRIMARY]'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('ALTER TABLE [dbo].[FT '+tablename+'] WITH NOCHECK ADD'); APA_Sql.Sqltext.lines.add(' CONSTRAINT [PK_FT '+tablename+'] PRIMARY KEY CLUSTERED'); APA_Sql.Sqltext.lines.add(' ( '); for zahler:=0 to anzd-1 do begin if (anzh[zahler]-1<>APA[spalte,zeile].hierstufe[zahler]) then APA_Sql.Sqltext.lines.add(' ['+dk[zahler,APA[spalte,zeile].hierstufe[zahler]]+'] ,'); end; //Beistrich entfernen APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1]:= copy(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1],1, length(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1])-1); APA_Sql.Sqltext.lines.add(' ) ON [PRIMARY]'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); end; //End Materialisieren end;// End Zeile end;//End Spalte if foundcube=true then APA_Sql.Show - 379 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN else showmessage('No materialized cube found!'); end; procedure TAPA_Grid.GenerateCREATESQLStatementsBFTanddimensiontables2Click( Sender: TObject); var counter, counter2:longint; var Fieldnamemerk ,Fieldtypemerk:string; begin //Generiere BFT Table und Dimension Tables APA_Sql.Sqltext.lines.Clear; //1. Generiere Dimension Tables for counter:=0 to anzd-1 do begin//Counter für Dimensionen APA_Sql.Sqltext.lines.add('if exists (select * from dbo.sysobjects where id = object_id(N''[dbo].[FK_BFT_'+dimbez[counter]+'_table]'')'); APA_Sql.Sqltext.lines.add(' and OBJECTPROPERTY(id, N''IsForeignKey'') = 1)'); APA_Sql.Sqltext.lines.add('ALTER TABLE [dbo].[BFT] DROP CONSTRAINT FK_BFT_'+dimbez[counter]+'_table'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('if exists (select * from dbo.sysobjects where id = object_id(N''[dbo].['+dimbez[counter]+'_table]'') and OBJECTPROPERTY(id, N''IsUserTable'') = 1)'); APA_Sql.Sqltext.lines.add('drop table [dbo].['+dimbez[counter]+'_table]'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('CREATE TABLE [dbo].['+dimbez[counter]+'_table] ('); //Primärschlüssel APA_Sql.Sqltext.lines.add(' ['+dimbez[counter]+'_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL ,'); for counter2:=0 to anzh[counter]-1 do begin//Counter für Hierarchiestufen APA_Sql.Sqltext.lines.add(' ['+dk[counter,counter2]+'] [varchar] (12) COLLATE Latin1_General_CI_AS NOT NULL ,'); APA_Sql.Sqltext.lines.add(' ['+dk[counter,counter2]+'_desc] [varchar] (40) COLLATE Latin1_General_CI_AS NOT NULL ,'); end;//Counter für Hierarchiestufen APA_Sql.Sqltext.lines.add(') ON [PRIMARY]'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('ALTER TABLE [dbo].['+dimbez[counter]+'_table] WITH NOCHECK ADD'); APA_Sql.Sqltext.lines.add(' CONSTRAINT [PK_'+dimbez[counter]+'_table] PRIMARY KEY CLUSTERED'); APA_Sql.Sqltext.lines.add(' ('); APA_Sql.Sqltext.lines.add(' ['+dimbez[counter]+'_id]'); APA_Sql.Sqltext.lines.add(' ) ON [PRIMARY]'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); for counter2:=0 to anzh[counter]-1 do begin APA_Sql.Sqltext.lines.add(' CREATE INDEX [IX_'+dk[counter,counter2]+'] ON [dbo].['+dimbez[counter]+'_table](['+dk[counter,counter2]+']) ON [PRIMARY]'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); end; end;//Counter für Dimensionen Ende //2. Generiere BFT Table APA_Sql.Sqltext.lines.add('if exists (select * from dbo.sysobjects where id = object_id(N''[dbo].[BFT]'')'); APA_Sql.Sqltext.lines.add('and OBJECTPROPERTY(id, N''IsUserTable'') = 1)'); APA_Sql.Sqltext.lines.add('drop table [dbo].[BFT]'); - 380 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('CREATE TABLE [dbo].[BFT] ('); for counter:=0 to anzd-1 do begin APA_Sql.Sqltext.lines.add(' ['+dimbez[counter]+'_id] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL ,'); end; for counter:=0 to APA_Input_Screen.Keybox.Items.Count-1 do begin Fieldnamemerk:= copy(APA_Input_Screen.Keybox.items[counter],1,pos('//',APA_Input_Screen.Keybox.ite ms[counter])-1); Fieldtypemerk:= APA_Insert_Key.APA_Field_type.Items[APA_Insert_Key.APA_Field_type.Items.IndexOf(co py(APA_Input_Screen.Keybox.items[counter],pos('//',APA_Input_Screen.Keybox.items[c ounter])+6, length(APA_Input_Screen.Keybox.items[counter])(pos('//',APA_Input_Screen.Keybox.items[counter])+6)))]; APA_Sql.Sqltext.lines.add(' end; ['+Fieldnamemerk+'] ['+Fieldtypemerk+'] NOT NULL ,'); //Beistrich entfernen APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1]:= copy(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1],1, length(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1])-1); APA_Sql.Sqltext.lines.add(') ON [PRIMARY]'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('ALTER TABLE [dbo].[BFT] WITH NOCHECK ADD'); APA_Sql.Sqltext.lines.add(' CONSTRAINT [PK_BFT] PRIMARY KEY CLUSTERED'); APA_Sql.Sqltext.lines.add(' ('); for counter:=0 to anzd-1 do begin APA_Sql.Sqltext.lines.add(' ['+dimbez[counter]+'_id],'); end; //Beistrich entfernen APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1]:= copy(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1],1, length(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1])-1); APA_Sql.Sqltext.lines.add(' ) ON [PRIMARY]'); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); //3. Zusetzen der FK Schlüssel for counter:=0 to anzd-1 do begin APA_Sql.Sqltext.lines.add('ALTER TABLE [dbo].[BFT] ADD'); APA_Sql.Sqltext.lines.add(' CONSTRAINT [FK_BFT_'+dimbez[counter]+'_table] FOREIGN KEY'); APA_Sql.Sqltext.lines.add(' ('); APA_Sql.Sqltext.lines.add(' ['+dimbez[counter]+'_id]'); APA_Sql.Sqltext.lines.add(' ) REFERENCES [dbo].['+dimbez[counter]+'_table] ('); APA_Sql.Sqltext.lines.add(' ['+dimbez[counter]+'_id]'); APA_Sql.Sqltext.lines.add(' ) ON UPDATE CASCADE '); APA_Sql.Sqltext.lines.add(''); APA_Sql.Sqltext.lines.add('GO'); APA_Sql.Sqltext.lines.add(''); end; //of counter APA_Sql.Show; end; procedure TAPA_Grid.GenerateCREATESQLStatementsBFTanddimensiontables1Click( Sender: TObject); begin GenerateCREATESQLStatementsBFTanddimensiontables2Click(self); - 381 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; procedure TAPA_Grid.GenerateCREATESQLStatementsformaterializedcubes1Click( Sender: TObject); begin GenerateCREATESQLStatementsformaterializedcubes2Click(self); end; procedure TAPA_Grid.APAGridMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin zellespalte:=-1; zellezeile:=-1; end; procedure TAPA_Grid.HelpforAPAGridScreen1Click(Sender: TObject); begin APA_Help.show; APA_Help.APABrowser.Navigate('C:\APADIR\Help\APA_Grid.htm'); end; procedure TAPA_Grid.HelpforAPAProgram1Click(Sender: TObject); begin APA_Help.show; APA_Help.APABrowser.Navigate('C:\APADIR\Help\index.htm'); end; procedure TAPA_Grid.factconstellationschema1Click(Sender: TObject); var aktspalte,aktzeile,parentzeile,parentspalte, counter:longint; var merkcosts, bestmerkcosts:Extended; var sumdimension:array of longint; var tablename:string; var nix, gleich:boolean; begin assignfile(fKosten,'C:\APADIR\DATA\Kosten.dat'); {$i-} reset(fKosten); {$i+} if ioresult<>0 then begin; showmessage('cost database error ');exit;end; try {1. Finden den Cube oder den BFT aus welchem abgefragt wird} parentzeile:=-1;parentspalte:=-1;// Kann immer aus dem BFT abgeleitet werden if (Userandomcosts1.Checked=true) then begin bestmerkcosts:=getquery(-1,-1,zellespalte,zellezeile); end else begin bestmerkcosts:=deltaBftW(zellespalte,zellezeile,true); end; for aktzeile:=0 to anzzeilen-1 do begin for aktspalte:=0 to anzspalten-1 do begin if APA[aktspalte,aktzeile].materalisieren=true then begin if isderivat(aktspalte,aktzeile,zellespalte,zellezeile)=true then begin if (Userandomcosts1.Checked=true) then begin merkcosts:=getquery(aktspalte,aktzeile,zellespalte,zellezeile); end else begin merkcosts:=deltaVW(aktspalte,aktzeile,zellespalte,zellezeile,true); end; if merkcosts<bestmerkcosts then begin parentzeile:=aktzeile;parentspalte:=aktspalte; bestmerkcosts:=merkcosts; end; //merkcosts<bestmerkcosts end; //isderivat end; //materialisiert end;//aktspalte end;//altzeile {2. Erzeuge die SQL Statements} - 382 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN {2.1. Finde die Dimensionen welche aggregiert werden müssen} sumdimension:=nil; setlength(sumdimension,anzd); for counter:=0 to anzd-1 do sumdimension[counter]:=-1; for counter:=0 to anzd-1 do begin if (APA[zellespalte,zellezeile].hierstufe[counter]<>anzh[counter]-1) then begin sumdimension[counter]:=APA[zellespalte,zellezeile].hierstufe[counter]; end; end; APA_Sql.Sqltext.lines.Clear; if parentspalte=-1 then begin APA_Sql.Sqltext.lines.add('SELECT '); for counter:=0 to anzd-1 do begin if sumdimension[counter]<>-1 then begin //Feld aus dem Dimension table APA_Sql.Sqltext.lines.add(' dbo.['+dimbez[counter]+'_table].['+dk[counter,APA[zellespalte,zellezeile].hierstuf e[counter]]+'],'); end; end; for counter:=0 to APA_Input_Screen.Keybox.Items.Count-1 do begin APA_Sql.Sqltext.lines.add(copy(APA_Input_Screen.Keybox.items[counter],pos('//',APA _Input_Screen.Keybox.items[counter])+2,3)+'(['+ copy(APA_Input_Screen.Keybox.items[counter],1,pos('//',APA_Input_Screen.Keybox.ite ms[counter])-1)+'])'+ ' AS ['+copy(APA_Input_Screen.Keybox.items[counter],1,pos('//',APA_Input_Screen.Keybox. items[counter])-1)+'],'); end; //Beistrich entfernen APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1]:= copy(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1],1, length(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1])-1); APA_Sql.Sqltext.lines.add('FROM dbo.BFT'); for counter:=0 to anzd-1 do begin if sumdimension[counter]<>-1 then begin //Feld aus dem Dimension table APA_Sql.Sqltext.lines.add(' INNER JOIN dbo.['+dimbez[counter]+'_table] ON dbo.BFT.['+dimbez[counter]+'_id]='); APA_Sql.Sqltext.lines.add(' dbo.['+dimbez[counter]+'_table].['+dimbez[counter]+'_id]'); end; end; APA_Sql.Sqltext.lines.add('GROUP BY '); for counter:=0 to anzd-1 do begin if sumdimension[counter]<>-1 then begin //Feld aus dem Dimension table APA_Sql.Sqltext.lines.add(' dbo.['+dimbez[counter]+'_table].['+dk[counter,APA[zellespalte,zellezeile].hierstuf e[counter]]+'],'); end; end; //Beistrich entfernen APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1]:= copy(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1],1, length(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1])-1); end else begin //Abfrage aus dem aggregierten Cube - 383 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN tablename:='';nix:=true; for counter:=0 to anzd-1 do begin tablename:=tablename+dk[counter,APA[parentspalte,parentzeile].hierstufe[counter]]; end; gleich:=true; for counter:=0 to anzd-1 do begin if (APA[zellespalte,zellezeile].hierstufe[counter]> APA[parentspalte,parentzeile].hierstufe[counter]) and(APA[zellespalte,zellezeile].hierstufe[counter]<>anzh[counter]-1) then begin sumdimension[counter]:=APA[zellespalte,zellezeile].hierstufe[counter]; end; if (APA[zellespalte,zellezeile].hierstufe[counter]<>APA[parentspalte,parentzeile].hie rstufe[counter]) then gleich:=false; end; APA_Sql.Sqltext.lines.add('SELECT '); if gleich=false then begin for counter:=0 to anzd-1 do begin if sumdimension[counter]<>-1 then begin //Feld aus dem Dimension table if (anzh[counter]-1<>APA[zellespalte,zellezeile].hierstufe[counter]) then begin; APA_Sql.Sqltext.lines.add(' dbo.['+dimbez[counter]+'_table].['+dk[counter,APA[zellespalte,zellezeile].hierstuf e[counter]]+'],'); nix:=false; end; end else begin //Feld aus dem Abfrage Table if (anzh[counter]-1<>APA[zellespalte,zellezeile].hierstufe[counter]) then begin; APA_Sql.Sqltext.lines.add(' dbo.['+tablename+'].['+dk[counter,APA[zellespalte,zellezeile].hierstufe[counter]]+ '],'); nix:=false; end; end; end; for counter:=0 to APA_Input_Screen.Keybox.Items.Count-1 do begin APA_Sql.Sqltext.lines.add(copy(APA_Input_Screen.Keybox.items[counter],pos('//',APA _Input_Screen.Keybox.items[counter])+2,3)+'(['+ copy(APA_Input_Screen.Keybox.items[counter],1,pos('//',APA_Input_Screen.Keybox.ite ms[counter])-1)+'])'+ ' AS ['+copy(APA_Input_Screen.Keybox.items[counter],1,pos('//',APA_Input_Screen.Keybox. items[counter])-1)+'],'); end; //Beistrich entfernen APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1]:= copy(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1],1, length(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1])-1); end // von gleich else APA_Sql.Sqltext.lines.add('*'); APA_Sql.Sqltext.lines.add('FROM dbo.['+tablename+']'); if gleich=false then begin for counter:=0 to anzd-1 do begin if sumdimension[counter]<>-1 then begin //Feld aus dem Dimension table if (anzh[counter]-1<>APA[zellespalte,zellezeile].hierstufe[counter]) then begin APA_Sql.Sqltext.lines.add(' INNER JOIN dbo.['+dimbez[counter]+'_table] ON dbo.['+tablename+'].['+dk[counter,APA[parentspalte,parentzeile].hierstufe[counter] ]+']='); - 384 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APA_Sql.Sqltext.lines.add(' dbo.['+dimbez[counter]+'_table].['+dk[counter,APA[parentspalte,parentzeile].hierst ufe[counter]]+']'); end; end; end; if nix=false then APA_Sql.Sqltext.lines.add('GROUP BY '); for counter:=0 to anzd-1 do begin if sumdimension[counter]<>-1 then begin //Feld aus dem Dimension table if (anzh[counter]-1<>APA[zellespalte,zellezeile].hierstufe[counter]) then APA_Sql.Sqltext.lines.add(' dbo.['+dimbez[counter]+'_table].['+dk[counter,APA[zellespalte,zellezeile].hierstuf e[counter]]+'],'); end else begin //Feld aus dem BFT Table if (anzh[counter]-1<>APA[zellespalte,zellezeile].hierstufe[counter]) then APA_Sql.Sqltext.lines.add(' dbo.['+tablename+'].['+dk[counter,APA[zellespalte,zellezeile].hierstufe[counter]]+ '],'); end; end; //Beistrich entfernen APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1]:= copy(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1],1, length(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1])-1); end; // von gleich end; finally CloseFile(fKosten); end; APA_Sql.Show; end; procedure TAPA_Grid.starschema1Click(Sender: TObject); var aktspalte,aktzeile,parentzeile,parentspalte, counter:longint; var merkcosts, bestmerkcosts:Extended; var sumdimension:array of longint; begin assignfile(fKosten,'C:\APADIR\DATA\Kosten.dat'); {$i-} reset(fKosten); {$i+} if ioresult<>0 then begin; showmessage('cost database error ');exit;end; try {1. Finden den Cube oder den BFT aus welchem abgefragt wird} parentzeile:=-1;parentspalte:=-1;// Kann immer aus dem BFT abgeleitet werden if (Userandomcosts1.Checked=true) then begin bestmerkcosts:=getquery(-1,-1,zellespalte,zellezeile); end else begin bestmerkcosts:=deltaBftW(zellespalte,zellezeile,true); end; for aktzeile:=0 to anzzeilen-1 do begin for aktspalte:=0 to anzspalten-1 do begin if APA[aktspalte,aktzeile].materalisieren=true then begin if isderivat(aktspalte,aktzeile,zellespalte,zellezeile)=true then begin if (Userandomcosts1.Checked=true) then begin merkcosts:=getquery(aktspalte,aktzeile,zellespalte,zellezeile); end else begin merkcosts:=deltaVW(aktspalte,aktzeile,zellespalte,zellezeile,true); end; - 385 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if merkcosts<bestmerkcosts then begin parentzeile:=aktzeile;parentspalte:=aktspalte; bestmerkcosts:=merkcosts; end; //merkcosts<bestmerkcosts end; //isderivat end; //materialisiert end;//aktspalte end;//altzeile {2. Erzeuge die SQL Statements} {2.1. Finde die Dimensionen welche aggregiert werden müssen} sumdimension:=nil; setlength(sumdimension,anzd); for counter:=0 to anzd-1 do sumdimension[counter]:=-1; for counter:=0 to anzd-1 do begin if (APA[zellespalte,zellezeile].hierstufe[counter]<>anzh[counter]-1) then begin sumdimension[counter]:=APA[zellespalte,zellezeile].hierstufe[counter]; end; end; APA_Sql.Sqltext.lines.Clear; if parentspalte=-1 then begin APA_Sql.Sqltext.lines.add('SELECT '); for counter:=0 to anzd-1 do begin if sumdimension[counter]<>-1 then begin //Feld aus dem Dimension table APA_Sql.Sqltext.lines.add(' dbo.['+dimbez[counter]+'_table].['+dk[counter,APA[zellespalte,zellezeile].hierstuf e[counter]]+'],'); end; end; for counter:=0 to APA_Input_Screen.Keybox.Items.Count-1 do begin APA_Sql.Sqltext.lines.add(copy(APA_Input_Screen.Keybox.items[counter],pos('//',APA _Input_Screen.Keybox.items[counter])+2,3)+'(['+ copy(APA_Input_Screen.Keybox.items[counter],1,pos('//',APA_Input_Screen.Keybox.ite ms[counter])-1)+'])'+ ' AS ['+copy(APA_Input_Screen.Keybox.items[counter],1,pos('//',APA_Input_Screen.Keybox. items[counter])-1)+'],'); end; //Beistrich entfernen APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1]:= copy(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1],1, length(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1])-1); APA_Sql.Sqltext.lines.add('FROM dbo.BFT'); for counter:=0 to anzd-1 do begin //Feld aus dem Dimension table APA_Sql.Sqltext.lines.add(' INNER JOIN dbo.['+dimbez[counter]+'_table] ON dbo.BFT.['+dimbez[counter]+'_id]='); APA_Sql.Sqltext.lines.add(' dbo.['+dimbez[counter]+'_table].['+dimbez[counter]+'_id]'); end; APA_Sql.Sqltext.lines.add('WHERE '); for counter:=0 to anzd-1 do begin //Feld aus dem Dimension table if counter<>0 then APA_Sql.Sqltext.lines.add(' AND '); APA_Sql.Sqltext.lines.add(' (dbo.['+dimbez[counter]+'_table].[level]=0)'); end; APA_Sql.Sqltext.lines.add('GROUP BY '); for counter:=0 to anzd-1 do begin - 386 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if sumdimension[counter]<>-1 then begin //Feld aus dem Dimension table APA_Sql.Sqltext.lines.add(' dbo.['+dimbez[counter]+'_table].['+dk[counter,APA[zellespalte,zellezeile].hierstuf e[counter]]+'],'); end; end; //Beistrich entfernen APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1]:= copy(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1],1, length(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1])-1); end else begin //Abfrage aus dem aggregierten Cube APA_Sql.Sqltext.lines.add('SELECT '); for counter:=0 to anzd-1 do begin if sumdimension[counter]<>-1 then begin //Feld aus dem Dimension table APA_Sql.Sqltext.lines.add(' dbo.['+dimbez[counter]+'_table].['+dk[counter,APA[zellespalte,zellezeile].hierstuf e[counter]]+'],'); end; end; for counter:=0 to APA_Input_Screen.Keybox.Items.Count-1 do begin APA_Sql.Sqltext.lines.add(copy(APA_Input_Screen.Keybox.items[counter],pos('//',APA _Input_Screen.Keybox.items[counter])+2,3)+'(['+ copy(APA_Input_Screen.Keybox.items[counter],1,pos('//',APA_Input_Screen.Keybox.ite ms[counter])-1)+'])'+ ' AS ['+copy(APA_Input_Screen.Keybox.items[counter],1,pos('//',APA_Input_Screen.Keybox. items[counter])-1)+'],'); end; //Beistrich entfernen APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1]:= copy(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1],1, length(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1])-1); APA_Sql.Sqltext.lines.add('FROM dbo.BFT'); for counter:=0 to anzd-1 do begin //Feld aus dem Dimension table APA_Sql.Sqltext.lines.add(' INNER JOIN dbo.['+dimbez[counter]+'_table] ON dbo.BFT.['+dimbez[counter]+'_id]='); APA_Sql.Sqltext.lines.add(' dbo.['+dimbez[counter]+'_table].['+dimbez[counter]+'_id]'); end; APA_Sql.Sqltext.lines.add('WHERE '); for counter:=0 to anzd-1 do begin //Feld aus dem Dimension table if counter<>0 then APA_Sql.Sqltext.lines.add(' AND '); APA_Sql.Sqltext.lines.add(' (dbo.['+dimbez[counter]+'_table].[level]=' +inttostr(APA[parentspalte,parentzeile].hierstufe[counter])+')'); end; APA_Sql.Sqltext.lines.add('GROUP BY '); for counter:=0 to anzd-1 do begin if sumdimension[counter]<>-1 then begin //Feld aus dem Dimension table APA_Sql.Sqltext.lines.add(' dbo.['+dimbez[counter]+'_table].['+dk[counter,APA[zellespalte,zellezeile].hierstuf e[counter]]+'],'); end; end; - 387 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN //Beistrich entfernen APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1]:= copy(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1],1, length(APA_Sql.Sqltext.lines[APA_Sql.Sqltext.lines.count-1])-1); end; finally CloseFile(fKosten); end; APA_Sql.Show; end; end. 12.1.10 UNIT APA_HELPUNIT.DFM object APA_Help: TAPA_Help Left = 220 Top = 114 Width = 696 Height = 480 Caption = 'APA Help' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Position = poScreenCenter WindowState = wsMaximized PixelsPerInch = 96 TextHeight = 13 object APABrowser: TWebBrowser Left = 0 Top = 41 Width = 688 Height = 364 Align = alClient TabOrder = 0 ControlData = { 4C0000001B4700009F2500000000000000000000000000000000000000000000 000000004C000000000000000000000001000000E0D057007335CF11AE690800 2B2E126208000000000000004C0000000114020000000000C000000000000046 8000000000000000000000000000000000000000000000000000000000000000 00000000000000000100000000000000000000000000000000000000} end object Panel2: TPanel Left = 0 Top = 405 Width = 688 Height = 41 Align = alBottom TabOrder = 1 object Button1: TButton Left = 16 Top = 8 Width = 75 Height = 25 Cancel = True Caption = 'Close' TabOrder = 0 OnClick = Button1Click end end object Panel1: TPanel Left = 0 Top = 0 - 388 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Width = 688 Height = 41 Align = alTop TabOrder = 2 object Button2: TButton Left = 16 Top = 8 Width = 75 Height = 25 Caption = 'Back' TabOrder = 0 OnClick = Button2Click end object Button3: TButton Left = 104 Top = 8 Width = 75 Height = 25 Caption = 'Forward' TabOrder = 1 OnClick = Button3Click end end end 12.1.11 UNIT APA_HELPUNIT.PAS unit APA_Helpunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, OleCtrls, SHDocVw; type TAPA_Help = class(TForm) APABrowser: TWebBrowser; Panel2: TPanel; Button1: TButton; Panel1: TPanel; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var APA_Help: TAPA_Help; implementation {$R *.dfm} procedure TAPA_Help.Button1Click(Sender: TObject); begin Close; end; procedure TAPA_Help.Button2Click(Sender: TObject); begin try APABrowser.GoBack; except showmessage('Not Possible'); end; - 389 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; procedure TAPA_Help.Button3Click(Sender: TObject); begin try APABrowser.GoForward; except showmessage('Not Possible'); end; end; end. 12.1.12 UNIT APA_INPUT_DIMENSIONUNIT.DFM object APA_Insert_Dimension: TAPA_Insert_Dimension Left = 297 Top = 234 ActiveControl = Dimension BorderStyle = bsDialog Caption = 'APA_Insert_Dimension' ClientHeight = 125 ClientWidth = 320 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Position = poScreenCenter OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object Bevel1: TBevel Left = 11 Top = 10 Width = 297 Height = 65 Shape = bsFrame end object Label1: TLabel Left = 27 Top = 18 Width = 103 Height = 13 Caption = 'Dimension description' end object OKBtn: TButton Left = 82 Top = 90 Width = 75 Height = 25 Caption = 'OK' Default = True Enabled = False ModalResult = 1 TabOrder = 0 OnClick = OKBtnClick end object CancelBtn: TButton Left = 162 Top = 90 Width = 75 Height = 25 Cancel = True Caption = 'Cancel' ModalResult = 2 TabOrder = 1 OnClick = CancelBtnClick end object Dimension: TEdit - 390 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Left = 27 Top = 34 Width = 257 Height = 21 MaxLength = 40 TabOrder = 2 OnChange = DimensionChange end end 12.1.13 UNIT APA_INPUT_DIMENSIONUNIT.PAS unit APA_Input_Dimensionunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TAPA_Insert_Dimension = class(TForm) Bevel1: TBevel; OKBtn: TButton; CancelBtn: TButton; Label1: TLabel; Dimension: TEdit; procedure DimensionChange(Sender: TObject); procedure CancelBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure OKBtnClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var APA_Insert_Dimension: TAPA_Insert_Dimension; implementation {$R *.dfm} procedure TAPA_Insert_Dimension.DimensionChange(Sender: TObject); begin OKBtn.Enabled:=true; end; procedure TAPA_Insert_Dimension.CancelBtnClick(Sender: TObject); begin Close; end; procedure TAPA_Insert_Dimension.FormShow(Sender: TObject); begin Dimension.SetFocus; end; procedure TAPA_Insert_Dimension.OKBtnClick(Sender: TObject); var st:string; begin if (pos('//',Dimension.Text)<>0) then begin; showmessage('Sting "//" is not allowed in dimension'); st:=Dimension.Text; delete(st,pos('//',st),2); Dimension.Text:=st; end; end; end. - 391 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 12.1.14 UNIT APA_INPUT_HIERARCHYUNIT.DFM object APA_Insert_Hierarchy: TAPA_Insert_Hierarchy Left = 220 Top = 114 ActiveControl = short_hierarchy BorderStyle = bsDialog Caption = 'APA_Insert_Hierarchy' ClientHeight = 209 ClientWidth = 325 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Position = poScreenCenter OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object Bevel1: TBevel Left = 14 Top = 14 Width = 297 Height = 150 Shape = bsFrame end object Label1: TLabel Left = 30 Top = 22 Width = 125 Height = 13 Caption = 'Hierarchy short description' end object Label2: TLabel Left = 30 Top = 70 Width = 122 Height = 13 Caption = 'Hierarchy long description' end object Label3: TLabel Left = 30 Top = 114 Width = 99 Height = 13 Caption = 'Count of datarecords' end object OKBtn: TButton Left = 85 Top = 170 Width = 75 Height = 25 Caption = 'OK' Default = True Enabled = False ModalResult = 1 TabOrder = 3 OnClick = OKBtnClick end object CancelBtn: TButton Left = 165 Top = 170 Width = 75 Height = 25 Cancel = True Caption = 'Cancel' ModalResult = 2 TabOrder = 4 OnClick = CancelBtnClick end object short_hierarchy: TEdit - 392 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Left = 30 Top = 38 Width = 131 Height = 21 MaxLength = 10 TabOrder = 0 OnChange = short_hierarchyChange end object long_hierarchy: TEdit Left = 30 Top = 86 Width = 257 Height = 21 MaxLength = 40 TabOrder = 1 OnChange = long_hierarchyChange end object datarecords: TMaskEdit Left = 30 Top = 128 Width = 257 Height = 21 EditMask = '0##############;0; ' MaxLength = 15 TabOrder = 2 Text = '1' end end 12.1.15 UNIT APA_INPUT_HIERARCHYUNIT.PAS unit APA_Input_Hierarchyunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Mask; type TAPA_Insert_Hierarchy = class(TForm) Bevel1: TBevel; OKBtn: TButton; CancelBtn: TButton; Label1: TLabel; short_hierarchy: TEdit; Label2: TLabel; long_hierarchy: TEdit; Label3: TLabel; datarecords: TMaskEdit; procedure short_hierarchyChange(Sender: TObject); procedure long_hierarchyChange(Sender: TObject); procedure OKBtnClick(Sender: TObject); procedure CancelBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var APA_Insert_Hierarchy: TAPA_Insert_Hierarchy; implementation {$R *.dfm} procedure TAPA_Insert_Hierarchy.short_hierarchyChange(Sender: TObject); begin if (length(short_hierarchy.Text)<>0)and (length(long_hierarchy.Text)<>0) then OKBtn.Enabled:=true; - 393 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; procedure TAPA_Insert_Hierarchy.long_hierarchyChange(Sender: TObject); begin if (length(short_hierarchy.Text)<>0)and (length(long_hierarchy.Text)<>0) then OKBtn.Enabled:=true; end; procedure TAPA_Insert_Hierarchy.OKBtnClick(Sender: TObject); var st:string; begin {Überprüfe, ob // nicht im shortstring vorkommt} if (pos('//',short_hierarchy.Text)<>0) then begin; showmessage('Sting "//" is not allowed in short description'); st:=short_hierarchy.Text; delete(st,pos('//',st),2); short_hierarchy.Text:=st; end; if (pos('//',long_hierarchy.Text)<>0) then begin; showmessage('Sting "//" is not allowed in long description'); st:=long_hierarchy.Text; delete(st,pos('//',st),2); long_hierarchy.Text:=st; end; if (pos('//',datarecords.Text)<>0) then begin; showmessage('Sting "//" is not allowed in datarecords'); st:=datarecords.Text; delete(st,pos('//',st),2); datarecords.Text:=st; end; if (pos('::',short_hierarchy.Text)<>0) then begin; showmessage('Sting "::" is not allowed in short description'); st:=short_hierarchy.Text; delete(st,pos('//',st),2); short_hierarchy.Text:=st; end; if (pos('::',long_hierarchy.Text)<>0) then begin; showmessage('Sting "::" is not allowed in long description'); st:=long_hierarchy.Text; delete(st,pos('::',st),2); long_hierarchy.Text:=st; end; if (pos('::',datarecords.Text)<>0) then begin; showmessage('Sting "::" is not allowed in datarecords'); st:=datarecords.Text; delete(st,pos('::',st),2); datarecords.Text:=st; end; try if strtoint(datarecords.Text)<0 then begin showmessage('Count of datarecords has to be at minimum 1.'); datarecords.Text:='1'; end; except showmessage('Unallowed Integer in datarecords. Set to 0.'); datarecords.Text:='0'; end; end; procedure TAPA_Insert_Hierarchy.CancelBtnClick(Sender: TObject); begin Close; - 394 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; procedure TAPA_Insert_Hierarchy.FormShow(Sender: TObject); begin short_hierarchy.SetFocus; end; end. 12.1.16 UNIT APA_INPUT_REQBLOCKUNIT.DFM object APA_Insert_Hierarchy: TAPA_Insert_Hierarchy Left = 220 Top = 114 ActiveControl = short_hierarchy BorderStyle = bsDialog Caption = 'APA_Insert_Hierarchy' ClientHeight = 209 ClientWidth = 325 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Position = poScreenCenter OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object Bevel1: TBevel Left = 14 Top = 14 Width = 297 Height = 150 Shape = bsFrame end object Label1: TLabel Left = 30 Top = 22 Width = 125 Height = 13 Caption = 'Hierarchy short description' end object Label2: TLabel Left = 30 Top = 70 Width = 122 Height = 13 Caption = 'Hierarchy long description' end object Label3: TLabel Left = 30 Top = 114 Width = 99 Height = 13 Caption = 'Count of datarecords' end object OKBtn: TButton Left = 85 Top = 170 Width = 75 Height = 25 Caption = 'OK' Default = True Enabled = False ModalResult = 1 TabOrder = 3 OnClick = OKBtnClick end object CancelBtn: TButton Left = 165 - 395 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Top = 170 Width = 75 Height = 25 Cancel = True Caption = 'Cancel' ModalResult = 2 TabOrder = 4 OnClick = CancelBtnClick end object short_hierarchy: TEdit Left = 30 Top = 38 Width = 131 Height = 21 MaxLength = 10 TabOrder = 0 OnChange = short_hierarchyChange end object long_hierarchy: TEdit Left = 30 Top = 86 Width = 257 Height = 21 MaxLength = 40 TabOrder = 1 OnChange = long_hierarchyChange end object datarecords: TMaskEdit Left = 30 Top = 128 Width = 257 Height = 21 EditMask = '0##############;0; ' MaxLength = 15 TabOrder = 2 Text = '1' end end 12.1.17 UNIT APA_INPUT_REQBLOCKUNIT.PAS unit APA_Input_Reqblockunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TAPA_Insert_Reqblock = class(TForm) Bevel1: TBevel; OKBtn: TButton; CancelBtn: TButton; Label1: TLabel; Reqname: TEdit; Add_max_hier: TCheckBox; Importance_of_requirement: TListBox; Label2: TLabel; procedure FormShow(Sender: TObject); procedure Importance_of_requirementClick(Sender: TObject); procedure ReqnameChange(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var APA_Insert_Reqblock: TAPA_Insert_Reqblock; implementation - 396 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN uses APA_Parameterunit; {$R *.dfm} procedure TAPA_Insert_Reqblock.FormShow(Sender: TObject); var merkindex,g:longint;//Zähler begin merkindex:=Importance_of_requirement.ItemIndex; Reqname.SetFocus; Importance_of_requirement.Items.Clear; //Festlegen der Required Spalten for g:=0 to APA_Parameter.APA_Degrees.Count-1 do begin Importance_of_requirement.Items.Add(APA_Parameter.APA_Degrees.Items[g]); end; Importance_of_requirement.ItemIndex:=merkindex; if Importance_of_requirement.ItemIndex=-1 then Importance_of_requirement.ItemIndex:=0; end; procedure TAPA_Insert_Reqblock.Importance_of_requirementClick( Sender: TObject); begin OKBtn.Enabled:=true; end; procedure TAPA_Insert_Reqblock.ReqnameChange(Sender: TObject); begin OKBtn.Enabled:=true; end; end. 12.1.18 UNIT APA_INPUT_SCREENUNIT.DFM object APA_Input_Screen: TAPA_Input_Screen Left = 206 Top = 119 Width = 604 Height = 568 Caption = 'APA Input Screen' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Position = poScreenCenter OnCloseQuery = FormCloseQuery OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object Panel1: TPanel Left = 0 Top = 493 Width = 596 Height = 41 Align = alBottom TabOrder = 0 object Saveandexit_button: TButton Left = 16 Top = 8 Width = 75 Height = 25 Caption = 'Save && Exit' Enabled = False ModalResult = 1 TabOrder = 0 OnClick = Saveandexit_buttonClick end - 397 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN object Abortandexit_button: TButton Left = 104 Top = 8 Width = 75 Height = 25 Caption = 'Abort && Exit' ModalResult = 2 TabOrder = 1 OnClick = Abortandexit_buttonClick end end object Panel2: TPanel Left = 0 Top = 0 Width = 596 Height = 41 Align = alTop TabOrder = 1 object Button_insert_dimension: TButton Left = 8 Top = 8 Width = 90 Height = 25 Caption = 'Insert dimension' TabOrder = 0 OnClick = Button_insert_dimensionClick end object Button_delete: TButton Left = 220 Top = 8 Width = 90 Height = 25 Caption = 'Delete' TabOrder = 2 OnClick = Button_deleteClick end object Button_Edit: TButton Left = 327 Top = 8 Width = 90 Height = 25 Caption = 'Edit' TabOrder = 3 OnClick = Button_EditClick end object Button_insert_hierarchy: TButton Left = 114 Top = 8 Width = 90 Height = 25 Caption = 'Insert hierarchy' TabOrder = 1 OnClick = Button_insert_hierarchyClick end end object Panel3: TPanel Left = 0 Top = 41 Width = 65 Height = 340 Align = alLeft TabOrder = 2 object APA_dimbox: TGroupBox Left = 1 Top = 1 Width = 63 Height = 72 Align = alTop Caption = 'Dimension' Enabled = False TabOrder = 0 object Button_dim_up: TButton Left = 8 Top = 16 - 398 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Width = 50 Height = 25 Caption = 'Up' TabOrder = 0 OnClick = Button_dim_upClick end object Button_dim_down: TButton Left = 8 Top = 42 Width = 50 Height = 25 Caption = 'Down' TabOrder = 1 OnClick = Button_dim_downClick end end object APA_hierbox: TGroupBox Left = 1 Top = 73 Width = 63 Height = 73 Align = alTop Caption = 'Hierarchy' Enabled = False TabOrder = 1 object button_hier_up: TButton Left = 8 Top = 16 Width = 50 Height = 25 Caption = 'Up' TabOrder = 0 OnClick = button_hier_upClick end object Button_hier_down: TButton Left = 8 Top = 42 Width = 50 Height = 25 Caption = 'Down' TabOrder = 1 OnClick = Button_hier_downClick end end end object GroupBox1: TGroupBox Left = 0 Top = 381 Width = 596 Height = 112 Align = alBottom Caption = 'Key figures' TabOrder = 3 object Panel4: TPanel Left = 2 Top = 15 Width = 95 Height = 95 Align = alLeft TabOrder = 0 object Button_key_insert: TButton Left = 5 Top = 7 Width = 75 Height = 25 Caption = 'Insert' TabOrder = 0 OnClick = Button_key_insertClick end object Button_key_edit: TButton Left = 5 Top = 35 Width = 75 Height = 25 - 399 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Caption = 'Edit' TabOrder = 1 OnClick = Button_key_editClick end object Button_key_delete: TButton Left = 5 Top = 62 Width = 75 Height = 25 Caption = 'Delete' TabOrder = 2 OnClick = Button_key_deleteClick end end object Keybox: TListBox Left = 97 Top = 15 Width = 497 Height = 95 Align = alClient ItemHeight = 13 Items.Strings = ( 'Profit//SUM(MONEY)' '') TabOrder = 1 OnDblClick = KeyboxDblClick end end object Eingabe: TTreeView Left = 65 Top = 41 Width = 531 Height = 340 Align = alClient Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = 'MS Sans Serif' Font.Style = [] HideSelection = False Images = APA_ImageList Indent = 19 ParentFont = False ReadOnly = True TabOrder = 4 OnClick = EingabeClick OnMouseUp = EingabeMouseUp Items.Data = { 010000001D000000010000000100000001000000FFFFFFFF0000000004000000 0454696D6527000000020000000200000002000000FFFFFFFF00000000000000 000E5A5F642F2F5461673A3A3336353028000000020000000200000002000000 FFFFFFFF00000000000000000F5A5F6D2F2F4D6F6E74683A3A31323026000000 020000000200000002000000FFFFFFFF00000000000000000D5A5F792F2F5965 61723A3A31302B000000020000000200000002000000FFFFFFFF000000000000 0000125A5F2A2F2F54696D6520746F74616C3A3A31} end object Eingabemerk: TTreeView Left = 432 Top = 272 Width = 97 Height = 57 Indent = 19 TabOrder = 5 Visible = False end object Keyboxmerk: TListBox Left = 448 Top = 160 Width = 81 Height = 57 ItemHeight = 13 TabOrder = 6 Visible = False end - 400 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN object APA_popup: TPopupMenu Left = 424 Top = 64 object Insertdimension1: TMenuItem Caption = 'Insert dimension' OnClick = Insertdimension1Click end object Inserthierarchy1: TMenuItem Caption = 'Insert hierarchy' OnClick = Inserthierarchy1Click end object Delete1: TMenuItem Caption = 'Delete' OnClick = Delete1Click end object Edit1: TMenuItem Caption = 'Edit' OnClick = Edit1Click end object N1: TMenuItem Caption = '-' end object Dimensionup1: TMenuItem Caption = 'Dimension up' OnClick = Dimensionup1Click end object Dimensiondown1: TMenuItem Caption = 'Dimension down' OnClick = Dimensiondown1Click end object N2: TMenuItem Caption = '-' end object Hierarchyup1: TMenuItem Caption = 'Hierarchy up' OnClick = Hierarchyup1Click end object Hierarchydown1: TMenuItem Caption = 'Hierarchy down' ImageIndex = 0 OnClick = Hierarchydown1Click end end object APA_ImageList: TImageList Left = 504 Top = 72 Bitmap = { 494C010103000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000001000000001002000000000000010 000000000000000000000000000000000000344E4A006BB09B006BB09B006BB0 . . . . . . 0000800100010000000080010001000000008001000100000000800100010000 0000800100010000000080010001000000008001000100000000800100010000 00008001000100000000FFFFFFFF000000000000000000000000000000000000 000000000000} end end 12.1.19 UNIT APA_INPUT_SCREENUNIT.PAS unit APA_Input_Screenunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ImgList, ComCtrls, Menus, StdCtrls, ExtCtrls; type TAPA_Input_Screen = class(TForm) Panel1: TPanel; - 401 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Saveandexit_button: TButton; Abortandexit_button: TButton; Panel2: TPanel; Button_insert_dimension: TButton; Button_delete: TButton; Button_Edit: TButton; Button_insert_hierarchy: TButton; Panel3: TPanel; APA_dimbox: TGroupBox; Button_dim_up: TButton; Button_dim_down: TButton; APA_hierbox: TGroupBox; button_hier_up: TButton; Button_hier_down: TButton; GroupBox1: TGroupBox; Panel4: TPanel; Button_key_insert: TButton; Button_key_edit: TButton; Button_key_delete: TButton; Keybox: TListBox; APA_popup: TPopupMenu; Insertdimension1: TMenuItem; Inserthierarchy1: TMenuItem; Delete1: TMenuItem; Edit1: TMenuItem; N1: TMenuItem; Dimensionup1: TMenuItem; Dimensiondown1: TMenuItem; N2: TMenuItem; Hierarchyup1: TMenuItem; Hierarchydown1: TMenuItem; Eingabe: TTreeView; APA_ImageList: TImageList; Eingabemerk: TTreeView; Keyboxmerk: TListBox; procedure Button_insert_dimensionClick(Sender: TObject); procedure Button_EditClick(Sender: TObject); procedure Button_deleteClick(Sender: TObject); procedure Button_insert_hierarchyClick(Sender: TObject); procedure Delete1Click(Sender: TObject); procedure Insertdimension1Click(Sender: TObject); procedure Inserthierarchy1Click(Sender: TObject); procedure Edit1Click(Sender: TObject); procedure Dimensionup1Click(Sender: TObject); procedure Dimensiondown1Click(Sender: TObject); procedure Hierarchyup1Click(Sender: TObject); procedure Hierarchydown1Click(Sender: TObject); procedure Button_dim_upClick(Sender: TObject); procedure Button_dim_downClick(Sender: TObject); procedure button_hier_upClick(Sender: TObject); procedure Button_hier_downClick(Sender: TObject); procedure Saveandexit_buttonClick(Sender: TObject); procedure EingabeClick(Sender: TObject); procedure EingabeMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button_key_insertClick(Sender: TObject); procedure Button_key_deleteClick(Sender: TObject); procedure Button_key_editClick(Sender: TObject); procedure KeyboxDblClick(Sender: TObject); procedure Abortandexit_buttonClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); private { Private-Deklarationen } public { Public-Deklarationen } end; var APA_Input_Screen: TAPA_Input_Screen; generiereapaneu:boolean=true; implementation uses APA_Input_Dimensionunit, APA_Input_Hierarchyunit, APA_Keyunit, APA_Gridunit, - 402 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APA_Applicationunit, APA_Dialogunit; {$R *.dfm} var neuekosten:boolean; procedure TAPA_Input_Screen.Button_insert_dimensionClick(Sender: TObject); var merkex:longint; var ok:boolean; begin mustsave:=true; if (Eingabe.Selected<>Nil) then begin {Setze den Zeiger auf eine Dimension oder auf das erste Element} while (Eingabe.Selected.ImageIndex<>1)and(Eingabe.Selected.GetPrev<>nil) do Eingabe.Selected:=Eingabe.Selected.GetPrev; end; {Eine Dimension} APA_Insert_Dimension.Dimension.Text:=''; APA_Insert_Dimension.OKBtn.Enabled:=false; repeat; ok:=true; if APA_Insert_Dimension.showmodal=mrOK then begin for merkex:=0 to Eingabe.Items.Count-1 do begin if Eingabe.Items[merkex].ImageIndex=1 then begin if Eingabe.Items[merkex].Text=APA_Insert_Dimension.Dimension.Text then begin showmessage('The name '+APA_Insert_Dimension.Dimension.Text+' for a dimension is already used. Please change the name!'); ok:=false; end; end; end; if ok=true then begin merkex:=Eingabe.Items.Add(Eingabe.Selected,APA_Insert_Dimension.Dimension.Text).Ab soluteIndex; Eingabe.Items[merkex].ImageIndex:=1; Eingabe.Items[merkex].SelectedIndex:=1; Saveandexit_button.Enabled:=true; generiereapaneu:=true; end; end else ok:=true; until ok=true; {Eine Dimension ENDE} Eingabeclick(self); if (Eingabe.Selected<>Nil) then Eingabe.Selected.Expanded:=true; end; procedure TAPA_Input_Screen.Button_EditClick(Sender: TObject); var ok:boolean; var merkex:longint; begin mustsave:=true; if (Eingabe.Selected.ImageIndex=1) then begin {Eine Dimension} APA_Insert_Dimension.Dimension.Text:=Eingabe.Selected.Text; APA_Insert_Dimension.OKBtn.Enabled:=false; repeat; ok:=true; if APA_Insert_Dimension.showmodal=mrOK then begin for merkex:=0 to Eingabe.Items.Count-1 do begin if Eingabe.Items[merkex].ImageIndex=1 then begin if (Eingabe.Items[merkex].Text=APA_Insert_Dimension.Dimension.Text)and (merkex<>Eingabe.Selected.AbsoluteIndex) then begin showmessage('The name '+APA_Insert_Dimension.Dimension.Text+' for a dimension is already used. Please change the name!'); ok:=false; - 403 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; end; end; if ok=true then begin Eingabe.Selected.Text:=APA_Insert_Dimension.Dimension.Text; Saveandexit_button.Enabled:=true; generiereapaneu:=true; end; end else ok:=true; until ok=true; {Eine Dimension ENDE} end else begin {Eine Hierarchy} APA_Insert_Hierarchy.short_hierarchy.Text:= copy(Eingabe.Selected.Text,1,pos('//',Eingabe.Selected.Text)-1); APA_Insert_Hierarchy.long_hierarchy.Text:= copy(Eingabe.Selected.Text,pos('//',Eingabe.Selected.Text)+2,pos('::',Eingabe.Sele cted.Text)-(pos('//',Eingabe.Selected.Text)+2)); APA_Insert_Hierarchy.datarecords.Text:= copy(Eingabe.Selected.Text,pos('::',Eingabe.Selected.Text)+2,255); APA_Insert_Hierarchy.OKBtn.Enabled:=false; repeat; ok:=true; if APA_Insert_Hierarchy.showmodal=mrOK then begin for merkex:=0 to Eingabe.Items.Count-1 do begin if Eingabe.Items[merkex].ImageIndex=2 then begin if (copy(Eingabe.Items[merkex].Text,1,pos('//',Eingabe.Items[merkex].Text)1)=APA_Insert_Hierarchy.short_hierarchy.Text)and (merkex<>Eingabe.Selected.AbsoluteIndex) then begin showmessage('The name '+APA_Insert_Hierarchy.short_hierarchy.Text+' for a short hierarchy is already used. Please change the name!'); ok:=false; end; end; end; if ok=true then begin Eingabe.Selected.Text:= APA_Insert_Hierarchy.short_hierarchy.Text+'//'+APA_Insert_Hierarchy.long_hierarchy .Text+'::'+ APA_Insert_Hierarchy.datarecords.Text; Saveandexit_button.Enabled:=true; generiereapaneu:=true; end; end else ok:=true; until ok=true; {Eine Hierarchy ENDE} end; Eingabeclick(self); end; procedure TAPA_Input_Screen.Button_deleteClick(Sender: TObject); begin mustsave:=true; if Eingabe.Selected<>nil then begin if Eingabe.Selected.ImageIndex=2 then neuekosten:=true; Eingabe.Items.Delete(Eingabe.Selected); Saveandexit_button.Enabled:=true; generiereapaneu:=true; end else showmessage('No dimension or hierarchy selected.'); Eingabeclick(self); end; procedure TAPA_Input_Screen.Button_insert_hierarchyClick(Sender: TObject); var merkex:longint; - 404 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN var ok:boolean; var counter,merkdatacount,merkdatacount2:longint; var merketext1,merketext2:string; begin mustsave:=true; if Eingabe.Selected<>nil then begin {Eine Hierarchy} APA_Insert_Hierarchy.short_hierarchy.Text:=''; APA_Insert_Hierarchy.long_hierarchy.Text:=''; APA_Insert_Hierarchy.OKBtn.Enabled:=false; repeat; ok:=true; if APA_Insert_Hierarchy.showmodal=mrOK then begin for merkex:=0 to Eingabe.Items.Count-1 do begin if Eingabe.Items[merkex].ImageIndex=2 then begin if copy(Eingabe.Items[merkex].Text,1,pos('//',Eingabe.Items[merkex].Text)1)=APA_Insert_Hierarchy.short_hierarchy.Text then begin showmessage('The name '+APA_Insert_Hierarchy.short_hierarchy.Text+' for a short hierarchy is already used. Please change the name!'); ok:=false; end; end; end; if ok=true then begin if Eingabe.Selected.ImageIndex=1 then begin; {wenn Dimension markiert} merkex:=Eingabe.Items.AddChild(Eingabe.Selected, APA_Insert_Hierarchy.short_hierarchy.Text+'//'+APA_Insert_Hierarchy.long_hierarchy .Text +'::'+APA_Insert_Hierarchy.datarecords.Text).AbsoluteIndex; Eingabe.Items[merkex].ImageIndex:=2; Eingabe.Items[merkex].SelectedIndex:=2; end else {wenn Hierarchy markiert} merkex:=Eingabe.Items.Add(Eingabe.Selected, APA_Insert_Hierarchy.short_hierarchy.Text+'//'+APA_Insert_Hierarchy.long_hierarchy .Text +'::'+APA_Insert_Hierarchy.datarecords.Text).AbsoluteIndex; Eingabe.Items[merkex].ImageIndex:=2; Eingabe.Items[merkex].SelectedIndex:=2; Saveandexit_button.Enabled:=true; generiereapaneu:=true; neuekosten:=true; end;//von ok end else ok:=true; until ok=true; {Eine Hierarchy ENDE} end else showmessage('No Item selected!'); Eingabeclick(self); if (Eingabe.Selected<>Nil) then Eingabe.Selected.Expanded:=true; //Sortieren der Hierarchien counter:=0; repeat; if (counter<Eingabe.Items.Count-2) then begin if (Eingabe.Items[counter].ImageIndex<>1)and (Eingabe.Items[counter+1].ImageIndex<>1) then begin //Wenn zwei Hierarchien merkdatacount:=strtoint(copy(Eingabe.Items[counter].Text,pos('::',Eingabe.Items[co unter].Text)+2,255)); - 405 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN merkdatacount2:=strtoint(copy(Eingabe.Items[counter+1].Text,pos('::',Eingabe.Items [counter+1].Text)+2,255)); if merkdatacount<merkdatacount2 then begin //Austauschen merketext1:=Eingabe.Items[counter].Text; merketext2:=Eingabe.Items[counter+1].Text; Eingabe.Items[counter].Text:=merketext2; Eingabe.Items[counter+1].Text:=merketext1; counter:=counter-2;if counter<-1 then counter:=-1; end; end; end; counter:=counter+1; until (counter>=Eingabe.Items.Count-1) end; procedure TAPA_Input_Screen.Delete1Click(Sender: TObject); begin Button_Delete.Click; end; procedure TAPA_Input_Screen.Insertdimension1Click(Sender: TObject); begin Button_Insert_dimension.Click; end; procedure TAPA_Input_Screen.Inserthierarchy1Click(Sender: TObject); begin Button_Insert_Hierarchy.Click; end; procedure TAPA_Input_Screen.Edit1Click(Sender: TObject); begin Button_Edit.Click; end; procedure TAPA_Input_Screen.Dimensionup1Click(Sender: TObject); begin Button_dim_up.Click; end; procedure TAPA_Input_Screen.Dimensiondown1Click(Sender: TObject); begin Button_dim_down.Click; end; procedure TAPA_Input_Screen.Hierarchyup1Click(Sender: TObject); begin Button_hier_up.Click; end; procedure TAPA_Input_Screen.Hierarchydown1Click(Sender: TObject); begin Button_hier_down.Click; end; procedure TAPA_Input_Screen.Button_dim_upClick(Sender: TObject); begin mustsave:=true; if Eingabe.Selected<>nil then if Eingabe.Selected.ImageIndex=1 then if (Eingabe.Selected.getPrevSibling<>Nil) then if Eingabe.Selected.getPrevSibling.ImageIndex=1 then Eingabe.Selected.MoveTo(Eingabe.Selected.getPrevSibling,naInsert); - 406 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Eingabeclick(self); Saveandexit_button.Enabled:=true; generiereapaneu:=true; Eingabe.Repaint; end; procedure TAPA_Input_Screen.Button_dim_downClick(Sender: TObject); begin mustsave:=true; if Eingabe.Selected<>nil then if Eingabe.Selected.ImageIndex=1 then if Eingabe.Selected.getNextSibling<>nil then if Eingabe.Selected.getNextSibling.ImageIndex=1 then Eingabe.Selected.getNextSibling.MoveTo(Eingabe.Selected,naInsert); Eingabeclick(self); Saveandexit_button.Enabled:=true; generiereapaneu:=true; end; procedure TAPA_Input_Screen.button_hier_upClick(Sender: TObject); var merke1,merke2:string; begin mustsave:=true; if Eingabe.Selected<>nil then if Eingabe.Selected.ImageIndex=2 then if Eingabe.Selected.GetPrev<>Nil then if (Eingabe.Selected.GetPrev.ImageIndex=2) then begin; merke1:=Eingabe.Selected.Text; merke2:=Eingabe.Selected.getprev.Text; if strtoint(copy(merke2,pos('::',merke2)+2,255))> strtoint(copy(merke1,pos('::',merke1)+2,255)) then begin; Eingabe.Selected.Text:=copy(merke1,1,pos('::',merke1)+1)+ copy(merke2,pos('::',merke2)+2,255); Eingabe.Selected.Getprev.Text:=copy(merke2,1,pos('::',merke2)+1)+ copy(merke1,pos('::',merke1)+2,255); end; Eingabe.Selected.MoveTo(Eingabe.Selected.GetPrev,naInsert); end; Eingabeclick(self); Saveandexit_button.Enabled:=true; generiereapaneu:=true; end; procedure TAPA_Input_Screen.Button_hier_downClick(Sender: TObject); var merke1,merke2:string; begin mustsave:=true; if Eingabe.Selected<>nil then if Eingabe.Selected.ImageIndex=2 then If Eingabe.Selected.GetNext<>nil then If Eingabe.Selected.GetNext.ImageIndex=2 then begin; merke1:=Eingabe.Selected.Text; merke2:=Eingabe.Selected.getnext.Text; if strtoint(copy(merke2,pos('::',merke2)+2,255))< strtoint(copy(merke1,pos('::',merke1)+2,255)) then begin; Eingabe.Selected.Text:=copy(merke1,1,pos('::',merke1)+1)+ copy(merke2,pos('::',merke2)+2,255); Eingabe.Selected.GetNext.Text:=copy(merke2,1,pos('::',merke2)+1)+ copy(merke1,pos('::',merke1)+2,255); - 407 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; Eingabe.Selected.GetNext.MoveTo(Eingabe.Selected,naInsert); end; Eingabeclick(self); Saveandexit_button.Enabled:=true; generiereapaneu:=true; end; procedure buttonchange; begin; with APA_Input_Screen do begin if Eingabe.Selected<>nil then begin if Eingabe.Selected.ImageIndex=1 then begin {dimension} APA_dimbox.Enabled:=true; APA_hierbox.Enabled:=false; If Eingabe.Selected.getPrevSibling<>nil then Button_dim_up.Enabled:=true else Button_dim_up.Enabled:=false; If Eingabe.Selected.getNextSibling<>nil then Button_dim_down.Enabled:=true else Button_dim_down.Enabled:=false; button_hier_up.Enabled:=false; Button_hier_down.Enabled:=false; end else begin {Hierarchy} APA_dimbox.Enabled:=false; APA_hierbox.Enabled:=true; Button_dim_up.Enabled:=false; Button_dim_down.Enabled:=false; If Eingabe.Selected.getPrevSibling<>nil then Button_hier_up.Enabled:=true else Button_hier_up.Enabled:=false; If Eingabe.Selected.getNextSibling<>nil then Button_hier_down.Enabled:=true else Button_hier_down.Enabled:=false; end; end else begin APA_dimbox.Enabled:=false; APA_hierbox.Enabled:=false; Button_dim_up.Enabled:=false; Button_dim_down.Enabled:=false; button_hier_up.Enabled:=false; Button_hier_down.Enabled:=false; end; end; end; procedure TAPA_Input_Screen.Saveandexit_buttonClick(Sender: TObject); var counter,maxchilds,merkdatacount:longint; CurItem,lastdim,nrmaxchilds:TTreeNode; begin Saveandexit_button.Enabled:=false; mustsave:=true; //Überprüfe die richte Anordung der Hierarchien merkdatacount:=0; for counter:=0 to Eingabe.Items.Count-1 do begin If Eingabe.Items[counter].ImageIndex=1 then begin //Wert neu merkdatacount:=0; end else begin if ((merkdatacount=0)or (merkdatacount> strtoint(copy(Eingabe.Items[counter].Text,pos('::',Eingabe.Items[counter].Text)+2, 255)))) then begin - 408 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN merkdatacount:=strtoint(copy(Eingabe.Items[counter].Text,pos('::',Eingabe.Items[co unter].Text)+2,255)); end else begin //Fehler showmessage('Hierarchies are not in right order. Please check '+ copy(Eingabe.Items[counter].Text,pos('//',Eingabe.Items[counter].Text)+2, pos('::',Eingabe.Items[counter].Text)-(pos('//',Eingabe.Items[counter].Text)+2))); exit; end; end; end; if generiereapaneu=true then begin {Setze die Dimension mit den meisten Unterknoten nach unten} lastdim:=nil; CurItem:=Eingabe.Items.GetFirstNode;nrmaxchilds:=CurItem; while nrmaxchilds<>lastdim do begin CurItem:=Eingabe.Items.GetFirstNode;nrmaxchilds:=CurItem; maxchilds:=0; while CurItem<>nil do begin if maxchilds<=CurItem.Count then begin maxchilds:=CurItem.Count; nrmaxchilds:=CurItem; end; if CurItem.HasChildren=true then lastdim:=CurItem; CurItem:=CurItem.GetNext; end; if (nrmaxchilds<>lastdim) then begin nrmaxchilds.Selected:=true;button_dim_down.Click; showmessage('Place dimension with maximal hierarchy levels on last position'); end; end; {Setze die Dimension mit den meisten Unterknoten nach oben ENDE} {Demarkiere den Apa_Selektion Screen} APA_Application.Button_Apa_Selection.Enabled:=false; if generiereapaneu=true then begin APA_Grid.FormShow(self); end; if neuekosten=true then begin APA_Dialog.APA_Text.Caption:= 'You have changed the Input Data. You have to generate the random costs again. Do you want to generate the random costs now?'; if APA_Dialog.showmodal=mryes then APA_Application.GeneriereZufallskosten1Click(self);; end; end; end; procedure TAPA_Input_Screen.EingabeClick(Sender: TObject); begin buttonchange; end; procedure TAPA_Input_Screen.EingabeMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin buttonchange; end; procedure TAPA_Input_Screen.Button_key_insertClick(Sender: TObject); var ok:boolean; var counter:longint; begin - 409 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN mustsave:=true; Saveandexit_button.Enabled:=true; mustsave:=true; APA_Insert_Key.Key_Fieldname.Text:=''; APA_Insert_Key.APA_Function.ItemIndex:=0; APA_Insert_Key.APA_Field_type.ItemIndex:=4; APA_Insert_Key.OKBtn.enabled:=false; repeat; ok:=true; if APA_Insert_Key.showmodal=mrOK then begin for counter:=0 to Keybox.Items.Count-1 do begin if (APA_Insert_Key.Key_fieldname.Text= copy(Keybox.items[counter],1,pos('//',Keybox.items[counter])-1)) then begin ok:=false; showmessage('The name '+APA_Insert_Key.Key_fieldname.Text+' is already used. Please change the name!'); end; end; if ok=true then begin Keybox.Items.Add(APA_Insert_Key.Key_fieldname.Text+'//'+APA_Insert_Key.APA_Functio n.Items[APA_Insert_Key.APA_Function.itemindex] +'('+APA_Insert_Key.APA_Field_type.Items[APA_Insert_Key.APA_Field_type.itemindex]+ ')'); Saveandexit_button.Enabled:=true; end; end else ok:=true; until ok=true; end; procedure TAPA_Input_Screen.Button_key_deleteClick(Sender: TObject); begin mustsave:=true; if keybox.ItemIndex<>-1 then begin Saveandexit_button.Enabled:=true; Keybox.Items.Delete(Keybox.ItemIndex); mustsave:=true; end else showmessage('No Key figure selected'); end; procedure TAPA_Input_Screen.Button_key_editClick(Sender: TObject); var ok:boolean; counter:longint; begin mustsave:=true; if Keybox.ItemIndex<>-1 then begin APA_Insert_Key.APA_Function.ItemIndex:= APA_Insert_Key.APA_Function.Items.IndexOf(copy(Keybox.items[Keybox.itemindex],pos( '//', Keybox.items[Keybox.itemindex])+2,3)); APA_Insert_Key.Key_fieldname.Text:= copy(Keybox.items[Keybox.itemindex],1,pos('//',Keybox.items[Keybox.itemindex])-1); APA_Insert_Key.APA_Field_type.ItemIndex:= APA_Insert_Key.APA_Field_type.Items.IndexOf( copy(Keybox.items[Keybox.itemindex],pos('//',Keybox.items[Keybox.itemindex])+6, length(Keybox.items[Keybox.itemindex])-(pos('//',Keybox.items[Keybox.itemindex])+6))); APA_Insert_Key.OKBtn.enabled:=false; repeat; ok:=true; if APA_Insert_Key.showmodal=mrOK then begin for counter:=0 to Keybox.Items.Count-1 do begin if (APA_Insert_Key.Key_fieldname.Text= copy(Keybox.items[counter],1,pos('//',Keybox.items[counter])-1)) - 410 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN and(counter<>Keybox.ItemIndex) then begin ok:=false; showmessage('The name '+APA_Insert_Key.Key_fieldname.Text+' is already used. Please change the name!'); end; end; if ok=true then begin Keybox.Items[Keybox.ItemIndex]:=APA_Insert_Key.Key_fieldname.Text+'//'+ APA_Insert_Key.APA_Function.Items[APA_Insert_Key.APA_Function.itemindex] +'('+APA_Insert_Key.APA_Field_type.Items[APA_Insert_Key.APA_Field_type.itemindex]+ ')'; Saveandexit_button.Enabled:=true; mustsave:=true; end; end else ok:=true; until ok=true; end else showmessage('No Key figure selected'); end; procedure TAPA_Input_Screen.KeyboxDblClick(Sender: TObject); begin Button_key_edit.click; end; procedure TAPA_Input_Screen.Abortandexit_buttonClick(Sender: TObject); begin Saveandexit_button.Enabled:=false; keybox.Items.Clear; keybox.Items:=keyboxmerk.Items; Eingabe.Items.Clear; Eingabe.Items:=Eingabemerk.Items; end; procedure TAPA_Input_Screen.FormShow(Sender: TObject); begin //Speichere die aktuellen Eingabe keyboxmerk.Items.Clear; keyboxmerk.Items:=keybox.Items; Eingabemerk.Items.Clear; Eingabemerk.Items:=Eingabe.Items; neuekosten:=false; end; procedure TAPA_Input_Screen.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var counter, merkcounter:longint; ok:boolean; begin {Kontrolliere, ob jede Dimension mindestens eine Hierarchie hat} ok:=true;merkcounter:=0; for counter:=0 to Eingabe.Items.Count-1 do begin if Eingabe.Items[counter].ImageIndex=1 then begin //wenn Dimension if ok=false //dann gibt es eine Hierarchie then begin showmessage('The dimension '+Eingabe.Items[merkcounter].Text+' do not have a hierarchy'); canClose:=false; end; ok:=false; merkcounter:=counter; end else begin //wenn Hierarchie ok:=true; - 411 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; end; if Saveandexit_button.Enabled=true then begin APA_Dialog.APA_Text.Caption:='Do you want to save your changes?'; if APA_Dialog.showmodal=mryes then Saveandexit_button.Click else Abortandexit_button.Click; end; end; end. 12.1.20 UNIT APA_KEYUNIT.DFM object APA_Insert_Key: TAPA_Insert_Key Left = 234 Top = 185 ActiveControl = Key_fieldname BorderStyle = bsDialog Caption = 'APA Insert Key' ClientHeight = 205 ClientWidth = 321 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Position = poScreenCenter OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object Bevel1: TBevel Left = 12 Top = 16 Width = 297 Height = 145 Shape = bsFrame end object Label1: TLabel Left = 28 Top = 25 Width = 48 Height = 13 Caption = 'Fieldname' end object Label2: TLabel Left = 28 Top = 110 Width = 42 Height = 13 Caption = 'Fieldtype' end object Label3: TLabel Left = 28 Top = 66 Width = 41 Height = 13 Caption = 'Function' end object OKBtn: TButton Left = 83 Top = 172 Width = 75 Height = 25 Caption = 'OK' Default = True Enabled = False ModalResult = 1 - 412 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN TabOrder = 1 OnClick = OKBtnClick end object CancelBtn: TButton Left = 163 Top = 172 Width = 75 Height = 25 Cancel = True Caption = 'Cancel' ModalResult = 2 TabOrder = 2 end object Key_fieldname: TEdit Left = 28 Top = 41 Width = 257 Height = 21 MaxLength = 40 TabOrder = 0 OnChange = Key_fieldnameChange end object APA_Field_type: TComboBox Left = 28 Top = 126 Width = 249 Height = 21 Style = csDropDownList ItemHeight = 13 ItemIndex = 0 TabOrder = 3 Text = 'BIGINT' OnChange = APA_Field_typeChange Items.Strings = ( 'BIGINT' 'INT' 'SMALLINT' 'DECIMAL' 'MONEY' 'SMALLMONEY' 'FLOAT' 'REAL' 'DATETIME' 'SMALLDATETIME') end object APA_Function: TComboBox Left = 28 Top = 82 Width = 145 Height = 21 Style = csDropDownList ItemHeight = 13 ItemIndex = 0 TabOrder = 4 Text = 'SUM' OnChange = APA_FunctionChange Items.Strings = ( 'SUM' 'MAX' 'MIN' 'COUNT') end end 12.1.21 UNIT APA_KEYUNIT.PAS unit APA_Keyunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - 413 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Dialogs, Spin, StdCtrls, ExtCtrls; type TAPA_Insert_Key = class(TForm) Bevel1: TBevel; OKBtn: TButton; CancelBtn: TButton; Label1: TLabel; Key_fieldname: TEdit; Label2: TLabel; APA_Field_type: TComboBox; Label3: TLabel; APA_Function: TComboBox; procedure Key_fieldnameChange(Sender: TObject); procedure OKBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure APA_FunctionChange(Sender: TObject); procedure APA_Field_typeChange(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var APA_Insert_Key: TAPA_Insert_Key; implementation {$R *.dfm} procedure TAPA_Insert_Key.Key_fieldnameChange(Sender: TObject); begin OKBtn.Enabled:=true; end; procedure TAPA_Insert_Key.OKBtnClick(Sender: TObject); var st:string; begin if (pos('//',Key_Fieldname.Text)<>0) then begin; showmessage('Sting "//" is not allowed in Fieldname'); st:=Key_Fieldname.Text; delete(st,pos('//',st),2); Key_Fieldname.Text:=st; end; end; procedure TAPA_Insert_Key.FormShow(Sender: TObject); begin Key_Fieldname.SetFocus; end; procedure TAPA_Insert_Key.APA_FunctionChange(Sender: TObject); begin OKBtn.Enabled:=true; end; procedure TAPA_Insert_Key.APA_Field_typeChange(Sender: TObject); begin OKBtn.Enabled:=true; end; end. 12.1.22 UNIT APA_OPTIONSUNIT.DFM object APA_Options: TAPA_Options Left = 223 Top = 134 Width = 454 - 414 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Height = 387 Caption = 'APA Options' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 object Panel1: TPanel Left = 0 Top = 312 Width = 446 Height = 41 Align = alBottom TabOrder = 0 object Button1: TButton Left = 186 Top = 8 Width = 75 Height = 25 Cancel = True Caption = 'Close' Default = True TabOrder = 0 OnClick = Button1Click end end object PageControl1: TPageControl Left = 0 Top = 0 Width = 446 Height = 312 ActivePage = APA_On_Start Align = alClient TabOrder = 1 object APA_On_Start: TTabSheet Caption = 'On Start' object APA_Load_Last_APA: TCheckBox Left = 16 Top = 16 Width = 177 Height = 31 Caption = 'Load last APA' Checked = True State = cbChecked TabOrder = 0 end object APA_Remove_redundancy: TCheckBox Left = 16 Top = 87 Width = 177 Height = 31 Caption = 'Remove Redundancy' TabOrder = 1 end object APA_Add_max_hier: TCheckBox Left = 16 Top = 122 Width = 153 Height = 31 Caption = 'Add max hierarchy' Checked = True State = cbChecked TabOrder = 2 end object APA_Save_on_termination: TCheckBox Left = 17 Top = 51 Width = 200 Height = 31 - 415 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Caption = 'Save APA on termination of program' Checked = True State = cbChecked TabOrder = 3 end object APA_ShowScreenheuristic: TCheckBox Left = 16 Top = 158 Width = 265 Height = 31 Caption = 'Show process screen during heuristic execution' Checked = True State = cbChecked TabOrder = 4 end object APA_Show_Link_on_Desktop: TCheckBox Left = 16 Top = 192 Width = 249 Height = 17 Caption = 'Show link on desktop' Checked = True State = cbChecked TabOrder = 5 OnExit = APA_Show_Link_on_DesktopExit end end object APA_Path_Settings: TTabSheet Caption = 'Path Settings' ImageIndex = 1 object Label1: TLabel Left = 16 Top = 16 Width = 49 Height = 13 Caption = 'Savepath:' end object APA_Save_Path: TDirectoryListBox Left = 16 Top = 48 Width = 417 Height = 129 ItemHeight = 16 TabOrder = 0 end end end end 12.1.23 UNIT APA_OPTIONSUNIT.PAS unit APA_Optionsunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, DB, DBTables, FileCtrl; type TAPA_Options = class(TForm) Panel1: TPanel; Button1: TButton; PageControl1: TPageControl; APA_On_Start: TTabSheet; APA_Load_Last_APA: TCheckBox; APA_Remove_redundancy: TCheckBox; APA_Add_max_hier: TCheckBox; APA_Path_Settings: TTabSheet; Label1: TLabel; APA_Save_Path: TDirectoryListBox; APA_Save_on_termination: TCheckBox; - 416 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APA_ShowScreenheuristic: TCheckBox; APA_Show_Link_on_Desktop: TCheckBox; procedure Button1Click(Sender: TObject); procedure APA_Show_Link_on_DesktopExit(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var APA_Options: TAPA_Options; implementation uses APA_Applicationunit; {$R *.dfm} procedure TAPA_Options.Button1Click(Sender: TObject); begin Close; end; procedure TAPA_Options.APA_Show_Link_on_DesktopExit(Sender: TObject); var fStreamladen,fStreamspeichern:TFileStream; begin if APA_Options.APA_Show_Link_on_Desktop.Checked=true then begin if fileexists(APA_Application.shelldir.Path+'\APAWin.lnk')=false then begin try fStreamLaden:=TFileStream.Create('c:\APADIR\PROGRAM\APAWin.lnk',fmOpenRead); try fStreamSpeichern:=TFileStream.Create(APA_Application.shelldir.Path+'\APAWin.lnk',f mCreate); fStreamSpeichern.CopyFrom(fStreamLaden, fStreamLaden.Size); finally freeandnil(fStreamSpeichern); end; finally freeandnil(fStreamLaden); end; end else begin //Löschen if fileexists(APA_Application.shelldir.Path+'\APAWin.lnk')=true then begin try deletefile(APA_Application.shelldir.Path+'\APAWin.lnk'); except showmessage('Can not remove link from Desktop'); end; end; end; end; end; end. 12.1.24 UNIT APA_PARAMETERUNIT.DFM object APA_Parameter: TAPA_Parameter Left = 280 Top = 188 BorderStyle = bsDialog Caption = 'APA Parameter' ClientHeight = 483 ClientWidth = 399 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText - 417 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Position = poScreenCenter OnClose = FormClose OnCreate = FormCreate OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object Panel1: TPanel Left = 0 Top = 442 Width = 399 Height = 41 Align = alBottom TabOrder = 0 object Button1: TButton Left = 134 Top = 8 Width = 75 Height = 25 Caption = 'Close' TabOrder = 0 OnClick = Button1Click end end object APA_Parameter_Control: TPageControl Left = 0 Top = 0 Width = 399 Height = 442 ActivePage = APA_Active_heuristicsheet Align = alClient TabOrder = 1 object APA_Active_heuristicsheet: TTabSheet Caption = 'Heuristic && Algorithms parameters' object GroupBox3: TGroupBox Left = 0 Top = 0 Width = 391 Height = 161 Align = alTop Caption = 'Thomas Achs heuristic parameters' TabOrder = 0 object Label1: TLabel Left = 24 Top = 24 Width = 128 Height = 13 Caption = 'New Sets on each iteration' end object Label2: TLabel Left = 24 Top = 72 Width = 116 Height = 13 Caption = 'Count of Sets calculated' end object APA_Thomas_newsetsoneachiteration: TMaskEdit Left = 24 Top = 40 Width = 33 Height = 21 EditMask = '0##;0; ' MaxLength = 3 TabOrder = 0 OnExit = APA_Thomas_newsetsoneachiterationExit end object APA_Thomas_countofsets: TMaskEdit Left = 24 Top = 88 Width = 39 Height = 21 - 418 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN EditMask = '0###;0; ' MaxLength = 4 TabOrder = 1 OnExit = APA_Thomas_countofsetsExit end end end object Thomas_Achs_heuristic: TTabSheet Caption = 'Cost function parameters' object tomstorelabel: TLabel Left = 38 Top = 318 Width = 139 Height = 13 Caption = 'Storage importantance: 25 % ' end object tomtimelabel: TLabel Left = 201 Top = 318 Width = 122 Height = 13 Alignment = taRightJustify Caption = 'Time importantance: 75 %' end object Label9: TLabel Left = 144 Top = 264 Width = 81 Height = 20 Caption = 'Importance' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 Font.Name = 'MS Sans Serif' Font.Style = [] ParentFont = False end object tommatcosts: TLabel Left = 42 Top = 396 Width = 127 Height = 13 Caption = 'Materialisation costs: 25 % ' end object tomquerycosts: TLabel Left = 242 Top = 396 Width = 85 Height = 13 Alignment = taRightJustify Caption = 'Query costs: 75 %' end object Label10: TLabel Left = 159 Top = 342 Width = 50 Height = 20 Caption = 'Weight' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 Font.Name = 'MS Sans Serif' Font.Style = [] ParentFont = False end object APA_Thomas_Importance: TTrackBar Left = 41 Top = 286 Width = 281 Height = 25 Hint = 'Select the weight of ' Max = 100 ParentShowHint = False Frequency = 5 - 419 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Position = 10 ShowHint = True TabOrder = 0 TickMarks = tmBoth OnChange = APA_Thomas_ImportanceChange end object APA_Thomas_Query_Importance: TTrackBar Left = 44 Top = 366 Width = 281 Height = 25 Hint = 'Select the weight of ' Max = 100 ParentShowHint = False Frequency = 5 Position = 10 ShowHint = True TabOrder = 1 TickMarks = tmBoth OnChange = APA_Thomas_Query_ImportanceChange end object GroupBox4: TGroupBox Left = 0 Top = 161 Width = 391 Height = 88 Align = alTop Caption = 'Sizeoriented Parameters' TabOrder = 2 object Label13: TLabel Left = 52 Top = 19 Width = 158 Height = 26 Alignment = taRightJustify Caption = 'Average size in bytes per tupel in BFT in space units:' WordWrap = True end object Label14: TLabel Left = 50 Top = 47 Width = 160 Height = 26 Alignment = taRightJustify Caption = 'Max available storage space for Materialized Cubes in space unit' + 's:' WordWrap = True end object APA_Thomas_avsizeoftupel: TMaskEdit Left = 219 Top = 22 Width = 144 Height = 21 EditMask = '0###########;0; ' MaxLength = 12 TabOrder = 0 OnChange = APA_Thomas_timemaxChange OnExit = APA_Thomas_avsizeoftupelExit end object APA_Thomas_spacemax: TMaskEdit Left = 219 Top = 50 Width = 144 Height = 21 EditMask = '0#####################;0; ' MaxLength = 22 TabOrder = 1 OnChange = APA_Thomas_timemaxChange OnExit = APA_Thomas_spacemaxExit end end object GroupBox5: TGroupBox Left = 0 - 420 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Top = 0 Width = 391 Height = 161 Align = alTop Caption = 'Timeoriented Parameters' TabOrder = 3 object Label12: TLabel Left = 14 Top = 49 Width = 196 Height = 13 Alignment = taRightJustify Caption = 'Average time for IO per tupel in time units:' end object Label15: TLabel Left = 50 Top = 94 Width = 160 Height = 26 Alignment = taRightJustify Caption = 'Max available time in time units to Build Materialized Cubes :' WordWrap = True end object Label16: TLabel Left = 43 Top = 14 Width = 167 Height = 26 Alignment = taRightJustify Caption = 'Average time to store a tupel (Build materialized views) in time' + ' units:' WordWrap = True end object Label3: TLabel Left = 57 Top = 124 Width = 157 Height = 26 Alignment = taRightJustify Caption = 'Maximal average time to query in time units:' WordWrap = True end object Label4: TLabel Left = 7 Top = 76 Width = 204 Height = 13 Alignment = taRightJustify Caption = 'Average time of CPU per tupel in time units:' end object APA_Thomas_timestore: TMaskEdit Left = 218 Top = 17 Width = 158 Height = 21 TabOrder = 0 Text = '2' OnChange = APA_Thomas_timemaxChange OnExit = APA_Thomas_timestoreExit end object APA_Thomas_timeio: TMaskEdit Left = 218 Top = 45 Width = 158 Height = 21 TabOrder = 1 Text = '2' OnChange = APA_Thomas_timemaxChange OnExit = APA_Thomas_timeioExit end object APA_Thomas_timemax: TMaskEdit Left = 218 Top = 100 - 421 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Width = 155 Height = 21 EditMask = '0###########;0; ' MaxLength = 12 TabOrder = 3 OnChange = APA_Thomas_timemaxChange OnExit = APA_Thomas_timemaxExit end object APA_Thomas_querytimemax: TMaskEdit Left = 218 Top = 127 Width = 157 Height = 21 TabOrder = 4 Text = '20' OnChange = APA_Thomas_timemaxChange OnExit = APA_Thomas_querytimemaxExit end object APA_Thomas_timecpu: TMaskEdit Left = 218 Top = 73 Width = 151 Height = 21 TabOrder = 2 OnChange = APA_Thomas_timemaxChange OnExit = APA_Thomas_timecpuExit end end end object Values_of_Cubes: TTabSheet Caption = 'Degrees of requirements' object Panel2: TPanel Left = 0 Top = 0 Width = 391 Height = 137 Align = alTop TabOrder = 0 object Label19: TLabel Left = 8 Top = 8 Width = 101 Height = 13 Caption = 'Description of degree' end object Label21: TLabel Left = 8 Top = 48 Width = 77 Height = 13 Caption = 'Count of queries' end object APA_Description_of_degree: TEdit Left = 8 Top = 24 Width = 201 Height = 21 Enabled = False TabOrder = 0 end object Panel3: TPanel Left = 1 Top = 96 Width = 389 Height = 40 Align = alBottom TabOrder = 2 object APA_Degree_Insert: TButton Left = 21 Top = 8 Width = 55 Height = 25 Caption = 'Insert' TabOrder = 0 - 422 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN OnClick = APA_Degree_InsertClick end object APA_Degree_Edit: TButton Left = 85 Top = 8 Width = 55 Height = 25 Caption = 'Edit' TabOrder = 1 OnClick = APA_Degree_EditClick end object APA_Degree_Save: TButton Left = 149 Top = 8 Width = 55 Height = 25 Caption = 'Save' Enabled = False TabOrder = 2 OnClick = APA_Degree_SaveClick end object APA_Degree_Delete: TButton Left = 213 Top = 8 Width = 55 Height = 25 Caption = 'Delete' TabOrder = 3 OnClick = APA_Degree_DeleteClick end object APA_Degree_Abort: TButton Left = 277 Top = 7 Width = 55 Height = 25 Caption = 'Abort' Enabled = False TabOrder = 4 OnClick = APA_Degree_AbortClick end end object APA_Count_of_Queries: TMaskEdit Left = 9 Top = 64 Width = 136 Height = 21 Enabled = False EditMask = '0###############;0; ' MaxLength = 16 TabOrder = 1 OnChange = APA_Thomas_timemaxChange OnExit = APA_Count_of_QueriesExit end end object Panel4: TPanel Left = 0 Top = 137 Width = 42 Height = 277 Align = alLeft TabOrder = 1 object APA_Degree_up: TBitBtn Left = 5 Top = 4 Width = 28 Height = 25 Caption = 'UP' TabOrder = 0 OnClick = APA_Degree_upClick Layout = blGlyphTop end object APA_Degree_Down: TBitBtn Left = 0 Top = 36 - 423 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Width = 39 Height = 25 Caption = 'DOWN' TabOrder = 1 OnClick = APA_Degree_DownClick Layout = blGlyphTop end end object GroupBox1: TGroupBox Left = 258 Top = 137 Width = 133 Height = 277 Align = alRight Caption = 'Count of queries' TabOrder = 2 object APA_Degreecounts: TListBox Left = 2 Top = 15 Width = 129 Height = 260 Align = alClient ItemHeight = 13 Items.Strings = ( '10000' '1000' '1') TabOrder = 0 OnClick = APA_DegreecountsClick end end object GroupBox2: TGroupBox Left = 42 Top = 137 Width = 216 Height = 277 Align = alClient Caption = 'Description of degree' TabOrder = 3 object APA_Degrees: TListBox Left = 2 Top = 15 Width = 212 Height = 260 Align = alClient ItemHeight = 13 Items.Strings = ( 'High Importance' 'Normal Importance' 'Unimportant') TabOrder = 0 OnClick = APA_DegreesClick end end end object APA_Colors_of_Degrees: TTabSheet Caption = 'Colors of Requirements' ImageIndex = 4 object Panel5: TPanel Left = 0 Top = 0 Width = 391 Height = 41 Align = alTop TabOrder = 0 object APA_Changecolorbutton: TButton Left = 8 Top = 8 Width = 121 Height = 25 Caption = 'Change color' TabOrder = 0 OnClick = APA_ChangecolorbuttonClick end - 424 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end object Colorsgrid: TDrawGrid Left = 0 Top = 41 Width = 391 Height = 373 Align = alClient ColCount = 1 DefaultColWidth = 300 FixedCols = 0 RowCount = 15 FixedRows = 0 Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goRowSelect] TabOrder = 1 OnDrawCell = ColorsgridDrawCell RowHeights = ( 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24) end end end object ColorDialog: TColorDialog Left = 308 Top = 280 end end 12.1.25 UNIT APA_PARAMETERUNIT.PAS unit APA_Parameterunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ExtCtrls, Buttons, Grids, Mask; type TAPA_Parameter = class(TForm) Panel1: TPanel; Button1: TButton; APA_Parameter_Control: TPageControl; Values_of_Cubes: TTabSheet; Panel2: TPanel; Label19: TLabel; APA_Description_of_degree: TEdit; Panel3: TPanel; APA_Degree_Insert: TButton; APA_Degree_Edit: TButton; APA_Degree_Save: TButton; APA_Degree_Delete: TButton; Label21: TLabel; Panel4: TPanel; APA_Degree_up: TBitBtn; APA_Degree_Down: TBitBtn; APA_Active_heuristicsheet: TTabSheet; Thomas_Achs_heuristic: TTabSheet; - 425 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN GroupBox1: TGroupBox; APA_Degreecounts: TListBox; GroupBox2: TGroupBox; APA_Degrees: TListBox; APA_Degree_Abort: TButton; APA_Colors_of_Degrees: TTabSheet; ColorDialog: TColorDialog; Panel5: TPanel; APA_Changecolorbutton: TButton; Colorsgrid: TDrawGrid; tomstorelabel: TLabel; tomtimelabel: TLabel; Label9: TLabel; APA_Thomas_Importance: TTrackBar; tommatcosts: TLabel; tomquerycosts: TLabel; Label10: TLabel; APA_Thomas_Query_Importance: TTrackBar; GroupBox3: TGroupBox; APA_Thomas_newsetsoneachiteration: TMaskEdit; Label1: TLabel; APA_Thomas_countofsets: TMaskEdit; Label2: TLabel; APA_Count_of_Queries: TMaskEdit; GroupBox4: TGroupBox; Label13: TLabel; Label14: TLabel; APA_Thomas_avsizeoftupel: TMaskEdit; APA_Thomas_spacemax: TMaskEdit; GroupBox5: TGroupBox; Label12: TLabel; Label15: TLabel; Label16: TLabel; Label3: TLabel; APA_Thomas_timestore: TMaskEdit; APA_Thomas_timeio: TMaskEdit; APA_Thomas_timemax: TMaskEdit; APA_Thomas_querytimemax: TMaskEdit; Label4: TLabel; APA_Thomas_timecpu: TMaskEdit; procedure Button1Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure FormCreate(Sender: TObject); procedure APA_Degree_InsertClick(Sender: TObject); procedure APA_DegreesClick(Sender: TObject); procedure APA_DegreecountsClick(Sender: TObject); procedure APA_Degree_SaveClick(Sender: TObject); procedure APA_Degree_EditClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure APA_Degree_AbortClick(Sender: TObject); procedure APA_Degree_DeleteClick(Sender: TObject); procedure APA_Degree_upClick(Sender: TObject); procedure APA_Degree_DownClick(Sender: TObject); procedure ColorBox1Exit(Sender: TObject); procedure ColorsgridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure APA_ChangecolorbuttonClick(Sender: TObject); procedure Colorsgrid2DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure APA_Thomas_ImportanceChange(Sender: TObject); procedure APA_Thomas_Query_ImportanceChange(Sender: TObject); procedure APA_Thomas_timemaxChange(Sender: TObject); procedure APA_Thomas_newsetsoneachiterationExit(Sender: TObject); procedure APA_Thomas_countofsetsExit(Sender: TObject); procedure APA_Thomas_timestoreExit(Sender: TObject); procedure APA_Thomas_timeioExit(Sender: TObject); procedure APA_Thomas_timecpuExit(Sender: TObject); procedure APA_Thomas_timemaxExit(Sender: TObject); procedure APA_Thomas_querytimemaxExit(Sender: TObject); procedure APA_Thomas_avsizeoftupelExit(Sender: TObject); procedure APA_Thomas_spacemaxExit(Sender: TObject); procedure APA_Count_of_QueriesExit(Sender: TObject); private { Private-Deklarationen } - 426 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN public { Public-Deklarationen } end; var APA_Parameter: TAPA_Parameter; DegreeColors:array[0..14] of TColor; Othercolors:array[0..14] of TColor; implementation uses APA_Applicationunit, APA_Gridunit, APA_Selectionunit; {$R *.dfm} var degreeedit:longint=-2; procedure TAPA_Parameter.Button1Click(Sender: TObject); begin Close; end; procedure TAPA_Parameter.FormShow(Sender: TObject); begin APA_Thomas_ImportanceChange(self); APA_Thomas_Query_ImportanceChange(self); end; procedure TAPA_Parameter.FormCreate(Sender: TObject); begin APA_Parameter_Control.ActivePageIndex:=0; APA_Thomas_Importance.Position:=75; APA_Thomas_Query_Importance.Position:=75; //Standardfarben für Requirements festlegen DegreeColors[0]:=clBlue; DegreeColors[1]:=clMaroon; DegreeColors[2]:=clGreen; DegreeColors[3]:=clOlive; DegreeColors[4]:=clNavy; DegreeColors[5]:=clPurple; DegreeColors[6]:=clTeal; DegreeColors[7]:=clGray; DegreeColors[8]:=clRed; DegreeColors[9]:=clFuchsia; DegreeColors[10]:=clAqua; DegreeColors[11]:=clLtGray; DegreeColors[12]:=clCream; DegreeColors[13]:=clSkyBlue; DegreeColors[14]:=clMoneyGreen; OtherColors[0]:=clYellow; //Farbe für Rednundanzfrei OtherColors[1]:=clRed; //Farbe für materalisiert OtherColors[2]:=clBlack; //Farbe für Derivate end; procedure TAPA_Parameter.APA_Degree_InsertClick(Sender: TObject); begin if APA_Degrees.Items.Count<15 then begin APA_Description_of_degree.Enabled:=true; APA_Count_of_Queries.Enabled:=true; APA_Degree_Insert.Enabled:=false; APA_Degree_Edit.Enabled:=false; APA_Degree_Save.Enabled:=true; APA_Degree_Delete.Enabled:=false; APA_Degree_Abort.Enabled:=true; APA_Description_of_degree.Text:=''; APA_Count_of_Queries.Text:='1'; APA_Description_of_degree.SetFocus; - 427 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN mustsave:=true; end else showmessage('Maxium Count of Entrys of 15 reached'); end; procedure TAPA_Parameter.APA_DegreesClick(Sender: TObject); begin APA_Degreecounts.ItemIndex:=APA_Degrees.ItemIndex; end; procedure TAPA_Parameter.APA_DegreecountsClick(Sender: TObject); begin APA_Degrees.ItemIndex:=APA_Degreecounts.ItemIndex; end; procedure TAPA_Parameter.APA_Degree_SaveClick(Sender: TObject); begin mustsave:=true; APA_Description_of_degree.Enabled:=false; APA_Count_of_Queries.Enabled:=false; APA_Degree_Insert.Enabled:=true; APA_Degree_Edit.Enabled:=true; APA_Degree_Save.Enabled:=false; APA_Degree_Delete.Enabled:=true; APA_Degree_Abort.Enabled:=false; if APA_Degree_Edit.tag=0 then begin APA_Degrees.Items.Add(APA_Description_of_degree.Text); APA_Degreecounts.Items.Add(APA_Count_of_Queries.Text); end else begin APA_Degrees.Items[APA_Degrees.itemindex]:=APA_Description_of_degree.Text; APA_Degreecounts.Items[APA_Degreecounts.ItemIndex]:=APA_Count_of_Queries.Text; end; APA_Degree_Edit.Tag:=0; end; procedure TAPA_Parameter.APA_Degree_EditClick(Sender: TObject); begin if APA_Degrees.ItemIndex<>-1 then begin APA_Description_of_degree.Enabled:=true; APA_Count_of_Queries.Enabled:=true; APA_Degree_Insert.Enabled:=false; APA_Degree_Edit.Enabled:=false; APA_Degree_Save.Enabled:=true; APA_Degree_Delete.Enabled:=false; APA_Degree_Abort.Enabled:=true; APA_Description_of_degree.Text:= APA_Degrees.Items[APA_Degrees.itemindex]; APA_Count_of_Queries.Text:= APA_Degreecounts.Items[APA_Degreecounts.itemindex]; APA_Description_of_degree.SetFocus; APA_Degree_Edit.Tag:=1;//Edit Mode setzen mustsave:=true; end else showmessage('No Entry selected'); end; procedure TAPA_Parameter.FormClose(Sender: TObject; var Action: TCloseAction); begin if APA_Degree_Edit.Tag=1 then begin if messagedlg('Do you want to save your changes?',mtconfirmation,[mbyes,mbno],0)=mryes then APA_Degree_Save.Click else APA_Degree_Abort.Click; end; end; procedure TAPA_Parameter.APA_Degree_AbortClick(Sender: TObject); begin mustsave:=true; APA_Description_of_degree.Enabled:=false; APA_Count_of_Queries.Enabled:=false; APA_Degree_Insert.Enabled:=true; - 428 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN APA_Degree_Edit.Enabled:=true; APA_Degree_Save.Enabled:=false; APA_Degree_Delete.Enabled:=true; APA_Degree_Abort.Enabled:=false; APA_Degree_Edit.Tag:=0; end; procedure TAPA_Parameter.APA_Degree_DeleteClick(Sender: TObject); var ok:boolean; var aktzeile,aktspalte:longint; begin if APA_Degrees.ItemIndex<>-1 then begin ok:=true; for aktspalte:=0 to anzspalten-1 do begin for aktzeile:=0 to anzzeilen-1 do begin if APA[aktspalte,aktzeile].interessant=true then begin if APA[aktspalte,aktzeile].gewichtlevel=APA_Degrees.ItemIndex then begin ok:=false; end; end; end; end; if ok=false then showmessage('Degree is used in APA. Could not delete degree!'); if ok=true then begin for aktzeile:= 0 to APA_Selection_Screen.Listeint.items.count-1 do begin if copy(APA_Selection_Screen.Listeint.items[aktzeile],1,3)='Req' then begin if APA_Degrees.ItemIndex=strtoint(copy(APA_Selection_Screen.Listeint.items[aktzeile], 5,100)) then begin ok:=false; end; end; end; if ok=false then showmessage('Degree is used in Selection Screen. Could not delete degree!'); end; if ok=true then begin APA_Degreecounts.Items.Delete(APA_Degrees.ItemIndex); APA_Degrees.Items.Delete(APA_Degrees.ItemIndex); mustsave:=true; end; end else showmessage('No Entry selected'); end; procedure TAPA_Parameter.APA_Degree_upClick(Sender: TObject); var ok:boolean; var aktspalte,aktzeile:longint; begin if (APA_Degrees.ItemIndex<>-1) then begin if (APA_Degrees.ItemIndex<>0) then begin ok:=true; for aktspalte:=0 to anzspalten-1 do begin for aktzeile:=0 to anzzeilen-1 do begin if APA[aktspalte,aktzeile].interessant=true then begin if (APA[aktspalte,aktzeile].gewichtlevel=APA_Degrees.ItemIndex)or (APA[aktspalte,aktzeile].gewichtlevel=APA_Degrees.ItemIndex-1) then begin ok:=false; end; end; - 429 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; end; if ok=false then showmessage('Degree or upper degree is used in APA. Could not move degree!'); if ok=true then begin for aktzeile:= 0 to APA_Selection_Screen.Listeint.items.count-1 do begin if copy(APA_Selection_Screen.Listeint.items[aktzeile],1,3)='Req' then begin if (APA_Degrees.ItemIndex=strtoint(copy(APA_Selection_Screen.Listeint.items[aktzeile] ,5,100))) or (APA_Degrees.ItemIndex1=strtoint(copy(APA_Selection_Screen.Listeint.items[aktzeile],5,100)))then begin ok:=false; end; end; end; if ok=false then showmessage('Degree or upper degree is used in Selection Screen. Could not move degree!'); end; if ok=true then begin APA_Degrees.Items.Move(APA_Degrees.ItemIndex,APA_Degrees.ItemIndex-1); mustsave:=true; end; end else showmessage('Top Entry selected'); end else showmessage('No Entry selected'); end; procedure TAPA_Parameter.APA_Degree_DownClick(Sender: TObject); var ok:boolean; var aktspalte,aktzeile:longint; begin if (APA_Degrees.ItemIndex<>-1) then begin if (APA_Degrees.ItemIndex<>APA_Degrees.Items.Count-1) then begin ok:=true; for aktspalte:=0 to anzspalten-1 do begin for aktzeile:=0 to anzzeilen-1 do begin if APA[aktspalte,aktzeile].interessant=true then begin if (APA[aktspalte,aktzeile].gewichtlevel=APA_Degrees.ItemIndex)or (APA[aktspalte,aktzeile].gewichtlevel=APA_Degrees.ItemIndex+1) then begin ok:=false; end; end; end; end; if ok=false then showmessage('Degree oder lower degree is used in APA. Could not move degree!'); if ok=true then begin for aktzeile:= 0 to APA_Selection_Screen.Listeint.items.count-1 do begin if copy(APA_Selection_Screen.Listeint.items[aktzeile],1,3)='Req' then begin if (APA_Degrees.ItemIndex=strtoint(copy(APA_Selection_Screen.Listeint.items[aktzeile] ,5,100)))or (APA_Degrees.ItemIndex+1=strtoint(copy(APA_Selection_Screen.Listeint.items[aktzeil e],5,100))) then begin ok:=false; end; end; end; if ok=false then showmessage('Degree or lower degree is used in Selection Screen. Could not move degree!'); end; if ok=true then begin - 430 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN mustsave:=true; APA_Degrees.Items.Move(APA_Degrees.ItemIndex,APA_Degrees.ItemIndex+1); end; end else showmessage('Last Entry selected'); end else showmessage('No Entry selected'); end; procedure TAPA_Parameter.ColorBox1Exit(Sender: TObject); begin Colordialog.Execute; end; procedure TAPA_Parameter.ColorsgridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin Colorsgrid.Canvas.Brush.Color:=DegreeColors[Arow]; Colorsgrid.Canvas.FillRect(Rect); if Arow<APA_Degrees.items.count then begin Colorsgrid.Canvas.TextOut(round((Rect.left+Rect.right)/2)round(Colorsgrid.Canvas.TextWidth(APA_Degrees.items[Arow])/2), round((Rect.top+Rect.Bottom)/2)round(Colorsgrid.Canvas.TextHeight(APA_Degrees.items[Arow])/2),APA_Degrees.items[A row]) end else Colorsgrid.Canvas.TextOut(round((Rect.left+Rect.right)/2)round(Colorsgrid.Canvas.TextWidth('Entry '+inttostr(Arow))/2), round((Rect.top+Rect.Bottom)/2)-round(Colorsgrid.Canvas.TextHeight('Entry '+inttostr(Arow))/2),'Entry '+inttostr(Arow)); end; procedure TAPA_Parameter.APA_ChangecolorbuttonClick(Sender: TObject); begin mustsave:=true; if Colordialog.Execute then begin DegreeColors[Colorsgrid.Row]:=Colordialog.Color; Colorsgrid.Repaint; end; end; procedure TAPA_Parameter.Colorsgrid2DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin Colorsgrid.Canvas.Brush.Color:=DegreeColors[Arow]; Colorsgrid.Canvas.FillRect(Rect); if Arow<APA_Degrees.items.count then begin Colorsgrid.Canvas.TextOut(round((Rect.left+Rect.right)/2)round(Colorsgrid.Canvas.TextWidth(APA_Degrees.items[Arow])/2), round((Rect.top+Rect.Bottom)/2)round(Colorsgrid.Canvas.TextHeight(APA_Degrees.items[Arow])/2),APA_Degrees.items[A row]) end else Colorsgrid.Canvas.TextOut(round((Rect.left+Rect.right)/2)round(Colorsgrid.Canvas.TextWidth('Entry '+inttostr(Arow))/2), round((Rect.top+Rect.Bottom)/2)-round(Colorsgrid.Canvas.TextHeight('Entry '+inttostr(Arow))/2),'Entry '+inttostr(Arow)); end; procedure TAPA_Parameter.APA_Thomas_ImportanceChange(Sender: TObject); begin mustsave:=true; tomstorelabel.Caption:='Storage importance: '+ inttostr(100-APA_Thomas_Importance.Position)+' %'; tomtimelabel.Caption:='Time importance: '+ inttostr(APA_Thomas_Importance.Position)+' %'; end; - 431 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN procedure TAPA_Parameter.APA_Thomas_Query_ImportanceChange( Sender: TObject); begin mustsave:=true; tommatcosts.Caption:='Materialisation costs: '+ inttostr(100-APA_Thomas_Query_Importance.Position)+' %'; tomquerycosts.Caption:='Query costs: '+ inttostr(APA_Thomas_Query_Importance.Position)+' %'; end; procedure TAPA_Parameter.APA_Thomas_timemaxChange(Sender: TObject); begin mustsave:=true; end; procedure TAPA_Parameter.APA_Thomas_newsetsoneachiterationExit( Sender: TObject); begin APA_Thomas_newsetsoneachiteration.Text:= trim (APA_Thomas_newsetsoneachiteration.Text); try strtoint(APA_Thomas_newsetsoneachiteration.Text); except APA_Thomas_newsetsoneachiteration.Text:='2'; end; end; procedure TAPA_Parameter.APA_Thomas_countofsetsExit(Sender: TObject); begin APA_Thomas_countofsets.Text:= trim(APA_Thomas_countofsets.Text); try strtoint(APA_Thomas_countofsets.Text); except APA_Thomas_countofsets.Text:='10'; end; end; procedure TAPA_Parameter.APA_Thomas_timestoreExit(Sender: TObject); begin APA_Thomas_timestore.Text:= trim(APA_Thomas_timestore.Text); try strtofloat(APA_Thomas_timestore.Text); except APA_Thomas_timestore.Text:='2'; end; end; procedure TAPA_Parameter.APA_Thomas_timeioExit(Sender: TObject); begin APA_Thomas_timeio.Text:= trim(APA_Thomas_timeio.Text); try strtofloat(APA_Thomas_timeio.Text); except APA_Thomas_timeio.Text:='2'; end; end; procedure TAPA_Parameter.APA_Thomas_timecpuExit(Sender: TObject); begin APA_Thomas_timecpu.Text:= - 432 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN trim(APA_Thomas_timecpu.Text); try strtofloat(APA_Thomas_timecpu.Text); except APA_Thomas_timecpu.Text:='0,002'; end; end; procedure TAPA_Parameter.APA_Thomas_timemaxExit(Sender: TObject); begin APA_Thomas_timemax.Text:=trim(APA_Thomas_timemax.Text); try strtofloat(APA_Thomas_timemax.Text); except APA_Thomas_timemax.Text:='200000'; end; end; procedure TAPA_Parameter.APA_Thomas_querytimemaxExit(Sender: TObject); begin APA_Thomas_querytimemax.Text:=trim(APA_Thomas_querytimemax.Text); try strtofloat(APA_Thomas_querytimemax.Text); except APA_Thomas_querytimemax.Text:='20'; end; end; procedure TAPA_Parameter.APA_Thomas_avsizeoftupelExit(Sender: TObject); begin APA_Thomas_avsizeoftupel.Text:=trim(APA_Thomas_avsizeoftupel.Text); try strtofloat(APA_Thomas_avsizeoftupel.Text); except APA_Thomas_avsizeoftupel.Text:='32'; end; end; procedure TAPA_Parameter.APA_Thomas_spacemaxExit(Sender: TObject); begin APA_Thomas_spacemax.Text:=trim(APA_Thomas_spacemax.Text); try strtofloat(APA_Thomas_spacemax.Text); except APA_Thomas_spacemax.Text:='1000000'; end; end; procedure TAPA_Parameter.APA_Count_of_QueriesExit(Sender: TObject); begin APA_Count_of_Queries.Text:=trim(APA_Count_of_Queries.text); try strtoint(APA_Count_of_Queries.Text); except APA_Count_of_Queries.Text:='1'; end; end; end. - 433 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN 12.1.26 UNIT APA_PROCESSUNIT.DFM object APA_Show_Process: TAPA_Show_Process Left = 266 Top = 233 BorderStyle = bsDialog Caption = 'Show Process' ClientHeight = 278 ClientWidth = 322 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] FormStyle = fsStayOnTop OldCreateOrder = False Position = poScreenCenter OnClose = FormClose OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object Panel1: TPanel Left = 0 Top = 237 Width = 322 Height = 41 Align = alBottom TabOrder = 0 object ButtonCancel: TButton Left = 36 Top = 8 Width = 75 Height = 25 Caption = 'Abort' TabOrder = 0 OnClick = ButtonCancelClick end object ButtonPause: TButton Left = 184 Top = 8 Width = 75 Height = 25 Caption = 'Pause' TabOrder = 1 OnClick = ButtonPauseClick end end object GroupBox1: TGroupBox Left = 0 Top = 0 Width = 322 Height = 237 Align = alClient Caption = 'Protocoll' TabOrder = 1 OnDblClick = GroupBox1DblClick object APA_Protocoll: TListBox Left = 2 Top = 15 Width = 318 Height = 220 Align = alClient ItemHeight = 13 TabOrder = 0 end end object Ausschalten: TTimer Enabled = False Interval = 5000 OnTimer = AusschaltenTimer Left = 128 Top = 112 - 434 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end object secretMenu1: TPopupMenu Left = 176 Top = 64 object up1: TMenuItem Caption = 'up' OnClick = up1Click end object down1: TMenuItem Caption = 'down' OnClick = down1Click end object ShowProtokoll1: TMenuItem Caption = 'Show Protokoll' OnClick = ShowProtokoll1Click end object HideProtokoll1: TMenuItem Caption = 'Hide Protokoll' OnClick = HideProtokoll1Click end object Expertmode1: TMenuItem AutoCheck = True Caption = 'Expertmode' end end end 12.1.27 UNIT APA_PROCESSUNIT.PAS unit APA_Processunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Menus; type TAPA_Show_Process = class(TForm) Panel1: TPanel; ButtonCancel: TButton; GroupBox1: TGroupBox; APA_Protocoll: TListBox; ButtonPause: TButton; Ausschalten: TTimer; secretMenu1: TPopupMenu; up1: TMenuItem; down1: TMenuItem; ShowProtokoll1: TMenuItem; HideProtokoll1: TMenuItem; Expertmode1: TMenuItem; procedure ausgabe(Ausgabe:string); procedure FormShow(Sender: TObject); procedure ButtonCancelClick(Sender: TObject); procedure ButtonPauseClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure AusschaltenTimer(Sender: TObject); procedure GroupBox1DblClick(Sender: TObject); procedure up1Click(Sender: TObject); procedure down1Click(Sender: TObject); procedure ShowProtokoll1Click(Sender: TObject); procedure HideProtokoll1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var APA_Show_Process: TAPA_Show_Process; stop, break:boolean; implementation - 435 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN uses APA_Dialogunit; {$R *.dfm} var showprotokoll:boolean=true; procedure TAPA_Show_Process.ausgabe(Ausgabe:string); begin; if showprotokoll=true then begin APA_Show_Process.APA_Protocoll.Items.Add(Ausgabe); APA_Show_Process.APA_Protocoll.ItemIndex:=APA_Show_Process.APA_Protocoll.Items.Cou nt-1; Application.ProcessMessages; end; end; procedure TAPA_Show_Process.FormShow(Sender: TObject); begin stop:=false; end; procedure TAPA_Show_Process.ButtonCancelClick(Sender: TObject); begin stop:=true; break:=false; Ausschalten.Enabled:=false; APA_Show_Process.ButtonPause.Visible:=true; Close; end; procedure TAPA_Show_Process.ButtonPauseClick(Sender: TObject); begin if break=false then begin break:=true; ButtonPause.Caption:='Resume'; end else begin break:=false; ButtonPause.Caption:='Pause'; end; end; procedure TAPA_Show_Process.FormClose(Sender: TObject; var Action: TCloseAction); begin Stop:=true; break:=false; showprotokoll:=true; APA_Show_Process.ButtonCancel.Caption:='Abort'; end; procedure TAPA_Show_Process.AusschaltenTimer(Sender: TObject); begin Ausschalten.Enabled:=false; APA_Show_Process.ButtonPause.Visible:=true; Close; end; procedure TAPA_Show_Process.GroupBox1DblClick(Sender: TObject); begin Groupbox1.PopupMenu:=secretMenu1; end; procedure TAPA_Show_Process.up1Click(Sender: TObject); begin APA_Dialog.APA_Text.Caption:='Are you sure?'; if APA_Dialog.showmodal=mryes then Groupbox1.Tag:=1; end; procedure TAPA_Show_Process.down1Click(Sender: TObject); begin APA_Dialog.APA_Text.Caption:='Are you sure?'; - 436 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if APA_Dialog.showmodal=mryes then Groupbox1.Tag:=-1; end; procedure TAPA_Show_Process.ShowProtokoll1Click(Sender: TObject); begin showprotokoll:=true; end; procedure TAPA_Show_Process.HideProtokoll1Click(Sender: TObject); begin showprotokoll:=false; end; end. 12.1.28 UNIT APA_SCREENUNIT.DFM object APA_Screen: TAPA_Screen Left = 308 Top = 209 BorderStyle = bsNone Caption = 'APA_Screen' ClientHeight = 182 ClientWidth = 233 Color = clWhite Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] FormStyle = fsStayOnTop OldCreateOrder = False Position = poScreenCenter OnClick = FormClick OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object Shape1: TShape Left = 0 Top = 0 Width = 233 Height = 182 Align = alClient Pen.Color = clGreen Pen.Width = 2 OnMouseDown = Shape2MouseDown end object Shape2: TShape Left = 4 Top = 4 Width = 225 Height = 173 Pen.Color = clGreen OnMouseDown = Shape2MouseDown end object Image1: TImage Left = 69 Top = 32 Width = 95 Height = 90 AutoSize = True Picture.Data = { 07544269746D6170F6250000424DF62500000000000036040000280000005F00 00005A0000000100080000000000C0210000120B0000120B0000000100000000 000000000000330000006600000099000000CC000000FF000000003300003333 . . . . . . D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 D700D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 - 437 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 D700} OnClick = Image1Click end object Label1: TLabel Left = 19 Top = 8 Width = 195 Height = 23 Caption = 'APA Application' Font.Charset = DEFAULT_CHARSET Font.Color = clGreen Font.Height = -21 Font.Name = 'Courier New' Font.Style = [fsBold] ParentFont = False end object Label2: TLabel Left = 62 Top = 120 Width = 110 Height = 18 Caption = 'designed by' Font.Charset = DEFAULT_CHARSET Font.Color = clGreen Font.Height = -16 Font.Name = 'Courier New' Font.Style = [fsBold] ParentFont = False end object Label3: TLabel Left = 62 Top = 140 Width = 110 Height = 18 Caption = 'Thomas ACHS' Font.Charset = DEFAULT_CHARSET Font.Color = clGreen Font.Height = -16 Font.Name = 'Courier New' Font.Style = [fsBold] ParentFont = False end object Label4: TLabel Left = 69 Top = 161 Width = 100 Height = 10 Align = alCustom Alignment = taCenter Caption = ' Starting Program...' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -9 Font.Name = 'Lucida Sans Typewriter' Font.Style = [] ParentFont = False end object Timer1: TTimer Interval = 100 OnTimer = Timer1Timer Left = 32 Top = 48 end end 12.1.29 UNIT APA_SCREENUNIT.PAS unit APA_Screenunit; interface - 438 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, DB, DBTables; type TAPA_Screen = class(TForm) Image1: TImage; Shape1: TShape; Shape2: TShape; Label1: TLabel; Label2: TLabel; Label3: TLabel; Timer1: TTimer; Label4: TLabel; procedure FormClick(Sender: TObject); procedure Image1Click(Sender: TObject); procedure Shape2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var APA_Screen: TAPA_Screen; implementation uses APA_Applicationunit; {$R *.dfm} var counter:longint=0; procedure TAPA_Screen.FormClick(Sender: TObject); begin Counter:=100; end; procedure TAPA_Screen.Image1Click(Sender: TObject); begin Counter:=100; end; procedure TAPA_Screen.Shape2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Counter:=100; end; procedure TAPA_Screen.Timer1Timer(Sender: TObject); begin counter:=counter+1; if counter=10 then Label4.Caption:=' Loading Settings...'; if counter=25 then Label4.Caption:=' Ready to start...'; if counter>30 then begin; Timer1.Enabled:=false; APA_Screen.Hide; APA_Application.showmodal; Close; end; end; procedure TAPA_Screen.FormCreate(Sender: TObject); begin CurrencyString:=''; ShortDateFormat:='dd.mm.yyyy'; LongDateFormat:='dd.mm.yyyy'; DateSeparator := '.'; ThousandSeparator:='.'; - 439 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN DecimalSeparator:=','; CurrencyDecimals:=2; ShortTimeFormat:='hh:nn'; LongTimeFormat:='hh:nn'; end; end. 12.1.30 UNIT APA_SELECTIONUNIT.DFM object APA_Selection_Screen: TAPA_Selection_Screen Left = 100 Top = 115 Width = 760 Height = 551 Caption = 'APA Selection Screen' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object Panel2: TPanel Left = 0 Top = 476 Width = 752 Height = 41 Align = alBottom TabOrder = 0 object Button_show_current_APA: TButton Left = 8 Top = 8 Width = 155 Height = 25 Caption = 'Show current APA' ModalResult = 3 TabOrder = 0 OnClick = Button_show_current_APAClick end object Button_delete_all: TButton Left = 330 Top = 8 Width = 155 Height = 25 Caption = 'Delete all req. blocks && cubes' TabOrder = 1 OnClick = Button_delete_allClick end object Button_add_to_selection: TButton Left = 169 Top = 8 Width = 155 Height = 25 Caption = 'Add to selection' Enabled = False ModalResult = 4 TabOrder = 2 OnClick = Button_add_to_selectionClick end object Button_Main_Menu: TButton Left = 490 Top = 8 Width = 155 Height = 25 Caption = 'Back to Main Menu' TabOrder = 3 OnClick = Button_Main_MenuClick - 440 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end end object GroupBox1: TGroupBox Left = 0 Top = 0 Width = 752 Height = 145 Align = alTop Caption = 'Selection' TabOrder = 1 object Label1: TLabel Left = 120 Top = 20 Width = 52 Height = 13 Caption = 'Dimension:' end object Label2: TLabel Left = 124 Top = 44 Width = 48 Height = 13 Caption = 'Hierarchy:' end object Label3: TLabel Left = 133 Top = 68 Width = 39 Height = 13 Caption = 'Method:' end object Label4: TLabel Left = 100 Top = 92 Width = 72 Height = 13 Caption = 'End of method:' end object Dimensionbox: TComboBox Left = 184 Top = 16 Width = 421 Height = 21 Style = csDropDownList ItemHeight = 13 ItemIndex = 0 TabOrder = 0 Text = 'NONE' OnChange = DimensionboxChange Items.Strings = ( 'NONE') end object Hierarchybox: TComboBox Left = 184 Top = 40 Width = 421 Height = 21 Style = csDropDownList ItemHeight = 13 ItemIndex = 0 TabOrder = 2 Text = 'NONE' OnChange = HierarchyboxChange Items.Strings = ( 'NONE') end object Methodbox: TComboBox Left = 184 Top = 64 Width = 421 Height = 21 Style = csDropDownList ItemHeight = 13 ItemIndex = 0 - 441 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN TabOrder = 4 Text = 'NONE' OnChange = HierarchyboxChange Items.Strings = ( 'NONE' 'DRILL DOWN' 'ROLL UP') end object End_of_methodbox: TComboBox Left = 184 Top = 88 Width = 421 Height = 21 Style = csDropDownList ItemHeight = 13 ItemIndex = 0 TabOrder = 6 Text = 'NONE' Items.Strings = ( 'NONE') end object Button_insert: TButton Left = 186 Top = 111 Width = 77 Height = 25 Caption = 'Insert' TabOrder = 8 OnClick = Button_insertClick end object Button_delete: TButton Left = 265 Top = 111 Width = 77 Height = 25 Caption = 'Delete' Enabled = False TabOrder = 1 OnClick = Button_deleteClick end object Button_Edit: TButton Left = 345 Top = 111 Width = 77 Height = 25 Caption = 'Edit' Enabled = False TabOrder = 3 OnClick = Button_EditClick end object Button_Accept: TButton Left = 424 Top = 111 Width = 75 Height = 25 Caption = 'Accept' TabOrder = 5 OnClick = Button_AcceptClick end object Button_Cancel: TButton Left = 504 Top = 111 Width = 75 Height = 25 Caption = 'Cancel' TabOrder = 7 OnClick = Button_CancelClick end end object Listeint: TListBox Left = 602 Top = 145 Width = 150 Height = 331 - 442 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Align = alRight ItemHeight = 13 TabOrder = 2 Visible = False end object Panel1: TPanel Left = 0 Top = 145 Width = 193 Height = 331 Align = alLeft TabOrder = 3 object Panel3: TPanel Left = 1 Top = 1 Width = 191 Height = 238 Align = alTop TabOrder = 0 object Button_new_requirement_block: TButton Left = 8 Top = 8 Width = 169 Height = 25 Caption = 'New req. block' TabOrder = 0 OnClick = Button_new_requirement_blockClick end object Button_del_req_block: TButton Left = 8 Top = 61 Width = 169 Height = 25 Caption = 'Delete req. block' Enabled = False TabOrder = 1 OnClick = Button_del_req_blockClick end object Button_select: TButton Left = 8 Top = 88 Width = 169 Height = 25 Caption = 'Select' Enabled = False TabOrder = 2 OnClick = Button_selectClick end object Button_Deselect: TButton Left = 8 Top = 115 Width = 169 Height = 25 Caption = 'Deselect' Enabled = False TabOrder = 3 OnClick = Button_DeselectClick end object Button_Select_all: TButton Left = 8 Top = 142 Width = 169 Height = 25 Caption = 'Select all' TabOrder = 4 OnClick = Button_Select_allClick end object Button_Deselect_all: TButton Left = 8 Top = 169 Width = 169 Height = 25 Caption = 'Deselect all' TabOrder = 5 - 443 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN OnClick = Button_Deselect_allClick end object Button_Edit_Requirement_block: TButton Left = 7 Top = 34 Width = 169 Height = 25 Caption = 'Edit req. block' Enabled = False TabOrder = 6 OnClick = Button_Edit_Requirement_blockClick end end end object Req: TTreeView Left = 193 Top = 145 Width = 409 Height = 331 Align = alClient Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = 'MS Sans Serif' Font.Style = [] Images = ImageList2 Indent = 19 ParentFont = False ReadOnly = True TabOrder = 4 OnClick = ReqClick OnDblClick = ReqDblClick end object ImageList2: TImageList Left = 448 Top = 288 Bitmap = { 494C010103000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000001000000001002000000000000010 000000000000000000000000000000000000344E4A006BB09B006BB09B006BB0 . . . . . . 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000} end end 12.1.31 UNIT APA_SELECTIONUNIT.PAS unit APA_Selectionunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ImgList, ComCtrls, StdCtrls, ExtCtrls; type TAPA_Selection_Screen = class(TForm) Panel2: TPanel; Button_show_current_APA: TButton; Button_delete_all: TButton; Button_add_to_selection: TButton; Button_Main_Menu: TButton; GroupBox1: TGroupBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Dimensionbox: TComboBox; - 444 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Hierarchybox: TComboBox; Methodbox: TComboBox; End_of_methodbox: TComboBox; Button_insert: TButton; Button_delete: TButton; Button_Edit: TButton; Button_Accept: TButton; Button_Cancel: TButton; Listeint: TListBox; Panel1: TPanel; Panel3: TPanel; Button_new_requirement_block: TButton; Button_del_req_block: TButton; Button_select: TButton; Button_Deselect: TButton; Button_Select_all: TButton; Button_Deselect_all: TButton; Button_Edit_Requirement_block: TButton; Req: TTreeView; ImageList2: TImageList; procedure DimensionboxChange(Sender: TObject); procedure HierarchyboxChange(Sender: TObject); procedure Button_new_requirement_blockClick(Sender: TObject); procedure Button_Edit_Requirement_blockClick(Sender: TObject); procedure Button_selectClick(Sender: TObject); procedure Button_DeselectClick(Sender: TObject); procedure Button_del_req_blockClick(Sender: TObject); procedure Button_insertClick(Sender: TObject); procedure ReqClick(Sender: TObject); procedure Button_Select_allClick(Sender: TObject); procedure Button_Deselect_allClick(Sender: TObject); procedure Button_deleteClick(Sender: TObject); procedure Button_EditClick(Sender: TObject); procedure Button_AcceptClick(Sender: TObject); procedure Button_CancelClick(Sender: TObject); procedure ReqDblClick(Sender: TObject); procedure Button_show_current_APAClick(Sender: TObject); procedure Button_add_to_selectionClick(Sender: TObject); procedure Button_delete_allClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure Button_Main_MenuClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var APA_Selection_Screen: TAPA_Selection_Screen; gotoAPA:boolean=false; implementation uses APA_Input_Reqblockunit, APA_Gridunit, APA_Parameterunit, APA_Optionsunit, APA_Dialogunit, APA_Applicationunit; {$R *.dfm} var editmode:boolean =false; editnode:TTreeNode; anzblocksselected:longint =0; function vergleichewuerfel(erster,zweiter:array of longint;Dimensionen:longint):longint; var zahler:longint; ergebnis0,ergebnisminus1:boolean; begin {Diese Funktion Vergleicht die beiden Würfel und gibt 1 zurück, wenn der Zweite kein Derivate des ersten ist. 0 wenn gleich und sonst -1} ergebnis0:=true;ergebnisminus1:=false; For zahler:=0 to Dimensionen-1 do begin if (erster[zahler]<zweiter[zahler]) then ergebnisminus1:=true; if (erster[zahler]<>zweiter[zahler]) then ergebnis0:=false; - 445 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; if ergebnisminus1=true then Result:=-1 else if ergebnis0=false then Result:=1 else Result:=0; end; function getbezeichnung():string; var st2,st:string; begin; {Diese Funktion erzeugt die Bezeichnung für den Eintrag in der Anzeige} with APA_Selection_Screen do begin {Auflösen der Bezeichnung in der Spezialbox} st2:=inttostr(dimensionbox.itemindex);while length(st2)<4 do st2:='0'+st2; st:=st2; st2:=inttostr(hierarchybox.itemindex);while length(st2)<4 do st2:='0'+st2; st:=st+st2; st2:=inttostr(Methodbox.itemindex);while length(st2)<4 do st2:='0'+st2; st:=st+st2; if Methodbox.ItemIndex<>2 then st2:=inttostr(End_of_methodbox.itemindex) else st2:=inttostr(End_of_methodbox.itemindex+1); while length(st2)<4 do st2:='0'+st2; st:=st+st2; result:=st; end; end; function kannzusetzen:boolean; var zahler:longint; zusetzen,ende:boolean; begin; with APA_Selection_Screen do begin zusetzen:=true;ende:=false; zahler:=Req.Selected.AbsoluteIndex; {Von der Position bis nach unten zum nächsten Req oder dem Ende} repeat if copy(Listeint.items[zahler],1,4)<>'Req:' then if (editmode=false)or((editmode=true)and(editnode.AbsoluteIndex<>zahler)) then begin if strtoint(copy(Listeint.Items[zahler],1,4))=Dimensionbox.ItemIndex then zusetzen:=false; end; zahler:=zahler+1;if zahler>=Listeint.Items.Count-1 then begin; ende:=true;zahler:=Listeint.items.count-1; end; until (copy(Listeint.Items[zahler],1,4)='Req:')or(ende=true); {Von der Position bis nach oben zum nächsten Req oder zum Beginn} ende:=false; repeat; if copy(Listeint.items[zahler],1,4)<>'Req:' then if (editmode=false)or((editmode=true)and(editnode.AbsoluteIndex<>zahler)) - 446 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN then begin if strtoint(copy(Listeint.Items[zahler],1,4))=Dimensionbox.ItemIndex then zusetzen:=false; end; zahler:=zahler-1;if zahler<=0 then begin;ende:=true;zahler:=0;end; if ende=false then begin if (copy(Listeint.items[zahler+1],1,4)='Req:')and(Listeint.Items.Count1=zahler+1) then begin; ende:=true;zahler:=zahler+1; end; end; until (copy(Listeint.Items[zahler],1,4)='Req:')or(ende=true); result:=zusetzen; end; end; procedure buttonreqchange; var aktindex:longint; aktiviert:boolean; begin; with APA_Selection_Screen do begin if Req.Enabled=true then Req.SetFocus; {Suche den Status der Hierarchie} if Req.Selected<>nil then aktindex:=Req.Selected.AbsoluteIndex else aktindex:=0; aktiviert:=false; if Listeint.items.count>0 then begin while(copy(Listeint.Items[aktindex],1,4)<>'Req:')and(aktindex>0) do begin aktindex:=aktindex-1; end; if Req.Items[aktindex].ImageIndex<>2 then aktiviert:=true; end; if Editmode=true then begin {Links alles deaktivieren} Button_Edit_Requirement_Block.Enabled:=false; Button_new_requirement_block.Enabled:=false; Button_del_req_block.Enabled:=false; Button_select.Enabled:=false; Button_Deselect.Enabled:=false; Button_Select_all.Enabled:=false; Button_Deselect_all.Enabled:=false; {Unten alles deaktivieren} Button_show_current_APA.Enabled:=false; Button_add_to_selection.Enabled:=false; Button_delete_all.Enabled:=false; {Oben nur Accept und Cancel aktivieren} Button_Insert.Enabled:=false; Button_Edit.Enabled:=false; Button_Delete.Enabled:=false; Button_Accept.Enabled:=true; Button_Cancel.Enabled:=true; Req.Enabled:=false; end else begin; {Unten alles aktivieren} {anzblocksselected gibt die Anzahl der Selektieren Blocks wieder} if anzblocksselected<>0 then begin; - 447 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Button_show_current_APA.Enabled:=false; Button_add_to_selection.Enabled:=true; end else begin Button_show_current_APA.Enabled:=true; Button_add_to_selection.Enabled:=false; end; Button_delete_all.Enabled:=true; if req.selected<>nil then begin if aktiviert=true then begin Button_Edit_Requirement_Block.Enabled:=true; Button_new_requirement_block.Enabled:=true; Button_del_req_block.Enabled:=true; end else begin Button_Edit_Requirement_Block.Enabled:=false; Button_new_requirement_block.Enabled:=true; Button_del_req_block.Enabled:=false; end; Button_Select_all.Enabled:=true; Button_Deselect_all.Enabled:=true; if req.Selected.Level=0 then begin if req.Selected.ImageIndex=0 then begin Button_select.Enabled:=true; Button_Deselect.Enabled:=false; end else begin if req.Selected.ImageIndex=1 then begin Button_select.Enabled:=false; Button_Deselect.Enabled:=true; end else begin //Bereits zugesetzt Button_select.Enabled:=false; Button_Deselect.Enabled:=false; end; end; {Ist eine Hierarchie ausgewählt dann alle deaktiveren außer insert} if aktiviert=true then Button_Insert.Enabled:=true else Button_Insert.Enabled:=false; Button_Edit.Enabled:=false; Button_Delete.Enabled:=false; Button_Accept.Enabled:=false; Button_Cancel.Enabled:=false; Req.Enabled:=true; end {of level 0} else begin {begin von level 1} Button_Edit_Requirement_Block.Enabled:=false; if aktiviert=true then Button_new_requirement_block.Enabled:=true else Button_new_requirement_block.Enabled:=true; Button_del_req_block.Enabled:=false; Button_select.Enabled:=false; Button_Deselect.Enabled:=false; if aktiviert=true then begin Button_Insert.Enabled:=true; Button_Edit.Enabled:=true; Button_Delete.Enabled:=true; end else begin Button_Insert.Enabled:=false; Button_Edit.Enabled:=false; Button_Delete.Enabled:=false; - 448 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Req.Enabled:=false; end; Button_Accept.Enabled:=false; Button_Cancel.Enabled:=false; Req.Enabled:=true; end; end else begin {Wenn nichts ausgewählt} {Buttons links} Button_Edit_Requirement_Block.Enabled:=false; Button_new_requirement_block.Enabled:=true; Button_del_req_block.Enabled:=false; {Buttons oben} if aktiviert=true then Button_Insert.Enabled:=true else Button_Insert.Enabled:=false; Button_Edit.Enabled:=false; Button_Delete.Enabled:=false; Button_Accept.Enabled:=false; Button_Cancel.Enabled:=false; Req.Enabled:=true; end; end;{of editmode} end; end; procedure TAPA_Selection_Screen.DimensionboxChange(Sender: TObject); var zahler:longint; begin if Dimensionbox.Text<>'NONE' then begin hierarchybox.Items.Clear; {Hole die Hierarchiestufen} for zahler:=0 to anzh[Dimensionbox.itemindex]-1 do begin Hierarchybox.Items.Add(dl[Dimensionbox.itemindex][zahler]) end; Hierarchybox.ItemIndex:=0; Methodbox.ItemIndex:=0; end; end; procedure TAPA_Selection_Screen.HierarchyboxChange(Sender: TObject); var zahler:longint; begin if Methodbox.itemindex<>0 then begin End_of_methodbox.Enabled:=true; if Methodbox.ItemIndex=2 then begin {Bei einem Roll up} End_of_Methodbox.Items.Clear; {Hole die Hierarchiestufen} for zahler:=hierarchybox.itemindex+1 to anzh[Dimensionbox.itemindex]-1 do begin End_of_Methodbox.Items.Add(dl[Dimensionbox.itemindex][zahler]) end; end else begin {Bei einem DRILL DOWN} End_of_Methodbox.Items.Clear; {Hole die Hierarchiestufen} for zahler:=0 to hierarchybox.itemindex-1 do begin End_of_Methodbox.Items.Add(dl[Dimensionbox.itemindex][zahler]) end; - 449 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end; end else begin; End_of_methodbox.Enabled:=false; End_of_methodbox.Items.Add('NONE'); end; if End_of_Methodbox.Items.Count=0 then begin; Methodbox.ItemIndex:=0; End_of_methodbox.Enabled:=false; End_of_methodbox.Items.Add('NONE'); end; End_of_methodbox.ItemIndex:=0; end; procedure TAPA_Selection_Screen.Button_new_requirement_blockClick( Sender: TObject); var g:longint; importancestring:string; merkindex:longint; ok:boolean; begin mustsave:=true; {Ein Req} APA_Insert_Reqblock.Reqname.Text:=''; APA_Insert_Reqblock.OKBtn.Enabled:=false; APA_insert_Reqblock.Add_max_hier.Visible:=APA_Options.APA_Add_max_hier.checked; APA_Insert_Reqblock.Add_max_hier.Enabled:=true; repeat; ok:=true; if APA_Insert_Reqblock.showmodal=mrok then begin for merkindex:=0 to Req.Items.Count-1 do begin if copy(Listeint.Items[merkindex],1,3)='Req' then begin if (copy(Req.items[merkindex].text,1,pos('//',Req.items[merkindex].Text)-1)= APA_Insert_reqblock.reqname.Text) then begin ok:=false; showmessage('The name '+APA_Insert_reqblock.reqname.Text+' is already used. Please change the name!'); end; end; end; if ok=true then begin if Req.TopItem<>nil then Req.Selected:=Req.TopItem; importancestring:=APA_Parameter.APA_Degrees.Items[APA_Insert_Reqblock.Importance_o f_requirement.Itemindex]; merkindex:=Req.Items.Add(req.Selected,APA_Insert_reqblock.reqname.Text+'//'+import ancestring).AbsoluteIndex; Req.Items[merkindex].ImageIndex:=0; Req.Items[merkindex].SelectedIndex:=0; Req.Selected:=Req.Items[Req.Items.count-1]; Listeint.Items.Add('Req:'+inttostr(APA_Insert_Reqblock.Importance_of_requirement.I temindex)); if APA_insert_Reqblock.Add_max_hier.Checked=true then begin {Zusetzen aller Dimensionen mit max. Hierarchielevels} for g:=0 to Dimensionbox.Items.Count-1 do begin; {Dimension einstellen} Dimensionbox.ItemIndex:=g;DimensionboxChange(self); {max Hierarchie einstellen} - 450 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Hierarchybox.ItemIndex:=Hierarchybox.items.count-1; {Methode ist Keine} Methodbox.ItemIndex:=0; {End of Methode ist auch keine} End_of_Methodbox.ItemIndex:=0; Button_insertClick(self); end; end; end;//von ok end else ok:=true; until ok=true; {Ein Req ENDE} buttonreqchange; Req.SetFocus; end; procedure TAPA_Selection_Screen.Button_Edit_Requirement_blockClick( Sender: TObject); var importancestring:string; var ok:boolean; var merkindex:longint; begin if Req.Selected<>nil then begin try {Ein Req} APA_Insert_Reqblock.Reqname.Text:=copy(Req.Selected.text,1,pos('//',Req.Selected.T ext)-1); APA_Insert_Reqblock.OKBtn.Enabled:=false; APA_insert_Reqblock.Add_max_hier.Visible:=false; APA_Insert_Reqblock.Importance_of_requirement.ItemIndex:= strtoint(copy(Listeint.Items[Req.Selected.Absoluteindex],5,255)); repeat; ok:=true; if APA_Insert_Reqblock.showmodal=mrok then begin for merkindex:=0 to Req.Items.Count-1 do begin if copy(Listeint.Items[merkindex],1,3)='Req' then begin if (copy(Req.items[merkindex].text,1,pos('//',Req.items[merkindex].Text)-1)= APA_Insert_reqblock.reqname.Text)and(Req.Selected<>Req.Items[merkindex]) then begin ok:=false; showmessage('The name '+APA_Insert_reqblock.reqname.Text+' is already used. Please change the name!'); end; end; end; if ok=true then begin importancestring:=APA_Parameter.APA_Degrees.Items[APA_Insert_Reqblock.Importance_o f_requirement.Itemindex]; Req.Selected.Text:=APA_Insert_Reqblock.reqname.Text+'//'+importancestring; Listeint.Items[Req.Selected.Absoluteindex]:='Req:'+inttostr(APA_Insert_Reqblock.Im portance_of_requirement.Itemindex); mustsave:=true; end;//of ok - 451 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end else ok:=true; until ok=true; {Ein Req ENDE} buttonreqchange; except showmessage('Fehler beim Auflösen der Daten'); buttonreqchange; exit; end; Req.SetFocus; end; end; procedure TAPA_Selection_Screen.Button_selectClick(Sender: TObject); begin Req.Selected.ImageIndex:=1; Req.Selected.SelectedIndex:=1; anzblocksselected:=anzblocksselected+1; buttonreqchange; end; procedure TAPA_Selection_Screen.Button_DeselectClick(Sender: TObject); begin if Req.Selected.ImageIndex=1 then begin Req.Selected.ImageIndex:=0; Req.Selected.SelectedIndex:=0; anzblocksselected:=anzblocksselected-1; buttonreqchange; end; end; procedure TAPA_Selection_Screen.Button_del_req_blockClick(Sender: TObject); var loschebis,zahler:longint; begin {Löschen der Einträge in Listeint} {1. Lösch so lange bis das nächste Req kommt} loschebis:=Req.Selected.AbsoluteIndex; repeat; loschebis:=loschebis+1; until(copy(Listeint.items[loschebis+1],1,4)='Req:') or(loschebis+1=Listeint.Items.Count-1); if loschebis+1=Listeint.Items.Count-1 then loschebis:=loschebis+1; for zahler:=0 to (loschebis-Req.Selected.AbsoluteIndex) do Listeint.Items.Delete(Req.Selected.AbsoluteIndex); Req.Selected.Delete; buttonreqchange; mustsave:=true; end; procedure TAPA_Selection_Screen.Button_insertClick(Sender: TObject); var st,st2:string; x:longint; begin if req.Selected=nil then begin; APA_Insert_Reqblock.Add_max_hier.Enabled:=true; APA_Insert_Reqblock.Add_max_hier.Checked:=false; Button_new_requirement_block.Click; Req.SetFocus; end; st2:=getbezeichnung(); {speichern der Spezialbezeichnung in st2} if kannzusetzen()=true then begin{Zusetzen der Bezeichnung} {Zusetzen der Anzeigebezeichnung in die Liste} st:='Choose from '+Dimensionbox.Text+' hierarchy '+hierarchybox.text; - 452 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if Methodbox.ItemIndex<>0 then begin st:=st+' and a '+Methodbox.Text+' to '+End_of_Methodbox.Text; end; if req.Selected.Level=0 then {wenn Dimension markiert} x:=Req.Items.AddChild(Req.Selected, st).AbsoluteIndex else {wenn Hierarchy markiert} x:=Req.Items.Add(Req.Selected, st).AbsoluteIndex; {Zusetzen der Spezialbezeichnung in die Liste} Listeint.Items.insert(x, st2); Req.Items[x].ImageIndex:=6; Req.Items[x].SelectedIndex:=6; Req.selected.expand(true); mustsave:=true; end{End of Zusetzen} else showmessage('Diese Hierarchie wurde bereits zugesetzt'); buttonreqchange; end; procedure TAPA_Selection_Screen.ReqClick(Sender: TObject); begin buttonreqchange; end; procedure TAPA_Selection_Screen.Button_Select_allClick(Sender: TObject); var zahler:longint; begin anzblocksselected:=0; for zahler:=0 to Req.Items.Count-1 do begin if (req.items[zahler].Level=0)and(req.Items[zahler].ImageIndex<>2) then begin Req.items[zahler].ImageIndex:=1; Req.items[zahler].SelectedIndex:=1; anzblocksselected:=anzblocksselected+1; end; end; Req.Repaint; buttonreqchange; end; procedure TAPA_Selection_Screen.Button_Deselect_allClick(Sender: TObject); var zahler:longint; begin for zahler:=0 to req.Items.Count-1 do begin if (req.items[zahler].Level=0)and(Req.items[zahler].ImageIndex<>2) then begin Req.items[zahler].ImageIndex:=0; Req.items[zahler].SelectedIndex:=0; end; end; Req.Repaint; buttonreqchange; anzblocksselected:=0; buttonreqchange; end; procedure TAPA_Selection_Screen.Button_deleteClick(Sender: TObject); begin Listeint.Items.Delete(Req.Selected.AbsoluteIndex); Req.Selected.Delete; - 453 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN buttonreqchange; mustsave:=true; end; procedure TAPA_Selection_Screen.Button_EditClick(Sender: TObject); var st:string; begin if Req.Selected<>nil then begin editnode:=Req.Selected; editmode:=true; {Daten laden} st:=Listeint.Items[Req.Selected.Absoluteindex]; try Dimensionbox.ItemIndex:=strtoint(copy(st,1,4));DimensionboxChange(self); Hierarchybox.ItemIndex:=strtoint(copy(st,5,4)); Methodbox.ItemIndex:=strtoint(copy(st,9,4)); End_of_methodbox.ItemIndex:=strtoint(copy(st,13,4)); mustsave:=true; except showmessage('Fehler beim Auflösen der Daten'); editmode:=false;buttonreqchange; exit; end; end; buttonreqchange; end; procedure TAPA_Selection_Screen.Button_AcceptClick(Sender: TObject); var st:string; begin editnode.Selected:=true; if kannzusetzen()=true then begin{Zusetzen der Bezeichnung} {Zusetzen der Anzeigebezeichnung in die Liste} st:='Choose from '+Dimensionbox.Text+' hierarchy '+hierarchybox.text; if Methodbox.ItemIndex<>0 then begin st:=st+' and a '+Methodbox.Text+' to '+End_of_Methodbox.Text; end; Req.Selected.Text:=st; {Zusetzen der Spezialbezeichnung in die Liste} Listeint.Items[Req.Selected.AbsoluteIndex]:=getbezeichnung(); Req.selected.expand(true); mustsave:=true; end{End of Zusetzen} else showmessage('Diese Hierarchie wurde bereits zugesetzt'); editmode:=false; buttonreqchange; end; procedure TAPA_Selection_Screen.Button_CancelClick(Sender: TObject); begin editmode:=false; buttonreqchange; end; procedure TAPA_Selection_Screen.ReqDblClick(Sender: TObject); begin if copy(Listeint.items[Req.Selected.AbsoluteIndex],1,4)<>'Req:' then begin if Button_Edit.Enabled=true then begin Button_Edit.Click; - 454 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end else showmessage('Edit not allowed'); end; end; procedure TAPA_Selection_Screen.Button_show_current_APAClick( Sender: TObject); begin gotoAPA:=true; end; procedure TAPA_Selection_Screen.Button_add_to_selectionClick( Sender: TObject); var akth:array of longint; newbegin,newende,newakt:array of longint; zahler,zahler2:longint; spalte,zeile,aktdim:longint; ende,endifredundant,endedieserzeile,enderollup:boolean; copystring:string; gewicht:longint; begin {Zusetzen der Selektierten Cubes zum APA} mustsave:=true; {1. Feststellen des Cubes, welcher zugesetzt wird} for zahler:=0 to Listeint.Items.Count-1 do begin if(copy(Listeint.Items[zahler],1,4)='Req:')and(Req.Items[zahler].ImageIndex=1) then begin Req.Items[Zahler].ImageIndex:=2; Req.Items[Zahler].SelectedIndex:=2; gewicht:=strtoint(copy(Listeint.Items[zahler],5,255)); newbegin:=nil; setlength(newbegin,anzd); newende:=nil; setlength(newende,anzd); {Alle Hierarchiestufen der Dimensionen auf max setzen} for zahler2:=0 to anzd-1 do newbegin[zahler2]:=anzh[zahler2]-1; for zahler2:=0 to anzd-1 do newende[zahler2]:=anzh[zahler2]-1; zahler2:=zahler+1;copystring:=copy(Listeint.Items[zahler2],1,4); while (copystring<>'Req:')and(zahler2<Listeint.Items.Count) do begin {Auflösen des Eintrages in Listeint} if (strtoint(copy(Listeint.Items[zahler2],9,4))=0) then begin; {Wenn Method ist NONE also kein Dill Down oder Roll up} newbegin[(strtoint(copy(Listeint.Items[zahler2],1,4)))]:=strtoint(copy(Listeint.It ems[zahler2],5,4)); newende[(strtoint(copy(Listeint.Items[zahler2],1,4)))]:=strtoint(copy(Listeint.Ite ms[zahler2],5,4)); end else begin {Wenn die Methode ein Drill Down oder Roll up} if(strtoint(copy(Listeint.Items[zahler2],9,4))=1) then begin {Drill Down} newbegin[(strtoint(copy(Listeint.Items[zahler2],1,4)))]:=strtoint(copy(Listeint.It ems[zahler2],13,4)); newende[(strtoint(copy(Listeint.Items[zahler2],1,4)))]:=strtoint(copy(Listeint.Ite ms[zahler2],5,4)); end else begin {Roll up} - 455 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN newbegin[(strtoint(copy(Listeint.Items[zahler2],1,4)))]:=strtoint(copy(Listeint.It ems[zahler2],5,4)); newende[(strtoint(copy(Listeint.Items[zahler2],1,4)))]:=strtoint(copy(Listeint.Ite ms[zahler2],13,4)); end; end;//Ende von Dill Down and Roll UP zahler2:=zahler2+1; if zahler2<Listeint.items.count else copystring:=''; end;// Ende von while <> Req then copystring:=copy(Listeint.Items[zahler2],1,4) {2. Nach dem Feststellen, wie die Würfel aussehen sollen, welche zugesetzt werden sollen, werden wir das APA durchlaufen, um diesen zu suchen} newakt:=nil; setlength(newakt,anzd); for zahler2:=0 to anzd-1 do newakt[zahler2]:=newbegin[zahler2]; enderollup:=true; repeat; //Hierarchie raufsetzen Beginn aktdim:=0; while (aktdim<anzd)and(enderollup=false) do begin; {Hinaufsetzen einer Hierarchie} if (newakt[aktdim]<newende[aktdim]) then begin; newakt[aktdim]:=newakt[aktdim]+1;enderollup:=true; end; aktdim:=aktdim+1; end; //Hierarchie raufsetzen Ende {Beginn der Überprüfung des Würfels} zeile:=0;ende:=false; while (zeile<anzzeilen)and(ende=false) do begin //Erzeugen eines neuen Würfels akth:=nil; setlength(akth,anzd); //Füllen des Würfels mit den untersten Hierarchiestufen for zahler2:=0 to anzd-1 do akth[zahler2]:=0; endifredundant:=false;endedieserzeile:=false;spalte:=0; while(spalte<anzspalten)and(ende=false)and(endedieserzeile=false) do begin; if (endifredundant=false)and(APA[spalte,zeile].farbe=clYellow) then endifredundant:=true; if (endifredundant=true)and(APA[spalte,zeile].farbe<>clYellow) then endedieserzeile:=true; akth[APA[spalte,zeile].countdimension]:=APA[spalte,zeile].counthier; {3.Vergleiche die Würfel} //Ist der Würfel redundanzfrei dann vergleiche if (APA[spalte,zeile].farbe=clYellow) then begin {a) Wenn eine der Hierarchiestufen einer Dimension größer ist, als jene des gesuchten Würfel gehe in die nächste Zeile} if vergleichewuerfel(newakt,akth,anzd)=-1 then endedieserzeile:=true; {b) Wenn der gesuchte Würfel gefunden wurde dann starte als interessant markieren bis der Endwürfel gefunden wurde oder Fall a) auftritt} if endedieserzeile=false then begin; - 456 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN if vergleichewuerfel(newakt,akth,anzd)=0 then begin; APA[spalte,zeile].interessant:=true; APA[spalte,zeile].gewicht:=strtoint(APA_Parameter.APA_Degreecounts.Items[gewicht]) ;; APA[spalte,zeile].gewichtlevel:=gewicht; end; end;//of Endedieserzeile end;//Ende von clYellow Redundanzfrei spalte:=spalte+1; end;//Ende von Spalten und Ende=false zeile:=zeile+1; end;//Ende von Zeilen und Ende=false enderollup:=false; until (vergleichewuerfel(newakt,newende,anzd)=0); end;//Ende von es ist ein Reqirement end;//Ende von zahler anzblocksselected:=0; gotoAPA:=true; buttonreqchange; end; procedure TAPA_Selection_Screen.Button_delete_allClick(Sender: TObject); begin APA_Dialog.APA_Text.Caption:='Are you sure to erase all cubes in the APA Selection Screen and in the APA itself?'; if APA_Dialog.showmodal=mryes then begin zellezeile:=0; while (zellezeile<anzzeilen)do begin zellespalte:=0; while (zellespalte<anzspalten) do begin APA[zellespalte,zellezeile].interessant:=false; APA[zellespalte,zellezeile].materalisieren:=false; APA[zellespalte,zellezeile].derivative:=false; zellespalte:=zellespalte+1; end; zellezeile:=zellezeile+1; end; Req.Items.Clear; Listeint.Items.Clear; showmessage('Erasing complete !'); mustsave:=true; end; end; procedure TAPA_Selection_Screen.FormShow(Sender: TObject); begin gotoAPA:=false; Req.SetFocus; buttonreqchange; end; procedure TAPA_Selection_Screen.Button_Main_MenuClick(Sender: TObject); begin Close; end; - 457 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN end. 12.1.32 UNIT APA_SHOW_COSTSUNIT.DFM object APA_Showcosts: TAPA_Showcosts Left = 220 Top = 114 Width = 696 Height = 480 Caption = 'Show Costs' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Position = poScreenCenter OnClose = FormClose OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object Panel1: TPanel Left = 0 Top = 0 Width = 688 Height = 41 Align = alTop TabOrder = 0 object Button2: TButton Left = 16 Top = 8 Width = 89 Height = 25 Caption = 'Export to Excel' TabOrder = 0 OnClick = Button2Click end end object Panel2: TPanel Left = 0 Top = 405 Width = 688 Height = 41 Align = alBottom TabOrder = 1 object Button1: TButton Left = 16 Top = 8 Width = 75 Height = 25 Cancel = True Caption = 'Close && Save' TabOrder = 0 OnClick = Button1Click end object Button3: TButton Left = 104 Top = 8 Width = 75 Height = 25 Caption = 'Abort' TabOrder = 1 OnClick = Button3Click end end object Kostengriddat: TStringGrid Left = 0 Top = 41 Width = 688 Height = 364 Align = alClient - 458 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN ColCount = 7 DefaultColWidth = 60 DefaultRowHeight = 20 Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goColSizing, goEditing] TabOrder = 2 OnGetEditMask = KostengriddatGetEditMask OnSetEditText = KostengriddatSetEditText end object OpenDialogcosts: TOpenDialog DefaultExt = 'xls' Filter = 'Excel Files|*.xls' Left = 376 Top = 224 end end 12.1.33 UNIT APA_SHOW_COSTSUNIT.PAS unit APA_Show_costsunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, ExtCtrls, ComObj; type TAPA_Showcosts = class(TForm) Panel1: TPanel; Panel2: TPanel; Button2: TButton; OpenDialogcosts: TOpenDialog; Kostengriddat: TStringGrid; Button1: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button2Click(Sender: TObject); procedure KostengriddatSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); procedure KostengriddatGetEditMask(Sender: TObject; ACol, ARow: Integer; var Value: String); procedure Button3Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var APA_Showcosts: TAPA_Showcosts; implementation uses APA_Applicationunit; {$R *.dfm} var wurdebearbeitet:boolean; procedure TAPA_Showcosts.Button1Click(Sender: TObject); begin Close; end; procedure TAPA_Showcosts.FormShow(Sender: TObject); var counter:longint; var zeile:longint; begin wurdebearbeitet:=false; - 459 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN assignfile(fKosten,'C:\APADIR\DATA\Kosten.dat'); reset(fKosten); try Kostengriddat.Cells[1,0]:='FromColumn'; Kostengriddat.Cells[2,0]:='FromRow'; Kostengriddat.Cells[3,0]:='ToColumn'; Kostengriddat.Cells[4,0]:='ToRow'; Kostengriddat.Cells[5,0]:='Query'; Kostengriddat.Cells[6,0]:='Build'; counter:=filesize(fKosten); Kostengriddat.RowCount:=counter-1; Kostengriddat.ColWidths[0]:=25; zeile:=0; while zeile<counter do begin zeile:=zeile+1; if zeile<counter-1 then begin seek(fKosten,zeile-1); read(fKosten,vKosten); Kostengriddat.Cells[0,zeile]:=inttostr(zeile); Kostengriddat.Cells[1,zeile]:=inttostr(vKosten.VonSpalte); Kostengriddat.Cells[2,zeile]:=inttostr(vKosten.VonZeile); Kostengriddat.Cells[3,zeile]:=inttostr(vKosten.ZuSpalte); Kostengriddat.Cells[4,zeile]:=inttostr(vKosten.ZuZeile); Kostengriddat.Cells[5,zeile]:=Floattostrf(vKosten.Query,fffixed,9,0); Kostengriddat.Cells[6,zeile]:=Floattostrf(vKosten.Build,fffixed,9,0); end; end; finally CloseFile(fKosten); end; end; procedure TAPA_Showcosts.FormClose(Sender: TObject; var Action: TCloseAction); var counter:longint; var zeile:longint; begin if wurdebearbeitet=true then begin assignfile(fKosten,'C:\APADIR\DATA\Kosten.dat'); mustsave:=true; rewrite(fKosten); try counter:=Kostengriddat.RowCount; //Testlauf, ob alle Eingaben OK zeile:=0; while zeile<counter do begin zeile:=zeile+1; if zeile<counter-1 then begin vKosten.VonSpalte:=strtoint(trim(Kostengriddat.Cells[1,zeile])); vKosten.VonZeile:=strtoint(trim(Kostengriddat.Cells[2,zeile])); vKosten.ZuSpalte:=strtoint(trim(Kostengriddat.Cells[3,zeile])); vKosten.ZuZeile:=strtoint(trim(Kostengriddat.Cells[4,zeile])); vKosten.Query:=strtoint(trim(Kostengriddat.Cells[5,zeile])); vKosten.Build:=strtoint(trim(Kostengriddat.Cells[6,zeile])); end; end; zeile:=0; while zeile<counter do begin zeile:=zeile+1; if zeile<counter-1 then begin seek(fKosten,filesize(fKosten)); - 460 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN vKosten.VonSpalte:=strtoint(trim(Kostengriddat.Cells[1,zeile])); vKosten.VonZeile:=strtoint(trim(Kostengriddat.Cells[2,zeile])); vKosten.ZuSpalte:=strtoint(trim(Kostengriddat.Cells[3,zeile])); vKosten.ZuZeile:=strtoint(trim(Kostengriddat.Cells[4,zeile])); vKosten.Query:=strtoint(trim(Kostengriddat.Cells[5,zeile])); vKosten.Build:=strtoint(trim(Kostengriddat.Cells[6,zeile])); write(fKosten,vKosten); end; end; finally CloseFile(fKosten); end; end; end; procedure TAPA_Showcosts.Button2Click(Sender: TObject); var zeile : Integer; var Excel : variant; var counter:longint; begin try assignfile(fKosten,'c:\APADIR\DATA\Kosten.dat'); reset(fKosten); try if opendialogcosts.Execute then begin try try Excel := GetactiveOleObject('Excel.Application'); except try Excel := CreateOleObject('Excel.Application'); try Excel.Workbooks.Open (Filename:=opendialogcosts.filename); except Excel.Workbooks.add; Excel.ActiveWorkbook.SaveAs (Filename:=Opendialogcosts.filename); end; except ShowMessage('Excel konnte nicht gestartet werden !'); Exit; end; end; counter:=0; Excel.Visible := false; { für die testphase sinnvoll } Excel.sheets[1].select; Excel.sheets.add; Excel.sheets[1].Name := 'Export'; zeile:=1; application.ProcessMessages; {Überschriften} Excel.Cells[zeile, Excel.Cells[zeile, Excel.Cells[zeile, Excel.Cells[zeile, Excel.Cells[zeile, Excel.Cells[zeile, 1].Value 2].Value 3].Value 4].Value 5].Value 6].Value := := := := := := 'FromColumn'; 'FromRow'; 'ToColumn'; 'ToRow'; 'Query'; 'Build'; application.ProcessMessages; repeat; zeile:=zeile+1; counter:=counter+1; if counter<filesize(fKosten) then begin - 461 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN seek(fKosten,counter); read(fKosten,vKosten); application.ProcessMessages; Excel.Cells[zeile, Excel.Cells[zeile, Excel.Cells[zeile, Excel.Cells[zeile, Excel.Cells[zeile, Excel.Cells[zeile, 1].Value 2].Value 3].Value 4].Value 5].Value 6].Value := := := := := := vKosten.VonSpalte; vKosten.VonZeile; vKosten.ZuSpalte; vKosten.ZuZeile; vKosten.Query; vKosten.Build; application.ProcessMessages; end; until (counter>=filesize(fKosten)); Application.BringToFront; showmessage('Data saved'); finally Excel.visible:=true; Application.BringToFront; Excel.Visible := false; Excel.visible:=true; Excel.workbooks.Close; end; end;{opendialog1} finally end; finally CloseFile(fKosten); end; end; procedure TAPA_Showcosts.KostengriddatSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); begin wurdebearbeitet:=true; end; procedure TAPA_Showcosts.KostengriddatGetEditMask(Sender: TObject; ACol, ARow: Integer; var Value: String); begin Value := '!000000000;1'; end; procedure TAPA_Showcosts.Button3Click(Sender: TObject); begin wurdebearbeitet:=false; Close; end; end. 12.1.34 UNIT APA_SQLUNIT.DFM object APA_Sql: TAPA_Sql Left = 220 Top = 114 Width = 696 Height = 480 Caption = 'APA Sql Scripts' Color = clBtnFace Font.Charset = DEFAULT_CHARSET - 462 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 object Panel1: TPanel Left = 0 Top = 400 Width = 688 Height = 46 Align = alBottom TabOrder = 0 object Button1: TButton Left = 306 Top = 10 Width = 75 Height = 25 Cancel = True Caption = 'Close' TabOrder = 0 OnClick = Button1Click end end object SQLtext: TRichEdit Left = 0 Top = 41 Width = 688 Height = 359 Align = alClient ScrollBars = ssBoth TabOrder = 1 end object Panel2: TPanel Left = 0 Top = 0 Width = 688 Height = 41 Align = alTop TabOrder = 2 object Button2: TButton Left = 16 Top = 8 Width = 121 Height = 25 Caption = 'Save SQL Script' TabOrder = 0 OnClick = Button2Click end end object SaveDialogsql: TSaveDialog DefaultExt = 'SQL' Filter = 'SQL Script|*.sql' Left = 264 Top = 144 end end 12.1.35 UNIT APA_SQLUNIT.PAS unit APA_Sqlunit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls; type TAPA_Sql = class(TForm) - 463 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN Panel1: TPanel; Button1: TButton; SQLtext: TRichEdit; Panel2: TPanel; Button2: TButton; SaveDialogsql: TSaveDialog; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var APA_Sql: TAPA_Sql; implementation uses APA_Optionsunit; {$R *.dfm} procedure TAPA_Sql.Button1Click(Sender: TObject); begin Close; end; procedure TAPA_Sql.Button2Click(Sender: TObject); var SaveFile:TextFile; var zahler:longint; begin Savedialogsql.InitialDir:=APA_Options.APA_Save_Path.Directory; if savedialogsql.Execute then begin AssignFile(SaveFile,Savedialogsql.FileName); {$I-} Rewrite(SaveFile); {$I+} if IOResult = 0 then begin for zahler:=0 to Sqltext.lines.count-1 do begin writeln(SaveFile,SQLtext.lines[zahler]); end; CloseFile(SaveFile); end else MessageDlg('File access error', mtWarning, [mbOk], 0); end; end; end. 12.2 QUELLCODES DER HILFEDATEIEN 12.2.1 INDEX.HTM <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta http-equiv="Content-Language" content="de"> <title>Willkommen</title> <meta name="GENERATOR" content="Microsoft FrontPage 4.0"> <meta name="ProgId" content="FrontPage.Editor.Document"> - 464 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN <meta name="Microsoft Theme" content="blank 1111, default"> <meta name="Microsoft Border" content="tlb, default"> </head> <body><p>Welcome to the APA Helpfile Website. This site should help you working with the APA program developed by Thomas Achs 2004. Use the Links above to navigate to special help topics.<p align="center"><img border="0" src="images/corel1.jpg" width="233" height="182"> <p>The APA (Aggregation Path Array) is a semi-graphical data modelling method in a data warehouse.<br> This programm helps you to</p> <ul> <li>paint the APA&nbsp;</li> <li> show the redundancy-free set&nbsp;</li> <li> get the required cubes marked in the set&nbsp;</li> <li> see the derivatives of one cube&nbsp;</li> <li> see the sum of the derivatives of many cubes&nbsp;</li> <li> compare the required cubes and the materialized cubes&nbsp;</li> <li>calculate the materialized cubes with Thomas Achs heuristic</li> </ul> <p align="center">&nbsp; <p>&nbsp;</body> </html> 12.2.2 APA_GRID_SCREEN.HTM <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta http-equiv="Content-Language" content="de"> <title>APA Help - APA Grid</title> <meta name="GENERATOR" content="Microsoft FrontPage 4.0"> <meta name="ProgId" content="FrontPage.Editor.Document"> <meta name="Microsoft Theme" content="blank 1111, default"> <meta name="Microsoft Border" content="tlb, default"> </head> <body> <p>The APA Grid Screen shows the APA. This screen offers a lot of functions and useful operations.</p> <p><img border="0" src="images/corel101.jpg" width="647" height="349"></p> <h2><u>TOPICS</u></h2> <h2><a name="Start">Show descriptions of cubes</a></h2> <p><a href="#Show short description">Show short description</a><a href="#Show long description"><br> Show long description</a></p> <h2>Required cubes</h2> <p><a href="#Add required cubes">Add required cubes<br> </a><a href="#Remove required cube">Remove required cube<br> </a><a href="#Remove all required cubes">Remove all required cubes</a></p> <h2>Materialized cubes</h2> <p><a href="#Add materialized cube">Add materialized cube<br> </a><a href="#Remove materialized cube">Remove materialized cube<br> </a><a href="#Remove all materialized cubes">Remove all materialized cubes</a></p> <h2>Derivates</h2> <p><a href="#Show derivatives">Show derivates<br> </a><a href="#Remove derivatives">Remove derivates</a></p> <h2>Redundant cubes</h2> <p><a href="#Show redundancy free cubes">Show redundancy free cubes</a></p> <h2>Heuristik</h2> <p><a href="#Generate materialized cubes">Generate materialized cubes</a></p> <h2>Permutation</h2> <p><a href="#Find deterministic solution by permutation">Find deterministic solution by permutation</a></p> <h2>Combination</h2> <p><a href="#Find deterministic solution by combination">Find deterministic solution by combination</a></p> <h2>Deterministic solution</h2> <p><a href="#Show deterministic solution">Show deterministic solution<br> - 465 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN </a><a href="#Remove deterministic solution">Remove deterministic solution</a></p> <h2>Possible cubes</h2> <p><a href="#Show possible cubes">Show possible cubes<br> </a><a href="#Remove possible cubes">Remove possible cubes</a></p> <h2>Build SQL Statements</h2> <p><a href="#Build SQL statements for star schema">Build SQL statements for star schema<br> </a><a href="#Build SQL statements for fact constellation schema">Build SQL statements for fact constellation schema<br> </a><a href="#Get Query of cube">Get Query of cube<br> </a><a href="#Save SQL Script">Save SQL Script</a></p> <h2>Use Random Costs</h2> <p><a href="#Set use random costs">Set use random costs</a></p> <hr> <h2><a name="Show short description">Show short description</a></h2> <p>In order to get the detailed description of a cube move the mouse over the cell and see the short description in the status bar above.</p> <p><img border="0" src="images/corel064.jpg" width="647" height="349"></p> <h2><a name="Show long description">Show long description</a></h2> <p>To get the right long description of a cube click the cell with the left mouse button.</p> <p><img border="0" src="images/corel102.jpg" width="647" height="349"></p> <h2><a name="Add required cubes">Add required cubes</a></h2> <p>In order to add a required cube move to the cell and press the right mouse button. Choose required and the right importance.</p> <p><img border="0" src="images/corel058.jpg" width="100%" height="100%"></p> <p><img border="0" src="images/corel059.jpg" width="909" height="541"></p> <h2><a name="Remove required cube">Remove required cube</a></h2> <p>In order to remove a required cube select the cube an press the right mouse button and select &quot;Not required&quot;.</p> <p><img border="0" src="images/corel103.jpg" width="647" height="349"></p> <h2><a name="Remove all required cubes">Remove all required cubes</a></h2> <p><img border="0" src="images/corel104.jpg" width="647" height="349"></p> <h2><a name="Add materialized cube">Add materialized cube</a></h2> <p><img border="0" src="images/corel066.jpg" width="647" height="349"></p> <p><img border="0" src="images/corel067.jpg" width="647" height="349"></p> <h2><a name="Remove materialized cube">Remove materialized cube</a></h2> <p><img border="0" src="images/corel068.jpg" width="647" height="349"></p> <h2><a name="Remove all materialized cubes">Remove all materialized cubes</a></h2> <p>In order to remove all materialized cubes press the button &quot;Remove materialized cubes&quot;.</p> <p><img border="0" src="images/corel072.jpg" width="647" height="349"></p> <h2><a name="Show derivatives">Show derivatives</a></h2> <p>In order to show a derivatives of a cube select the cube and press the right mouse button and select &quot;Show derivatives&quot;.</p> <p><img border="0" src="images/corel069.jpg" width="647" height="349"></p> <p><img border="0" src="images/corel070.jpg" width="647" height="349"></p> <h2><a name="Remove derivatives">Remove derivatives</a></h2> <p>In order to remove the derivatives press the button &quot;Remove derivatives&quot;.</p> <p><img border="0" src="images/corel071.jpg" width="647" height="349"></p> <h2><a name="Show redundancy free cubes">Show redundancy free cubes</a></h2> <p>If you want to remove the redundant cubes of the APA tick &quot;Remove redundancy&quot;.</p> <p><img border="0" src="images/corel074.jpg" width="647" height="349"></p> <h2><a name="Generate materialized cubes">Generate materialized cubes</a></h2> <p>After you have selected all your required cubes the Thomas ACHS heuristc, will calculate the right cubes, which should be materialized.</p> <p><img border="0" src="images/corel075.jpg" width="647" height="349"></p> <p>Select &quot;Search using Thomas Achs heuristic&quot; in the menu and the cubes will be selected.</p> <p><img border="0" src="images/corel076.jpg" width="647" height="349"></p> <p><img border="0" src="images/corel077.jpg" width="328" height="310"></p> <p>The Screen below shows the calculated set of materialized cubes.</p> <p><img border="0" src="images/corel078.jpg" width="647" height="349"></p> <h2><a name="Find deterministic solution by permutation">Find deterministic solution by permutation</a></h2> <p>In oder to proof the heuristic the deterministic solution must be calculated. If you want to do that by permutation select &quot;Alogirthm permutation&quot; in the menu.</p> <p><img border="0" src="images/corel079.jpg" width="647" height="349"></p> <p><img border="0" src="images/corel080.jpg" width="302" height="150"></p> <p><img border="0" src="images/corel081.jpg" width="328" height="310"></p> <h2><a name="Find deterministic solution by combination">Find deterministic - 466 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN solution by combination</a></h2> <p>In oder to proof the heuristic the deterministic solution must be calculated. If you want to do that by combination select &quot;Alogirthm combitation&quot; in the menu.</p> <p><img border="0" src="images/corel082.jpg" width="647" height="349"></p> <p><img border="0" src="images/corel083.jpg" width="302" height="150"></p> <p><img border="0" src="images/corel084.jpg" width="328" height="310"></p> <h2><a name="Show deterministic solution">Show deterministic solution</a></h2> <p>To have a look at the deterministic solution press &quot;Show deterministic solution&quot;.</p> <p><img border="0" src="images/corel085.jpg" width="647" height="349"></p> <p><img border="0" src="images/corel086.jpg" width="647" height="349"></p> <h2><a name="Remove deterministic solution">Remove deterministic solution</a></h2> <p>In order to remove the deterministic solution press &quot;Remove deterministic solution&quot;.</p> <p><img border="0" src="images/corel087.jpg" width="647" height="349"></p> <h2><a name="Show possible cubes">Show possible cubes</a></h2> <p>If you want to see the set of possible cubes press &quot;Show possible cubes&quot;.</p> <p><img border="0" src="images/corel088.jpg" width="647" height="349"></p> <p><img border="0" src="images/corel089.jpg" width="161" height="110"></p> <p><img border="0" src="images/corel090.jpg" width="647" height="349"></p> <h2><a name="Remove possible cubes">Remove possible cubes</a></h2> <p>If you want to remove the set of possible cubes press &quot;Remove possible cubes&quot;.</p> <p><img border="0" src="images/corel091.jpg" width="647" height="349"></p> <h2><a name="Build SQL statements for star schema">Build SQL statements for star schema</a></h2> <p>In order to create the SQL Statements for the star schema select &quot;Generate CREATE SQL-statements for star schema- Generate CREATE SQL-statements BFT and dimension tables&quot;.</p> <p><img border="0" src="images/corel093.jpg" width="946" height="349"></p> <p><img border="0" src="images/corel094.jpg" width="696" height="480"></p> <h2><a name="Build SQL statements for fact constellation schema">Build SQL statements for fact constellation schema</a></h2> <p>In order to create the SQL Statements for the star schema select &quot;Generate CREATE SQL-statements for fact constellation schema- Generate CREATE SQL-statements BFT and dimension tables&quot;. If you want to create the SQL-statements for the aggregated fact tables select&nbsp; &quot;Generate CREATE SQL-statements for fact constellation schema- Generate CREATE SQL-statements for materialized cubes&quot;.</p> <p><img border="0" src="images/corel098.jpg" width="946" height="349"></p> <p><img border="0" src="images/corel099.jpg" width="946" height="349"></p> <h2><a name="Get Query of cube">Get Query of cube</a></h2> <p>If you want to know the query of a cube select the cube, press right mouse button and select &quot;Get SQL statement to query this cube&quot;.</p> <p><img border="0" src="images/corel105.jpg" width="647" height="466"></p> <p><img border="0" src="images/corel106.jpg" width="696" height="480"></p> <h2><a name="Save SQL Script">Save SQL Script</a></h2> <p>If you want to save a SQL script press the button &quot;Save SQL Script&quot; and choose the name.</p> <p><img border="0" src="images/corel094.jpg" width="696" height="480"></p> <p><img border="0" src="images/corel097.jpg" width="563" height="419"></p> <h2><a name="Set use random costs">Set use random costs</a></h2> <p>If you want to calculate with random costs or not chosse &quot;Use random costs&quot; in Settings menu.</p> <p><img border="0" src="images/corel100.jpg" width="946" height="349"></body> </html> 12.2.3 APA_INPUT_SCREEN.HTM <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta http-equiv="Content-Language" content="de"> <title>APA Help - APA Input Screen</title> <meta name="GENERATOR" content="Microsoft FrontPage 4.0"> <meta name="ProgId" content="FrontPage.Editor.Document"> <meta name="Microsoft Theme" content="blank 1111, default"> - 467 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN <meta name="Microsoft Border" content="tlb, default"> </head> <body><p><a name="The APA">The APA</a> Input Screen helps you to insert all the&nbsp;dimensions, hierarchies and key figures.</p> <p><a href="#Insert a dimension">Insert a dimension</a><a href="#Insert hierarchy"><br> Insert a hierarchy level</a><a href="#Change dimension"><br> Change a dimension</a><a href="#Change a hierarchy"><br> Change a hierarchy level</a><a href="#Delete a dimension or hierarchy level"><br> Delete a dimension or hierarchy level</a><a href="#Insert a key figure"><br> Insert key figure</a><a href="#Edit a key figure"><br> Edit key figure</a><a href="#Delete a key figure"><br> Delete key figure</a></p> <img border="0" src="images/corel002.jpg" width="604" height="568"> <p><a href="#The APA">Go to Top</a></p> <hr> <h1><a name="Insert a dimension">Insert a dimension</a></h1> <p>To add a dimension press the button &quot;Insert dimension&quot; and the Insert-dimension-screen will open.</p> <p><img border="0" src="images/corel004.jpg" width="604" height="568"></p> <p>Type the description of the new dimension in the &quot;Dimension description&quot; textfield and press &quot;OK&quot;.</p> <p><img border="0" src="images/corel003.jpg" width="326" height="157"></p> <p>The new dimension will be added to your &quot;Input Screen&quot;.</p> <p><img border="0" src="images/corel005.jpg" width="604" height="568"></p> <p><a href="#The APA">Go to Top</a></p> <h1><a name="Insert hierarchy">Insert hierarchy</a></h1> <p>To add a new hierarchy select the dimension you want to add the new hierarchy and press the Button &quot;Insert hierarchy&quot;.</p> <p><img border="0" src="images/corel006.jpg" width="604" height="568"></p> <p>Type your data into the textfields and press &quot;OK&quot;.</p> <p><img border="0" src="images/corel007.jpg" width="331" height="241"></p> <p>The hierarchy will be added to your dimension in the &quot;Input Screen&quot;. It´s possible to change the order of the hierarchies by using the &quot;Up&quot; and &quot;Down&quot; buttons on the left.</p> <p><img border="0" src="images/corel008.jpg" width="604" height="568"></p> <p><a href="#The APA">Go to Top</a></p> <h1><a name="Change dimension">Change a dimension</a></h1> <p>To change a dimension select the dimension in the &quot;Input Screen&quot; and press the button &quot;Edit&quot;.</p> <p><img border="0" src="images/corel009.jpg" width="604" height="568"></p> <p>Change the description of the dimension and press &quot;OK&quot;.</p> <p><img border="0" src="images/corel010.jpg" width="326" height="157"></p> <p>The new description of the dimension will be changed in the &quot;Input Screen&quot;.</p> <p><img border="0" src="images/corel011.jpg" width="604" height="568"></p> <p><a href="#The APA">Go to Top</a></p> <h1><a name="Change a hierarchy">Change a hierarchy</a></h1> <p>To change a hierarchy select the hierarchy in the &quot;Input Screen&quot; and press the button &quot;Edit&quot;.</p> <p><img border="0" src="images/corel012.jpg" width="604" height="568"></p> <p>Type in the changed data and press the button &quot;OK&quot;.</p> <p><img border="0" src="images/corel013.jpg" width="331" height="241"></p> <p>The hierarchy will be changed in the &quot;Input Screen&quot;.</p> <p><img border="0" src="images/corel014.jpg" width="604" height="568"></p> <p><a href="#The APA">Go to Top</a></p> <h1><a name="Delete a dimension or hierarchy level">Delete a dimension or hierarchy level</a></h1> <p>Select the dimension or hierarchy level and press the button &quot;Delete&quot;.</p> <p><img border="0" src="images/corel021.jpg" width="604" height="568"></p> <p>The dimension or hierarchy level will be erased from the &quot;Input Screen&quot;.</p> <p><img border="0" src="images/corel022.jpg" width="604" height="568"></p> <a href="#The APA">Go to Top</a> <h1><a name="Insert a key figure">Insert a key figure</a></h1> <p>In order to insert a key figure press the Button &quot;Insert&quot;.</p> <p><img border="0" src="images/corel028.jpg" width="327" height="237"></p> <p>Enter data into the &quot;APA Insert Key&quot; form and press &quot;OK&quot;.</p> <p><img border="0" src="images/corel029.jpg" width="604" height="477"></p> <p> <a href="#The APA">Go to Top</a> </p> <h1><a name="Edit a key figure">Edit a key figure</a></h1> - 468 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN <p>In order to edit a key figure select the figure and press the button &quot;Edit&quot;.</p> <p><img border="0" src="images/corel028.jpg" width="327" height="237"></p> <p>Change data in the &quot;APA Insert Key&quot; form and press &quot;OK&quot;.</p> <p><img border="0" src="images/corel029.jpg" width="604" height="477"></p> <p> <a href="#The APA">Go to Top</a> </p> <h1><a name="Delete a key figure">Delete a key figure</a></h1> <p>In order to delete a key figure please select the figure and press the Button &quot;Delete&quot;.</p> <p><img border="0" src="images/corel042.jpg" width="604" height="568"></p> <p> <a href="#The APA">Go to Top</a> </p> </body> </html> 12.2.4 APA_INSTALL.HTM <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta http-equiv="Content-Language" content="de"> <title>Installation</title> <meta name="GENERATOR" content="Microsoft FrontPage 4.0"> <meta name="ProgId" content="FrontPage.Editor.Document"> <meta name="Microsoft Theme" content="blank 1111, default"> <meta name="Microsoft Border" content="b"> </head> <body><h5 align="center"><!--webbot bot="Navigation" s-type="banner" srendering="graphics" s-orientation b-include-home b-include-up U-Page S-Target --></h5> <p align="center"><!--webbot bot="Navigation" S-Type="siblings" SOrientation="horizontal" S-Rendering="graphics" B-Include-Home="TRUE" B-Include-Up="FALSE" U-Page S-Target --> </p> <h2><span style="text-transform: uppercase">How to install the APAWin program</span></h2> <hr> <p><strong>Valid for:</strong> APAWin Version 1<br> <strong>Date:</strong><!--WEBBOT bot=TimeStamp S-Type="EDITED" S-Format="%d. %b %y" -->&nbsp;</p> <hr> <h3>OVERWIEW</h3> <p>This guide helps you install the APA program. There are two setup procedures nessesary to install the APA programm. First the database driver must be installed. You need administrator rights on your computer to run the setup. Second the APA program need to be installed. The setup programm installs all files required in the folder 'C:\APADIR'. Do not changed the name of the folder. This chause problems in running the software.</p> <hr> <h3>HOW TO GO</h3> <ol> <li>Download the SETUP.exe file to your computer and start the setup.<br> <img border="0" src="images/corel136.jpg" width="719" height="542"> </li> <li>The Setup program will start. The press &quot;Weiter&quot;.<br> <img border="0" src="images/corel138.jpg" width="504" height="386"> </li> <li>Please wait a few seconds...<br> </li> <li><img border="0" src="images/corel139.jpg" width="504" height="386"> - 469 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN </li> <li>The installation finished.<br> <br> <img border="0" src="images/corel140.jpg" width="504" height="386"> </li> </ol> &nbsp;</body> </html> 12.2.5 APA_MAINMENU.HTM <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta http-equiv="Content-Language" content="de"> <title>APA Help - APA Mainmenu</title> <meta name="GENERATOR" content="Microsoft FrontPage 4.0"> <meta name="ProgId" content="FrontPage.Editor.Document"> <meta name="Microsoft Theme" content="blank 1111, default"> <meta name="Microsoft Border" content="tlb, default"> </head> <body> <p>The APA Main menu helps you to load and save your data, manipulate random costs, analyse the APA, edit the settings and show the help menu.</p> <h2><a href="#Generate APA">Generate APA</a></h2> <h2><a href="#Show Selection Screen">Selection Screen</a></h2> <h2><a name="Mainmenu - File">Mainmenu - File</a></h2> <p><a href="#Load File">Load File</a><a href="#Save File"><br> Save File</a><a href="#Save as File"><br> Save as.. File</a></p> <h2>Mainmenu - Random costs</h2> <p><a href="#Build random costs">Build random costs</a><a href="#Show Random Costs"><br> Show random costs</a><a href="#Restricted costs"><br> Restricted costs</a></p> <h2>Mainmenu-Analyse</h2> <p><a href="#APA Analyse">Analyse APA</a></p> <p><img border="0" src="images/corel043.jpg" width="710" height="574"></p> <p><a href="#Mainmenu - File">Go to Top</a></p> <hr> <h2><a name="Generate APA">Generate APA</a></h2> <p>In order to generate the APA and show the APA Screen press button &quot;APA Grid&quot;.</p> <h2><a name="Show Selection Screen">Show Selection Screen</a></h2> <p>In order to switch to &quot;APA Selection Screen&quot; press button &quot;APA Selection Screen&quot;.</p> <h2><a name="Load File">Load File</a></h2> <p>To Load a File press &quot;File-Open&quot; and select your file.</p> <p><img border="0" src="images/corel044.jpg" width="710" height="574"></p> <p><img border="0" src="images/corel045.jpg" width="563" height="419"></p> <p><a href="#Mainmenu - File">Go to Top</a></p> <h2><a name="Save File">Save File</a></h2> <p>To save the file press &quot;File-Save&quot;.</p> <p><img border="0" src="images/corel046.jpg" width="710" height="574"></p> <p><a href="#Mainmenu - File">Go to Top</a></p> <h2><a name="Save as File">Save as File</a></h2> <p>Select &quot;File-Save as ...&quot; and choose a new file name.</p> <p><img border="0" src="images/corel047.jpg" width="710" height="574"></p> <p><img border="0" src="images/corel048.jpg" width="563" height="419"></p> <p><a href="#Mainmenu - File">Go to Top</a></p> <h2><a name="Build random costs">Build random costs</a></h2> <p>In order to generate random costs press &quot;Random costs-Build random costs&quot;.</p> <p><img border="0" src="images/corel049.jpg" width="710" height="574"></p> <p><img border="0" src="images/corel050.jpg" width="696" height="480"></p> <p><img border="0" src="images/corel051.jpg" width="328" height="310"></p> <p><a href="#Mainmenu - File">Go to Top</a></p> <h2><a name="Show Random Costs">Show Random Costs</a></h2> - 470 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN <p>In order to show the random costs select &quot;Random costs-Show random costs&quot;.</p> <p><img border="0" src="images/corel052.jpg" width="710" height="574"></p> <p>It´s possible to edit the data and to export the data to Excel.</p> <p><img border="0" src="images/corel050.jpg" width="696" height="480"></p> <p><a href="#Mainmenu - File">Go to Top</a></p> <h2><a name="Restricted costs">Restricted costs</a></h2> <p>To change the ticker Restricted costs select &quot;Random costs-Restricted costs&quot;:</p> <p><img border="0" src="images/corel053.jpg" width="710" height="574"></p> <p><a href="#Mainmenu - File">Go to Top</a></p> <h2><a name="APA Analyse">APA Analyse</a></h2> <p>To show the &quot;APA Analyse&quot; window select &quot;Analyse-Analyse APA&quot;.</p> <p><img border="0" src="images/corel055.jpg" width="710" height="574"></p> <p><img border="0" src="images/corel054.jpg" width="696" height="480"> <p><a href="#Mainmenu - File">Go to Top</a></p> </body> </html> 12.2.6 APA_SELECTION_SCREEN.HTM <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta http-equiv="Content-Language" content="de"> <title>APA Help - APA Selection Screen</title> <meta name="GENERATOR" content="Microsoft FrontPage 4.0"> <meta name="ProgId" content="FrontPage.Editor.Document"> <meta name="Microsoft Theme" content="blank 1111, default"> <meta name="Microsoft Border" content="tlb, default"> </head> <body> <p>The APA Selection Screen helps you to do block operations or/and requirement operations.</p> <h2><a name="Block operations">Block operations</a></h2> <p><a href="#Add new requirement block">Add new requirement block<br> </a><a href="#Edit requirement block">Edit requirement block<br> </a><a href="#Delete requirement block">Delete requirement block<br> </a><a href="#Select block">Select block<br> </a><a href="#Deselect block">Deselect block<br> </a><a href="#Select all">Select all<br> </a><a href="#Deselect all">Deselect all<br> </a><a href="#Delete all requirement blocks and cubes">Delete all requirement blocks and cubes</a></p> <h2>Requirements operations</h2> <p><a href="#Add new requirement">Add new requirement<br> </a><a href="#Edit requirement">Edit requirement<br> </a><a href="#Delete requirement">Delete requirement<br> </a></p> <hr> <h2><a name="Add new requirement block">Add new requirement block</a></h2> <p>In order to add a new requirement block press the button &quot;New req. block&quot; and enter the data. If you select &quot;Add max. hierarchy level&quot; the maximum of all hierarchy levels is added.</p> <p><img border="0" src="images/corel107.jpg" width="658" height="437"></p> <p><img border="0" src="images/corel108.jpg" width="325" height="292"></p> <p><img border="0" src="images/corel109.jpg" width="658" height="437"></p> <h2><a name="Edit requirement block">Edit requirement block</a></h2> <p>If you want to edit a requirement block select the block and press the button &quot;Edit req. block&quot;.</p> <p><img border="0" src="images/corel110.jpg" width="658" height="437"></p> <p><img border="0" src="images/corel111.jpg" width="325" height="292"></p> <p><img border="0" src="images/corel112.jpg" width="658" height="437"></p> <p><a href="#Block operations">Go to Top</a></p> <h2><a name="Delete requirement block">Delete requirement block</a></h2> <p>If you want to delete a requirement block select the block and press the - 471 - OPTIMIERUNG DER MATERIALISIERTEN SICHTEN IN EINEM DATAWAREHOUSE AUF DER GRUNDLAGE DER AUS EINEM ERP-SYSTEM ÜBERNOMMEN OPERATIVEN DATEN button &quot;Delete req. block&quot;.</p> <p><img border="0" src="images/corel113.jpg" width="658" height="437"></p> <p><img border="0" src="images/corel114.jpg" width="658" height="437"></p> <p><a href="#Block operations">Go to Top</a></p> <h2><a name="Select block">Select block</a></h2> <p>In order to select a requirement block for adding the block to the APA select the block and press the button &quot;Select&quot;.</p> <p><img border="0" src="images/corel115.jpg" width="658" height="437"></p> <p><img border="0" src="images/corel116.jpg" width="658" height="437"></p> <p><a href="#Block operations">Go to Top</a></p> <h2><a name="Deselect block">Deselect block</a></h2> <p>If you want to deselect a requirement block press the button &quot;Deselect&quot;.</p> <p><img border="0" src="images/corel117.jpg" width="658" height="437"></p> <p><img border="0" src="images/corel118.jpg" width="658" height="437"></p> <p><a href="#Block operations">Go to Top</a></p> <h2><a name="Select all">Select all</a></h2> <p>Press the Button &quot;Select all&quot; if you want to select all required blocks.</p> <p><img border="0" src="images/corel119.jpg" width="658" height="437"></p> <p><img border="0" src="images/corel120.jpg" width="658" height="437"></p> <p><a href="#Block operations">Go to Top</a></p> <h2><a name="Deselect all">Deselect all</a></h2> <p>Press the Button &quot;Deselect all&quot; if you want to deselect all required blocks.</p> <p><img border="0" src="images/corel121.jpg" width="658" height="437"></p> <p><img border="0" src="images/corel122.jpg" width="658" height="437"></p> <p><a href="#Block operations">Go to Top</a></p> <h2><a name="Delete all requirement blocks and cubes">Delete all requirement blocks and cubes</a></h2> <p>In order to delete all requirement blocks and all required cubes in the APA press &quot;Delete all requirement blocks and cubes&quot;.</p> <p><img border="0" src="images/corel131.jpg" width="658" height="437"></p> <p><img border="0" src="images/corel132.jpg" width="471" height="129"></p> <p><img border="0" src="images/corel133.jpg" width="125" height="110"></p> <p><img border="0" src="images/corel134.jpg" width="658" height="437"></p> <p><a href="#Block operations">Go to Top</a></p> <h2><a name="Add new requirement">Add new requirement</a></h2> <p>If you want to add a new requirement to an existing block press &quot;Insert&quot;.</p> <p><img border="0" src="images/corel123.jpg" width="658" height="437"></p> <p><img border="0" src="images/corel124.jpg" width="658" height="437"></p> <p><img border="0" src="images/corel125.jpg" width="658" height="437"></p> <p><a href="#Block operations">Go to Top</a></p> <h2><a name="Edit requirement">Edit requirement</a></h2> <p>If you want to edit a new requirement select the requirement and press &quot;Edit&quot;. Then change the requirement and press &quot;Accept&quot;.</p> <p><img border="0" src="images/corel135.jpg" width="658" height="437"></p> <p><img border="0" src="images/corel126.jpg" width="658" height="437"></p> <p><img border="0" src="images/corel127.jpg" width="658" height="437"></p> <p><img border="0" src="images/corel128.jpg" width="658" height="437"></p> <p><a href="#Block operations">Go to Top</a></p> <h2><a name="Delete requirement">Delete requirement</a></h2> <p>If you want to delete a single requirement select the requirement and press then button &quot;Delete&quot;.</p> <p><img border="0" src="images/corel129.jpg" width="658" height="437"></p> <p><img border="0" src="images/corel130.jpg" width="658" height="437"></p> <p><a href="#Block operations">Go to Top</a></body> </html> - 472 -