Results 1 to 10 of 10

Thread: ADO Query Locate werkt niet op ID veld

  1. #1
    John van Dijk
    Join Date
    Aug 2006
    Location
    Belfeld
    Posts
    51

    Question ADO Query Locate werkt niet op ID veld

    Ik wil met de Locate functie de recordset op een bepaald record zetten.
    Dat werkt op alle velden, maar niet op het ID veld.

    Ik heb de volgende test functie:

    Code:
    procedure TfrmMain.Button1Click(Sender: TObject);
    var bResult: Boolean;
    begin
      with dmData.qData do
      begin
        bResult := Locate('ID', edit1.Text,[]);
        if (bResult) then
        begin
          AddDebugInfo('Locate = TRUE');
        end else
        begin
          AddDebugInfo('Locate = FALSE');
        end;
      end;
    end;
    Het resultaat is altijd FALSE, maakt niet uit het ingegeven ID (edit1.text) bestaat of niet.
    Ook als ik eerst edit1.Text converteer naar Int
    Code:
    bResult := Locate('ID', StrToInt( edit1.Text ),[]);
    maakt niets uit.
    Pas ik dezelfde functie toe op ieder willekeurig ander veld uit de tabel, dan werkt het wel.
    Het ID veld is auto increment, type INT, en primary Key.

    Iemand een idee hoe dat zou kunnen?

  2. #2
    Hoe ziet je dmData.qData.SQL eruit?

    En heb je daar 'harde velddefinities' aanhangen of worden die automatisch aangemaakt?

  3. #3
    John van Dijk
    Join Date
    Aug 2006
    Location
    Belfeld
    Posts
    51

    SQL Format

    Het SQL commando ziet er als volgt uit:
    Code:
    SELECT tblMachTypes.MachType as MachType, * FROM tblDivSettings INNER JOIN tblMachTypes ON tblDivSettings.DIV_SETT_Machine_Hardware_Config_iMachineType = tblMachTypes.MachTypeNr  WHERE DeleteMark = 0  ORDER BY Customer,MachineNumber
    De hoofdtabel is tblDivSettings, hierin staat alle basis data.
    In tblMachTypes staat een omschrijving die via een nummer (MachType) is gekoppeld aan de hoofdtabel.
    Ik weet niet precies wat je met 'Harde velddefinities' bedoeld?

  4. #4
    Harde velddefinities kun je zien als je met rechtermuis op de dataset (dmData.qData) drukt en dan kiest voor "Fields editor". Als je daar velden in gedefinieerd hebt dan worden deze niet automatisch meer aangemaakt. En dan zou het best eens kunnen dat je daar geen ID-veld hebt staan. Als daar geen velden staan dan worden ze automatisch aangemaakt bij het uitvoeren van de query.

    Ik neem aan dat je gecontroleerd hebt dat je wel een veld ID hebt in de query?
    (en niet een ID1 en ID2 e.d.)

    Welke onderliggende database heb je?

  5. #5
    John van Dijk
    Join Date
    Aug 2006
    Location
    Belfeld
    Posts
    51
    Velddefinites onder de rechter muis knop heb ik eerlijk gezegd nog nooit ingevuld.
    Ik zet altijd het SQL commando klaar en geef dan een Active = True.
    De velden die ik dan krijg staan gedefinieerd in de query.
    Ik heb een testje gedaan; in een loopje de veldnamen opgesomd. Daar zit het veld ID gewoon bij.
    De database is SQL Server.
    Dit werkt wel:
    Code:
      with dmData.qData do
      begin
        First;
        while (not eof) and (FieldByName('ID').AsInteger <> StrToInt( Edit1.Text )) do
        begin
          Next;
        end;
      end;
    Maar is traag en niet echt een elegante oplossing....
    Last edited by jvdijk; 19-Dec-19 at 15:10.

  6. #6
    Quote Originally Posted by jvdijk View Post
    Maar is traag en niet echt een elegante oplossing....
    Dat loopje doet Delphi zelf ook hoor, met Locate().
    Maar je moet dan wel even DisableControls doen want anders worden alle aangehangen componenten ook geupdate.

    <snippet>
    Delphi Code:
    1. function TIBCustomDataSet.Locate(const KeyFields: string; const KeyValues: Variant;
    2.                                  Options: TLocateOptions): Boolean;
    3. var
    4.   CurBookmark: TBytes;
    5. begin
    6.   DisableControls;
    7.   try
    8.     CurBookmark := Bookmark;
    9.     First;
    10.     result := InternalLocate(KeyFields, KeyValues, Options);
    11.     if not result then
    12.       Bookmark := CurBookmark;
    13.   finally
    14.     EnableControls;
    15.   end;
    16. end;
    En in InternalLocate() zit gewoon weer een while ((not result) and (not Eof)) do

    Dus maak er eens dit van:
    Delphi Code:
    1. with dmData.qData do
    2. begin
    3.   DisableControls;
    4.   try
    5.     First;
    6.     while (not eof) and (FieldByName('ID').AsInteger <> StrToInt( Edit1.Text )) do
    7.     begin
    8.       Next;
    9.     end;
    10.   finally
    11.     EnableControls;
    12.   end;
    13. end;

  7. #7
    John van Dijk
    Join Date
    Aug 2006
    Location
    Belfeld
    Posts
    51
    Nou dat lijkt er meer op, dat kan ik wel toepassen.
    Het blijft echter wel vreemd dat die standaard Locate functie niet op het ID veld werkt......
    In ieder geval bedankt, ik kan weer verder :-)

  8. #8
    Ja, die TCustomADODataSet.Locate() ziet er ook wat anders uit dan de normale (in IBX).
    Die ADO-versie werkt met Set_Filter() aanroep direct naar ADO.
    Ik denk dat daar iets raars in zit.

    Maar goed... een eigen locate werkt dus net zo goed.
    (en dat hele ADO verhaal zal op een gegeven moment ook wel geschiedenis zijn)

  9. #9
    Senior Member
    Join Date
    Mar 2002
    Location
    Edam
    Posts
    426
    Nooit last met locate acties en combinatie ADO en SQL-Server. Maar waarom een Interbase TIBCustomdataset als je met SQL-server werkt? Of bedoel je SQL-server hier als generieke aanduiding voor een client-server database?

  10. #10
    Quote Originally Posted by Willem View Post
    Maar waarom een Interbase TIBCustomdataset als je met SQL-server werkt?
    Nee, ik liet even zien hoe het in de Delphi source gedaan wordt met Locate() en DisableControls omdat John een probleempje had met de snelheid van zijn eigen gemaakte while loopje. Dat was dus alleen een voorbeeldje. In de ADO source wordt de Locate() weer op een hele andere manier gedaan (wat dus waarschijnlijk de reden is waarom het met die ID niet werkt).

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •