vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
Re: Doppeleintragungen sortieren 
Autor: Preisser
Datum: 19.10.10 17:38

Hallo,
ich hab dazu folgendes verwendet:
Form_Load:
ReDim PersDatensatzArr(500)
ReDim PersDatensatzIdxArr(500)
PersDatensatzArrCount = 0
Modul:
Option Explicit
 
Public Type MyPersDatensatz
    StrFeld1 As String
    StrFeld2 As String
    StrFeld3 As String
    StrFeld4 As String
    LngFeld1 As Long
End Type
 
Public PersDatensatzArr() As MyPersDatensatz
Public PersDatensatzIdxArr() As Long
Public PersDatensatzArrCount As Long
 
Public Function ComparePersDatensatz(ByRef d1 As MyPersDatensatz, ByRef d2 As _
  MyPersDatensatz) As Long
    '-1: 1. Datensatz < 2. Datensatz
    ' 0: 1. Datensatz = 2. Datensatz
    ' 1: 1. Datensatz > 2. Datensatz
    Dim tmp As Long
    ' Name vergleichen
    tmp = StrComp(d1.StrFeld1, d2.StrFeld1, vbBinaryCompare)
    If tmp = 0 Then
        tmp = StrComp(d1.StrFeld2, d2.StrFeld2, vbBinaryCompare)
        If tmp = 0 Then
            tmp = StrComp(d1.StrFeld3, d2.StrFeld3, vbBinaryCompare)
            If tmp = 0 Then
                tmp = StrComp(d1.StrFeld4, d2.StrFeld4, vbBinaryCompare)
                If tmp = 0 Then
                    tmp = CompareLng(d1.LngFeld1, d2.LngFeld1)
 
                End If
            End If
        End If
    End If
    ComparePersDatensatz = tmp
End Function
 
Private Function CompareLng(l1 As Long, l2 As Long)
    If l1 < l2 Then
        CompareLng = -1
    ElseIf l1 = l2 Then
        CompareLng = 0
    Else
        CompareLng = 1
    End If
End Function
 
 
Public Function FuegeDatensatzEinOhneDuplikat(Datensatz As MyPersDatensatz) As _
  Boolean
    'Zuerst nachsehen, ob Datensatz schon vorhanden
    Dim tmp As Long
    Dim retVal As Long
    tmp = BinaereSuche(Datensatz)
    If tmp < 0 Then 'Datensatz ist noch nicht vorhanden
        DatensatzEinfuegen Datensatz, -tmp - 1
        retVal = True
    Else 'Datensatz ist bereits vorhanden, daher nichts machen
        retVal = False
    End If
    FuegeDatensatzEinOhneDuplikat = retVal
End Function
 
' wenn Ret > 0, wurde Datensatz gefunden
'ansonsten  wird  (-Einfügepos - 1) zurückgegeben
Private Function BinaereSuche(Datensatz As MyPersDatensatz) As Long
    Dim Ergebnis As Long, UntereGrenze As Long, ObereGrenze As Long, Mitte As _
      Long, VerglErg As Long
    Dim retVal As Long
    UntereGrenze = 0
    ObereGrenze = PersDatensatzArrCount - 1
    Ergebnis = -1
 
    If PersDatensatzArrCount = 0 Then
        retVal = -1
    Else
 
        Do While UntereGrenze <= ObereGrenze And Ergebnis < 0
            Mitte = UntereGrenze + ((ObereGrenze - UntereGrenze) / 2)
            VerglErg = ComparePersDatensatz(PersDatensatzArr( _
              PersDatensatzIdxArr(Mitte)), Datensatz)
            If VerglErg < 0 Then 'rechts weitersuchen
                UntereGrenze = Mitte + 1
            ElseIf VerglErg > 0 Then 'links weitersuchen
                ObereGrenze = Mitte - 1
            Else ' gefunden
                Ergebnis = Mitte
            End If
 
        Loop
 
        If Ergebnis = -1 Then ' nicht in Liste, Einfügpos zurückgeben
            retVal = (-UntereGrenze - 1)
        Else 'Gefunden, Fundposition zurückgeben
            retVal = Ergebnis
        End If
 
    End If
 
    BinaereSuche = retVal
