DBSKIP Problem

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

DBSKIP Problem

Beitrag von Koverhage »

Hallo,

bin gestern auf ein Problem gestoßen, was ich mir nicht erklären kann.
Ich habe eine DBF Datei in der ich Werte aus einer Excel Tabelle eintragen muß.
Die DBF Datei wird von Anfang an gelesen und dann der entsprechende Eintrag in der Tabelle gesucht.
Beim Skip auf den nächsten Satz, wird aus Gründen die ich nicht nachvollziehen kann, der Satzzeiger
um 2 Sätze bewegt.
Habe dann den DBSKIP entfernt, um zu sehen was passiert. Das war dann eine Endlosschleife da
das Programm immer auf den ersten Satz stand.

Der Code hierzu:

Code: Alles auswählen

  oApp:Application:Worksheets(2):activate() // Activate sheet
  oSheet := oApp:Application:Worksheets(2) // Shortcut
  // Put values into array
  aValues := oSheet:UsedRange:value
  nRow := 268


  ("mstamm")->(dbGoTop())
  do while !("mstamm")->(eof())
 
     for I:= 2 to nRow   // 1. Zeile Ueberschrift
        if rtrim(("mstamm")->kennung) == rtrim(aValues[i,149])
           do while !("mstamm")->(dbrlock(RecNo()))
           enddo
           ("mstamm")->knummer1 := aValues[i,16]
           ("mstamm")->knummer2 := aValues[i,15]
           ("mstamm")->knummer3 := aValues[i,15]
           ("mstamm")->telfax := rtrim(aValues[i,144])+rtrim(aValues[i,145])
           ("mstamm")->(dbskip(0))
           ("mstamm")->(dbrunlock(RecNo()))
           exit
        endif
     next

     msgbox(str(("mstamm")->(recno())))
     ("mstamm")->(dbskip(1))
  enddo

Um das ganze zum Laufen zu bringen habe ich dann den Code so abgeändert das in der Do while Schleife immer ein Dbskip(-1)
gemacht wird. Ist bestimmt nicht die beste Lösung (für bessere kenne ich mich zu wenig aus).

("mstamm")->(dbGoTop())
("mstamm")->(dbskip(1))
do while !("mstamm")->(eof())

("mstamm")->(dbskip(-1))
for I:= 2 to nRow // 1. Zeile Ueberschrift
if rtrim(("mstamm")->kennung) == rtrim(aValues[i,149])
do while !("mstamm")->(dbrlock(RecNo()))
enddo
("mstamm")->knummer1 := aValues[i,16]
("mstamm")->knummer2 := aValues[i,15]
("mstamm")->knummer3 := aValues[i,15]
("mstamm")->telfax := rtrim(aValues[i,144])+rtrim(aValues[i,145])
("mstamm")->(dbskip(0))
("mstamm")->(dbrunlock(RecNo()))
exit
endif
next

msgbox(str(("mstamm")->(recno())))
("mstamm")->(dbskip(1))
enddo

Meine Frage ist jetzt nur, habe ich einen Gedankenfehler oder woher kommt dieses Problem ?
Gruß
Klaus
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: DBSKIP Problem

Beitrag von Markus Walter »

Hallo,

das kann meines Erachtens nur an einem aktiven Index auf einem (oder mehreren) der Felder, die durch die Zuweisung verändert werden und dass sich somit die Position in der DBF ändert...

Meiner Meinung nach kannst Du Dir auch das dbskip(0) vor dem unlock sparen. Das hat aber nichts mit Deinem Problem zu tun...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: DBSKIP Problem

Beitrag von AUGE_OHR »

Koverhage hat geschrieben:

Code: Alles auswählen

do while !("mstamm")->(dbrlock(RecNo()))
...
   ("mstamm")->(dbskip(0))
   ("mstamm")->(dbrunlock(RecNo()))
     msgbox(str(("mstamm")->(recno())))

("mstamm")->(dbskip(1))
vergleich doch mal die beiden RecNo() ...
ich habe die Recno() immer als Variable damit es immer der "selbe" Record ist.

Code: Alles auswählen

do while !("mstamm")->(eof())
    nRec := ("mstamm")->(RecNo())
    IF ("mstamm")->(dbrlock(nRec))
    ...
       ("mstamm")->(dbrunlock(nRec))
    ELSE
    ENDIF
    ("mstamm")->(dbskip(1))
ENDDO
auch denke ich das dein SKIP(0) an der falschen Stelle ist ... oder würdest du "dort" ein COMMIT setzten ?
gruss by OHR
Jimmy
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DBSKIP Problem

Beitrag von Koverhage »

Hallo Markus,

es ist nur ein Index aktiv, der aber mit den Feldern nichts zu tun hat.
Es wäre auch nicht logisch, denn es ist so als wenn der DBSKIP zweimal
ausgeführt wird.
Es wird also immer der übernächste Satz genommen.


Jimmy,

mit MSGBOX habe ich ja die RECno angezeigt, nur deshalb bin ich überhaupt darauf gekommen,
wo das Problem liegt. Beim ersten Durchgang Recno =1, dann 3, 5, usw.
D.h. es fehlt mir immer ein Satz.

Dbskip(0) benutze ich anstatt dem Dbcommit, was ist daran falsch ?
Gruß
Klaus
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Re: DBSKIP Problem

Beitrag von Markus Walter »

Koverhage hat geschrieben:Hallo Markus,

es ist nur ein Index aktiv, der aber mit den Feldern nichts zu tun hat.
Es wäre auch nicht logisch, denn es ist so als wenn der DBSKIP zweimal
ausgeführt wird.
Es wird also immer der übernächste Satz genommen.
Das käme drauf an, wie der Index gebaut ist und was Du in die Felder schreibst... Es wären ja schon Datenkonstellationen denkbar, wo dann so ein Effekt entstehen könnte (z. B. wenn ein Satz durch die gesetzten Felder im Index einen Datensatz weiter nach hinten wandern würde). Wenn meine Vermutungen nicht stimmen, bin ich mit meinem Latein am Ende... Höchstens Du hast ein fertiges Sample mit den Daten und Index, dann könnte man sich das mal ansehen... Oder Du machst Dir nach jeder Zeile debug-Ausgaben mit der recno, damit Du siehst, wann genau eine Bewegung des Datensatzzeigers stattfindet (oder benutzt den debugger).
Koverhage hat geschrieben: Dbskip(0) benutze ich anstatt dem Dbcommit, was ist daran falsch ?
Ist nicht falsch aber meines Erachtens an der Stelle unnötig. Durch das Entsperren des Datensatzes werden die Änderungen sowieso weggeschrieben. Ein dbskip(0) ist meiner Meinung nach nur im exclusive-Modus notwendig oder wenn Änderungen auch ohne Aufheben von Sperrungen geschrieben werden sollen - ODER - um Änderungen von anderen Prozessen mitzubekommen (also Bsp. Instanz A steht auf einem Datensatz (und Xbase hat die Werte in die internen Buffer eingelesen und nun ändert Instanz B den gleichen Satz. Damit Instanz A die Änderung mitbekommt, ist ein dbskip(0) notwendig)
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: DBSKIP Problem

Beitrag von AUGE_OHR »

Koverhage hat geschrieben:Jimmy,
Dbskip(0) benutze ich anstatt dem Dbcommit, was ist daran falsch ?
NACH dem unlock !!!
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DBSKIP Problem

Beitrag von Tom »

Hallo, Klaus.

Setz mal vor die Routine ein DbSetOrder(0).
Herzlich,
Tom
Antworten