home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / BASIC / QBDBAS / TEST.DBT (.txt) < prev    next >
dBase/FoxBase/XBase Database File  |  1991-10-21  |  16KB  |  373 lines

  1. Dit is een memo.
  2. Een memo wordt opgeslagen in een afzonderlijk bestand. Dat 
  3. bestand heeft dezelfde naam als de database file, echter met de 
  4. extensie .DBT Een memo bevat maximaal 4000 tekens en wordt in de 
  5. .DBT file opgeslagen in blokken van 512 bytes. In de database 
  6. .DBF file staat in het memo-veld een pointer naar het 
  7. bijbehorende blok in het memo-bestand...
  8. Jan Jansen is een wereldberoemde wielrenner. In zijn vrije tijd 
  9. programmeert hij graag in QuickBasic. 
  10. Natuurlijk gebruikt hij TurboFlow! daarbij voor meer inzicht en 
  11. overzicht!
  12. Hij is gespecialiseerd in grafische toepassingen en heeft 
  13. programma's geschreven waarmee de Tour de France op scherm te 
  14. volgen is. 
  15. bijbehorende blok in het memo-bestand...
  16. Brainstorm is een BBS dat gespecialiseerd is in gereedschap voor 
  17. programmeurs. Naast een algemeen Quick Basic gebied, waarin 
  18. uitstekende Libraries voor zeer veel toepassingen zijn opgenomen, 
  19. verzorgen BLOKKER+BLOKKER een eigen "area" waarin Quick Basic 
  20. programma's in BRONCODE zijn opgenomen. Profiteer hiervan !
  21. Het BBS is geopend van 0.00 uur 's nachts tot 12.00 uur 's 
  22. middags.
  23. Bill Gates is dol op Quick Basic, dat is bekend. De volgende 
  24. anecdote doet de ronde:
  25. Als programmeurs bij hem komen met het zoveelste verzoek om 
  26. uitstel van de oplevering van een groot programma in C of 
  27. Assembler dan dreigt hij met:
  28.  "Als jullie het niet kunnen, dan doe ik het zelf wel even in het 
  29.  week-end, met BASIC !"
  30. eopend van 0.00 uur 's nachts tot 12.00 uur 's 
  31. middags.
  32. Dit is een memo.
  33. Zoals u aan de omvang van het TEST.TBT bestand kunt zien, springt 
  34. dBaseIII niet bepaald zuinig met uw kostbare diskruimte om!
  35. uitstel van de oplevering van een groot programma in C of 
  36. Assembler dan dreigt hij met:
  37.  "Als jullie het niet kunnen, dan doe ik het zelf wel even in het 
  38.  week-end, met BASIC !"
  39. eopend van 0.00 uur 's nachts tot 12.00 uur 's 
  40. middags.
  41. Dit is een memo dat hoort bij een record, dat later ge-delete 
  42. werd.
  43. n, springt 
  44. dBaseIII niet bepaald zuinig met uw kostbare diskruimte om!
  45. uitstel van de oplevering van een groot programma in C of 
  46. Assembler dan dreigt hij met:
  47.  "Als jullie het niet kunnen, dan doe ik het zelf wel even in het 
  48.  week-end, met BASIC !"
  49. eopend van 0.00 uur 's nachts tot 12.00 uur 's 
  50. middags.
  51.  DEMONSTRATIE PROGRAMMA QBDBASE.BAS versie 1.1
  52.  LEES en bewerk dBaseIII en dBaseIV BESTANDEN met QuickBasic 4.5
  53.  ---------------------------------------------------------------- 
  54.  -------
  55.  Start QuickBasic met: QB QBDBASE /AH /G /LQB.QLB
  56.                   ===============
  57.  ---------------------------------------------------------------- 
  58.  -------
  59.  Doel:    Het lezen van dBase III en IV data- en memofiles.
  60.  Werking: Dit voorbeeld programma toont eerst de header structuur
  61.       en daarna de records van een dBase file op het scherm.
  62.       
  63.       Als in de lay-out van een record ook een "memo" veld is
  64.       opgenomen, dan wordt ook de inhoud van het memo       
  65.       getoond.
  66.       De memo velden zijn opgeslagen in een bestand met       
  67.       dezelfde naam
  68.       als het database bestand, echter met de extensie .DBT
  69.       
  70.       Deze routines kunnen worden gebruikt om de records van       
  71.       een dBase
  72.       bestand in uw eigen database programma binnen te halen       
  73.       en verder 
  74.       te bewerken.
  75.       
  76.      ->   Het rechtstreeks wijzigen van een dBase bestand is      
  77.      natuurlijk
  78.      ->   ook mogelijk; pas echter op met het veranderen van de      
  79.      sleutel-
  80.      ->   velden van een dBase bestand. Eventueel reeds aanwezige      
  81.      indexen
  82.      ->   kunnen daardoor corrupt worden.
  83.  De structuur van een dBase bestand.
  84.  --------------------------------------
  85.  Het databestand.
  86.  ----------------
  87.  Het eerste gedeelte van een dBase bestand wordt de "header"  
  88.  genoemd.
  89.  Dit gedeelte bevat onder andere informatie over het dBase versie  
  90.  nummer,
  91.  de lengte van het headergedeelte en beschrijvingen van de  
  92.  velden. Het is
  93.  verdeeld in blokken van 32 bytes.
  94.  HEADER LAY-OUT.
  95.  ---------------
  96.  Het eerste blok van 32 bytes bevat de volgende informatie:
  97.    Versienummer             -  1 byte
  98.    Laatste datum bijgewerkt -  3 bytes (jaaar/maand/dag)
  99.    Aantal records           -  4 bytes (LONG INTEGER)
  100.    Lengte van de header     -  2 bytes (INTEGER)
  101.    RecordLengte             -  2 bytes (INTEGER)
  102.    Rest                     - 20 bytes
  103.                  ---------
  104.              TOTAAL : 32 bytes
  105.  Versienummer.
  106.  -------------
  107.  De eerste byte geeft aan met welke versie van dBase het bestand  
  108.  aangemaakt en of er wel of geen memovelden aanwezig zijn.
  109.  Hex  Decimaal  Betekenins.
  110.  ---  --------  -------------------------------------------
  111.  &H3      3     dBase III bestand zonder memo velden.
  112.  &H83   131     dBase III bestand met memovelden.
  113.  &H63    99     dBase IV  bestand zonder memovelden.
  114.  &H8B   139     dBase IV  bestand met memo velden.
  115.  N.B. Als deze byte aangeeft dat er memovelden zijn, dan dient er  
  116.       een .DBT bestand aanwezig te zijn, waarin die memo's zijn       
  117.       opgeslagen.
  118.       Neem echter niet zo maar aan, dat dit .DBT bestand aanwezig       
  119.       is,
  120.       voer eerst een kontrole uit met de funktie       
  121.       "BestandAanwezig".
  122.  Laatste datum bijgewerkt.
  123.  -------------------------
  124.  De datum waarop de database het laatste is bijgewerkt staat in 3  
  125.  bytes.
  126.  De Ascii waarden staan in de volgorde jaar/maand/dag.
  127.  Aantal records.
  128.  ---------------
  129.  Het totale aantal records is opgeslagen als LONG INTEGER.
  130.  Lengte van de header.
  131.  ---------------------
  132.  Omdat een database meer of minder velden kan bevatten, is de  
  133.  lengte van
  134.  de header variabel. Deze lengte is opgeslagen als INTEGER.
  135.  RecordLengte.
  136.  -------------
  137.  Alle records in een dBase bestand hebben een vaste lengte. De  
  138.  waarde
  139.  hiervan staat in de header als INTEGER.
  140.  Rest.
  141.  -----
  142.  De "rest" van 20 bytes wordt in dit programma niet gebruikt.
  143.  Dit eerste blok van 32 bytes wordt in het programma gedefineerd  
  144.  in een
  145.  TYPE record variabele met de naam dbHeader.
  146.  RECORD LAYOUT.
  147.  --------------
  148.  Elk volgende blok van 32 bytes bevat de veldbeschrijving van een  
  149.  record.
  150.    Veldnaam                 - 11 bytes
  151.    VeldType                 -  1 byte
  152.    DataAdres                -  4 bytes
  153.    VeldLengte               -  1 byte
  154.    Aantal decimalen         -  1 byte
  155.    Rest                     - 14 bytes
  156.                   --------
  157.              TOTAAL   32 bytes
  158.  Veldnaam.
  159.  ---------
  160.  De naam die de gebruiker aan een veld heeft gegeven. De naam  
  161.  wordt
  162.  afgesloten met CHR$(0). Een veldnaam mag alleen letters, cijfers  
  163.  of "_"
  164.  bevatten.
  165.  Veldtype.
  166.  ---------
  167.  Deze byte kan de volgende inhoud hebben:
  168.    C - Character - alfa/numeriek - veld bevat uitsluitned tekst.
  169.    N - Numeric   - numeriek      - veld bevat een getal
  170.    D - Date      - datum         - veld bevat een datum JJJJMMDD
  171.    L - Logical   - logisch veld  - veld bevat T/F of Y/N; waar of    
  172.    niet waar.
  173.    M - Memo      - aantekeningen - Memo aanwezig in *.DBT    
  174.    bestand.
  175.  Data adres.
  176.  -----------
  177.  Dit veld bevat de veld offset in memory. Het veld wordt in dit
  178.  programma niet gebruikt.
  179.  Veld lengte.
  180.  ------------
  181.  De Ascii waarde is de lengte van het veld. Voor een Numeriek  
  182.  veld is
  183.  het de lengte, inclusief de decimale punt.
  184.  Aantal decimalen.
  185.  -----------------
  186.  De Ascii waarde is het aantal decimalen van een decimaal veld.
  187.  Rest.
  188.  -----
  189.  De "rest" van 14 bytes wordt in dit programma niet gebruikt.
  190.  AANTAL VELDEN.
  191.  --------------
  192.  Het aantal gedefinieerde velden is gelijk aan de lengte van de  
  193.  header
  194.  gedeeld door 32. De uitkomst moet met 1 worden verminderd, omdat  
  195.  eerste blok van 32 bytes de header omschrijving bevat.
  196.    AantalVelden% = (Header.HeaderLengte \ 32) - 1
  197.  WERKELIJKE RECORDLENGTE.
  198.  ------------------------
  199.  Als dit programma wordt gestart, dan verschijnt eerst een  
  200.  overzicht
  201.  met de gegevens uit de header en vervolgens de veld  
  202.  beschrijvingen.
  203.  Als u de lengten van elk veld bij elkaar optelt, dat zult u  
  204.  merken, dat
  205.  de som van de veldlengten steeds 1 byte minder is dan de  
  206.  recordlengte
  207.  die in de header informatie staat.
  208.  Die extra byte wordt steeds vooraan in elk record geplaatst en  
  209.  geeft aan
  210.  of een record geldig is of niet. Als de gebruiker een record  
  211.  heeft gedelete,
  212.  dan wordt in dat veld een "*" teken geplaatst.
  213.  DE RECORDS.
  214.  -----------
  215.  Na het header gedeelte met algemene- en veldinformatie worden de  
  216.  records
  217.  geplaatst. Daarbij is de volgende informatie van belang.
  218.    STATUS VELD   - De eerste positie van elk record geeft de    
  219.    status van het
  220.            record weer. Indien het veld gevuld is met een            
  221.            "*" dan
  222.            is het record ongeldig gemaakt.
  223.    TEKST VELD    - Een tekst wordt aangevuld met spaties tot het    
  224.    einde
  225.            van het veld.
  226.    NUMERIEK VELD - Een numeriek veld is een getal of een bedrag.    
  227.    In het
  228.            record wordt het precies zo weggeschreven als            
  229.            het
  230.            op het scherm wordt ingevoerd. Let op de            
  231.            deciamle punt.
  232.            Uit de header informatie kan worden afgeleid            
  233.            met hoeveel
  234.            decimalen moet worden gewerkt. Vertaal een            
  235.            veld met
  236.               N! = VAL(Veld$) of met N# = VAL(Veld$)
  237.            naar een singel of double precision numerieke            
  238.            variabele.
  239.            Als het aantal decimalen nul is, dan kan -            
  240.            afhankelijk
  241.            van de lengte van het veld - een omzetting            
  242.            naar een
  243.            integer of long integer plaatsvinden met :
  244.               N% = VAL(Veld$) of met N& = VAL(Veld$)
  245.    DATUM VELD    - Een datum veld is altijd 8 bytes lang. De    
  246.    datum wordt
  247.            op disk opgeslagen in het formaat JJJJMMDD.            
  248.            Dus 31 december
  249.            1991 wordt als 19911231 in het record            
  250.            geplaatst.
  251.    LOGISCH VELD  - Dit veld kan "Y" of "T" bevatten. in beide    
  252.    gevallen
  253.            is de betekenis "Ja", "Waar" of True. Het is            
  254.            een Boolean
  255.            waarde. Als er iets anders dan "T" of "Y" is            
  256.            vermeld,
  257.            dan is de betekenis "Nee", "Niet waar" cq            
  258.            "False".
  259.            Als u een INTEGER de waarde -1 = True of 0 =            
  260.            False wilt
  261.            geven, doe dat dan als volgt:
  262.            IF INSTR("YT",LogischVeld$) > 0 THEN
  263.              Betaald% = -1
  264.            ELSE
  265.              Betaald% = 0
  266.            END IF
  267.    MEMO VELD     - In het record zelf is de veldlengte van een    
  268.    memo altijd 
  269.            10 bytes. Als er bij een record ook            
  270.            daadwerkelijk 
  271.            aantekeningen in een memo zijn gemaakt, dan            
  272.            bevat dat veld 
  273.            een getal. Ook dit getal staat in een STRING            
  274.            formaat en kan 
  275.            met de funktie Pointer& = VAL(Veld$) naar een            
  276.            LONG INTEGER 
  277.            variabele worden overgezet. Dit getal wijst            
  278.            naar een blok 
  279.            tekst in een .DBT bestand, dat door dBase zelf            
  280.            wordt aangemaakt.
  281.  MEMO BESTAND
  282.  ------------
  283.  Als in de structuur van een record een Memo veld is  
  284.  gedefinieerd, dan wordt
  285.  de eerste keer, dat er daadwerkelijk een aantekening gemaakt  
  286.  wordt, een
  287.  nieuw bestand aangemaakt. Dat bestand krijgt dezelfde naam als  
  288.  het data-
  289.  base bestand, echter met de extensie .DBT.
  290.  In dat bestand worden de aantekeningen geplaatst IN BLOKKEN VAN  
  291.  512 BYTES.
  292.  De memo-pointer in het database record wijst naar het blok  
  293.  waarin een stuk
  294.  memotekst start. Daarbij wordt het eerste blok van 512 bytes  
  295.  door dBase
  296.  zelf gebruikt. Als een memo-pointer de waarde "1" bevat dan  
  297.  start de memo-
  298.  tekst op de 513e byte - dus het 2e blok - in het .DBT bestand.  
  299.  De memo-
  300.  pointer moet dus met 1 worden verhoogd om het juiste blok te  
  301.  berekenen.
  302.  De formule is dan ook : Startbyte = (MemoPointer * 512) + 1.
  303.  dBase III plaatst vanaf StartByte de memo tekst. Het einde van  
  304.  de tekst
  305.  wordt aangegeven met &H1A &H1A. De tekst kan dus eenvoudig in  
  306.  blokken
  307.  van 512 bytes worden binnen gehaald, waarbij er steeds op getest  
  308.  moet worden
  309.  of die twee "einde tekst" bytes 1A 1A in de string voorkomen.
  310.  Een memo-tekst in dBase III is maximaal 4000 bytes lang. Dat is  
  311.  tevens het
  312.  maximale aantal bytes dat met de dBase III tekstverwerker MODIFY  
  313.  COMMAND
  314.  kan worden bewerkt.
  315.  dBase IV behandelt de memo-teksten in het .DBT bestand op een  
  316.  andere manier.
  317.  De eerste 8 bytes van het startblok zijn gereserveerd. De bytes  
  318.  1 t/m 4
  319.  bevatten FF FF 00 08 hex. De volgende 4 bytes bevatten de lengte  
  320.  van de
  321.  memotekst als LONG INTEGER. De memotekst zelf start op de 9e  
  322.  byte.
  323.  Als uw programma heeft geconstateerd, dat er sprake is van een  
  324.  dBase IV
  325.  bestand, dan moet na het inlezen van het eerste blok tekst van  
  326.  512 bytes
  327.  dus gekontroleerd worden of de eerste twee bytes FF FF hex  
  328.  bevatten.
  329.  Is dat het geval, dan moeten byte 5 t/m 8 omgezet worden naar  
  330.  een LONG
  331.  INTEGER waarde, die de tekstlengte aangeeft. De tekst begint dan  
  332.  vanaf
  333.  byte 9.
  334.  Maar helaas... daarmee zijn we er nog niet. dBase IV bewerkt  
  335.  zonder
  336.  problemen database bestanden, die met dBase III zijn aangemaakt.  
  337.  En ook
  338.  de bijbehorende .DBT memobestanden worden probleemloos  
  339.  behandeld. Maar
  340.  het kan zijn, dat een .DBT memobestand, dat onder dBase III is  
  341.  aangemaakt
  342.  nog niet door dBase IV is behandeld. Dan kan het voorkomen, dat  
  343.  het data-
  344.  base bestand wel al naar dBase IV formaat is omgezet, maar het  
  345.  erbij horende
  346.  .DBT memobestand nog het oude dBase III formaat heeft.
  347.  Om het nog erger te maken: Als met dBase IV een memobestand  
  348.  wordt bewerkt
  349.  dat onder dBase III is aangemaakt, dan zal dBase IV elk  
  350.  gewijzigde memo
  351.  in het nieuwe formaat met FFh FFh aan het begin ervan  
  352.  wegschrijven. Zo
  353.  kan het dus gebeuren, dat in een en hetzelfde .DBT bestand  
  354.  memo's voor-
  355.  komen met zowel het oude als het nieuwe formaat!
  356.  Dit probleem is simpel op te lossen. Tijdens het inlezen van het  
  357.  eerste
  358.  blok memotekst moet worden gekontroleerd of de eerste twee  
  359.  posities de
  360.  tekens FF FF hex bevatten. Is dat het geval, dan heeft ook de  
  361.  memo het
  362.  dBase IV formaat en de tekstlengte staat in byte 5 t/m 9. Zo  
  363.  niet, dan 
  364.  heeft de memo nog het oude formaat en start op byte 1. Er moet  
  365.  dan 
  366.  worden gezocht naar de opeenvolgende tekens 1A 1A hex om de  
  367.  lengte van 
  368.  de mometekst te kunnen bepalen.
  369.                 -o-o-o-o-o-
  370. eem is simpel op te lossen. Tijdens het inlezen van het  
  371.  eerste
  372.  blok memotekst moet worden gekontroleerd of de eerste twe
  373.