[ MilošV @ 09.12.2003. 12:05 ] @
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
[ Kockicica @ 09.12.2003. 14:34 ] @
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 ;-)
[ MilošV @ 09.12.2003. 21:22 ] @
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
[ MilošV @ 17.12.2003. 13:46 ] @
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 :)...