Delphi.cz

Český portál Delphi

FireDAC - z praxe 1

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;

Datum: 2013-03-16 01:01:00 Tagy: FireDAC, AnyDac

Praxe