Tabelle bearbeiten

Cpt_Sulo

Erfahrenes Mitglied
Hey,

folgendes Problem:

Spalten --> [Name],[punkte]
Ich möchte aus einer Tabelle alle Zeilen mit gleichem "Namen" löschen, aber nur genau den Eintrag mit weniger Punkten. Also der Name kommt doppelt vor und der mit weniger Punkten soll weg!

Bin für Ideen sehr dankba r:confused:
 
mir fällt dazu nur ein jede Zeile in einem Recordset zu prüfen und wenn die gleich sind dann dass mit weniger punkten zu löschen

also etwa so

Visual Basic:
dim vergleich as string
set res = Db.Openrecordset("Select [name] From [Tabelle] order by [name] desc")
' order by damit die mit den mehreren Punkten zuerst stehen.
while not res.eof
  if replace(vergleich,".","") = Replace(res!Name,".","") then 
  'zum Vergleich die punkte eleminieren.
  if len(vergleich) > len(res!name) then
  'ich meine dieser vergleich ist überflüssig
  Res!Name = "TODELETE"
  res.update
  end if
  else 
  vergleich=res!Name
  end if
  res.movenext
wend
res.close
db.Execute ("Delete From [TAbelle] where [Name] = 'TODELETE' "

Ist ungetestet aber sollte prinzipiell so funktionieren. Ich würde erst alle datensätze markieren weil es manchmal zu seltsamen effekten kommt wenn man beim durchschleifen durch ein Recordset noch Elemente löscht.

Grüsse bb
 
Hey brain,

vielen Dank schonmal für deine Mühe!
Ich bekomme allerdings noch einen Fehler den ich nicht wirklich identifizieren kann....
PHP:
Set db = New ADODB.Connection

    db.CursorLocation = adUseClient
    db.Provider = "Microsoft.Jet.OLEDB.4.0"
    db.Open "c:\users\****\Test.mdb"
    
    Dim vergleich As String
    Set res = db.OpenRecordset("Select [Name] From Runde1 order by [Name] desc")
"Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind miteinander unvereinbar.
Laufzeitfehler '3001' "
Der Debugger zeigt auf die Set res = ... Zeile..

Und ich würde gerne die Replace-Funktion verstehen:
PHP:
If Replace(vergleich, ".", "") = Replace(res!Name, ".", "") Then

Was soll den in vergleich durch REPLACE ersetzt werden?

Thx
 
So, ich habe noch ein paar Sachen per Google gefunden, es scheint an der Methode zum aufrufen des Recordsets gelegen zu haben.

So funktioniert der Code:
Code:
Dim vergleich As String
    
    RS.Open "Select [Name] From " & V.TblName & " order by [Name] desc", db, adOpenStatic, adLockOptimistic
    ' order by damit die mit den mehreren Punkten zuerst stehen.
    While Not RS.EOF
        If Replace(vergleich, "", "") = Replace(RS!Name, "", "") Then
        'zum Vergleich die punkte eleminieren.
            If Len(vergleich) > Len(RS!Name) Then
            'ich meine dieser vergleich ist überflüssig
            RS!Name = "TODELETE"
            RS.Update
            End If
        Else
            vergleich = RS!Name
        End If
        
    RS.MoveNext
    Wend
    RS.Close
Aaaber, so ganz richtig klappts noch nicht. Jetzt ist nur ein Name, der doppelt vorkommt als "TODELETE" markiert worden. Aber beide mal!
Code:
SID    Name	                     Flugzeugtyp	LigaPunkte
1       Andreas Thiessen         Discus                      102,58
2	Christian S. Lang          Std. Libelle                  91,3
3	Hubertus Huttel             Duo Discus                 93,45
4	TODELETE                   Discus 2                     87,48
5	Klaus Ditges                 LS 3                           87,33
6	Gerhard Rademacher     LS 1 f                         82,23
7	Hans-Jürgen Köhler        LS 4                          87,36
10	Michael Elvermann        Discus                      103,02
37	Hans-Jürgen Köhler       LS 4                           80,7
40	Klaus Ditges                 LS 3                           79,87
41	Michael Elvermann         Discus                       80,28
43	Christian S. Lang           Std. Libelle                 67,59
47	TODELETE                   Discus 2/18m             90,67

Die beiden markierten Einträgen beinhalteten den selben Namen.
Bin dankbar für Ideen, ich komme noch nicht drauf!

Thx Coder ;)
 
Zuletzt bearbeitet:
mit dem replace sollten die Punkte ersetzt werden. Da du ja geschrieben hast das du den mit den "mehr" Punkten behalten wolltest.

Als idee kann ich dir nur sagen, geh mal im einzelschritt durch

Grüsse bb

[edit]

Ich hatte dich wohl bei den Punkten falsch verstanden. Demnach musst du das Punkte Feld natürlich auch vergleichen !!

Ausserdem geht es dann evtl auch direkt durch ein sql

etwa so

SQL:
Delete From Tabelle1 as a where Count(a.name)>1 and a.Punkte = (Select Min(b.punkte) From Tabelle1 as b  Where b.name = a.name) 

-- oder über einen Join mit sich selbst

Delete From Tabelle1 as a Inner Join  Tabelle1 as b on a.Name = b.Name 
having count (a.name) >1 and a.Punkte < b.Punkte

auch wieder ungetested

Grüsse bb
 
Zuletzt bearbeitet:
Hey,

interessantes Missverständnis mit den Punkten ;p Wirklich vielen vielen Dank für deine Hilfe.
Bei deiner letzten Idee hats Fehler gehagelt.
Ich hatte schon begonnen noch eine andere Lösung zu suchen. Und es klappt!
Das hier ist mit Sicherheit eine stümperhafte Variante, nur da es sich auch bei dieser Auswertung um maximal 100 Datensätze handelt...
Code:
RS.Open "Select [Name],Ligapunkte From " & V.TblName & " order by [Name]", db, adOpenStatic, adLockOptimistic
    While Not RS.EOF
        vergl1 = RS!Name
        spd1 = RS!Ligapunkte
        RS.MoveNext
        
        If Not RS.EOF Then
            vergl2 = RS!Name
            spd2 = RS!Ligapunkte
            If (vergl1 Like vergl2) Then
            
                If (spd1 >= spd2) Then
                    RS!Name = "TODELETE"
                    RS.Update
                Else
                    RS.MovePrevious
                    RS!Name = "TODELETE"
                    RS.Update
                End If
            End If
        End If
    Wend
    
    RS.MoveFirst
    While Not RS.EOF
        db.Execute ("Delete From " & V.TblName & " where [Name] = 'TODELETE'")
        RS.MoveNext
    Wend
    RS.Close

Also nochmal vielen Dank und bis zum nächsten mal!

:D
 
Hallo Captain,

bei Deinem Beispiel fällt mir vor allem der Like Operator auf. Den solltest Du in jedem Fall durch ein "="-Zeichen ersetzen, denn mit Like können auch Muster verglichen werden. Es ist also möglich, dass ungleiche Namen als gleich erkannt werden, wenn bestimmte Zeichen darin vorhommen. Und das ist in diesem Fall ja nun wirklich nicht gewünscht.

Grundsätzlich ist eine SQL-Lösung, wie bb sie vorgeschlagen hat, eleganter und schneller, aber bei 100 Datensätzen ist das letztlich egal.

Grüsse
ronaldh
 

Neue Beiträge

Zurück