| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Homepage Unternehmensprofil Angebot Tools Vorträge Gedanken Tips
call execute() Macros mit Hilfe Baumstrukturen Replace Viewtable in V8 Replace Viewtable in V6 Problem mit Dezimalzahlen upload / download Access to Adabas ODS-Tips Ihre Meinung Kontakt |
Inhalt
EinführungHierarchien und andere Baumstrukturen kommen in Informationssystemen sehr häufig vor, und es gehört auch zum Allgemeinwissen, wie solche Strukturen in mehrdimensionalen Datenstrukturen (OLAP-Würfel) oder auch relationalen Strukturen verarbeitet werden: Wenn z.B. vorgerechnete Werte mit SAS erstellt werden sollen, verwendet man am einfachsten eine SAS-Tabelle, in der für jede Hierarchiestufe eine Variable mit den entsprechenden Ausprägungen steht, und erzeugt die Summen mit Proc Summary. Etwas aufwendiger wird es, wenn feste Stufen fehlen, und/oder die Bäume nicht binär sind. Für die folgenden Beispiele stellen wir uns eine große Makler-Organisation mit verschiedenen, hierarchisch strukturierten Geschäftsstellen vor. Gefragt wird nach der Anzahl der Immobilien und dem Gesamtwert im Einflussbereich einer Geschäftsstelle. Dabei verwenden wir drei Dateien:
Beispiel für einen binären BaumFür das erste Beispiel bleiben wir bei einem binären Baum und verwenden das folgende Organigramm:
Die Organisation ist "etwas chaotisch", weil es keine festen Hierarchiestufen gibt oder diese in einigen Fällen übersprungen werden. Hinzu kommt, dass einige übergeordnete Geschäftsstellen selbst Immobilien anbieten. Eine solche Situation findet man z.B. oft bei so genannten "Struktur-Vertrieben". Aber wenigstens wird jede Immobilie nur von einer Geschäftsstelle angeboten. Auch ist jede Geschäftsstelle genau einer übergeordneten Geschäftsstelle zugeordnet. Für den Benutzer sollen dann Tabellen in der folgenden Form aus vorgerechneten Werten erstellt werden:
Dazu wird folgende Ergebnisdatei benötigt (Ausschnitt):
ProgrammierungDas Programm zur Aufbereitung der Daten besteht dann aus drei Teilen:
Bei dem folgenden Lösungsvorschlag wird vorausgesetzt, dass die Datei "Geschaeftsstellen" einen Index auf das Feld GESCHST_NR besitzt und die Dateien Immobilien und Bestand nach der Immobiliennummer (IMMO_NR) sortiert sind. Hier wird zunächst ein Datastep-View erstellt, weil die Daten nur einmal von Proc Summary gelesen werden. Je nach Plattform kann es aber besser sein, eine physische Datei zu verwenden. Data work.erg1V / view = work.erg1V; Jetzt können die Summen für die Geschäftsstellen mit einem einfachen Proc Summary berechnet werden: Proc summary data=work.erg1V; Anschließend wird noch die besondere "Geschäftsstellen-Nummer" für das eigene Angebot erzeugt und die Datei zur besseren Übersicht sortiert. Data work.erg2; Beispiel für einen nicht-binären BaumGibt es dass wirklich?
Die Immobilien F und M werden gleichzeitig von 2 Geschäftsstellen angeboten. Solche Konstellationen sind selten, aber sie kommen vor und sind mit dem eben beschriebenen Ansatz leicht zu handhaben. Man muss nur darauf achten, dass die Summe für eine Geschäftsstelle nicht der Summe aus den untergeordneten Geschäftsstellen entspricht, weil es sonst zu Doppelzählungen kommen würde. Zum Beispiel müsste das Ergebnis für die Geschäftsstelle 12 jetzt wie folgt aussehen:
Hinweis: Eine Immobilie wird von zwei Geschäftsstellen angeboten. ProgrammierungUm Doppelzählungen zu vermeiden, müssen jetzt in den Datastep-View auch Sätze für die Gesamtsummen der Geschäftsstellen ausgegeben werden:Data work.erg1V / view = work.erg1V; Im nächsten Schritt werden Doubletten entfernt: Proc sort data=work.erg1V out=work.erg1S nodupkey; Dann können die Summen für die Geschäftsstellen mit einem einfachen Proc Summary berechnet werden. Dabei reicht wegen der Sortierung sogar eine BY-Untergruppenverarbeitung: Proc summary data=work.erg1S; Ausgaben für einzelne Einheiten ohne HierarchieNatürlich werden auch Übersichten benötigt, in denen für eine Organisationseinheit die Werte nach anderen Merkmalen aufgeschlüsselt sind. Im folgenden Beispiel ist es die Immobilienart:
Dabei muss dann zwischen dem eigenen Angebot und dem Angebot aus dem Bereich insgesamt unterschieden werden. Da dies bei den meisten Geschäftsstellen dasselbe ist, spart man Platz, wenn man zwei Kennzeichen, z.B. "eigenes Angebot" und "Angebot insgesamt", einführt, wozu dann folgende Ergebnisdatei benötigt wird (Ausschnitt):
ProgrammierungWürde man bei den Geschäftsstellen ohne unterstellte Geschäftsstellen auf die Zusammenfassung der Sätze für "eigenes Angebot" und "Angebot insgesamt" verzichten, wäre es ausreichend, die künstlichen Geschäftsstellen-Nummern aus dem letzten Beispiel (99900 und 99999) zu verwenden. Wenn man den Plattenplatz sparen will, muss man zusätzlich prüfen, ob die jeweilige Geschäftsstelle untergeordnete Geschäftsstellen hat. Das Programm muss dann wie folgt modifiziert werden: Data work.erg1V / view = work.erg1V; Im nächsten Schritt werden wieder Doubletten entfernt, und anschließend wird summiert: Proc sort data=work.erg1V out=work.erg1S nodupkey; Proc summary data=work.erg1S;Die Gesamtsummen stehen dann unter _TYPE_=0, die Summen für die Immobilien-Arten stehen unter _TYPE_=1. Data work.erg2; OptimierungIn dem Datastep-View erfolgen viele indizierte Zugriffe auf die Geschäftsstellen-Tabelle, welche in diesem Umfang nicht unbedingt erforderlich sind. Der Vorteil dieses Algorithmus besteht vor allem darin, dass die maximale Zahl der Überstellungen nicht angegeben werden muss, und dass so auf Macrovariablen und Macros zur Anpassung verzichtet werden kann. Aber man kann auch zuerst die Hierarchie so auflösen, dass die erforderlichen Informationen in einem Datensatz stehen und zunächst mit der Bestands-Zuordnung verknüpft werden. Im folgenden Beispiel wird zur besseren Verständlichkeit SQL verwendet. Eine Datastep-Lösung lässt sich sehr leicht aus den oben stehenden Datastep-Views ableiten, würde aber bei der unten eingeführten Erweiterung, dass Geschäftsstellen an mehrere OE-Einheiten berichten können, sehr kompliziert. %Macro HierarchieAufloesen(maxStufe); Die Ergebnisdatei hat dann folgenden Aufbau: GeschSt_Nr oe_nr1 oe_nr2 oe_nr3 oe_nr4 Zu jeder Geschäftsstelle werden, sofern vorhanden, alle übergeordneten OE-Einheiten geliefert. Wer es sich jetzt ganz bequem machen will, fügt auch noch gleich die Zuordnung der Immobilien aus der Datei Bestand hinzu und kontrolliert, ob die Geschäftsstelle untergeordnete Geschäftsstellen hat: %Macro StrukturErstellen(maxStufe); Dann lassen sich sogar die Fälle mühelos verarbeiten, in denen eine OE-Einheit gleichzeitig an zwei übergeordnete OE-Einheiten berichtet, wie in dem folgenden Organigramm, bei dem die Geschäftsstelle 23 gleichzeitig an die OE-Einheiten 10 und 16 berichtet:
Die Ergebnisdatei hat dann folgenden Aufbau: Immo_Nr GeschSt_Nr Untergeordnete oe_nr1 oe_nr2 oe_nr3 oe_nr4 In der weiteren Verarbeitung wird diese Tabelle dann über ein Merge mit den Immobiliendaten verknüpft. Die Zugriffe auf die Geschäftsstellen-Tabelle werden durch die Verarbeitung eines Arrays ersetzt. Hier am Beispiel der Aufbereitung für die Immobilienarten: Data work.erg1V / view = work.erg1V; und weiter, wie gehabt: Proc sort data=work.erg1V out=work.erg1S nodupkey; FazitDiese Beispiele zeigen, dass sich mit SAS auch komplexe Situationen relativ leicht handhaben lassen, wenn man nicht dogmatisch darauf besteht, einen mehrdimensionalen Würfel (OLAP) zu erzeugen, für den feste Hierarchiestufen benötigt würden. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
©WS Unternehmensberatung und Controlling-Systeme GmbH
Friedrich-Weinbrenner-Straße 20 69126 Heidelberg Tel.: 06221 / 401 409
Amtsgericht Heidelberg, HRB 5485 Geschäftsführer: Wilfried Schollenberger | zurück zum Anfang |