End Function
 
Private Sub DatensatzEinfuegen(Datensatz As MyPersDatensatz, EinfuegPos As Long)
    If UBound(PersDatensatzArr) <= PersDatensatzArrCount Then
        ReDim Preserve PersDatensatzArr(UBound(PersDatensatzArr) + 100)
        ReDim Preserve PersDatensatzIdxArr(UBound(PersDatensatzArr) + 100)
    End If
    ' Datensatz im normalen Array am Schluss einfügen
    PersDatensatzArr(PersDatensatzArrCount) = Datensatz
 
    ' Werte im Index-Array verschieben
    Dim i As Long
    For i = PersDatensatzArrCount - 1 To EinfuegPos Step -1
        PersDatensatzIdxArr(i + 1) = PersDatensatzIdxArr(i)
    Next
    PersDatensatzIdxArr(EinfuegPos) = PersDatensatzArrCount
    PersDatensatzArrCount = PersDatensatzArrCount + 1
End Sub
Zum Einfügen eines Datensatzes verwendete ich dann die Funktion FuegeDatensatzEinOhneDuplikat. Diese sieht zuerst nach, ob es bereits einen Datensatz mit den gleichen Werten gibt. Wenn ja, gibt sie False zurück und fügt ihn nicht hinzu, ansonsten schon. Dazu dient die Funktion BinaereSuche.
Die Funktion ComparePersDatensatz ordnet Datensätze unter einem bestimmten Sortierkriterium an. Man kann das natürlich noch ändern, falls z.B. Groß-/Kleinschreibung unwichtig ist, müsste man noch eine eigene StrComp-Funktion schreiben (die wird dann allerdings nicht mehr ganz so schnell sein, die die von VB).
Falls du allerdings willst, dass ein Datensatz, der schon vorhanden ist, in einer geänderten Form hinzugefügt wird (an die Stelle nach dem bereits vorhandenen Datensatz), müsste man noch ein 2. Index-Array verwenden.
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Doppeleintragungen sortieren2.503dj.tommy11.10.10 20:21
Re: Doppeleintragungen sortieren1.763Blackbox11.10.10 20:26
Re: Doppeleintragungen sortieren1.767dj.tommy11.10.10 20:42
Re: Doppeleintragungen sortieren1.765Blackbox11.10.10 20:52
Re: Doppeleintragungen sortieren1.737dj.tommy11.10.10 21:45
Re: Doppeleintragungen sortieren1.737Franki12.10.10 02:08
Re: Doppeleintragungen sortieren1.897dj.tommy12.10.10 13:55
Re: Doppeleintragungen sortieren1.734Dirk12.10.10 17:14
Re: Doppeleintragungen sortieren1.730Blackbox12.10.10 18:31
Re: Doppeleintragungen sortieren1.718Franki13.10.10 02:39
Re: Doppeleintragungen sortieren1.737Franki13.10.10 02:34
Re: Doppeleintragungen sortieren1.809Preisser13.10.10 12:39
Re: Doppeleintragungen sortieren1.742Franki14.10.10 05:08
Re: Doppeleintragungen sortieren1.767Preisser14.10.10 12:05
Re: Doppeleintragungen sortieren1.708Preisser14.10.10 17:27
Re: Doppeleintragungen sortieren1.721dj.tommy18.10.10 18:36
Re: Doppeleintragungen sortieren1.795Preisser19.10.10 17:38
Re: Doppeleintragungen sortieren1.695dj.tommy19.10.10 17:49
Re: Doppeleintragungen sortieren1.776wb-soft11.10.10 21:22

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel