en tabel der hedder ToptalkTable med 2 kolonner: Talks og Nick
Koden ser således ud:
procedure TMainForm.UpdateToptalk(Nick:String); var SearchOptions: TLocateOptions; i:Integer; Begin i:=0; SearchOptions := [loCaseInsensitive]; If ToptalkTable.Locate('Nick', Nick , SearchOptions) Then Begin ToptalkTable.First; While (Uppercase(ToptalkTableNick.Value) <> UpperCase(Nick)) Do Begin ToptalkTable.Next; End; i:= StrToInt(ToptalkTable.Lookup('nick',Nick,'talks')); Inc(i); ToptalkTable.Edit; ToptalkTableTalks.AsString := IntToStr(StrToInt(ToptalkTable.Lookup('nick',Nick,'talks'))+1); ToptalkTable.Post; End else Begin ToptalkTable.Append; ToptalkTableTalks.AsString := '1'; ToptalkTableNick.AsString := Nick; ToptalkTable.Post; End; End;
Hvor kommer ToptalkTableTalks og ToptalkTableNick fra? Mit gæt er at du har lavet en "smart" forkortelse for nogle felter, og de peger et andet sted hen. Prøv
Erikjacobsen: øhh det du skriver med er det samme som Cope skriver... han har bare været så genial at lave fields... kan læses i en andet spørgsmål (gider ikke lige at finde det) ... men hans er ligeså godt som dit bud...
Når du bruger data-awarefelter i din form, og du af en eller anden årsag ændrer indholdet af en eller flere felter unden at du har sat den pågældende record i insert eller edit mode, får du meddelelsen.
Hvis du har tilføjet (gennem fieldseditor) felter der bliver beregnet automatisk, vil disse felter blive rettet når du bladrer mellem records (first,next), og igen får du meddelelsen.
Så check hvilket/hvilke felter der ændres og sæt table1.edit inden, eller fjern felterne. Så slipper du for fejlen.
Du kan med fordel anvende If table1.state in [dsedit,dsinsert] then begin //ændre felter end; i table1.afterscrool eventen. Det er her dine beregnede felter bliver håndteret.
Ja, det er mærkeligt. Hvis du har tid og lyst til at finde det rigtige sted så sæt en masse ShowMessage-r ind lige før (og evt. efter) hver eneste ændring af et felt - med forskellig tekst, så du kan blive hekt sikker på hvor det sker.
Du bruger heller ikke try-except nogen steder - vel?
Ok, hvis du siger at der ikke er andre felter på din form end talk og nick (som begge er def. i fieldseditoren) så kan det kun være fordi dit table ikke bliver sat i editmode når du ønsker det.
Det kan der være flere årsager til, f.eks. at en anden bruger p.t. er ved at redigere den pågældende rec.
Det løses således:
Først skal du sikre at Local Share (i BDE admin, configuration, Init) er sat true.
Dernæst opretter du en event OnEditError for dit table hvori du sætter en boolean til true. F.eks. "diterr".
I din kode skriver du derefter:
editerr := false; ToptalkTable.Edit; if not editerr then ToptalkTableTalks.AsString := IntToStr(StrToInt(ToptalkTable.Lookup('nick',Nick,'talks'))+1); ToptalkTable.Post;
Det samme princip kan du med fordel anvende for post. (OnPostError) Dette er i øvrigt en af de vigtigste måder at undgå hhv. index og data fejl i databasen på.
NB! Hvis du i første omgang sætter en showmessage('bla'); i table1OnEditError eventen vil du med det samme kunne se om du nu også får sat den i edit-mode eller ej.
Har du i øvrigt andre tables på din form ? Og hvis er der nogle af felterne i disse der er afhængige af toptalk tabellen ? Hvis der er så vil det i givet fald være et af dem der brokker sig over manglende edit mode.
Jeg har masser af tables på min form. Og ved alle andre har jeg lavet det på samme måde, som i denne toptalk tabel. Forskellen ligger bare i at alt det andet virker... men ikke denne ene. Det er det der undrer mig så meget... for den BLIVER sat i edit mode... Det kan I jo se i koden :o)
Kunne det tænkes at ToptalkTable.Lookup('nick',Nick,'talks') sætter tilbage fra edit-tilstand? Hvis det kunne tænkes, så prøv at flytte den ud før og gem det i en variabel.
Erikjacobsen er inde på noget af det rigtige, blot er det ikke at tablet bliver sat tilbage fra edit-mode.
Du kan ikke slå op i en database (med findkey, og loogup er også en findkey) når en record i samme table er i insert eller edit mode.
Prøv at lave et lille eksempel og se de fejlmeddelelser der kommer. Mange sjove og knap så informative som de kunne være.
Løsninger er at ændre lookup table navnet. Sæt endnu en table på og kald den LUtoptalktable eller sådan noget. Ret derefter ToptalkTable.Lookup('nick',Nick,'talks') til LUtoptalkTable.Lookup('nick',Nick,'talks') så virker det som det skal.
NB! Du skal ikke åbne/lukke LUtoptalktable. Det gør Lookup selv.
Det burde jeg have set noget tidligere. Jeg har selv prøvet det masser af gange, :-(
jeg glemte lige at nævne at det nye LUtoptalktable selvfølgeligt skal pege på samme fysiske database som toptalktable.
sjensen
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.