Geschrieben von: Christoph Wille
Kategorie: Datenbank
This printed page brought to you by AlphaSierraPapa
Wer kennt das Szenario nicht, wo man zu einem Datensatz aus einer Mastertabelle die entsprechenden Datensätze aus der Kindtabelle abholen muß - so zum Beispiel alle Bestellungen eines Kunden. Das ist natürlich nur eines der vielen Szenarien die auf Fremdschlüsselbeziehungen aufbauen können.
Das Problem kann man nun auf einige Arten lösen:
Damit steht schon fest, womit wir uns heute beschäftigen werden: Data Shaping. Als Beispiel habe ich unsere Artikeldatenbank von AspHeute "abgespeckt", und sie sieht nun wie folgt aus:
Die Hierarchie, auf die in den folgenden Beispielen hinauswill ist die, daß eine Kategorie mehrere Artikel beinhaltet. MS Access 2000 bietet einem eine Tabellenansicht, die bereits das Data Shaping Feature von ADO einsetzt - und wir werden es ähnlich für uns in ASP nachbauen:
Nun da wir wissen, was wir wollen - und wie wir es anpacken wollen - steht nur noch die Frage im Raum, wie denn die Technologie funktioniert, derer wir uns bedienen wollen. Data Shaping erlaubt es, hierarchische Beziehungen aufzubauen, die nicht unbedingt auf bestehenden Schlüsselbeziehungen aufbauen müssen. Das Wichtige hierbei ist, daß ich nicht an Fremdschlüssel gebunden bin - ich kann meine Hierarchien aufbauen wie ich das gerne möchte.
Da ADO auf OLE DB aufbaut, ist es eine sichere Annahme, daß auch Data Shaping im Hintergrund durch OLE DB "gestützt" wird. Und richtig: es gibt den Data Shaping Service for OLE DB, als auch eine eigene SHAPE Sprache, die es einfach erlaubt, Hierarchien zu erzeugen.
Was macht OLE DB im Hintergrund, wenn man per ASP und ADO ein Shaped Recordset anfordert? Schaut Euch zuerst die Grafik an, die Schritte werden dann in der darauffolgenden Liste erklärt.
Der Inhalt eines geshapten Recordsets besteht aus den Feldern des Masterrecordsets als auch einem weiteren Feld, dem Chapter. Ein Chapter ist nichts weiter als ein Recordset im Recordset - es enthält die Daten der Kindtabelle(n).
Damit das Ganze jetzt nicht in die Theorie abgleitet, starten wir mit unserem Beispiel. Unser Data Provider ist der JET OLE DB Provider, unsere beiden Tabellen sind auch bekannt, die Hierarchie haben wir uns auch schon ausgedacht, alles was uns jetzt definitiv noch fehlt ist die Syntax der SHAPE Sprache.
In diesem ersten Artikel über Data Shaping möchte ich mich bei der Syntax noch kurz halten, und das Kommando
SHAPE { SELECT * FROM tCategories } APPEND ({ SELECT * FROM tArticles } RELATE CategoryID TO CategoryID) AS rsArticles
fast so stehen lassen - weil es bereits die allereinfachste Form eines SHAPE Statements ist. Die erste Zeile definiert das Masterrecordset, die zweite Zeile fügt das Kindrecordset an, und die dritte Zeile teilt ADO mit, wie ich Master und Kind in Beziehung setzen möchte - und wie das daraus entstehende Chapter heißen soll.
Bewaffnet mit dem SHAPE Kommando können wir nun den dazugehörigen Sourcecode in ASP schreiben:
<% Option Explicit %> <% Dim strShapeCmd, cn, rs Dim chapter, theDate strShapeCmd = "SHAPE { SELECT * FROM tCategories } " strShapeCmd = strShapeCmd & "APPEND ({ SELECT * FROM tArticles } " strShapeCmd = strShapeCmd & "RELATE CategoryID TO CategoryID) AS rsArticles" Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Provider = "MSDataShape" cn.Open "data provider=Microsoft.Jet.OLEDB.4.0;data source=c:\aspheute.mdb" rs.Open strShapeCmd, cn Response.Write "<table>" While Not rs.EOF Response.Write "<tr><td><b>" & rs("CategoryName").Value & "</b><br>" & vbCrLf Set chapter = rs("rsArticles").Value Response.Write "<ul>" While Not chapter.EOF Response.Write "<li><a href=""http://www.aspheute.com/artikel/" theDate = chapter("ArticleDate") Response.Write Year(theDate) & ZeroPad(Month(theDate)) & ZeroPad(Day(theDate)) & ".htm"">" Response.Write chapter("ArticleTitle") & "</a>" chapter.MoveNext Wend Response.Write "</ul></tr>" rs.MoveNext Wend Response.Write "</table>" Function ZeroPad(theString) If Len(theString) = 1 Then theString = "0" & theString End If ZeroPad = theString End Function %>
Ungewöhnlich an diesem Sourcecode verglichen zu normalen ADO Code ist, daß man sowohl den Provider (Service Provider), als auch getrennt den Data Provider (im Open Statement) angeben muß - damit wird der Data Shaping Provider aktiviert. Alles andere ist wie normaler ADO Code.
Interessant ist, wie man das Chapter anspricht:
Set chapter = rs("rsArticles").Value
Das Chapter ist ein Recordset Objekt, daher benötigt man das Set Statement. Apropos: sollte man .Value vergessen, kann das einige unschöne Fehler produzieren. Also Vorsicht Falle!
Die Ausgabe aller Daten (Master und Kind) erfolgt in einer sehr einfachen Tabelle, mit ebenso einfacher Formatierung. Das einzige besondere, das ich eingebaut habe, ist ein Link zum tatsächlichen Artikel auf AspHeute. Da unsere Linkstruktur yyyymmdd.htm ist, muß ich dafür sorgen, daß Monate und Tage mit nur einer Zahl eine führende Null bekommen - dafür ist die Funktion ZeroPad zuständig.
Der Output, der generiert wird, sieht in Internet Explorer wie folgt aus:
Mit relativ wenig Aufwand haben wir einen durchwegs ansprechenden Output erzeugt. Und das, ohne uns bei der Master-Kind Beziehung ein zusätzliches Codeproblem aufzuhalsen (zusätzliche Recordsets öffnen, JOIN's, ...).
In diesem Artikel ging es um ein erstes Kennenlernen der Möglichkeiten, die der Data Shaping Provider für eine Anwendung eröffnen kann. Ausgespart habe ich eine genaue Syntax der SHAPE Kommandosprache, als auch die verschiedenen Arten der Hierarchien. Wir haben nur eine verwendet, obwohl es fünf verschiedene Arten gibt - aber das ist eine andere Geschichte (Artikel).
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000627.zip
Installation der neuesten ADO Version (ADO 2.5)
http:/www.aspheute.com/artikel/20000328.htm
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.