Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Visual Basic 6.0 / VBA » Code funktioniert nur manchmal

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
02.09.2005, 10:43 Uhr
~Gaschd
Gast


hallo,

hier eine frage, die mir wahrscheinlich nur ein echter crack beantworten kann. ich habe in access-vba ein modul implementiert, das datensätze nach jahren aufsplittet (funktioniert problemlos) un dann doppelte einträge löschen soll, allerdings nicht einfach einen von beiden, sondern den, der in einer bestimmten spalte den niedrigeren wert enthält. erstmal der code zum veranschaulichen:

Visual Basic:
Function MaxInts()
Dim jahr As Integer, ende As Integer, vor_jahr As Integer, vor_int As Integer, satz As Integer
Dim vor_kID As Long
Dim db As Database
Dim Intens As Recordset, MaxInt As Recordset
Set db = CurrentDb
Set Intens = db.OpenRecordset("Intensities2")
Set MaxInt = db.OpenRecordset("MaxInts")satz = 1
Do Until MaxInt.EOF
  MaxInt.Delete
  MaxInt.MoveNext
Loop

Do Until Intens.EOF
  With Intens
    jahr = Year(!PeriodStart)
    If IsNull(!periodend) Then
      ende = Year(Date)
    Else
      ende = Year(!periodend)
    End If

    If ende > Year(Date) Then MsgBox ("Fehler: Bei Konflikt " & Intens!conflictID & " ist das Jahr " & ende & " eingetragen, das sich In der Zukunft befindet.")

    If IsNull(Intens!intensitycode) Then
      .MoveNext
      GoTo 20
    End If
  End With

  With MaxInt
    While jahr <= ende
      .AddNew
      !konfliktID = Intens!conflictID
      !jahr = jahr
      !maximaleint = Intens!intensitycode
      jahr = jahr + 1
      .Update
    Wend
  End With

  vor_jahr = jahr - 1
  vor_kID = Intens!conflictID
  vor_int = Intens!intensitycode
  Intens.MoveNext20Loop

'---------------------------------------------------------
'bis hier läuft alles wie es soll
'---------------------------------------------------------

Set MaxInt = db.OpenRecordset("MaxInts")

With MaxInt
Do Until .EOF
  If !konfliktID = vor_kID And !jahr = vor_jahr Then
    If !maximaleint > vor_int Then .MovePrevious
    .Delete
    .MovePrevious
  End If

  vor_jahr = !jahr
  vor_kID = !konfliktID
  vor_int = !maximaleint
  .MoveNext
Loop
End With

db.Close

End Function



an dem problematischen teil des codes sieht man schon, dass nach der größeren int (in dem fall stehts für intensität) überprüft werden soll.

und jetzt der hammer: warum funktioniert der code für weniger als 100 datensätze problemlos, bei mehr (wir behandeln ca. 14000) aber nicht mehr? die problematik stellt sich in der form dar, dass eben nicht alle doppelten einträge entfernt werden. diejenigen, die drinbleiben, sind aber in keiner weise ungewöhnlich oder signifikant unterschiedlich zu denen, bei denen alles glatt geht.

vielen dank im voraus für hilfreiche antworten!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.09.2005, 11:16 Uhr
Airdamn



geh das mal im debug Schritt für Schritt durch.
Überprüfe die Variablen ob sie die richtigen Werte enthalten etc.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.09.2005, 20:51 Uhr
scarred




Zitat von ~Gaschd:
hallo,

hier eine frage, die mir wahrscheinlich nur ein echter crack beantworten kann. ich habe in access-vba ein modul implementiert, das datensätze nach jahren aufsplittet (funktioniert problemlos) un dann doppelte einträge löschen soll, allerdings nicht einfach einen von beiden, sondern den, der in einer bestimmten spalte den niedrigeren wert enthält. erstmal der code zum veranschaulichen:

Visual Basic:
Function MaxInts()
Dim jahr As Integer, ende As Integer, vor_jahr As Integer, vor_int As Integer, satz As Integer
Dim vor_kID As Long
Dim db As Database
Dim Intens As Recordset, MaxInt As Recordset
Set db = CurrentDb
Set Intens = db.OpenRecordset("Intensities2")
Set MaxInt = db.OpenRecordset("MaxInts")satz = 1
Do Until MaxInt.EOF
  MaxInt.Delete
  MaxInt.MoveNext
Loop

Do Until Intens.EOF
  With Intens
    jahr = Year(!PeriodStart)
    If IsNull(!periodend) Then
      ende = Year(Date)
    Else
      ende = Year(!periodend)
    End If

    If ende > Year(Date) Then MsgBox ("Fehler: Bei Konflikt " & Intens!conflictID & " ist das Jahr " & ende & " eingetragen, das sich In der Zukunft befindet.")

    If IsNull(Intens!intensitycode) Then
      .MoveNext
      GoTo 20
    End If
  End With

  With MaxInt
    While jahr <= ende
      .AddNew
      !konfliktID = Intens!conflictID
      !jahr = jahr
      !maximaleint = Intens!intensitycode
      jahr = jahr + 1
      .Update
    Wend
  End With

  vor_jahr = jahr - 1
  vor_kID = Intens!conflictID
  vor_int = Intens!intensitycode
  Intens.MoveNext20Loop

'---------------------------------------------------------
'bis hier läuft alles wie es soll
'---------------------------------------------------------

Set MaxInt = db.OpenRecordset("MaxInts")

With MaxInt
Do Until .EOF
  If !konfliktID = vor_kID And !jahr = vor_jahr Then
    If !maximaleint > vor_int Then .MovePrevious
    .Delete
    .MovePrevious
  End If

  vor_jahr = !jahr
  vor_kID = !konfliktID
  vor_int = !maximaleint
  .MoveNext
Loop
End With

db.Close

End Function



an dem problematischen teil des codes sieht man schon, dass nach der größeren int (in dem fall stehts für intensität) überprüft werden soll.

und jetzt der hammer: warum funktioniert der code für weniger als 100 datensätze problemlos, bei mehr (wir behandeln ca. 14000) aber nicht mehr? die problematik stellt sich in der form dar, dass eben nicht alle doppelten einträge entfernt werden. diejenigen, die drinbleiben, sind aber in keiner weise ungewöhnlich oder signifikant unterschiedlich zu denen, bei denen alles glatt geht.

vielen dank im voraus für hilfreiche antworten!










Das ist bei mir das gleiche und ich habs jetzt zum 100ten mal probiert sgeht nicht
--
cteam2005.de Das Team für Anfänger
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.09.2005, 20:58 Uhr
Uwe
C/C++ Master
(Administrator)


Was hast Du probiert?
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Visual Basic 6.0 / VBA ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: