Avatar billede roz Nybegynder
19. februar 2005 - 13:16 Der er 7 kommentarer og
1 løsning

Problem med dataudtræk fra Access database

Jeg har følgende kode:

    ScheduleDataset.Close;
    ScheduleDataset.CommandText:= 'SELECT * FROM Calendar WHERE Calendar.Dato = #'+DateTimeToStr(CurDate)+'#;';
    ScheduleDataset.Open;
    if not ScheduleDataset['Schedule'] = '' then
    begin
      Schedule:= ScheduleDataset['Schedule'];
      ScheduleDataset.Close;
      ScheduleDataset.CommandText:= 'SELECT * FROM Schedules WHERE Schedules.Name = #'+Schedule+'#;';
      ScheduleDataset.Open;
      Stringgrid1.Cells[0, 1]:= ScheduleDataset['0x1'];
    end;

Den første tabel der bliver brugt er en tabel ved navn Calendar og det data der skal bruges findes under feltet Dato.
Den næste tabel der skal bruges hedder Schedules og deri findes felterne Name og 0x1.

Jeg tror fejlen ligger i den første del af koden da det slet ikke ser ud til at det i if not løkken ikke udføres.

Jeg håber der er en anden der lige kan finde fejlen da jeg simpelthen ikke selv kan se den.

Mvh.
Rune Jensen
Avatar billede hrc Mester
19. februar 2005 - 18:34 #1
Nu kan jeg altså slet ikke se nogen løkke, en if-not er i alt fald ikke. Hvorfor joiner du ikke tabellerne?

En TADOQuery burde kunne håndtere nedenstående:

select s.0x1 from Schedules s
  join Calendar c on (c.Schedule = s.Schedule)
  where c.Dato = :Dato

- kan ikke huske om der skal paranteser eller firkantklammer om felterne, men i grundtræk bør queryen se sådan ud. I øvrigt er det noget skod, at du søger "selct * ..". Angiv kun de felter som du skal bruge. Noget andet skod er måden du opbygger dine parametre på. Har sagt det før og siger det igen: Brug Queryens Parameters-property til at angive disse værdier.

Query.Parameters.QueryByName('Dato').Value := CurDay; // vistnok sådan i ADO

Nås så det er samlet i ét effektivt script, kan du lave den goe' gamle while-løkke:

Query.Open;
try
  while not Query.Eof do
  begin
    Stringgrid.Cells[0,1] := Query.FieldByName('0x1').AsString;
    // Alternativt vistnok også muligt:  Stringgrid[0,1] := Query['0x1'];
    Query.Next;
  end;
finally
  Query.Close;
end;

Eller hvis du kun skal have en singelton (én record ud):

Query.Open;
try
  if Query.Eof then
    raise execption.Create('Ingen record fundet'); // Alt: assert(not Query.Eof);
  Stringgrid.Cells[0,1] := Query.FieldByName('0x1').AsString;
finally
  Query.Close;
end;
Avatar billede roz Nybegynder
19. februar 2005 - 18:45 #2
Det med en æøkke var lige en "skrivefejl" ;)
Men kan du se hvad der er galt med min kode? Vil mene jeg joiner den ved ScheduleDataset.Connectionstring := Min tabel

Får en fejl om at parameterobjekltet er forkert defineret eller oplysningerne er mangelfulde ved denne kode:

    Query.SQL.Text:='s.0x1 from Schedules s'+
  'join Calendar c on (c.Schedule = s.Schedule)'+
  'where c.Dato = :Dato';
Query.Open;
try
  while not Query.Eof do
  begin
    Stringgrid1.Cells[0,1] := Query.FieldByName('0x1').AsString;
    // Alternativt vistnok også muligt:  Stringgrid[0,1] := Query['0x1'];
    Query.Next;
  end;
finally
  Query.Close;
end;
Avatar billede roz Nybegynder
19. februar 2005 - 18:57 #3
Rettelse: Ikke min tabel men min database
Avatar billede hrc Mester
23. februar 2005 - 09:05 #4
Længere nede i teksten skrev jeg linien:

  Query.Parameters.QueryByName('Dato').Value := CurDay;

Har du den med? Jeg kan ikke helt huske om det er ADO's måde at angive parametre på. Det må du tjekke.
Avatar billede roz Nybegynder
23. februar 2005 - 21:12 #5
Hmm querybyname er ikke rigtigt. Men kan ikke lige se hvad jeg skal brueg i stedet?
Parambyname?
Avatar billede hrc Mester
25. februar 2005 - 15:42 #6
Ahem. Ja selvfølgelig skal du bruge ParamByName. En slåfejl, beklager.
Avatar billede roz Nybegynder
25. februar 2005 - 21:07 #7
Nu har jeg så denne kode:

    Query.Parameters.ParamByName('Dato').Value := CurDate;
    Query.SQL.Text:='s.0x1 from Schedules s'+
  'join Calendar c on (c.Schedule = s.Schedule)'+
  'where c.Dato = :Dato';
Query.Open;
try
  while not Query.Eof do
  begin
    Stringgrid1.Cells[0,1] := Query.FieldByName('0x1').AsString;
    // Alternativt vistnok også muligt:  Stringgrid[0,1] := Query['0x1'];
    Query.Next;
  end;
finally
  Query.Close;
end;

Men når koden udføres får jeg følgende fejl: "Query: Dato not found"
Hvad kan fejlen være her?
Avatar billede roz Nybegynder
27. februar 2005 - 13:05 #8
Nå fik min egen kode til ar virke :D
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