Tools für DAX und Tabular BISM Entwicklung 27.01.2015

Viktor Ewert
Viktor Ewert, Principal BI eXpert
Wer öfter in der DAX und Tabular BISM-Welt unterwegs ist, für den könnte folgender Beitrag auf www.sqlbi.com interessant sein: http://sql.bi/daxtools

Aktuell ist es leider noch so, dass die Unterstützung für DAX und BISM Entwicklung im Visual Studio recht überschaubar ist. Daher können diese Tools durchaus sinnvoll sein.
Share |

WCF Proxy aus alternativen Konfigurationsdateien initialisieren 20.01.2015

Alexander Kabisch
Alexander Kabisch, Principal eXpert

Manchmal ist es nötig die WCF Proxy-Einstellungen aus einer anderen Konfigurationsdateien als der app.config zu laden. Bisher war dies recht schwierig und mit viel eigenem Code verbunden.

Wenn man beispielsweise ein Plugin oder eine COM-Bibliothek für ältere Anwendungen bereitstellt und dort einen WCF Proxy nutzen will, kann man die app.config gleich vergessen. Beim Starten der AppDomain wird der Konfigurationspfad aus Dateinamen der laufenden Anwendung (.exe) + „.config“ belegt. Man hatte bisher folgende Möglichkeiten:

Mit .Net 4.5 kann man nun den Pfad der Konfiguration einfach einer Factory übergeben!

   1: Configuration config = ConfigurationManager.OpenExeConfiguration("...");  
   2: ConfigurationChannelFactory<IMyProxy> factory = new ConfigurationChannelFactory<IMyProxy>("endpointName", config, null);
   3:  
   4: //Eigene Anpassungen sind auch noch möglich!
   5: //factory.Endpoint.Behaviors.Add(myBehavior);
   6:  
   7: IMyProxy proxy = factory.CreateChannel();

PS: In vielen Beispielen wird als dritter Parameter beim Konstruktor der Factory eine neue Endpoint URL mitgegeben. Einfach leer lassen und er belegt diese mit der aus der Konfiguration.

Share |

Deutsche SQL Server Konferenz 2015 - SDX ist Silberpartner 19.01.2015

Andreas Franz
Andreas Franz, Principal eXpert

Am 04. und 05. Februar 2015 veranstaltet Microsoft gemeinsam mit der PASS SQL Server Community die zweite Deutsche SQL Server Konferenz in Darmstadt.

An zwei Tagen werden Themen rund um den Microsoft SQL Server in den vier Kernbereichen Administration, Development, Business Intelligence und Information Workers vorgestellt und diskutiert.

Unter dem Thema „Professional BI mit Touch! One Application - Multiple Devices“ haben wir uns intensiv mit den Herausforderungen beschäftigt:

  • Hosting: On premise vs. Cloud
  • Software: Standard vs. Individual
  • Application: Native vs. Crossplattform
  • Bedienung: Touch vs. Click
  • Formfaktoren: Small vs. Big
  • Technologien: Dev vs. BI
  • Impact: Enterprise Ready vs. Lean
  • Konnektivität: Online vs. Offline
  • Methodik: Wasserfall vs. Agil

Auf Basis unseres umfassenden Showcases „Showtime“ zeigen wir Ihnen auf der SQL Konferenz Lösungsszenarien für die genannten Herausforderungen.

Andreas_Flurfunk

Wir freuen uns auf eine spannende Veranstaltung und viele interessante Gespräch auf dem SDX Stand rund um die Themen Architektur, User Experience, Standards und Abstraktion.

Mehr Informationen zur Veranstaltung gibt es >hier<.

Share |

LINQ Coding Guidelines #5–Komplexe Lambda-Funktionen auslagern 16.01.2015

Alexander Jung
Alexander Jung, Chief eXpert

Ich sehe oft LINQ-Ausdrücke, in denen versucht wird, alles auf einmal zu machen. Die letzten Empfehlungen hatten bereits zum Inhalt das Mapping der Daten in Hilfsmethoden auszulagern; damit muss aber nicht Schluss sein.

Empfehlung: Komplexe Lambda-Funktionen sollten aus LINQ-Ausdrücken ausgelagert werden.

 

Beginnen wir bei unserem Lieblingsbeispiel für pathologische LINQ-Exzesse: Dem RayTracer.

Der LINQ-Ausdruck hat 61 LOC, die ich zumindest nicht durchschaue. 49 Zeilen davon (ab “let computeTraceRay = …“) dienen aber nur der Definition eines Lambda-Ausdrucks, der dann in der folgenden Zeile (“let traceRay = Y(computeTraceRay)”) verwendet wird.

Definiert man diesen vor der LINQ-Abfrage, dann reduziert sich diese auf 12 LOC. Greift man dem Code noch durch ein paar Operatoren für Vector unter die Arme, dann wird das Ganze zumindest lesbar:

   1: var pixelsQuery =
   2:     from y in Enumerable.Range(0, screenHeight)
   3:     let recenterY = -(y - (screenHeight / 2.0)) / (2.0 * screenHeight)
   4:     select from x in Enumerable.Range(0, screenWidth)
   5:            let recenterX = (x - (screenWidth / 2.0)) / (2.0 * screenWidth)
   6:            let point = Vector.Norm(scene.Camera.Forward + (recenterX * scene.Camera.Right) + (recenterY * scene.Camera.Up))
   7:            let ray = new Ray() { Start = scene.Camera.Pos, Dir = point }
   8:            let traceRay = Y(computeTraceRay)
   9:            select new { X = x, Y = y, Color = traceRay(new TraceRayArgs(ray, scene, 0)) };

Und das Ergebnis stimmt immer noch:

image

Nun ist ein RayTracer sicher nicht der übliche Anwendungsfall für LINQ. Aber auch in produktivem Code finden sich genügend Beispiele:

   1: result = _context.AllocationSet.Where(a => a.Employee.UserName == userName && a.AllocatedFrom >= timestart && a.AllocatedTo <= timeEnd);

Auslagern kann sich in diesem Falle auf die Auslagerung in eine separate Operation beziehen…

   1: result = _context.AllocationSet
   2:     .Where(a => a.Employee.UserName == userName)
   3:     .Where(a => a.AllocatedFrom >= timestart && a.AllocatedTo <= timeEnd);
…wodurch die Bedingungen zumindest inhaltlich getrennt werden.

Insbesondere Bedingungen, die von mehreren Parametern abhängig sind gewinnen an Lesbarkeit wenn sie in Hilfsmethoden ausgelagert werden:

   1: result = _context.AllocationSet
   2:     .Where(a => a.Employee.UserName == userName)
   3:     .Where(a => a.IsWithinRange(timestart, timeEnd));

Das ist lesbarer und weniger fehleranfällig. Gefahr ist aber, dass das den Provider unterläuft, weil sich dieser Funktionsaufruf natürlich nicht in ein SQL-Statement übersetzen lässt. Aber auch das lässt sich mit einer entsprechenden Extension-Methode die mit Expressions arbeitet in den Griff bekommen:

   1: result = _context.AllocationSet
   2:     .ForUser(userName)
   3:     .AllocatedInRange(timestart, timeEnd);

Man kann es natürlich auch übertreiben und jeden Parameter in jeder Abfrage in eine dedizierte Methode packen. Das ist sicher nicht im Sinne des Erfinders. Aber für sehr häufige oder komplexe Parameter lohnt sich das durchaus.

Share |

SDX TC: One App, Multiple Devices - Architektur ist entscheidend! (27. Jan in MUC u. 29. Jan in FFM) 14.01.2015

Simone Franz
Simone Franz, Marketing Manager

Herzlich lade ich Sie zum Technical Council "One App, Multiple Devices –
Architektur ist entscheidend!" ein.

Termin: Dienstag, der 27.01.2015 ab 17:00 Uhr in München
und Donnerstag, den 29.01.2015 ab 17:00 Uhr in Frankfurt

Zielgruppe: Entwickler, Architekten, Projektleiter 
Dresscode: Business Casual
Agenda:

17:00 Uhr: Begrüßungskaffee
17:30-19:30 Uhr:

One App, Multiple Devices – Architektur ist entscheidend!

- Mobile Enterprise Apps: Herausforderungen und Fallstricke 
- Zukunftssichere Architekturen mit Fokus Frontend
- Cordova/HTML5, Xamarin und Co.
- Optionen, Entscheidungskriterien und Empfehlungen

19:30 Uhr: Fingerfood

 TC-Einladungen_Till_Icons2

Immer mehr Unternehmen entscheiden sich, ihre Enterprise-Anwendungen für Mitarbeiter und/oder Kunden auch auf mobilen Geräten bereit zu stellen. Hierbei sind neben Plattformunabhängigkeit (Windows, iOS und Android) und der Unterstützung multipler Formfaktoren (Phone, Tablet und Desktop) zusätzlich auch Aspekte wie z. B. komplexe Clientlogik, Security, On-/Offlinefähigkeit sowie die transaktionale Integration von Backend-Systemen zu berücksichtigen.

Anhand konkreter Business-Szenarien erfahren Sie die Wichtigkeit einer soliden Architektur mit Fokus auf dem Frontend. Zentrales Ziel ist hierbei die Erreichung von Wirtschaftlichkeit, Investitionssicherheit, Wartbarkeit und Flexibilität hinsichtlich multipler Plattformen und Formfaktoren.

Mithilfe eines Kriterienkatalogs beschreiben wir, welche Handlungsoptionen sich Ihnen bei der Entwicklung zukunftssicherer, mobiler Enterprise-Apps bieten.
Dabei gehen wir spezifisch auf die Client-Technologien Cordova, Xamarin und native Entwicklung ein und erläutern, wie sich die vorgestellten Architekturkonzepte in diesen Technologien sinnvoll abbilden lassen.

Beim abschließenden Abendessen können Sie sich dann in lockerer Atmosphäre mit den Teilnehmern und den SDX eXperts zu Inhalten und Einsatzszenarien austauschen.

Auf Wiedersehen im SDX Büro am 27. Januar 2015 in München und am 29. Januar 2015 in Frankfurt. Die detaillierte Einladung sowie die Teilnahmebedingungen für Frankfurt und München erhalten Sie >hier< und >hier<.

Share |

SSIS Unit Testing mit SSIS 2012/2014 13.01.2015

Viktor Ewert
Viktor Ewert, Principal BI eXpert

Um Unittests für SSIS-Pakete zu implementieren, gibt es aktuell nicht viele sinnvolle Möglichkeiten. Leider bietet Microsoft keine Standardmöglichkeiten im VisualStudio bzw. SSIS. Man ist auf 3rd Party Anbieter angewiesen die Tools dafür bereitstellen. Auf einige dieser Tools möchte ich hier eingehen.

 

 

Historie/manuelle Test

Bevor wir auf die verschiedenen Tools kommen, ein kurzer Rückblick wo wir bezüglich SSIS Unittesting herkommen. Da es, wie gesagt, keine out-of-the-box -Möglichkeiten gibt, behelfen sich viele Projekte damit ganz simple “Unittests” mit den SSIS Bordmitteln zu erstellen. Unittests kann man diese nicht wirklich nennen, da immer ganze Pakete ausgeführt werden. Je nachdem wie groß so ein Paket ist, wird das schnell unübersichtlich. Dies ist sowohl von der Implementierung als auch von der Handhabung umfangreich und kompliziert. Als Beispiel wird ein Testpaket definiert, das das Setup, die Ausführung des eigentlichen Pakets, die Assertion und das Teardown übernimmt. Dabei treten diverse Probleme auf:

  • Es wird immer das ganze zu testende Paket ausgeführt, man kann nicht einzelne Teile (Units) ausführen, was für richtige Unittests  eigentlich unbrauchbar ist
  • Man muss dafür sorgen, dass die Parameter, Variablen und Connections für den Unittest korrekt gesetzt werden. Oft behilft man sich damit, dass die Parameter und Connection fest für die Unittest-Umgebung eingetragen sind.
  • Die Nachvollziehbarkeit bei Fehlern im Test ist mühsam, da man im Fehlerfall nicht weiß ob es am Test oder am zu testenden Paket gelegen hat.
  • usw.

Dabei sei gesagt, dass diese manuellen Tests besser sind als gar keine Test. Komfortabel und effizient ist aber etwas anderes.

Custom Unittest Frameworks

Als Alternative zu den manuellen Tests, entwickeln einige Projekte/Kunden eigene Unittest Frameworks, die dann oft auch schon ansehnliche Ergebnisse liefern. Ein komplettes Unittest-Framework zu entwickeln, was projektübergreifend verwendet werden kann, kostet aber viel Zeit und Aufwand. Meist decken diese auch nicht alle Anforderungen an Unittests ab.

3rd Party Tools

Es gibt einige 3rd party Tool die sich dem Thema SSIS Unittesting angenommen haben und daraus sind einige brauchbare Ansätze entstanden.

SSISTester
http://www.bytesoftwo.com/

Eines der genannten Tools ist der SSISTester. Es ist ein Framework von bytesoftwo was sowohl Unittest als auch Integrationstest für SSIS-Pakete ermöglicht. SSISTester integriert sich hervorragend in Visual Studio 2008/2010/2012/2013 und kann für SSIS Projekt in SQL 2008, SQL 2012 und SQL 2014 eingesetzt werden.
Unittest können auf Task Ebene im Control-Fluss definiert werden. Die Prüfung von Ergebnissen kann jedoch zwischen jeder Komponente im Data-Flow-Taks gesetzt werden. Somit hat man eine extrem granulare Möglichkeit Pakete zu testen. 
Es ist ebenfalls möglich Datenquellen zu mocken, um die Logik ohne der Abhängigkeit zu Datenbanken/Files usw. zu testen. Der Test von Constraints im Control-Flow ist ebenfalls möglich. Die zu testenden Pakete müssen für die Ausführung der Unittest nicht verändert oder angepasst werden und enthalten demzufolge keinen Testcode oder sonstige Modifikationen für die Unittests.

Folgendes Snippet zeigt den Beispielhaften Aufbau eines einfachen Unittest mit dem SSISTester:

   1: using System.Collections.ObjectModel;
   2: using Microsoft.VisualStudio.TestTools.UnitTesting;
   3: using SSIS.Test;
   4: using SSIS.Test.Dts;
   5: using SSIS.Test.Metadata;
   6: using System.IO;
   7:  
   8: namespace SDX.PB.BI.ETL.Unittest.SSISTester
   9: {
  10:     [TestClass]
  11:     [UnitTest("SDX.PB.BI.ETL", "DimUser.dtsx", ExecutableName = @"\[DimUser]\[SEQC_Info]\[DFT_Info_User_Load]")]
  12:     [DataTap(@"\[DimUser]\[SEQC_Info]\[DFT_Info_User_Load]\[CSPL_UserFound]", @"\[DimUser]\[SEQC_Info]\[DFT_Info_User_Load]\[OLE_DST_InfoUser_Load]")]
  13:     class DimUserLoadDataTaps : BaseUnitTest
  14:     {
  15:         protected override void Setup(SetupContext context)
  16:         {
  17:             context.Package.GetConnection("PrivatbilanzBI").SetConnectionString(Constants.PrivatbilanzBIDbConnectionString);
  18:             context.Package.GetConnection("PrivatbilanzDev").SetConnectionString(Constants.PrivatbilanzDevDbConnectionString);
  19:             context.Package.GetConnection("PrivatbilanzBI").SetConnectionString(Constants.SsisDbConnectionString);
  20:  
  21:             // truncate destination table
  22:             context.DataAccess.OpenConnection(Constants.PrivatbilanzBIDbConnectionString);
  23:             context.DataAccess.ExecuteNonQuery("truncate table [info].[User]");
  24:  
  25:             string query = @"  INSERT INTO [info].[User] (UserID, UserName, LaufendeBilanzID, Vorname, Nachname, Geburtstag, Geschlecht, Einkommen, Verheiratet, Kinder) 
  26:                                     VALUES (-1, 'TestUser', -1, 'Test', 'User', '1999-01-01', 'm' ,100000, 1, 2)";
  27:  
  28:             context.DataAccess.ExecuteNonQuery(query);
  29:  
  30:  
  31:             // truncate source table dbo.UpdatedUser 
  32:             context.DataAccess.ExecuteNonQuery("truncate table [info].[UpdatedUsers]");
  33:  
  34:             // truncate source table dbo.User and fill with test data
  35:             context.DataAccess.ExecuteNonQuery("truncate table [stage].[User]");
  36:  
  37:             query = @"  INSERT INTO [stage].[User] (ID, UserName, LaufendeBilanzID, Vorname, Nachname, Geburtstag, Geschlecht, Einkommen, Verheiratet, Kinder) 
  38:                                     VALUES (2, 'NeuerUser', -1, 'Test', 'NeuerName', '1999-01-01', 'm' ,100000, 1, 2)";
  39:  
  40:             context.DataAccess.ExecuteNonQuery(query);
  41:             context.DataAccess.CloseConnection();
  42:         }
  43:  
  44:         protected override void Verify(VerificationContext context)
  45:         {
  46:             Assert.AreEqual(true, context.Package.IsExecutionSuccess);
  47:             Assert.AreEqual(true, context.ActiveExecutable.IsExecutionSuccess);
  48:  
  49:             context.DataAccess.OpenConnection(Constants.PrivatbilanzBIDbConnectionString);
  50:             var rowCount = (int)context.DataAccess.ExecuteScalar(@"select count(*) from [info].[User]");
  51:             context.DataAccess.CloseConnection();
  52:  
  53:             Assert.AreEqual(2, rowCount);
  54:  
  55:             ReadOnlyCollection<DataTap> dataTaps = context.DataTaps;
  56:  
  57:             DataTap dataTap = dataTaps[0];
  58:             foreach (DataTapSnapshot snapshot in dataTap.Snapshots)
  59:             {
  60:                 string data = snapshot.LoadData();
  61:  
  62:                 Assert.IsFalse(string.IsNullOrEmpty(data));
  63:             }
  64:         }
  65:  
  66:         protected override void Teardown(TeardownContext context)
  67:         {
  68:             context.DataAccess.OpenConnection(Constants.PrivatbilanzBIDbConnectionString);
  69:             context.DataAccess.ExecuteNonQuery("truncate table [info].[User]");
  70:             context.DataAccess.CloseConnection();
  71:         }
  72:     }
  73: }

Die Tests können mit einer eigenen Test GUI, mit dem VS Testexplorer oder auch mit dem Resharper ausgeführt und visualisiert werden.

Visualisierung der Testergebnisse mit VS Testexplorer:

image

Visualisierung der Testergebnisse mit der TEST GUI:

image

SSISUnit/Pragmatic Workbench BIxPress (SSISUnit)

https://ssisunit.codeplex.com/

http://pragmaticworks.com/Products/BI-xPress/Features/SSISUnitTesting.aspx

SSISUnit von Pragmatic Work verfolgt einen etwas anderen Ansatz. Hierbei werden die Unittests über eine GUI erstellt um möglichst wenig Code schreiben zu müssen. Die Definition der Unittest wird als XML abgelegt.

Es gibt zum einen die kostenlose Codeplex Variante und dann die Luxus-Variante als Teil von BIxPress oder der Pragmatic Workbench. Beide Varianten setzen auf die SSISUnit-Engine auf. Die Workbench kann über Unittest hinaus noch sehr viel mehr. Darauf gehe ich hier aber nicht weiter ein.

Folgendes Beispiel zeigt die Konfiguration und das Ergebnis eines Unittest in der SSISUnit-GUI.

imageimage

Das Vorgehen in der Pragmatic Workbench ist ähnlich der Codeplex Variante.

image

image

Fazit: Die genannten Tools bieten tolle Möglichkeiten echte “Unittest” zu implementieren, wobei der SSISTester noch einen Schritt weiter geht und Assertions zwischen allen Komponenten im Dataflow-Task ermöglicht. Je nachdem welche BI-Entwickler in einem Projekt eingesetzt werden, kann eine dieser Varianten eingesetzt werden. Besonders die Integrationsmöglichkeiten in Builds, Autotest oder Check-In Vorgänge bringen viel Qualitäspotential für eine BI-Solution mit.

Share |

Konkret helfen – Zukunft spenden 05.01.2015

Simone Franz
Simone Franz, Marketing Manager

Konkret helfen – Zukunft spenden
Neues Jugendzentrum für junge Erwachsene in Nairobi

Bereits in 2008 haben wir für Cargo Human Care gespendet.

Damals unterstützten wir den Bau des Waisenheims „Mothers Mercy Home“. Ein gemauertes Haus mit Platz für ca. 128 Kinder, für die auch die Schul- und Berufsausbildungen gesichert ist. Und nicht nur mit den EUROS konnten wir Kinderaugen zum lachen bringen: „The balls have added more joy and laughter to the children at the Mothers’ Mercy Home”, schrieb uns  Paula J

2008_Nairobi_Ball4
In diesem Jahr haben die ersten 18 Kinder das „Mothers’ Mercy Home“ mit einem High-School-Abschluss verlassen. Die Betreuung wäre nun abgeschlossen. Cargo Human Care hat aber festgestellt, dass der Schritt ins richtige Leben sehr schwer ist. Viele der Waisenkinder müssten zurück zu ihren entfernten Verwandten, die weder Platz noch Geld hätten, sie zu versorgen.

Deshalb will Cargo Human Care ein neues Haus in Nairobi bauen, um den jungen Erwachsenen übergangsweise eine Bleibe zu geben, etwa um die Zeit zwischen Abschlussprüfung und Zeugnisvergabe zu überbrücken. Denn erst mit dem Abschluss können die jungen Erwachsenen einen Job finden oder eine Ausbildung beginnen. Das Jugendzentrum soll ein Ort des Lernens werden. Die Entwürfe sehen mehrere Schulungsräume vor. Die Seminare sollen auch anderen Jugendlichen offenstehen, um dort zu lernen, sich im Leben zu behaupten, mit Geld umzugehen und eigene Talente zu erkennen.

Über die F.A.Z. Spendenaktion bzw. mit unserer Spende unterstützen wir nun sehr gerne den Bau des Jugendzentrums, um die Zukunftschancen der jungen Menschen nachhaltig zu sichern.

Share |

Frohe Weihnachten! 18.12.2014

Simone Franz
Simone Franz, Marketing Manager

Liebe Flurfunk-Leser,

wir wünschen Ihnen eine wunderschöne Weihnachtszeit und im neuen Jahr viele schöne und glückliche Augenblicke.
Und, dass wir in dieser schnelllebigen Zeit uns immer wieder Freiräume für die schönen Dinge des Lebens und Zeit füreinander nehmen.

Weihnachten 2014

Ich wünsche dir Zeit
Ich wünsche dir nicht alle möglichen Gaben.
Ich wünsche dir nur, was die meisten nicht haben:
Ich wünsche dir Zeit, dich zu freun und zu lachen,
und wenn du sie nützt, kannst du etwas draus machen.

Ich wünsche dir Zeit für dein Tun und dein Denken,
nicht nur für dich selbst, sondern auch zum Verschenken.
Ich wünsche dir Zeit – nicht zum Hasten und Rennen,
sondern die Zeit zum Zufriedensein können.

Ich wünsche dir Zeit – nicht nur so zum Vertreiben.
Ich wünsche, sie möge dir übrigbleiben
Als Zeit für das Staunen und Zeit für Vertraun,
anstatt nach der Zeit auf der Uhr nur zu schaun.

Ich wünsche dir Zeit, nach den Sternen zu greifen,
und die Zeit um zu wachsen, das heißt um zu reifen.
Ich wünsche dir Zeit, neu zu hoffen, zu lieben.
Es hat keinen Sinn, diese Zeit zu verschieben.

Ich wünsche dir Zeit, zu dir selber zu finden,
jeden Tag, jede Stunde als Glück zu empfinden.
Ich wünsche dir Zeit, auch um Schuld zu vergeben.
Ich wünsche dir: Zeit zu haben zum Leben!

Weihnachtliche Grüße vom gesamten eXpert Team und einen guten Rutsch in das Neue Jahr!

Weiter geht es mit dem Flurfunk ab dem 12. Januar 2015.

Share |

Dezember Office Day & Fränkische Weihnachtsfeier 12.12.2014

Svenja Henß
Svenja Henß, Senior Assistant

Wir konnten es kaum erwarten, aber letzten Freitag war es endlich soweit: Der letzte Office Day des Jahres und anschließend unsere fränkische Weihnachtsfeier standen auf dem Programm.

Nachdem alle eXperts in Würzburg auf der Steinburg angekommen waren und eingecheckt hatten, ging es auch schon los.

ShowTime” war angesagt und wurde vorgestellt! Smiley

Im SDX-Showcase "ShowTime" adaptieren unsere eXperts Technologien und Produkte für Enterprise-Lösungen auf Basis der Microsoft Plattform mit multiplen Frontends für iOS, Android und Windows.
Fachlich handelt es sich um eine Zeit-/Leistungserfassung mit Microsoft CRM als Backend; technisch sind multiple Frontends (Windows 8 App, Cordova Hybrid App, Xamarin Cross-Platform App, Responsive Web App), eine Enterprise-Architektur im Backend (mit CQRS-Pattern) inklusive Security (OAuth) sowie BI-Aspekte implementiert.

Danach informierte Matthias über die Personalentwicklung diesen Jahres. Werner beendete den Vormittag mit seinem Rückblick auf ein sehr erfolgreiches Jahr 2014!

Nach der Mittagspause und dem leckeren Buffet ging es am Nachmittag mit technischen Vorträgen weiter.

Die Weihnachtsfeier startete mit dem gemeinsamen Glühweinempfang auf der Panorama-Terrasse – wirklich eine beeindruckende Aussicht. Und während unseres Abendessens bekamen wir dann noch überraschend Besuch vom fränkischen Ehepaar Herrmann & Hermine, die uns die Eigenheiten der Franken und die Vorzüge des fränkischen Weins näher brachten. Zwinkerndes Smiley

Bild1Bild2Bild3Bild4Bild5Bild6bild7Bild8Bild9Bild10Bild11Bild12Bild13Bild14Bild15Bild16Bild17bild18

Share |

SSAS: regelmäßiges ProcessFull in Cubes 11.12.2014

Viktor Ewert
Viktor Ewert, Principal BI eXpert
Generell ist es sinnvoll einen SSAS Cube inkrementell (ProcessAdd, ProcessUpdate) zu verarbeiten, da dies Zeit spart. Bei den Dimensionen gibt es aber eine Besonderheit, die man beachten sollte. Bei allen inkrementellen Verarbeitungsmethoden (Insert, Delete, Update) bleiben alle bestehenden Dimensionseinträge bestehen und werden nur als gelöscht bzw. inaktiv markiert.

Dies kann dazu führen, dass die Cube-Dateien auf einem SSAS-Server sehr groß werden. Erst ein ProcessFull auf den Dimensionen sorgt dafür, dass nur noch die aktuellen Daten gespeichert bleiben.

Folgender Blogeintrag beschreibt das Problem im Detail:  http://byobi.com/blog/2013/07/why-you-need-to-routinely-processfull/
Share |