Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Phänomenale Fehlermeldung unter Vista...zum Rätseln (https://www.delphipraxis.net/129854-phaenomenale-fehlermeldung-unter-vista-zum-raetseln.html)

haentschman 26. Feb 2009 18:50


Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Hallo an alle... :hi:

vieleicht hat ja jemand eine logische Erklärung :P

Delphi-Quellcode:
try
  ZQueryStatistikKunde:= TZQuery.Create(self);
  ZQueryStatistikKunde.Connection:= DMDB.ZConnection1;
  try
    for M1 = 1 to 12
      begin
        Tage:= MonthDays[IsLeapYear(Jahr), M1];
        ZQueryStatistikKunde.SQL.Text:= 'select count(ID) from BEHANDLUNG where DATUM between :Datum1 and :Datum2 and KUNDENNUMMER = :Kunde';
        ZQueryStatistikKunde.ParamByName('Datum1').AsDate:= StrToDate('01.' + IntToStr(M1) +'.' + IntToStr(Jahr));
        ZQueryStatistikKunde.ParamByName('Datum2').AsDate:= StrToDate(IntToStr(Tage) + '.' + IntToStr(M1) +'.' + IntToStr(Jahr));
        ZQueryStatistikKunde.ParamByName('Kunde').AsString:= ZQueryKundenDetail.FieldValues['KUNDENNUMMER'];
        // immer String 'abcdf' als TestKundennummer
        ZQueryStatistikKunde.Open; // Fehler beim Durchlauf #2
        SeriesPat.Add(ZQueryStatistikKunde.FieldValues['COUNT'],IntToStr(M1),clRed);
      end;
  except
    FehlerCode:= 'E255';
    Fehlerstatus:= False;
    Fehlertext:= 'Statistik einlesen fehlgeschlagen. ';
    raise;
  end;
  BitBtn4.SetFocus;
finally
  ZQueryStatistikKunde.Free;
end;
Beschreibung:
- das ganze liest monatlich die Anzahl an Behandlungen
- jeder Monat wird dem Chart hinzugefügt
- unter XP läuft das durch
- unter Vista (compiliert unter Vista als auch die funktionierende exe aus der XP Compilierung) erzeugen folgenden Fehler:

SQL Error: conversion Error from String "abcdef", Overflow during Data Type Conversion :wiejetzt:

- der Fehler tritt beim 2. Open der Query auf

Werte zum Zeitpunkt des Fehlers:
Parameter Date1: 01.02.2009
Parameter Date2: 28.02.2009
Parameter Kunde: 'abcdef'
M1: 2

PS: der Januar und ab März laufen durch...warum mag Vista den Februar nicht :gruebel:

viel Spaß beim Rätseln :-)

mkinzler 26. Feb 2009 19:00

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Was für ein typ hat der Parameter Kunde?
Funktioniert
Delphi-Quellcode:
ZQueryStatistikKunde.ParamByName('Kunde').AsString := ZQueryKundenDetail.FieldByName('KUNDENNUMMER').asString;
?

DeddyH 26. Feb 2009 19:01

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Ich würde an Deiner Stelle die StrToDate-Aufrufe durch DateUtils-Funktionen ersetzen oder zumindest EncodeDate verwenden.

haentschman 26. Feb 2009 19:15

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Danke für die schnelle Reaktion. :thumb:
Zitat:

Was für ein typ hat der Parameter Kunde?
- es bleibt gleich ob ich den String aus dem Datenfeld hole oder direkt einen String als Parameter übergebe.
:wink: Die Fehlermeldung hat mit der Ursache nichtszu tun...denke ich, da alle Monate im Prinzip mit dem gleichen Quelltext durchlaufen nur der Februar löst diese Meldung aus. Die Parameter sind korrekt (siehe oben)
Zitat:

Ich würde an Deiner Stelle die StrToDate-Aufrufe durch DateUtils-Funktionen ersetzen oder zumindest EncodeDate verwenden.
...Hast Recht, komme aber erst in der übernächsten Version dazu :P (FeinTuning)

PS: ich hatte auch probiert in jedem Schleifendurchlauf das Query Objekt zu erzeugen und freizugeben. Ergebnis das gleiche.

:hi:

Blup 27. Feb 2009 07:34

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Nicht jeder Februar hat 29 Tage.

Uwe Raabe 27. Feb 2009 07:42

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Keine Ahnung, ob es damit zusammenhängt, aber wäre es nicht geschickt, die Query nach jedem Schleifendurchlauf wieder zu schließen?

nahpets 27. Feb 2009 09:17

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Hallo,

als erstes mal Try&Error machen, mit festen Werten:
Delphi-Quellcode:
ZQueryStatistikKunde.SQL.Text := 'select count(ID) from BEHANDLUNG where DATUM between ''01.02.2009'' and ''28.02.2009'' and KUNDENNUMMER = :Kunde';
ZQueryStatistikKunde.ParamByName('Kunde').AsString := 'abcdef';
ZQueryStatistikKunde.Open;
SeriesPat.Add(ZQueryStatistikKunde.FieldValues['COUNT'],IntToStr(2),clRed);
ZQueryStatistikKunde.Close;
funktioniert? Wenn ja dann:
Delphi-Quellcode:
ZQueryStatistikKunde.SQL.Text := 'select count(ID) from BEHANDLUNG where DATUM between :Datum1 and :Datum2 and KUNDENNUMMER = :Kunde';
ZQueryStatistikKunde.ParamByName('Datum1').AsString := '01.02.2009';
ZQueryStatistikKunde.ParamByName('Datum2').AsString := '28.02.2009';
ZQueryStatistikKunde.ParamByName('Kunde').AsString := 'abcdef';
ZQueryStatistikKunde.Open;
SeriesPat.Add(ZQueryStatistikKunde.FieldValues['COUNT'],IntToStr(2),clRed);
ZQueryStatistikKunde.Close;
funktioniert? Wenn ja dann:
Delphi-Quellcode:
Tage := MonthDays[IsLeapYear(Jahr), 2];
ZQueryStatistikKunde.SQL.Text := 'select count(ID) from BEHANDLUNG where DATUM between :Datum1 and :Datum2 and KUNDENNUMMER = :Kunde';
ZQueryStatistikKunde.ParamByName('Datum1').AsDate := StrToDate('01.' + IntToStr(2) + '.' + IntToStr(2009));
ZQueryStatistikKunde.ParamByName('Datum2').AsDate := StrToDate(IntToStr(28) + '.' + IntToStr(2) + '.' + IntToStr(2009));
ZQueryStatistikKunde.ParamByName('Kunde').AsString := ZQueryKundenDetail.FieldValues['KUNDENNUMMER'];
ZQueryStatistikKunde.Open;
SeriesPat.Add(ZQueryStatistikKunde.FieldValues['COUNT'],IntToStr(2),clRed);
ZQueryStatistikKunde.Close;
funktioniert? Wenn ja dann:
Delphi-Quellcode:
M1 := 2;
Tage := MonthDays[IsLeapYear(Jahr), M1];
ZQueryStatistikKunde.SQL.Text := 'select count(ID) from BEHANDLUNG where DATUM between :Datum1 and :Datum2 and KUNDENNUMMER = :Kunde';
ZQueryStatistikKunde.ParamByName('Datum1').AsDate := StrToDate('01.' + IntToStr(M1) + '.' + IntToStr(2009));
ZQueryStatistikKunde.ParamByName('Datum2').AsDate := StrToDate(IntToStr(Tage) + '.' + IntToStr(M1) + '.' + IntToStr(2009));
ZQueryStatistikKunde.ParamByName('Kunde').AsString := ZQueryKundenDetail.FieldValues['KUNDENNUMMER'];
ZQueryStatistikKunde.Open;
SeriesPat.Add(ZQueryStatistikKunde.FieldValues['COUNT'],IntToStr(M1),clRed);
ZQueryStatistikKunde.Close;
Wo gibt es jetzt den Fehler?
Was für 'ne Datenbank ist denn das?

Sir Rufo 27. Feb 2009 11:00

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
versuch es mal so (unit DateUtils einbinden)
Delphi-Quellcode:
ZQueryStatistikKunde:= TZQuery.Create(self);
try
  ZQueryStatistikKunde.Connection:= DMDB.ZConnection1;
  ZQueryStatistikKunde.SQL.Text:=
    'select count(ID) from BEHANDLUNG where DATUM between :Datum1 and :Datum2 and KUNDENNUMMER = :Kunde';

  try
    for M1 := 1 to 12 do
      begin

        ZQueryStatistikKunde.ParamByName('Datum1').AsDate:=
          EncodeDate( Jahr, M1, 1 );
        ZQueryStatistikKunde.ParamByName('Datum2').AsDate:=
          IncDay( IncMonth( EncodeDate( Jahr, M1, 1 ), 1 ), -1 );
        ZQueryStatistikKunde.ParamByName('Kunde').AsString:=
          ZQueryKundenDetail.FieldValues['KUNDENNUMMER'];
        // immer String 'abcdf' als TestKundennummer

        if ZQueryStatistikKunde.Active then
          ZQueryStatistikKunde.ReQuery
        else
          ZQueryStatistikKunde.Open; // Fehler beim Durchlauf #2
        if not ZQueryStatistikKunde.Eof then
          SeriesPat.Add(ZQueryStatistikKunde.FieldValues['COUNT'],IntToStr(M1),clRed);

      end;
    ZQueryStatistikKunde.Close;
  except
    FehlerCode:= 'E255';
    Fehlerstatus:= False;
    Fehlertext:= 'Statistik einlesen fehlgeschlagen. ';
    raise;
  end;
  BitBtn4.SetFocus;
finally
  ZQueryStatistikKunde.Free;
end;

haentschman 27. Feb 2009 11:25

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Danke für Eure zahlreiche Anteilnahme 8)
Zitat:

Keine Ahnung, ob es damit zusammenhängt, aber wäre es nicht geschickt, die Query nach jedem Schleifendurchlauf wieder zu schließen?
...ich bin schon gar soweit gegangen, das QueryObjekt in jedem Schleifendurchlauf zu erzeugen und freizugeben. Das Ergebnis: Februar --> Fehler

@nahpets:
- ich habe die komplette Liste schon vorher durch, statische Werte, Namensänderungen der Objekte / Variablen ohne Besserung
- auch die Unit im Projekt verschoben, damit der Compiler das ganze anders compiliert.

