Laden...

Datensätze für Haupt und Untertabelle anlegen

Erstellt von LastGentleman vor 17 Jahren Letzter Beitrag vor 16 Jahren 3.503 Views
LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 17 Jahren
Datensätze für Haupt und Untertabelle anlegen

Hallo zusammen,

ich spiele mich gerade mit dem Compact SQL Server rum und möchte mir ein paar Testfälle generieren, da bin ich auf eine Problem gestoßen und ich finde einfach nichts.

Ist sicher ganz einfach weil man es eigentlich dauernd braucht.

Ich hab einen Hauptdatensatz Adressen und dazu n Unterdatensätze, anlegen mach ich folgendermaßen:

RP_DBDataSet.AdressenRow row = m_RP_DBDataSet.Adressen.NewAdressenRow();
row.Vorname = "Andreas";
row.Nachname = "Hoffmann";
long l_Nr_Adresse = row.Nr;
m_RP_DBDataSet.Adressen.Rows.Add(row);

Wie bekomme ich aber zu diesen Datensatz Unterdatensätze angelegt?

Für hilfe wäre ich sehr dankbar.
Liebe Grüße
LastGentleman

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

F
171 Beiträge seit 2006
vor 17 Jahren

Hallo LastGentlement,

Wie sieht deine Struktur aus?

Unabhängig davon würde ich es so aufbauen:

Tabelle
Spalte id, Spalte parentid, name, wohnort, etc.
1, NULL, etc;
2, NULL, etc;
3, 2, etc;
4, 2, etc;

bedeutet, dass die erste Adresse ist z.B.: die Meldeadresse. Die zweite ebenfalls.
Die 3. und 4. ist eine Unteradresse von 2 z.B.: Lieferadresse oder Rechnungsanschrift. Das könnte noch ausgebaut werden wie z.B.: Art der Adresse.

Na, dann ist es eigendlich doch einfach. ODER?

Gruß falangkinjau

LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 17 Jahren

Ich hab Adressen Nr, Name
->die haben Belege Nr, Nr_Adresse, Anzahl

ich möchte nun eine Adresse anlegen und dann zu der Adresse 10 Belege. Wenn ich nun eine Adressse anlege habe ich noch keinen Nr Wert, was muss man dann in dem Feld Nr_Adresse eintragen?

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 17 Jahren

Kann man das irgenwie über die GetChildRows() machen?

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 17 Jahren

Hallo ich hab die Befürchtung das ich an das Problem vielleicht falsch dran gehe, in der "guten" alten DAO zeit hätte ich es so gemacht.
Ich würde den Code so befüllen wie ich es mit einem Master/Detail Dokumente machen würde.


dim rs as recordset
dim rs2 as recrodset
dim l_id as long

rs.AddNew
rs("...") = "..."
l_id = rs("id")
rs.update

rs2.AddNew
rs2("Nr_Tabelle1") = l_id
rs2("...") =  "..."
rs2.update

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 16 Jahren

Ich wollte diesen Thread nochmal aufwärmen. Ich glaub ich stehe irgendwie auf dem Schlauch oder ich mache das falsch.
Sowas mache ich in Access fast täglich aber ich finde keine vernünfige Lösung für ADO.Net.

Liebe Grüße
LastGentleman

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

J
163 Beiträge seit 2007
vor 16 Jahren

Ich gehe davon aus, daß du 2 Tabellen hast, die miteinander verknüpft sind? wenn ja, dann musst du jede Tabelle einzeln updaten.

LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 16 Jahren

Ja danke Jonny für deine Antwort.

Mir ist nur nicht ganz klar was ich in das Feld für die Relation eintrage. Ich hab da ja noch keinen Auto-Wert da drinnen stehen, der wird ja erst beim Insert generiert.

Edit: Ups. nicht update sondern insert

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

365 Beiträge seit 2004
vor 16 Jahren

Hallo LastGentleman,

ich weiß nicht, ob ich dein Problem richtig verstanden habe aber meines Erachtens musst du doch einfach nur eine DataRelation für die beiden Tabellen anlegen:


 DataSet.Relations.Add("Master2Detail", new DataColumn[] { DataSet.Tables["master"].Columns["ID"]}, new DataColumn[] { DataSet.Tables["details"].Columns["ID"]});

Gruß

Christoph

LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 16 Jahren

Aha, ADO.Net geht also her und setzt dann alle Relationen um. Wenn also in der Haupt ID eine 6 eingetragen wird (im DS 5) dann trägt wandelt alle in den Relationsfelder in eine 6 um. Richtig?

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

365 Beiträge seit 2004
vor 16 Jahren

Also sobald ein Detaildatensatz zu einem Masterdatensatz generiert wird, übernimmt er für den Detaildatensatz die ID aus dem Master.

Ich mache das allerdings immer so, dass ich die Detaildatensätze erst anlege, wenn der Master bereits gespeichert wurde (und seinen Autowert von der DB bekommen hat).

Du könntest aber sicher auch erstmal mit nem DefaultValue von 0 arbeiten, den würde er dann auch für die Details übernehmen. wenn du dann speicherst sollte er eigentlich die neue ID auch an die Detaildatensätze durchreichen...soweit die Theorie 😉

Gruß

Christoph

LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 16 Jahren

Hallo Christop, Danke für deine Antwort
dein Ansatz ist zwar interessant aber ich glaube nicht durchführbar.

  1. hat der Haupt und Unterdatensatz meist eine Referenzielle Integrität, d.h. es muss zu jeden Unterdatensatz eine Hauptdatensatz anglegt sein, wenn aber das Feld den Wert 0 hat dann ist dies ja nicht gegeben.

  2. dies ist in Offline Varianten nicht durchführbar da du immer voraussetz das eine Datenbank vorhanden ist.

  3. der Gedanke von Microsoft ist sowenige concurrent Connections auf die Datenbank zu haben, da kommt natürlich immer wenn ich einen Datensatz anlegen möchte das mir in die Quere.

Liebe Grüße
LastGentleman

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein