Message 1: As it appeared during VB3 beta: Btrieve Users: All you need to know about DDF files ------------------------------------ You will need this information to write a BASIC program to create the DDF files. Writing such a program is not very difficult since all the information you need to create the records for FILE.DDF and FIELD.DDF is already in the USER DEFINED TYPES you use in your existing BASIC programs. All DDF files are Btrieve files. VB3's new data access methods and control and MS ACCESS need only two files, namely, FILE.DDF and FIELD.DDF. A. FILE.DDF, Record Length : 97 ---------------------------- File Name: X$File (as it appears in the first entry of FILE.DDF) ÚFldÂÄ Field Name ÄÄÂÄTypeÄÄÂSize¿ ³ 1³Xf$ID ³Integer³ 2³ <- File ID Starting from 1 (Unique) ³ 2³Xf$Name ³String ³ 20³ <- FileName ³ 3³Xf$Location ³String ³ 64³ <- File Location ³ 4³Xf$Flags ³Integer³ 1³ <- Bit 4=1 for Dict files, 0 for User ³ 5³Xf$Reserved ³String ³ 10³ <- Reserved ÀÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÙ ÚKeyÂÄ Type ÄÂÄ Field ÄÄÂSizeÂÄ Order ÄÄ¿ ³ 0³Unique ³1 Xf$ID ³2 ³Ascending ³ ÃÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄ´ ³ 1³Unique ³2 Xf$Name ³20 ³Ascending ³ ÀÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÙ NOTES: 1. First three records of FILE.DDF are: Xf$ID Xf$Name Xf$Loacation Xf$Flags Xf$Reserved ----- -------- ------------ -------- ----------- 1 X$File file.ddf 16 BLANK 2 X$Field field.ddf 16 BLANK 3 X$Index index.ddf 16 BLANK In the BASIC or ACCESS program you write to create the DDF files for all your Btrieve Tables (files), start assigning Xf$ID from 4. 2. Xf$Name field is the value you assign to Data1.RecordSource property. e.g. 'baseball teams', 'Titles'. It is a descriptive name (NOT A DOS FILE NAME). Make sure to use a unique name for each entry you make for your Btrieve Table in FILE.DDF (starting from 4). VB3 uses these names to show you the DROP DOWN list when you click on the 'three dots' of the .RecordSource property of a Data Control. 3. Xf$Location is the complete drive id + path + file name of the btrieve file. Since Xf$Name is UNIQUE, VB3 can automatically use this field to locate the Btrieve Table (file) you are trying to access using Data Control or VB3 Data Access functions. B. FIELD.DDF, Length : 32 ---------------------- File Name: X$Field (as it appears in the second entry of FILE.DDF) ÚFldÂÄ Field Name ÄÄÂÄTypeÄÄÂSize¿ ³ 1³Xe$Id ³Integer³ 2³ <- Field ID starting from 1 (Unique) ³ 2³Xe$File ³Integer³ 2³ <- File ID (Xf$ID in FILE.DDF) ³ 3³Xe$Name ³String ³ 20³ <- Field Name (May have duplicates) ³ 4³Xe$DataType ³Integer³ 1³ <- Field Type (0-13). See below ³ 5³Xe$Offset ³Integer³ 2³ <- Field Offset starting from 0 ³ 6³Xe$Size ³Integer³ 2³ <- Field Size ³ 7³Xe$Dec ³Integer³ 1³ <- Field decimal places (for Decimal type) ³ 8³Xe$Flags ³Integer³ 2³ <- Reserved ÀÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÙ ÚKeyÂÄ Type ÄÄÄÂÄ Field ÄÂSizeÂÄ Order Ä¿ ³ 0³Unique ³1 Xe$Id ³ 2³Ascending³ ÃÄÄÄÅÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÄÄÄ´ ³ 1³Non-unique³2 Xe$File³ 2³Ascending³ ÃÄÄÄÅÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÄÄÄ´ ³ 2³Non-unique³3 Xe$Name³ 20³Ascending³ ÃÄÄÄÅÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÄÄÄ´ ³ 3³Unique ³2 Xe$File³ 2³Ascending³ ³ ³ ³3 Xe$Name³ 20³Ascending³ ÀÄÄÄÁÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÄÙ NOTES: 1. First 17 records of FIELD.DDF are: Xe$Id Xe$File Xe$Name Xe$DataType Xe$Offset Xe$Size Xe$Dec Xe$Flags ----- ------- ----------- ----------- --------- ------- ------ -------- 1 1 Xf$Id 1 0 2 0 0 2 1 Xf$Name 0 2 20 0 0 3 1 Xf$Loc 0 22 64 0 0 4 1 Xf$Flags 1 86 1 0 0 5 2 Xe$Id 1 0 2 0 0 6 2 Xe$File 1 2 2 0 0 7 2 Xe$Name 0 4 20 0 0 8 2 Xe$DataType 1 24 1 0 0 9 2 Xe$Offset 1 25 2 0 0 10 2 Xe$Size 1 27 2 0 0 11 2 Xe$Dec 1 29 1 0 0 12 2 Xe$Flags 1 30 2 0 0 13 3 Xi$File 1 0 2 0 0 14 3 Xi$Field 1 2 2 0 0 15 3 Xi$Number 1 4 2 0 0 16 3 Xi$Part 1 6 2 0 0 17 3 Xi$Flags 1 8 2 0 0 2. The Field name Xe$File is same as the Xf$ID field in FILE.DDF. This is used by VB3 automatically to locate the field names in your Btrieve file and fill the DROP DOWN list for the .DataField property of a bound control. 3. The data type of a field stored in Xe$DataType is one of the following integer values. Data Type Value Data Type Value --------- ----- --------- ----- * string 0 logical 7 * integer 1 numeric 8 * float 3 bfloat 9 date 4 lstring 10 time 4 zstring 11 decimal 5 note 12 money 6 lvar 13 * These are the only one I found useful in a BASIC program. float => SINGLE or DOUBLE date and time data types are stored as long integers by Btrieve. Formulas for conversion are: BtrTime& = HH& * 16777216 + MM& * 65536 + SS& * 256 BtrDate& = YY& * 65536 + MM& * 256 + DD& DateBtr$ = Format$(MM&, "00") + "/" + Format$(DD&, "00") _ + "/" + Format$(YY&, "0000") TimeBtr$ = Format$(HH&, "00") + ":" + Format$(MM&, "00") _ + ":" + Format$(SS&, "00") Long variables are used to avoid overflow. *************************************************************************** Message 2: As it appeared during VB3 beta: Here is a quick way to create DDF files w/o spending a single penny. Download the file DDF.ZIP from LIB 1. This file contains following files: 1. FILE.DDF 2. FIELD.DDF 3. FILES.DAT 4. FIELDS.DAT FILE.DDF has five records. 1st three, as you know by now, are for the dictionary files (FILE.DDF, FIELD.DDF and INDEX.DDF). Record 4 is for FILES.DAT. FILES.DAT is a minimal FILE.DDF i.e. with only three records (for the three dictionary files). Record 5 is for FIELDS.DAT. FIELDS.DAT is minimal FIELD.DDF i.e. with only 17 records (for the three dictionary files). Copy all these files into your VB3 subdirectory. Now comes the bootstrap process i.e. use DDF files and VB3 to create your DDF files. Use VISDATA.MAK project. Connect to Btrieve Data Base. Select FILE.DDF from VB3 subdir. You will see two tables (i) 'My Files' and (ii) 'My Fields'. Select Data Control Option and OPEN My Files Table. Start adding your own Btrieve Files Names and Location. Assign Xf$ID starting from 4. Once you are done with all your Btrieve Files, OPEN 'My Fields' Table and start adding the Fields of your Btrieve files that you just entered. You might want to open two windows and add files in 'My Files' Table and fields in 'My Fields' Tables at the same time. For 'My Files' table start Xe$ID from 18. Note: There are some bugs in the VISDATA.MAK. Ignore 'Record x of y' display inside the Data Control. It is not always right. Do not worry if you make mistakes. You can always delete a record and reenter with the same Xf$ID (or Xe$ID). When you are done rename FILE.DDF and FIELD.DDF to something else and FILES.DAT to FILE.DDF and FIELDS.DAT to FIELD.DDF and you are on your way to use VB3's data access methods and control with Btrieve. And remember you can always add new files (tables) and delete the one you don't need using the same process described above. I wish VB3 allowed a file name other than FILE.DDF in the .DataBaseName property. Even though manual says so VB3 ignores the file name you enter after the last "\" in this property and always opens file FILE.DDF. If this was true then renaming won't be necessary and adding and deleting tables will become a matter just of using VISDATA.MAK. It might seem to like a tedious task to enter all these fields but the rewards you will reap when you are done are astounding. VB3 Data Access is deceptively simple yet enormously powerful. *************************************************************************** Message 3: As it appeared during VB3 beta: Three ways of creating your DDF files are: 1. VISDATA.MAK project from VB3 2. write your own program with Data Controls in VB3 3. Use MS Access to create the DDF files using the FILE.DDF, FIELD.DDF, FILE.DAT and FILED.DAT files included in the DDF1.ZIP. **** WARNING **** WARNING **** YOU MUST COPY ALL FILES TO 'C:\VB3' SUBDIR BEFORE YOU CAN USE ANY ONE OF THE ABOVE THREE METHODS OF CREATING DDF FILES. I have included DB1.MDB database that is attached to Btrieve Tables File_DDF (i.e. FILE.DAT) and Field_DDF (i.e. FIELD.DAT) that can be used with MS Access. MS Access tables are easier to use than VISDATA.MAK program for data entry. As explained in my previous messages FILE.DDF and FIELD.DDF contain information about FILE.dat and FIELD.dat. You use one of the three methods listed above to populate FILE.dat and FIELD.dat further with the information about your Btrieve files and when done rename/copy them to FILE.DDF and FIELD.DDF that can be used with VB3 or MS Access to access your Btrieve files. Use DB1.MDB with ACCESS or use FILE.DDF with VISDATA.MAK. As stated before, MS Access is easier to use then VISDATA.MAK because it allows you to enter data in a grid like control (DataSheet). Don't you wish GRID control was Data aware with direct data entry into cells ? But I know why we don't get everything we ask for in VB. Eventually we will, but by that time VB will VB 7.0 (like PDS). All VB users would have upgraded VB 7 times. And then VB 7.0 will get replaced by something called 'Invisible Basic' and all of us here will start Beta testing this new 'Invisible Basic' asking for new features that we won't get and the whole cycle will start again. You and I will get old (out dated) and our kids (poor souls) will get in this viscous cycle of 'asking, not getting, getting eventually and then starting all over again'. What a life ! Sunil. P.S. Data aware Grid controls are now available from Sheridan Software and FarPoint. Both are VERY good. I have uploaded DDF1.ZIP file in this forum and asked the Sysop to make it public. I have also developed a VB module that uses WBTRCALL.DLL from Novell to access Btrieve files from VB/VBA. This approach does not require DDF files. Its is also somewhat faster than VB3's data access methods and controls. But as usual you need to declare user type for every Btrieve file you use. if you use VB3's data access you don't need any user types to access the fields in your Btrieve files. In fact it is not straight forward to copy record pointed by BookMark property to an user defined type record variable. If you need it let me know. I wish VB3 allowed something similar to Lset MyTypeVar = Data1.RecordSet.BookMark to copy the entire record. May be VB4 will.