Aufruf von dbrunlock / dbunlock verschieben RecNo() Auf LastRec + 1

Hier dreht es sich um den PostGre Server

Moderator: Moderatoren

Antworten
Benutzeravatar
manuel.haegeli
Rookie
Rookie
Beiträge: 6
Registriert: Mi, 24. Jan 2024 9:11
Hat sich bedankt: 4 Mal

Aufruf von dbrunlock / dbunlock verschieben RecNo() Auf LastRec + 1

Beitrag von manuel.haegeli »

Hallo Zusammen

Ich arbeite am unsere Software auf pgdbe / postgres am umstellen und habe ein merkwürdiges verhalten.

Mein Problem ist, dass RecNo(), nach einem dbunlock oder dbrunlock, auf einen Datensatz zeigt welcher nicht existiert.
In dem Fall ist RecNo() = LastRec() + 1

Code: Alles auswählen

 dbunlock()  
dbcommit()
// Hier ist entgegen meiner Erwartungen ( RecNo() = LastRec() + 1) = .T.
// Hack
DbGoTo(LastRec())
Hat jemand Erfahrung woher das Problem kommen könnte?

Wenn ich an dieser stelle die Workarea schliesse, direkt wieder öffne existiert es das Probem nicht mehr. Also scheint die Workarea in einem merkwürdigen Zustand zu sein.

Code: Alles auswählen

 DBCloseArea("VERKAUF")
 DbUseArea(.T., NIL, "VERKAUF", NIL, .T.,  .F.)
 Select VERKAUF
// Hier ist wie zu erwarten ( RecNo() = LastRec()) = .T.
 dbunlock()
Ich arbeite daran das reproduzierbar zu machen in einem kleinen Projekt, aber habe einige Tausend Zeilen Code, also dauert das noch etwas

Vielen Dank, Grüsse
Manuel
xBase++ Entwickler seit 2.Januar.2024
Benutzeravatar
komnick
UDF-Programmierer
UDF-Programmierer
Beiträge: 75
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin
Hat sich bedankt: 1 Mal
Danksagung erhalten: 5 Mal

Re: Aufruf von dbrunlock / dbunlock verschieben RecNo() Auf LastRec + 1

Beitrag von komnick »

Hallo Manuel,

mir ist noch nicht untergekommen, dass dbunlock() den Satzzeiger verstellt. Da hier aber sonst niemand antwortet, teile ich dir kurz meine Gedanken mit:
  • Der Zustand RECNO() = LASTREC()+1 ist für mich nicht merkwürdig, sondern tritt bei EOF() ein. Am Ende einer Schleife DO WHILE !EOF(); ...; SKIP; ENDDO gilt RECNO() = LASTREC()+1.
  • Wenn ich eine Workarea frisch öffne, gilt meines Wissens immer RECNO()=1 (und nicht RECNO()=LASTREC()).
  • Mein Verdacht ist, dass du nach bzw. auch schon vor deinem dbunlock() entweder nicht auf dem Datensatz stehst, auf dem du zu stehen glaubst, oder nicht in der Workarea, in der du zu stehen glaubst.
Beste Grüße

Martin
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: Aufruf von dbrunlock / dbunlock verschieben RecNo() Auf LastRec + 1

Beitrag von Tom »

Ups, ich hatte mit der Antwort angefangen, es dann aber wieder vergessen. Und jetzt hat der Martin alles geschrieben, was ich auch schreiben wollte. Danke, Martin. :)
Herzlich,
Tom
Benutzeravatar
manuel.haegeli
Rookie
Rookie
Beiträge: 6
Registriert: Mi, 24. Jan 2024 9:11
Hat sich bedankt: 4 Mal

Re: Aufruf von dbrunlock / dbunlock verschieben RecNo() Auf LastRec + 1

Beitrag von manuel.haegeli »

Martin, Tom danke für eure Antworten

Im Normalfall habe ich beim Postgres LASTREC()+1 ist eof().

Das verhalten ist alles mit dem Debugger verifiziert (vor und nach dem dbunlock). Ich habe vor und nach dem unlock alias(), eof(), LastRec(), Recno() und DbRLockList() geprüft und alles scheint wie zu erwarten.

Ich habe versucht ein einfaches Code Projekt zu erstellen um das Verhalten nachzuvollziehen. In den erstellten Code Beispielen ist aber das Verhalten immer so wie erwartet, also dbunlock() verschiebt den Satzzeiger nicht mit diversen rlocks, dbrlock.

Sobald ich genaueres finde, werde ich es hier anfügen. Ich denke das es wohl ein sehr spezieller edge case nur mit Postgres. An anderen stellen im code mit dbunlock haben wir das Problem nicht.

Beste Grüsse
Manuel
xBase++ Entwickler seit 2.Januar.2024
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 852
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Aufruf von dbrunlock / dbunlock verschieben RecNo() Auf LastRec + 1

Beitrag von Marcus Herz »

Hast du dein Beispiel mit der gleichen Datenbankstruktur und Indices gemacht?
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
manuel.haegeli
Rookie
Rookie
Beiträge: 6
Registriert: Mi, 24. Jan 2024 9:11
Hat sich bedankt: 4 Mal

Re: Aufruf von dbrunlock / dbunlock verschieben RecNo() Auf LastRec + 1

Beitrag von manuel.haegeli »

Ja, die Datenbank im Beispiel und die Tabelle sind die selben und ich habe den selben Index aktiviert.
Aber das wäre noch eine Idee alle vorhandenen Indices zu laden, das der code evtl dadurch etwas komisches macht
xBase++ Entwickler seit 2.Januar.2024
Antworten