Jeg bruger en procedure til at at loade forskellige SQL strings, nu vil jeg gerne kunne søge efter poster med en dato der er mindre end dags dato, men får en fejl.
LoadClientSql('SELECT * FROM Kunder, leje '+ 'WHERE Tdato < '+DateToStr(Now) + ' AND nummer = kunde '+ 'ORDER BY %S','nummer');
LoadClientSql bliver læst ind i en Query med format functionen.
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 bruger du en hjemmestikket rutine til at foretage den query - og så har du problemet med at bruge format-funktionen i Queries fremfor at bruge Query.Params. Du burde omskrive det til at modtage parametre, for så skal du ikke bekymre dig om datoformater eller om der skal " eller ' omkring en streng/dato.
CURDATE snupper din database-servers dato; ikke nødvendigvis samme som datoen på din maskine (hvis eksempelvis serverens ur ikke passer eller den står i Kina)
Du burde også lade være med at bruge *, men angive felterne du skal bruge; din query risikerer at blive ret massiv. I den forbindelse: Mangler du ikke at joine kunder og leje?
Da du vælger sorteringen kan du ikke helt undgå format'en.
aQuerySt := 'SELECT * FROM kunder, leje'+ ' WHERE (tdato < :tdato'+ ' AND (nummer = kunde'+ ' ORDER BY %S',nummer)';
I mine datamoduler har jeg følgende lille praktiske rutine:
procedure TDM.SetParam(aParameter: TParameter; const aValue: Variant; const aSetNull: boolean); begin if aSetNull then aParameter.Clear // MS-SQL: Value := Null (inkludér Variants-unitten) else aParameter.Value := aValue; end;
1. Ja jeg kan få den til at virke ved at bruge param, men ideen er at ændre programmet til MySql, hvis en række ændringer kommer til at fungere, i øjeblikket bliver der brugt Paradox,
2. Jeg skal bruge alle felter, derfor *.
3. Jeg har endnu ikke fundet ud af at bruge join.
Det ender jo nok med at starte på en frisk med programmet.
Hvis du har to tabeller: kunder og leje der hver har en primærnøgle der hedder ID og leje bundet til kunder via en fremmednøgle
create table kunder { ID int identify(1,1), data varchar(100), primary key(ID) )
create table leje { ID int identify(1,1), // Identity virker i MSSql kunder_ID int not null, data varchar(100), tdato date, foreign key (kunder_ID) references kunder(ID), primary key(ID) )
... så kan du joine dem på følgende måde
SELECT * FROM kunder k join leje l on (l.kunder_ID = k.ID) WHERE (l.tdato < :tdato) ORDER BY %S',nummer)
Det kan godt være at relationen hænger på den anden vej, men det da et specifikt eksempel.
Hvis du skulle lave en procedure til at lave forespørgslen så kunne du lave noget i retning af dette (ikke så kønt, men det vil virke). Data skal komme i samme rækkefølge som parametrene. Det er ikke testet og måske kan man ikke tildele uden at behøve at angive datatypen på parametrene - det må du selv teste (men det kan løses ret let)
function LoadClientSql(const aQuery, aOrderField : string; const aParams : array of const) : TADOQuery; var i : integer; begin result := TADOQuery.Create(nil); result.Connection := ADOConnection; result.SQL.Text := trim(format(aQuery,[aOrderField])); for i := low(aParams) to high(aParams) do result.Parameters.Params[i].Value := aParams[i]; result.Open; end;
Og left og right join; det varierer lidt hvad de kaldes. Jeg mener at "Left" og "Left inner" er det samme mens "Right" og "Right outer" ditto giver samme resultat.
Givet tabellerne
Tabel1:
ref tekst tabel2_ref -------------------------- 1 The 2 2 Quick NULL 3 Brown 1 4 Fox NULL 5 Jumps 2 6 Over NULL 7 The 3 8 Lazy NULL 9 Dogs 4
Join er da en dejlig ting, det har løst en del problemer for mig, samt givet en række nye muligheder. Jeg vil ønske at dette program var skrevt til MySql fra starten, jeg begynder at blive i tvivl jeg ikke bare skulle skrive om til Sql nu i stedet for at vente
Det er svært at sige - hver gang jeg er blevet påtvunget et program med databaseadgang på anden vis end via SQL, så er ansigtet automatisk blevet lagt i "trætte folder". Jeg hader at programmere på den måde - det er omstændigt at omskrive til SQL - og hvis programmet har bare et lille liv, så skal man det engang. En anden grund til mit "had" er, at i mit første Delphi-job var det SQL og client-server der blev programmeret. Det er viden/teknikker jeg er taknemmelig for og som jeg har bygget videre på. Desværre præger det min entusiasme når jeg ser TTable, TDBGrid eller lignende i brug.
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.