Archiv für den Monat Februar 2011

Ähnliche LINQ Abfragen durch IQueryable kapseln

Wer öfters ähnliche LINQ Abfrage durchführen muss und sich dabei an das Clean Code Prinzip Don’t Repeat Yourself (DRY) halten will, der kann dies über das Interface IQueryable machen. Um das zu verdeutlichen, soll folgendes Beispiel dienen:

Stellen wir uns vor, wir haben einer Klasse mit 2 Datenbank-Abfragen, die zum Teil die gleichen Einschränkungen haben:

  • gemeinsame Anforderung: Hole alle Artikel aus dem Artikelstamm, die nicht auf gelöscht gesetzt sind und deren Erstelldatum innerhalb der letzten 12 Monate liegt
  • Abfrage 1: filtere zusätzlich auf die Einheit ‘Stück’
  • Abfrage 2: filtere alle, die als Lagerartikel markiert sind

Natürlich könnte man jetzt 2 gänzlich separate Abfragen machen. Das Problem ist, dass wenn man die 12 Monate auf 24 Monate ausdehnen will, dies an zwei Stellen erledigen muss. Das riecht (bad smells).

Eine Lösung wäre nun, dass ihr eine dritte Methode definiert, die ungefähr so aussehen könnte:

   1: Private Function GetStockArticles(ByRef vContext As cwDB.comWorkEntities) As IQueryable(Of cwDB.Article)

   2:     If vContext Is Nothing Then

   3:         Throw New ApplicationException("Kein Zugriff auf die Datenbank. DataContext war leer.")

   4:     Else

   5:         Dim lArticles As IQueryable(Of cwDB.Article) = _

   6:                     From X In vContext.Articles

   7:                      Where _

   8:                          X.IsStockArticle = True AndAlso _

   9:                          X.IsDeleted = False

  10:                      Select X

  11:  

  12:         If lArticles Is Nothing OrElse lArticles.Count < 1 Then

  13:             Throw New ApplicationException("Keine Lagerartikel gefunden")

  14:         End If

  15:  

  16:         Return lArticles

  17:     End If

  18: End Function

 

Das Ergebnis könnt ihr in den zwei Abfragen dann weiterverwenden. Zwei Anmerkungen dazu:

  • Ihr müsst den Context an die Methode übergeben, sonst könnt ihr später nicht auf das Ergebnis zugreifen.
  • Wenn ihr eine Liste zurückgeben würdet, hättet ihr den Nachteil, dass die Abfrage bereits durchgeführt wurde, sprich ihr hättet schon einen Datenbankzugriff gemacht. Durch IQueryable erhaltet ihr lediglich den ExpressionTree zurück, auf dem ihr die Abfrage verfeinern und dann feuern könnt.
Advertisements

Parameter ByVal oder ByRef übergeben

Ich will kurz erklären, wie ich auf diesen Blogeintrag gekommen bin: Wir haben vor kurzem unsere internen Namenskonventionen überarbeitet. In diesem Kontext kam die Frage auf, ob man lokale Variablen von Parametern anhand der Schreibweise unterscheiden können sollte. Das macht natürlich dann Sinn, wenn sich eine lokale Variable anders verhält als eine, die per Parameter in die Methode injiziert wurde. Wann ist das der Fall? Nun, hier gilt es zu unterscheiden, ob die Variable ByValue (in C# gibt man hier nichts an) oder ByRef (in C# verwendet man das Schlüsselwort ref) übergeben wird.

Wo liegen die Unterschiede:

Handelt es sich bei dem Parameter um einen Wertetyp, so muss man eine Unterscheidung machen, da sich die Variable unterschiedlich verhält. Hierzu verweise ich auf diesen Link, der besagt, dass bei Werttypen, die per Referenz als Parameter an eine Subroutine übergeben werden, Änderungen sich nicht auf die Subroutine beschränken, sondern sich auf die aufrufende Routine auswirken. Wird die Variable hingegen per ByVal übergeben, so haben Änderungen daran nur lokale Auswirkungen (d.h. im Kontext der Subroutine).

Anders sieht es bei Parametern aus, die einen Referenzdatentyp abbilden. Hier spielt es keine Rolle, wie der Parameter an die Subroutine übergeben wird. Da in beiden Fällen immer nur der Zeiger auf das Objekt übergeben wird, haben Änderungen immer globale Auswirkungen. Vergleicht dazu auch diesen Artikel hier (Kommentare beachten).

Als ich dazu etwas programmiert habe, bin ich aber noch auf folgende Entdeckung gestoßen, die mir doch Rätsel aufgibt:

    Sub Main()
        Dim i = 15
        Console.WriteLine(Object.ReferenceEquals(i, i))
        ReferenceTestWithValueTypes(i, i)
        Console.ReadLine()
    End Sub

    Public Sub ReferenceTestWithValueTypes _ (ByRef object1 As Int32, ByRef object2 As Int32)

        Console.WriteLine(Object.ReferenceEquals(object1, object2))
        object2 = 20
        Console.WriteLine(object1)
        Console.WriteLine(object2)
        Console.WriteLine(Object.ReferenceEquals(object1, object2))
    End Sub

Die Ausgabe produziert folgendes Ergebnis:

clip_image002

Vielleicht kann ein Leser dies auflösen?!

Stellenausschreibungen

Wir haben die Stellenausschreibungen jetzt online gestellt:

Wir freuen uns auf Ihre Bewerbungen. Unter die heco und ich werde ich in Zukunft Beiträge von Kollegen und Externen (Consultants, ehemaligen Praktikanten und Diplomanden, etc.) online stellen, die einen Einblick in das Arbeitsklima und die Arbeitsbedingungen bei der Firma heco GmbH geben sollen.

Typische SharePoint Probleme

Im Rahmen meines Besuchs des Shared Solutions Day haben sich einmal mehr die typischen Schwierigkeiten, die ich auch in früheren Gesprächen auf UserGroups und Konferenzen identifizieren konnte, bestätigt.

Hier die meiner Meinung nach verbreitetsten Probleme:

  • Die Anwender nehmen das neue System nicht an
  • Daraus resultiert auch die Problematik, dass die Systemlandschaft trotz teilweise erheblichen Aufwands und erheblicher Kosten brach liegt… Bis das System eingestampft wird
  • Ein anderer Grund ist sogar in der IT selbst zu finden: Es bleibt bei wenigen Spielereien wie leichtes Anpassen einer Liste und das Erstellen einer Dokumentenbibliothek. Danach wird das System links liegen gelassen.
  • Kein Feature wie es in SharePoint mitgeliefert wird, kann eigentlich genau so out of the box verwendet werden
  • Da jedes Unternehmen typische Geschäftsprozesse wie ‘Besprechung  vereinbaren’ immer in irgendeiner Form um eigene, unternehmensspezifische Modalitäten erweitert hat, lassen sich die vermeintlich einfachen Implementierung dann doch nicht so einfach umsetzen wie geplant. Das sogenannte Eichhörnchen… Demzufolge hat man die Wahl einen größeren Aufwand (meist Programmierung) zu betreiben oder sich mit Einschränkungen abzufinden. Beides ist in der Regel nicht akzeptabel und hinterlässt einen bitteren Beigeschmack, der den anfänglichen Optimismus stark reduziert.
  • Die eigentlich wichtigen Features, um Geschäftsprozesse dann wirklich vollständig (und nicht nur isolierte Teilprozesse) und gewinnbringend umsetzen zu können, stecken in der kostenpflichten Version. Über diesen Tellerrand wollen und können aber gerade kleine und mittelständische Unternehmen nicht hinausschauen, v.a. nicht, wenn man sich gerade erst mit SharePoint auseinandersetzt.

Im folgenden will ich ein paar Lösungsansätze vorschlagen:

Der eigentliche Knackpunkt, bevor man überhaupt zu SharePoint greift, ist, dass man sich klar macht, dass man wie bei jedem anderen System alleine durch die Anschaffung und Einarbeitung Zeit- und Kostenaufwand hat. Lediglich weil die SharePoint Foundation bzw. die Windows SharePoint Services kostenfrei erhältlich sind und weil es gerade in aller Munde ist, heißt dies gewiss nicht, dass nicht wie bei jeder anderen Produkteinführung auch eine entsprechende Planung vorausgehen muss.

Drei wichtige Schritte gehören in jedem Fall zu dieser Planung:

Schritt 1: Holen Sie sich von Anfang an die Fachabteilungen ins Boot. Greifen Sie sich hier v.a. die Abteilungsleiter und IT-affine Mitarbeiter heraus. In der Regel sind diese Personen entscheidend allgemeinen Annahme des neuen Systems.

Schritt 2: Identifizieren Sie gemeinsam einen ausgewählten Satz an einfachen Geschäftsprozessen. In der Regel gibt es fast immer solche, deren Ablauf nicht wirklich störend aber dafür hinderlich sind. Meistens finden sie solche Prozesse, indem sie prüfen, was schon lange auf einer ToDo-Liste steht und immer wieder wegen niedriger Priorität verschoben wird (sogenannte nice-to-have Feature). Idealerweise sollte es auch ein Prozess sein, der viele Mitarbeiter betrifft. Ein Beispiel könnte das Ausdrucken und das manuelle Ausfüllen von Anträgen (z.B. Urlaub) sein, was jeder Verkäufer 1-2 Mal pro Monat machen muss.

Schritt 3: Holen Sie sich einen Mann vom Fach dazu, der längere praktische Erfahrung in diesem Bereich hat. Es reicht keinesfalls aus auf Vorträge zu gehen oder sich durch Online Material zu arbeiten. Vergessen Sie ähnliche Beispiele von Konferenzen und UserGroups, da wie schon erwähnt der Teufel im Detail steckt. In der Regel reicht es völlig aus, wenn man sich einen Tag mit dem SharePoint Consultant zusammensetzt. Stellen Sie klar, dass sie für die Lösungen nur auf die mitgelieferten Hilfsmittel in SharePoint zurückgreifen möchten (Anmerkung: Hin und wieder können vor allem auch kostenfreie Lösungen im Netz ganz hilfreich sein!). Programmieren sollte in diesem frühen Stadium kein Thema sein. Wichtig: Es geht in diesem Gespräch noch nicht um einen detaillierten Plan zur Umsetzung. Lediglich die Machbarkeit und den benötigen Zeitraum gilt es zu evaluieren. Bedenken Sie: Die Kosten für diesen einen Tag sind in jedem Fall geringer als SharePoint aus dem Gedanken heraus aufzusetzen, dass man ja einfach mal das Ganze testen und ein wenig herumspielen will.

Wenn sich nach diesen drei Schritten herausstellt, dass Ihre Anliegen durchaus machbar sind, dann können Sie loslegen. Andernfalls werden Sie mit hoher Wahrscheinlichkeit keinen großen Erfolg bei der SharePoint Integration haben. Halten Sie sich bei der Realisierung an folgende zwei wichtige Regeln:

  • Führen sie immer eine Änderung nach der anderen durch und fangen sie mit den kleinsten davon an
  • Setzen Sie Lösungen für die alltäglichen Geschäftsprozesse um, die das Gros der Mitarbeiter betrifft

Wohlgemerkt halte ich diese zwei Regeln nur für sinnvoll bis eine allgemeine Akzeptanz erreicht bzw. SharePoint eingeführt wurde! Um Ihnen ein paar Beispiele zu nennen, was wir uns dafür herausgegriffen haben:

  • Wir haben die Möglichkeit geschaffen, dass zentral auf der Startseite jeder Mitarbeiter für den heutigen und morgigen Tag einsehen kann, wer an- und wer abwesend ist. Dazu gehört auch, wenn jemand Urlaub hat oder lediglich für ein paar Stunden nicht verfügbar ist.
  • Wichtige Firmennachrichten werden ebenfalls auf der Startseite veröffentlicht. Idealerweise kommen hier mindestens 1-2 neue pro Woche hinzu. Meistens werden die Neuigkeiten durch die Abteilungsleiter eingepflegt. In einem Handelshaus könnten das auch Bekanntmachungen bzgl. der Preisanpassungen sein.
  • Für uns im Handel war ein zentrales Werkzeug der Tourenplan unserer LKWs. Ein Gespräch (vgl. Schritt 1 weiter oben) ergab, dass dieser von allen Verkäufern täglich eingesehen wurde.
  • Tipp-Spiel: Ja, auch solche kleine Dinge können sehr zuträglich sein. Bisher konnte ich für jede EM und WM ein entsprechendes Feature online finden, das ich kostenlos bei uns einbinden konnte. Die Beteiligung an den Tippsielen ist seit Jahren extrem hoch!

Diese 4 Features bewirkten, dass jeder Mitarbeiter mindestens 1x täglich – nämlich morgens – zum Intranet navigierte, um sich einen Überblick für den Tag zu verschaffen. Mit der erwähnten Option die Infos auch für den morgigen Tag einsehen zu können, wurde nach kurzer Zeit dann jeden Abend nochmal hineingeschaut. Nach relativ kurzer Zeit hatten wir so eine vollständige Akzeptanz innerhalb der Belegschaft erreicht. Darauf ließen sich dann weitere Projekte aufsetzen. Hier kann ich vor allem zwei Kernpunkte identifizieren:

  • Dokumentenmanagement, um dem Chaos in der Dateiablage und den öffentlichen Ordnern Herr zu werden
  • Projektmanagement, da es immer und überall Projekte gibt und das Thema an sich seit jeher schwierig und komplex ist

Meines Erachtens nach gibt es jetzt zwei Möglichkeiten wie sie fortfahren können. Das ist vor allem von Ihren Ressourcen und Ihrer IT abhängig. Entweder Sie setzen eines der Themen gleich für Ihren Betrieb um oder – und das ist der bessere Weg – Sie lassen die IT fachinterne Geschäftsprozesse für sich umsetzen, quasi als Prototyp. In der Regel werden Sie hier schon auf eines der oben genannten Themen stoßen. Bei uns war es eine Dokumentationsseite mit allen IT Dokus und eine Inventarliste unserer Soft- und Hardware. Mit diesen Erfahrungen gingen wir die dann die oben genannten Punkte an.

Speziell auf Rückmeldungen zu diesem Artikel würde ich mich besonders freuen. Ich möchte nochmal darauf hinweisen, dass die oben genannten Punkte meine subjektive Wahrnehmung und Meinung wiedergeben. Vergessen Sie auch nicht, dass sich diese Ergebnisse im Rahmen meiner Tätigkeit in einem mittelständischen Handelsbetrieb aus der Edelstahlbranche ergeben haben.

ITIL und IT Service Management (ITSM)

Morgen werde ich auf dem Shared Solutions Days der Firma SERVICEPORTALS GmbH einen Vortrag zum Thema IT Asset Management halten. Allerdings werde ich in diesem Kontext auch auf allgemeine Fragen zu Themen aus dem Bereich IT Service Management aufgreifen.

In diesem Blogeintrag will lediglich auf ein paar Interessante Links hinweisen, die mir bei Recherchen aufgefallen sind:

“Die Berater von Techconsult schließen daraus, dass vielerorts die Expertise fehle, in der ITIL dokumentierte Best Practices umzusetzen. Vor allem der Mittelstand brauche ein angepasstes Service-Management. Unter anderem die vielen Anglizismen unter den Fachbegriffen sehen die Berater als Hindernis…

Der in der ITIL vorgesehene „kontinuierliche Verbesserungsprozess“ wird in naher Zukunft wohl keinen Aufschwung erfahren. Dafür ist nach Einschätzung von Techconsult der Informationsaustausch noch zu schlecht. Dasselbe gelte für das Ziel Ressourcenoptimierung. Auch sie werde wohl weiter ein Schattendasein fristen.”

vgl. Quelle: CIO.de

 

“Wie ein guter Bebauungsplan aussieht, beantwortet jedes Unternehmen anders. So finden sich in der Praxis verschiedenste Formen von Anwendungslandkarten genauso wie Prozess-Produkt-Matrizen, in denen die IT-Anwendungen den unterstützten Prozessen und Produkten zugeordnet werden. Hier lässt sich klar beobachten, dass eine reine IT-Anwendungslandkarte mit graphisch visualisierten Schnittstellen nur begrenzt dabei hilft, eine effektive IT-Bebauung zu organisieren. Denn: Wie gut oder schlecht eine IT-Anwendungslandschaft ist, entscheidet sich maßgeblich daran, wie gut sie das Business und dessen Demands unterstützt. Mit dieser Dimension tun sich die meisten Unternehmensarchitekten schwer, da es oftmals einfacher ist, sich in der vertrauten Komfortzone der IT zu bewegen, statt die Anforderungen des Geschäftsorganisation inhaltlich zu durchdringen und diese in einer Geschäftsarchitektur abzubilden. Eine gute Unternehmensarchitektur beschreibt die Geschäftsarchitektur in mindestens drei Dimensionen: Prozesse (die Wertschöpfungssicht), Business Capabilities (die funktionale Sicht) und Produkte. Insbesondere die Darstellung von Business Capabilities wird von immer mehr Unternehmen als wichtiges Konstrukt gesehen, mit dem eine effektive Beurteilung der IT-Unterstützung bzw. des Business/IT-Alignments ermöglicht wird.”

vgl. Quelle: CIO.de

Stellenausschreibungen

Leider war ich in der letzten Zeit tief in Projekten versunken, sodass ich wenig zum Bloggen kam. Nächste Woche (10. Februar) halte ich einen Vortrag zum Thema IT Asset Management auf den SharePoint Solutions Days in Karlsruhe, sodass der nächste Eintrag noch ein wenig auf sich warten lässt. Allerdings habe ich noch etwas Positives in eigener Sache und hoffentlich für auch für den ein oder anderen da draußen:

Wir suchen Auszubildende und Diplomanden für unsere IT:

Darüber hinaus wollen wir unser Team durch

  • einen .NET Software Engineer (Entwicklung am hauseigenen ERP System)
  • einen Systemadministrator (Microsoft Infrastruktur)

mit mehrjähriger Berufserfahrung verstärken.

 

Unser aktuelles Team könnt ihr hier begutachten. Bei Interesse bzw. für nähere Informationen meldet euch bitte bei mir per

%d Bloggern gefällt das: