Jsem v procesu konverze větší DB aplikace z ADO -> FireDAC. Takže pár drobností.
Wait Cursor a spol
Nejdříve něco ohledně komponenty pro WaitCursor, která tak rozčiluje Bullheada a díky které Pawel v Brně nebyl schopen přeložit FireMonkey aplikaci s FireDAC. Vše je vysvětleno v dokumentaci, ale ve zkratce:
Jelikož je FireDAC (budu to používat místo AnyDAC) multiplatformní, bylo nutné navrhnout něco co by pokrývalo rozdíly v GUI frameworku, případně dokonce pokud není GUI dostupné (služba, konzole). Proto bylo zavedeno platformové GUI rozhraní a mezi nimi i IADGUIxWaitCursor. Takže když FireDAC potřebuje šachovat s kurzorem, volá metody rozhraní.
Standardně jsou dodávány 3 provideři - VCL (LCL), FMX a console. Stačí někam do projektu přidat do uses patřičný unit, nebo někam na formulář šoupnout patřičnou komponentu.
Pawel v Brně šoupl IMHO VCL komponentu na FMX formulář a problém byl na světě.
Takže ideálně i programátor by měl používat:
oWait: IADGUIxWaitCursor;
……
ADCreateInterface(IADGUIxWaitCursor, oWait);
oWait.StartWait;
try
……
finally
oWait.StopWait;
end;
ale to už je třešinka na dortu a podle mne nutná jen v případě x platform vývoje.
Řazení
U ADO jsem používal pro lokální řazení např.
Sort := 'ddValid DESC,dcName'
nově se to musí přepsat na
IndexFieldNames := 'ddValid:D;dcName';
tedy nahradit čárky za středníky a místo DESC psát :D.
Všechny volby jsou:
- 'D' - DESC
- 'A' - ASC
- 'N' - case-insensitive sort
DateTime Field x DateStamp
Tak tohle byl zákys na dvě hodiny. Jak jsem později zjistil, tak se problém netýká jen FireDAC, ale i jiných DB komponent. V podstatě jde o to, že ADO mapuje snad všechny DB pole typu čas a spol. na MS SQL na Field typu TDateTime. Novější komponenty jsou přesnější a některé druhy polí mapují i na Field typu TDateStamp. Jenže s tím některé vizuální komponenty moc nepočítají a Delphi RTL asi taky moc ne, čímž může vzniknout problém (a nebyl jsem s ním sám).
Řešením je nastavit u TADConnection mapování jednoho typu na druhý. To je celkem příjemná záležitost, kdy můžete specifikovat jak se který typ bude přemapovávat. Lze to specifikovat i jen u Query, ale já jsem chtěl obecnou platnost, takže jsem skončil u ADConnection.
Ještě poznámka: osvědčilo se mi vždy používat vlastní následníky DB komponent. V mém případě pak stačilo změnit předchůdce z ADO na FireDAC a měl jsem většinu práce hotovu. Takže jsem v mém následníku Connection nastavil:
with FormatOptions do
begin
OwnMapRules := True;
with MapRules.Add do
begin
SourceDataType := dtDateTimeStamp;
TargetDataType := dtDateTime;
end;
end;