Forum Delphi.cz

Delphi => FireDAC => Téma založeno: Stanislav Hruška 03-04-2016, 09:44:38

Název: FireDAC - clone
Přispěvatel: Stanislav Hruška 03-04-2016, 09:44:38
Pokúšam sa podľa príkladu vytvoriť klon tabuľky. Nijako sa mi to nedarí.
Kód: Delphi [Vybrat]
  1.   clnPersonTypes := TFDMemTable.Create(Self);
  2.   clnPersonTypes.CloneCursor(tblPersonTypes);
  3.  
Project JasotSVB.exe raised exception class EFDException with message '[FireDAC][Comp][Clnt]-303. Capability is not supported'.


S Query to ide bez problémov. Ale to už je niečo naviac.
Název: Re:FireDAC - clone
Přispěvatel: Stanislav Hruška 03-04-2016, 10:39:03
Keď som si prečítal, že TFDTable generuje SQL query, tak ma to už netrápi. Ale i tak chcem vedieť prečo to s tabuľkou nejde, keď to je TFDDataSet.
Název: Re:FireDAC - clone
Přispěvatel: Stanislav Hruška 03-04-2016, 13:35:43
HM, vychádza mi, že TFDTable sú "persistent data" a to nie je podporované.
Název: Re:FireDAC - clone
Přispěvatel: Radek Červinka 09-04-2016, 00:38:47
Co vlastne chces opravdu delat? Nestaci ti spise pouzit FDMemTable http://delphi.cz/post/FireDac-TFDMemTable.aspx (http://delphi.cz/post/FireDac-TFDMemTable.aspx)

Jinak pokud se u TFDDatasetu dostanes na Table.Rows , tak si muzes delat co chces. vcetne nahrazovani radku datasetu ale je to trosku hardcore. A dostanes se na to celkem jednoduse.
Název: Re:FireDAC - clone
Přispěvatel: Stanislav Hruška 09-04-2016, 09:50:31
Citace
Co vlastne chces opravdu delat?
Mám otvorenú tabuľku a potrebujem ju len prechádzať a čítať. Bez toho aby s mi menil stav komponentov napojených na tabuľku. Jedna z techník je použiť Clone. A ako zdroj uloženia dát som sa rozhodol pre FDMemTable. Myslel som si, že si urobím klon priamo z tabuľky. Ale to mi ani raz neprešlo. Teraz to mám pomocou Query. Mohol by som pracovať aj priamo s Query.
Název: Re:FireDAC - clone
Přispěvatel: Radek Červinka 09-04-2016, 10:02:55
No a kdyz pouzijes klasickou konstrukci
Kód: [Vybrat]
bmk: TBookmark;
begin
  bmk := dataset.GetBookmark;
  dataset.DisableControls;
  try
    dataset.First;
    ... tady si delej co chces
  finally
     dataset.gotobookmark(bmk);
     dataset.freebookmark(bmk);
     dataset.enablecontrols;
  end;
   
Název: Re:FireDAC - clone
Přispěvatel: Stanislav Hruška 09-04-2016, 10:06:08
Tak som to mal pôvodne :)  Nepáčila sa mi tam v pozadí tá zbytočná práca navyše.
Název: Re:FireDAC - clone
Přispěvatel: Delfin 08-04-2018, 14:53:08
Co vlastne chces opravdu delat? Nestaci ti spise pouzit FDMemTable http://delphi.cz/post/FireDac-TFDMemTable.aspx (http://delphi.cz/post/FireDac-TFDMemTable.aspx)

Jinak pokud se u TFDDatasetu dostanes na Table.Rows , tak si muzes delat co chces. vcetne nahrazovani radku datasetu ale je to trosku hardcore. A dostanes se na to celkem jednoduse.

K Table.Rows se u tridy TFDDataSet dostanes vzdy. A zadny "hardcore" to neni. Pristup k interni storage je mnohem intuitivnejsi nez prace s TDataSet API, viz. treba srovnani ziskani hodnoty konkretniho zaznamu nebo iteraci resultsetu (https://forum.delphi.cz/index.php/topic,15801.msg96882.html#msg96882). Co se tyce uprav storage a nasledneho promitnuti do dataset objektu; zavolat Resync neni zas tak moc ;)
Název: Re:FireDAC - clone
Přispěvatel: František 17-04-2018, 16:37:36
Kód: [Vybrat]
function GetMemTable(SQLcommand:string): TFDMemTable;
var
  qq:TFDQuery;
  dm: TFDDataMove; // v DX tusim BatchMove (mám XE5)
begin
// vytvorím konekšn
//SQLcommand open do qq

Result := TFdmemtable.Create(Self);
dm := TFDDataMove.Create(Self);

dm.Destination := result;
dm.Source := qq;
dm.Execute;
//uzavrem konekšn a funkcia mi vráti MemTable
end
takto mi zostal rezult z funkcie aj po odpojeni od DB servera
Název: Re:FireDAC - clone
Přispěvatel: Delfin 17-04-2018, 16:50:33
Kód: [Vybrat]
function GetMemTable(SQLcommand:string): TFDMemTable;
var
  qq:TFDQuery;
  dm: TFDDataMove; // v DX tusim BatchMove (mám XE5)
begin
// vytvorím konekšn
//SQLcommand open do qq

Result := TFdmemtable.Create(Self);
dm := TFDDataMove.Create(Self);

dm.Destination := result;
dm.Source := qq;
dm.Execute;
//uzavrem konekšn a funkcia mi vráti MemTable
end
takto mi zostal rezult z funkcie aj po odpojeni od DB servera

Ke kopirovani datasetu slouzi metoda CopyDataSet (http://docwiki.embarcadero.com/Libraries/en/FireDAC.Comp.DataSet.TFDDataSet.CopyDataSet) nebo prime prirazeni pres property Data (http://docwiki.embarcadero.com/Libraries/en/FireDAC.Comp.DataSet.TFDDataSet.Data). Komponenta TFDDataMove slouzi spis k presunu dat mezi databazemi (byt se pro tento ucel da taky vyuzit).