14.09.2009
10:14

Sie haben die Wahl: CASE!

Rodney Krick, Senior Consultant und Dozent bei aformatik

von Rodney Krick
Einer unserer Kunden hat eine Anwendung gekauft, die Nachrichten mit Behörden austauscht. Der Kunde sendet den Behörden eine Menge von sogenannten Verfahren und bekommen eine Rückmeldung mit berechneten Werten (Bemessungsgrundlagen), die maßgeblich für die Weiterverarbeitung im System sind.
Manchmal kann die Anwendung nicht warten bis eine Antwort von den Behörden zurückkommt und muss die Werte selber berechnen, damit der Prozess weiterläuft. In diesen Situationen wird ein "simulierter Wert" verwendet, der in der Regel mit dem erwarteten Wert übereinstimmt.
Um diese Daten bzw. Konstellation zu modellieren, haben die Architekten der gekauften Applikation zwei Tabellen definiert:

OWN_CALC mit den "simulierten" Werten
und
GOV_CALC mit den von den Behörden gelieferten Bemessungsgrundlagen.

Beide Tabellen haben die gleiche Struktur und, unter anderem, folgende Attribute:
- einen Prozentsatz und
- einen Wert (die Bemessungsgrundlage).

Für diejenigen Prozesse, bei denen die Applikation noch keine Antwort von den Behörden bekommen hat, findet man keinen Eintrag in der Tabelle GOV_CALC. Wir brauchten aber eine View um die Werte in unseren eigenen Applikation zu zeigen. Und wir haben sie mit Hilfe von CASE implementiert.

Die xxx_CALC Tabellen beinhalten den gesamten Wert eines Prozesses. Es gibt aber auch eine Prozeß-Tabelle (PROC), in der die Anzahl der gemeldete Gegenstände gespeichert ist. Wir berechnen den Einheitswert indem wir den vorhandenen (!) gesamten Wert durch die Anzahl teilen.

Die PROC Tabelle ist unsere "parent table" und die anderen zwei (OWN_CALC und GOV_CALC) referenzieren sie (RI). Und so sieht unser SELECT aus, mit dem wir die Daten lesen:

CREATE VIEW RESPROC AS
SELECT ...
,
(CASE
WHEN GOV_VALUE IS NULL THEN OWN_VALUE
ELSE GOV_VALUE
END / decimal(PROC_QTY, 31, 6)
) AS RESPROC_VALUE
,
CASE
WHEN GOV_PERRAT IS NULL THEN OWN_PERRAT
ELSE GOV_PERRAT
END AS RESPROC_PERRAT
, ...
FROM PROC
INNER JOIN OWN_CALC
ON PROC_ID = OWN_PROC_ID
LEFT OUTER JOIN GOV_CALC
ON PROC_ID = GOV_PROC_ID
...
;

Der erste JOIN ist ein INNER JOIN, weil wir die selbst berechneten Werte immer zur Verfügung haben. Der zweite ist ein LEFT OUTER JOIN, weil wir manchmal noch keine Nachricht von den Behörden bekommen haben. Gibt es kein Match mit der GOV_CALC Tabelle, dann sind alle Attibute (Spalten) dieser Tabelle im SELECT bzw. in der Ergebnismenge (Result Set) gleich "Null" wegen des LEFT OUTER JOIN. Und das benutzen wir um die Entscheidung zu treffen.

Wir evaluieren die "linke Seite" der Berechnung dynamisch zur Laufzeit, und verwenden entweder den GOV_VALUE oder den OWN_VALUE für die Berechnung. Und das Gleiche machen wir auch mit dem Prozentsatz.

Danke fürs Lesen und Vorbeischauen! Ich hoffe, wir sehen uns hier demnächst wieder.

Rodney Krick

  •  
  • Trackbacks
  •  
articles an
10.05.2010
articles an

I found your blog via Google while searching for free settlement letters to creditors and your post regarding news looks very interesting to me. I have a few super websites of my own and I must say that your site is really top notch. Keep up the great wor...

  •  
  • 0 Kommentare
  •  

Mein Kommentar

Zurück