SQL har en funktion som hedder Sum() - og det vil kolledere med at du vælger at kalde et af dine felter for sum.
Det er dog nok ikke lige den der driller her - hvad står der i linje 73 (og dem lige før)?
i line 73 står der dette
label4.caption:=bmi.SQL.text('select sum from vejning where navn like "%' +label2.Caption+ '%" order by dato');
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?
det er desværre det den gør...
hvad ville du foreslå jeg lavede om i den?
er det fordi jeg skriver label4.caption:=bmi.sql.text('....');
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.
Desuden:
Hvilken datatype returnere bmi.SQL.text() - er det overhovedet noget som passer ind i en caption?
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.
det er et tal den retunere
Ikke med den der SQL-sætning.
Hvad er det du gerne vil opnå?
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.
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
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...
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)
Er du kommet vidre med denne her?
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...