Benutzer mit den meisten Antworten
Liste dynamisch füllen und bearbeiten

Frage
-
Tag zusammen,
ASP.Net gehört jetzt nicht gerade zum meinem Erfahrungsschatz und ich bräuchte mal einen kleinen Hinweis wie folgendes zu lösen ist.
Eine Datenbank-Tabelle ("Schema") enthält mögliche Felder, zu denen in einer anderen Tabelle ("Bewertung")Werte eingegeben und gespeichert werden.
Felder Tabelle "Schema": BewerteteEigenschaft (inhaltlich z. B. Motorleistung, Gewicht, Farbe), Warengruppe
Felder Tabelle "Artikel": ArtikelID, Name, Preis, Warengruppe
Felder Tabelle "Bewertung": ArtikelID, BewerteteEigenschaft, WERT, Username
Mit dem Feld Warengruppe kann nun für jede beliebige Artikelgruppe ein Berwertungsschema erstellt werden.
Mein Problem nun: Wie erstelle ich eine Webseite die für einen Artikel alle möglichen Eigenchaften aus "Schema" anzeigt (kein Problem) und außerdem Felder enthält um Werte einzugeben (Motorleistung=50kw, Fahrkomfort=4,...) und dieses dann in die Tabelle Bewertung abzuspeichern?
Hat da jemand einen Hinweis, Beispiel, howto,... für mich?
Danke
VolkerUnd Abends ein Glas Wein von AMAVINO
Antworten
-
Wow, da liegt einiges vor dir. Ich würde unten anfangen..
Datenmodell: Sie dir zuerst einmal folgendes Beispiel von SQL Server MVP Paul Nielsen an. Die Entitäten sind bei dir die Artikel, die Attribute die zu bewertende Eigenschaft in der Tabelle Schema und die Werte die Spalte Wert in der Tabelle Bewertung. Wobei ich diese Benennungen (Schema und Bewertung) ändern würde. Setze es um und befülle es mit Daten.
Datenzugriffsschicht (Data Access Layer DAL): Ohne Entity Framework oder eine Objekt-Relationalen-Mapper (ORM) wie NHibernate wird das auch ganz interessant. Du musst deine Datentransferobjekte (DTO, POCOs) erstellen und mit Inhalten aus der Datenbank befüllen.
Businesslogikschicht (Business Logic Layer): Hier gehört die "gesamte" Geschäftslogik rein.
Webservices (Service Facade): Hier werden die Komponenten der BLL so gebündelt, das sie eine möglichst eine einfache, aber sinnvolle Umsetzung in Webservices (Plural) finden.
Service Proxie: Für jeden Webservice brauchst du dann einen Service Proxy.
Präsentationsschicht: Kann schon deine WebForms-Anwendung sein, oder aber auch eine Zwischenschicht im Sinne von MVC und Verwandten.
Hier eine vereinfachte 3-Tier Übersicht.
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 19. Oktober 2012 16:41
-
Dann musst du dafür einen Webservice samt DTO schaffen, welcher genau das liefert. D.h. der den Zugriff auf deine Tabelle Schema erledigt.
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 19. Oktober 2012 16:41
Alle Antworten
-
-
Hallo Stefan,
das grundsätzlich ist ja kein Problem. In meinem Fall ist es ja so, dass
1. die Daten aus einer Tabelle kommen und das Ergebnis in eine andere geschrieben wird, was nicht wirklich problematisch ist.
2. ich im Vorfeld nicht weiss wieviele Felder ich brauche und somit die Eingabefelder dynamisch in der ASP-Seite erstellen muss.
Wie erstelle ich diese Eingabefelder? Und wie bennene ich diese, damit ich auf diese konkret zugreifen kann? Nimmt man dafür ein Steuerelement (dachte ggf. an Repeater) oder macht man das besser komplett "zu Fuss" in der Code-Behind-Datei?
Mir geht es nur draum von Anfang an einen ordentlichen/richtigen/bestpractice Ansatz zu finden.
Volker
Und Abends ein Glas Wein von AMAVINO
-
Also, ich interpretiere es so:
Du hast eine Tabelle "Schema" und eine Tabelle "Bewertung" (für was "Artikel" da ist, erschließt sich mir nicht). Die Datensätze in "Schema" sollen je Datensatz beliebig viele "Bewertungen" erhalten können(?).
Ich gehe nicht davon aus, daß beide Tabellen gleichzeitig editiert, resp. an sie Datensätze angefügt werden können(?) - ginge auch.
Dann würde ich einen "quick 'n' easy"-Weg gehen:
Du "haust" die Tabelle "Schema" in ein DataGrid (nur das die Datensätze erkennbar sind) und lässt darauf selektieren. In dem Moment, wo selektiert wurde, zeigst Du in einem DetaisView deine zugehörigen "Bewertungen" an (kannst ja paging nehmen) oder eben eine "EmptyDataTamplate" mit einem "New"-Command.
Ich hoffe, ich habe das richtig interpretiert(?). Sonst muß Du es noch mal erklären...
wjk-Software
-
Hallo Walter,
nah dran, aber nicht ganz so einfach. Ich kann nämlich im Vorfeld nicht sagen, welche Bewertungskriterien es gibt. Die möglichen Kriterien stehen in der Tabelle Schema. Die Tabelle Artikel enthält die Warengruppe, genauso wie die Tabelle Schema. Somit kann für jede Warengruppe ein eigenes Bewertungsschema angelegt werden (Motorleistung bei Warengruppe Rotwein macht irgendwie keinen Sinn).
Ich mach mal ein Besipiel:
Tabelle "Schema"
Warengruppe | BewerteteEigenschaft
PKW | Nutzlast
PKW | Motorleistung
PKW | Sitzbezug
Wein | Anbaugebiet
Wein | Alkoholgehalt
Wein | Farbe
Wein | Restzucker
Tabelle "Artikel"
ArtikelID | Name | Preis | Warengruppe
A1 | Golf | 15.000 | PKW
A2 | Panda | 9.000 | PKW
A3 | A4 | 25.000 | PKW
A4 | E280 | 45.000 | PKW
A5 | Chianti | 15 | Wein
A6 | Merlot | 9 | Wein
A7 | Lugana | 15 | Wein
Tabelle "Bewertung"
ArtikelID | BewerteteEigenschaft | WERT | Username
A1 | Nutzlast | 400 kg | volker
A1 | Motorleistung | 90 PS | volker
A1 | Sitzbezug | Leder | volker
A2 | Nutzlast | 300 kg | volker
A2 | Motorleistung | 40 PS | volker
A2 | Sitzbezug | Stoff | volker
A4 | Nutzlast | 400 kg | volker
A4 | Motorleistung | 190 PS | volker
A5 | Anbaugebiet | Toskana | volker
A5 | Farbe | rot | volker
A5 | Alkoholgehalt | 14% | volker
A7 | Anbaugebiet | Veneto | volker
A7 | Farbe | weiss | volker
Nun möchte ich den Artikel A6 "Merlot" bewerten. A6 hat die Warengruppe "Wein". Dir möglichen Bewertungen für Wein sind "Anbaugebiet, Alkoholgehalt, Farbe, Restzucker". Nun sollen diese Kriterien und die entsprechenden Werte in die Tabelle "Bewertung" eingetragen werden.
Es wäre natürlich einfach für jede bewerteteEigenschaft eine Spalte anzulegen. Aber da bin ich ziemlich schnell am Ende der möglichen Spalten und total unflexibel. Meine Idee ist eigentlich aus den Einträgen der Tabelle "Schema" für jede Warengruppe bei Bedarf eine temporäre Tabelle mit den bewertetenEigenschaften als Spaltenname zu erstellen.
Das würde dann für die Warengruppe "PKW" so aussehen:
Nutzlast | Motorleistung | Sitzbezug
Dies geht allerdings nur über eine Funktion im SQL-Server und dürfte für das Antwortverhalten der Website nicht gerade optimal sein.
Also wenn noch jemand eine vernünftige Idee hat, dann höre ich gerne zu.
Volker
Und Abends ein Glas Wein von AMAVINO
-
Hallo Volker,
meine Frage nach der Oberfläche, also wie das ganze zu Bedienen seien soll ist hier wichtiger, als das Modell - das ja wohl ein normales EAV-Modell ist. Wobei hier zu evaluieren ist, ob die Attribute wirklich dünn besetzt sind. Denn, wenn nicht, muss über man über die Datenmengen und damit die Performance nachdenken. Allerdings kommt das erst am Ende. Frei nach Don Knuth: Make it run, make it right, make it fast.
Auch die Frage der Technologie im Hintergrund ist auch wichtiger als das eigentliche Modell: ASP.NET, WebForms, MVC.. mit oder ohne Entity Framework..
-
Hallo Stefan,
ich seh schon ASP.NET erfordert offensichtlich eine andere Herangehensweise als ich das von Winforms und Desktop kenne.
Konkret sieht es so aus: SQL-Server als DB, Webforms, kein EF, später Bereitstellung der Businesslogik via Webservices. Vom Layout her soll man einen Artikel auswählen können und dann (wohl in einem UserWebcontrol) alle für diesen Artikel möglichen Bewertungen anzuzeigen und auch die Bewertung (Werte) einzutragen.
Wie gesagt habe ich da nicht so viel Erfahrung mit und wenn mir nun von erfahrenen Programmieren gesagt wird, dass ich das besser mit MVC oder EF lösen soll, dann nehme ich das gerne an und arbeite mich lieber gleich da ein.
VolkerUnd Abends ein Glas Wein von AMAVINO
-
Wow, da liegt einiges vor dir. Ich würde unten anfangen..
Datenmodell: Sie dir zuerst einmal folgendes Beispiel von SQL Server MVP Paul Nielsen an. Die Entitäten sind bei dir die Artikel, die Attribute die zu bewertende Eigenschaft in der Tabelle Schema und die Werte die Spalte Wert in der Tabelle Bewertung. Wobei ich diese Benennungen (Schema und Bewertung) ändern würde. Setze es um und befülle es mit Daten.
Datenzugriffsschicht (Data Access Layer DAL): Ohne Entity Framework oder eine Objekt-Relationalen-Mapper (ORM) wie NHibernate wird das auch ganz interessant. Du musst deine Datentransferobjekte (DTO, POCOs) erstellen und mit Inhalten aus der Datenbank befüllen.
Businesslogikschicht (Business Logic Layer): Hier gehört die "gesamte" Geschäftslogik rein.
Webservices (Service Facade): Hier werden die Komponenten der BLL so gebündelt, das sie eine möglichst eine einfache, aber sinnvolle Umsetzung in Webservices (Plural) finden.
Service Proxie: Für jeden Webservice brauchst du dann einen Service Proxy.
Präsentationsschicht: Kann schon deine WebForms-Anwendung sein, oder aber auch eine Zwischenschicht im Sinne von MVC und Verwandten.
Hier eine vereinfachte 3-Tier Übersicht.
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 19. Oktober 2012 16:41
-
Hallo Stefan,
Datenmodell ist kein Problem. Meines sieht in etwa auch so aus wie das von Paul (nur ein paar mehr Tabellen).
Datenzugriffsschicht zu erstellen sehe ich auch nicht als Problem an. Ich muss hier nur ein bißchen Rücksicht auf eine bestehende Datenbank (MS Dynamics NAV, ca. 1.000 Tabellen/Mandant, Zugriff diret via SQL oder Webservices) nehmen.
Wie sinnvoll die Trennung von Datenzugriffsschicht und Businesslogik ist dürfte ich schmerzhaft erfahren als ich mein erstes Kassenprogramm erstellt habe. Das passiert mir nicht noch mal.
Webservices sind ja auch nicht neu und stehen im ersten Gang auch nicht auf dem Plan, sollte aber natürlich bei der Planung berücksichtigt werden. Hier ist noch zu klären welche Art der Webservices am sinnvollsten ist, aber erst später.
Mein eigentliches Problem liegt ja in der Präsentationsschicht. In PHP würde ich einfach die Tabelle Schema abfragen und Input-Felder erstellen. Also praktisch so:
result="Select BewerteteEigenschaft from Schema where Warengruppe='PKW'"
foreach row in result {
echo "<input id='" . row.value . "'>";
}
womit dann etwa so etwas rauskommt:
<html>
<input id='Nutzlast'>
<input id='Motorleistung'>
<input id='Sitzbezug'>
</html>
Dann nach dem Absenden des Formulars alle Felder durchgehen und den SQL-String zusammensetzen.
Nun soll aber kein PHP sondern ASP.NET verwendet werden. Und ich kann mir nicht vorstellen, dass man so etwas immer noch zu Fuss machen muss. Ich hatte die Hoffnung, dass das eleganter geht.
VolkerUnd Abends ein Glas Wein von AMAVINO
-
Dann musst du dafür einen Webservice samt DTO schaffen, welcher genau das liefert. D.h. der den Zugriff auf deine Tabelle Schema erledigt.
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 19. Oktober 2012 16:41
-
Hallo Volker Straehle,
Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.