/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Til Stig Johansen: Fortsat problemer med S~
Fra : Kurt Guldbæk


Dato : 30-04-04 21:56

Hej Stig!

Jeg vil gerne fortsætte med mine problemer med forståelsen af SQL.

Jeg har en tekst i en TDBMemo, som jeg efter ændring gerne vil have indsat i
et Memofelt i Ejendom.db.
Jeg forsøger med nedenstående procedure, men har ikke held med det.

Jeg får i linie 14 en fejlmelding "Query1: Parameter 'Bem' not found". Det
forstår jeg ikke for feltet "Bem" findes, det ser jeg med 5. linie.
Egentlig skal jeg nok bruge "Update", da det er en eksisterende record, der
skal ændres, men da det er tilskrivningen af Value, der ikke virker, er
problemet jo det samme!
Da der stoppes allerede i linie 14 ved jeg endnu ikke om resten virker.

......................
procedure TEjendomsForm.dbmEjendomsMemoExit(Sender: TObject);
Var qInsert : TQuery;
BemText, Ejendom : String;
begin
tbEjendom.GetFieldNames(Listbox1.items); //Til debug: Vis feltnavne
BemText := dbmEjendomsMemo.Text;
Application.ProcessMessages;
Ejendom := EjendomsForm.tbEjendom.FieldByName('EjendomsId').Text;
Query1.Close;
With Query1 do
Begin
Close;
Unprepare;
ParamByName('Bem').AsString := BemText; //Fejl: Query1: Parameter 'Bem'
not found
Prepare;
SQL.Clear;
SQL.Add('Select EjendomsId From Ejendom ');
SQL.Add(' Where EjendomsId = '+ Ejendom);
Try //Find
Open;
Except //Ikke fundet EjendomsId
MessageDlg('Kunne ikke finde "'+Ejendom+'" i Ejendom.db',
mtInformation, [mbOK],0);
End; //Find
If Not Query1.Eof Then
Begin // Fundet
SQL.Clear;
SQL.Add('Insert Into Ejendom(Bem) Values(:BemText)');
Try //Indsæt
ExecSQL;
Except
//Fejl
MessageDlg('Fejl. Data ikke indskrevet', mtInformation, [mbOK],0);
End; //Indsæt
End; //Fundet
Close;
End; //With Query1
End;

--
Med venlig hilsen
Kurt Guldbæk




 
 
Henry (08-05-2004)
Kommentar
Fra : Henry


Dato : 08-05-04 18:40

> Hej Stig!
>
> Jeg vil gerne fortsætte med mine problemer med forståelsen af SQL.
>
> Jeg har en tekst i en TDBMemo, som jeg efter ændring gerne vil have indsat
i
> et Memofelt i Ejendom.db.
> Jeg forsøger med nedenstående procedure, men har ikke held med det.
>
> Jeg får i linie 14 en fejlmelding "Query1: Parameter 'Bem' not found". Det
> forstår jeg ikke for feltet "Bem" findes, det ser jeg med 5. linie.
> Egentlig skal jeg nok bruge "Update", da det er en eksisterende record,
der
> skal ændres, men da det er tilskrivningen af Value, der ikke virker, er
> problemet jo det samme!
> Da der stoppes allerede i linie 14 ved jeg endnu ikke om resten virker.
>
> .....................
> procedure TEjendomsForm.dbmEjendomsMemoExit(Sender: TObject);
> Var qInsert : TQuery;
> BemText, Ejendom : String;
> begin
> tbEjendom.GetFieldNames(Listbox1.items); //Til debug: Vis feltnavne
> BemText := dbmEjendomsMemo.Text;
> Application.ProcessMessages;
> Ejendom := EjendomsForm.tbEjendom.FieldByName('EjendomsId').Text;
> Query1.Close;
> With Query1 do
> Begin
> Close;
> Unprepare;
> ParamByName('Bem').AsString := BemText; //Fejl: Query1: Parameter
'Bem'
> not found
> Prepare;
> SQL.Clear;
> SQL.Add('Select EjendomsId From Ejendom ');
> SQL.Add(' Where EjendomsId = '+ Ejendom);
> Try //Find
> Open;
> Except //Ikke fundet EjendomsId
> MessageDlg('Kunne ikke finde "'+Ejendom+'" i Ejendom.db',
> mtInformation, [mbOK],0);
> End; //Find
> If Not Query1.Eof Then
> Begin // Fundet
> SQL.Clear;
> SQL.Add('Insert Into Ejendom(Bem) Values(:BemText)');
> Try //Indsæt
> ExecSQL;
> Except
> //Fejl
> MessageDlg('Fejl. Data ikke indskrevet', mtInformation, [mbOK],0);
> End; //Indsæt
> End; //Fundet
> Close;
> End; //With Query1
> End;
>
> --
> Med venlig hilsen
> Kurt Guldbæk


Hej Kurt

Ja undskyld jeg ikke hedder Stig, men måske kan jeg hjælpe dig lidt videre.

Du blander så vidt jeg kan se lidt rundt på dine navne. Det ser udtil at du
bruger bemtext som parameternavn men forsøger at bruge bem i parambyname,
men jeg kan jo tage fejl.

Kik lige her en gang


qyery.close;
query.clear; // medmindre at du altid bruger samme sql string, så behøver du
bare at sætte strings på query
query.sql.add('select * from DisneyTabel');
query.sql.add('where');
query.sql.add('feltA=:Kurtspar1');
query.sql.add('and feltB=:Kurtspar2');
query.parambyname('Kurtspar1').AsString := 'Anders';
query.parambyname('Kurtspar2').AsString := 'And';
query.open;
while not query.isEmpty do
begin
bla bla

query.next; // vigtig eller endless loop
end;
query.close;


En andet ting du bør lære er at bruge funktionen "format" og nej det er ikke
formatering af din harddisk

samme exempel som ovenstående kunne også se således ud.

var
sSql : string;
sTblname : string;
sFields : string;
sWhere : string;
begin
sTblname := 'DisneyTabel';
sFields := '*'; // kunne også være specifikke felter, men jeg er for doven
sWhere := format('feltA=%s and feltA:=%s',['Anders', 'And']);
SqlString := format('select %s from %s where %s',[sFields, sTblname,
sWhere]);

qyery.close;
query.clear; // medmindre at du altid bruger samme sql string, så behøver
du bare at sætte strings på query
query.sql.add(Sqlstring);
query.open;
while not query.isEmpty do
begin
bla bla

query.next; // vigtig eller endless loop
end;
query.close;

end;

Den sidste har et par klare fordele i forhold til den første.

1. Det er meget meget lettere at debugge på præcist hvordan det endelige sql
statement ser ud.
2. Du kan faktisk, som vist, også have tabelnavnet som variable, det kan man
ikke med Parambyname.

mvh
Henry















Kurt Guldbæk (09-05-2004)
Kommentar
Fra : Kurt Guldbæk


Dato : 09-05-04 23:02

> Hej Kurt
>
> Ja undskyld jeg ikke hedder Stig, men måske kan jeg hjælpe dig lidt
videre.
>
> Du blander så vidt jeg kan se lidt rundt på dine navne. Det ser udtil at
du
> bruger bemtext som parameternavn men forsøger at bruge bem i parambyname,
> men jeg kan jo tage fejl.
>
> Kik lige her en gang
>
>
> qyery.close;
> query.clear; // medmindre at du altid bruger samme sql string, så behøver
du
> bare at sætte strings på query
> query.sql.add('select * from DisneyTabel');
> query.sql.add('where');
> query.sql.add('feltA=:Kurtspar1');
> query.sql.add('and feltB=:Kurtspar2');
> query.parambyname('Kurtspar1').AsString := 'Anders';
> query.parambyname('Kurtspar2').AsString := 'And';
> query.open;
> while not query.isEmpty do
> begin
> bla bla
>
> query.next; // vigtig eller endless loop
> end;
> query.close;
>
>
> En andet ting du bør lære er at bruge funktionen "format" og nej det er
ikke
> formatering af din harddisk
>
> samme exempel som ovenstående kunne også se således ud.
>
> var
> sSql : string;
> sTblname : string;
> sFields : string;
> sWhere : string;
> begin
> sTblname := 'DisneyTabel';
> sFields := '*'; // kunne også være specifikke felter, men jeg er for
doven
> sWhere := format('feltA=%s and feltA:=%s',['Anders', 'And']);
> SqlString := format('select %s from %s where %s',[sFields, sTblname,
> sWhere]);
>
> qyery.close;
> query.clear; // medmindre at du altid bruger samme sql string, så
behøver
> du bare at sætte strings på query
> query.sql.add(Sqlstring);
> query.open;
> while not query.isEmpty do
> begin
> bla bla
>
> query.next; // vigtig eller endless loop
> end;
> query.close;
>
> end;
>
> Den sidste har et par klare fordele i forhold til den første.
>
> 1. Det er meget meget lettere at debugge på præcist hvordan det endelige
sql
> statement ser ud.
> 2. Du kan faktisk, som vist, også have tabelnavnet som variable, det kan
man
> ikke med Parambyname.
>
> mvh
> Henry
>

Hej Henry!

Du er da hjertelig velkommen til at svare. Grunden til, at det var stilet
til Stig er, at det er en fortsættelse af en gammelt problem, som han hjalp
med.

Jeg har endnu ikke nærlæst dine eksempler, så der er ingen kommentarer
endnu.

Generelt har jeg svært ved at overføre det, som jeg har læst i "SQL i
praksis" fra IDG til Delphi. At opbygge de relevante SQL-statement synes jeg
ikke er svært, men når det skal bringes ind i Delphi, kniber det.

'BemText' er en variabel indeholdende den tekst, der skal anbringes i feltet
'Bem' i tabellen 'Ejendom.db' i den record, hvor feltet 'EjendomsID' er lig
med tallet, som findes i 'Ejendom'.

Det burde kunne klares med sætningen:
Update Ejendom
Set Bem = '(indholdet af variablen BemText)'
Where EjendomsId = '(indholdet af variablen Ejendom)'

Problemet er, at jeg ikke kan få variablernes indhold korrekt med over i
SQL-sætningerne.

Er der for øvrigt en metode til i runtime at se SQL-sætningerne i f.eks. et
memofelt? Det ville gøre det nemmere at se hvad man gør galt, når men kan se
resultatet af sine SQL.ADD.

Jeg har klaret det aktuelle problem uden brug af SQL, men jeg tror, at jeg
flere steder med fordel kunne bruge SQL. Derfor vil jeg gerne have det til
at fungere.

--
Med venlig hilsen
Kurt Guldbæk




Henry (11-05-2004)
Kommentar
Fra : Henry


Dato : 11-05-04 18:40

> Hej Henry!
>
> Du er da hjertelig velkommen til at svare. Grunden til, at det var stilet
> til Stig er, at det er en fortsættelse af en gammelt problem, som han
hjalp
> med.
Jamen jeg takker og bukker men i bund og grund er der ingen grund til at
stile et spøgsmål til een bestemt person i et åbent forum, jeg er sikker på
at Stig ville svare hvis han havde tid og mulighed for det. Men der kan jo
være andre som du jo "udelukker" lidt.

> Jeg har endnu ikke nærlæst dine eksempler, så der er ingen kommentarer
> endnu.
De svarer eller på en del af dine spørgsmål

> Generelt har jeg svært ved at overføre det, som jeg har læst i "SQL i
> praksis" fra IDG til Delphi. At opbygge de relevante SQL-statement synes
jeg
> ikke er svært, men når det skal bringes ind i Delphi, kniber det.
Kender ikke bogen.

> 'BemText' er en variabel indeholdende den tekst, der skal anbringes i
feltet
> 'Bem' i tabellen 'Ejendom.db' i den record, hvor feltet 'EjendomsID' er
lig
> med tallet, som findes i 'Ejendom'.
Der er et felt og flere "variabler" her.
Feltet hedder "bem"
En pascal variable der hedder "bemtext"
En Param variable som kan hedde hvad som helst f.eks. kurt

Således:

add('insert into ejendom');
add('set bem=:kurt');
add('where feltX=:hugo');

parambyname('kurt').asstring := 'aha';
parambyname('hugh').asstring := 'hvor smart';

Du kan ikke se den færdige sql string på noget tidspunkt, desværre.

derfor er min metode 2 langt bedre bl.a. når det handler om debugging men
den er også bedre til at arbejde med opbygning dynamiske sql statements.

helt simpelt således.

var sqlstring : string;
sqlstring := format('insert into ejendom set bem=%s where
hugh=%s',[quotedstr('aha'), quotedstr('hvor smart')]);
add(sqlstring);
execsql;

PS. ikke testet, bare lige ud af hovedet.


> Det burde kunne klares med sætningen:
> Update Ejendom
> Set Bem = '(indholdet af variablen BemText)'
> Where EjendomsId = '(indholdet af variablen Ejendom)'
>
> Problemet er, at jeg ikke kan få variablernes indhold korrekt med over i
> SQL-sætningerne.
Det er som jeg skriver, fordi du blander rundt på navnene.


> Er der for øvrigt en metode til i runtime at se SQL-sætningerne i f.eks.
et
> memofelt? Det ville gøre det nemmere at se hvad man gør galt, når men kan
se
> resultatet af sine SQL.ADD.
Nope, du kan godt se strengen men du kan ikke se værdierne.

> Jeg har klaret det aktuelle problem uden brug af SQL, men jeg tror, at jeg
> flere steder med fordel kunne bruge SQL. Derfor vil jeg gerne have det til
> at fungere.
Enig, du bør fortsætte med SQL!

mvh
Henry



Stig Johansen (12-05-2004)
Kommentar
Fra : Stig Johansen


Dato : 12-05-04 05:26

Henry wrote:

> jeg er
> sikker på at Stig ville svare hvis han havde tid og mulighed for det.

Det har du ret i. Jeg har netop været i Jylland et stykke tid, og har ikke
haft mulighed for at svare i grupperne.

--
Med venlig hilsen
Stig Johansen

Kurt Guldbæk (15-05-2004)
Kommentar
Fra : Kurt Guldbæk


Dato : 15-05-04 22:29

"Stig Johansen" <aaa@bbb.com> skrev i en meddelelse
news:40a1a759$0$3046$14726298@news.sunsite.dk...
> Henry wrote:
>
> > jeg er
> > sikker på at Stig ville svare hvis han havde tid og mulighed for det.
>
> Det har du ret i. Jeg har netop været i Jylland et stykke tid, og har ikke
> haft mulighed for at svare i grupperne.
>
> --
> Med venlig hilsen
> Stig Johansen

Tak for jeres svar.
Jeg har ikke haft tid til at kikke ret meget på sagen endnu, det arbejde kan
ødelægge mange ting.
Jeg tror efterhånden, at jeg begynder helt forfra, nu har jeg fået flere
problemer med tabeller og forms, der opfører sig mærkeligt.

Jeg har lagt mine databaser og deres sammenhænge (pdf-fil) op på foreningens
nye hjemmeside på www.arkivet-vinderup.dk. Tryk på datoen nederst i menuen
til venstre.

--
Med venlig hilsen
Kurt Guldbæk




Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste