Beim verwenden von Locate mit dem currency Datentyp in Kombination mit veränderten Formateinstellungen habe ich ein Problem.
Die Regionseinstellungen des Systems sind z.B. auf "Deutsch (Deutschland)" eingestellt (--> "," als Dezimaltrennzeichen)
Beim Programmstart wird das Dezimaltrennzeichen auf "." gewechselt:
DecimalSeparator := '.';
mit dieser Konfiguration schlägt jedes Locate auf AdoDataset fehl sofern ein currency-wert gesucht werden soll. D.h. der return value von Locate bleibt immer false.
Delphi-Quellcode:
var
x: currency;
begin
x := 2.5;
dataset.Locate('MWST_PROZ',VarArrayOf([x]),[]); //fail
dataset.Locate('MWST_PROZ',VarArrayOf([CurrToStr(x)]),[]); //works
Ich konnte das Problem beim debuggen hier lokalisieren:
Variants._VarToLStr:
Delphi-Quellcode:
...
varDouble: S := FloatToStr(V.VDouble);
varCurrency: S := CurrToWStrViaOS(V.VCurrency);
varDate: S := DateToWStrViaOS(V.VDate);
...
die Umwandlung von Currency-Variant zu string geht über die Funktion CurrToWStrViaOS, welche natürlich die Formateinstellung von Windows verwendet und beim Locate wird somit ein Filterstring generiert ("MWST_PROZ=2,5" statt MWST_PROZ="2.5") der nicht konsistent ist zu den Formateinstellungen in der Applikation. Der Datensatz kann dadurch nie gefunden werden.
Hat jemand eine Idee wie ich dieses verhalten ändern könnte? Vermutlich sind relativ viele solcher locates vorhanden und diese alle zu finden und mit dem Workaround "CurrToStr" zu versehen ist wohl relativ aufwendig und unschön