Results 1 to 10 of 10

Thread: Synchronisatie SQL zonder inhoud veld

  1. #1

    Synchronisatie SQL zonder inhoud veld

    Geachte lezer,

    Ik heb het volgende probleem:

    Op een server (op internet) draait een MySQL server en daar weer een bepaalde tabel op. Dee tabel is nogal groot maard at komt vooral door een textveld.
    De tabel wil ik synchroniseren met een tabel/procedure op kantoor. Als ik een Query uitvoer op de Mysql server is het resultaat ongeveer 20 MB.

    Ik heb een tabel die er als volgt uitziet:

    klantnummer DatumTijd Tekst

    Deze tabel laad ik via een TQuery (SELECT * FROM) en benader ik via een ClientDataset

    Ik voer een preocedure uit. Ofwel ik moet een nieuw record toevoegen: Clientdataset.INSERT/POST;
    of ik hoef niets te doen (meestal)
    of ik moet een wijziging uitvoeren: Clientdataset.Update/POST;

    Daarna Applyupdates;

    Ik moet het Tekstveld in de Query opnemen voor de update of Insert actie. Ik heb die data echter niet nodig omdat ik de dat overschrijf met de nieuwe data van kantoor.

    Ik hoop dat ik een beetje duidelijk maak wat ik bedoel. Omdat de tabel via internet wordt opgehaald moet alles toch een beetje klein zijn.

    Bedankt !

    Rogier

  2. #2
    Je verhaal is me niet geheel duidelijk maar ik denk dat je waarschijnlijk de providerflags van je velden goed moet zetten. Indien een veld de vlag pfInWhere heeft dan zal dit veld bij de Update in de Where-clause naar voren gaan komen.

    Lees anders eens het artikel van Marcel door over de Introductie ClientDataSet
    De beste manier om te leren is door fouten te maken.
    80 procent van alle leugens die jij en ik vertellen blijft onopgemerkt

  3. #3
    Hoi,

    Bedankt voor het antwoord.
    In principe werkt alles gewoon. Alleen het komt er op neer dat ik een aantal tekstvelden wil updaten of inserten. Van kantoor naar internet zeg maar. Als ik de clientdataset aanzet, haalt de query die er aan vast staat alla data op: SELECT * FROM. Dit is 20 MB en die data van die tekstvelden heb ik niet nodig. Ik synchroniseer 1 kant op. Van kantoor naar internet.

    Het tekstveld is nogal groot. Voor de rest heb ik wel een select all (dus alle klantnummer met een referentiedatum) nodig.

    Ik had eerst geprobeerd om alleen de velden te specificeren in de query die ik op wilde halen. Alleen gaat het dan fout als ik het tekstveld wil benaderen voor de update.

  4. #4
    Senior Member Henk Schreij's Avatar
    Join Date
    Sep 2002
    Location
    Heino (Raalte)
    Posts
    1,465
    Je zou natuurlijk alleen KlantNr en ReferentieDatum in je ClientDataSet kunnen ophalen.
    En in de OnAfterScroll de Tekst erbij halen van het huidige KlantNr.
    Deze tonen in een Memo. Dan die laten wijzigen.
    Vervolgens de wijziging in de Memo via Sql opslaan in de database.

    Als de OnAfterScroll te traag is kun je bv pas na 0,2 sec "op eenzelfde record blijven staan" het Tekstveld ophalen.
    Ik heb daarvan een voorbeeld staan op NLDelphi: Timer voorbeeld

  5. #5
    Ha Henk,

    Als je in de ClientDataSet geen tekstveld hebt staan, hoe moet je hem dan ophalen? Via een losse Query?

    Ik heb zojuist het volgende geprobeerd:

    SELECT klantnummer DatumTijd LEFT(Tekst,1) TEXT FROM
    Het resultaat is inderdaad een kleine tabel maar, als ik via de ClientDataSet een invoer of een update uitvoer, dan wordt er maar 1 teken overgezet.

    Kan ik dus 1 ophalen, maar onbeperkt updaten/inserten wat betreft het text veld?

  6. #6
    Senior Member Henk Schreij's Avatar
    Join Date
    Sep 2002
    Location
    Heino (Raalte)
    Posts
    1,465
    Ik heb geen verstand van MYSQL, dus corrigeer me als de Sql niet klopt.
    Maar het idee is dat je in de CDS maar 2 velden zet. Dus
    Sql Code:
    1. 'SELECT klantnummer, DatumTijd FROM ... '
    En dat je apart in de OnAfterScroll van de CDS de tekst ophaalt met een 2e dataset:
    Dus
    Sql Code:
    1. 'SELECT Tekst TEXT FROM ... WHERE klantnummer = '  + Cds.FieldByName(klantnummer).AsString

  7. #7
    Waarom haal je de tekst op als je die niet nodig hebt? Kun je die niet gewoon weglaten?

    [edit]
    Wat Henk Schreij zegt, dus.
    1+1=b

  8. #8
    Hoi,

    Mijn excuses voor het onduidelijke verhaal. Wellicht maak ik een denkfout.

    Ik wil de text niet ophalen maar alleen het tekstveld inserten of updaten indien nodig. Als ik in de Query een SELECT query stop en dan zonder het TEXT veld, kan de ClientDataSet het tekstveld niet vinden als hij een update oid wil maken.

    Misschien kan ik handmatig een veld toevoegen aan de CDS/Query?

    Ik heb het probleem nu opgelost door in een andere query de INSERTS uit te voeren maar dit zijn losse query's en zo ontloop ik de CDS in feite. Het werkt overigens wel:-)

    Ik hoop dat ik een beetje duidelijk ben.

    Dank u,

    Rogier

  9. #9
    Dan maak je een query met een parameter, bijvoorbeeld:
    SQL Code:
    1. SELECT Text FROM SomeTable WHERE ID = :ID

    In je ClientDataSet zet je de parameter op -1 en open je de ClientDataSet. De -1 bestaat niet, er wordt dus een lege dataset geopend. In deze dataset kun je je regel toevoegen en de tekst wijzigen.

    Een regel updaten zonder deze eerst op te halen is wat lastiger in ClientDataSet land, dat is ook een bijzondere constructie denk ik. Maar het is uiteraard wel mogelijk. Je gaat dan ook de regel toevoegen zoals boven, maar in het BeforeUpdateRecord van je provider ga je controleren of de regel al bestaat. Zo ja, dan ga je zelf de UPDATE uitvoeren en zet je de Applied op True.
    Marcel

  10. #10
    Mijn dank is groot!

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
  •