Heute will ich eine Möglichkeit zeigen, wie man hierarchische Recordsets mit ASP in einem selbst-designten Datagrid darstellen kann. Das ASP-Script generiert ein Datagrid, bestehend aus puren HTML. In VB gibt es das "Microsoft Hierachical Flexgrid Control" das diese Aufgabe problemlos meistert. In ASP muss alles selbst gecoded werden.
Voraussetzungen:
MDAC ab 2.0
eine Datenbank :-) (hier die Northwind-DB)
Der "MS DataShape Provider"
Den MS DataShape Provider von ADO muss man verwenden, um mit dem SHAPE-Command von SQL ein hierarchisches Recordset zu erzeugen! Das SHAPE-Command funktioniert, so...
Beispiel: Northwind-DB - Die Tabelle Customers beiinhaltet Kundendaten. Diese Kunden können mehrere Bestellungen haben, die in der Tabelle Orders platziert sind. Hier ist also eine Hierarchie vorhanden! Ein Kunde kann mehrere Bestellungen haben!!!
Mit dem Shape-Command von SQL kann ich jetzt ein solches hierarchisches Recordset erzeugen!
SHAPE {SELECT CustomerID, CompanyName, ContactName FROM Customers} APPEND ({SELECT CustomerID, OrderID, ShipPostalCode ,ShipCity FROM Orders} AS CustomersOrders RELATE CustomerID TO CustomerID) |
SHAPE: nach SHAPE kommt die Basis-Tabelle Customers
APPEND: mit Append wird die Tabelle Orders angefügt
RELATE: über RELATE wird eine Beziehung zwischen den Tabellen hergestellt. Der Gemeinsame Nenner beider Tabellen ist die CustomerID-Spalte.
Das ist das Ergebnis, dargestellt im HFlexgrid mit VB
Wie kann ich auf die Daten im Recordset zugreifen?????
Das Problem ist, dass ein Datensatz(ein Kunde) jetzt mehrere Datensätze(mehrere Bestellungen) enthalten kann!
Der Trick ist, dass das RS mehrere Recordsets in sich besitzt! Hier zwei Zeilen Script, die beschreiben, wie man auf die Bestellungen eines Kunden zugreifen kann.
set rstBest = rstParent.Fields("CustomersOrders").Value Response.Write rstBest.Fields("OrderID").Value |
Das Field "CustomersOrders" des Recordsets rstParent, ist eben kein Field!, sondern ein Recordset!!!
Aus dieses Informationen können wir jetzt ein hierarchical Datagrid in ASP erstellen. <%@ Language=VBScript %> <HTML> <HEAD> </HEAD> <BODY> <TABLE border=1> <% CONN_STRING = "PROVIDER=MSDataShape;DATA PROVIDER=SQLOLEDB;" & _ "SERVER=servername;DATABASE=northwind;UID=sa;PWD=;" SHAPE_CustomersOrders = _ "SHAPE {SELECT CustomerID, CompanyName, ContactName FROM Customers} " & _ "APPEND ({SELECT CustomerID, OrderID, ShipPostalCode ,ShipCity FROM Orders} " & _ " AS CustomersOrders RELATE CustomerID TO CustomerID)" Set rstParent = Server.CreateObject("ADODB.Recordset") rstParent.Open SHAPE_CustomersOrders, CONN_STRING '----- Das Grosse Recordset Do While Not rstParent.EOF Response.Write "<tr>" Response.Write "<td>" & rstParent.Fields("CustomerID").Value & "</td>" Response.Write "<td>" & rstParent.Fields("CompanyName").Value & "</td>" Response.Write "<td>" & rstParent.Fields("ContactName").Value & "</td>" 'sBuf = sBuf & rstParent("CustomerID") & vbTab & _ ' rstParent("CompanyName") & ", " & rstParent("ContactName") & vbCrLf '----- Das Kind-Recordset (Bestellungen) Set rstChild = rstParent("CustomersOrders").Value Response.Write "<td>" Response.Write "<table border=1 width='100%'>" Do While Not rstChild.EOF Response.Write "<tr>" Response.Write "<td>" & rstChild.Fields("OrderID").Value & "</td>" Response.Write "<td>" & rstChild.Fields("ShipPostalCode").Value & "</td>" Response.Write "<td>" & rstChild.Fields("ShipCity").Value & "</td>" Response.Write "</tr>" rstChild.MoveNext Loop Response.Write "</table>" Response.Write "</td>" Response.Write "</tr>" rstParent.MoveNext Loop Set rs = nothing %> </TABLE> </BODY> </HTML> |