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
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
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
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
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
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
Ich gehe davon aus, daß du 2 Tabellen hast, die miteinander verknüpft sind? wenn ja, dann musst du jede Tabelle einzeln updaten.
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
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
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
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
Hallo Christop, Danke für deine Antwort
dein Ansatz ist zwar interessant aber ich glaube nicht durchführbar.
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.
dies ist in Offline Varianten nicht durchführbar da du immer voraussetz das eine Datenbank vorhanden ist.
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