OLAP: Unterschied zwischen den Versionen

Aus OrgaMon Wiki
Zur Navigation springen Zur Suche springen
 
(52 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 7: Zeile 7:
* Liste der Artikel, die seit einem Jahr ohne Verkauf sind
* Liste der Artikel, die seit einem Jahr ohne Verkauf sind
* Liste der Artikel, sortiert nach dem Verkaufsrang
* Liste der Artikel, sortiert nach dem Verkaufsrang
* Belege, die älter als 10 Jahre sind
* Kunden die vor 5 Jahren etwas gekauft haben, dann aber nicht mehr
<br>
<br>
In der Regel benötigtt man eine externe Datenhaltung in einem Datawarehouse, um solch leistungsstarke Analysen von Unternehmensdaten durchzuführen. OrgaMon OLAP arbeitet <b>OnLine</b> und ist dadurch echtzeitfähig. Allerdings ist bei der Erstellung der Abfragen ein internes Verständnis der Datenbank Tabellen hilfreich.
In der Regel benötigt man eine externe Datenhaltung in einem Datawarehouse, um solch leistungsstarke Analysen von Unternehmensdaten durchzuführen. OrgaMon OLAP arbeitet <b>OnLine</b> und ist dadurch echtzeitfähig. Allerdings ist bei der Erstellung der Abfragen ein internes Verständnis der Datenbank Tabellen hilfreich.


* OLAP ist recht komplex, reine Anwender finden in [[Auswertungen]] mundgerechtes OLAP.
* OLAP ist recht komplex, reine Anwender finden in [[Auswertungen]] mundgerechtes OLAP.
* Einen Überblick über den OLAP-Begriff finden Sie hier : [http://www.my-controlling.de/aufsaetze/olap/olap.htm]
* Einen Überblick über den OLAP-Begriff finden Sie hier : [http://www.my-controlling.de/aufsaetze/olap/olap.htm]
* Einen Überblick über den Datawarehouse-Begriff finden Sie hier: [http://de.wikipedia.org/wiki/Data_Warehouse]
* Einen Überblick über den Datawarehouse-Begriff finden Sie hier: [http://de.wikipedia.org/wiki/Data_Warehouse]
* Modellrechnungen für Ausblicke in zukünftige Entwicklungen: http://oksimo.inm.de/


Der nächste Schritt werden Modellrechnungen im OrgaMon sein, also das Weiterführen von Unternehmenszahlen in die Zukunft und entsprechende Auswertungen. Dadurch kann rechtzeitig vor schadhaften Entwicklungen gewarnt werden.
Der nächste Schritt werden Modellrechnungen im OrgaMon sein, also das Weiterführen von Unternehmenszahlen in die Zukunft und entsprechende Auswertungen. Dadurch kann rechtzeitig vor schadhaften Entwicklungen gewarnt werden.
Zeile 23: Zeile 24:
== Funktionsüberblick ==
== Funktionsüberblick ==


Im wesentlichen wird eine OLAP Anfrage mit einem Programmscript gesteuert. Als Kommentarzeilen werden mit "--" und "//" beginnende Zeilen interpretiert. An verschiedenen Stellen im Programm können Ergebnisse aus OLAP Abfragen wiederum im OrgaMon eingelesen und weiterverarbeitet werden. Mit Hilfe von Parametern ganz am Anfang kann es Endusern einfach ermöglicht werden, die Anfrage zu parametrisieren.
Eine OLAP- Anfrage ist ein Script, das schrittweise von oben nach unten abgearbeitet wird. In jedem Block erfolgt eine Definition einer OLAP-Dimension. In weiteren Schritten erfolgt eine Kombination/Aggreditierung der entstandenen Dimensionen. Am Ende des Scriptes steht das Ergebnis heruntergebrochen auf eine .csv Tabelle zur Verfügung.
 
-- Parameter
--
$Start='01.01.2020'
$Ende='01.01.2021'
 
-- 1. Dimension wird definiert
--
<b>select</b> ...
-- 2. Dimension wird definiert
--
<b>select</b> ...
-- 2. Dimension wird erweitert
--
<b>add</b>
3;2;1
-
-- Verarbeitung der 1. und 2. Dimension zu einem Ergebnis
--
<b>subtract</b>
-
-- Konvertierung des Ergebnisses nach xls
--
<b>excel</b>
-
 
* Als Kommentarzeilen werden mit "--" beginnende Zeilen interpretiert.  
* An verschiedenen Stellen im Programm können Ergebnisse aus OLAP- Abfragen wiederum eingelesen und weiterverarbeitet werden.  
* Mit Hilfe von Parametern ganz am Anfang kann es Endusern einfach ermöglicht werden, die Anfrage zu parametrisieren.


== OLAP - Parameter ==
== OLAP - Parameter ==


Parameter sind im Skript defnierbare Platzhalter. Einmal zugewiesene Parameter können im ganzen Skript als Konstanten ausgewertet werden. Beispiel:
Parameter sind im Skript defnierbare Platzhalter (Konstanten). Sie müssen durch ein "$" (Dollar-Zeichen) eingeleitet werden. Einmal zugewiesene Parameter können im ganzen Skript als Konstanten angewendet werden. Beispiel:


<syntaxhighlight lang="SQL">


  $PERSON_R=92281
  $PERSON_R=92281
Zeile 37: Zeile 72:
   
   
  select * from BELEG where PERSON_R=$PERSON_R
  select * from BELEG where PERSON_R=$PERSON_R
</syntaxhighlight>
   
   
=== SQL "select ..." ===


* Parameter lassen sich durch den Rückgabewert eines SQL-Skriptes belegen
<syntaxhighlight lang="SQL">
$ANZAHL=select count(RID) from Beleg where ANLAGE>'01.01.2018'
</syntaxhighlight>


=== Reservierte Parameter ===
=== Reservierte Parameter ===


  $KopieSpeichernUnter=
  $KopieSpeichernUnter=
#
# <Pfadangabe>
  #
  #
  # gebe hier einen Verzeichnisnamen an. In dieses Verzeichnis werden alle Ausgabe-Tabellen des  
  # gebe hier einen Verzeichnisnamen an. In dieses Verzeichnis werden alle Ausgabe-Tabellen des  
Zeile 51: Zeile 95:
  # so verwende dafür "store"
  # so verwende dafür "store"
  #
  #
$Silent=
#
# <b><u>"JA"</u></b>|"NEIN"
#
# Im Silentmodus wird bei Treffen auf die Zeile mit dem Eintrag
#
# return
#
# das Script beendet. Dieser Parameter findet sich meist nicht im Skript
# sondern wird als Parameter vom aufrufenden Programm mitgegeben. Wird OLAP
# aus der Entwicklungsumgebung heraus aufgerufen, wird der Wert auf
# NEIN gesetzt.
$ExcelOpen=
#
# <b><u>"JA"</u></b>|"NEIN"
#
# Der Befehl "open" wird nur dann ausgeführt, wenn ExcelOpen den
# Wert "JA" hat (default). Bei Auswertungen und bei der Skriptausführung
# bei Tagwache und Tagesabschluss ist ExcelOpen "NEIN" (default).
#
$NAMESPACE=
#
# "TMP"|~AlternativerNamespace~
#
# default ist "TMP". OLAP erstellt während der Skript-Auswertung
# Dimensionen (die Seiten des OLAP-Würfels) physikalisch werden
# diese Werte in einer Tabelle gespeichert.
# Diese Tabelle werden automatisch durchnummeriert und heissen
# OLAP$TMP0, OLAP$TMP1, OLAP$TMP2, ...
# Da diese Tabellen immer wiederverwertet werden, kann es sein dass
# die Metadaten, die gerade benötigt werden (Struktur der Tabelle)
# nicht in der aktuellen Tabelle korrekt sind. Um sicherzustellen
# dass die Wiederverwertung funktioniert setzt man einen anderen
# Namespace, dadurch wird der Tabellenname eindeutig. Bei
#
# $NAMESPACE=XYZ
#
# werden die OLAP-Dimensionen als OLAP$XYZ0, OLAP$XYZ1, usw.
# bezeichnet.


=== Vorbelegte Parameter ===
=== Vorbelegte Parameter ===
Zeile 60: Zeile 146:
  $Datum10=01.01.2009
  $Datum10=01.01.2009
  $Skript=Umsatz
  $Skript=Umsatz
$Diagnose=~PfadDesDiagnoseVerzeichnisses~
$SEQ_TAGESABSCHLUSS=~WertDerSequenz(GEN_BACKUP)~
$SEQ_TAGWACHE=~WertDerSequenz(GEN_TAGWACHE)~


== OLAP - Beispiele ==
== Funktionsreferenz ==


http://olap.orgamon.de/
Funktionen wirken zumindest auf die letzte erstellte Dimension, ihr Ergebnis stellt wiederum eine neue Dimension dar.
 
== Funktionsreferenz ==


* [[$ Parameter]] Vorbelegen von Konstanten<br>
* [[$ Parameter]] Vorbelegen von Konstanten<br>
* [[$ numerischer Parameter]] Erstellen und Laden von SQL Includes<br>
* [[$ numerischer Parameter]] Erstellen und Laden von SQL Includes<br>
<br>
<br>
* [[connect]] an andere Datenbank als die aktuelle verbinden<br>
* [[add]] fügt einzelne Zeilen hinzu. Kann Spaltenwerte addieren<br>
* [[select]] SQL Statement<br>
* [[append]]* schreibt die aktuelle Tabelle einfach weiter.<br>
* [[data]]* SQL Statements an die Datenbank<br>
* [[assign]] Punkte einem Zeitstrahl zurordnen<br>
* [[basic]] führt das folgende BASIC - Programm aus<br>
* [[cast]] Feld-Typen anpassen<br>
* [[cast]] Feld-Typen anpassen<br>
* [[join]] 2 Ergebnistabellen verbinden<br>
* [[complete]] fehlende Spalten komplettieren<br>
* [[connect]] an andere Datenbank als die aktuelle verbinden (Weggefallen)<br>
* [[consult]] eine externe Tabelle konsultieren<br>
* [[consult]] eine externe Tabelle konsultieren<br>
* [[default]] Variable werden nur gesetzt wenn nicht schon vorbelegt<br>
* [[delete]] löscht Spalten.<br>
* [[data]]* SQL Statements an die Datenbank<br>
* [[extent]] 2 Ergebnistabellen erweitern<br>
* [[extent]] 2 Ergebnistabellen erweitern<br>
* [[excel]] Ergebnistabelle im EXCEL(tm) Format speichern<br>
* [[excel]] Ergebnistabelle im EXCEL(tm) Format speichern<br>
* [[header]] Tauscht den aktuellen Header aus<br>
* [[html]] Lädt, füllt und speichert eine html-Vorlage<br>
* [[integrate]] identische Spalten andere addieren<br>
* [[integrate]] identische Spalten andere addieren<br>
* [[integrate2]] identische Spalten andere addieren<br>
* [[integrate2]] identische Spalten andere addieren<br>
* [[integrate3]] identische Spalten andere addieren<br>
* [[include]] an ein anderes Skript übergeben<br>
* [[include]] an ein anderes Skript übergeben<br>
* [[sort]] Spalten sortieren<br>
* [[join]] 2 Ergebnistabellen verbinden<br>
* [[complete]] fehlende Spalten komplettieren<br>
* [[list]] einzelnen Spalten werden Kommaseperiert aufgelistet<br>
* [[load]] lädt einzelne Spalten aus einer csv in eine Datenbank Tabelle.<br>
* [[nop]]* "No Operation" keine Aktion, zählt aber den Context um eins weiter<br>
* [[OLAP.Oc|Oc]] OrientationConvert<br>
* [[repeat]] führt SQL Statements wiederholt aus.<br>
* [[replace]] fehlende Spalten komplettieren<br>
* [[replace]] fehlende Spalten komplettieren<br>
* [[table]] zwei Auswertungen zu einer Tabelle kombinieren<br>
* [[return]] verlässt im Servermodus das Script an dieser Stelle.<br>
* [[default]] Variable werden nur gesetzt wenn nicht schon vorbelegt
* [[assign]] Punkte einem Zeitstrahl zurordnen<br>
* [[subtract]] aus 2 Ergebnistabellen die Differenzmenge bilden<br>
* [[list]] einzelnen Spalten werden Kommaseperiert aufgelistet<br>
* [[save]] speichert das Ergebnis in der Datenbank ab<br>
* [[save]] speichert das Ergebnis in der Datenbank ab<br>
* [[nop]]* "No Operation" keine Aktion, zählt aber den Context um eins weiter<br>
* [[select]] SQL Statement<br>
* [[sort]] Spalten sortieren<br>
* [[spread]] macht aus dem Inhalt der 2. Spalte neue Spalten<br>
* [[spread]] macht aus dem Inhalt der 2. Spalte neue Spalten<br>
* [[spread2]] Summiert über Spalte 2 die Spalte 3<br>
* [[spread2]] Summiert über Spalte 2 die Spalte 3<br>
* [[repeat]] führt SQL Statements wiederholt aus.<br>
* [[load]] lädt einzelne Spalten aus einer csv in eine Datenbank Tabelle.<br>
* [[store]] speichert das aktuelle Ergebnis in eine Datei.<br>
* [[store]] speichert das aktuelle Ergebnis in eine Datei.<br>
* [[return]] verlässt im Servermodus das Script an dieser Stelle.<br>
* [[delete]] löscht Spalten.<br>
* [[story]] listet Felder mit identischem Anker nach rechts auf.<br>
* [[story]] listet Felder mit identischem Anker nach rechts auf.<br>
* [[add]] fügt einzelne Zeilen hinzu.<br>
* [[subtract]] aus 2 Ergebnistabellen die Differenzmenge bilden<br>
* [[append]]* schreibt die aktuelle Tabelle einfach weiter.<br>
* [[table]] zwei Auswertungen zu einer Tabelle kombinieren<br>
* [[basic]] führt das folgende BASIC - Programm aus<br>
* [[html]] Lädt, füllt und speichert eine html-Vorlage<br>


''*'' kein '-' am Ende notwendig
''*'' kein '-' am Ende notwendig


== Ergebnismenge als XLS ==
== automatisch ausgeführte OLAPs ==
 
Das Endergebnis wird im Standard Tabellenformat (c)Microsoft(r,tm)XLS(r,tm) ausgegeben, das durch [[LibreOffice]] verwendet werden kann.
 
== System OLAPs ==


* OLAP-Abfragen können automatisiert im Rahmen des Tagesabschlusses durchgeführt werden. Die OLAP-Skripte müssen sich im System-OLAP-Verzeichnis befinden (Grüner Ordner). Dazu muss der OLAP-Dateiname einem gewissen Muster entsprechen:
* OLAP-Abfragen können jedesmal m Rahmen des Tagesabschlusses/der Tagwache durchgeführt werden. Die OLAP-Skripte müssen sich im System-OLAP-Verzeichnis befinden (Grüner Ordner). Dazu muss der OLAP-Dateiname einem gewissen Muster entsprechen:


<code>
  #
  #
  # Für eine Durchführung im Rahmen des Tagesabschlusses:
  # Für eine Durchführung im Rahmen des Tagesabschlusses:
Zeile 121: Zeile 206:


  #  
  #  
  # Für eine Durchführung im Rahmer der Tagwache:
  # Für eine Durchführung im Rahmen der Tagwache:
  #
  #
  Tagwache.*.OLAP.txt
  Tagwache.*.OLAP.txt
</code>


* je nach der Systemeinstellung [[Systemeinstellungen#OLAPIst.C3.B6ffentlich|OLAPIstÖffentlich=]] werden die Skripte im zentralen OrgaMon-OLAP Verzeichnis gesucht (auf einem Netzwerk-Share), oder in einem lokalen Verzeichnis des aktuellen Benutzers (Dokumente/OrgaMon/OLAP). So kann gesteuert werden dass je nachdem "wer" den Tagesabschluss durchführt unterschiedliche Skripte zu Geltung kommen. Bei einem Umzug der Aufgabe "Tagesabschluss/Tagwache" auf einen anderen Host muss dann auch das lokale OLAP-Verzeichnis entsprechend kopiert werden.
* Werden unter Linux OrgaMon-Dienste unter der wine Emulations-Schicht ausgeführt, so sind die OLAP-Skripte z.B. in:


* Die Verwendung von gewissen OLAP-Abfragen ist in den OrgaMon integriert, so ist es einfach möglich auf besondere Benutzerwünsche einzugehen.
~/Documents/OrgaMon/OLAP
# gleich bedeutend mit
~/.wine/drive_c/users/root/Meine Dokumente/OrgaMon/OLAP


<code>
== System OLAPs ==
System.Beleg.Aktion.OLAP.txt<br>
System.Prorata.Artikel.OLAP.txt<br>
System.Prorata.Belege.OLAP.txt<br>
System.Prorata.Person.OLAP.txt<br>
System.Prorata.Posten.OLAP.txt<br>
System.Prorata.Verlagsmodus.Artikel.OLAP.txt<br>
System.Prorata.Verlagsmodus.Person.OLAP.txt<br>
</code>


== Neu: CLUB ==


In Zukunft sollen Parameter Eingabedialoge abfragbar sein. (Ev. mit Historie und default Belegungen)
* gewisse OLAP-Abfragen werden vom OrgaMon ihm Rahmen von Aktionen davor oder danach ausgeführt. Beispiel ist die Beleg-Buchung, danach wird <code>System.Beleg.Aktion.OLAP.txt</code> ausgeführt.
</code>


In Zukunft sollen Dimensionen vordefiniert sein (Artikel,Belege, Verkäufe, Personen).
== Beispiele ==


In Zukunft sollen Attribute angebbar sein (Artikel.Anlage > -3 Monate, Person.Alter > 40).
=== Auftrag.Sperre um ein Jahr verschieben ===


In Zukunft sollen Betriebsbegriffe vordefinierbar sein.<br>
<syntaxhighlight lang="SQL">
Umsatz(eines Artikel) (select MENGE_GELIEFERT from POSTEN-Club)<br>
update
Umsatz(einer Person) (select DAVON_BEZAHLT from BELEG-Club)<br>
  AUFTRAG
<br>
set
der POSTEN-Club kann dann einfach * sein, oder wieder selektiert.
  SPERRE_VON = SPERRE_VON + 365,
n-Idee: Jede Dimension hat üben, in die manden Abfrage-Faden flechten kann.
  SPERRE_BIS = SPERRE_BIS + 365
OLAP-Admins definieren Clubs, Dimensionen und en.
where
Zeiträume sollten nun (Jahrgenauer |Taggenauer | Monatgenauer | Wochengenauer) kummuliert werden. Das ist die Granularität Summe ist die größe Körnung.
  BAUSTELLE_R=355
</syntaxhighlight>


Club: A (maybe empty) List of Members
=== Lastschriftvolumen ===
Rule: A piece of deterministic logical code that decides, if a record is a Member or not. Club uses Rules to define if one is  a member or not.
Mem ber: A Record that is a part of one ore more clubs
isMember(): Answer the Question if a En
Field: space in a Record that can store a value , or can be empty
Record: One Line in a Table
Table: The Collection of Lines
Welcome: Somewhat happend, you are now gain membership of a club
Dependencies: A stored hint, that the system has to check again some rules to say welcome or good bye
transformer: a piece of code that calculates a in64 from a key of
Transaction: a of atoms
atom: a single changing operation done to the base


== Neu: Begriff ==
<syntaxhighlight lang="SQL">
//
// Lastschriftvolumen im Jahr
//
select
  DATUM,
  (BETRAG * -1.0) as BETRAG
from
  BUCH
where
  (NAME='1200') and
  (BETRAG<0)
order by
  DATUM
integrate
DATUM=Year(DATUM)
-
excel
BETRAG=MONEY
open
-
</syntaxhighlight>


Begriffe wie "Kunde" und "Umsatz" oder "Sortimentsbewegung" werden als OLAP-Statements definiert. Ein zentrale OLAP Abfrage könnte nun Fragestellungen mit Hilfe von "Begriffen" formulieren. Beispiel:
=== Preisumstellung ===


* Alle Kunden mit Sortimentsbewegung in den Sortimenten "A" und "B" im Zeitraum Januar bis März 2010
<syntaxhighlight lang="SQL">
 
--
Die Auflösung würde so erfolgen, dass zunächst die Begriffe
--  O L A P  - Definitions Datei
 
--
  # 1. Schritt: Begriffstabellen bilden
--  (c) 2022 Andreas Filsinger
  Kunden('01.01.2010','31.03.2010')
--
  Sortimentsbewegung('01.01.2010','31.03.2010')
-- Dieses Skript führt zu einer schlagartigen Preis-Änderung. Nach Ausführung
 
-- dieses Skripts sollte der OrgaMon auf allen Arbeitsplätzen neu gestartet
ausgelöst werden. Diese Begriffs-Eregbnise werden in temporären Ergebnistabelle zuwischengespeichert. Alles über EIN zentrales online SQL-Statement lösen zu wollen hat sich als unwirtschaftlich herausgestellt.
-- werden.
--
-- EURO ist das zentrale Artikel-Preis-Feld des OrgaMon, es gibt Artikel-Preise,
-- Ausgabeart-Preise und Preise in Preis-Tabellen. Somit kommt "EURO" in der
-- Datenbank 3 mal vor (ARTIKEL.EURO, PREIS.EURO, ARTIKEL_AA.EURO) Alle Preise
-- können mit Hilfe des neuen Feldes EURP geändert werden.
--
-- EURP (ein alternatives Preis-Feld, für "EUR"o "P"reisänderung) hat im OrgaMon
-- keinerlei funktionale Bedeutung - und dieses Feld dient der reinen passiven
-- Datenhaltung. Bereitet man eine Preisumstellung vor, so kann man ins Feld
-- EURP in Ruhe die neuen Preise vorbereiten. Ähnlich einem Notiz-Eintrag. Dabei
  -- füllt man nur die EURP-Inhalte bei denen sich bald eine Preisänderung ergibt.  
  -- Man gibt nicht den Änderungbetrag an, also z.B. +0,01 oder -13,3% sondern
-- direkt den neuen Preis. Man kann aber auch EURP durch Skripte füllen lassen
  -- (z.B. die angesprochene prozentuale Preissenkung EURP = EURO * 0.867).  
-- Will man anstelle 7,20 nunmehr 8,10 in zukünftigen Belegen anbieten, so trägt
-- man in EURP (Preis2) 8,1 ein, es passiert zunächst nichts bis dieses Skript
-- ausgeführt wird. 
-- 
-- Details zum Skript:
--
-- * Die Werte von EURO werden mit dem Wert in EURP getauscht
-- * Dadurch ist es möglich die Preisumstellung rückgängig zu machen
--  (Nochmaliges/Zweites Ausführen des Skriptes)
-- * Ist KEIN Eintrag in EURP wird EURO einfach so gelassen wie es ist
--  (somit ist es keine Pflicht Preise, die sich nicht ändern einzutragen)
-- * Mit diesem Skript kann man nur wenig Schaden anrichten, perfekt währe
--  ein weiteres Skript das alle Werte aus EURP löscht sobald die Preis-
--  umstellung abgeschlossen und vollständig getestet ist.
--   
update ARTIKEL set
  EURO=EURP,
  EURP=EURO
where
  (EURP is not null)
update ARTIKEL_AA set
  EURO=EURP,
  EURP=EURO
where
  (EURP is not null)
update PREIS set
  EURO=EURP,
  EURP=EURO
where
  (EURP is not null)
-
</syntaxhighlight>


# 2. Schritt
== Links ==
select PERSON_R from Kunden
join Sortimentsbewegung where
(Kunden.PERSON_R=Sortimentsbewegung.PERSON_R) and
(
  (Sortimentsbewegung.SORTIMENT_R='A') or
  (Sortimentsbewegung.SORTIMENT_R='B') or
)


würde man bei firebird alles in eine gemeinsame Transaktion packen, so könnte man "CREATE GLOBAL TEMPORARY TABLE ON COMMIT DELETE" machen.
* https://stackoverflow.blog/2022/03/03/stop-aggregating-away-the-signal-in-your-data/

Aktuelle Version vom 22. Februar 2024, 18:41 Uhr

OLAP ermöglicht es Ihnen, wichtige Kennzahlen aus Ihren OrgaMon Daten herauszufiltern. OLAP hilft Ihnen Fragen an den OrgaMon zu stellen. Hier typische Fragestellungen:

  • Anzahl der Kunden, die in den letzten 3 Monaten etwas gekauft haben
  • Der durchschnittliche Umsatz pro Kunde. Average Revenue per User (ARPU)
  • Liste der Artikel, die seit einem Jahr ohne Verkauf sind
  • Liste der Artikel, sortiert nach dem Verkaufsrang
  • Belege, die älter als 10 Jahre sind
  • Kunden die vor 5 Jahren etwas gekauft haben, dann aber nicht mehr


In der Regel benötigt man eine externe Datenhaltung in einem Datawarehouse, um solch leistungsstarke Analysen von Unternehmensdaten durchzuführen. OrgaMon OLAP arbeitet OnLine und ist dadurch echtzeitfähig. Allerdings ist bei der Erstellung der Abfragen ein internes Verständnis der Datenbank Tabellen hilfreich.

  • OLAP ist recht komplex, reine Anwender finden in Auswertungen mundgerechtes OLAP.
  • Einen Überblick über den OLAP-Begriff finden Sie hier : [1]
  • Einen Überblick über den Datawarehouse-Begriff finden Sie hier: [2]

Der nächste Schritt werden Modellrechnungen im OrgaMon sein, also das Weiterführen von Unternehmenszahlen in die Zukunft und entsprechende Auswertungen. Dadurch kann rechtzeitig vor schadhaften Entwicklungen gewarnt werden.

OrgaMon Anwender kommen selten mit der OLAP Definition in Berührung, sie verwenden in der Regel den OLAP Arbeitsplatz.

Das Befüllen der Datenbasis kann durch ein FTP Script erfolgen.

Funktionsüberblick

Eine OLAP- Anfrage ist ein Script, das schrittweise von oben nach unten abgearbeitet wird. In jedem Block erfolgt eine Definition einer OLAP-Dimension. In weiteren Schritten erfolgt eine Kombination/Aggreditierung der entstandenen Dimensionen. Am Ende des Scriptes steht das Ergebnis heruntergebrochen auf eine .csv Tabelle zur Verfügung.

-- Parameter
--
$Start='01.01.2020'
$Ende='01.01.2021'
-- 1. Dimension wird definiert
--
select ...

-- 2. Dimension wird definiert
--
select ...

-- 2. Dimension wird erweitert
--
add
3;2;1
-

-- Verarbeitung der 1. und 2. Dimension zu einem Ergebnis
--
subtract
-

-- Konvertierung des Ergebnisses nach xls
--
excel
-
  • Als Kommentarzeilen werden mit "--" beginnende Zeilen interpretiert.
  • An verschiedenen Stellen im Programm können Ergebnisse aus OLAP- Abfragen wiederum eingelesen und weiterverarbeitet werden.
  • Mit Hilfe von Parametern ganz am Anfang kann es Endusern einfach ermöglicht werden, die Anfrage zu parametrisieren.

OLAP - Parameter

Parameter sind im Skript defnierbare Platzhalter (Konstanten). Sie müssen durch ein "$" (Dollar-Zeichen) eingeleitet werden. Einmal zugewiesene Parameter können im ganzen Skript als Konstanten angewendet werden. Beispiel:

 $PERSON_R=92281
 
 select * from PERSON where RID=$PERSON_R
 
 append 
 
 select * from BELEG where PERSON_R=$PERSON_R

SQL "select ..."

  • Parameter lassen sich durch den Rückgabewert eines SQL-Skriptes belegen
 $ANZAHL=select count(RID) from Beleg where ANLAGE>'01.01.2018'

Reservierte Parameter

$KopieSpeichernUnter=
#
# <Pfadangabe>
#
# gebe hier einen Verzeichnisnamen an. In dieses Verzeichnis werden alle Ausgabe-Tabellen des 
# aktuellen OLAP-Skripts kopiert. Der Dateinname ist dabei der selbe wie bei der Original-Speicherung.
# Die Pfadangabe muss mit einem "\" enden.
#
# Wollen Sie Ergebnisdateien einen festen eigenen Dateinamen geben, 
# so verwende dafür "store"
#
$Silent=
#
# "JA"|"NEIN"
#
# Im Silentmodus wird bei Treffen auf die Zeile mit dem Eintrag
#
# return
#
# das Script beendet. Dieser Parameter findet sich meist nicht im Skript
# sondern wird als Parameter vom aufrufenden Programm mitgegeben. Wird OLAP
# aus der Entwicklungsumgebung heraus aufgerufen, wird der Wert auf
# NEIN gesetzt.
$ExcelOpen=
#
# "JA"|"NEIN"
#
# Der Befehl "open" wird nur dann ausgeführt, wenn ExcelOpen den 
# Wert "JA" hat (default). Bei Auswertungen und bei der Skriptausführung
# bei Tagwache und Tagesabschluss ist ExcelOpen "NEIN" (default).
#
$NAMESPACE=
#
# "TMP"|~AlternativerNamespace~
#
# default ist "TMP". OLAP erstellt während der Skript-Auswertung 
# Dimensionen (die Seiten des OLAP-Würfels) physikalisch werden 
# diese Werte in einer Tabelle gespeichert.
# Diese Tabelle werden automatisch durchnummeriert und heissen
# OLAP$TMP0, OLAP$TMP1, OLAP$TMP2, ...
# Da diese Tabellen immer wiederverwertet werden, kann es sein dass
# die Metadaten, die gerade benötigt werden (Struktur der Tabelle) 
# nicht in der aktuellen Tabelle korrekt sind. Um sicherzustellen
# dass die Wiederverwertung funktioniert setzt man einen anderen
# Namespace, dadurch wird der Tabellenname eindeutig. Bei
#
# $NAMESPACE=XYZ
#
# werden die OLAP-Dimensionen als OLAP$XYZ0, OLAP$XYZ1, usw.
# bezeichnet.

Vorbelegte Parameter

neben eigenen Parametern, sind folgende Standard-Parameter immer definiert.

$Datum=01.01.2009
$Datum8=01.01.09
$Datum10=01.01.2009
$Skript=Umsatz
$Diagnose=~PfadDesDiagnoseVerzeichnisses~
$SEQ_TAGESABSCHLUSS=~WertDerSequenz(GEN_BACKUP)~
$SEQ_TAGWACHE=~WertDerSequenz(GEN_TAGWACHE)~

Funktionsreferenz

Funktionen wirken zumindest auf die letzte erstellte Dimension, ihr Ergebnis stellt wiederum eine neue Dimension dar.


  • add fügt einzelne Zeilen hinzu. Kann Spaltenwerte addieren
  • append* schreibt die aktuelle Tabelle einfach weiter.
  • assign Punkte einem Zeitstrahl zurordnen
  • basic führt das folgende BASIC - Programm aus
  • cast Feld-Typen anpassen
  • complete fehlende Spalten komplettieren
  • connect an andere Datenbank als die aktuelle verbinden (Weggefallen)
  • consult eine externe Tabelle konsultieren
  • default Variable werden nur gesetzt wenn nicht schon vorbelegt
  • delete löscht Spalten.
  • data* SQL Statements an die Datenbank
  • extent 2 Ergebnistabellen erweitern
  • excel Ergebnistabelle im EXCEL(tm) Format speichern
  • header Tauscht den aktuellen Header aus
  • html Lädt, füllt und speichert eine html-Vorlage
  • integrate identische Spalten andere addieren
  • integrate2 identische Spalten andere addieren
  • integrate3 identische Spalten andere addieren
  • include an ein anderes Skript übergeben
  • join 2 Ergebnistabellen verbinden
  • list einzelnen Spalten werden Kommaseperiert aufgelistet
  • load lädt einzelne Spalten aus einer csv in eine Datenbank Tabelle.
  • nop* "No Operation" keine Aktion, zählt aber den Context um eins weiter
  • Oc OrientationConvert
  • repeat führt SQL Statements wiederholt aus.
  • replace fehlende Spalten komplettieren
  • return verlässt im Servermodus das Script an dieser Stelle.
  • save speichert das Ergebnis in der Datenbank ab
  • select SQL Statement
  • sort Spalten sortieren
  • spread macht aus dem Inhalt der 2. Spalte neue Spalten
  • spread2 Summiert über Spalte 2 die Spalte 3
  • store speichert das aktuelle Ergebnis in eine Datei.
  • story listet Felder mit identischem Anker nach rechts auf.
  • subtract aus 2 Ergebnistabellen die Differenzmenge bilden
  • table zwei Auswertungen zu einer Tabelle kombinieren

* kein '-' am Ende notwendig

automatisch ausgeführte OLAPs

  • OLAP-Abfragen können jedesmal m Rahmen des Tagesabschlusses/der Tagwache durchgeführt werden. Die OLAP-Skripte müssen sich im System-OLAP-Verzeichnis befinden (Grüner Ordner). Dazu muss der OLAP-Dateiname einem gewissen Muster entsprechen:
#
# Für eine Durchführung im Rahmen des Tagesabschlusses:
#
Tagesabschluss.*.OLAP.txt
# 
# Für eine Durchführung im Rahmen der Tagwache:
#
Tagwache.*.OLAP.txt
  • je nach der Systemeinstellung OLAPIstÖffentlich= werden die Skripte im zentralen OrgaMon-OLAP Verzeichnis gesucht (auf einem Netzwerk-Share), oder in einem lokalen Verzeichnis des aktuellen Benutzers (Dokumente/OrgaMon/OLAP). So kann gesteuert werden dass je nachdem "wer" den Tagesabschluss durchführt unterschiedliche Skripte zu Geltung kommen. Bei einem Umzug der Aufgabe "Tagesabschluss/Tagwache" auf einen anderen Host muss dann auch das lokale OLAP-Verzeichnis entsprechend kopiert werden.
  • Werden unter Linux OrgaMon-Dienste unter der wine Emulations-Schicht ausgeführt, so sind die OLAP-Skripte z.B. in:
~/Documents/OrgaMon/OLAP

# gleich bedeutend mit

~/.wine/drive_c/users/root/Meine Dokumente/OrgaMon/OLAP

System OLAPs

  • gewisse OLAP-Abfragen werden vom OrgaMon ihm Rahmen von Aktionen davor oder danach ausgeführt. Beispiel ist die Beleg-Buchung, danach wird System.Beleg.Aktion.OLAP.txt ausgeführt.

Beispiele

Auftrag.Sperre um ein Jahr verschieben

 update
   AUFTRAG
 set
   SPERRE_VON = SPERRE_VON + 365,
   SPERRE_BIS = SPERRE_BIS + 365
 where
   BAUSTELLE_R=355

Lastschriftvolumen

 //
 // Lastschriftvolumen im Jahr
 //
 
 select 
  DATUM, 
  (BETRAG * -1.0) as BETRAG 
 from 
  BUCH 
 where 
  (NAME='1200') and
  (BETRAG<0)
 order by
  DATUM 
 
 integrate 
 
 DATUM=Year(DATUM)
 -
 
 excel
 BETRAG=MONEY
 open
 -

Preisumstellung

 --
 --  O L A P  - Definitions Datei
 --
 --  (c) 2022 Andreas Filsinger
 --
 -- Dieses Skript führt zu einer schlagartigen Preis-Änderung. Nach Ausführung 
 -- dieses Skripts sollte der OrgaMon auf allen Arbeitsplätzen neu gestartet 
 -- werden.
 --
 -- EURO ist das zentrale Artikel-Preis-Feld des OrgaMon, es gibt Artikel-Preise,
 -- Ausgabeart-Preise und Preise in Preis-Tabellen. Somit kommt "EURO" in der 
 -- Datenbank 3 mal vor (ARTIKEL.EURO, PREIS.EURO, ARTIKEL_AA.EURO) Alle Preise
 -- können mit Hilfe des neuen Feldes EURP geändert werden.
 --
 -- EURP (ein alternatives Preis-Feld, für "EUR"o "P"reisänderung) hat im OrgaMon 
 -- keinerlei funktionale Bedeutung - und dieses Feld dient der reinen passiven 
 -- Datenhaltung. Bereitet man eine Preisumstellung vor, so kann man ins Feld 
 -- EURP in Ruhe die neuen Preise vorbereiten. Ähnlich einem Notiz-Eintrag. Dabei 
 -- füllt man nur die EURP-Inhalte bei denen sich bald eine Preisänderung ergibt. 
 -- Man gibt nicht den Änderungbetrag an, also z.B. +0,01 oder -13,3% sondern 
 -- direkt den neuen Preis. Man kann aber auch EURP durch Skripte füllen lassen 
 -- (z.B. die angesprochene prozentuale Preissenkung EURP = EURO * 0.867). 
 -- Will man anstelle 7,20 nunmehr 8,10 in zukünftigen Belegen anbieten, so trägt
 -- man in EURP (Preis2) 8,1 ein, es passiert zunächst nichts bis dieses Skript 
 -- ausgeführt wird.  
 --  
 -- Details zum Skript: 
 --
 -- * Die Werte von EURO werden mit dem Wert in EURP getauscht
 -- * Dadurch ist es möglich die Preisumstellung rückgängig zu machen 
 --   (Nochmaliges/Zweites Ausführen des Skriptes)
 -- * Ist KEIN Eintrag in EURP wird EURO einfach so gelassen wie es ist 
 --   (somit ist es keine Pflicht Preise, die sich nicht ändern einzutragen)
 -- * Mit diesem Skript kann man nur wenig Schaden anrichten, perfekt währe
 --   ein weiteres Skript das alle Werte aus EURP löscht sobald die Preis-
 --   umstellung abgeschlossen und vollständig getestet ist.
 --    
 
 update ARTIKEL set
  EURO=EURP,
  EURP=EURO
 where
  (EURP is not null)
 
 update ARTIKEL_AA set
  EURO=EURP,
  EURP=EURO
 where
  (EURP is not null)
 
 update PREIS set
  EURO=EURP,
  EURP=EURO
 where
  (EURP is not null)
 
 -

Links