Avatar billede cope21 Nybegynder
09. december 2001 - 14:03 Der er 15 kommentarer og
1 løsning

Delphi / MS Access

Hej...

Lad os sige, at jeg har en database \"DB1\" med en tabel der hedder \"Info\" indeholdende felterne Number og Tekst. Hertil bruger jeg så TDatabase og TTable.

Normalt vil man bruge TQuery til at hente info, fx:

// Query1.Text := \'select * from Info order by Number\';
// Query1.Open;
// Query1.ExeSQL;
// Result := Query1.FieldByName(\'Tekst\').AsString;

For et års tid siden gjorde jeg det så på en anden måde, nemlig uden brug af TQuery. Problemet er, at jeg ikke kan huske hvordan - der var en ting eller to man lige skulle gøre, før man kunne gøres sådan her:

// Result := InfoTableTekst.AsString;

Disse 2 metoder havde helt den samme funktion - TQuery er mere \"kodemæssigt\" rigtigt, men det andre hurtigere med mindre kode.

Er der nogen der kan hjælpe mig til hvad det er man skal gøre, før det virker?

Takker :o)
Avatar billede morten_s Nybegynder
09. december 2001 - 14:12 #1
Qt man kan uden at bruge Query har jeg ikke hørt ført
men jeg kan se i dit eksempel at du blander det lidt sammen.

Hvis du laver en select skal det se sådan her ud:

with Query1 do
begin
  Close;
  SQL.Text := \'SELECT Id, IntId FROM intpic WHERE IntId = \'+ IntToStr(IdSelectedInt);
  Open;
end; //with Query1

Hvis du laver en Insert, eller Update så skal du bruge ExecSql, derudover kan du
bruge en parameter overførelse, se nedenstående

with Query1 do
begin
  Close;
  DisableControls;
  SQL.Clear;
  if CheckIntId <> IdSelectedInt then  //(New pic)
    SQL.Add(\'INSERT INTO intpic (IntId , PicDateTime, Pic) VALUES(:IntId, :PicDateTime, :Pic)\')
  else begin
    SQL.Add(\'UPDATE intpic SET IntId = :IntId, PicDateTime = :PicDateTime, Pic = :Pic WHERE Id = :Id\');
      ParamByName(\'Id\').AsInteger := SpinEdit1.Value;
  end;
  ParamByName(\'IntId\').AsInteger := IdSelectedInt;
  ParamByName(\'PicDateTime\').AsDateTime := Now;
  ParamByName(\'Pic\').SetBlobData(MemStream.Memory, MemStream.Size);
  ShowMessage(sql.Text);
  ExecSQL;
end; //With query1
Avatar billede cope21 Nybegynder
09. december 2001 - 14:24 #2
Ja ved godt det ikke var rigtigt - spørgsmålet blev lige skrevet lidt for hurtigt :)

Anyway.. man KAN gøre som i det eksempel ovenfor - spørgsmålet er, hvad der lige skal til før det virker.
Avatar billede stoney Nybegynder
09. december 2001 - 14:30 #3
Tror du ikke du bare har kaldt en function eller
procedure tidligere ?

Stoney
Avatar billede morten_s Nybegynder
09. december 2001 - 14:33 #4
Som sagt hvis du skal lave en select gør du på følgende måde

with Quer1 do
begin
  Close;
  SQL.Text := \'select * from Info order by Number\';
  Open;
end;

Og når du skal have fat i dine felter
feks hvis du har en variabel No : Integer hvor du vil have Number
over i:

No := Query1.FieldByName(\'Number\').AsInteger;

Du kan også bruge paraMETER, SÅ SE MIT TIDLIGERE EKSEMPEL
Avatar billede cope21 Nybegynder
09. december 2001 - 14:33 #5
Nej, det ved jeg at jeg ikke har :)

Man skulle gøre et eller andet med den TTable - men lige hvad, det kan jeg ikke huske.
Avatar billede morten_s Nybegynder
09. december 2001 - 14:34 #6
Quer1 = Query1 :)
Avatar billede morten_s Nybegynder
09. december 2001 - 14:37 #7


Du kan også bruge Table komponenterne, men det er en noget anden teknik
end Query, der dropper du bare et Table komponent på din form + En DataSource som du
tilforordner tol din Tabel.

Herefter kan du bruge DBKomponenterne til at læse dine felter med, og
det sker ganske\"rigtigt\" bag om rykken på dig
Avatar billede cope21 Nybegynder
09. december 2001 - 14:38 #8
Morten...

Ja ved det.. men hvis man både skal sætte ind og hente multiple times i samme funktion, kræver det minimum 2 TQuery\'s så.

Med det jeg \"leder efter\" kan man både sige:

No := Query1.FieldByName(\'Number\').AsInteger;

og

Query1.FieldByName(\'Number\').AsInteger := 21;

Og den henter/gemmer det direkte i databasen.

Jeg ved godt denne metode er meget lidt kendt, så med mindre der er en der ved præcis hvad jeg taler om vil jeg gerne (uden at være uhøflig) frabedes svar, der giver eksempler på andre metoder end den jeg leder efter.

Jeg kender godt TQuery, men i dette tilfælde er det ikke den jeg vil bruge - sorry ppl :)
Avatar billede morten_s Nybegynder
09. december 2001 - 14:41 #9
Ovenstående kan du gøre med table komponenterne men ej med Query

No := Table1.FieldByName(\'Number\').AsInteger;

Table1.FieldByName(\'Number\').AsInteger := 21;

Men hvis du ikke mener min viden er tilstrækkelig skal jeg nok
lade være med at svare dig yderligere *GGG*
Avatar billede cope21 Nybegynder
09. december 2001 - 14:50 #10
Morten...

Jeg siger skam ikke, at din viden ikke er tilstrækkelig, kun at jeg vil gøre det uden TQuery :)

Er det med TDatasource eller andet table komponent jeg kan gøre det jeg ønsker, vil jeg meget gerne se eksempel på hvordan *SS*

Du er inde på noget rigtigt med din sidste kommentar - og det er den mest normale måde at bruge table komponent på, nemlig:

No := Table1.FieldByName(\'Number\').AsInteger;

Men jeg ved det kan gøres sådan her:

Table1TableNumber.AsInteger := 21;


Jeg ved godt du tænker \"Hvad hulen er forskellen, funktionen er den samme\" og jeg forstår dig - det er bare måden man gør det på jeg mangler. Kunne fint bruge den anden måde, og det ender det nok også med hvis jeg ikke finder ud af det på den anden måde hehe.. men vil gerne vide hvordan :)
Avatar billede morten_s Nybegynder
09. december 2001 - 14:55 #11
Ja så kan man jo bruge Index navne
lidt klippet fra Delphi hjælpen

Table1.Active := False;

Table1.Exclusive := True;

{ Get the current available indices }

Table1.IndexDefs.Update;
{ Find one which combines Customer Number (\'CustNo\') and Order Number (\'OrderNo\') }
for I := 0 to Table1.IndexDefs.Count - 1 do
  if Table1.IndexDefs.Items[I].Fields = \'CustNo;OrderNo\' then
    { set that index as the current index for the table }
    Table1.IndexName := Table1.IndexDefs.Items[I].Name;
Table1.Exclusive := False;

Table1.Active := True;
Avatar billede cope21 Nybegynder
09. december 2001 - 14:59 #12
Syntaxen er pt sådan:

No := Table1.FieldByName(\'Number\').AsInteger;

Syntaxen skal være sådan:

No := Table1TableNumber.AsInteger;


Det er sådan set bare det jeg i bund og grund er ude efter.. Altså er der \"et-eller-andet\" der skal gøres med TTable properties eller noget, før det kan udføres på denne måde.

(Undskyld jeg holder fast på det Morten, men det er denne specifikke metode jeg er ude efter)
Avatar billede jekk Nybegynder
09. december 2001 - 21:51 #13
cope21 >>
er lige kommet hjem -
kunne ikke la\' vær\' med en kikker !
dit sidste svar ligne det jeg plejer at gøre - dobbeltklikker på mit TTable-object og vælger Add,
markerer det felt (Number) jeg har brug for, hvorefter, jeg kan referere til Table1NUMER.AsInteger...
Avatar billede cope21 Nybegynder
09. december 2001 - 22:03 #14
jekk, hvis du var en pige (det går jeg ikke ud fra du er) fik du sq et kys hehe - det var LIGE det jeg var ude efter!! :)

Hvis du lige skriver som et \"svar\" får I lige en håndfuld point hver - Morten for hans indsats, det er næsten synd ikke at give ham, håber det er ok :)
Avatar billede jekk Nybegynder
10. december 2001 - 13:55 #15
cope21 >>
herligt at du ku\' bruge det !

du har ret - jeg er ikke en pige og
jeg \"abonnerer\" iøvrigt heller ikke på eksperten for at få point, men mest for at få nogle gode hint !

så hvad point angår har jeg det bedst med, at de gives til nogen der er mere aktive ...

Avatar billede cope21 Nybegynder
10. december 2001 - 18:30 #16
Ok, så håber jeg det er ok, at Morten får bunken :) Og tak!!
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester