[ enes omeragic @ 31.07.2006. 07:26 ] @
Firebird bazi pristupam dbexpres komponentama (sqlconection,sqldataset) i sa (datasetprovader,clientdataset). Kada rucno upisujem podatke u clientdataset i iste hocu da zapisem u bazu (clientdataset.applyupdates(-1)) sve radi bez problema. Medjutim kada podatke ucitam u clientdataset iz xml fajla...dobijem ih u dbgrid ali da upisem u bazu nemogu,ne izbaci mi nikakvu gresku ali ih i ne upise. Gde gresim? Hvala...
[ delalt @ 31.07.2006. 16:48 ] @
Ovo ti je više pitanje za Pascal/Delphi/Kylix podforum. Isto bi se dešavalo da
koristiš i neki drugi RDBMS a ne Firebird.
Kad podatke u ClientDataSet učitaš iz nekog fajla, on prekida vezu sa bazom.
Jedan od načina da ovo riješiš je da runtime kreiraš još jedan CDS2, učitaš u njega
podatke iz fajla sa LoadFromFile..., a onda prolaziš taj CDS2 od prvog do zadnjeg
zapisa i prepisuješ u onaj CDS koji je inače ostao "povezan" na bazu (preko Providera...).
Kad malo razmisliš, ovo je i normalno, iz više razloga...
[ enes omeragic @ 01.08.2006. 07:18 ] @
>
>Probao sam tako kako si rekao ali mi izbacuje gresku 'mismatch'.Povezao sam
>dva cds-a preko jos jednog provajdera. Pronasao sam resenje preko ems data
>import programa. Ali bih voleo da to uradim i iz svoje aplikacije. Hvala u
>svakom slucaju...
[ delalt @ 01.08.2006. 09:16 ] @
Nismo se razumjeli, pomoćni CDS2 je totalno samostalan, ne vežeš ga ni za šta drugo
(osim za nekakav pomoćni DBGrid ako želiš da vidiš šta je učitano iz fajla a prije upisa u CDS1
i bazu). On samo služi da učitaš fajl.
Code:
CDS2.LoadFromFile('c:\...\fajl.cds');

Zatim ako želiš da ga prepišeš u CDS1 (i u bazu) onda uradiš ovo:
(podrazumijeva se da je ovaj CDS1 preko Provider-a i ostalog spojen na bazu i da možeš preko
njega čitati i upisivati podatke u bazu, kao što si već opisao ranije)
Code:
CDS2.First;
CDS1.Active := True;     // ovaj CDS1 učitava već postojeće podatke iz tabele u bazi (ako ih ima) 
CDS1.Last;
while not CDS2.Eof do 
  begin
    CDS1.Insert;
    CDS1.FieldByName('polje1').AsString := CDS2.FieldByName('polje1').AsString;
    CDS1.FieldByName('polje2').AsString := CDS2.FieldByName('polje2').AsString;
    // ............. dodaš isto za polja koja želiš ili sva polja
    CDS1.Post; 
    // ako hoćeš da ti odmah zapisuje u bazu onda u CDS1.AfterPost dodaš ono ApplyUpdates(-1) ...
    // ovdje kontolišeš da nije dupli itd...
    CDS2.Next;
end; 
CDS2.Close;    // ovaj CDS2 ti više ne treba
// dobio si dopunjene podatke u CDS1 i upisane u bazu 

[ enes omeragic @ 01.08.2006. 09:51 ] @
>
>To se trazilo. Nisam skontao prosli put bas najbolje. Ali evo sada radi.
>Hvala puno...
[ marcha @ 01.08.2006. 23:29 ] @
Evo ti ove dve metodice kojima sam sebi x puta olaksao posao prepisivanja podataka iz datasetova koji su slicnih struktura. Kopiraju se podaci iz polja izvornog dataseta (SRC) u ciljni (DEST) ako su im nazivi polja isti.

Code:

procedure CopyDbRow(Src, Dest:TDataSet);
var
  i:integer;
  f:TField;
begin
  for i:=0 to Src.FieldCount-1 do //prolazimo kroz sva polja izvornog dataseta
  begin
     f:=Dest.FindField(Src.Fields[i].FieldName);
     if f<>nil then //provera da li polje iz izvornog dataseta postoji u ciljnoj
       f.Value:=Src.Fields[i].Value;
  end; 
end;

procedure CopyTable(Src,Dest:TDataSet);
begin
 try
   Src.Open;
   while not Src.Eof do
   begin
      Dest.Insert;
      CopyDbRow(Src,Dest); 
      Dest.Post;
      Src.Next;
   end;
 finally
   Src.Close;
 end;
end;


primenjeno na kod koji ti je dao delalt:

CDS2.LoadFromFile('c:\...\fajl.cds');
CopyTable(CDS2,CDS1);