Avatar billede cope21 Nybegynder
08. januar 2000 - 17:52 Der er 14 kommentarer og
1 løsning

EDatabaseError

Jeg får beskeden "EDatabaseError with message: DataSet not in Edit og Insert mode".

Nogen der kan hjælpe?
Avatar billede erikjacobsen Ekspert
08. januar 2000 - 19:30 #1
Må vi få noget kode?
Avatar billede cope21 Nybegynder
08. januar 2000 - 19:37 #2
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;
Avatar billede erikjacobsen Ekspert
08. januar 2000 - 23:46 #3
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

ToptalkTable.FieldsByName('Talks').AsString := ....whatever...

og tilsvarende for 'Nick'.
Avatar billede kokoko Nybegynder
08. januar 2000 - 23:54 #4
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...

Kokoko
Avatar billede erikjacobsen Ekspert
09. januar 2000 - 00:00 #5
Det er http://www.eksperten.dk/spm.asp?id=8684 og det kan du jo have
ret i. Men cope21 er du så sikker på at det er dér fejlen optræder?
Avatar billede cope21 Nybegynder
09. januar 2000 - 00:09 #6
Nej det er jeg ikke... Men hvor kan det ellers være?

Tabellen er sat op osv på helt samme måde som mange andre steder i programmet, men i netop denne virker det ikke
Avatar billede sjensen Nybegynder
09. januar 2000 - 01:05 #7
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.

sjensen
Avatar billede kokoko Nybegynder
09. januar 2000 - 01:11 #8
Sjensen: jamen den er sat i edit mode... (Ved hvad han Cope21 har lavet). Det er det der er det mærkelige...
Avatar billede erikjacobsen Ekspert
09. januar 2000 - 08:27 #9
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?
Avatar billede sjensen Nybegynder
09. januar 2000 - 12:33 #10
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.

sjensen
Avatar billede sjensen Nybegynder
09. januar 2000 - 12:35 #11
Problem med anførselstegnene igen !!

I onediterror skal du sætte editerr true.

Avatar billede cope21 Nybegynder
09. januar 2000 - 12:42 #12
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)
Avatar billede erikjacobsen Ekspert
09. januar 2000 - 21:15 #13
Rent gæt (det er så sjovt):

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.
Avatar billede sjensen Nybegynder
09. januar 2000 - 21:57 #14
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, :-(

sjensen
Avatar billede sjensen Nybegynder
09. januar 2000 - 21:58 #15
jeg glemte lige at nævne at det nye LUtoptalktable selvfølgeligt skal pege på samme fysiske database som toptalktable.

sjensen
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester