code it

Martins Tech Blog

Einladung zum Treffen der SharePoint Usergroup Dresden am 12.05.2010

Zum offiziellen Start von SharePoint 2010 und Office 2010 am 12.05.2010 wird es quer durch die deutschsprachige SharePoint-Community ein Public Viewing der Keynote von Stephen Elob zum SharePoint Community SharePoint 2010 Launch Event geben. An diesem Event beteiligt sich auch die Sharepoint Usergroup Dresden.

Aus diesem Grund findet das Treffen diesmal auch etwas früher als gewohnt statt: Wir treffen uns am 12.05. 16:30 bei der T-Systems MMS. Nähere Informationen zum Termin findet man immer im Xing. Dort gibt es auch einen Link zur Anmeldung.

Umgang mit Multivalued Fields in Importen

Ein Feature von Access 2007, das wohl besonders die Umschwenker von Excel freut, sind Multivalued Fields. Man kann damit innerhalb einer Tabellenspalte eine Mehrfachauswahl abbilden - etwas wofür man im Datenbankdesign wie wir es alle kennen mindestens 3 Tabellen verwenden würden. Und sie sind ja auch so einfach zu erstellen: Man muss einfach nur im Tabellendesigner bei Mehrere Werte zulassen den Haken setzen.

So bequem dieses Feature für Endanwender ist, so unbequem ist es für Entwickler, denn man muss schon sehr schmerzresistent sein, wenn man auf eine Tabelle mit einem Multivalued Field trifft. Man könnte schon fast sagen, man hat es hier mit einer kleinen Prinzessin zu tun, die auch wie eine solche behandelt werden möchte.

Aktuelles Beispiel für diese These ist der Import solcher Felder. Das Szenario ist leicht erklärt: Eine Anwendung auf der Basis von Access 2007 bekommt ein neues Feature und das Datenmodell ändert sich insofern als dass ein neues Feld in der Tabelle notwendig wird. Schön für den Endanwender ist es nun, wenn es eine Importroutine gibt, die die Daten aus der alten Datenstruktur in die neue Struktur übernehmen kann. An und für sich ist das mit Access kein Problem, denn Access kennt ja Remote Queries:

Private Sub Import(source As String)
  CurrentDb.Execute "INSERT INTO SimpleTable SELECT * FROM SimpleTable IN """ & source & """"
End Sub

Das geht so lange gut, bis man auf eine Tabelle mit einem Multivalued Field trifft, denn plötzlich sind Remote Queries nicht mehr möglich.

Einen entsprechenden Versuch wird Access nicht dulden.

Dabei ist diese Meldung unabhängig davon, ob man das Multivalued Field wirklich mit abfragt oder nicht - man bekommt immer wieder diese Meldung.

Nun gibt es in meinen Augen 3 Lösungsansätze:

  • Der Kunde gibt einfach alle Daten nochmal manuell ein. Ok, dazu wird er sicher nicht bereit sein, aber anscheinend ist es das was in dem Fall die naheliegendste Lösung ist, wenn sich Access so hartnäckig sträubt.
  • Man könnte über Externe Daten eine Tabelle der alten Datenbank mit der neuen Datenbank verknüpfen und hätte damit dann ein INSERT-INTO-Statement, das sich nur auf die aktuelle Datenbank bezieht, da die verknüpfte Tabelle sich wie eine in der Datenbank befindliche Tabelle verhält. Schön automatisieren lässt sich das aber auch nicht. Das wäre also der halbautomatische Weg.
  • Möchte man den vollautomatischen Weg gehen, kommt man wohl nicht drum herum, die Daten feldweise zu übernehmen und mit Recordsets zu hantieren.

Für Tor Nummer 3 hab ich mich letztendlich auch entschieden: 

Private Sub Import(source As String)
   Dim wrksp As DAO.Workspace
   Set wrksp = DBEngine.Workspaces(0)
 
On Error GoTo Err_Import
   ' open transaction
   wrksp.BeginTrans

   ' import a simple table
   CurrentDb.Execute "INSERT INTO SimpleTable SELECT * FROM SimpleTable IN """ & source & """"

   ' import table with multivalued field
   Dim otherDB As DAO.Database, otherRS As DAO.Recordset, currentRS As DAO.Recordset
   Dim i As Long
 
   ' open recordsets to read data from old database and append it to current database
   Set otherDB = DBEngine.OpenDatabase(source)
   Set otherRS = otherDB.OpenRecordset("MVFTable")
   Set currentRS = CurrentDb.OpenRecordset("MVFTable")

   ' loop records in old data and add a new record in current db for each record in old db
   While Not otherRS.EOF
       currentRS.AddNew
       ' iterate through the old fields and update the value in current record
       For i = 0 To otherRS.Fields.Count - 1
           If otherRS.Fields(i).Name <> "MFVField" Then
               currentRS(otherRS.Fields(i).Name) = otherRS(otherRS.Fields(i).Name)
           End If
       Next
       currentRS.Update
       otherRS.MoveNext
   Wend
 
   ' close the recordsets
   currentRS.Close
   otherRS.Close
 
   ' open a recordset for the values of the multi valued field
   Set otherRS = otherDB.OpenRecordset("SELECT Id, MVFField.Value FROM MVFTable")
   While Not otherRS.EOF
       If Not IsNull(otherRS.Fields(1)) Then
           ' insert selected values of the multivalued field
           CurrentDb.Execute "INSERT INTO MVFTable (MVFField.Value) VALUES (" & otherRS.Fields(1) & ") WHERE Id = " & otherRS.Fields(0)
       End If
      otherRS.MoveNext
   Wend

   ' close the recordset
   otherRS.Close
 
   ' commit transaction
   wrksp.CommitTrans
 
   MsgBox "Import erfolgreich beendet"
   Exit Sub
 
Err_Import:
   ' rollback transaction
   wrksp.Rollback
   MsgBox "Import ist fehlgeschlagen"
End Sub

Wie man gut sehen kann, muss man bei dieser Lösung statt eines einzigen SQL Statements (im Beispiel der Import von SimpleTable) eine ganze Routine schreiben und die Tabelle mehrfach anfassen, weil das MultiValued Field quasi eine Tabelle in der Tabelle ist und mit einer speziellen Syntax befüllt werden möchte.

Ich hätte mir gewünscht, dass Features, auch wenn sie nicht Standard-SQL-konform sind, sich doch zumindest so verhalten, wie man es vom Rest der Applikation gewohnt ist - und dazu gehört in meinen Augen auch die Möglichkeit, bei Multivalued Fields Remote Queries zuzulassen. 

Eindrücke vom dotnetpro powerday zum Thema CCD

Ein professioneller Softwareentwickler - was kennzeichnet ihn eigentlich? Mit dieser Frage starten Ralf Westphal und Stefan Lieser, wenn sie erklären, worum es bei der Clean-Code-Developer-Initiative eigentlich geht. Und genau so beginnt auch die Keynote des dotnetpro powerdays zum Thema CCD, der am 09.03.2010 in München stattfand. Die Antworten aus dem Publikum sind sehr vielseitig: "Man hat Erfahrung.", "Man schreibt wiederverwendbaren Code", "Jemand ist bereit, einem Geld für die Leistung zu geben", "Man schreibt Code, den andere verstehen" hört man Wortmeldungen aus allen Richtungen. Aber sind das wirklich die Kriterien? "Wiederverwendbarkeit? - Ich möchte keinen Klempner, der Dinge wieder verwendet, weil das professionell ist", meint Ralf und macht damit klar: Nicht das sind die Kriterien für Professionalität, sondern eine Mischung aus Bewusstheit und Prinzipien. Mit viel Witz und mehren verschenkten Mausmatten als Belohnung für interessante Antworten führen die beiden durch die Keynote und bringen so jedem das Thema näher.

Klar ist, die beiden wissen was sie rüberbringen wollen und vertreten da auch ihre Meinung recht konsequent. Selbst langjährige und erfahrene Entwickler betrachten Probleme mal aus einem anderen Blickwinkel, wenn Aussagen wie "Wozu brauche ich einen Debugger – meine Tests zeigen mir doch, wo der Fehler ist", "Zum Erstellen einer Softwarearchitektur braucht man keine Tools – nur ein Flipchart" im Raum stehen - und wenn uns jemand nach einer Software-Architektur für ein Warenwirtschaftssystem gefragt hat, haben wir dann nicht alle mit einem einzigen "großen Kreis mit Bubbel in der Mitte" auf dem Flipchartpapier geantwortet? "Wie vermeide ich Abhängigkeiten?", war die Frage, die einen Abstecher in Richtung Event Based Programming mit den Hauptakteuren "Paula Portal", "Anton Adapter", "Frieda Filter" und "Zacharias Zähler" bescherte, die gemeinsam die Codezeilen einer Datei zählten, während "König Kunde" sich einen neuen Kaffee holte.

Der Nachmittag bestand dan darin, eine "Brownfield-Anwendung" mit Gummistiefeln zu betreten und im Sinne von CCD sauber zu machen. Leider musste ich nach der Ermittlung der guten und schlechten Eigenschaften der Anwendung die Veranstaltung verlassen, weil sonst mein Flieger ohne mich gestartet wäre, aber ich denke das anschließende Refactoring der Anwendung war auch noch sehr interessant.

Ja, ich mag die Art von Stefan und Ralf, wie sie solche Veranstaltungen durchführen - mal ganz unabhängig davon, ob es eine kostenpflichtige Veranstaltung wie der CCD-Powerday oder eine kostenfreie wie Usergroup-Treffen oder OpenSpaces sind. Durch diese Art wird man abseits vom täglichen Geschäft mal dazu animiert, neue Wege einzuschlagen oder anders an ein Thema heranzugehen. Und unabhängig davon, ob man CCD unterstützt oder nicht - die Notwendigkeit professionell zu arbeiten gibt es durchaus und die sollte auch immer im Hinterkopf sein. Und die Initative hin zur Professionalität unterstütze ich aus vollster Überzeugung.

Einladung zum Treffen der .NET Usergroup Dresden

Am 24. März um 18:00 Uhr findet das nächste Treffen der .NET Usergroup Dresden in den Räumen der T-Systems MMS statt. Die große Überschrift für den Abend lautet Silverlight 4 und wir haben wieder zwei sehr interessante Vorträge dabei.

Beginnen wird der Abend mit Zurück in die Zukunft mit Silverlight 4 von Gregor Biswanger. Gregor selbst ist sicher dem ein oder anderen schon durch seine Tätigkeit als Sprecher auf diversen Konferenzen und Autor in Entwicklermagazinen bekannt. Sein Vortrag bei uns demonstriert die Highlights von Silverlight 4 und geht zudem auf Erwartungen bezüglich Silverlight 5 ein. Zusammengefasst: Wir können schon heute sehen, was uns morgen mit Silverlight 4 erwarten wird.

Im zweiten Teil geht es um das Silverlight Augmented Reality Toolkit (SLARToolkit), das René Schulte entwickelt hat und das er uns vorstellen wird. Mehr Informationen von und über René findet ihr auf seinem Blog und wer sich bereits im Vorab über das Toolkit informieren möchte, kann sich bei Codeplex informieren.

Der Abend verspricht wieder sehr interessant zu werden.

Tiefergehende Informationen zum Termin finden sich auf der Seite der .NET Usergroup Dresden. Dort gibt es auch einen Link zur Anmeldung für den Abend.

Was habe ich vor über 10 Jahren programmiert?

Schwelgen in Nostalgie - anders kann man das wohl gar nicht erklären. Vergangene Woche schrieb Mathias in einem Tweet, dass er in seinen alten Festplatten kramt und prompt hab auch ich überlegt, was ich vor etwa 10 Jahren so getrieben hab. Passend dazu kommt auch der Aufruf "Was hast du vor über zehn Jahren programmiert?" von Dariusz.

Festplatten oder Disketten von damals hab ich nicht mehr und ich hätte auch gar kein Laufwerk mehr für Disketten (wie die Zeit vergeht). Deshalb habe ich stattdessen mal etwas in meinem Gehirn gekramt. Fest steht, dass ich mich damals noch nicht mit C# beschäftigt habe. Und fest steht außerdem, dass ich in dieser Zeit gerade mitten im dualen Studium war. 

In der Arbeit war VBA und Access 97 angesagt. Die Quellcodeverwaltung bestand darin, sich das Projekt vom Netzlaufwerk wegzukopieren und nach getaner Arbeit wieder hinzulegen. Ganz schön gruselig. Glücklicherweise hat sich das kurz darauf geändert und VSS wurde installiert. Ich wusste, dass es auch Visual Basic 6 gab (quasi die erwachsene Variante von VBA) und dass man damit Formular- und Kommandozeilenprogramme schreiben konnte. DLLs waren für mich damals noch irgendwas geheimnisvolles, wofür man unbedingt C++ braucht und womit ich mich partout nicht anfreunden konnte.

Und nebenbei hab ich mich mit Nicht-Microsoft-Feld rumgetrieben. Mein "Raumi" im Studentenwohnheim hat sich mit Java beschäftigt und sowohl der Ansatz, die Programme im Texteditor erstellen zu können als auch die Plattformunabhängigkeit haben mich fasziniert. Irgendwann war ich das Programmieren im Texteditor auch leid und hab mir eine Java-Entwicklungsumgebung gegönnt (damals JBuilder) und damit ging es schon etwas besser. Aber auch das Interesse verebbte ganz schnell, da ich keine Idee für ein wirkliches Projekt hatte. 

Das besagte Projekt war dann die Homepage der Seminargruppe. Die Vision: Eine Präsentation der Seminargruppe nach außen, einen Mitgliederbereich wo man Unterlagen runterladen kann (für die die mal länger schlafen wollten), eine Erinnerungsfunktion für Geburtstage und eine Kontaktliste mit Emailadresse, ICQ-Nummer und Raumnummer im Wohnheim - die Inhalte dort sollten vom Nutzer selbst aktuell gehalten werden. Nun ja, der Weg von Java zu JSP war nicht weit und so habe ich mit 2 Kommilitonen die Seite mit statischen und dynamischen Elementen in HTML und JSP aufgebaut. Zusammengeschubse von Elementen in WYSIWYG-Editoren fand ich damals schon furchtbar und so haben wir HTML in Reinform geschrieben bzw. generiert. 

Die Seite ist mittlerweile gestorben, aber die Erinnerung lebt ;)

 

dotnet Cologne 2010 am 28. Mai 2010 in Köln

Mal wieder wirft ein Community-Event seine Schatten voraus: Am 28. Mai findet in Köln die Entwicklerkonferenz dotnet Cologne statt. Organisiert wird der Event von Albert Weinert, Roland Weigelt und Stefan Lange von den .NET Usergroups in Köln und Bonn. Schwerpunkt der insgesamt 18 Sessions in 3 parallelen Tracks sind Themen rund um Visual Studio 2010 und .NET 4.0, aber es wird sich bestimmt auch das ein oder andere Thema abseits dieses Themenkomplexes finden.

Seit heute kann man sich für die Konferenz anmelden und wie man den Tweets von dotnetCologne entnehmen kann, haben sich wohl schon fast die ersten 150 Teilnehmer gefunden.

Wie Jan schreibt, wird es am Abend noch eine Grillfete des dotnet-forum geben, zu der alle Teilnehmer der Konferenz eingeladen sind. Ich hoffe es wird schönes Wetter und das Grillen findet am See statt.

Laufend neue Informationen gibt es im Twitter unter dem Hashtag #dc2010 oder wenn man dotnetCologne folgt.