Page 1 of 2 1 2 LastLast
Results 1 to 15 of 17

Thread: Lookup met ClientDataSet

  1. #1
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833

    Question Lookup met ClientDataSet

    Ik wil een CDS gebruiken om telkens data van één record op te halen. (is nodig om details in een VirtualTreeView weer te geven)
    Ik ken de ID van het record, dus geef ik de ID mee als parameter.
    Om de CDS nu het gevraagde record via de Provider op te laten halen uit de database, moet ik de CDS Closen en Openen. En dit elke keer ik een ander record wil ophalen.

    Is er een een betere manier om een CDS een record uit de database te laten ophalen? Ik sluit en heropen de CDS namelijk niet graag

    Wellicht is het iets poepsimpel, maar ik kijk er compleet naast!
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  2. #2
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Wat is de reden dat je telkens 1 record wilt ophalen? Je bouwt je virtualtreeview op vanuit een CDS /table. Dan kan je toch gebruik maken van diezelfde dataset.

    Of ik zie het verkeerd.
    Delphi is great. Lazarus is more powerfull

  3. #3
    Er moet een nieuwe query worden uitgevoerd, dus zo raar is het niet om de ClientDataSet te sluiten en openen. Vanwaar je aversie daartegen?
    Marcel

  4. #4
    Sam ik snap jouw probleem eerlijk gezegd ook niet. Je wilt detail data ophalen uit de database als je die nodig hebt (prima concept). Dan is het toch logisch dat je die CDS moet sluiten en openen (of op een andere manier verversen)?

    Je zou nog kunnen overwegen voor die detaildata een simpele query te gebruiken in plaats van een CDS.

  5. #5
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Quote Originally Posted by Marcel View Post
    Er moet een nieuwe query worden uitgevoerd, dus zo raar is het niet om de ClientDataSet te sluiten en openen. Vanwaar je aversie daartegen?
    Marcel, Welke winst heb je hier mee als je telkens een nieuw record moet ophalen?
    Delphi is great. Lazarus is more powerfull

  6. #6
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    Quote Originally Posted by jkuiper View Post
    Marcel, Welke winst heb je hier mee als je telkens een nieuw record moet ophalen?
    Het hele idee van een VirutalTree is dat je enkel en alleen die data ophaalt die je ziet. Zo kun je een tree hebben van 100.000 records, waarvan je er maar 20 toont. Scroll je verder, of ga je dieper in de tree, dan pas haal je de nodige data op.
    Dit is stukken effficiënter dan 100.000 records op te halen uit de database, waarvan je er 99.980 niet toont.

    Voor Marcel, Benno en andere mee-lezers: Ik voer heel wat werk uit tijdens het openen van mijn CDS (zelf samenstellen en optimeseren van de SQL-query, fields at runtime bijmaken, enz.)
    Daarom mijn hoop dat het zonder Close en Open kon.
    Iets in de zin van "DataSetProvider, jij weet hoe je aan data geraakt, geef mij het record met ID=1234, dan steek ik dat bij in mijn tabel".
    Dit is ongeveer wat een Locate doet, alleen doet die dat heel inefficiënt door de provider ALLE records op te laten halen tot hij aan record 1234 komt.

    Het is trouwens geen "nieuwe query" maar eenzelfde query met een nieuwe waarde voor een parameter. Ik had gehoopt hiermee voordeel te doen qua tijdswinst.

    Maar als het niet gaat zonder Close en Open, dan gaat het niet!
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  7. #7
    Quote Originally Posted by jkuiper View Post
    Marcel, Welke winst heb je hier mee als je telkens een nieuw record moet ophalen?
    Er is geen winst te behalen, maar je komt er niet onderuit. Het is nou eenmaal over het algemeen niet slim om alles op te halen en daar zelf in te gaan spitten. Dat kan voor een paar duizend regels nog best, maar daarboven is het zinvoller om alleen op te halen wat je nodig hebt.
    Marcel

  8. #8
    Quote Originally Posted by SamWitse View Post
    Voor Marcel, Benno en andere mee-lezers: Ik voer heel wat werk uit tijdens het openen van mijn CDS (zelf samenstellen en optimeseren van de SQL-query, fields at runtime bijmaken, enz.)
    Daarom mijn hoop dat het zonder Close en Open kon.
    De ClientDataSet is van zichzelf redelijk "lean and mean". Je hebt daar je eigen framework omheen gebouwd en dat gaat nu, in dit geval, tegen je werken. Misschien kun je in je framework een LeanAndMean property maken waarmee je zegt dat je deze regel alleen op gaat halen om te lezen en dat extra queries dus niet nodig zijn. Het aanmaken van field object kun je voorkomen door designtime al je velden aan te maken.

    Quote Originally Posted by SamWitse View Post
    Iets in de zin van "DataSetProvider, jij weet hoe je aan data geraakt, geef mij het record met ID=1234, dan steek ik dat bij in mijn tabel".
    Eigenlijk is dat ook exact wat de DataSetProvider doet. Als je een query met parameters gebruikt en een goede combinatie van componenten en database kan de Prepared property je daar nog eens extra bij helpen. In het geval van ADO met SQL Server wordt er dan van je query een stored procedure op je server aangemaakt die met de parameter(s) wordt uitgevoerd. Met name voor herhaalde queries met kleine resultaten kun je daar misschien nog performancewinst uit halen.
    Marcel

  9. #9
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    Quote Originally Posted by Marcel View Post
    Eigenlijk is dat ook exact wat de DataSetProvider doet.
    Let wel, ik wil de DataSetProvider één record laten toevoegen aan de reeks records in de CDS.

    De Query haalt telkens één record op, en de CDS bevat na een tijd een hoop niet-opeenvolgende records. Kan dit?
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  10. #10
    Ah, ik miste het woordje "bij" in je zin . Nee, dat kan de provider niet standaard. Je zou dat kunnen oplossen door een extra lege ClientDataSet te maken en daar steeds het record vanuit de gekoppelde ClientDataSet in te kopiëren.
    Marcel

  11. #11
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    Ik ben ondertussen wat aan het experimenteren met de method TClientDataSet.DataRequest.
    Het leek veelbelovend, maar de snoodaard voert intern nog telkens een Open uit
    Nu nog de property DoNotOpenYourselfAsYouAreAlreadyOpen zoeken.
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  12. #12
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    Ik ben al verder.
    Ik zou zelfs zeggen "Ik ben er bijna!"

    Ik heb een hack moeten gebruike van een CustomClientDataSet om aan de property ProviderEOF te geraken.
    Hier is de code:

    Delphi Code:
    1. {Steek de gevraagde ID in de parameter van IBQuery }
    2. TIBQuery(DataSetProvider2.Dataset).ParamByName('ID').Value := Data.ID ;
    3.   {Zorg dat de CDS het record wil opvragen aan de Provider}
    4. THackCDS(ClientDataSet2).ProviderEOF := false ;                        
    5.   {Haal het volgend record bij de Provider}
    6. ClientDataSet2.GetNextPacket ;                                          
    7.   {Test: controleer of er records zijn bijgekomen in de CDS}
    8. Label4.Caption := inttostr(ClientDataSet2.RecordCount) ;      
    9.   {Positioneer op het gevraagde record}
    10. ClientDataSet2.Locate('ID',Data.ID,[]) ;

    Alleen, nu komen de records er dubbel in! Ik zou niet weten waarom...
    Gelukkig wel enkel die records die ik nodig heb.
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  13. #13
    Hmm, cool! En je query haalt dan steeds één regel op?
    Marcel

  14. #14
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    Quote Originally Posted by Marcel View Post
    Hmm, cool! En je query haalt dan steeds één regel op?
    Ik vind het ook cool!

    Volgens de query haal ik steeds maar 1 record op. De CDS verwacht ook maar één record omdat ik PacketRecords op 1 gezet heb.

    Ik vermoed dat de query 2 maal wordt uitgevoerd, alleen heb ik geen flauw vermoeden waar dat dan gebeurt.
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  15. #15
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    GRRRR

    De VirtualTree vraagt TWEE MAAL een GetText per record.
    Vandaar dat het record -dankzij mijn geniale code- ook twee maal opgehaald werd, en twee maal in de CDS werd gestoken.

    Nu heb ik er een testje rond gezet:
    Delphi Code:
    1. if not ClientDataSet2.Locate('ID',Data.ID,[]) then
    2.   begin
    3.      <de zwik uit de vorige post>
    4.   end
    ...en komt elk record nog maar éénmaal voor in de CDS.

    Nu kan ik dartel het weekend inhuppelen!
    Last edited by SamWitse; 14-Oct-11 at 15:12.
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

Page 1 of 2 1 2 LastLast

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
  •