06. februar 2008 - 19:27Der 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'
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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;
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)
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...
Synes godt om
Ny brugerNybegynder
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.