Forum Delphi.cz

Delphi => FireDAC => Téma založeno: 96877 04-09-2017, 14:42:50

Název: Maji kolekce FireDAC storage implementovan enumerator?
Přispěvatel: 96877 04-09-2017, 14:42:50
Mam starsi verzi FireDAC a te chybi implementace enumeratoru kolekci datoveho storage. Da se nasledujici kod prelozit rekneme v XE3 a vys (nebo alespon nejnovejsich verzich) nebo skonci na chybe E2431 (http://docwiki.embarcadero.com/RADStudio/en/E2431_for-in_statement_cannot_operate_on_collection_type_%27%25s%27_because_%27%25s%27_does_not_contain_a_member_for_%27%25s%27,_or_it_is_inaccessible_(Delphi))? Staci dropnout na form TFDQuery do uses manualne pridat snad jen FireDAC.DatS a zkusit zbuildovat tento kod:

Kód: Delphi [Vybrat]
  1. var
  2.   Row: TFDDatSRow;
  3.   Col: TFDDatSColumn;
  4. begin
  5.   for Row in FDQuery1.Table.Rows do ;
  6.   for Col in FDQuery1.Table.Columns do ;
  7. end;

To je vse, ptam se opravdu jen zda se takovyto kod da prelozit s "novym" FireDAC nebo skonci chybou E2431 (http://docwiki.embarcadero.com/RADStudio/en/E2431_for-in_statement_cannot_operate_on_collection_type_%27%25s%27_because_%27%25s%27_does_not_contain_a_member_for_%27%25s%27,_or_it_is_inaccessible_(Delphi)) (prip. jinou). Hezky paradox, tridy te storage znam skrz nazkrz a jedine co mi chybi je "nova" verze abych zjistil takovou malickost. Jsem to ale ostuda ::)

Dekuji :)
Název: Re:Maji kolekce FireDAC storage implementovan enumerator?
Přispěvatel: Stanislav Hruška 04-09-2017, 15:11:10
V XE7 chyba vyskočí v oboch prípadoch.
Název: Re:Maji kolekce FireDAC storage implementovan enumerator?
Přispěvatel: Radek Červinka 04-09-2017, 16:02:37
V XE 10.1 Berlin taky. Asi by to vyřešil class helper.
Název: Re:Maji kolekce FireDAC storage implementovan enumerator?
Přispěvatel: 96880 04-09-2017, 16:28:48
Diky obema. Jsem liny rozsirovat FireDAC ::) Enumerator pridam jen do sve storage.
Název: Re:Maji kolekce FireDAC storage implementovan enumerator?
Přispěvatel: Stanislav Hruška 04-09-2017, 20:40:46
Hm, tie Columns by sa asi dali nahradiť pomocou Fields. Ale Rows...
Název: Re:Maji kolekce FireDAC storage implementovan enumerator?
Přispěvatel: 96882 04-09-2017, 21:08:56
Hm, tie Columns by sa asi dali nahradiť pomocou Fields. Ale Rows...

Rows ne, protoze TDataSet nabizi jen pristup k aktualnimu zaznamu na ktery ukazuje kurzor. FireDAC v tomto pripade nabizi pristup k cele nactene kolekci dat. Proto nemusis chodit pri zachovani kurzoru na miste pro data napr. 3. radku takto (zapamatovat si pozici kurzoru, presunout jej, nacist data a presunout kurzor zpet):

Kód: Delphi [Vybrat]
  1. var
  2.   ID: Integer;
  3.   Bookmark: TBookmark;
  4. begin
  5.   Bookmark := FDQuery.GetBookmark;
  6.   try
  7.     FDQuery.RecNo := 2;
  8.     ID := FDQuery.FieldByName('ID').AsInteger;
  9.   finally
  10.     FDQuery.GotoBookmark(Bookmark);
  11.   end;
  12. end;

Ale jednoduse takto:

Kód: Delphi [Vybrat]
  1. var
  2.   ID: Integer;
  3. begin
  4.   ID := FDQuery.Table.Rows[2].GetData('ID');
  5. end;

Iterace pres vsechny zaznamy pak:

Kód: Delphi [Vybrat]
  1. var
  2.   ID: Integer;
  3.   Bookmark: TBookmark;
  4. begin
  5.   Bookmark := FDQuery.GetBookmark;
  6.   try
  7.     FDQuery.First;
  8.     while not FDQuery.Eof do
  9.     begin
  10.       ID := FDQuery.FieldByName('ID').AsInteger;
  11.       FDQuery.Next;
  12.     end;
  13.   finally
  14.     FDQuery.GotoBookmark(Bookmark);
  15.   end;
  16. end;

Pripadne:

Kód: Delphi [Vybrat]
  1. var
  2.   ID: Integer;
  3.   Row: Integer;
  4. begin
  5.   for Row := FDQuery.Table.Rows.Count - 1 do
  6.     ID := FDQuery.Table.Rows[Row].GetData('ID');
  7. end;
Název: Re:Maji kolekce FireDAC storage implementovan enumerator?
Přispěvatel: 96883 04-09-2017, 21:27:31
Tyjo, ceska repre by prohrala snad i s Vatikanem ;D
A ty kecy komentatoru :o ::)
Název: Re:Maji kolekce FireDAC storage implementovan enumerator?
Přispěvatel: miroB 27-11-2017, 20:55:05
Mam starsi verzi FireDAC a te chybi implementace enumeratoru kolekci datoveho storage. Da se nasledujici kod prelozit rekneme v XE3 a vys (nebo alespon nejnovejsich verzich) nebo skonci na chybe E2431 (http://docwiki.embarcadero.com/RADStudio/en/E2431_for-in_statement_cannot_operate_on_collection_type_%27%25s%27_because_%27%25s%27_does_not_contain_a_member_for_%27%25s%27,_or_it_is_inaccessible_(Delphi))? Staci dropnout na form TFDQuery do uses manualne pridat snad jen FireDAC.DatS a zkusit zbuildovat tento kod:

Kód: Delphi [Vybrat]
  1. var
  2.   Row: TFDDatSRow;
  3.   Col: TFDDatSColumn;
  4. begin
  5.   for Row in FDQuery1.Table.Rows do ;
  6.   for Col in FDQuery1.Table.Columns do ;
  7. end;

To je vse, ptam se opravdu jen zda se takovyto kod da prelozit s "novym" FireDAC nebo skonci chybou E2431 (http://docwiki.embarcadero.com/RADStudio/en/E2431_for-in_statement_cannot_operate_on_collection_type_%27%25s%27_because_%27%25s%27_does_not_contain_a_member_for_%27%25s%27,_or_it_is_inaccessible_(Delphi)) (prip. jinou). Hezky paradox, tridy te storage znam skrz nazkrz a jedine co mi chybi je "nova" verze abych zjistil takovou malickost. Jsem to ale ostuda ::)

Dekuji :)

No mozno to uz nie je aktualne, ale na SO posobi nejaka Vicoria, a ta zda sa do problemu hodne vidi. Taketo urovne nie su celkom moja parketa, ale pozri, ci by ti tento odkaz nepomohol:
https://stackoverflow.com/questions/46030464/how-to-transform-firedac-tquery-results-to-tstringlist (https://stackoverflow.com/questions/46030464/how-to-transform-firedac-tquery-results-to-tstringlist)
Název: Re:Maji kolekce FireDAC storage implementovan enumerator?
Přispěvatel: 97930 27-11-2017, 23:23:23
No mozno to uz nie je aktualne, ale na SO posobi nejaka Vicoria, a ta zda sa do problemu hodne vidi. Taketo urovne nie su celkom moja parketa, ale pozri, ci by ti tento odkaz nepomohol:
https://stackoverflow.com/questions/46030464/how-to-transform-firedac-tquery-results-to-tstringlist (https://stackoverflow.com/questions/46030464/how-to-transform-firedac-tquery-results-to-tstringlist)

Dekuju! Uz mam Tokyo :) Ono slo opravdu jen o to zda se da kod prezentovany v otazce zkompilovat v "novych" verzich (idealne aktualni). Coz neda ani ve FireDAC dodavanym s Delphi Tokyo, tudiz enumerator implementovan neni (overeno).

P.S. Victoria na StackOverflow se vyzna protoze na to neni sama. Pokud si nevi rady, dokaze se snadno poradit se mnou, s puvodnim autorem FireDAC, nebo dalsimi ;)