Results 1 to 8 of 8

Thread: Reacties op artikel 'TbigInifileDataset '

  1. #1

    Reacties op artikel 'TbigInifileDataset '

    Hoewel er veel kritiek is op het gebruik van inifiles als database, merk ik uit de praktijk dat er vrij vaak voor deze oplossing wordt gekozen als het om een beperkt aantal gegevens gaat. Het grote voordeel is namelijk dat inifiles klein en makkelijk onderhoudbaar zijn (zonder aparte tools) en er geen drivers op het systeem geïnstalleerd hoeven te worden. Het is alleen jammer dat de migratie van inifiles naar een 'echte' database vrij lastig is.

    Als oplossing hiervoor heb ik een dataset afgeleide gemaakt die inifiles kan lezen. Het maken van deze dataset heeft de nodige moeite gekost aangezien TDataset, en dan met name de interne struktuur ervan vrijwel niet is gedocumenteerd. Veel van de open source datasets zijn slecht gedocumenteerd of hebben zoveel extra code voor het verwerken van de data, dat nauwelijks te zien is wat er nu daadwerkelijk bij de dataset hoort. Door de kleine hoeveelheid code die nodig is voor het lezen uit inifiles hoop ik dat dit artikel duidelijk kan laten zien hoe een dataset nu eigenlijk in elkaar zit.


    Lees het artikel...

    ...of reageer op dit artikel als reply op deze thread.
    Marcel

  2. #2
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Zo enthousiast als ik was over 't idee ben ik ook over de uitwerking . Het enige minpuntje is het gebrek aan schrijf-ondersteuning, maar dat komt later wel, voorderest is het een uitstekende uitleg over het implementeren van een TDataSet, klasse!
    Qui custodiet ipsos custodes

  3. #3
    Senior Member walterheck's Avatar
    Join Date
    Oct 2001
    Location
    Belo Horizonte, Brasil
    Posts
    4,212
    Goed artikel GT! Je wordt al een echte big Ik heb er twee jaar geleden ook eens naar gekeken om dit te proberen, maar aangezien ik toen pas een paar maanden programmeerde heb ik er vanaf gezien. Met dit artikel worden een hele hoop dingen duidelijk gemaakt!

    PS. ik heb natuurlijk ook wel wat te miemelen: je maakt een functie "function ParseFieldDef(ADef: string): Boolean;" die je vervolgens aanroept of het een procedure is. Nou heb ik je dat wel vaker zien doen (in NLDFilesearch zit ook zoiets ) en is het absoluut geen probleem, maar ik wil het toch even kwijt

    PPS. Is het misschien geen idee om er een NLDOpenSource van te maken? Je hebt alle source nu toch al hier gezet en toegelicht, en dan heb je meteen een goed onderkomen voor je dataset...
    Nee, de Romeinen spraken geen ISO-8859-1 LATIN

  4. #4
    TDelphiDeveloper Baldo's Avatar
    Join Date
    Apr 2002
    Location
    Hellevoetsluis
    Posts
    498
    Zeker een goed artikel: duidelijke taal en goede verwijzingen naar een bron en andere artikelen. Ik zou zelf niet kiezen voor dergelijke datasets, maar ik ben wel al eens bezig geweest een eigen TDataSet descendant te maken en het ontbrak me aan informatie om het goed te doen. Dit artikel maakt dat ik weer eens op zoek ga naar mijn eigen probeersel... Voor liefhebbers van meer informatie: Steve Troxell heeft in the Delphi magazine issue 25 en 26 ook een goed artikel over Custom DataSet components geschreven (voor Delphi 3 welliswaar, maar het waren eveneens goede artikelen).
    Why is it that every time I think I'm holding all the cards, it turns out we're playing chess?
    Download Re-Depend, onmisbaar als je met packages build

  5. #5
    Een vraagje over de TBigIniFileDataset. Hoe ga je met NULL waardes en lege string '' eigenlijk om in de TBigIniFileDataset?

    Voor de rest op en toppie artikel. Tis wel voor een gevorderde delphi'er

  6. #6
    Geweldige reacties (en tot nu toe ook een geweldige rating )
    Even wat reacties van mijn kant:
    @Walter:
    - Wat is 'miemelen'?
    - Klopt. In het geval van de NLDFileSearch was het een beetje een fout/slordigheid. In dit geval heb ik weloverwogen de keuze gemaakt om de functie een result terug te laten geven, namelijk of de fielddef geldig is of niet. Bij nader inzien heb ik er toch voor gekozen om dan maar een default type te gaan gebruiken, maar mocht ik op een later tijdstip willen besluiten om een wat strictere controle uit te gaan voeren, dan kan dat eenvoudig door de result waarde te checken. Ik ben er al vaker tegenaangelopen dat ik ineens een resultwaarde terug wou hebben van een procedure en dat het vrij veel moeite kostte om die alsnog een result terug te laten geven. Ik dek me dus liever alvast in en kan dan alsnog besluiten om bij de aanroep de resultwaarde te negeren.
    - Ik weet niet of ik er wel open source van ga maken. Het component is as-is is op dit moment al te downloaden op GolezTrol.nl (zie link onderaan artikel). Ik zit er ook over te denken om het artikel zelf te vertalen naar't engels en deze ook daar online te zetten. Het mooie van het open source stuk is dat er meerdere mensen aan kunnen werken, maar dat zie ik hier toch niet zo snel gebeuren. De source is zoals gezegd dus wel te downloaden zodat je het geheel niet bij elkaar hoeft te knippen/plakken.

    @Baldo:
    - Fijn om te horen dat je naar aanleiding van mijn artikel hier zelf ook weer verder mee gaat.
    Je geeft verder aan wat ik ook in de inleiding heb gezegd: De aversie tegen het gebruik van inifiles voor dit soort doeleinden. Het is ook niet voor niets, want ik werd zelf behoorlijk overrompeld door de performanceproblemen van TInifile. Tevens heb je -wanneer ook het editen om de hoek komt kijken- natuurlijk de nodige problemen wanneer je multi-user wilt gaan werken. Hoe synchroniseer je de data? Moet je met een Access-achtig ldb bestandje gaan werken? Het is niet zo dat deze dataset nou de uiteindelijke uitkomst is, maar het kan zeker een goede stap zijn in de migratie van een inifile-based systeem naar een erkende database opslag.

    @Link:
    Wanneer een waarde geheel ontbreekt in de inifile, dan geeft de GetFieldData functie False terug. Dit wordt door TDataSet weer vertaald naar NULL. Wanneer je dus Dataset.FieldByName('plop').Value opvraagt terwijl 'plop' niet aanwezig is in het huidige record, dan krijg je inderdaad NULL terug. Wanneer de waarde wel bestaat, dat wordt geprobeerd om de waarde uit te lezen. Wanneer de conversie naar het betreffende field data type niet slaagt, dan wordt een default waarde teruggegeven. (-1, False, 0.0 etc.) Eventueel zou dit uit te breiden of aan te passen zijn zodat in dit geval ook False wordt teruggegeven, zodat dit uiteindelijk een NULL-value oplevert.

    Op dit moment kan de dataset nog niet schrijven, maar als dat wel gaat gebeuren blijft het in principe hetzelfde. Een lege string wordt gewoon weggeschreven, maar bij een NULL value wordt het item expliciet niet geplaatst.
    1+1=b

  7. #7
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Had ik al gezegd hoe geweldig dit artikel me geholpen heeft?

    Aan de hand hiervan een DataSet gemaakt die met objecten / objectenlijstjes om kan gaan. Zodra het object wijzigt roep ik in de DataSet "DataEvent(deRecordChange, 0);" aan, waardoor data-aware controls weer netjes gaan updaten. Ook SetFieldData bleek geen lastige te zijn, lijkt heel erg op GetFieldData, waardoor wijzigen van objecten via de DataSet ook zeer netjes werkt (wel even GetCanModify natuurlijk True laten teruggeven )

    Wat ik wel heb veranderd ten opzichte van de BigIniDataSet is de SetRecNo, aan de hand van de TClientDataSet source:

    Code:
      CheckBrowseMode();
      if (Pred(Value) <> RecNo) and (Value > 0) and (Value <= FRecCount) then
      begin
        DoBeforeScroll();
        FRecNo := Pred(Value);
        Resync([rmCenter]);
        DoAfterScroll();
      end;
    Qui custodiet ipsos custodes

  8. #8
    Senior Member PsychoMark's Avatar
    Join Date
    Nov 2001
    Location
    Raamsdonksveer
    Posts
    10,269
    Nog een leuke; in GetFieldData moet je controleren of de Buffer parameter wel Assigned is. Als je namelijk Field.IsNull opvraagt (iets wat het DevExpress grid hier dus deed ) dan roept deze ook GetFieldData aan met een nil-buffer. Het idee is dat je dan enkel True of False teruggeeft (False als het veld niet bestaat, of inderdaad Null is) maar niets met de Buffer doet...
    Qui custodiet ipsos custodes

Thread Information

Users Browsing this Thread

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

Similar Threads

  1. Reacties op artikel 'Zelf een component bouwen'
    By Marcel in forum De website
    Replies: 13
    Last Post: 14-Dec-08, 20:26
  2. Replies: 27
    Last Post: 28-Sep-05, 13:34
  3. Reacties op artikel 'Rave artikel 1: De basis'
    By Marcel in forum De website
    Replies: 14
    Last Post: 26-Jul-05, 10:05
  4. Reacties op artikel 'Introductie tot SQL'
    By Marcel in forum De website
    Replies: 12
    Last Post: 29-Oct-03, 23:48
  5. Replies: 9
    Last Post: 25-Aug-03, 21:37

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
  •