Ich bin gerade echt gefrustet. 2 Tage ist das neue Arbeitsjahr jetzt alt und ich habe schon wieder genug Frust für den Rest des Jahres. Da ist man 8 Stunden pro Tag bei einem Kunden vor Ort, aber muß dann natürlich immer gleich ganz dringend seiner eigenen Firma irgend welche dämlichen Zahlen erklären. Das schlimmste dabei ist, dass man nicht mal weiß, wo die ihre Zahlen herbekommen oder wie die definiert sind. Aber man muß natürlich gleich unbedingt sofort antworten und die Zahlen erklären. Dann antwortet man und hört nie wieder was. Keine "Danke, das erklärt es." oder "Ja das muß geändert werden" oder irgendwas. Und spätestens 2 Monate später fängt der ganze Spaß von vorne an. Alles so unpersönlich und unfreundlich. Ich könnte echt dem Laden alles vor die Füße werfen.
Entries tagged as beruf
Related tags
Tuesday, 12. January 2010
Schönes neues Jahr...
Monday, 27. April 2009
Debugging mit Informatica Powercenter 8
Ich muß mal kurz einen kleinen Rant loswerden.
In den letzten 2 Wochen habe ich 2 komplexere Probleme in 2 Flows untersucht. Das Killerfeature was dabei immer genannt wird ist der eingebaute Debugger. Damit kann man einem Datensatz zusehen, wie die Transformationslogik angewandt wird. So richtig schön grafisch und mit Breakpoints. Zumindest theoretisch. Praktischerweise funktioniert das Teil nämlich nicht verläßlich, zumindest, wenn in der Mappinglogik ein Outer-Join enthalten ist. Dann beendet sich der Debugger nämlich einfach ohne ersichtlichen Grund. Wenn man Glück hat, kann man wenigstens noch durch einen Teil der Logik durchsteppen. Was hab ich geflucht, aufgrund dieses Bugs, der schon mindestens seit Version 7 drin ist.
Man kann in diesem Fall also nicht mit dem Debugger debuggen. Was macht man? Richtig, wie früher in der guten alten Zeit(™) das Loglevel hochdrehen auf "Verbose Data" (damit loggt Informatica praktisch für jede Transformation den eingehenden und ausgehenden Datensatz) und dann Logfiles lesen. Lustigerweise hat Informatica mit Version 8 auf eine Art binäres Logfile umgestellt. Man kann diese Dinger nicht mehr anständig mit einem stinknormalen Editor oder Pager lesen, sondern muß den eingebauten Logfile Viewer nutzen. Der ist schon umständlich genug zu nutzen, nur leider ist das Teil auch nicht mal richtig stabil. Während ich also das Loglevel auf Verbose Data hochdrehte und mit ein paar Testdatensatz den ganzen Flow nochmal laufen lies, stellte ich fest, dass das Logfile auf enorme 2 GB angewachsen war. Und das mit nur einer Handvoll Testdatensätze. Aber wartet, es kommt noch besser: Als ich versuchte, das Logfile mit dem eingebauten Logfileviewer zu öffen, ist mit der Viewer gnadenlos abgestürzt. Also Loglevel wieder runtergedreht auf Normal und nur bei vereinzelten Transformationen "Verbose Data" angeschaltet. Danach war das Logfile immer noch mehrere Hundert MB groß, doch zumindest konnte man es betrachten.
Ich glaube jedes Problem hat ca: 1 Arbeitstag gekostet, bis ich den Fehler gefunden hatte. Da gibt es noch Verbesserungspotential.
In den letzten 2 Wochen habe ich 2 komplexere Probleme in 2 Flows untersucht. Das Killerfeature was dabei immer genannt wird ist der eingebaute Debugger. Damit kann man einem Datensatz zusehen, wie die Transformationslogik angewandt wird. So richtig schön grafisch und mit Breakpoints. Zumindest theoretisch. Praktischerweise funktioniert das Teil nämlich nicht verläßlich, zumindest, wenn in der Mappinglogik ein Outer-Join enthalten ist. Dann beendet sich der Debugger nämlich einfach ohne ersichtlichen Grund. Wenn man Glück hat, kann man wenigstens noch durch einen Teil der Logik durchsteppen. Was hab ich geflucht, aufgrund dieses Bugs, der schon mindestens seit Version 7 drin ist.
Man kann in diesem Fall also nicht mit dem Debugger debuggen. Was macht man? Richtig, wie früher in der guten alten Zeit(™) das Loglevel hochdrehen auf "Verbose Data" (damit loggt Informatica praktisch für jede Transformation den eingehenden und ausgehenden Datensatz) und dann Logfiles lesen. Lustigerweise hat Informatica mit Version 8 auf eine Art binäres Logfile umgestellt. Man kann diese Dinger nicht mehr anständig mit einem stinknormalen Editor oder Pager lesen, sondern muß den eingebauten Logfile Viewer nutzen. Der ist schon umständlich genug zu nutzen, nur leider ist das Teil auch nicht mal richtig stabil. Während ich also das Loglevel auf Verbose Data hochdrehte und mit ein paar Testdatensatz den ganzen Flow nochmal laufen lies, stellte ich fest, dass das Logfile auf enorme 2 GB angewachsen war. Und das mit nur einer Handvoll Testdatensätze. Aber wartet, es kommt noch besser: Als ich versuchte, das Logfile mit dem eingebauten Logfileviewer zu öffen, ist mit der Viewer gnadenlos abgestürzt. Also Loglevel wieder runtergedreht auf Normal und nur bei vereinzelten Transformationen "Verbose Data" angeschaltet. Danach war das Logfile immer noch mehrere Hundert MB groß, doch zumindest konnte man es betrachten.
Ich glaube jedes Problem hat ca: 1 Arbeitstag gekostet, bis ich den Fehler gefunden hatte. Da gibt es noch Verbesserungspotential.
Posted by chrisbra
in Tipps And Tricks
at
18:09
| Comments (2)
| Trackbacks (0)
Defined tags for this entry: beruf, business intelligence, debug, dwh, informatica, nerd, rant, tipps and tricks
Saturday, 25. April 2009
Cognos
Nun betätige ich mich seit ca: 1 Monat verstärkt mit Business-Intelligence, genauer mit Cognos Report Studio und Framework Manager.
Das ist schon eine interessante Web 2.0 Anwendung. Aber was mich am meisten erstaunt: es gibt soviele Möglichkeiten irgendwo einen Parameter zu setzen, dass man oft nur durch probieren zum gewünschten Ergebnis kommt. Und selbst bei vermeintlich leichten Berichten ist man oft viel länger mit dem Erstellen des Berichts beschäftigt, als erwartet.
Und man kann soviel Zeit mit Kleinigkeiten verschwenden, man glaubt es kaum.
Erstaunlicherweise ist das Migrations- und Deploymentkonzept anscheinend nicht sonderlich ausgereift. Für eine professionelle Web Anwendung, die nicht erst seit gestern dabei ist, schon seltsam. Ich bin mal gespannt, wie sich das Produkt durch die Übernahme von IBM weiter entwickelt.
Das ist schon eine interessante Web 2.0 Anwendung. Aber was mich am meisten erstaunt: es gibt soviele Möglichkeiten irgendwo einen Parameter zu setzen, dass man oft nur durch probieren zum gewünschten Ergebnis kommt. Und selbst bei vermeintlich leichten Berichten ist man oft viel länger mit dem Erstellen des Berichts beschäftigt, als erwartet.
Und man kann soviel Zeit mit Kleinigkeiten verschwenden, man glaubt es kaum.
Erstaunlicherweise ist das Migrations- und Deploymentkonzept anscheinend nicht sonderlich ausgereift. Für eine professionelle Web Anwendung, die nicht erst seit gestern dabei ist, schon seltsam. Ich bin mal gespannt, wie sich das Produkt durch die Übernahme von IBM weiter entwickelt.
Thursday, 19. February 2009
Bauer, Günzel: "Data-Warehouse Systeme"
Dieses Buch behandelt die Theorie und Praxis von Data-Warehouse Systemen. Themen sind Definition, Architektur, Phasen (ETL, DataMining, OLAP), Datenmodellierung (relational und multidimensional), Optimierung, Metadaten und Betrieb. Trotzdem hat man das Gefühl, das die gut 500 Seiten nicht ausreichen, alles genau zu erklären und so wimmelt es in diesem Buch - das gleichzeitig Nachschlagewerk und Grundlagenlektüre ist - von Referenzen auf andere fachspezifischere Literatur. Es eignet sich somit sowohl für Studenten der Informationstechnik, als auch für interessierte Themeneinsteiger. Ein so großes Themenspektrum wird daher in diesem Buch von einer ganzen Autorengruppe bearbeitet.
Ich fand es interessant zu lesen, denn obwohl ich in dem Bereich beruflich tätig bin, lernt man doch viel Neues; auch wenn ich etwas Zeit brauchte, um mir die 500 Seiten vor zu nehmen. Es ist auch keine leichte Lektüre, die man so nebenbei mal lesen kann. Aber dennoch vermittelt es eine guten Einblick rund um das komplexe Thema Data-Warehousing. Ich habe hier die 2. überarbeitete Auflage von 2004 gelesen, sehe aber gerade, dass im Dezember bereits die 3. Auflage herauskam. In 4 Jahren ändert sich einiges in dem Bereich (das hab ich auch beruflich bemerkt. So wurden im letzten Jahr fast alle größeren Softwareunternehmen von Business-Intelligence Software von den Großen im Markt gekauft.) und so kann ich nur die neue aktualisierte Auflage empfehlen.
Interessantes Detail am Rande, sowohl mit dem Herausgeber Holger Günzel als auch mit dem Co-Autor Volker Markl hab ich mal beruflich einige Zeit zusammengearbeitet. Weblink zum Buch
Ich fand es interessant zu lesen, denn obwohl ich in dem Bereich beruflich tätig bin, lernt man doch viel Neues; auch wenn ich etwas Zeit brauchte, um mir die 500 Seiten vor zu nehmen. Es ist auch keine leichte Lektüre, die man so nebenbei mal lesen kann. Aber dennoch vermittelt es eine guten Einblick rund um das komplexe Thema Data-Warehousing. Ich habe hier die 2. überarbeitete Auflage von 2004 gelesen, sehe aber gerade, dass im Dezember bereits die 3. Auflage herauskam. In 4 Jahren ändert sich einiges in dem Bereich (das hab ich auch beruflich bemerkt. So wurden im letzten Jahr fast alle größeren Softwareunternehmen von Business-Intelligence Software von den Großen im Markt gekauft.) und so kann ich nur die neue aktualisierte Auflage empfehlen.
Interessantes Detail am Rande, sowohl mit dem Herausgeber Holger Günzel als auch mit dem Co-Autor Volker Markl hab ich mal beruflich einige Zeit zusammengearbeitet. Weblink zum Buch
Monday, 24. November 2008
Was für ein Wochenanfang
Mit über 40 Minuten Verspätung erreichte ich heute Frankfurt Flughafen, nachdem ein voraus fahrender ICE zwischen Kassel und Fulda liegen geblieben ist. Aufgrund der Verspätung entschied ich mich für ein Taxi für das letzte Stück zum Arbeitsplatz.
Das sollte sich als schlechte Wahl erweisen, denn kaum eingestiegen und dem Taxifahrer das Ziel der Fahrt genannt, da fing dieser schon laut zu fluchen an. Er schrie, knallte die Tür und schmiß Zettel durch den Innenraum. Seinem Benehmen nach zu urteilen, war er wohl Italiener.
Nun bin ich es durchaus gewöhnt, dass Taxifahrer nicht begeistert sind, wenn sie mich nur 10 Minuten fahren dürfen, weil sie danach entweder wieder Gebühren für die Einfahrt zum Flughafen zahlen müssen oder ewig lang warten müssen, bis sie wieder einen Fahrgast transportieren dürfen. Vielleicht auch beides, so ganz genau hat mir nie jemand das Problem erklärt. Aber so ausgerastet ist noch nie jemand. Sich als Fahrgast für sein Ziel rechtfertigen zu müssen ist schon ein sehr merkwürdiges Gefühl und sein Benehmen war mir dann doch etwas unheimlich.
Was für ein grandioser Wochenanfang...
Das sollte sich als schlechte Wahl erweisen, denn kaum eingestiegen und dem Taxifahrer das Ziel der Fahrt genannt, da fing dieser schon laut zu fluchen an. Er schrie, knallte die Tür und schmiß Zettel durch den Innenraum. Seinem Benehmen nach zu urteilen, war er wohl Italiener.
Nun bin ich es durchaus gewöhnt, dass Taxifahrer nicht begeistert sind, wenn sie mich nur 10 Minuten fahren dürfen, weil sie danach entweder wieder Gebühren für die Einfahrt zum Flughafen zahlen müssen oder ewig lang warten müssen, bis sie wieder einen Fahrgast transportieren dürfen. Vielleicht auch beides, so ganz genau hat mir nie jemand das Problem erklärt. Aber so ausgerastet ist noch nie jemand. Sich als Fahrgast für sein Ziel rechtfertigen zu müssen ist schon ein sehr merkwürdiges Gefühl und sein Benehmen war mir dann doch etwas unheimlich.
Was für ein grandioser Wochenanfang...
Monday, 18. August 2008
nur so nebenbei
Ab jetzt darf ich mich akkreditierter IT-Architekt nennen oder auch Advisory IT-Architect.
Vermutlich ändert sich sonst nichts.
Vermutlich ändert sich sonst nichts.
Sunday, 15. June 2008
Ausgefallen...
Ich hab hier ein T41. Es ist etwas über 3,5 Jahre alt und mittlerweile zweimal innerhalb von 3 Monaten ausgefallen.
Jetzt habe ich es wiederbekommen und laut Lieferschein wurde bereits zum 2. Mal die Hauptplatine gewechselt. Irgendwie nicht sehr ermutigend für die Zukunft, oder? Ich hoffe das hält jetzt noch ein bißchen.
Eigentlich gibt es ein neuen Firmenlaptop alle 4 Jahre, aber wenn es ausfällt und älter als 3,5 Jahre ist, sollte es sofort ein Neues geben. Nur hat das wohl niemand den Leuten vom technischen Support gesagt. Naja, ich hoffe, im nächsten halben Jahr muß ich es nicht nochmal 2 Mal einschicken...
Jetzt habe ich es wiederbekommen und laut Lieferschein wurde bereits zum 2. Mal die Hauptplatine gewechselt. Irgendwie nicht sehr ermutigend für die Zukunft, oder? Ich hoffe das hält jetzt noch ein bißchen.
Eigentlich gibt es ein neuen Firmenlaptop alle 4 Jahre, aber wenn es ausfällt und älter als 3,5 Jahre ist, sollte es sofort ein Neues geben. Nur hat das wohl niemand den Leuten vom technischen Support gesagt. Naja, ich hoffe, im nächsten halben Jahr muß ich es nicht nochmal 2 Mal einschicken...
Monday, 28. April 2008
Cashcow
Ein Kunde hat ein Softwareprodukt in der Enterprise Version im Einsatz, für deren Lizenz prozessorabhängige Gebühren fällig sind. Und zwar keine Kleinigkeiten. Nun läuft eine ältere Version vom Support her aus. Also entscheidet der Kunde, einen neuen Server zu beschaffen und diesen Server so auszustatten, dass er später einmal der produktive Server für das Softwareprodukt in aktuellerster Version werden kann.
Es wird also ein Angebot über einen Hardwarekauf eines Servers eingeholt, Architektur: was so aktuell ist auf dem Hardware Markt (2 Quad-Core CPUs, Hardware-Raid, 4GB RAM). Nun will man mit dem Softwarehersteller prüfen lassen, ob der Server für die neue Version ausreichend dimensioniert ist für ihr Enterprise Produkt und man erwartet eigentlich nur ein "ja, reicht aus" oder "nein, das sollten lieber 8 GB Hauptspeicher". Die Lizenz für die neue Version ist schon vorhanden, aber an maximal 4 CPUs gebunden.
Jetzt entwickelt sich ein interessanter Dialog zwischen Kunde und Vertriebler von Software, mit dem Ergebnis, dass die 4 CPU-Lizenz nicht 2 Quad-Core CPUs beinhaltet. Für 2 Quad-Cores werden nochmal deutlich fünfstellige Lizenzkosten fällig, wenn der Server auch noch mit der 64bit Version laufen soll, kommt nochmal ein fünstelliger Betrag obendrauf. Daraufhin rudert man beim Kunden zurück und möchte halt nur noch 2 Dual-Core CPUs bestellen. Aber so leicht gibt sich der Vertriebler nicht geschlagen. Auch für 2 Dual-Cores sind noch deutlich fünfstellige Lizenzkosten fällig, wenn auch nur die Hälfte als für die Quad-Cores.
Zusätzlich meint man, dass bei diesen Konstellationen auch noch Lizenzkosten für die Test- und Entwicklungsumgebung fällig wären.
Wäre ich Kunde, ich hätte die rausgeworfen. Dann hätte ich bei diesem Kunden zwar nichts mehr zu tun, aber als Frechheit empfinde ich das schon.
Es wird also ein Angebot über einen Hardwarekauf eines Servers eingeholt, Architektur: was so aktuell ist auf dem Hardware Markt (2 Quad-Core CPUs, Hardware-Raid, 4GB RAM). Nun will man mit dem Softwarehersteller prüfen lassen, ob der Server für die neue Version ausreichend dimensioniert ist für ihr Enterprise Produkt und man erwartet eigentlich nur ein "ja, reicht aus" oder "nein, das sollten lieber 8 GB Hauptspeicher". Die Lizenz für die neue Version ist schon vorhanden, aber an maximal 4 CPUs gebunden.
Jetzt entwickelt sich ein interessanter Dialog zwischen Kunde und Vertriebler von Software, mit dem Ergebnis, dass die 4 CPU-Lizenz nicht 2 Quad-Core CPUs beinhaltet. Für 2 Quad-Cores werden nochmal deutlich fünfstellige Lizenzkosten fällig, wenn der Server auch noch mit der 64bit Version laufen soll, kommt nochmal ein fünstelliger Betrag obendrauf. Daraufhin rudert man beim Kunden zurück und möchte halt nur noch 2 Dual-Core CPUs bestellen. Aber so leicht gibt sich der Vertriebler nicht geschlagen. Auch für 2 Dual-Cores sind noch deutlich fünfstellige Lizenzkosten fällig, wenn auch nur die Hälfte als für die Quad-Cores.
Zusätzlich meint man, dass bei diesen Konstellationen auch noch Lizenzkosten für die Test- und Entwicklungsumgebung fällig wären.
Wäre ich Kunde, ich hätte die rausgeworfen. Dann hätte ich bei diesem Kunden zwar nichts mehr zu tun, aber als Frechheit empfinde ich das schon.
Tuesday, 15. April 2008
$nerv++
Meine heutigen Höhepunkte:
- Mit Taxifahrern über den Weg zu diskutieren, weil diese Umwege fahren. Und dann nicht mal einsehen, dass man versucht zu betrügen, sondern was von kürzestem Weg faseln. Ganz besonders Spaßig, weil man direkt in den Berufsverkehr rein kommt, was völlig unnötig wäre.
- Seit bei meinem Firmenlaptop das Mainboard getauscht wurde, funktioniert USB bei Massenspeichern nur noch sporadisch, um es mal positiv auszudrücken. D.h. meine externe Festplatte für Backups wird überhaupt nicht mehr erkannt, ein USB-Stick verschwindet ständig, wenn man darauf zugreift. Eine Neuinstallation wäre ratsam, wenn ich nicht ständig mit dem Rechner unterwegs wäre. Und ich kann mir jetzt Gedanken machen, wie ich die Backups zukünftig zuhause per LAN erledige...
Monday, 3. March 2008
Taxi auf Irrwegen
Was soll man von einem Taxifahrer halten, dem man sagt, dass man zum Steigenberger Airport Hotel gefahren werden möchte, der einen jedoch stattdessen zum Sheraton Airport Hotel fährt?
Sagt man: "Vielen Dank, sind ja nur knapp 3 km quer über die Autobahn, den Rest schaff ich alleine?"
Größere Kartenansicht
Sagt man: "Vielen Dank, sind ja nur knapp 3 km quer über die Autobahn, den Rest schaff ich alleine?"
Größere Kartenansicht
Thursday, 21. February 2008
Diese Woche bin ich auf Schulung bei einem Anbieter von BI-Software, den mein Arbeitgeber überraschend anfang des Jahres gekauft hat. Das interessante daran, ist, dass dadurch die Schulung meinen Arbeitgeber nur einen Apfel und ein Ei kostet, wohingegen diese Schulung normalerweise einen guten 4-stelligen Betrag kostet. Wenn man bedenkt, dass man bei dieser Schulung kostenlos verköstigt wird, könnte man sagen, dass ich die Anmeldegebühr verfressen habe...
Abgesehen davon, ist es interessant zu sehen, was man mit Business-Intelligence mittlerweile alles machen kann. Und der entsprechende Software-Anbieter gehört zu den besten seiner Zunft. Es ist sehr interessant zu sehen, was man aus den Daten alles machen kann, wenn man sich vorher hauptsächlich mit ETL beschäftigt hat und eher nicht die Business-Relevanz gesehen hat.
Abgesehen davon, ist es interessant zu sehen, was man mit Business-Intelligence mittlerweile alles machen kann. Und der entsprechende Software-Anbieter gehört zu den besten seiner Zunft. Es ist sehr interessant zu sehen, was man aus den Daten alles machen kann, wenn man sich vorher hauptsächlich mit ETL beschäftigt hat und eher nicht die Business-Relevanz gesehen hat.
Tuesday, 19. February 2008
Informatica Repository Metadaten
Wenn man Informatica als ETL-Lösung zur Beladung eines Datawarehouse nutzt, kann es sinnvoll sein, hin und wieder die Metadaten des Repositories zu entrümpeln. Dort werden nämlich die Statistiken über alle durchgeführten Läufe gespeichert und, falls eingerichtet, auch die Versionsinformationen.
Wenn jetzt der Ladeprozess täglich läuft und dabei jedesmal um die 100 Workflows mit mehreren Sessions laufen (was weder unüblich noch besonder viel ist), dann kann der Platz im Tablespace der darunter liegenden Datenbank des Informatica Repositories arg eng werden. Deshalb empfiehlt es sich, hin und wieder mal die Statistiken zu löschen. Das geschieht typischerweise mittels pmrep truncatelog. Näheres weiß die sehr gute Dokumentation zum Thema.
Ich wollte es nur mal gesagt haben, damit ich das nicht wieder vergesse.
Wenn jetzt der Ladeprozess täglich läuft und dabei jedesmal um die 100 Workflows mit mehreren Sessions laufen (was weder unüblich noch besonder viel ist), dann kann der Platz im Tablespace der darunter liegenden Datenbank des Informatica Repositories arg eng werden. Deshalb empfiehlt es sich, hin und wieder mal die Statistiken zu löschen. Das geschieht typischerweise mittels pmrep truncatelog. Näheres weiß die sehr gute Dokumentation zum Thema.
Ich wollte es nur mal gesagt haben, damit ich das nicht wieder vergesse.
Wednesday, 23. January 2008
Dynamische Ausdrücke auswerten mit Informatica PowerCenter Designer
Informatica ist ein Hersteller von Datenintegrationssoftware. Sowas benötigt man im Allgemeinen, wenn man ein Daten-Warehouse beladen möchte. Damit kann man dann die Daten normalisieren und Regeln anwenden, ohne sich mit komplexen SQL-Statements rumzuschlagen (ETL-Prozess).
Für ein Projekt kam jetzt die Anforderung auf, dynamisch Regeln auszuwerten. Im Idealfall sieht das dann so aus. Man hat z.B. folgende Tabelle:
create table logik(
FELD1 number,
FELD2 number,
FORMULA varchar2(100)
)
In Spalte FELD1 und FELD2 steht jeweils ein Wert und in der Spalte Formel befindet sich die Berechnung (z.B. FELD1/FELD2 * 100 um den Prozentsatz des Verhältnisses zu bestimmen). Beim Beladen möchte man nun optimalerweise die Formel gleich anwenden, also dynamisch auswerten. Obwohl man mit Informatica PowerCenter durchaus komplexe Transformationen durchführen kann, fehlt die Funktionalität solche Ausdrücke zur Laufzeit auswerten zu können.
Der Workaround besteht darin, eine StoredProcedure Transformation einzubauen (in Informatica 8 sollte auch eine SQL-Transformation existieren, mit der man das auch erreichen kann) , die in der Datenbank eine Stored Procedure ablegt, die das dynamisch auswertet.
Bsp (für Oracle):
CREATE OR REPLACE FUNCTION calc (formula VARCHAR2) RETURN real IS
sql_stmt varchar2(100);
v_result real;
BEGIN
sql_stmt := 'SELECT ' || formula || ' from dual';
EXECUTE IMMEDIATE sql_stmt into v_result;
return v_result;
EXCEPTION
WHEN OTHERS THEN RAISE;
END calc;
Diese PL/SQL Funktion macht nichts weiter als den übergebenen Ausdruck auszuwerten, im Prinzip also ein eval(). So kann man z.B. einfache Formel berechnen:
Theoretisch kann man so jegliche SQL-Ausdrücke auswerten lassen, dazu muß der Rückgabewert bei Bedarf noch auf Varchar geändert werden.
In Informatica kann die Prozedur dann so eingebunden werden:

Übersicht über das Mapping Design:
In der Expression Transformation (rot), werden die String-Variablen FELD1 und FELD2 im Feld FORMULA durch ihren Inhalt ersetzt. Diese aufgelöste Formel, wird danach an die Stored Procedure CALC übergeben (unconnected)
Für ein Projekt kam jetzt die Anforderung auf, dynamisch Regeln auszuwerten. Im Idealfall sieht das dann so aus. Man hat z.B. folgende Tabelle:
create table logik(
FELD1 number,
FELD2 number,
FORMULA varchar2(100)
)
In Spalte FELD1 und FELD2 steht jeweils ein Wert und in der Spalte Formel befindet sich die Berechnung (z.B. FELD1/FELD2 * 100 um den Prozentsatz des Verhältnisses zu bestimmen). Beim Beladen möchte man nun optimalerweise die Formel gleich anwenden, also dynamisch auswerten. Obwohl man mit Informatica PowerCenter durchaus komplexe Transformationen durchführen kann, fehlt die Funktionalität solche Ausdrücke zur Laufzeit auswerten zu können.
Der Workaround besteht darin, eine StoredProcedure Transformation einzubauen (in Informatica 8 sollte auch eine SQL-Transformation existieren, mit der man das auch erreichen kann) , die in der Datenbank eine Stored Procedure ablegt, die das dynamisch auswertet.
Bsp (für Oracle):
CREATE OR REPLACE FUNCTION calc (formula VARCHAR2) RETURN real IS
sql_stmt varchar2(100);
v_result real;
BEGIN
sql_stmt := 'SELECT ' || formula || ' from dual';
EXECUTE IMMEDIATE sql_stmt into v_result;
return v_result;
EXCEPTION
WHEN OTHERS THEN RAISE;
END calc;
CODE:SQL> select 7*10/2 from dual; 7*10/2 ------ 35
Theoretisch kann man so jegliche SQL-Ausdrücke auswerten lassen, dazu muß der Rückgabewert bei Bedarf noch auf Varchar geändert werden.
In Informatica kann die Prozedur dann so eingebunden werden:
Übersicht über das Mapping Design:
In der Expression Transformation (rot), werden die String-Variablen FELD1 und FELD2 im Feld FORMULA durch ihren Inhalt ersetzt. Diese aufgelöste Formel, wird danach an die Stored Procedure CALC übergeben (unconnected)
Monday, 20. August 2007
Datenbankdesign: Eine N:M Relation umsetzen
Aus einer E-Mail, die ich schrieb. Gesucht war, zu den gegebenen Eigenschaften, die nicht-angegebenen Eigenschaften hinzuzufügen:
Zusammenfassend: Du hast zwischen Objekten und Eigenschaften eine N:M
Beziehung. Im Datenmodell wird sowas durch die Verwendung einer
eigenen Relationstabelle modelliert.
Der Einfachheit halber ein Beispiel mit Personen inklusive physischem
Datenbankdesign (ich beschränke mich hier auf Oracle, da ich das am
besten kenne, Indize und Constraints nicht betrachtet).
Tabelle Personen:
Tabelle Eigenschaften
Tabelle Personeneigenschaften
In dieser Tabelle werden nur die eingegebenen Eigenschaften
gespeichert. Also alles, was du an Beziehungen vorliegen hast. Alles
was nicht relevant ist, kann später per SQL generiert werden.
Nun füllen wir mal unsere Beispieltabellen:
/* Zunächst brauchen wir ein paar Personen */
INSERT INTO pers VALUES (1, 'schulz', 'mike' );
INSERT INTO pers VALUES (2, 'müller', 'otto' );
INSERT INTO pers VALUES (3, 'schmidt', 'oliver' );
/* Nun noch ein paar passende Eigenschaften */
INSERT INTO atrb VALUES (1, 'größe');
INSERT INTO atrb VALUES (2, 'gewicht');
INSERT INTO atrb VALUES (3, 'brille');
/* Und hier jetzt die Zuordnungen Person zu Eigenschaft */
INSERT INTO atrb_val VALUES (1, 1, '1.8m');
INSERT INTO atrb_val VALUES (1, 2, '75kg');
INSERT INTO atrb_val VALUES (2, 1, '2m');
INSERT INTO atrb_val VALUES (2, 3, 'y');
Nun können wir schön eine Beziehung darstellen. Also alle eingegebenen
Atribute zu den Objekten anzeigen lassen:
SELECT
a.object_fname,
a.OBJECT_NAME,
b.ATRIBUTE,
c.atrb_val
FROM
pers a,
atrb b,
atrb_val c
WHERE
a.OBJECT_ID = c.object_id AND
b.ATRB_ID = c.atrb_id;
Ok, soweit warst Du vermutlich schon. Aber wir können daraus auch die
Werte ziehen, die dort gar nicht enthalten sind.
Dies geschieht, indem alle vorhandenen Kombination von allen möglichen
Kombination abgezogen werden. Es handelt sich hierbei also um die
Differenz zweier Mengen.
-- Alle möglichen Kombinationen aus Person und Attributen
SELECT
a.object_fname,
a.object_name,
b.atribute
FROM
pers a,
atrb b
-- von dieser Menge ziehen wir ab
MINUS
-- Alle vorhandenen Kombinationen aus Person und Attributen
SELECT
a.object_fname,
a.OBJECT_NAME,
b.ATRIBUTE
FROM
pers a,
atrb b,
atrb_val c
WHERE
a.OBJECT_ID = c.object_id AND
b.ATRB_ID = c.atrb_id;
Als Ergebnis erhalten wir:
Damit hast du also alle Kombinationen, die für dich nicht relevant
sind. Wenn Du diese Ergebnismenge nimmst und mit der Menge aller
vorhandenen Kombinationen kombinierst, hast Du Dein gewünschtes
Ergebnis, nämlich alle vorhandenen Eigenschaften inklusive aller nicht
angegebenen Eigenschaften:
SELECT
a.object_fname,
a.object_name,
a.atribute,
'----' as atrb_val
FROM
(
SELECT
a.object_fname,
a.object_name,
b.atribute
FROM
pers a,
atrb b
MINUS
SELECT
a.object_fname,
a.OBJECT_NAME,
b.ATRIBUTE
FROM
pers a,
atrb b,
atrb_val c
WHERE
a.OBJECT_ID = c.object_id AND
b.ATRB_ID = c.atrb_id
) a
UNION
SELECT
a.object_fname,
a.OBJECT_NAME,
b.ATRIBUTE,
c.atrb_val
FROM
pers a,
atrb b,
atrb_val c
WHERE
a.OBJECT_ID = c.object_id AND
b.ATRB_ID = c.atrb_id;
Das ist alles größtenteils aus dem Ärmel geschüttelt und ungetestet,
das Prinzip sollte klar werden.
Zusammenfassend: Du hast zwischen Objekten und Eigenschaften eine N:M
Beziehung. Im Datenmodell wird sowas durch die Verwendung einer
eigenen Relationstabelle modelliert.
Der Einfachheit halber ein Beispiel mit Personen inklusive physischem
Datenbankdesign (ich beschränke mich hier auf Oracle, da ich das am
besten kenne, Indize und Constraints nicht betrachtet).
Tabelle Personen:
CREATE TABLE Pers(
object_id INTEGER, /* man braucht immer eine ID */
object_name VARCHAR2(100), /* Name */
object_fname VARCHAR2(100) /* Vorname */
);
object_id INTEGER, /* man braucht immer eine ID */
object_name VARCHAR2(100), /* Name */
object_fname VARCHAR2(100) /* Vorname */
);
Tabelle Eigenschaften
CREATE TABLE atrb (
atrb_id INTEGER, /* ID */
atribute VARCHAR2(100) /* Name */
);
atrb_id INTEGER, /* ID */
atribute VARCHAR2(100) /* Name */
);
Tabelle Personeneigenschaften
CREATE TABLE atrb_val (
object_id INTEGER, /* Personen ID */
atrb_id INTEGER, /* Eigenschaft ID */
atrb_val VARCHAR2(100) /* Ausprägung */
);
object_id INTEGER, /* Personen ID */
atrb_id INTEGER, /* Eigenschaft ID */
atrb_val VARCHAR2(100) /* Ausprägung */
);
In dieser Tabelle werden nur die eingegebenen Eigenschaften
gespeichert. Also alles, was du an Beziehungen vorliegen hast. Alles
was nicht relevant ist, kann später per SQL generiert werden.
Nun füllen wir mal unsere Beispieltabellen:
/* Zunächst brauchen wir ein paar Personen */
INSERT INTO pers VALUES (1, 'schulz', 'mike' );
INSERT INTO pers VALUES (2, 'müller', 'otto' );
INSERT INTO pers VALUES (3, 'schmidt', 'oliver' );
/* Nun noch ein paar passende Eigenschaften */
INSERT INTO atrb VALUES (1, 'größe');
INSERT INTO atrb VALUES (2, 'gewicht');
INSERT INTO atrb VALUES (3, 'brille');
/* Und hier jetzt die Zuordnungen Person zu Eigenschaft */
INSERT INTO atrb_val VALUES (1, 1, '1.8m');
INSERT INTO atrb_val VALUES (1, 2, '75kg');
INSERT INTO atrb_val VALUES (2, 1, '2m');
INSERT INTO atrb_val VALUES (2, 3, 'y');
Nun können wir schön eine Beziehung darstellen. Also alle eingegebenen
Atribute zu den Objekten anzeigen lassen:
SELECT
a.object_fname,
a.OBJECT_NAME,
b.ATRIBUTE,
c.atrb_val
FROM
pers a,
atrb b,
atrb_val c
WHERE
a.OBJECT_ID = c.object_id AND
b.ATRB_ID = c.atrb_id;
OBJECT_NAME OBJECT_FNAME ATRIBUTE ATRB_VAL mike schulz größe 1.8m mike schulz gewicht 75kg otto müller größe 2m otto müller brille y
Ok, soweit warst Du vermutlich schon. Aber wir können daraus auch die
Werte ziehen, die dort gar nicht enthalten sind.
Dies geschieht, indem alle vorhandenen Kombination von allen möglichen
Kombination abgezogen werden. Es handelt sich hierbei also um die
Differenz zweier Mengen.
-- Alle möglichen Kombinationen aus Person und Attributen
SELECT
a.object_fname,
a.object_name,
b.atribute
FROM
pers a,
atrb b
-- von dieser Menge ziehen wir ab
MINUS
-- Alle vorhandenen Kombinationen aus Person und Attributen
SELECT
a.object_fname,
a.OBJECT_NAME,
b.ATRIBUTE
FROM
pers a,
atrb b,
atrb_val c
WHERE
a.OBJECT_ID = c.object_id AND
b.ATRB_ID = c.atrb_id;
Als Ergebnis erhalten wir:
OBJECT_FNAME OBJECT_NAME ATRIBUTE mike schulz brille oliver schmidt brille oliver schmidt gewicht oliver schmidt größe otto müller gewicht
Damit hast du also alle Kombinationen, die für dich nicht relevant
sind. Wenn Du diese Ergebnismenge nimmst und mit der Menge aller
vorhandenen Kombinationen kombinierst, hast Du Dein gewünschtes
Ergebnis, nämlich alle vorhandenen Eigenschaften inklusive aller nicht
angegebenen Eigenschaften:
SELECT
a.object_fname,
a.object_name,
a.atribute,
'----' as atrb_val
FROM
(
SELECT
a.object_fname,
a.object_name,
b.atribute
FROM
pers a,
atrb b
MINUS
SELECT
a.object_fname,
a.OBJECT_NAME,
b.ATRIBUTE
FROM
pers a,
atrb b,
atrb_val c
WHERE
a.OBJECT_ID = c.object_id AND
b.ATRB_ID = c.atrb_id
) a
UNION
SELECT
a.object_fname,
a.OBJECT_NAME,
b.ATRIBUTE,
c.atrb_val
FROM
pers a,
atrb b,
atrb_val c
WHERE
a.OBJECT_ID = c.object_id AND
b.ATRB_ID = c.atrb_id;
OBJECT_FNAME OBJECT_NAME ATRIBUTE ATRB_VAL mike schulz brille ---- mike schulz gewicht 75kg mike schulz größe 1.8m oliver schmidt brille ---- oliver schmidt gewicht ---- oliver schmidt größe ---- otto müller brille y otto müller gewicht ---- otto müller größe 2mUnd dies wäre dann dein gewünschter Report.
Das ist alles größtenteils aus dem Ärmel geschüttelt und ungetestet,
das Prinzip sollte klar werden.
Friday, 20. July 2007
Kleidergeschichten...
Es ist schon erstaunlich, kaum kleidet man sich richtig (Anzug, Krawatte, etc...) - inklusive Rollköfferchen - schon wird man ganz anders wahrgenommen.
Es ist mir jetzt schon ein paar Mal passiert, dass ein Taxifahrer mich auf der Straße angehalten hat und fragte, ob ich nicht irgendwohin wolle.
Es ist mir jetzt schon ein paar Mal passiert, dass ein Taxifahrer mich auf der Straße angehalten hat und fragte, ob ich nicht irgendwohin wolle.
(Page 1 of 2, totaling 23 entries)
next page »

