[ Mali Misha @ 18.03.2009. 08:35 ] @
Već neko vreme pokušavam ovo da napravim. Naime radim sa Interbase + BCB6. Napravio sam malu TIBQuery i preko TDataSource mogu da pregledam njene rezultate u jednom TDBGrid-u. Evo, ovako izgleda upit:
Code:
SELECT *
FROM TABELA
WHERE DATUM < :DAT

Ovaj parametar DAT mogu da postavim pre nego što pozovom ShowModal() forme koja ga prikazuje, i mogu da aktiviram TIBQuery:
Code:
        DMod->QUpit->ParamByName("DAT")->AsInteger = GenDateShort();
        DMod->QUpit->Prepared = true;
        DMod->QUpit->Active = true;

I ovo radi. No, ako promenim malo bazu tokom rada programa, i opet probam da pozovem formu, dobijam grešku da je 'dataset open' i da ne može da izvede ovo osvežavanje. Pokušao sam da podesim Enabled property dataseta na false pa da je vratim na true, ali i dalje ne radi. Gde grešim?
[ Mali Misha @ 18.03.2009. 08:41 ] @
Naizgled sam rešio problem dodavanjem Close() i Open() pre i posle rada sa TIBQuery.

Code:
        DMod->QUpit->Close();
        // ...
        DMod->QUpit->Open();
[ Mali Misha @ 18.03.2009. 09:02 ] @
Ali imam sada jedno dalje pitanje. Podaci koje unosim u drugoj tabeli sada nisu ažurni u ovoj. Da li trebam još nešto da uradim u ovom pripremnom delu ili trebam na neki način da uradim Commit podataka pri zatvaranju forme sa drugom tabelom. Evo ovo radim:
Code:
void __fastcall TFPodaci::TPodaciExit(TObject *Sender)
{
        if(     DMod->PodaciTbl->State == dsInsert
                || DMod->PodaciTbl->State == dsEdit)
        {
                DMod->PodaciTbl->Post();
        }
        DMod->PodaciTS->CommitRetaining();
}
[ itf @ 18.03.2009. 09:06 ] @
Kako misliš "nisu ažurni"? Opiši situaciju.
[ Mali Misha @ 18.03.2009. 09:18 ] @
Imam posebnu formu, FPodaci, koja mi služi za popunjavanje tabele PodaciTbl (TIBTable).

Znači pokrenem program, i dodam nekoliko novih unosa koji bi trebali da se pojave u rezultatu gore opisanog upita. Onda odem do druge forme FUpit gde se prijazuje rezultat QUpit-a, a ono ništa novo. Da, svaka forma se zatvara pre otvaranja one druge. Otvaram ih kao Modal.

Kada izađem iz programa pa ga opet pokrenem, podaci bivaju ažurirani. Znači negde nešto fali da 'pogura' ovo ažuriranje. Možda mi je greška što se vezujem za onExit od FPodaci, a možda treba još nešto da se ubaci pre poziva ShowModal() od FUpit-a.
[ itf @ 18.03.2009. 10:15 ] @
Nakon update-a (sql-a) pokušaj nešto poput

ProblematicnaTablica->Close();
ProblematicnaTablica->Open();

tj. da se odspoji od baze pa ponovo spoji, i pri tome da izvrši select* from tablica.
[ Mali Misha @ 18.03.2009. 10:44 ] @
Jok, ništa.

Probao sam i Refresh() na samom Grid-u koji pokazuje rezultate upita, bez uspeha.
[ itf @ 18.03.2009. 10:56 ] @
Ne vidim zašto to nije prošlo jer u pravilu to mora raditi pošto je riječ o ponovnom spajanju na bazi. Da li ti je dataset u memoriji ili ga učitavaš lokalno u xml tj. BatchOptimistic i sl? Kako se uopće spajaš na bazu?

A refresh u praksi izbjegavaj. Što je veći broj zapisa to duže se čeka na refresh. Bolje ona gore opcija.
[ Mali Misha @ 18.03.2009. 11:42 ] @
Hvala na vremenu, itf.

Radim sa BCB + Interbase, sve je u jednom *.GDB fajlu. Imam Data Modul u kome držim sve tabele, TS, DS i storedprocedures. Onda uključujem heder tog Data Modula gde treba i koristim objekte.

Dakle, da, sve je u memoriji, aktivno, i samo čeka da ga koristim.

Tabele čak rade normalno. Sad sam napravio jednu drugu formu sa DBGridom koja isto tako šalje razne upite tokom rada i sve se prikazuje bez problema. Jedino je znači to osvežavanje problematično. Dakle radi sve kada isključim pa opet startujem program. No.. evo sad sam probao čak da uradim open/close same baze i opet ista situacija. Nešto je najverovatnije sa samom formom ili čime već.

Dobro, opisaću opet njen rad. Iz glavne forme je pozivam sa ShowModal, a pre toga pozivam nad njom novoformirani SQL upit:
Code:
void __fastcall TForm1::Up1Click(TObject *Sender)
{
        FUpit->upd();
        FUpit->ShowModal();
}

// ...

void TFUpit::upd()
{
        DMod->QUpit->Close();
        DMod->QUpit->ParamByName("DAT")->AsInteger = GenDateShort();
        DMod->QUpit->Prepared = true;
        DMod->QUpit->Active = true;
        DMod->QUpit->Open();

        TUput->Refresh(); // TDBGrid
}

Sve radi kako treba, čak i kada ima više parametara koji variraju. Pak, novi unosi ne bivaju uezti u obzir. Ne, ne pomaže ni ako pre i posle sređivanja upita pozovem Close/Open nad jedinom tabelom iz koje se izvlače podaci.. heh :)

Probao sam i da onemogućim monotonost parametra, pošto nešto možda čeka da se isti promeni.
Code:
        static int add = 0;
        add++;
        // ...
        DMod->QUpit->ParamByName("DAT")->AsInteger = GenDateShort() + add;

Bez uspeha.
[ itf @ 18.03.2009. 12:51 ] @
Onda ne vidim koja je konkretno razlika između resetiranja (ponovnog pokretanja) aplikacije da bi se spojio na bazu i ove alternative s Open i Close. Je li možda koristiš kakav globalni objekt za konekciju? Nešto poput ADOConnection objekta pa da tablice iz njega dobivaju konekciju ili svaka tablica ima svoju definiranu konekciju? Jesi i taj objekt otvorio i zatvorio?
[ Mali Misha @ 18.03.2009. 13:05 ] @
Ako shvatim o čemu se radi, pisaću ovde. Zaista je neobično tako da je vrlo moguće da mali zeleni rade negde unutra. :D

Elem, da se vratim na temu: dodavanje parametra. Naleteo sam na nešto interesantno:

1) U TQuery upišem SQL upit u kome koristim parametre, i te parametre podešavam iz C++ pre otvaranja forme. Pri otvaranju forme tokom rada programa odbija da izvrši upit, javljajući da ovih polja (za parametre) nema.
2) Odem onda na TQuery, dodam ova polja, i mislio bi čovek, radiće. Jok, i dalje prijavljuje da se ova polja ne vide.
3) Odem opet na listu polja dotične TQuery, obrišem polja koja sam uneo, probam opet, sve radi.

Retko radim sa BCB (6.0 u ovom slučaju), ali ovo je, što bi se reklo, baš markantna pojedinost. :D
[ savkic @ 18.03.2009. 17:29 ] @
Nisam shvatio da li si rešio problem ili ne? Ako nisi, da li oba upita koriste istu transakciju, ako ne da li posle unosa podataka comituješ transakciju i kako su ti transakcije podešene?

> DMod->QUpit->ParamByName("DAT")->AsInteger = GenDateShort();

Sigurnije je da koristiš AsDate ili AsDateTime.

> DMod->PodaciTS->CommitRetaining();

Izbegavaj CommitRetaining i koristi Commit gde god je to moguće.
[ Mali Misha @ 19.03.2009. 08:01 ] @
Citat:
da li posle unosa podataka comituješ transakciju

Ee, to care. Koristili su istu transakciju (naravno) ali nigde nije bilo eksplicitnog commita.
Za datum koristim moj format, koji je celi broj (int).