Autor Beitrag
Hetzer
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 26.06.16 14:39 
...


Zuletzt bearbeitet von Hetzer am Mo 27.06.16 23:19, insgesamt 2-mal bearbeitet
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4706
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 26.06.16 15:08 
Zitat:
Ich habe nun 3 Listen angelegt, die die Daten der einzelnen Tabellen enthalten.

Das klingt falsch insbesondere wenn du dagegen was prüfen willst.
a.) Da es bedeutet das du alle Daten der Datenbank auch lokal haben musst. Das will man üblicherweise nicht. Und
b.) das wenn es sich um ein Multiuser-System handelt das was du in den Listen an Daten aus der Datenbank hältst nicht mehr mit dem übereinstimmen muss was tatsächlich in der Datenbank ist.
Jegliche Prüfung dagegen ist also potentiell zu aufwendig und dazu auch noch potentiell falsch.

Zitat:
Ist die Adresse bereits in der Tabelle der Adressen enthalten, so wird sie nicht erneut zugefügt.
Ist der Ort bereits in der Tabelle der Orte enthalten, so wird er nicht erneut hinzugefügt.
Ist die Person bereits in der Datenbank enthalten, so wird eine Ausnahme geworfen.
Falls beim Schreiben des neuen Datensatzes in die Datenbank ein Fehler auftritt, wird der neue Datensatz verworfen und eine Ausnahme geworfen.


Mit den Angaben lässt sich fast sinnvoll arbeiten. Du musst eigentlich nur noch definieren was Gleichheit bedeutet.
Bei Adresse und Ort ist das eindeutig bei Person nicht. Name/Vorname sind bei Personen nicht eindeutig. Sollen wir für diesen Übungs(?)fall einfach annehmen das Personene eindeutig Namen haben?

Um das zu verstehen noch folgende Einzelfragen/Feststellungen

Zitat:
Ist die Adresse bereits in der Tabelle der Adressen enthalten, so wird sie nicht erneut zugefügt.


Hält deine Adresse Klasse nicht auch eine Id? Wenn die Id drin steckt bedeutet das doch das die aus der Datenbank kommt und damit existiert. Ich vermute mal das Adressen unabhängig von Personen existieren und damit sich die Adresse hinter einer AdressID niemals ändert oder gelöscht wird (oder zumindest aus anderen Gründen als das sich die Adresse einer Person ändert). Alles was du tun musst ist also zu prüfen ob deine Adresse eine AdressID hat oder nicht. Oder darf mann in deinem System Adressen frei eingeben und man kann eine Adresse haben aber ohne eine AdressId und muss jetzt erst nachträglich feststellen das diese Strasse/Hausnummerkombi in der Datenbank existiert und dessen AdressId herausfinden?

... to be continued (erstmal weiter das Spiel gucken ;) )
Hetzer Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 26.06.16 15:22 
...


Zuletzt bearbeitet von Hetzer am Mo 27.06.16 23:20, insgesamt 1-mal bearbeitet
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4706
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 26.06.16 16:16 
Zitat:
Wie löst man es dann?


Unique Index auf Vorname/Name in der Datenbank. Wenn man die Person dann wegen einer Indexverletzung gegen diesen Index nicht anlegen darf gab es diese Person halt schon. Je nach gewünschten Systemverhalten bezüglich Adresse/Ort kann man das dort genauso handhaben oder ein Datenbank spezifisches Konstrukt benutzen der einem "Insert or do nothing" entspricht. Das gibt es im Standard Sql nicht viele Datenbanken haben da aber einen proprietären Konstrukt der das kann. Wenn du für Adresse/Ort schon eine Id hast dann weißt du ja bereits das Adresse/Ort existiert und kannst die Prüfen/Anlegen von irgendwas gleich sparen und dich nur um die Person kümmern.
Hetzer Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 26.06.16 17:00 
...


Zuletzt bearbeitet von Hetzer am Mo 27.06.16 23:21, insgesamt 1-mal bearbeitet
papa69
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 79
Erhaltene Danke: 23

