Fortuna Entwickler Blog

Hier wird Ihnen geholfen

SQL Statements bei Entities monitoren

Da wir meistens mit Entities arbeiten in unseren .NET-Anwendungen, kriegen wir hierbei gar nicht so mit, welche Statements eigentlich an die DB abgeschickt werden. Hierfür gibt es von DevArt ein sehr gutes Tool: DBMonitor

Mit dem DBMonitor hat man die Möglichkeit den gesamten Datenbank-Traffic, der innerhalb einer Anwendung läuft, zu beobachten.

Der DBMonitor kann ohne zusätzliche Kosten hier heruntergeladen werden:

https://www.devart.com/dbmonitor/download.html

Wenn das Tool heruntergeladen wurde, einfach lokal auf dem Entwicklungsrechner installieren und starten.

Nun muss noch der Anwendung, die man monitoren möchte, gesagt werden, dass die Daten an den DBMonitor geschickt werden. Dazu ist es erforderlich, dass man zwei Assemblies der Anwendung hinzufügt:

  • Devart.Data
  • Devart.Data.Oracle
Anschließend muss eine Instanz von OracleMonitor innerhalb des Codes der Anwendung angelegt und aktiviert werden. Dies macht am besten relativ früh in der Anwendung, aber auf jeden Fall bevor die Statements an die DB abgeschickt werden. Mehr muss man nicht im Code verändern:

var monti = new OracleMonitor() { IsActive = true };

Wenn man nun seine Anwendung ausführt, wird sämtliche Datenbank-Traffic im DBMonitor angezeigt:



Ebenso kann man dadurch sehen, welche Statements zu Fehlern geführt haben:



Durch Anklicken dieser Zeile, wird im unteren Bereich des DBMonitor eine Detailansicht generiert, die Auskunft über das Statement, die Parameter und auch den Fehler selber liefert:







Aktualisierung von DevArt Oracle DLL

Nach einer Übergabe in die Produktonsumgebung wird die aktuelle Version von DevArt geladen und unter \\VCENTER2\Entwickler-Tools\Datenbank\devart abgelegt.
Alle Entwickler aktualisieren daraufhin ihre lokale Installation von DevArt
Zudem wird der Entwicklungsserver //WEBENTW3 und der Buildserver //BUILDSERVER aktualisiert.
Diese Version bleibt dann unverändert und wird nciht im laufenden Entwicklungsprozess erneut aktualisiert.

Zur Übergabe auf die Testumgebung wird DevArt auf dem Testserver //WEBTESTDMZ3 aktualisiert und die Übergabe durchgeführt.

Nach der Übergabe in die Produktionsumgebung wird wieder wie oben verfahren.

Ausnahme von diesem Vorgehen: Es tritt in der Entwicklung ein Fehler auf, welcher auf die aktuell verwendete DevArt-Version schliessen lässt und durch eine neuere DevArt-Version beseitigen lässt. In diesem Falle wird die neue Version von DevArt geladen und unter \\VCENTER2\Entwickler-Tools\Datenbank\devart abgelegt, lokal, auf der Entwicklungsumgebung und dem Buildserver installiert.


Auswertungen Tschechien

Jeden Monat benötigt Finanzen eine Reihe von Auswertungen. Diese gehen als Excel-Tabellen an Almut bzw. deren Vertretung.

BCAS schick üblicherweise zwischen dem 21. und 23. jeden Monats die Daten an den Service. Die Daten sind dann auf WEBDATA abgelegt. Alle relevanten Tabellen beginnen mit 'BCAS'.

Bevor die Auswertungen erstellt werden, muss der Status bei jedem Vertrag geprüft und ggf. aktualisiert werden. Dies passiert durch den Aufruf einer Stored Procedure:

EXEC BCAS_IO.BCAS_STATECHANGE();

Anschliessend können die Reports abgerufen werden. Das Ergebnis wird jeweils in einer Excel-Datei gespeichert; der Dateiname steht im Kommentar über dem jeweiligen Statement (MM_YYYY austauschen gegen Monat / Jahr)

-- Exportdatei: BCAS_POLICYOVERVIEW_MM_YYYY
SELECT * FROM BCAS_POLICYOVERVIEW ORDER BY UEBERMITTELT_AM, POLICYNUMBER;

-- Exportdatei: BCAS_PAYMENTOVERVIEW_MM_YYYY
SELECT * FROM BCAS_PAYMENTOVERVIEW ORDER BY UEBERMITTELT_AM, POLICYNUMBER;

-- Exportdatei: BCAS_PAYMENTOVERVIEW_BY_MONTH_MM_YYYY
SELECT * FROM BCAS_PAYMENTOVERVIEW_BY_MONTH;

-- Exportdatei: BCAS_POLICYOVERVIEW_MONTHLY_MM_YYYY
SELECT * FROM BCAS_POLICYOVERVIEW_MONTHLY bpm;

-- Exportdatei: Monatsübersicht_YYYY_MM

--Monatsübersicht: + Commission SK
SELECT
			TO_CHAR(bp.UEBERMITTELT_AM, 'YYYY-MM') AS Monat,
			SUM(bp."value") AS  "Gebuchte Beiträge",
      0 AS "Rücklaufleistung",
      0 AS "Todesfallleistung",
      SUM(ROUND(bp.IC_BCAS / 12, 0)) AS "Provision BCAS",
      SUM(ROUND(bp.IC_SK / 12, 0)) AS "Provision SK",
      SUM(ROUND((bp.IC_SK) / 12, 0)) +ROUND(SUM(bp."Diff"), 0) AS "Provision SK2",
--	ROUND(SUM(bp."Diff"), 0) AS "Diff",
			ROUND(SUM(bp.RE / 12), 0) AS "RV-Beiträge",
      0 AS "RV-Leistungen",
      ROUND(SUM(bp.RE) / 12 * 2.5 / 100, 0) AS "RV-Provisionen",
			ROUND(SUM(ROUND(bp.C, 0) / 12), 0) AS "Costs of Insurance"
	FROM BCAS_PAYMENTOVERVIEW bp
  GROUP BY TO_CHAR(bp.UEBERMITTELT_AM, 'YYYY-MM')--, BP1.STATE
  ORDER BY TO_CHAR(bp.UEBERMITTELT_AM, 'YYYY-MM')--, BP1.STATE
	;


Als weiteren Report gibt es eine Statusübersicht. Diese wird monatlich fortgeschrieben. Man führt also das nachfolgende SQL-Statement aus, kopiert den Report des Vormonats und fügt die Daten des neuen Monats hinzu:

-- Juli 2014
WITH SEL_WERTE AS (SELECT TO_DATE('31.07.2014', 'DD.MM.YYYY') AS SEL_DATE FROM DUAL)
SELECT  BS.ID AS STATEID, BS."name" AS STATE, COUNT(SEL.ID) AS ANZAHL, NVL(SUM(SEL2.PAYMENT), 0) AS PAYMENT, NVL(SUM(SEL.SUMASSURED), 0) AS SUMASSURED
  FROM  BCAS_STATE BS
  LEFT OUTER JOIN
  (
    SELECT BP.ID, BCAS_IO.BCAS_IP_STATE_BY_DATE(BI.ID, (SELECT SEL_DATE FROM SEL_WERTE)) AS STATEID, BI.SUMASSURED
      FROM  BCAS_TRANSFER BT
      INNER JOIN BCAS_POLICY BP ON BT.ID = BP.TRANSFERID
      INNER JOIN BCAS_INSURANCEPRODUCT BI ON BP.ID = BI.POLICYID
      WHERE BT.CREATINGDATE <= (SELECT SEL_DATE FROM SEL_WERTE)
  ) SEL ON BS.ID = SEL.STATEID
  LEFT OUTER JOIN
  (
    SELECT BP.POLICYID, SUM(BP."value") AS PAYMENT
      FROM BCAS_PAYMENT BP
      WHERE BP.BOOKINGDATE <= (SELECT SEL_DATE FROM SEL_WERTE)
      GROUP BY BP.POLICYID
  ) SEL2 ON SEL.ID = SEL2.POLICYID
GROUP BY BS.ID, BS."name"
ORDER BY BS.ID;

Wichtig ist es natürlich, den Monat bzw. das Datum in Zeile 1 anzupassen. Es ist immer das Datem des letzten Tages des Monats einzutragen.

Auswertung Tschechien.sql (12,46 kb)

Datenübernahme MV: Riester

Im TFS unter Fortuna/Tools/Fortuna.MuenchenerVerein/ExcelTrasition gibt es eine Solution Fortuna.MuenchenerVerein.ExcelTrasition. Hier gibt es Klassen zu Übernahme der Excel-Daten in eine Oracle Datenbank.

Die Excel-Dateien von MV sind im Projekt enthalten. Gibt es neue Daten, müssen diese ausgetauscht werden.

Ebenso enthalten ist ein Script zur Erzeugung der Datenbanktabellen.

Um die Daten zu Übernehmen gibt es eine ganze Reihe von Tests (zu sehen über den Testexplorer. Diese Test können/müssen einzeln oder en bloc ausgeführt werden. Die Ausführungszeit liegt bei ca. 30 Minuten (Stand September 2013)

 

Datenübername MV: OASIS/LIFE/COR_ADMIN

Im Rahmen des Projektes MV sind diverse Versicherungsdaten aus MV Systemen in myLife System zu übernehmen.

Tätigkeiten zur Übernahme von Personendaten:

OASIS, LIFE und COR_ADMIN werden benötigt. Das eigentliche 'Zusammentragen' der Daten geschieht auf Mig_MVR

Mig_MVR benötigt Zugriff auf COR_ADMIN, LIFE und OASIS:

-- Ausführen auf COR_ADMIN
select  'grant select on COR_ADMIN.'||object_name||' to Mig_MVR with Grant Option;'
from    all_objects 
where   object_type in ('VIEW','TABLE')
and     object_name not like 'BIN$%==$0'
and owner = 'COR_ADMIN'

UNION

select  'grant execute on COR_ADMIN.'||object_name||' to Mig_MVR with Grant Option;'
from    all_objects 
where   owner = 'COR_ADMIN'
and     object_name not like 'BIN$%==$0'
and object_type in ('FUNCTION', 'PROCEDURE', 'PACKAGE');


-- Ausführen auf OASIS
select  'grant select on OASIS.'||object_name||' to Mig_MVR with Grant Option;'
from    all_objects 
where   object_type in ('VIEW','TABLE')
and     object_name not like 'BIN$%==$0'
and owner = 'OASIS'

UNION

select  'grant execute on OASIS.'||object_name||' to Mig_MVR with Grant Option;'
from    all_objects 
where   owner = 'OASIS'
and     object_name not like 'BIN$%==$0'
and object_type in ('FUNCTION', 'PROCEDURE', 'PACKAGE');


-- Ausführen auf LIFE
select  'grant select on LIFE.'||object_name||' to Mig_MVR with Grant Option;'
from    all_objects 
where   object_type in ('VIEW','TABLE')
and     object_name not like 'BIN$%==$0'
and owner = 'LIFE'

UNION

select  'grant execute on LIFE.'||object_name||' to Mig_MVR with Grant Option;'
from    all_objects 
where   owner = 'LIFE'
and     object_name not like 'BIN$%==$0'
and object_type in ('FUNCTION', 'PROCEDURE', 'PACKAGE');

Die Ausgaben der Statements müssen wiederum jeweils auf den beschriebenen Servern ausgeführt werden.

Zusätzlich braucht Mig_MVR noch weitere Berechtigungen:

grant select on BANK to Mig_MVR with Grant Option;

Auf Mig_MVR werden anschliessend diverse Views angelegt (MYLIFE_Mig_MVR_VIEWS.sql (14,39 kb)).

 

Oracle als Linked Server in SQL Server eintragen

Um aus einem SQL Server heraus auf eine Oracle Datenbank zuzugreifen benötigt man auf dem SQL Server Rechner ein paar Einstellungen / Programme:

1: \\VCENTER2\Entwickler-Tools\Datenbank\Oracle\ODAC1120320_x64.zip entpacken und setup.exe ausführen

(bei 32bit Systemen verwendet man ODAC1120320Xcopy_32bit.zip im gleichen Verzeichnis)

2: Durch die Installation einfach durchklicken und Standard installieren

3: Im SQL Server Manager gibt es nun unter Serverobjekte -> Verbindungsserver -> Anbieter einen Eintrag OraOLEDB.Oracle. Bei diesem Eintrag in den Eigenschaften muss die Option In Process zulassen gesetzt werden.

4: tsnames.ora und sqlnet.ora anpassen. Beispiele:

sqlnet.ora:

# SQLNET.ORA Network Configuration File: C:\ora92\network\admin\sqlnet.ora
# Generated by Oracle configuration tools.
NAMES.DEFAULT_DOMAIN = gutingia.local
SQLNET.AUTHENTICATION_SERVICES= (NONE)
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME)

tsnames.ora:

DBWEB1.gutingia.local =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = DBWEB1)(PORT = 1521)))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = DBWEB1)))

DBWEBTESTDMZ1.gutingia.local =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = DBWEBTESTDMZ1)(PORT = 1521)))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = DBWEBTESTDMZ1)))

DBWEBENTW3.gutingia.local =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = DBWEBENTW3)(PORT = 1521)))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = DBWEBENTW3)))

DBPROD1.gutingia.local =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = DBPROD1)(PORT = 1521)))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = DBPROD1)))

TWDB.gutingia.local =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = TWDB)(PORT = 1521)))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = ventaDB)))

5: einen Linked Server erstellen und Zugriff testen. Beispiel:

EXEC master.dbo.sp_addlinkedserver @server = N'ENTWWEB01', @srvproduct=N'OraOLEDB', @provider=N'OraOLEDB.Oracle', @datasrc=N'DBWEBENTW3'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ENTWWEB01',@useself=N'False',@locallogin=NULL,@rmtuser=N'WEBDATA',@rmtpassword='######'

EXEC master.dbo.sp_addlinkedserver @server = N'ENTWWEB02', @srvproduct=N'OraOLEDB', @provider=N'OraOLEDB.Oracle', @datasrc=N'DBWEBENTW3'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ENTWWEB02',@useself=N'False',@locallogin=NULL,@rmtuser=N'WEBFRW',@rmtpassword='######'

EXEC master.dbo.sp_addlinkedserver @server = N'ENTWWEB03', @srvproduct=N'OraOLEDB', @provider=N'OraOLEDB.Oracle', @datasrc=N'DBWEBENTW3'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ENTWWEB03',@useself=N'False',@locallogin=NULL,@rmtuser=N'WEBSERVICES',@rmtpassword='######'
GO


6: Erledigt. Jetzt ist z.B. Sowas möglich:

SELECT * 
    FROM ENTWWEB03..WEBSERVICES.ASPNET_USERS au
    INNER JOIN ENTWWEB03..WEBSERVICES.ASPNET_USER_EXTENSIONS aue ON au.USERID = aue.USERID
    INNER JOIN PRODDB01..GUTINGIA.P p ON aue.PNR = p.p_NR AND p.HIST_KZ = 2;

Also JOINs über verschiedene Users hinweg. Ohne Synonyme und Ähnliches.

Datenimport Münchener Verein

Aktuell werden zwei Excel-Tabellen zur Verfügung gestellt:

  • Attributkatalog.xslx enthält eine Beschreibung zu allen Attributen/Feldern für die Importtabellen
  • Daten.xslx enthält mit insgesamt 8 Sheets die eigentlichen Daten

Die Solution für den Datenimport findet man unter $/Fortuna/Tools/Fortuna.MuenchenerVerein. In der Solution sind auch die beiden o.a. Excel-Sheets hinzugefügt.

Der eigentliche Import läuft ohne eigenes interface/ohne Applikation, sondern man fürht in Visual Studio schlicht die in der Solution enthaltenen Tests durch. Diese holen sich je Tabelle aus dem Attributkatalog.xslx die relevanten Felder, suchen je Feld und Satz die zugehörigen Daten und Speichern diese - ggf. nach Tranformation - in die Datenbank ab.

 

Übersicht CZ Case

Für den Datenaustausch zwischen BCAS (Tschechien) und myLife wurde die DataExchangeServices erstellt. Die Services werden von BCAS aufgerufen, Daten übermittelt und ggf. Daten abgefragt.

Die Quellen zu den Services findet man im TFS unter $/Fortuna/Services/DataExchangeServices

Die Datenbanktabellen sind unter WEBDATA, sowohl in der Entwicklungsumgebung, der Testumgebung als auch der Produktivumgebung verfügbar. Innner halb des Projektes im TFS gibt es ein SQL-Script, in welches man Änderungen an den Tabellen einarbeiten kann, bei Ausführung werden dann bisherige Daten gespeichert, die geänderten Tabellen geschrieben und anschließend wieder ggf. mit des alten Daten gefüllt.

Aufrufbar sind die Services unter
http://test.mylife-leben.de/Services/DataExchangeServices/BCAS.asmx (Test)
https://fortuna.mylife-leben.de/services/dataexchangeservices/bcas.asmx (Produktiv)

Produktiv genutzt werden Stand 1.9. die Services für policies und payments. Hier weden von BCAS nun monatlich, immer um den 20. eines Monats, Daten geliefert.

Sichern und Wiederherstellen der IWM Daten

Nachdem man die IWM Software auf einem neuen System installiert hat, will man üblicherweise auch noch alle Daten und Einstellungen vom bisherigen System übernehmen. Hier wird die Vorgehensweise zum Sichern und zurückspielen der Datenbank beschrieben.

Tätigkeiten auf dem alten System:

Start -> IWM FinanzOffice -> Anmelden mit Administratorenrechten

Datenverwaltung -> Daten sichern

In den Details findet man die Information, wohin die Sicherung durchgeführt wurde. Das ZIP-Archiv kopiert man auf dem neunen Server