Problema:
A executar uma consulta SQL que envolva data, se o sistema operacional estiver em inglês acontece uma mágica e o mês vira dia e o dia vira mês.
Solução:
Como utilizamos os componentes da DevArt (que aliás aproveito para indicar) o Farias teve a feliz idéia de fazer uma classe descendente do TMSConnection sendo que logo após a conexão efetiva com o banco de dados ele definiu o formato da data da sessão no servidor de banco de dados baseado na configuração de data do sistema operacional do cliente.
O "pulo do gato" foi converter a string '03/02/01' para TDateTime e verificar qual número "virou" dia e dai por diante.
Bom, sem mais delongas, mostro abaixo a unit desenvolvida:
unit Unt_G4Connection;
interface
uses
Classes, Windows, SysUtils, db, MSAccess;
type
Tg4Connection = class(TMSConnection)
protected
procedure SetDateFormat;
procedure DoConnect; override;
end;
implementation
{ Tg4Connection }
procedure Tg4Connection.DoConnect;
begin
inherited;
Self.SetDateFormat;
end;
procedure Tg4Connection.SetDateFormat;
var
dDecode : TDateTime; //Buffer para a data convertida
sFormat : string; //Buffer para a instrução SQL SET DATEFORMAT
wDay : Word; //Buffer para o DIA
wMonth : Word; //Buffer para o MÊS
wYear : Word; //Buffer para o ANO
qSetFormat : TMSQuery; //Executor da instrução SQL
begin
sFormat := 'SET DATEFORMAT ';
wDay := 0;
wMonth := 0;
wYear := 0;
qSetFormat := nil;
try
qSetFormat := TMSQuery.Create(nil);
qSetFormat.Connection := Self;
dDecode := StrToDateTime('03/02/01');
DecodeDate(dDecode, wYear, wMonth, wDay);
case wDay of
3: if wMonth = 2 then
sFormat := sFormat +'DMY'
else
sFormat := sFormat +'DYM';
2: if wMonth = 3 then
sFormat := sFormat +'MDY'
else
sFormat := sFormat +'YDM';
1: if wMonth = 3 then
sFormat := sFormat +'MYD'
else
sFormat := sFormat +'YMD'
end;
qSetFormat.SQL.Clear;
qSetFormat.SQL.Add(sFormat);
qSetFormat.Execute;
finally
if Assigned(qSetFormat) then
qSetFormat.Free;
end;
end;
end.
Enjoy!