Results 1 to 6 of 6

Thread: Problemen met InternalCalc field in ClientDataSet

  1. #1

    Question Problemen met InternalCalc field in ClientDataSet

    Hallo allemaal,

    Wie kan mij helpen met het volgende probleem. Ik heb de volgende constructie:

    Tabel in Access file > TADOTable > TDataSetProvider > TClientDataSet > DBGrid.

    In de ClientDataSet zijn alle originele fields uit de ADOTable aangemaakt als persistent fields. Bovendien heb ik een extra persistent field aangemaakt van het type InternalCalc die een berekening doet op twee van de originele velden.

    Het probleem is echter dat ik niet in staat blijk om nieuwe records toe te voegen aan de ClientDataSet. Op het moment dat ik een nieuw record wil inserten in DBGrid, dan wordt eerst keurig de goede waarde berekend voor het InternalCalc field, maar op het moment dat het record ge-post wordt krijg ik de foutmelding "Project raised exception class EDBClient with message ' ' ."

    Het lijkt erop alsof het InternalCalc Field niet "geaccepteerd" wordt door de DataSetProvider, bijvoorbeeld omdat het veld niet voorkomt in de ADOTable. Volgens mij onstaan de problemen nog voordat ApplyUpdates wordt aangeroepen.

    Klopt dit? Hoe zou ik dit kunnen omzeilen? Merk op dat ik het InternalCalc field wel echt nodig heb omdat ik wil kunnen sorteren op de calculated values in de DBGrid. Het veld hoeft echter niet te worden opgeslagen.


    PS: Indien nodig kan ik uiteraard meer details geven over mijn properties & code, maar ik weet op dit moment niet goed wat hiervoor allemaal relevant is...

    Bij voorbaat hartelijk dank voor jullie hulp!

  2. #2
    Allereerst natuurlijk welkom op NLDelphi.

    Het is inderdaad raar dat je veld meegenomen wordt bij een update, de ClientDataSet zou dat al moeten herkennen en die zo al helemaal niet naar de provider mogen gaan. Als je de fout overigens al bij de post krijgt heeft je provider er nog niets mee te maken, die gaat pas bij de ApplyUpdates meedoen.

    Wat gebeurd er als je het veld op fkCalculated zet (behalve dat je dan niet meer kunt sorteren, maar het is even om te testen)?

    Ik heb even een projectje gemaakt om te testen, die doet het (natuurlijk) wel goed. Kun je eens kijken wat ik anders doe dan jij?
    Attached Files Attached Files
    Marcel

  3. #3
    Hartelijk dank voor je snelle reactie!!

    Als ik het veld op fkCalculated zet dan werkt alles perfect en grandioos. Heel erg vreemd dus. Maar ik kan dan dus inderdaad niet meer sorteren

    Dank voor je demo. Ik heb hem vergeleken met mijn eigen project, maar kan op het eerste gezicht geen grote verschillen vinden.

    Ik heb nu echter (naar jouw voorbeeld) mijn eigen project volledig gestript van alle niet-relevante elementen zodat alleen "het probleem" achterblijft. Deze files zijn te groot om toe te voegen maar je kunt ze downloaden op: www.arenoe.nl (klik op "File"). Misschien dat jij (als je tijd en zin hebt natuurlijk) eens zou kunnen kijken wat ik fout doe?

    De fout treedt op als ik naar het laatste record scroll, er op ga staan, en dan met pijltje-naar-beneden een nieuw record toevoeg. Als ik een geldige nederlandse postcode invoer bij G_PC en dan enter geef, dan zie je dat de juiste geo-coordinaten worden opgezocht en ook de juiste afstand wordt berkend. Dit gaat dus allemaal goed. Als ik dan echter pijltje-omhoog doe (om het nieuwe record te inserten), dan krijg ik de Exception (die verder ook niet gespecificeerd is).

    Wat-o-wat doe ik fout??

    Grt,

    Bjorn

  4. #4
    Hi Marcel,

    Probleem opgelost!!

    Jouw suggestie om te testen wat er gebeurd als je het veld op fkCalculated zet, zette me aan het denken...

    Eerst heb ik geprobeerd of het mogelijk was om een record te inserten door eerst het veld op fkCalculated te zetten, dan het record te inserten en dan weer terug te zetten op fkInternalCalc. Met een knop werkt dit dan als volgt:

    procedure TStoreExplorerForm.Button2Click(Sender: TObject);
    begin
    With DMStoreExplorer do
    begin
    TSPGebiedVal.Close;
    TSPGebiedValG_DIST_Calc.FieldKind := fkCalculated;
    TSPGebiedVal.Open;
    TSPGebiedVal.InsertRecord([ nil, 9999, 'ZZZ', nil, nil, 'ZZZ', 'ZZZ', 'ZZZ', nil]);
    TSPGebiedValApply(Sender); {Apply Updates}
    TSPGebiedVal.Close;
    TSPGebiedValG_DIST_Calc.FieldKind := fkInternalCalc;
    TSPGebiedVal.Open;
    end;
    end;


    Beetje omslachtig met al dat openen en closen, maar het werkt dus wel.

    Vervolgens bedacht ik me dat er dus kennelijk een fout optreedt bij het hercalculeren van waarden TERWIJL JE BINNEN EEN EN HETZELFDE RECORD WIJZIGINGEN AANBRENGT.

    Toen vond ik in de Developers Guide de laatste aanwijzing, namelijk dat je met de property TClientDataset.AutoCalcFields := False kunt voorkomen dat de OnCalcFields event wordt getriggered op het moment dat je bezig bent met modificaties binnen je record. In mijn applicatie stond AutoCalcFields overal dus nog op True (default) .

    Alles werkt nu perfect.

    Bedankt dat je me op het goede spoor hebt gezet!

    Met vriendelijke groet,

    Bjorn

  5. #5
    Mooi!! Ik was nog aan het spelen geweest met je testproject, maar ik liep om de één of andere reden steeds tegen een key violation op. Mooi dat we er weer uit zijn
    Marcel

  6. #6
    Nog even als achtergrond: ik ben ECHT blij dat je me geholpen hebt. Dit was een project voor onze belangrijkste klant die nu echt iets moois heeft gekregen. Tien keer hoera voor NLDelphi!!!

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
  •