DBase add new fields [SOLVED] lazarus / 16-Databases ---------------------------------------------------------------------- timcs · 2013-02-07 18:10 Hi I am trying to add a new field to a DBase database and all methods I have tried either do not error but not add the field or error and fail to add the new field I am trying to add a new integer field with a length of 10. This method errors: Code: [Select]dbf1.Active:=false;                dbf1.DbfFieldDefs.AddFieldDef.DisplayName:='idlink';                dbf1.DbfFieldDefs.AddFieldDef.Size:=10;                dbf1.DbfFieldDefs.AddFieldDef.FieldType:=ftInteger;                dbf1.RestructureTable(dbf1.DbfFieldDefs,true);                dbf1.open;                dbf1.active := true      this method does not error but does not add the field either Code: [Select]With DBF1 do     begin     With FieldDefs do       begin       Add('idlink',ftInteger,10);       end;     Exclusive:=false;     Open;     active := true;    end; ---------------------------------------------------------------------- timcs · 2013-02-09 15:36 I thought I was getting somewhere when I found this post : http://www.lazarus.freepascal.org/index.php/topic,8567.msg42023.html However when I compile the program using the TDbfFieldDefs I get : Quotedbff.pas(20,30) Error: Identifier not found "TDbfFieldDefs" So that stops the program from working ---------------------------------------------------------------------- BigChimp · 2013-02-09 15:56 OS, Lazarus version, small example project (project/publish project, zip, attach to post) would probably help ---------------------------------------------------------------------- BigChimp · 2013-02-09 16:00 Quote from: timcs on February 07, 2013, 07:10:10 pmThis method errors: Code: [Select]dbf1.Active:=false;                dbf1.DbfFieldDefs.AddFieldDef.DisplayName:='idlink';                dbf1.DbfFieldDefs.AddFieldDef.Size:=10;                dbf1.DbfFieldDefs.AddFieldDef.FieldType:=ftInteger; That code seems weird. How is the compiler supposed to know you're all referring to the same field you're adding, not to say 3 different fields? ---------------------------------------------------------------------- timcs · 2013-02-09 17:25 That code was really a stab in the dark any way OS:Windows XP/Vista Lazarus version : 10 Code from the DBF PDF I am trying to use is : Code: [Select]NewFieldDefs: TDbfFieldDefs; NewFieldDef: TDbfFieldDef; Dbf1: TDbf; ... // create new field list NewFieldDefs := TDbfFieldDefs. Create ( Self); // assign current list NewFieldDefs. Assign ( Dbf1. DbfFieldDefs); // assume first field is string , 20 wide , make larger to 40 NewFieldDefs. Items [0]. Size := 40; // rename second field to 'RENAMED ' NewFieldDefs. Items [1]. FieldName := 'RENAMED '; // add a float field NewFieldDef := NewFieldDefs. AddFieldDef; NewFieldDef. FieldName := 'NEW_FLOAT '; NewFieldDef. FieldType := ftFloat; NewFieldDef. Size := 10; NewFieldDef. Precision := 3; // restructure table and pack Dbf1. Restructure( NewFieldDefs , true); // restructure table and not pack // Dbf1. Restructure( NewFieldDefs , false ); // free mem NewFieldDefs. Free; ---------------------------------------------------------------------- howardpc · 2013-02-09 17:30 I don't think Restructure is method to use. The following snippet compiles and creates an indexed table for me: Code: [Select]... uses dbf, dbf_fields; { TForm1 } procedure TForm1.BCreateTblClick(Sender: TObject);   var dbDefs: TDbfFieldDefs;       dbTbl: TDbf;   begin     dbTbl:= TDbf.Create(nil);     try     dbTbl.OpenMode:= omAutoCreate;     dbTbl.Exclusive:= True;     dbTbl.TableName:= '\data\ExTbl.dbf';     dbDefs := TDbfFieldDefs.Create(nil);     try       dbDefs.Add('IDLINK',ftInteger,10);       dbDefs.Add('IDDESCR',ftString,15);       dbTbl.CreateTableEx(dbDefs);     finally       dbDefs.Free;     end;     dbTbl.Open;     dbTbl.AddIndex('DescrIdx', 'IDDESCR', [ixPrimary]);     dbTbl.IndexName:='DescrIdx';     dbTbl.Edit;     dbTbl.AppendRecord([10,'ten']);     dbTbl.AppendRecord([11,'eleven']);     dbTbl.AppendRecord([12,'twelve']);     // ... display records etc.     finally       dbTbl.Close;       dbTbl.Free;     end;   end; ---------------------------------------------------------------------- timcs · 2013-02-09 18:02 Howard Thanks for this I didn't know that dbf_fields was a separate unit to include. I will try again to create the new field and come back . If it has worked I will state this thread as SOLVED.