Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Ungültiges Argument zum Codieren des Datums (https://www.delphipraxis.net/157696-ungueltiges-argument-zum-codieren-des-datums.html)

Metallicwar 21. Jan 2011 11:06

Ungültiges Argument zum Codieren des Datums
 
Hallo zusammen,
ich berechne anhand dieses Codes den letzten Tag des angegebenen Monats. Wenn ich die Tage des letzten Monats herausfinden will, erhalte ich immer die Fehlermeldung: Ungültiges Argument zum Codieren des Datums.
Mir ist bewusst, dass es die Funktion DaysInAMonth gibt, aber ich arbeite mit einem Report Generator und im Calculator des Report Generators werden eben nur EncodeDate und DecodeDate unterstützt.
Hat jemand eine Idee, wie ich auch die Tage des Jahresabschlussmonats berechnen kann?

Delphi-Quellcode:
var
  idTag, idMonat, idJahr: Integer;
  LetzterTag : TDateTime;
begin
  LetzterTag := EncodeDate(2011, 12, 1) - 1; // Ungültiges Argument zum Codieren des Datums
  DecodeDate(LetzterTag,idJahr,idMonat,idTag);
  value := idTag;
end;

mfg David

DeddyH 21. Jan 2011 11:09

AW: Ungültiges Argument zum Codieren des Datums
 
Nimm einmal Word statt Integer.

Metallicwar 21. Jan 2011 11:19

AW: Ungültiges Argument zum Codieren des Datums
 
Scheint mir so, als ob der Report Calculator kein Datentyp Word unterstützt? :O

Delphi-Quellcode:
procedure VarMonatPruefenOnCalc(var Value: Variant);
var
  idTag, idMonat, idJahr: Word;
  LetzterTag : TDateTime;
begin
  LetzterTag := EncodeDate(DBPipelineUPlaner_Config['Jahr'], DBPipelineUPlaner_Config['Monat']+1, 1) - 1;
  DecodeDate(LetzterTag,idJahr,idMonat,idTag);
  value := idTag;
end;
Error Line 3: Expected type, but found 'word' instead


Folgende Datentypen sind im Calculator verwendbar:
Code:
Currency
Double      
Extended  
Integer
Single  
Char                  
String
In Delphi lässt er bei mir ja Integer nicht einmal zu:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  idTag, idMonat, idJahr: Integer;
  LetzterTag : TDateTime;
begin
  LetzterTag := EncodeDate(2011, 12, 1) - 1;
  DecodeDate(LetzterTag,idJahr,idMonat,idTag);
  ShowMessage(IntToStr(idTag));
end;
Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen.

DeddyH 21. Jan 2011 11:42

AW: Ungültiges Argument zum Codieren des Datums
 
Da hilft wohl nur ein Blick in die Dokumentation des Report Calculators.

Metallicwar 21. Jan 2011 11:49

AW: Ungültiges Argument zum Codieren des Datums
 
ja da gibt es auch schon eine Möglichkeit, über die "Pass-Through Functions" lassen sich Funktionen, DLL calls, WIN API Calls in den Report Generator importieren ..
Bleibt mir wohl keine andre Möglichkeit übrig, als mich in das Themengebiet einzuarbeiten.

shmia 21. Jan 2011 14:13

AW: Ungültiges Argument zum Codieren des Datums
 
Du hast die Standardstrategie zur Fehlersuche noch nicht angewendet!
Wenn in einer komplexen Sourcecodezeile ein unerklärlicher Fehler auftritt,
dann sollte man mehrere Zeilen daraus machen:
Delphi-Quellcode:
var
  idTag, idMonat, idJahr: Integer;
  LetzterTag : TDateTime;
begin
  LetzterTag := EncodeDate(2011, 12, 1); // 1. Zeile
  LetzterTag := LetzterTag - 1.0;       // 2. Zeile
  DecodeDate(LetzterTag,idJahr,idMonat,idTag);
  value := idTag;
end;
Tritt der Fehler nun in Zeile 1 oder Zeile 2 auf?
Wahrscheinlich Zeile 1, oder?

Nächster Schritt: Scriptfunktion soweit vereinfachen, bis nur noch die fehlerhafte Zeile übrig bleibt:
Delphi-Quellcode:
var
  LetzterTag : TDateTime;
begin
  LetzterTag := EncodeDate(2011, 12, 1);
end;
Vielleicht wurde die Funktion EncodeDate() abweichend zum Delphi-Standard implementiert; das lässt sich leicht überprüfen:
Delphi-Quellcode:
var
  LetzterTag : TDateTime;
begin
  LetzterTag := EncodeDate(1, 12, 2011);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:49 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