View Issue Details

IDProjectCategoryView StatusLast Update
0020134FPCDatabasepublic2011-09-06 10:59
ReporterReinier OlislagersAssigned ToMichael Van Canneyt  
PrioritynormalSeverityminorReproducibilityN/A
Status closedResolutionfixed 
Platformx64OSWindows 
Product Version2.7.1 
Target Version2.6.0Fixed in Version3.0.0 
Summary0020134: [Patch] DBase export: Observe field name length limits for DBaseIV,VII,Foxpro
DescriptionIn packages\fcl-db\src\export\fpdbfexport.pp
These tablelevels/formats are defined:
  TTableFormat = (tfDBaseIII,tfDBaseIV,tfDBaseVII,tfFoxPro);

function TFPCustomDBFExport.BindFields: Boolean;
there is this part (line 136):
  If FormatSettings.AutoRenameFields and
(FormatSettings.TableFormat=tfDbaseIII) then
    CheckExportFieldNames;

only checks for DBaseIII and ignores field length limit for the other supported formats.

Attached is a patch that addresses this.
Additional InformationAs best as I could figure out: the following field size limits are present for
the various DBase formats:
3: DBase III: 10 characters
4: DBase IV: 10 characters
7: DBase VII: 32 characters
8: FoxPro: 10 characters

3,4: http://www.clicketyclick.dk/databases/xbase/format/dbf.html#DBF_STRUCT

7: IIRC, from http://www.dbase.com/KnowledgeBase/int/db7_file_fmt.htm
(forwarded by Wikipedia), but that page is down now

8:
http://www.dynamic.com/v7/what-are-limitations-foxpro-full-isam-file
http://www.foxite.com/archives/foxpro-field-names-0000066805.htm
Apparently Visual FoxPro 8 has 27 characters in a DBC (Database
container) file, but only 10 in a DBF file.
TagsNo tags attached.
Fixed in Revision18944
FPCOldBugId
FPCTarget
Attached Files

Activities

2011-09-02 14:16

 

dbfexport_fieldlengthfix.patch (1,958 bytes)   
diff --git a/packages/fcl-db/src/export/fpdbfexport.pp b/packages/fcl-db/src/export/fpdbfexport.pp
index 621087a..cac57cf 100644
--- a/packages/fcl-db/src/export/fpdbfexport.pp
+++ b/packages/fcl-db/src/export/fpdbfexport.pp
@@ -42,7 +42,7 @@ Type
     function GetSettings: TDBFExportFormatSettings;
     procedure SetSettings(const AValue: TDBFExportFormatSettings);
   Protected
-    Procedure CheckExportFieldNames; virtual;
+    Procedure CheckExportFieldNames(const MaxFieldNameLength: integer); virtual;
     Function BindFields : Boolean; override;
     Function CreateFormatSettings : TCustomExportFormatSettings; override;
 
@@ -97,7 +97,7 @@ begin
   Inherited FormatSettings.Assign(AValue);
 end;
 
-procedure TFPCustomDBFExport.CheckExportFieldNames;
+procedure TFPCustomDBFExport.CheckExportFieldNames(const MaxFieldNameLength: integer);
 
 Var
   I,J : Integer;
@@ -108,10 +108,10 @@ begin
   For I:=0 to ExportFields.Count-1 do
     begin
     EF:=ExportFields[i];
-    If (Length(EF.ExportedName)>10) then
+    If (Length(EF.ExportedName)>MaxFieldNameLength) then
       begin
-      FN:=Copy(EF.ExportedName,1,10);
-      If ExportFIelds.IndexOfExportedName(FN)<>-1 then
+      FN:=Copy(EF.ExportedName,1,MaxFieldNameLength);
+      If ExportFields.IndexOfExportedName(FN)<>-1 then
         begin
         J:=1;
         Repeat
@@ -133,8 +133,12 @@ Var
   I : Integer;
   
 begin
-  If FormatSettings.AutoRenameFields and (FormatSettings.TableFormat=tfDbaseIII) then
-    CheckExportFieldNames;
+  // DBase III,IV, and FoxPro have a 10 character field length limit.
+  If FormatSettings.AutoRenameFields and (FormatSettings.TableFormat in [tfDbaseIII,tfDbaseIV,tfFoxPro]) then
+    CheckExportFieldNames(10);
+  // DBase VII has a 32 character field length limit.
+  If FormatSettings.AutoRenameFields and (FormatSettings.TableFormat=tfDbaseVII) then
+    CheckExportFieldNames(32);
   Result:=Inherited;
   try
     with FDBF.FieldDefs do
dbfexport_fieldlengthfix.patch (1,958 bytes)   

Michael Van Canneyt

2011-09-02 15:07

administrator   ~0051386

Applied the patch. Thank you very much.

Reinier Olislagers

2011-09-06 08:42

developer   ~0051499

Thanks for applying the patch. While I think the patch is valid, it doesn't address the entire issue.
See 20163 for dbfexport test that shows this error when exporting a field with a large name.
I'll raise another issue & patch when I find the solution.

Issue History

Date Modified Username Field Change
2011-09-02 14:16 Reinier Olislagers New Issue
2011-09-02 14:16 Reinier Olislagers Status new => assigned
2011-09-02 14:16 Reinier Olislagers Assigned To => Joost van der Sluis
2011-09-02 14:16 Reinier Olislagers File Added: dbfexport_fieldlengthfix.patch
2011-09-02 15:03 Michael Van Canneyt Assigned To Joost van der Sluis => Michael Van Canneyt
2011-09-02 15:07 Michael Van Canneyt Fixed in Revision => 18944
2011-09-02 15:07 Michael Van Canneyt Status assigned => resolved
2011-09-02 15:07 Michael Van Canneyt Fixed in Version => 2.7.1
2011-09-02 15:07 Michael Van Canneyt Resolution open => fixed
2011-09-02 15:07 Michael Van Canneyt Note Added: 0051386
2011-09-02 15:07 Michael Van Canneyt Target Version => 2.6.0
2011-09-06 08:42 Reinier Olislagers Status resolved => closed
2011-09-06 08:42 Reinier Olislagers Note Added: 0051499