Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Pascal: Delphi Adoquery.locate useammalla kentällä

doze [14.12.2004 05:51:44]

#

Heps,

Kuinka on mahdollista, vai onko edes, tehdä Adoqueryn locate useammalla kentällä tälläisessä tapaiksessa:

queryn kentät:

id (Integer), etunimi (string), sukunimi (string)

Yritin säätää tällästä:

ADOQuery1.Locate('id;etunimi;sukunimi;',VarArrayOf([Edit1.Text,Edit2.Text,Edit3.Text]),[loPartialKey,loCaseInsensitive]);

tietenki toi ei toiminu ihan tolasenaan kun ensimmäinen kenttä on integer ja editistä tulee string (kuinka kuuluisi tehdä?) mutta koitin ilman tuotakin kenttää ja ei pelittänyt.. ei tule virhettä käännettäessä mutta ei vain pelitä.

Edit: tai no lähemmin tarkasteltaessa kyllä se toimi kun kirjoitti kokonaan hakuehdot mitkä löytyy querystä, eli loPartialKey ei toimi.. loCaseInsensitive toimii..

Metabolix [14.12.2004 23:46:45]

#

En tiedä tuosta loPartialKey-ongelmasta (kyllähän sen pitäisi toimia... Vaihda [nämä, tässä] toisin päin :P ihan niinkuin sillä mitään väliä olisi :), mutta teksti muuttuu luvuksi funktiolla StrToInt(Teksti). Tätä ennen kannattaa tarkistaa, että luku on tosiaan luku, koska muuten saat virheilmoituksen. Val-funktioon kannattaa tutustua.

doze [15.12.2004 04:54:23]

#

Hmm.. nojoo.. Tällänen on koko proseduuri, toimii muuten OK, mutta loPartialKey ei toimi.

procedure TForm_hiihtajatiedot.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var Edit_id_int, errorPos: Integer;
begin
Val(Edit1.Text, Edit_id_int, errorPos);
if errorPos = 0 then
  begin
  ADOQuery1.Locate('user_id;etunimi;sukunimi;',VarArrayOf([edit_id_int,Edit2.Text,Edit3.Text]),[loCaseInsensitive,loPartialKey]);
  end
else
  begin
  ADOQuery1.Locate('etunimi;sukunimi;',VarArrayOf([Edit2.Text,Edit3.Text]),[loCaseInsensitive,loPartialKey]);
  Edit1.Clear;
  end
end;

Eli formilla on 3 haku kenttää joihin syöttämällä tekstiä tuollainen proseduuri pyörähtää:

Edit1 (id), Edit2 (etunimi), Edit3 (sukunimi)

Jos syöttää jonkin id:n mikä löytyy querystä, sen tietueen etunimen (kokonaisena) ja sukunimestä ensimmäisen kirjaimen niin silloin toimii loPartialkey. Eli kun kaikki muut hakuehdot on täydellisenä paitsi viimenen. Sama ei toimi jos esim ensimmäinen ja viimeinen on täydelliset ja keskimmäiseen syöttää. Vain locaten viimeinen hakuehto toimii aina loPartialkey optiota käyttäen.

Tälläisen ohjeen sain:

it has to do with the way your db key is set up. you can ignore fields (partial keys) by removing fields from the last field in the key working towards the first.

Toteutuspuolella on nyt vain vähän hankaluuksia. En ymmärrä kuinka tuo toteutetaan. Apuuva!

Metabolix [15.12.2004 09:31:30]

#

Vaikea sanoa näin tietokantoja tuntematta, mutta ainakin niin onnistuisi, että tekisit kaikki kolme hakua erikseen ja näyttäisit tuloksista ne, jotka löytyivät jokaisella haulla. Jotakin saattaa myös saada selville tonkimalla lähdekooditiedostoja tuosta Locate-funktiosta ja siinä käytetyistä funktioista. Katsotaan jos ehdin/jaksan tutustua tarkemmin tuohon TADOQueryyn joskus illemmalla.

doze [19.12.2004 03:43:43]

#

Niin siis, tuota tuota.. kyllähän toi toimisi helpostikin, jos käyttäsi esim. sql selectiä tuon locaten tilalla, mutta tuon locaten tarkoitus on se, että noiden keyfield arvojen perusteella se siirtää adoqueryn kyseistä recordia vastaavaksi, joten tiedot Delphin formissa joka käyttää Data-aware komponentteja päivittyy kyseistä vastaavaksi.

Tuo pitäisi nyt tehdä ilmeisesti jotenkin niin että tuota VarArrayOf muuttaa.. tai siis niin että, kun viimeisen keyfieldin perusteella on löytynyt arvo (eli edit3.text), niin hypätään taaksepäin ja katsotaa edit2.text jne..

Mutta ei hajuakaan toteutuksesta.. voi olla tietty muitakin tapoja, en ole ikinä ennen tuota locatea käyttänyt, yhtään tiedä kuinka toimii. Täytyy koittaa kysellä lisäapujoukkoja :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta