Solved

How to delete the last record of a filtered ADO dataset.

Posted on 2004-10-30
221 Views
Last Modified: 2010-04-05
Hi,

I have three TADOTables (1=TCompanies, 2=TClients, 3=TCompanyClients).
The last two tables are connected to the same DatabaseTable = Clients.

PROBLEM 1:
When I am on the company level and want to display a grid with the clients belonging to that company I use a filter on the TClients table.
When I an on the client level I use the Clients table without a filter.
When I delete the last record in the filtered dataset (TClients) and try to do a refresh of the table then I get an errormessage saying that the record is out of range (row changed, index bla bla bla).

PROBLEM 2:
The table TCompanyClients is only used to quickly determine if the company has any clients. It has the TCompany datasource assigned to it as the Mastersource.
If the selected company has at least one client then a menuitem "Show Clients of this company" is shown (else it will be hidden).
This table isn't updated correctly after I post or delete records into the TClients table. So the menuoption isn't correctly updated also.

Now I have solved this by closing and opening (in stead of refreshing) the TClients and TCompanyClients tables. But this is not a good solution as you can imagine.

*************************************************************
One remark: I don't want to change datasources on DBGrids, DBedits etc. on my form
*************************************************************

Please supply me with some code that will solve these two problems correctly.

Thanks a lot.
The Wiz
0
Question by:Delphiwizard
    9 Comments
     
    LVL 12

    Expert Comment

    by:esoftbg
    Would you like to use TADOQuery instead of TADOTable ?
    0
     
    LVL 12

    Expert Comment

    by:esoftbg
    This works for me:

    procedure TForm1.adoqClientsNewRecord(DataSet: TDataSet);
    begin
      adoqClients.FieldByName('COMPANY_ID').AsInteger := adoqCompanies.FieldByName('ID').AsInteger;
    end;

    procedure TForm1.TClientsNewRecord(DataSet: TDataSet);
    begin
      TClients.FieldByName('COMPANY_ID').AsInteger := CompanyID;
    end;

    procedure TForm1.TCompaniesAfterScroll(DataSet: TDataSet);
    begin
      CompanyID := TCompanies.FieldByName('ID').AsInteger;
      TClients.Filtered := False;
      TClients.Filter :=''
                      + 'COMPANY_ID = '
                      + IntToStr(TCompanies.FieldByName('ID').AsInteger)
                      + '';
      TClients.Filtered := True;
      if TClients.Active then
        TClients.Requery([]);
    end;

    procedure TForm1.TClientsAfterDelete(DataSet: TDataSet);
    begin
      TClients.Requery([]);
      TCompanyClients.Requery([]);
    end;

    procedure TForm1.TClientsAfterPost(DataSet: TDataSet);
    begin
      TCompanyClients.Requery([]);
    end;
    0
     
    LVL 12

    Expert Comment

    by:esoftbg
    Please remove:

    procedure TForm1.adoqClientsNewRecord(DataSet: TDataSet);
    begin
      adoqClients.FieldByName('COMPANY_ID').AsInteger := adoqCompanies.FieldByName('ID').AsInteger;
    end;
    0
     
    LVL 12

    Accepted Solution

    by:
    download a full example from:
    page:        http://www.geocities.com/esoftbg/
      link:        Q_21188624.zip
    0
     

    Author Comment

    by:Delphiwizard
    Thanks a lot. Again..... :-)
    0
     
    LVL 12

    Expert Comment

    by:esoftbg
    You are welcome Delphiwizard !
    :-))
    0
     

    Author Comment

    by:Delphiwizard
    I saw that you have added a description to your solutions.
    That makes things a lot more easy to find.
    ...Stef
    0
     
    LVL 12

    Expert Comment

    by:esoftbg
    Yes, it was your advice to post description as I remember    :-))
    Emil
    0
     

    Author Comment

    by:Delphiwizard
    I have my moments.....
    0

    Write Comment

    Please enter a first name

    Please enter a last name

    We will never share this with anyone. Privacy Policy Terms of Use

    Featured Post

    Product Review - Android Remix

    Come along for the ride with our Senior Product Manager, Brian Matis, as he reviews the Android Remix.

    A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
    Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
    Want to pick and choose which updates you receive? Feel free to check out this quick video on how to manage your email notifications.
    Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, Just open a new email message.  In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…

    875 members asked questions and received personalized solutions in the past 7 days.

    Join the community of 500,000 technology professionals and ask your questions.

    Join & Ask a Question

    Need Help in Real-Time?

    Connect with top rated Experts

    13 Experts available now in Live!

    Get 1:1 Help Now