Avatar billede delphiuser Mester
06. februar 2008 - 19:27 Der er 20 kommentarer og
1 løsning

sql sætning

Hej eksperter hvad har jeg gjord forkert i denne sql forspørgelse.

bmi.close;
bmi.SQL.Clear;
label4.caption:=bmi.SQL.text('select sum from vejning where navn like "%' +label2.Caption+ '%" order by dato');
bmi.Active:=true;
bmi.Open;

jeg får følgende fejl...

[DCC Error] tabvej.pas(73): E2066 Missing operator or semicolon
[DCC Error] tablogin.pas(31): F2063 Could not compile used unit 'tabvej.pas'

mvh. Delphiuser
Avatar billede nielle Nybegynder
06. februar 2008 - 19:31 #1
SQL har en funktion som hedder Sum() - og det vil kolledere med at du vælger at kalde et af dine felter for sum.
Avatar billede nielle Nybegynder
06. februar 2008 - 19:37 #2
Det er dog nok ikke lige den der driller her - hvad står der i linje 73 (og dem lige før)?
Avatar billede delphiuser Mester
06. februar 2008 - 19:38 #3
i line 73 står der dette

label4.caption:=bmi.SQL.text('select sum from vejning where navn like "%' +label2.Caption+ '%" order by dato');
Avatar billede nielle Nybegynder
06. februar 2008 - 19:40 #4
Delphi-mæssigt ser den ok ud.

Men der er en del SQL-fejl internt i den. Men det burde vel ikke generere en compiler fejl?
Avatar billede delphiuser Mester
06. februar 2008 - 19:42 #5
det er desværre det den gør...

hvad ville du foreslå jeg lavede om i den?
Avatar billede delphiuser Mester
06. februar 2008 - 19:43 #6
er det fordi jeg skriver label4.caption:=bmi.sql.text('....');
Avatar billede nielle Nybegynder
06. februar 2008 - 19:44 #7
1) Du bør ikke have et felt i din tabel som hedder sum - det er der allerede en indbygget SQL-funktion som hedder.

2) Der skal stå '-tegn rundt om like-leddet. "-tegn er ikke korrekt SQL.
Avatar billede nielle Nybegynder
06. februar 2008 - 19:50 #8
Desuden:

Hvilken datatype returnere bmi.SQL.text() - er det overhovedet noget som passer ind i en caption?
Avatar billede delphiuser Mester
06. februar 2008 - 19:53 #9
nu virker det. i stedet for at den skulle vælge kun sum valgte jeg at den skulle vælge * altså alle ting og nu virker det.
Avatar billede delphiuser Mester
06. februar 2008 - 19:54 #10
det er et tal den retunere
Avatar billede nielle Nybegynder
06. februar 2008 - 19:57 #11
Ikke med den der SQL-sætning.

Hvad er det du gerne vil opnå?
Avatar billede delphiuser Mester
06. februar 2008 - 19:59 #12
nu henter den det sidste tal ud som er blevet tilføjet under en person som er igang med et vægttab. det tal den henter ud skulle gerne være det tal som er kommet sidst ind i tabbellen.
Avatar billede delphiuser Mester
06. februar 2008 - 20:01 #13
min sql forspørgelse ser sådan her ud nu... næsten det samme

bmi.close;
bmi.SQL.Clear;
bmi.SQL.add('select * from vejning where navn like "%' +label2.Caption+ '%" order by dato');
bmi.Active:=true;
bmi.Open;
label4.caption:=bmi.FieldByName('sum').AsString;

og den giver det resultat jeg gerne vil have
Avatar billede nielle Nybegynder
06. februar 2008 - 20:14 #14
Så er det brugen af det *reserverede* ord sum der giver problemer. Enten kalder du feltet noget andet, eller også fortæller du at SQL skal ignorere at det er reserveret.

I Access eller MS SQL:

label4.caption:=bmi.SQL.text('select [sum] from vejning where navn like "%' +label2.Caption+ '%" order by dato')

I MySQL:

label4.caption:=bmi.SQL.text('select `sum` from vejning where navn like "%' +label2.Caption+ '%" order by dato')



Personligt vil jeg helt klart anbefale at du kalder felktet noget andet end sum...
Avatar billede hrc Mester
06. februar 2008 - 22:42 #15
Det var dog et hæsligt script du startede med. Der er stadig rigelig plads til forbedringer:

1. Drop brugen af *. Angiv de felter du skal bruge og ikke andre.
2. Drop brugen af direkte formaterede strenge. Brug parametre i stedet.
3. Det vil pynte på overskueligheden om scriptet blev rykket ned på flere linker
4. Noget der lukkes men skal åbnes igen putter jeg altid ind i en try-finally. Her er det lidt søgt men jeg gør det altid. Tror det betaler sig.

Label4.Caption := '';
bmi.Close;
try
  bmi.SQL.Clear;
  bmi.SQL.Add('select vaegt');
  bmi.SQL.Add('  from vejning');
  bmi.SQL.Add('  where (navn like :navn)');
  bmi.SQL.Add('  order by dato');

  with bmi.Parameters.ParamByName('navn') do // ved ADO / MSSQL
  begin
    DataType := dtString;
    Value := '%' + navn + '%';
  end;
finally
  bmi.Open;
end;
if not bmi.Eof then
  Label4.Caption := IntToStr(bmi.FieldByName('vaegt').AsInteger);

... men der dukker flere dårligdomme op efterhånden som jeg skriver:

1. Lad være med at lave en søgning på personens navn! Der kan godt være flere der hedder %Jens Hansen%. Lav en tabel til personerne og registrér vejningerne sammen med den primærnøgle der blev oprettet sammen med personen
2. Få feltet med det reserverede ord (sum) omdøbt til noget der ikke giver problemer, eksempelvis vaegt.
3. Du lukker en query, laver et opslag ... men lader queryen være åben. Spild af ressourcer!

Label4.Caption := '';
bmi.SQL.Clear; // query'en er lukket fra starten af.
bmi.SQL.Add('select vaegt');
bmi.SQL.Add('  from vejning');
bmi.SQL.Add('  where (navn_id = :navn_id)');
bmi.SQL.Add('  order by dato');

with bmi.Parameters.ParamByName('navn_id') do // ved ADO / MSSQL
begin
  DataType := dtInteger;
  Value := navn_id;
end;

bmi.Open;
try
  if not bmi.Eof then
    Label4.Caption := IntToStr(bmi.FieldByName('vaegt').AsInteger);
finally
  bmi.Close;
end;

Faktisk plejer jeg at lave en lokal instans af query'en så hele operationen er indkapslet i metoden (proceduren)
Avatar billede nielle Nybegynder
11. februar 2008 - 18:36 #16
Er du kommet vidre med denne her?
Avatar billede nielle Nybegynder
18. februar 2008 - 18:11 #17
??
Avatar billede hrc Mester
18. februar 2008 - 19:34 #18
ditto ??
Avatar billede delphiuser Mester
28. juli 2010 - 13:48 #19
lukker
Avatar billede delphiuser Mester
28. juli 2010 - 13:48 #20
lukker
Avatar billede hrc Mester
28. juli 2010 - 19:34 #21
Var det virkelig helt ubrugeligt? Det giver ikke ret meget af den hedgangne karma, at være nærig på pointsene og i øvrigt snuppe dem igen, selvom indlæggene måske har været til hjælp. Det overvåges på site og har desuden den effekt, at folk der gider hjælpe, forsvinder...
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