Übereinstimmungen ermitteln...

magic_halli

Erfahrenes Mitglied
Hi,

ich lasse mir mittels folgenden String ermitteln, ob für vorher berechnete Werte, welche dann in die DB gespeichert werden sollen, bereits exakt gleiche Werte in der DB stehen:

Code:
Dim sql_check As String = "Select COUNT(*) From vw_in_stamm_vorhanden Where IDraum='" & idraum & "' AND IDbez='" & idbez & "' AND IDmat='" & idmat & "' "
Dim cmd_check As New SqlCommand(sql_check, planconn)
...
Dim check As Integer
check = cmd_check.ExecuteScalar
if check > 0 then
   'Übereinstimmung in DB vorhanden
...
end if


Wenn nun schon eine Übereinstimmung vorhanden ist, dann soll die Variable idbez (die weiter oben schonmal ermittelt wurde) neu ermittelt werden. Diese soll dann so sein, dass sie noch gar nicht in der DB vorhanden ist!

Leider weiß ich nicht genau, wie ich das anstellen könnte.
Die Variable idbez ermittle ich noch vor dem SQL-String aus einem DataRow-Array wie folgt:

Code:
Dim dr_bez() As DataRow = ds_bez.Tables("beziehungen").Select()
idbez = dr_bez(i)("IDbez")


Mit welchen Mitteln kann ich diese neu berechnen, in Hinblick auf die Vermeidung von Übereinstimmungen?
Es dürfen keine Doppelbelegungen dieser Variable in der DB vorkommen!

Bitte helft mir, Danke Rico.
 
Was für einen Wert hat denn diese Variable in der Datenbank? Integer - varchar .... ? Und hängt der Wert dieser Variablen von anderen Werten ab?
 
Es sind alles integer-Werte. Diese Werte, welche mit Count(*) verglichen werden, sind unabhängig voneinander.
Es dürfen aber keine Konstellationen doppelt vorkommen... dies will ich abfangen, indem ich vorm eintragen der verschiedenen Werte(diese werden mit VB.NET in einer aspx-Seite errechnet) diese auf Doppelbelegungen überprüfe. Wenn noch nicht vorhanden, dann werden diese in die DB eingetragen, andernfalls soll eine neue 'idper' errechnet werden, welche nicht zu einer Doppelbelegung führt!

Ich weiß aber nicht, wie ich diese idper dann so berechne, dass ein Wert rauskommt, welcher eben nicht zu einer anderen Doppelbelegung führt! Muß ich das Count(*) und die Wertermittlung in einer Schleife schreiben oder sonst was...?
 
Hm - da fängt das Design schon in der Datenbank an. Ist der Wert idper eine eindeutige ID der immer erhöht wird? In dem Fall würde ich den maximalen Wert aus der Datenbank auslesen (also der dort gespeichert ist) und diesem +1 mitgeben. Dann hast du der Variablen den nächst höheren Wert zugewiesen.

Dies kannst du mit der SQL-Aggregatfunktion MAX erreichen, also 'SELECT MAX(idper) FROM <datenbank>' - auslesen geht dann wieder mit executescalar.

Wenn du die DB gleichzeitig updaten willst und die idper automatisch dann vergeben willst kannst du evtl. folgenden Code nehmen (hab ihn nicht getestet aber sollte funktionieren ;) )

'INSERT INTO <datenbank> (idper, <spaltennamen>) VALUES (((SELECT MAX(idper) FROM <datenbank>)+1), <weitere Werte wenn vorhanden>)

Hoffe war verständlich ;)
 
...Hab grad gesehen: Meine Variable heißt idbez! Habs vorhin falsch geschrieben (nur infohalber). ;)

Diese idbez ist in der DB tatsächlich eine eindeutige ID... es gibt genau 70 Datensätze mit dieser eindeutigen ID. Dahinter verbirgt sich ein Zeitfenster aus Zeit, Tag und Zyklus (Zyklus kann Zyklus1 oder Zyklus2 sein). Anhand der vorhandenen Zeiten, Tage und Zyklen ergeben sich für mein Projekt 70 eindeutige Zeitkonstellationen - nicht mehr, nicht weniger. Ich habe nur diese 70 Datensätze zur Verfügung - das reicht auch aus in meinem Fall.
Also kann ich leider nicht so einfach zum MAX eine 1 addieren...

Ich möchte aber meine Variable idbez bei der Ermittlung so zuordnen, dass diese in der DB-Table (in der "Insert-Table") später nur einmal vorkommt. Diese soll Personen zugeordnet werden, die in einem Raum mit einer Klasse eine Veranstalltung halten und somit wird die Zeit der Veranstalltung eindeutig festgelegt! ...denn es kann immer nur EINE Person zu EINER Zeit eine Veranstalltung halten! Darum dreht sich die ganze Sache...
 
Hmm - da sieht die Sache natürlich ein wenig anders aus. Also so etwas wie ein Stundenplan soll das werden?

Da denke ich leider - wenn dein Code schon zu weit fortgeschritten ist - wirst du um einen Array und einen Loopvergleich nicht herumkommen. Ich hätte das vom Ansatz her anders gelöst - je nachdem wer die Veranstaltungen einträgt ;) hätte ich dem User nur die Zeiten angezeigt welche überhaupt noch frei sind. Alle anderen hätte ich von vornherein gesperrt. Oder darf ein User nur eine Zeit haben? Selbst dann kannst du das sperren von vornherein indem du einfach eine Spalte in die Datenbank setzt (tinyint) mit "1" - Zeitraum vergeben oder "0" - Zeitraum noch frei.

Dann hast du von vornherein keine Probleme beim Eintragen. So kannst du jetzt alle Datensätze im Nachhinein abprüfen und mit einem Datareader durchlesen lassen und überprüfen.
 
...Ich mache das bisher wie folgt.
Ich ermittle zuerst eine idbez aus einem DataRow-Array und einen Raum bzw. idraum, auch aus einem DataRow-Array:
Code:
Dim dr_bez() As DataRow = ds_bez.Tables("beziehungen").Select()
idbez = dr_bez(i)("IDbez")
'Räume zuordnen; wenn dr_raum zu Ende und noch Beziehungen offen, dann beginnt Durchlauf von vorn
Dim dr_raum() As DataRow = ds_raum.Tables("raum").Select("kurz = 'V' AND sitze >= '" & anzahl & "' ")
Dim rowCount_raum As Integer
rowCount_raum = 0
        If dr_raum.Length = rowCount_raum Then
                            rowCount_raum = 0
        End If
idraum = dr_raum(rowCount_raum)("IDraum")
rowCount_raum = rowCount_raum + 1
...
Dann checke ich, ob schon eine Übereinstimmung aufgrund der eben ermittelten Werte in der DB besteht und ermittle gleichzeitig, wenn dies der Fall ist, eine neue idbez:
Code:
'Überprüfen, ob schon gleiche Belegungen vorhanden sind
Dim sql_check As String = "Select COUNT(*) From vw_in_stamm_vorhanden Where IDraum='" & idraum & "' AND IDbez='" & idbez & "' AND IDmat='" & idmat & "' "
Dim cmd_check As New SqlCommand(sql_check, planconn)
planconn.Open()
Dim check As Integer
check = cmd_check.ExecuteScalar
planconn.Close()
   If check > 0 Then
                            Dim dr_bez2() As DataRow = ds_bez.Tables("beziehungen").Select("Idbez <> '" & idbez & "' ")
                            Dim rowCount_bez2 As Integer
                            idbez = dr_bez2(i)("IDbez")

                            'neuen Raum auslesen
                            Dim dr_raum1() As DataRow = ds_raum.Tables("raum").Select("IDraum<>'" & idraum & "' AND kurz = 'V' AND sitze >= '" & anzahl & "' ")
                            Dim rowCount_raum1 As Integer
                            rowCount_raum1 = 0
                            If dr_raum1.Length = rowCount_raum1 Then
                                rowCount_raum1 = 0
                            End If
                            idraum = dr_raum1(rowCount_raum1)("IDraum")
                            rowCount_raum1 = rowCount_raum1 + 1
End If
...
jetzt kommt mein Insert-String und fertig ist der Mist ;) !
Allerdings kann ja bei der Neuermittlung der idbez eine Zahl rauskommen, die in dem Select COUNT(*) nicht überprüft wurde und somit kommt wieder eine Doppelbelegung zustande. Wie kann ich das umgehen bzw. den Überprüfungsalgorithmus so gestallten, dass nur idbez ermittelt werden, die noch gar nicht mit den Konstellationen in der DB vorkommen?

HILFE! Rico.
 
Gib mir doch mal bitte die Variablen in deiner DB und die du einträgst. Und wie hast du das gelöst dass der User seine Daten eintragen kann?
 
Ich habe eine Eingabemaske, in der für vorhandene Personen (in der DB bereits gespeichert) die angebotenen Lehrveranstaltungen inkl. der Anzahl der Wochenstunden und die Klasse eingetragen werden. Dies alles erfolgt über DropDowns. In diesen werden all die Daten angezeigt, die bereits in der DB fest gespeichert sind... Anhand dieser Eintragungen sollen zu jedem Eintrag (entsprechend der Anzahl der Wochenstunden) eine idbez (=eindeutiges Zeitfenster) und eine idraum (Unterrichtszimmer) ermittelt werden. Diese dürfen sich bei gleichen Klassen zu einem Lehrer jedoch nicht überschneiden. Deshalb ist die einzige Möglichkeit die idbez zu variieren.

Ich trage in die Db idbez (int) und idraum (int) ein, bzw. diese werden als einzige automatisch zugeordnet(von dem Algorithmus). Die Eintragungen aus der Eingabemaske sind allgemein gehalten und fehlerfrei - dort liegt auch nicht das Problem...

Es soll nur geschaut werden, wenn eine Klasse(idmat) in einem Raum(idraum) zu einer Zeit (idbez) unterrichtet wird und genau diese Konstellation der Werte schon in der Tabelle für den Plan steht, dann soll eine idbez ausgewählt werden, die so in dieser Konstellation noch nicht vorkommt... Daran verzweifle ich mittlerweile (der Quellcode ist derjenige, welcher sich darum dreht - überprüfen, evtl. idbez ändern und eintragen).
Ich kanns aber nicht so programmieren, wie es "gesprochen" sein soll - mir fehlen entweder die Befehle oder die Kenntnisse?! :(
 
Hmm - ehrlich gesagt überlege ich gerade wie schwer das ist und ob ich es richtig verstanden habe (;) nicht persönlich nehmen - hab meine Lehrer früher auch nie verstanden und sie mich auch nicht *g*).

Ich hab dir mal ne private Nachricht mit meiner Nummer geschickt. Kannst mir das ja da mal erklären - ansonsten schau ich es mir das Wochenende bei Gelegenheit mal an. :)
 
Zurück