Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

InterBase & C++ Builder -problem sa osvjezavanjem TIBTable komponente

[es] :: Baze podataka :: InterBase & C++ Builder -problem sa osvjezavanjem TIBTable komponente

[ Pregleda: 2957 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

MilošV
Podgorica

Član broj: 7996
Poruke: 484
195.66.163.*



+1 Profil

icon InterBase & C++ Builder -problem sa osvjezavanjem TIBTable komponente09.12.2003. u 12:05 - pre 248 meseci
Pozdrav :)
Ispade roman od poruke ali molim vas procitajte do kraja

Mislim da cu primjerom najbolje objasniti problem:
Dakle, neka tabela u .gdb bazi ima kolone ID, IME, PREZIME
IME i PREZIME unosi korisnik aplikacije (radjene u builder-u) a ID je AutoIncrement o kojem brine AfterInsert-triger u samoj bazi
Na formi su TIB komponente koje se vezu na bazu bez koriscenja BDE-a: IBTable1, IBDatabase1, IBTransaction1 i DataSource1 i DBGrid1.

Nakon podizanja aplikacije sve izgleda u redu, IBTable1 povuce sve podatke iz baze, ali ako korisnik unese "Ime" i "Prezime" a polje "ID" (kojem je u Fields Editoru postavljeno Required=false) ostavi prazno, nakon:
Code:
IBTable1->Post(); 

IBTable jednostavno ne vidi vrijednost novog ID-a, tj vidi se uneseno ime i prezime ali ID kao da je NULL

Probao sam sa
Code:
IBTable1->Post();
IBTransaction1->CommitRetaining();
IBTable1->Refresh();

ali problem je ostao!?

Kad bazi pristupim iz npr. IBExpert-a, vidi se da su svi podaci tu ali ih bilder-aplikacija ne vidi sve dok se ne restartuje...

Jedini nacin koji sam nasao da natjeram IBTable1 da vidi novu vrijednost ID-a bez restartovanja aplikacije je prilicno ljakse:
Code:
IBTable1->Post();
IBTable1->Active=false;
IBTable1->Active=true;

CachedUpdates su podeseni na false
Pretpostavljam da tu ima caka koju ja (ocito) ne znam... Ovo mi je oduzelo vec dosta vremena, please help!

Hvala na strpljenju
Tica
 
Odgovor na temu

Kockicica
Kosta Ćurčić

Član broj: 7982
Poruke: 31
*.verat.net

Jabber: kockicica@elitesecurity.org


Profil

icon Re: InterBase & C++ Builder -problem sa osvjezavanjem TIBTable komponente09.12.2003. u 14:34 - pre 248 meseci
Bogami, ispašće roman i od odgovora ;-) Koliko ja znam, tu nema neke cake, TIBTable->Active = false/true je način da se to uradi. Ali ima alternativnih rešenja, i to više. Jedno, koje je interesantno za relativno jednostavne tabele je korišćenje IBDataSet komponente - ona ima odvojene insert/update/delete/refresh sql statement-e a i autoinkrementiranje se lako rešava (vidi pod GeneratorField). Drugo rešenje (pogodnije, bar kako ja vidim stvari, za malo komplikovanije master/detail tabele) je da ne koristiš trigere za dodeljivanje id-a, već da na početku transakcije u tvom programu izvršiš jednu stored procedure (IBStoredProc komponenta) i na taj način dobijen id koristiš dalje sasvim normalno. Ne znam koliko sam bio jasan, ali ako treba, razložićemo na sitna creva ;-)
 
Odgovor na temu

MilošV
Podgorica

Član broj: 7996
Poruke: 484
*.crnagora.net



+1 Profil

icon Re: InterBase & C++ Builder -problem sa osvjezavanjem TIBTable komponente09.12.2003. u 21:22 - pre 248 meseci
Vezao sam se preko mobilnog, tako da ce ovaj odgovor biti haiku poezija :)
Problem mi ne stvara samo autoinc vec i rezultati procedura smjestenih u bazi...
Milo mi je da Active=true/false nije toliko vanzemaljski :)
detaljnije ujutru

pozdrav & hvala
Tica
 
Odgovor na temu

MilošV
Podgorica

Član broj: 7996
Poruke: 484
195.66.163.*



+1 Profil

icon Re: InterBase & C++ Builder -problem sa osvjezavanjem TIBTable komponente17.12.2003. u 13:46 - pre 248 meseci
Cao :)

Sto se tice StoredProcedure, nijesam bas siguran da bi radilo tj. moj problem je (bio :) taj sto IBTable komponenta ne vidi rezultate procedura i trigera smjestenih u bazi... Imao sam SQL proceduru u bazi za implementaciju FIFO metoda u magacinskom poslovanju (rekurzivna procedura -bijah ponosan na nju- "iteracija je ljudska, rekurzija bozanska" :) i stavim npr.
IBStoredProc1->ExecProc() ;
procedura se izvrsi, izbrise nekoliko vrsta u tabeli, a IBTable ni posle Refresh() ne vidi da se ista desilo...
Evo sto sam, na kraju, uradio:
Code:

void __fastcall TForm1::IBTable1BeforeRefresh(TDataSet *DataSet)
{
if(dynamic_cast<TIBTable*>(DataSet))
        {
        DataSet->Active=false;
        DataSet->Active=true;
        }
}


Nista novo, ne bih se ni javljao da jutros nijesam instalirao bcb6 u kojem sve funkcionise kako treba! Dakle, dovoljno je pozvati Refresh() (bez dodatnih intervencija) i ova odradi upravo to sto bi covjek ocekivao od funkcije sa takvim imenom :)...
 
Odgovor na temu

[es] :: Baze podataka :: InterBase & C++ Builder -problem sa osvjezavanjem TIBTable komponente

[ Pregleda: 2957 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.