@Sir Rufo:
- dazu hatte ich noch nicht die Zeit. :( werde es aber schnellstens testen. Bemerkung: da auch ein festes Datum keine Besserung erreicht, denke ich, daß auch das EncodeDate keine Wirkung zeigt :(

Zitat:

Nicht jeder Februar hat 29 Tage.
:-D dafür ist IsLeapYear da und das Datum im Parameter ist der 28.02.2009 weil wir dieses Jahr kein Schaltjahr haben

Danke an alle... :hi:

Zitat:

Was für 'ne Datenbank ist denn das?
...upps :oops: Firebird 2.0 mit Zeos

nahpets 27. Feb 2009 11:42

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Hallo,

das ist aber komisch, dann Ändere doch mal das Endedatum vom Februar auf 27.02.2009 ... bis (schlimmstenfalls) runter zum 01.02.2009. Wenn Du dann irgendwann durchkommst, suche für den Tag, mit dem Du nicht mehr durchkommst, ob irgend einer es (wie auch immer) geschafft hat, ein ungültiges Februardatum in die Datenbank zu kloppen.
Deine Fehlermeldung muss ja nicht zwingend auf eine fehlerhafte Abfrage zurückzuführen sein, sondern kann auch durch fehlerhafte Daten in der Ergebnismenge ausgelöst werden.

Habe vor Jahren mal den 31. April 4515 gesucht, die Software rauchte beim Import von Daten ab, aber nur abhängig von irgendwelchen Filtern. Durch "binäre" Suche (sprich jeweils Halbierung des zu testenden Teilbereiches der Daten) bin ich dann irgendwann auf diesen kaputten Datensatz gekommen. Da ich keinen direkten Zugriff auf die Datenbank hatte, sondern nur mit der Software darauf zugreifen konnte, war das nicht wirklich spaßig, da sie sich beim Auftreten des Fehlers so zerschossen hat, dass ohne Neuinstallation nichts zu machen war.

haentschman 27. Feb 2009 12:00

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Danke für deine Antwort,

Ich muß dich aber enttäuschen..
Zitat:

dann Ändere doch mal das Endedatum vom Februar auf 27.02.2009
...jedes Datum erzeugt den Fehler sofern es sich im Februar aufhält :wink:

Zitat:

sondern kann auch durch fehlerhafte Daten in der Ergebnismenge
...die Tabelle ist, was den Februar betrifft leer, also Count=0 :gruebel:

...ich liebe Vista :evil:

:hi:

Sir Rufo 27. Feb 2009 12:03

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Zitat:

Zitat von haentschman
Zitat:

Nicht jeder Februar hat 29 Tage.
:-D dafür ist IsLeapYear da und das Datum im Parameter ist der 28.02.2009 weil wir dieses Jahr kein Schaltjahr haben

Bei meinen Code brauchst du kein IsLeapYear mehr ;)

haentschman 27. Feb 2009 12:08

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
:wink: weis ich, aber das Zitat stammte aus einer Antwort vor deiner Version mit EncodeDate.

nahpets 27. Feb 2009 12:37

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Hallo,
Zitat:

Zitat von haentschman
Danke für deine Antwort,

Ich muß dich aber enttäuschen..
Zitat:

dann Ändere doch mal das Endedatum vom Februar auf 27.02.2009
...jedes Datum erzeugt den Fehler sofern es sich im Februar aufhält :wink:

Zitat:

sondern kann auch durch fehlerhafte Daten in der Ergebnismenge
...die Tabelle ist, was den Februar betrifft leer, also Count=0 :gruebel:

...ich liebe Vista :evil:

:hi:

füg' einen Satz für Februar ein. Ist der Fehler dann weg, dann kommt da wer nicht mit 'ner leeren Ergebnismenge zurecht (zugegeben: Das ist absurd).

Also dann mal bitte mit:
Delphi-Quellcode:
'select count(ID) from BEHANDLUNG where DATUM >= :Datum1 and DATUM <= :Datum2 and KUNDENNUMMER = :Kunde';
dann mit
Delphi-Quellcode:
'select count(ID) from BEHANDLUNG where KUNDENNUMMER = :Kunde and DATUM between :Datum1 and :Datum2';
dann mit
Delphi-Quellcode:
'select count(ID) from BEHANDLUNG where 1 = 2 and KUNDENNUMMER = :Kunde and DATUM between :Datum1 and :Datum2';
dann mit
Delphi-Quellcode:
'select count(ID) from BEHANDLUNG where KUNDENNUMMER = :Kunde and DATUM between :Datum1 and :Datum2';
wobei :Datum1 = 31.01.2009 und :Datum2 = 01.03.2009.
dann mit
Delphi-Quellcode:
'select count(ID) from BEHANDLUNG where KUNDENNUMMER = :Kunde and DATUM > :Datum1 and DATUM < :Datum2';
wobei :Datum1 = 31.01.2009 und :Datum2 = 01.03.2009.

Gibt es auch andere Monate, in denen Count = 0 ist?
Wenn nein, dann mal für alle Monate probieren:
Delphi-Quellcode:
'select count(ID) from BEHANDLUNG where 1 = 2 and KUNDENNUMMER = :Kunde and DATUM between :Datum1 and :Datum2';
Das muss also immer eine leere Ergebnismenge liefern. Wenn's jetzt immer kracht, dann liegt das Problem nicht im Datum, sondern in der leeren Ergebnismenge.

Wenn's dann immer noch nicht geht, werden für Februar Betriebsferien angeordnet 8)

haentschman 27. Feb 2009 12:42

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
:wink: das riecht ja nach richtig Arbeit deine Vorschläge :wink:

...werd ich der Reihe nach mal abarbeiten. :thumb:

Die leere Ergebnismenge sollte kein Problem darstellen, da auch andere Monate Count=0 haben und sich nicht beschweren.

Zitat:

Wenn's dann immer noch nicht geht, werden für Februar Betriebsferien angeordnet
diese Idee hatte ich auch schon :-D

Danke für deine Zeit...ich melde mich dann. PS: kann etwas dauern, sorry :(

hoika 27. Feb 2009 13:06

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Hallo,

definier doch mal anständige Variablen tdtStartDate, tdtEndDate (TDateTime)
oder sStartDate, sEndDate (String).

Besser ist halt AsDate (AsDateTime) zu verwenden.

Dann Breakpoint drauf und guggern.


Ich habe FB2.0.3 mal ausprobiert.
Die Meldung kommt nur, wenn das Datum falsch ist.


Heiko

haentschman 14. Mär 2009 16:35

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Sorry für die späte Antwort...

Delphi-Quellcode:
ZQueryStatistikKunde.SQL.Text:= 'select count(ID) from BEHANDLUNG where DATUM between :Datum1 and :Datum2 and KUNDENNUMMER = :Kunde';
ZQueryStatistikKunde.ParamByName('Datum1').AsDate:= StartOfAMonth(Jahr,M);
ZQueryStatistikKunde.ParamByName('Datum2').AsDate:= EndOfAMonth(Jahr,M);
ZQueryStatistikKunde.ParamByName('Kunde').asString:= 'STRING';
ZQueryStatistikKunde.Open;
- auch diese Variante bringt die Exception
- auch verschiedene feste "Februar Werte" erzeugen den Fehler
- sobald der Parameter Kunde im "STRING" ein alphanumerisches Zeichen enthält kommt der Fehler
- Parameter Kunde nur mit Zahlen im String, Bsp: '1234' laufen auch im Februar durch

...ich bin noch nicht schlauer :(

Danke an alle :wink:


UPDATE:

- nach vielen Probierereien, auch mit anderen Zugriffskomponenten, das Ergebnis:

:warn: trotzdem ich alle Daten mit diversen Tools lesen kann...die Datenbank selbst ist fehlerhaft, warum auch immer :gruebel:

- das mit dem Vista war nur, weil ich mit 2 Datenbanken entwickelt habe und die korrupte auf dem Vista lag. :roll:

Danke an alle für die Hilfe :hi:

Satty67 14. Mär 2009 16:58

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Vielleicht die Abfrage mal umstellen, wenn Kunde auch Einfluss auf den Fehler hat:
SQL-Code:
select count(ID) from BEHANDLUNG where DATUM between :Datum1 and :Datum2 and KUNDENNUMMER = :Kunde

zu

select count(ID) from BEHANDLUNG where KUNDENNUMMER = :Kunde and DATUM between :Datum1 and :Datum2

haentschman 14. Mär 2009 19:29

Re: Phänomenale Fehlermeldung unter Vista...zum Rätseln
 
Danke für Deine Hilfe :wink:

das einzige, was was gebracht hat war eine neue Spalte anlegen, die Daten in die neue Spalte, Spalte Kundennummer löschen, Spalte Kundennummer neu und die Daten wieder zurück....oder die komplette DB neu erzeugen.

Warum die Spalte so ein merkwürdiges Problem hatte...nicht nachvollziehbar :gruebel:

Danke für Eure Zeit... :hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz