Einzelnen Beitrag anzeigen

Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#46

Re: Schnellste Insert Möglichkeit für eine DB?

  Alt 9. Mär 2010, 10:56
Moin,
ich weiß, es ist nicht gerade ideal gelöscht, aber wir bekommen halt eine Liste mit Namen von Schülern. Das heißt wir können nicht (was wesentlich besser ist) testen, ob eine PersonenID noch existiert, sondern stattdessen uns darauf verlassen, dass es keine zwei Personen mit den gleichen Vornamen und Nachnamen parallel gibt.

Und ich verstehe deine „SQL-Relevanz“ nicht. Das alles vor den BeginTransaction bereitet die Datenbank vor. Es ist halt nicht eben nur eine einfache Personenliste, sondern wir speichern zusätzlich auch die Kurse/Klassen der einzelnen Schüler. Dazu gibt es die Tabelle Kurse und Kurszuweisungen. Der erste Befehl, löscht nun alle Kurse, die ein Hauptkurs sind während der zweite Befehl dann alle Zuweisungen löschen soll. Das heißt er löscht die Information, welche Schüler in den Kursen waren, die gelöscht wurden. Okay ich glaube das muss andersherum ausgeführt werden.
Der dritte Befehl, setzt dann präventiv alle Schüler erst mal auf überflüssig (der Hauptkurs ist eben nicht 0, das sind die Lehrer) also Obsolet ist nicht 0.

So und dann kommen wir in den interessanten Bereich:
Nun gehen wir jede Klasse der Exceltabelle durch. Oben rechts steht dann immer "Herr/Frau ...", nagut das es immer 5 sind, ist nicht direkt gegeben, das schaue ich mir mal an, wie man das anders macht (wohl eher dann mit Pos etc.).

Also ermittelt er erstmal den Lehrer/die Lehrerin, wenn sie nicht existiert, MUSS sie erstellt werden, weil daraufhin dann wieder ein neuer Kurs angelegt wird und dieser MUSS umbedingt eine Valide LehrerID haben!

Dann geht er jeden Schüler dieses Kurses durch und liest den Namen ein und prüft, ob er bereits existiert. Wenn er nicht existiert (bzw. der Vorname und Nachname), dann ruft er iFügeSchülerHinzu auf, welche einen Schüler hinzufügt. Alternativ setzt er den Schüler auf nicht überflüssig (Obsolet = 0). Zusätzlich setzt er dann auch die neue HauptkursID.

Okay ich habe mich zu lange nicht damit beschäftigt, weshalb da nicht nur zwei SQL Statements vorkommen:
Um eine Person hinzufügen (das ist der Inhalt von iFuegeSchuelerHinzu):
INSERT INTO Personen(Name,Vorname,HauptKursID,Obsolet) VALUES ("AName", "AVorname" , 0, 0) So und für jede Person gilt das (das ist der Inhalt von WeiseHauptKursIDZuPIDZu, welche von iFuegeSchuelerHinzu aufgerufen wird!):
SQL-Code:
DELETE FROM Kurszuweisungen WHERE PersonenID = ASchuelerID AND KursID = AKursID
UPDATE Personen SET HauptKursID = AKursID WHERE PersonenID = APersonenID
INSERT INTO Kurszuweisungen (PersonenID, KursID) VALUES (ASchuelerID, AKursID)
Okay, das DELETE Statement ist überflüssig, weil wir zu Anfang da ja aufgeräumt haben.
Und Alle Werte mit A.... sind Variablen und beim hinzufügen der Person, bekomme ich die SchülerID zurückgegeben.

Und ganz zum Schluss, lösche ich dann alle Schüler, die obsolet markiert wurden.

Sofern das nicht weiter zu optimieren ist, lasse ich dennoch das GeneriereDoppelFortschritt( drin, damit der Anwender eine Rückmeldung bekommt.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat