Oprettet ons. d. 06. februar 2008 kl. 19:27:52

delphiuser
delphiuser (9.495 point. Point ude: 0)

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

Skrevet ons. d. 06. februar 2008 kl. 19:31:40| #1

nielle
nielle (158.986 point)
SQL har en funktion som hedder Sum() - og det vil kolledere med at du vælger at kalde et af dine felter for sum.

Skrevet ons. d. 06. februar 2008 kl. 19:37:09| #2

nielle
nielle (158.986 point)
Det er dog nok ikke lige den der driller her - hvad står der i linje 73 (og dem lige før)?

Skrevet ons. d. 06. februar 2008 kl. 19:38:51| #3

delphiuser
delphiuser (9.495 point)
i line 73 står der dette

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

Skrevet ons. d. 06. februar 2008 kl. 19:40:42| #4

nielle
nielle (158.986 point)
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?

Skrevet ons. d. 06. februar 2008 kl. 19:42:14| #5

delphiuser
delphiuser (9.495 point)
det er desværre det den gør...

hvad ville du foreslå jeg lavede om i den?

Skrevet ons. d. 06. februar 2008 kl. 19:43:16| #6

delphiuser
delphiuser (9.495 point)
er det fordi jeg skriver label4.caption:=bmi.sql.text('....');

Skrevet ons. d. 06. februar 2008 kl. 19:44:15| #7

nielle
nielle (158.986 point)
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.

Skrevet ons. d. 06. februar 2008 kl. 19:50:43| #8

nielle
nielle (158.986 point)
Desuden:

Hvilken datatype returnere bmi.SQL.text() - er det overhovedet noget som passer ind i en caption?

Skrevet ons. d. 06. februar 2008 kl. 19:53:35| #9

delphiuser
delphiuser (9.495 point)
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.

Skrevet ons. d. 06. februar 2008 kl. 19:54:00| #10

delphiuser
delphiuser (9.495 point)
det er et tal den retunere

Skrevet ons. d. 06. februar 2008 kl. 19:57:18| #11

nielle
nielle (158.986 point)
Ikke med den der SQL-sætning.

Hvad er det du gerne vil opnå?

Skrevet ons. d. 06. februar 2008 kl. 19:59:46| #12

delphiuser
delphiuser (9.495 point)
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.

Skrevet ons. d. 06. februar 2008 kl. 20:01:56| #13

delphiuser
delphiuser (9.495 point)
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

Skrevet ons. d. 06. februar 2008 kl. 20:14:36| #14

nielle
nielle (158.986 point)
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...

Skrevet ons. d. 06. februar 2008 kl. 22:42:01| #15

hrc
hrc (32.732 point)
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)

Skrevet man. d. 11. februar 2008 kl. 18:36:41| #16

nielle
nielle (158.986 point)
Er du kommet vidre med denne her?

Skrevet man. d. 18. februar 2008 kl. 18:11:46| #17


Skrevet man. d. 18. februar 2008 kl. 19:34:22| #18


Skrevet ons. d. 28. juli 2010 kl. 13:48:14| #19


Skrevet ons. d. 28. juli 2010 kl. 13:48:29| #20


Skrevet ons. d. 28. juli 2010 kl. 19:34:19| #21

hrc
hrc (32.732 point)
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...

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Irriterende timeout i Delphi 7 på en win7 64 bits platform

Oprettet den 2. februar 2012 kl. 12.17
nca giver 60 point for svar | Giv et svar »

Manglende danske tegn

Oprettet den 24. januar 2012 kl. 16.12
hugopedersen giver 60 point for svar | Giv et svar »

Sikre mig at form er færdigoprettet

Oprettet den 24. januar 2012 kl. 10.01
hugopedersen giver 100 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger