[ bobans72 @ 05.10.2014. 23:24 ] @
Pozdrav.

Kako mogu automatski da učitavam podatke kao klient sa server aplikacije bilo to da je dodavanje ili brisanje ili izmena ja sam probao ovim kodom ali ništa se ne dešava.
U pitanju je zeos tabla i firebird baza.

Code:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
with ZTable1 do
 try
  disablecontrols;
  close;
  open
 finally
  enablecontrols
end;
end;

[ captPicard @ 06.10.2014. 11:22 ] @
Koju grešku dobivaš? Koja ti je putanja do baze i gdje je baza?
[ savkic @ 06.10.2014. 13:22 ] @
> Kako mogu automatski da učitavam podatke kao klient sa server aplikacije bilo to da je dodavanje ili brisanje ili izmena ja sam probao ovim kodom
> ali ništa se ne dešava. U pitanju je zeos tabla i firebird baza.

Ako te dobro pratim, želiš da refrešuješ tabelu (na klijentu) koja je izmenjena na serveru (ili drugom klijentu)?
Ovo što si napisao je ispravan put, samo ti još treba i transakcija, moraš je komitovati i tamo gde je bila izmena a i ovde gde čitaš podatke.
[ bobans72 @ 06.10.2014. 17:14 ] @
Ne dobijam ni jednu grešku.Putanja je ka server aplikaciji gde se nalazi i baza.
A klient aplikacija samo prima podatke sa server aplikacije i baze na connect ali da ne bih se stalno radilo connect-deconnect ja sam to hteo da to odradi timer sa onim kodom ali nista se ne desi samo jedanput kada pokrenem klient aplikaciju on automatski pročita jedanput i kada dodam na server aplikaciji ili izmenim ili obrišem kod klienta se ne dešava nikakva promena, tajmer je postavljen na TRUE.

Da ovo mi je potrebno što je pitao Savkić da refrešujem tablu tajmerom ja sam stavio interval na 5000 možda je i mali interval pa ne može odraditi refresh.

Probao sam ovo što je napisao Savkić.

SERVER:
Code:

//Server
procedure TForm1.ZTable1AfterPost(DataSet: TDataSet);
begin
 ZConnection1.AutoCommit := True;
ZConnection1.StartTransaction;
try
ZTable1.Post;
 ZConnection1.Commit;
 except
  ZConnection1.Rollback;
end;
end;

CLIENT:
Code:

//Client
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 ZConnection1.AutoCommit := True;
ZConnection1.StartTransaction;
 with ZTable1 do
 try
  disablecontrols;
  close;
  open
 finally
  enablecontrols;
  ZTable1.Connection.Commit;
end;
end;

I dalje ne postoji nikakva izmena kod klienta niti prikazuje bilo koju grešku, sigurno nisam nešto dobro postavio.
Potrebno bilo koje rešenje. Pozz...



[Ovu poruku je menjao bobans72 dana 06.10.2014. u 18:48 GMT+1]

[Ovu poruku je menjao bobans72 dana 06.10.2014. u 18:59 GMT+1]
[ captPicard @ 06.10.2014. 17:40 ] @
Koliko znam, auto commit se događa nakon Post. Da li ti negdje napraviš .Post? Inače, kada god commitaš transakciju na koju je vezan dataset, promjena bi se morala vidjeti na drugoj strani ukoliko koristiš istu transakciju. Btw, ne znam koliko ti je pametno na timer commitat, šta ako je user u Edit modu?
[ bobans72 @ 06.10.2014. 18:11 ] @
Da imam ZTable1: append, edit, post, cancel, delete.
Ja sam odabrao Timer ali mi nije bitno ako postoji bilo koji drugi način ili rešenje je dobrodošlo, samo da može automatski da klient prima podatke u kratkom vremenskom periodu zato sam ja to hteo Timer-om ali ako nije dobar način može bilo koji drugi.
[ savkic @ 06.10.2014. 19:18 ] @
> ZConnection1.AutoCommit := True;

Ovo ti ne treba.

> ZConnection1.StartTransaction;

Koji su ti parametri transakcije, da li koristiš commit retaining? Takođe transakciju treba da startuješ pre nego počneš sa izmenama (dakle u BeforeEdit, BeforeInsert) ili nešto drugo zavisno kako radiš izmene.

Takođe proveri da li ZTable1 koristi ZConnection transakciju.

Osim toga kod je OK i ako su promene komitovane u bazu moraš ih videti i na klijentu, ako ih ne vidiš onda ti ili nije dobra transakcija (gleda neke stare podatke) ili nisu još ni upisani. Proveri da li vidiš izmene u nekom admin alatu, tipa IBExpert, FlameRobin.
[ komplikator @ 07.10.2014. 07:17 ] @
Zašto se igraš timerima i potencijalno na client vučeš možda nepotrebne podatke?
Jesi razmislio o FB Eventima/Alertima? Ako ih se pametno koristi i idluči što i kada osvježavati možeš dobiti dobre rezultate. Ako se ne varam ZEOS DBO/LIB ima komponentu koja ih podržava.

I nisam shvatio koji ti je to serverski program? Sam FB server, ili imaš nekakav aplikacijski sloj? Ako imaš aplikacijski sloj onda bi on trebao brinuti o podacima i clientima broadcastati neki signal (donekle slično rade i FB eventi, imaš članaka o njima pa ih prouči).
[ bobans72 @ 07.10.2014. 15:22 ] @
Pozdrav za sve zainteresovane za moj problem.

Odgovor na Savkićeva pitanja: commit retaining je uključen, ZTable1 koristi transakciju ZConnection u Properties je postavljen TransactIsolationLevel:=tiReadCommitted u klient aplikaciji ali sam stavio i (tiNone) nema promene.
Koristim IBExpert i proverio svaka izmena se vidi kompletno.
Ovako da objasnim ponovo: Na mom računaru se nalazi Firebird server, moja aplikacija u kojoj ja trebam da dodajem,menjam,brišem, a tu se nalazi i baza
u kojoj sve te izmene čuvam. A na drugom računaru se nalazi druga klient aplikacija koja je povezana sa bazom iz prvog računara tako da klient aplikacija treba da prikaže
svaku izmenu koja se desila na serverskoj aplikaciji iz prvog računara.Klient aplikacija sve to prikaže samo na ponovni connect pa disconnect ali da ne bih klient to stalno radio hteo sam to uraditi timer-om da na vreme od jednog minuta ili non-stop prikaže uvek nove podatke.
Pa sam sada probao ponovo sa Timer-om ali sam dodao ZConnection.Connect i ZConnection.Disconnect; u klient aplicaciji koja prima podatke.
Stavio interval timer-a na 60000 i to sve radi besprekorno kada izvršim bilo koju izmenu na serverskoj aplikaciji za taj (1 minut) klient aplikacija primi nove podatke.
Ali šta se desi da kada pregledam te podatke on stalno vraća na početak odaberem neki rekord 5 ili 20 on posle tog 1 minuta vrati na početak tako da ne mogu duže vreme da pregledam podatke uvek me vraća na početak a to nije dobro za drugog korisnika. Mogu ići i na timer.enabled:False; ali to već nije automatski pregled.
Tako da ovo sa timer-om možda i nije neko rešenje u mom slučaju.
Evo koda:
Code:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 with ZTable1 do
 try
  DisableControls;
  Close;
  ZConnection1.Disconnect;
  Open;
 finally
  ZConnection1.Connect;
  EnableControls;
end;
end;

A što se tiče Komplikator-ovog pitanja napisao sam na Savkić-ev odgovor, a sa FB Eventima/Alertima nisam ništa dosad radio i ne znam kako funkcionišu ali sam video da ima u ZEOS TZIBEventAlerter.
Da li je možda problem jer mi je u bazi postavljen u (ID) primarni ključ ?
Nemam ni jednu ideju u čemu može da bude problem.

Evo postavio sam i moju bazu možda je u njoj problem.


[Ovu poruku je menjao bobans72 dana 07.10.2014. u 16:34 GMT+1]
[ savkic @ 07.10.2014. 16:25 ] @
> Odgovor na Savkićeva pitanja: commit retaining je uključen,

Isključi i koristi _uvek_ i samo hard commit (običan Commit), nikada CommitRetaining.

> svaku izmenu koja se desila na serverskoj aplikaciji iz prvog računara.Klient aplikacija sve to prikaže samo na ponovni connect pa disconnect ali da ne bih
> klient to stalno radio hteo sam to uraditi timer-om da na vreme od jednog minuta ili non-stop prikaže uvek nove podatke.

Sasvim sigurno nije potrebno prekidanje konekcije, verovatno komponente nekako drže transakciju otvorenu i tek onda na zatvanje je oslobode i startuju novu.

> Pa sam sada probao ponovo sa Timer-om ali sam dodao ZConnection.Connect i ZConnection.Disconnect; u klient aplicaciji koja prima podatke.
> Stavio interval timer-a na 60000 i to sve radi besprekorno kada izvršim bilo koju izmenu na serverskoj aplikaciji za taj (1 minut) klient aplikacija
> primi nove podatke.
> Ali šta se desi da kada pregledam te podatke on stalno vraća na početak odaberem neki rekord 5 ili 20 on posle tog 1 minuta vrati na početak tako da ne mogu
> duže vreme da pregledam podatke uvek me vraća na početak a to nije dobro za drugog korisnika. Mogu ići i na timer.enabled:False; ali to već nije automatski pregled.

To je i logično, Close/Open dataseta sve se oslobađa i inicijalizuje na početne vrednosti tako da i kursor ide na početak. Možeš pre refresha da sačuvaš trenutni record i da se posle refresha vratiš na njega.

> Tako da ovo sa timer-om možda i nije neko rešenje u mom slučaju.

Možeš sa eventom dobiti obaveštenje kada je došlo do neke promene i tek tada na klijentu raditi refresh ili možeš poslati samo IDeve promenjenih recorda i onda njih refrešovati (ne znam da li zeos ima takvu mogućnost).
[ bobans72 @ 09.10.2014. 10:03 ] @
Evo pokušao sam probati da uradim sa TZIBEventAlerter komponentom ali mi ne ide baš najbolje.
Pošto sam pronašao neke primere na internetu pokušao sam ovako uraditi:
Prvo u bazi sam uneo ovo ali prijavljuje grešku neće kompajlirati.
Code:

CREATE TRIGGER POST_NEW_REG FOR tadresar
ACTIVE AFTER INSERT
POSITION 0
AS
BEGIN
 POST_EVENT 'new_reg';
END

A ovo sam dodao u klient aplikaciji:
Code:

procedure TForm1.ZIBEventAlerter1EventAlert(Sender: TObject; EventName: string;
  EventCount: Integer; var CancelAlerts: Boolean);
begin
   if EventName = 'new_reg' then
  Begin
  ZTable1.Refresh;
  End;
end;

Code:

procedure TForm1.FormCreate(Sender: TObject);
begin
   ZIBEventAlerter1.Events.Clear;
  ZIBEventAlerter1.Events.Add('new_reg');
  ZIBEventAlerter1.RegisterEvents;
end;


A u Klient aplikaciji ova greška:

Da li mi može neko reći šta je (new_reg) da li treba da se promeni naziv ?


[Ovu poruku je menjao bobans72 dana 09.10.2014. u 11:45 GMT+1]
[ captPicard @ 09.10.2014. 10:40 ] @
Ta greška ti znači da firebird server nije pokrenut. (ili je verzija baze drukčija od servera koji se vrti na računalu)
[ bobans72 @ 09.10.2014. 11:07 ] @
Ta mi se greška javila u klient aplicaciji kada sam pokušao da kreiram trigger i kompajliram pa se javila i u bazi.



Neznam kako da uradim event dogadjaj za klient-sku aplikaciju da se automatski refrešuje dok je aktivna nisam dosad to radio.
One gore kodove sam skinuo sa interneta e sad ne znam kako da ih primenim da bih preko komponente TZIBEventAlerter zeos komponente to refrešovalo
to mi je Komplikator i savkić dali ideju da to može tako da se uradi. Ako može objašnjenje u vezi ovoga ?
[ captPicard @ 09.10.2014. 12:18 ] @
Code:
procedure TForm1.FormCreate(Sender: TObject);
begin
   ZIBEventAlerter1.Events.Clear;
  ZIBEventAlerter1.Events.Add('new_reg');
  ZIBEventAlerter1.RegisterEvents;
end;


Možda je tu problem, ovaj kod pokrećeš prije nego se spojiš na bazu pretpostavljam?

Šta se trigera tiče, samo ovo ti mora pisati u "kodu" u IBExpertu:

Code:
AS
begin
  POST_EVENT  'test';
end
[ bobans72 @ 09.10.2014. 13:18 ] @
To sam upravo i uradio prepravio u bazi kompajlirao i sad ne prijavljuje grešku.
Takodje sam napisao ovo:
Prvo postavio TZIBEventAlerter komponentu u serverskoj aplikaciji gde dodajem, menjam, brišem, čuvam i u OnEventAlertu ovo:
Code:

procedure TForm1.ZIBEventAlerter1EventAlert(Sender: TObject; EventName: string;
  EventCount: Integer; var CancelAlerts: Boolean);
begin
  if EventName = 'new_reg' then
  Begin
  ZTable1.Refresh;
  End;
end;

Zatim takodje u serverskoj aplikaciji napisao ovo:
Code:

procedure TForm1.ZConnection1AfterConnect(Sender: TObject);
begin
 ZIBEventAlerter1.RegisterEvents;
end;

procedure TForm1.ZConnection1BeforeDisconnect(Sender: TObject);
begin
 ZIBEventAlerter1.UnRegisterEvents;
end;

Code:

procedure TForm1.FormCreate(Sender: TObject);
begin
 ZIBEventAlerter1.Events.Clear;
  ZIBEventAlerter1.Events.Add('new_reg');
  ZIBEventAlerter1.RegisterEvents;
end;


Tako da nigde sada ne prijavljuje grešku ali i ne radi refresh.
Da li je greška sto sam postavio TZIBEventAlerter1 komponentu i u njoj napisao ovaj dogadjaj u serverskoj aplikaciji gde vršim izmene a i gde je baza
ili sam to trebao postaviti u klijentskoj aplikaciji koja će se nalaziti u drugom računaru.
Znači pokrenem obe aplikacije i povežem ih sa bazom i dodam pa i obrišem podatke a u klientskoj aplikaciji se ne dešava nikakva promena.
U obe ZConnection komponentama sam stavio AutoCommit na (true) i u obe (TransactIsolationLevel=tiReadCommitted.
Ali kao što sam gore pisao da samo na connect i disconnect refreshuje tablu i sa ovim kodom:
Code:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 with ZTable1 do
 try
  DisableControls;
  Close;
 Open;
 finally
EnableControls;
end;
end;

Komplikator je gore napisao da ne bih to radio sa tajmer-om nego sa Eventima sigurno ima sa tim neko iskustvo. Pa da probam i taj način.
Evo kako je izgled u bazi:


[Ovu poruku je menjao bobans72 dana 09.10.2014. u 14:44 GMT+1]

[Ovu poruku je menjao bobans72 dana 10.10.2014. u 11:42 GMT+1]
[ captPicard @ 09.10.2014. 14:40 ] @
Opet si negdje izostavio Commit? Makni ono AutoCommit, to ti ne treba. On se izvršava nakon Post (njega isto nigdje ne vidim), ali bez obzira, bolje da ti sam odrediš kada da se dogodi Commit. Ako je ista transakcija, akda Commitaš mora se vidjeti izmjena. Da imam te tvoje komponente bi te pitao source da pogledam, ali ovako više ne mogu pomoći.
[ savkic @ 09.10.2014. 15:07 ] @
> Da li je greška sto sam postavio TZIBEventAlerter1 komponentu i u njoj napisao ovaj dogadjaj u serverskoj aplikaciji gde vršim izmene a i gde je baza
> li sam to trebao postaviti u klijentskoj aplikaciji koja će se nalaziti u drugom računaru.

Da, event komponente idu tamo gde želiš da dobiješ obaveštenje o izmenama, dakle u klijentsku aplikaciju.
[ bobans72 @ 09.10.2014. 16:22 ] @
Nešto sam u medjuvremenu odradio sada hoće da refreshuje ali klient aplikaciji
ZConnection.Database:=127.0.0.1:C:\Zeos Firebird Client Server\Server\BADRESAR.FDB
sa upisanim localnim serverom prijavljuje grešku a bez normalno radi.

[Ovu poruku je menjao bobans72 dana 10.10.2014. u 11:42 GMT+1]
[ savkic @ 09.10.2014. 18:40 ] @
> Nešto sam u medjuvremenu odradio sada hoće da refreshuje ali klient aplikaciji
> ZConnection.Database:=127.0.0.1:C:\Zeos Firebird Client Server\Server\BADRESAR.FDB
> sa upisanim localnim serverom prijavljuje grešku a bez normalno radi.

Kod FBa (i drugih baza) klijent se povezuje na server i otuda ide taj prvi deo, IP adresa (ili naziv) servera. Ako staviš 127.0.0.1 tj. localhost ti pokušavaš da se konektuješ na lokalni računar (na kome je i klijent) i to naravno neće raditi, ti se moraš konektovati na server npr:
ZConnection.Database:=10.0.0.2:C:\Zeos Firebird Client Server\Server\BADRESAR.FDB
[ bobans72 @ 10.10.2014. 10:59 ] @
Napokon sam rešio problem za sada.
Hvala svima koji su bili zainteresovani da rešim moj problem.
Pozdrav...