[ pcHazard @ 11.01.2007. 23:08 ] @
Od skoro sam počeo raditi program u Turbo C++ 2006 Explorer koji koristi TClientDataSet, tj. MyBase tipove podataka. Prvo sam pokušao u ADO, ali je bilo komplikacija sa dodavanjem upisa pa sam prešao na MyBase.
Sve fino radi osim funkcije "Locate". Kad god želim da uradim Locate, izbaci mi grešku "Key violation".
Sve sam uradio po propisu (imam nešto iskustva sa bazama od prije...) i opet ne uspjevam.

Zna li iko u čemu je problem?
Hvala

Pozdrav iz RS!
[ pcHazard @ 12.01.2007. 16:10 ] @
Evo ovako:
Forma se zove "prijavfrm", "datt" je DataModule na kojem se nalaze ClientDataSet tabele i DataSource-evi za njih. Tabele su CDradnici (korisnici) i CDlog (tabela za upis radnji, nešto kao dnevnik). I tu je Edit1 kao ulaz za tekst.

Code:

TLocateOptions opts;
  opts << loCaseInsensitive;
  bool bl = datt->CDradnici->Locate("Korisnik",Edit1->Text,opts);
  if (!bl) {
    MessageBox(GetActiveWindow(), "Navedeno ime ne postoji u bazi!", "Greška!", MB_OK | MB_ICONSTOP);
    return;
  } else {
  if (CDradnici->FieldByName("Sifra")->Value != Edit2->Text) {
   MessageBox(GetActiveWindow(), "Pogrešno unesena šifra!", "Greška!", MB_OK | MB_ICONSTOP);
   return;
  } else {
   datt->CDlog->Append();
   datt->CDlog->FieldByName("Kategorija")->Value = "Korisnici";
   datt->CDlog->FieldByName("Datum i vrijeme")->Value =  Now();
   datt->CDlog->FieldByName("Korisnik")->Value = Edit1->Text;
   datt->CDlog->FieldByName("Radnja")->Value = "Prijavio se u program.";
   datt->CDlog->Post();
   prijavfrm->Close();
  };
  };


Ovo bi inače trebalo da radi, ne znam u čemu je problem.

[Ovu poruku je menjao X Files dana 12.01.2007. u 19:50 GMT+1]
[ X Files @ 12.01.2007. 19:04 ] @
Čekaj, gde ti puca kod? Da li kod linije:
bool bl = datt->CDradnici->Locate("Korisnik",Edit1->Text,opts);
...ili negde drugde?

Za dalji deo koda, po mom iskustvu bolje je koristiti eksplicitno tipove, pa umesto ->Value, koristi:
->AsInteger
->AsString
->AsDateTime
->AsBoolean
->AsFloat
...

Dakle, umesto:
datt->CDlog->FieldByName("Kategorija")->Value = "Korisnici";
pokusaj:
datt->CDlog->FieldByName("Kategorija")->AsString = "Korisnici";
...itd.

A ako bas hoces da to bude Variant tip, FieldValues[] mi se bolje pokazao:
datt->CDlog->FieldValues["Kategorija"] = "Korisnici";

Dalje, umesto:
datt->CDlog->Append();
pokusaj:
datt->CDlog->Insert();


[ X Files @ 13.01.2007. 15:02 ] @
Na žalost, potpuno te razumem.

Nekoliko puta do sada sam morao da započnem projekat od NULE i da kopiram postojeći kod
da bi nešto proradilo, i na kraju i nisam shvatio gde je bila greška.

Koristio sam i drugu tehniku. Skraćivao sam kod: metodu po metodu (/*...*/), modul po modul
(Remove from Project), sve dok kod nije proradio.
[ pcHazard @ 13.01.2007. 22:58 ] @
Nije da mi se jednom desilo...
E, ovaj put sam se izvukao! Skontao sam šta je!
Izbacio sam taj DataModule iz projekta i obrisao fajlove. Onda sam dodao "friški" DataModule i sve ručno dodao i podesio, bez ikakvog dodjeljivanja podataka, i sad, naravno, radi.
Prije sam mijenjao samo komponente, ali očito sam morao čitav modul. I isključio sam iz projekta dbGo (ADO) paket, za svaki slučaj.
E ovo mi je najgore, kad na nekim glupostima izgubim vrijeme koje danima "proučavam" i mislim se šta je. Do sad je sve moglo biti gotovo

Hvala na pomoći, sad nastavljam posao, nadam se da neće biti još ovakvih događaja.