Avatar billede KurtG Forsker
19. august 2023 - 09:31 Der er 4 kommentarer

Fylde data i Paradox-tabel

Jeg har problemer med at fylde en tabel med data.
Det er et let omarbejdet eksempel fra bogen Delphi4 Programmering med udvidet antal felter og med mine egne data.
Kun den første linje i datafilen oprettes i tabellen, alle de efterfølgende giver fejl.

Fejlmeldinger:
1. loop:
EDBEnginError with message 'Key violation' Process stopped....

Jeg trykker på OK og derefter F9 for fortsat kørsel.

2. loop
Messagebox vises: Kan ikke oprette tabellen MinDatabase, og derefter:
EDBEnginError with message 'Key violation' Process stopped....

Jeg trykker igen på OK og derefter F9 for fortsat kørsel.
Dette gentages for hver hentede datalinje hvorefter indholdet af databasen vises.
I databasen er da kun første post gemt.

Databasetabellen oprettes således:
  TableType := ttParadox;
  with FieldDefs do // Beskriv felterne
  begin
    Clear;
    Add('Aar', ftInteger, 0, True);
    Add('Fra', ftInteger, 0, False);
    Add('Til', ftInteger, 0, False);
    Add('Titel', ftString, 24, False);
    Add('Forfatter', ftString, 24, False);
    Add('Beskrivelse', ftString, 100, False);
  end;
  with IndexDefs do // Fastlæg primært index
  begin
    Clear;
    Add('', 'Aar',  ixPrimary, ixUnique]);
  end;
  CreateTable; // Opret den beskrevne tabel
  tblLand.Free;
-------------------------------------   

//Indsæt data i tabellen
  for I := 0 to List.Count - 1 do
  begin
    tblLand.Append; // vedhæft ny post
    S := List I];
    Position := Pos(';', S);    //Find tabulator
    DelS := Copy(S, 1, Position - 1);
    Delete(S, 1, Position);
    tblLand 'Aar'] := StrToInt(DelS);

    Position := Pos(';', S);
    DelS := Copy(S, 1, Position - 1);
    tblLand 'Fra'] := StrToInt(DelS);
    Delete(S, 1, Position);

    Position := Pos(';', S);
    DelS := Copy(S, 1, Position - 1);
    tblLand 'Til'] := StrToInt(DelS);
    Delete(S, 1, Position);

    Position := Pos(';', S);
    DelS := Copy(S, 1, Position - 1);
    Delete(S, 1, Position);
    tblLand 'Titel'] := DelS;
   
    Position := Pos(';', S);
    DelS := Copy(S, 1, Position - 1);
    tblLand 'Forfatter'] := DelS;
    Delete(S, 1, Position);
   
    //Sidste felt fyldes med resten af linjen
    tblLand 'Beskrivelse'] := S;
    try
      tblLand.Post; // Skriv den nye post
    except
      on EDBEngineError do
      begin
        MessageDlg('Kunne ikke oprette tabellen '
          + MinDatabase, mtError,  mbOk], 0);
        tblLand.Cancel; // Annuller den nye post
        tblLand.Edit;
        Continue;
      end;
    end;
  end;
---------------------------
Data i filen, der læses fra:    (Alle er tekststrenge, intet binært indhold, skilletegn: ;)
2011;5;12;Vinderupgaard;Weis Jensen;Meget passende ...
2011;13;28;Udskiftning ;Anders Villadsen;Her fortælles
2011;29;38;Udpluk af Ry;Hans P.;Ud over en beskrivelse af de
2011;39;58;A skal sgu æ;F. B. Johansen;Handler primært om
2011;59;74;En bagersøns;Pedersen;Så kommer turen til
---------------------------------
Avatar billede arne_v Ekspert
19. august 2023 - 13:54 #1
Fejle betyder formentligt at du forsøger at indsætte flere rækker med samme primærnøgle. Og det kan man ikke.
Avatar billede arne_v Ekspert
19. august 2023 - 13:56 #2
Hvis det fjerde argument til Add er primær nøgle status, så passer det, da sætter det til true for Aar og du har flere 2011 værdier i data.
Avatar billede arne_v Ekspert
19. august 2023 - 13:57 #3
Måske var titel en bedre primærnøgle.
Avatar billede KurtG Forsker
19. august 2023 - 19:18 #4
Det tror jeg da, at du har ret i.
Jeg har stirret mig blind!
Tak.
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