Forum Delphi.cz

Delphi => FireDAC => Téma založeno: Stanislav Hruška 14-07-2015, 13:44:51

Název: FireDAC - Expression illegal in evaluator (Vyriešené)
Přispěvatel: Stanislav Hruška 14-07-2015, 13:44:51
Kód: [Vybrat]
  TTeams = class(TTableVst)
  strict private
    FqrIDTeams, FqrTitle, FqrSerialNumber, FqrActive: TField;
....
  FVSTQuery.SQL.Add(
  'SELECT Teams.IDTeams, Teams.Title, Teams.SerialNumber, Teams.Active'+
  ' FROM Teams INNER JOIN Clubs ON Teams.FKClubs = Clubs.IDClubs'+
  ' WHERE (Teams.FKClubs = :FKClubs)'+
  ' ORDER BY Teams.SerialNumber');

  FVSTQuery.ParamByName('FKClubs').AsInteger := 0;
  FVSTQuery.Open();
  FqrIDTeams := FVSTQuery.FieldByName('IDTeams');
  FqrTitle := FVSTQuery.FieldByName('Title');
  FqrSerialNumber := FVSTQuery.FieldByName('SerialNumber');
....
  NodeData.SerialNumber := FqrSerialNumber.AsInteger;  // Expression illegal in evaluator
Až na uvedený prípad mi všetko funguje. SQL je v poriadku - je tam hodnota. FVSTQuery je vytváraný dynamicky.
Ide o Access a typ poľa je Byte (pre istotu so ho zmenil na integer - bez výsledku).

Pri práci priamo s tabuľkou problém nenastane.

Nerozumiem tomu, ale pomohla takáto zmena:
Kód: [Vybrat]
  'SELECT Teams.IDTeams, Teams.Title, Teams.Active, SerialNumber'+
Název: Re:FireDAC - Expression illegal in evaluator (Vyriešené)
Přispěvatel: Stanislav Hruška 14-07-2015, 14:56:58
Tešil som sa predčasne. Tých zmätkov tam bolo podstatne viac.
Nakoniec som sa musel vzdať dynamickej tvorby FDQuery. Asi mi tam niečo uniká.
Název: Re:FireDAC - Expression illegal in evaluator (Vyriešené)
Přispěvatel: Radek Červinka 14-07-2015, 15:29:57
Tešil som sa predčasne. Tých zmätkov tam bolo podstatne viac.
Nakoniec som sa musel vzdať dynamickej tvorby FDQuery. Asi mi tam niečo uniká.

Asi jo, protože všecky moje (tuny) query jsou generované dynamicky.

Jen taková myšlenka:
používáš FVSTQuery.SQL.Add, nekupí se ti tam SQL příkazy?
Tj. FVSTQuery.SQL.Clear?
Název: Re:FireDAC - Expression illegal in evaluator (Vyriešené)
Přispěvatel: Stanislav Hruška 14-07-2015, 15:38:14
Citace
Tj. FVSTQuery.SQL.Clear?
To nie. Pre každý objekt je FVSTQuery jedinečný a napĺňam ho len raz - pri myClass.Create.
Najskôr predpokladám, že mám problém v určení typu parametra: vstupný + integer. Používal som fintu, že som mu priradil 0 a potom FVSTQuery.Open. Za tým nasledovalo priradzovanie polí do TField (FqrXXX). Je to aj v ukážke. 

Dostával som rôzne chyby. Od uvedenej cez nezmyselné hodnoty (náhodné) pre PrimaryKey, že Field''
 nemá priradený dataset...

Neviem ktoré FD unity musím mať v uses. (Hodil som ich tam pre istotu všetky - nič). Môžeš sem hodiť nejakú ukážku?

PS: Pracujem, mal som prestávku, na preklade helpu k TRibbon. Potom Ti ho pošlem
Název: Re:FireDAC - Expression illegal in evaluator (Vyriešené)
Přispěvatel: Stanislav Hruška 14-07-2015, 18:59:24
Upresňujem. Pri práci so samotným FDQuery nie je žiaden problém.
Název: Re:FireDAC - Expression illegal in evaluator (Vyriešené)
Přispěvatel: Stanislav Hruška 15-07-2015, 07:21:24
Napadlo ma:
Vytvorím Query, otvorím ho, priradím TField do premenných a Query zavriem.
V tej chvíli stratím prepojenie na TField v Query.

Ak vytváram Query staticky, tak vždy použijem Fields editor na vygenerovanie zoznamu polí. To sa pri dynamicky vytváranom nedeje.

Je úvaha správna?
Název: Re:FireDAC - Expression illegal in evaluator (Vyriešené)
Přispěvatel: pf1957 15-07-2015, 08:23:35
Vytvorím Query, otvorím ho, priradím TField do premenných a Query zavriem.
V tej chvíli stratím prepojenie na TField v Query.
Samozrejme: ty si zapamatujes pointer na instanci TField, ale ta instance zanikne spolu s instanci query, takze jakmile zavres query, nesmis pouzit zapamatovany odkaz na jiz zrusenou instanci TField, protoze ukazuje donikam (a projevem navenek muze byt zejmena cokoli).

Název: Re:FireDAC - Expression illegal in evaluator (Vyriešené)
Přispěvatel: Stanislav Hruška 15-07-2015, 09:47:11
Heuréka. Takže neostáva nič iné, len zakaždým po Open znova priradiť TField.
Ďakujem
Název: Re:FireDAC - Expression illegal in evaluator (Vyriešené)
Přispěvatel: pf1957 15-07-2015, 12:34:45
Heuréka. Takže neostáva nič iné, len zakaždým po Open znova priradiť TField.
No hlavne je treba se na to podivat z jineho uhlu pohledu: proc vubec potrebujes "vytahnout" field z datasetu?

Ma-li to slouzit jako vytknuti invariantu, abys opakovane neresolvoval napr. FieldByName apod., tak vetsinou muzes vytahnout rovnou hodnotu pole, ne?
Název: Re:FireDAC - Expression illegal in evaluator (Vyriešené)
Přispěvatel: Radek Červinka 15-07-2015, 13:03:05
Heuréka. Takže neostáva nič iné, len zakaždým po Open znova priradiť TField.
No hlavne je treba se na to podivat z jineho uhlu pohledu: proc vubec potrebujes "vytahnout" field z datasetu?

Ma-li to slouzit jako vytknuti invariantu, abys opakovane neresolvoval napr. FieldByName apod., tak vetsinou muzes vytahnout rovnou hodnotu pole, ne?

No třeba já to tak často dělám, když procházím celý dataset. Hodnota pole je ti k ničemu, jelikož je pro každý řádek přece jiná, ale Field je stejný, takže je to značná optimalizace.
Název: Re:FireDAC - Expression illegal in evaluator (Vyriešené)
Přispěvatel: pf1957 15-07-2015, 13:27:12
No třeba já to tak často dělám, když procházím celý dataset. Hodnota pole je ti k ničemu, jelikož je pro každý řádek přece jiná, ale Field je stejný, takže je to značná optimalizace.
Mas pravdu, ja to taky delal, akorat jak uz v Delphi nic nedelam, tak HOSIP. Sorry za sum.
Název: Re:FireDAC - Expression illegal in evaluator (Vyriešené)
Přispěvatel: Stanislav Hruška 15-07-2015, 14:39:03
Citace
No třeba já to tak často dělám, když procházím celý dataset.
To je aj môj prípad. Celý dataset dávam do VirtualStringTree prípadne do ComboBox. A táto technika bola nedávno spomenutá na tomto fóre. Ja by som na to nikdy neprišiel ;)

Poznámka: Ale som veľmi rád, že mi došlo o čo ide. Asi už začínam rozmýšľať :)
Název: Re:FireDAC - Expression illegal in evaluator (Vyriešené)
Přispěvatel: Stanislav Hruška 08-04-2018, 14:06:10
A to sa ako robí. Prosím kľúčové slová alebo odkaz.