ZEOS UpdateRecord schluckt UpdateFeld Time

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

ZEOS UpdateRecord schluckt UpdateFeld Time

Beitrag von Michl »

Hallo Allerseits,

zu meinem Terminplaner (siehe hier http://www.lazarusforum.de/viewtopic.php?p=64872#p64872) hat sich ein neues, allerdings anders geartetes Problem hinzugesellt.

Ich habe eine PostgreSQL-Datenbank auf die ich mit ZEOS zugreife (einfach eine DBGrid mit der Datenbank verbunden). Eingabe von Text, Datum, Zeit funktioniert alles wunderbar. Allerdings darf man sich beim Datum- und Zeiteingeben nicht vertippen, sonst gibts ne Exception. Also wie in dem anderen Thema schon geschrieben, wollt ich Fehleingaben vermeiden, mittels eines eigenen MaskEdits. Datum funktioniert soweit gut. Beim gleiche Vorgehen mit einer Zeiteingabe tritt folgendes Problem auf:

Code: Alles auswählen

procedure TTermineForm.TimeUpdate;                        //macht das Update des aktuellen Records
var
  NewTime:TDateTime;
 
  procedure RecordWriteln;                                //Schreibt den Inhalt des aktuellen Query-Records ins Konsole-Fenster
  var
    s: String;
    x: Integer;
  begin
    s:='';
    for x:=0 to Query.FieldCount-1 do
      case Query.Fields[x].DataType of
        ftString: s:=s + 'String['+Query.Fields[x].AsString+'] ';
        ftDate: s:=s + 'Date['+DateToStr(Query.Fields[x].AsDateTime)+'] ';
        ftTime: s:=s + 'Time['+TimeToStr(Query.Fields[x].AsDateTime)+'] ';
        else s:=s + 'Else['+Query.Fields[x].AsString+'] ';
      end;
    Writeln(s);
  end;
 
begin
  TimeChanged := False;                                   //Rücksetzen der "Change"-Markierung
 
  Writeln('Record vor neuer Zuweisung:');
  RecordWriteln;
 
  if TryStrToTime(MaskEdit.Text, NewTime) then begin      //Nur zuweisen, wenn Time i.O.
 
    Query.Fields[AktField].AsDateTime:=NewTime;           //Nachfolgende Aufrufe haben Record eigentlich ordentlich gefüllt
//    Query.Fields[AktField].AsFloat:=NewTime;
//    Query.Fields[AktField].AsString:=TimeToStr(NewTime);
//    Query.Fields[0].AsString:='Grummel Grummel, der Test wird gepostet, nur die Zeit nicht...';  //Mache ich das UpDate hier, geht das!
 
  end else
    Query.Fields[AktField].AsString:='';                  //kein Datum zuweisen
 
  Writeln('Record hat neuen Inhalt:');                    //neue Zeit wird ordentlich im Record angezeigt
  RecordWriteln;
 
  Query.UpdateRecord;
 
  Writeln('Record nach Update:');                         //Time ist auf 00:00:00 gestellt
  RecordWriteln;
 
  Query.Refresh;
end; 
Weise ich eine Zeit zu, so wird sie immer ordentlich ins Record eingetragen, nach dem Update ist sie wieder weg. Weise ich andere Felder nach dem gleichen Schema zu, werden sie ordentlich gespeichert. Wie gesagt, nutze ich die gleiche Tabelle, ohne das "MaskEdit" mit anschließendem UpdateRecord, wird die Zeit ordentlich in die Datenbank eingtragen, man darf sich halt nur nicht vertippen...
Ist das ein Bug?
Ist mein Vorgehen falsch?
Eingabe der Zeit in die Tabelle per SQL bekomme ich hin, wollt das aber eigentlich nicht so machen... [Edit] getestet, Update von Time per Hand mittels SQL geht

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

EgonHugeist
Beiträge: 93
Registriert: Di 17. Apr 2012, 22:41

Re: ZEOS UpdateRecord schluckt UpdateFeld Time

Beitrag von EgonHugeist »

Ne Michl, das ist ein FPC bug, welchen ich eigentlich schon umgangen habe: http://zeoslib.sourceforge.net/viewtopi ... =40&t=4460

Also welche version benutzt du?
ZeosDevTeam

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ZEOS UpdateRecord schluckt UpdateFeld Time

Beitrag von Michl »

Hatte mir eigentlich die 7.0.6 installiert, habe aber mehrere Lazarusversionen am Laufen, ich check das grad, obs wirklich so ist, meld mich...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ZEOS UpdateRecord schluckt UpdateFeld Time

Beitrag von Michl »

Ich nutze Lazarus 1.1 r42538 FPC 2.7.1 i386-win32-win32/win64 mit ZEOS 7.0.4
und Lazarus 1.3 r43080 FPC 2.6.2 i386-win32-win32/win64 mit ZEOS 7.0.6
Beides, das gleiche Resultat...

Sehe gerade, die 7.1.2 ist raus, werde sie mir mal runterladen, danke für den Hinweis!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ZEOS UpdateRecord schluckt UpdateFeld Time

Beitrag von Michl »

Hatte mir eben den aktuellen Snapshot Lazarus 1.3 r43260 FPC 2.6.2 i386-win32-win32/win64 runtergelden, Zeos 7.1.2 eingebunden, wollt das erste Projekt starten, da hats gleich einen Fehler beim Öffnen gegeben. Ein anderes wurde ordentlich geladen, beim Start kommt folgender Fehler:
Error.jpg
Werd nochmals den vorherigen Snapshot von Lazarus installieren, mal sehen...

Auch hier das Gleiche ZEOS 7.1.2 mag keine Snapshots :( . Abbruch beim Laden:
Error2.jpg
[EDIT] ZEOS 7.0.6 unter Lazarus 1.3 r43260 FPC 2.6.2 i386-win32-win32/win64 geht wieder. Lt. BugTracker http://bugs.freepascal.org/view.php?id=22371 ist das scheinbar gelöst (FPC 2.7.1 Product Build 21643), leider gibts seit September kein Snapshot mit einem 2.7.1 FPC.
Scheinbar gab es eine Änderung in der ZConnection, sodaß meine bisherige ZConnection nicht kompatibel ist?! Ich werd mal die Komponeneten entfernen und wieder neu einfügen, mal sehen.

[EDIT] Geht nicht.

Ich habe das fehlende Property "UTF8StringAsWideField" analog zur ZEOS Version 7.0.6 in die Unit "ZAbstractConnection" wieder eingetragen. Jetzt kann ich meine Projekte auch mit ZEOS 7.1.2 wieder ordentlich laden, das Problem mit der UpdateRecord und Time bleibt aber weiter bestehen :?: :?: :?:

At EgonHugeist: Hab Dir eine PN geschickt...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

EgonHugeist
Beiträge: 93
Registriert: Di 17. Apr 2012, 22:41

Re: ZEOS UpdateRecord schluckt UpdateFeld Time

Beitrag von EgonHugeist »

@Michl

habe geantwortet.

Hmm bin jetzt nicht ganz auf dem Laufenden, wie das:

ZeosLazarus.inc:
...
{$IFDEF FPC_FULLVERSION>20601}
{$UNDEF WITH_FPC_FTTIME_BUG} //seems like the never FPC2.6.2 also have fixed the NativData bug for TTimeFields+TDataSet
{$ENDIF}
...
in den stable Versionen eingepflügt ist. Problem hierbei: die älterne FPC2.6 version !hatten! den Bug. Nun hatte mich der User darauf aufmerksam gemacht, das das in den neueren 2.6 releases erledigt ist. Urspünglich hieß es der Patch wird nur zu 2.7 hinzugefügt. Nun stellt das alles ein Problem dar: es gibt 2.6.2 compiler mit dem Patch und ohne. Für Zeos ist das echt Sch..., da ich ja nun nicht checken kann ob das Dingenskirchen erledigt ist oder nicht..
Schau mal in die ZeosLazarus.Inc und schmeiß den geposteten blob hinter:

{$DEFINE WITH_FUNIDIRECTIONAL} // FPC has references a field instead of a setter here. (at least in 2.6.0)
ZeosDevTeam

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: ZEOS UpdateRecord schluckt UpdateFeld Time

Beitrag von mse »

EgonHugeist hat geschrieben:Nun stellt das alles ein Problem dar: es gibt 2.6.2 compiler mit dem Patch und ohne.
Von der release Version 2.6.2 gibt es nur eine. Alle geradzahligen Versionen sind release Versionen und unveränderlich. Ungeradzahlige Versionen (z.B. 2.6.3) sind variabel. 2.6.3 entspricht der SVN branch fixes_2_6, 2.7.1 entspricht im Moment SVN trunk. Von den fixes Versionen würde ich nur die aktuelle berücksichtigen. Wenn ich richtig verstehe hat 2.6.2 den fix nicht, 2.6.3 hat ihn mittlerweile.
Zuletzt geändert von mse am Fr 18. Okt 2013, 18:55, insgesamt 1-mal geändert.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ZEOS UpdateRecord schluckt UpdateFeld Time

Beitrag von Michl »

Habs jetzt endlich glücklich geschaft mir eine aktuelle Version von Lazarus auf einem aktuellen Snapshot von FPC zu bauen. Genau genommen habe ich jetzt Lazarus 1.3 r43268 FPC 2.7.1 (Rev: 25806) i386-win32-win32/win64 am laufen. :D

Genau genommen, sollte der Bug mit FPC Product Build 21643 erledigt sein, ist es in meinem Fall aber nicht. Gleiches Verhalten wie vorher.

Ich nutze jetzt auch ZEOS 7.1.2 ohne den oben geposteten Umweg. Evtl. sollte das irgendwo vermerkt werden (falls es nicht schon ist, ich wusste es auf jeden Fall nicht), dass man bei einem Update von ZEOS 7.0.6 auf 7.1.2 die ZConnection zuvor aus dem Projekt entfernen muss und dann wieder neu einfügen!

Werde mal den von Dir geschriebenen Patch noch ausprobieren...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ZEOS UpdateRecord schluckt UpdateFeld Time

Beitrag von Michl »

Code: Alles auswählen

...
  {$DEFINE WITH_FUNIDIRECTIONAL} // FPC has references a field instead of a setter here.  (at least in 2.6.0)
  {$IFDEF FPC_FULLVERSION>20601}
    {$UNDEF WITH_FPC_FTTIME_BUG} //seems like the never FPC2.6.2 also have fixed the NativData bug for TTimeFields+TDataSet
  {$ENDIF}
...
 
oder

Code: Alles auswählen

...
  {$DEFINE WITH_FUNIDIRECTIONAL} // FPC has references a field instead of a setter here.  (at least in 2.6.0)
...
 
macht keinen Unterschied, es bleibt das Verhalten wie oben erwähnt. Evtl. ist das ja was anderes und nicht der "gelöste" Bug?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ZEOS UpdateRecord schluckt UpdateFeld Time

Beitrag von Michl »

Ich verstehe es nicht. Zum Test, obs an FPC liegt oder nicht, hatte ich noch ZEOS entfernt und das Gleiche mit Lazarsu-Bordmitteln (SQLdb) probiert. Dabei war genau das gleiche Verhalten aufgetreten, wie mit ZEOS (Update von Date geht, Update von Time schlägt fehl).
Also wollt ich nicht faul sein und das im Bugtracker posten. Habe dafür ein Minimalbeispiel erstellt, mit beiden Verbindungen. Beim Test klappte dann plötzlich auch das Update auch von Time :shock:
Habe meinen Code vom Ausgangsprojekt durchforstet und umgestellt und probiert... immer das Gleiche, geht nicht.

[Edit] Es liegt wahrscheinlich am Einstieg. Ich fange beim Ereignis Grid.SelectEditor die Eingabe ab. Intern wird wahrscheinlich irgendwie trotzdem das aktuelle Record zum Schreiben offen gehalten, sodaß meine Eingaben dann scheinbar doppelt vorhanden sind oder sonstwie im Speicher geschrieben werden. Ich weiss es nicht. Starte ich den gleichen Code mit einem Button, funktioniert er ordentlich. Warum allerdings das Ganze mit Date funktioniert und mit Time nicht (wenn, dann hätte eigentlich keins von beiden oder alle beide funktionieren dürfen), weiß ich nicht.
Ich brech dann auch hier ab, werde meine Updates einfach per SQL per Hand machen, das hat auf jeden Fall immer ordentlich funktioniert. Für mein Vorgehen scheinen ZQuery.Updaterecord oder SQLQuery.ApplyUpdates unpassend :?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten