[ salvaric @ 19.10.2013. 15:31 ] @
Pozdrav društvo,

Program koristi dve identične baze (mdb), u jednoj su svi podaci a druga služi kao privremeno skladištenje za obradu. To sam uradio iz razloga što se program koristi na mreži i koristi ga više korisnika u isto vreme, pa da nebi bilo neželjenih efekata nad glavnom bazom, pucanja veza itd...

Hteo sam da napravim UPDATE posle izmene podataka, koji će iz privremene tabele jedne baze update-ovati podatke u tabelu glavne baze, kako bi što manje glavna baza bila zauzeta.
Code:

UPDATE tabPartneri A in "c:\baza.mdb" set ROW = (select * tabPartneri B in "c:\baza_privremena.mdb" where A.IDPartnera=B.IDPartnera)


Dal je moguće to izvesti, pošto mi ovaj kod daje grešku,
jer bih hteo izbeći ispisivanje svih kolona tipa: set a.idpartnera=b.idpartnera,a.naziv=b.naziv..., imam dosta tabela i kolona unutar njih, pa sam hteo skratiti kod.

[Ovu poruku je menjao salvaric dana 19.10.2013. u 16:42 GMT+1]
[ salvaric @ 20.10.2013. 09:23 ] @
Ovaj primer sam našao negde na net, al ne fercera.

Dal neko zna neki elegantniji način da update-ujem podatke iz jedne u drugu bazu a da pti tome ne ispisujem sve kolone u sql upitu, ili da primenim metodu brisanja pa insert podataka u glavnu bazu, što bi trebalo malo duže da traje od update-a?
[ reiser @ 20.10.2013. 09:53 ] @
Prvo resenje je da odradis CopyFile(backup_baza, main_basa, FALSE), s' tim sto bi onda morao da privremeno zatvoris bazu prilikom kopiranja.
Drugo resenje je koriscenjem SQL-a, ali ne znam kako bi glasio query, verovatno bi trebao da koristis cursor.
A trece i najispravnije resenje je da koristis neku bazu koja zapravo podrzava concurrent access. :)
[ salvaric @ 22.10.2013. 12:32 ] @
CopyFile(backup_baza, main_basa, FALSE)
mi nemože pomoći iz razloga što pomoćna baza u tabelama sadrži samo one slogove koji se trenutno edituju i posle update-a bi ih trebalo izbrisati.
Glavna baza je već prepuna podacima, tako da sam hteo da je iskoristim i doradim program sa kreiranjem pomoćne, kako bih rasteretio glavnu.

Dal neko zna SQL kod za UPDATE svih polja odjednom, bez da se ispisuju, nad tabelama koje imaju istu strukturu polja?
[ Rapaic Rajko @ 22.10.2013. 13:47 ] @
A da dobacis koju gresku dobijas s onim gore, u prvom postu teme..?

Pozz
[ salvaric @ 22.10.2013. 21:08 ] @
Izvini što se nisam ranije javio,

rešio sam problem sa ovim, napravio sam funkciju koja će pokupiti sve nazive kolona iz tabele i smestiti u stringlist i posle sa for petljom ispisati sql upit, sa primenom parametara.

Code:
 
var
ListaKolona:TStringList;
Lista: String;
begin
       ListaKolona:=TStringList.Create;
       ListaKolona:=UcitajKolone(Modul.TabPartneri);
        with Modul.TabPartneri do
          begin
             for I := 0 to ListaKolona.Count - 1 do
                begin
                  if Lista = '''' then
                     Lista:=ListaKolona.Strings[i]).Value + ''=:''+ListaKolona.Strings[i]).Value
                  else
                     Lista:=Lista+'',''+ListaKolona.Strings[i]).Value + ''=:''+ListaKolona.Strings[i]).Value
               end;             
             SQL.Clear;
             SQL.Add('UPDATE tabPartneri A in "'+Baza+'" SET '+Lista);
             SQL.Add('where IDPartnera='+IntToStr(ID));
             for I := 0 to ListaKolona.Count - 1 do
              begin
                 Parameters.ParamByName(ListaKolona.Strings[i]).Value:= ModulObrada.tabPartneri.FieldByName(ListaKolona.Strings[i]).Value;
              end;
             ExecSQL;
           end;
end;



To sve radi kako treba, samo sad je nastao problem posle update, pošto se DBGrid-om prikazuju podaci pomoću ADOTable-a koji je konektovan na glavnu bazu, i posle izmene podataka odradim close i open te tabele pa onda na Locate da bih locirao izmenjeni slog, al mi ne osveži podatke koji su izmenjeni, tek posle druge izmene sve radi kako treba, DBGrid ih prikaže, ali svako prva izmena, prilikom novog pokretanja programa neće da prikaže izmene. Pokušavao sam sa Refresh, Requery, al nikako privu izmenu da pri-kaže.

Dal neko zna u čemu je caka?
[ savkic @ 23.10.2013. 13:07 ] @
> open te tabele pa onda na Locate da bih locirao izmenjeni slog, al mi ne osveži podatke koji su izmenjeni, tek posle druge izmene sve radi kako treba, DBGrid ih prikaže,
> ali svako prva izmena, prilikom novog pokretanja programa neće da prikaže izmene. Pokušavao sam sa Refresh, Requery, al nikako privu izmenu da pri-kaže.

Ako ne vidis updejtovane podatke obično to znači sledeće:
- transakcija koja je uradila updejt nije commitovana
- upit koji čita podatke koristi transakciju koja ne vidi podatke. Rešenje: zatvoriti upit, startovati novu transakciju i poslati novi upit
[ rankez @ 14.12.2013. 07:01 ] @
Ja imam sličan problem.

Imam dve mdb baze koje su potpuno identične strukture. U jednoj su podaci obrađeni u toku jednog dana a u drugoj su svi podaci. Imam potrebu da podatke iz dnevne baze dodam (append) u glavnu bazu.

Razmišljam na sledeći način (crenim sam označio problem):
Code:

var slog : [red]record[/red] //Kako definišem bilo kakav slog? 
Begin
  TableSve.Open;
  TableSve.Append;
  With TablePrivremena do 
  begin
    Open;
    While not EoF do
    begin
      slog:=[red]GetCurrentRecord;[/red]  //koju funkciju da upotrebim da izčitam ceo slog?
      TableSve.[red]AppendRecord[/red] :=slog; //koju funkciju da upotrebim dodam ceo slog u bazu?
      Next;
    end;
    Close;
  end;
  TableSve.Post;
  TableSve.Close;
end;


Nije problem da se ovo uradi "polje po polje" ali je stvar u tome što je veliki broj polja pa sam mislio da upotrebim neku funkciju koja izčitava ceo slog iz baze i upisuje ga u drugu bazu (obe baze su iste strukture). Tražio sam po helpu (Delphi XE4) ali bezuspešno.


[ tkaranovic @ 22.12.2013. 01:57 ] @
Code:

  for i := 0 to Table1.FieldList.Count-1 do
    Table2.Fields.FieldByName(Table1.FieldList[i].Name).Value := Table1.FieldList[i].Value;