Win 10, Ubuntu
C#, Java, C
BeitragVerfasst: So 26.06.16 17:24 
Der Tipp deines Kollegen ist (wohl) richtig.

Diese 3 for-Schleifen sollten vlt. nur verschachtelt sein:

Zuerst prüftst du (durch Iteration durch deine List<Person>) ob diese Person (schon) vorhanden ist.
Wenn »nein», dann prüfst du, ob die Strasse schon vorhanden ist (List<Adresse>)
falls »ja», prüffen, ob sich diese Starasse in einem bekannten Ort (List<Ort>) befindet

Die entsrechenden ID's hängst du dann entsprechend an bzw.fügst neue hinzu

_________________
Daniel Bauer
... fatal ist nur, wenn sich das Licht am Ende des Tunnels als entgegenkommender ICE entpuppt ...
Hetzer Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 26.06.16 18:06 
...


Zuletzt bearbeitet von Hetzer am Mo 27.06.16 23:21, insgesamt 1-mal bearbeitet
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4706
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 26.06.16 19:24 
Zitat:
So, hab mich mal daran versucht...meinst du/ihr es stimmt, oder könnten irgendwo noch fehler auftauchen?


Hast du es denn selbst ausprobiert und gesehen ob es funktioniert? Wenn ja wie hast du es probiert?

- Hast du in deinen Klassen für Person/Adresse/Ort die Equals Methode überschrieben? Wenn nicht lies nochmal nach was die tut.
- 2mal über jede Liste zu iterieren ist irgendwie mindestens 1mal zuviel. List<T> das du für die Listen benutzt hat eine Contains Methode. Wenn du die benutzt musst du gar nicht iterieren.
Die Methode braucht aber ebenso eine richtig überschriebene Equals Methode damit das funktioniert.
- Variablennamen sollten nicht lügen ;) du nennst auch die DataRow für Ort/Adressen neuePersonRow das verwirrt wenn der Code komplexer wird.
- Du solltest Dinge nicht als object Variable deklarieren wenn du es besser weißt. Z.B. aus der orte Liste kommen Ort Instanzen dann kannst du die Variable auch entsprechend definieren (genauso bei den anderen Listen)
Hetzer Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 26.06.16 19:38 
...


Zuletzt bearbeitet von Hetzer am Mo 27.06.16 23:22, insgesamt 1-mal bearbeitet
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4706
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 26.06.16 20:06 
Zitat:
Zu 2.: Ich meine, das haben wir noch garnicht behandelt. 2 mal über jede Liste zu iterieren, wäre zwar umständlich, aber es kommt dennoch auf das richtige Ergenis hinaus, oder?

Kann. Wäre aber weiterhin überflüssig.
Ich sage kann weil für mich das ganze mit 2mal iterieren zu undurchsichtig ist um zu beurteilen ob das trotzdem funktioniert.
Ich vermute mal du machst das um irgendwie die passend Id für einen neuen Datensatz zu bestimmen. Das ist überflüssig. Nach deiner eigenen Aussage wird zu Adresse/Ort immer nur hinzugefügt. Dann sollte die nächste freie Id immer einfach Liste.count sein. Also im Falle von Orte einfach orte.count.
Dir ist bewusst das ein break nur die inner Schleife beendet?
Zitat:
Zu 4.: Was meinst du genau damit?!

z.B. object o = orte[i]
orte ist vermutlich als List<Ort> definiert. Du weißt also das da Ort oder eine Ableitung von Ort rauskommt (zwangsweise). Du solltest die Variable dann auch vom Typ Ort definieren und nicht object.
Dann läufst du keine Gefahr bei zum Beispiel überdeckten Methode die falsche zu nehmen. Oder je nachdem welche Variante von Equals du überschrieben hast (die aus object oder die die du über eine Implementierung von IEquatable bekommst) könnte jetzt die falsche herangezogen werden.
Heißt jetzt nicht das das was du an der Stelle machst etwas falsches liefert. Den konkretesten Variablentyp hier zu nehmen den man sicher annehmen kann ist nur defensiv gedacht und vermeidet potentielle Fehler.