View Issue Details

IDProjectCategoryView StatusLast Update
0036304FPCPackagespublic2019-11-25 14:30
ReporterZdravko GabrovskiAssigned ToMichael Van Canneyt 
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
PlatformallOSallOS Versionall
Product Version3.3.1Product Buildtrunk 
Target VersionFixed in Version3.3.1 
Summary0036304: Bugfix of TFixedLengthExporter component
DescriptionIt seems, that TFixedLengthExporter component had never been designed to work properly with UTF-8 international character set text.
I found also, that the component has no functionality to export a dataset field names.
Another bug that I catch was, that it does a wrong left alignment on floating point fields, instead of expected right alignment.
And finally, when the property "DateFormat" and "DateTimeFormat" in Format settings are assigned, it displays NULL value fields as wrongly formatted zero date (31.12.1899) instead of empty field.

So the fixes are:

Creating a new TCustomFixedLengthExporter.InternalExportField(EF: TExportFieldItem;ExportCaption:Boolean); - to work with UTF8 functions, instead of wrong non-utf8 (Copy to Utf8copy, Delete To utf8delete, Length to UTF8Legth).
The new procedure was copied from TCustomFixedLengthExporter.ExportField, because I decide to re-use the same for display of DataHeader row.
Flag ExportCaption:Boolean will indicate if the procedure will return a data row (when it is called from TCustomFixedLengthExporter.ExportField or Header row, if it is called from DoDataHeader).

Here is the code of the new procedure:

procedure TCustomFixedLengthExporter.InternalExportField(EF: TExportFieldItem;ExportCaption : Boolean );

Var
  S,SS : String;
  W,L : Integer;
  FL : TFixedLengthExportFieldItem;

begin
  if ExportCaption then
    S := Ef.ExportedName
  else
    S:=FormatField(EF.Field);
  If EF is TFixedLengthExportFieldItem then
    begin
    FL:=TFixedLengthExportFieldItem(EF);
    W:=FL.Width;
    end
  else
    W:=UTF8Length(S);
  L:=UTF8Length(S);
  If L>W then
    begin
    If (FL.AlignField=afLeft) then
      S:=UTF8Copy(S,1,W)
    else
      UTF8Delete(S,1,L-W);
    end
  else if (L<W) then
    begin
    SS:=StringOfChar(' ',W-L);
    If FL.AlignField=afRight then
      S:=SS+S
    else
      S:=S+SS;
    end;
  if FCurrentRow <> '' then
    S := ' ' + S;
  FCurrentRow:=FCurrentRow+S;
end;

Other changes in fpdbexport.pp:

- Add a new constant FloatFieldTypes = [ftFloat, ftCurrency, ftFMTBcd, ftBCD];
this will be used into TFixedLengthExporter to fix a problem with wrong field alignment into procedure
procedure TCustomFixedLengthExporter.BuildDefaultFieldMap(AMap: TExportFields);
The change is:
If (F.DataType in IntFieldTypes) or ( F.DataType in FloatFieldTypes) then
      Fl.AlignField:=afRight;
- Fix the procedure for field formatting to avoid a problem with wrong date and timestamp fields formatting.
 If (FormatSettings.DateFormat<>'') and ( not F.IsNull ) then <-----------------------------------------
      Result:=FormatDateTime(FormatSettings.DateFormat,F.AsDateTime)
    else if FormatSettings.UseDisplayText then
      Result:=F.DisplayText
    else
      Result:=F.AsUTF8String;
    end
  else if (F.DataType=ftTime) then
    begin
    If (FormatSettings.TimeFormat<>'') and ( not F.IsNull ) then <-----------------------------------------
      Result:=FormatDateTime(FormatSettings.TimeFormat,F.AsDateTime)
    else if FormatSettings.UseDisplayText then
      Result:=F.DisplayText
    else
      Result:=F.AsUTF8String;
    end
  else if (F.DataType in [ftDateTime,ftTimeStamp]) then
    begin
    If (FormatSettings.DateTimeFormat<>'') and ( not F.IsNull ) then <-----------------------------------------
      Result:=FormatDateTime(FormatSettings.DateTimeFormat,F.AsDateTime)
Now it seems to work OK. Please, find attached files.









Steps To ReproduceAs described.
TagsNo tags attached.
Fixed in Revision46743558.
FPCOldBugId
FPCTarget3.2.0
Attached Files
  • fpdbexport.pp (30,256 bytes)
    unit fpDBExport;
    
    {$mode objfpc}{$H+}
    
    interface
    
    uses
      Classes, SysUtils, DB;
      
    Type
      TCustomDatasetExporter = Class;
    
      // Quote string fields if value contains a space or delimiter char.
      TQuoteString = (qsAlways,qsSpace,qsDelimiter);
      TQuoteStrings = Set of TQuoteString;
    
      TAlignField = (afLeft,afRight);
    
      { TExportFieldItem }
    
      TExportFieldItem = Class(TCollectionItem)
      private
        FEnabled: Boolean;
        FField: TField;
        FFieldName: String;
        FExportedName: String;
        function GetExportedName: String;
        function GetExporter: TCustomDatasetExporter;
        procedure SetExportedName(const AValue: String);
      Protected
        Procedure BindField (ADataset : TDataset); virtual;
        procedure SetFieldName(const AValue: String); virtual;
      Public
        Constructor Create(ACollection : TCollection); override;
        Procedure Assign(Source : TPersistent); override;
        Property Field : TField Read FField;
        Property Exporter : TCustomDatasetExporter Read GetExporter;
      Published
        Property Enabled : Boolean Read FEnabled Write FEnabled default True;
        Property FieldName : String Read FFieldName Write SetFieldName;
        Property ExportedName : String Read GetExportedName Write SetExportedName;
      end;
      
      { TExportFields }
    
      TExportFields = Class(TCollection)
      private
        FExporter : TCustomDatasetExporter;
        function GetFieldItem(Index : Integer): TExportFieldItem;
        procedure SetFieldItem(Index : Integer; const AValue: TExportFieldItem);
      Public
        Function IndexOfField(Const AFieldName : String) : Integer;
        Function IndexOfExportedName(Const AFieldName : String) : Integer;
        Function FindExportField(Const AFieldName : String) : TExportFieldItem;
        Function FindExportName(Const AFieldName : String) : TExportFieldItem;
        Function AddField(Const AFieldName : String) : TExportFieldItem; virtual;
        Property Fields[Index : Integer] : TExportFieldItem Read GetFieldItem Write SetFieldItem; Default;
        Property Exporter : TCustomDatasetExporter Read FExporter;
      end;
    
    
      { TCustomExportFormatSettings }
    
      TCustomExportFormatSettings = Class(TPersistent)
      private
        FBooleanFalse : String;
        FBooleanTrue : String;
        FCurrencyDigits: Integer;
        FCurrencySymbol : String;
        FDateFormat : String;
        FIntegerFormat: String;
        FTimeFormat : String;
        FDateTimeFormat : String;
        FDecimalSeparator: Char;
        FUseDisplayText : Boolean;
      Protected
        Procedure InitSettings; virtual;
        Property UseDisplayText : Boolean Read FUseDisplayText Write FUseDisplayText;
        Property IntegerFormat : String Read FIntegerFormat Write FIntegerFormat;
        Property DecimalSeparator : Char Read FDecimalSeparator Write FDecimalSeparator;
        Property CurrencySymbol : String Read FCurrencySymbol Write FCurrencySymbol;
        Property CurrencyDigits : Integer Read FCurrencyDigits Write FCurrencyDigits;
        Property BooleanTrue : String Read FBooleanTrue Write FBooleanTrue;
        Property BooleanFalse : String Read FBooleanFalse Write FBooleanFalse;
        Property DateFormat : String Read FDateFormat Write FDateFormat;
        Property TimeFormat : String Read FTimeFormat Write FTimeFormat;
        Property DateTimeFormat : String Read FDateTimeFormat Write FDateTimeFormat;
      Public
        Constructor Create(DoInitSettings : Boolean); virtual;
        Procedure Assign(Source : TPersistent); override;
      end;
      TCustomExportFormatSettingsClass = Class of TCustomExportFormatSettings;
      
      { TExportFormatSettings }
      TExportFormatSettings = Class(TCustomExportFormatSettings)
      Published
        Property IntegerFormat;
        Property DecimalSeparator;
        Property CurrencySymbol;
        Property CurrencyDigits;
        Property BooleanTrue;
        Property BooleanFalse ;
        Property DateFormat;
        Property TimeFormat;
        Property DateTimeFormat;
      end;
    
      TOnExportRowEvent = Procedure(Sender : TObject; Var AllowExport : Boolean) of object;
      TExportProgressEvent = Procedure(Sender : TObject; Const ItemNo : Integer) of object;
      { TCustomDatasetExporter }
    
      TCustomDatasetExporter = Class(TComponent)
      private
        FAfterExecute: TNotifyEvent;
        FBeforeExecute: TNotifyEvent;
        FCanceled: Boolean;
        FDataset: TDataset;
        FFormatSettings: TCustomExportFormatSettings;
        FExportFields: TExportFields;
        FFromCurrent: Boolean;
        FOnExportRow: TOnExportRowEvent;
        FonProgress: TExportProgressEvent;
        FRestorePosition: Boolean;
        procedure SetDataset(const AValue: TDataset);
        procedure SetExportFields(const AValue: TExportFields);
        procedure SetFormatSettings(const AValue: TCustomExportFormatSettings);
      Protected
        // Override this if you need a descendent of TExportFormatSettings
        Function CreateFormatSettings : TCustomExportFormatSettings; virtual;
        // Checks if Dataset is assigned and whether it is in browse mode.
        Procedure CheckDataset(InBrowse : Boolean);
        // Allocate TField in TExportFieldItem
        Function BindFields : Boolean; virtual;
        // Nil out fields.
        Procedure UnbindFields;
        // Override if a descendent of TExportFieldItem is needed.
        Function CreateExportFields : TExportFields; Virtual;
        // Executes BeforeExecute event. Override (but call inherited)
        Procedure DoBeforeExecute; virtual;
        // Executes AfterExecute event. Override (but call inherited)
        // Note this is also executed in case of an exception !!
        Procedure DoAfterExecute; virtual;
        // Returns True if current row should be exported
        Function DoDataRow : Boolean; virtual;
        // Override to write data prior to data start.
        Procedure DoDataHeader; virtual;
        // Override to write data after data start.
        Procedure DoDataFooter; virtual;
        // Override to write something at row start.
        Procedure DoDataRowStart; virtual;
        // Override if a simple loop is not enough.
        Procedure ExportDataRow; virtual;
        // Override to write something at row end.
        Procedure DoDataRowEnd; virtual;
        // Called after row was exported
        Procedure DoProgress(ItemNo : Integer); Virtual;
        // Override if each field can be written as-is.
        Procedure ExportField(EF : TExportFieldItem); virtual;
        // Format field as UTF8 string, according to settings
        Function FormatField(F : TField) : UTF8String; virtual;
        // Raise EDataExporter error
        Procedure ExportError(Msg : String); overload;
        Procedure ExportError(Fmt : String; Args: Array of const); overload;
      Public
        Constructor Create(AOwner : TComponent); override;
        Destructor Destroy; override;
        // Build default fieldmap - adds all fields.
        Procedure BuildDefaultFieldMap(AMap : TExportFields); virtual;
        // Do export. Returns the number of records exported.
        Function Execute : Integer; virtual;
        // Call this to cancel the export
        Procedure Cancel;
        // Show the default configuration dialog, if one was assigned.
        // Returns false if the dialog was cancelled.
        Function ShowConfigDialog : Boolean;
        // Don't use. Needed for nil of dataset.
        Procedure Notification(AComponent: TComponent; Operation : TOperation); override;
        // True if export was canceled (using Cancel);
        Property Canceled : Boolean Read FCanceled;
      Public
        // Properties
        Property Dataset : TDataset Read FDataset Write SetDataset;
        Property ExportFields : TExportFields Read FExportFields Write SetExportFields;
        Property FromCurrent : Boolean Read FFromCurrent Write FFromCurrent Default True;
        Property RestorePosition : Boolean Read FRestorePosition Write FRestorePosition;
        Property FormatSettings : TCustomExportFormatSettings Read FFormatSettings Write SetFormatSettings;
        // Events
        Property AfterExecute : TNotifyEvent Read FAfterExecute Write FAfterExecute;
        Property BeforeExecute : TNotifyEvent Read FBeforeExecute Write FBeforeExecute;
        Property OnExportRow : TOnExportRowEvent Read FOnExportRow Write FOnExportRow;
        Property OnProgress : TExportProgressEvent Read FonProgress Write FOnProgress;
      end;
      
      TCustomDatasetExporterClass = Class of TCustomDatasetExporter;
    
      { TStreamExporter }
    
      TStreamExporter = Class(TCustomDatasetExporter)
      Private
        FStream: TStream;
      Protected
        Property Stream : TStream Read FStream;
        // Frees the stream.
        Procedure CloseStream;
      Public
        Procedure ExportToStream(AStream : TStream);
      end;
      
      { TCustomFileExporter }
    
      TCustomFileExporter = Class(TStreamExporter)
      private
        FFileName: String;
        FTextFile: Text;
        FTextFileOpen: Boolean;
        FopenedStream : Boolean;
      protected
        // Creates a file stream
        procedure OpenStream; virtual;
        // Override if some checking needs to be done on valid names
        procedure SetFileName(const AValue: String); virtual;
        // Override if some checking needs to be done prior to opening.
        Procedure CheckFileName; virtual;
        // Use to open textfile. Creates a file stream.
        Procedure OpenTextFile;
        // Use to close textfile.
        Procedure CloseTextFile;
        // Access to stream/file
        Property TextFile : Text Read FTextFile;
        Property TextFileOpen : Boolean Read FTextFileOpen;
      Public
        Destructor Destroy; override;
        // Publish in descendents.
        Property FileName : String Read FFileName Write SetFileName;
      end;
      
    
    
    
    
      EDataExporter = Class(Exception);
      
      { TExportFormatItem }
    
      TExportConfigureEvent = Function (Exporter : TCustomDatasetExporter) : Boolean of object;
    
      TExportFormatItem = Class(TCollectionItem)
      private
        FClass: TCustomDatasetExporterClass;
        FDescription: String;
        FExtensions: String;
        FName: String;
        FOnConfigure: TExportConfigureEvent;
        procedure SetName(const AValue: String);
      Public
        Property ExportClass : TCustomDatasetExporterClass Read FClass Write FClass;
      Published
        Property Name : String Read FName Write SetName;
        Property Description : String Read FDescription Write FDescription;
        Property Extensions : String Read FExtensions Write FExtensions;
        Property OnConfigureDialog : TExportConfigureEvent Read FOnConfigure Write FOnConfigure;
      end;
      
      TExportFormats = Class(TCollection)
      private
        function GetFormat(Index : Integer): TExportFormatItem;
        procedure SetFormat(Index : Integer; const AValue: TExportFormatItem);
      Public
        // Registration/Unregistration
        Function RegisterExportFormat(Const AName,ADescription,AExtensions : String; AClass : TCustomDatasetExporterClass) : TExportFormatItem;
        Procedure UnRegisterExportFormat(AClass : TCustomDatasetExporterClass);
        Procedure UnRegisterExportFormat(Const AName : String);
        // Searching
        Function IndexOfFormat(Const AName : String): Integer;
        Function IndexOfExportClass(AClass : TCustomDataSetExporterClass): Integer;
        Function FindFormat(Const AName : String) : TExportFormatItem;
        Function FindFormatByClass(AClass : TCustomDataSetExporterClass) : TExportFormatItem;
        // Shows configuration dialog, if one was configured for this class
        Function ConfigureExport(AnExport : TCustomDatasetExporter) : Boolean;
        Function FormatByName(Const AName : String) : TExportFormatItem;
        // Utilityfunctions
        Function ConstructFilter(AnExport : TCustomDatasetExporter) : String;
        Property Formats[Index : Integer] : TExportFormatItem Read GetFormat Write SetFormat; default;
      end;
      
    Function ExportFormats : TExportFormats;
    
    // Easy access functions
    
    Function RegisterExportFormat(Const AName,ADescription,AExtensions : String; AClass : TCustomDatasetExporterClass) : TExportFormatItem;
    Procedure UnRegisterExportFormat(AClass : TCustomDatasetExporterClass);
    Procedure UnRegisterExportFormat(Const AName : String);
    
    
    Const
      StringFieldTypes = [ftString,ftFixedChar,ftWidestring,ftFixedWideChar];
      IntFieldTypes    = [ftInteger,ftWord,ftSmallint,ftAutoinc];
      OrdFieldTypes    = IntFieldTypes +[ftBoolean,ftLargeInt];
      DateFieldTypes   = [ftDate,ftTime,ftDateTime,ftTimeStamp];
      MemoFieldTypes   = [ftMemo,ftFmtMemo,ftWideMemo];
      BlobFieldTypes   = [ftBlob,ftDBaseOLE,ftGraphic,ftOraBlob,ftOraClob,ftParadoxOLE];
      FloatFieldTypes  = [ftFloat, ftCurrency, ftFMTBcd, ftBCD];
    
    implementation
    
    uses streamio;
    
    ResourceString
      SErrNoDataset           = 'Dataset not assigned';
      SErrNoBrowse            = 'Dataset not in browse mode';
      SErrNoFileName          = 'No filename set for export';
      SErrFormatExists        = 'An export format with name "%s" already exists.';
      SUnknownExportFormat    = 'Unknown export format "%s"';
      SExportFilter           = '%s files';
      SAllFilesFilter         = 'All files';
      SErrDuplicateExportName = 'Exported fieldname "%s" already exists';
    
    { TExportFieldItem }
    
    procedure TExportFieldItem.SetFieldName(const AValue: String);
    begin
      if (FFieldName<>AValue) then
        begin
        FField:=Nil;
        FFieldName:=AValue;
        end;
    end;
    
    constructor TExportFieldItem.Create(ACollection: TCollection);
    begin
      inherited Create(ACollection);
      FEnabled:=True;
    end;
    
    function TExportFieldItem.GetExportedName: String;
    begin
      Result:=FExportedName;
      If (Result='') then
        Result:=FFieldName;
    end;
    
    function TExportFieldItem.GetExporter: TCustomDatasetExporter;
    begin
      If Collection is TExportFields then
        Result:=(Collection as TExportFields).Exporter;
    end;
    
    procedure TExportFieldItem.SetExportedName(const AValue: String);
    
    Var
      I : TExportFieldItem;
      
    begin
      If (FExportedName<>AValue) then
        begin
        If (AValue<>'') then
          begin
          I:=(Collection as TExportFields).FindExportName(AValue);
          If (I<>Nil) and (I<>Self) then
            Raise EDataExporter.CreateFmt(SErrDuplicateExportName,[AValue]);
          end;
        FExportedName:=AValue;
        end;
    end;
    
    procedure TExportFieldItem.BindField(ADataset: TDataset);
    begin
      FField:=ADataSet.FieldByName(FieldName);
    end;
    
    procedure TExportFieldItem.Assign(Source: TPersistent);
    
    Var
      EF : TExportFieldItem;
    
    begin
      if (Source is TExportFieldItem) then
        begin
        EF:=Source as TExportFieldItem;
        FieldName:=EF.FieldName;
        Enabled:=EF.Enabled;
        FExportedName:=EF.FExportedName;
        end
      else
        Inherited;
    end;
    
    { TExportFields }
    
    function TExportFields.GetFieldItem(Index : Integer): TExportFieldItem;
    begin
      Result:=TExportFieldItem(Items[Index]);
    end;
    
    procedure TExportFields.SetFieldItem(Index : Integer; const AValue: TExportFieldItem);
    
    begin
      Items[Index]:=AValue;
    end;
    
    function TExportFields.IndexOfField(const AFieldName: String): Integer;
    
    begin
      Result:=Count-1;
      While (Result>=0) and (CompareText(GetFieldItem(Result).FieldName,AFieldName)<>0) do
        Dec(Result);
    end;
    
    function TExportFields.IndexOfExportedName(const AFieldName: String): Integer;
    begin
      Result:=Count-1;
      While (Result>=0) and (CompareText(GetFieldItem(Result).ExportedName,AFieldName)<>0) do
        Dec(Result);
    end;
    
    function TExportFields.FindExportField(const AFieldName: String
      ): TExportFieldItem;
      
    Var
      I : Integer;
      
    begin
      I:=IndexOfField(AFieldName);
      If (I<>-1) then
        Result:=GetFieldItem(I)
      else
        Result:=Nil;
    end;
    
    function TExportFields.FindExportName(const AFieldName: String
      ): TExportFieldItem;
    
    Var
      I : Integer;
    
    begin
      I:=IndexOfExportedName(AFieldName);
      If (I<>-1) then
        Result:=GetFieldItem(I)
      else
        Result:=Nil;
    end;
    
    function TExportFields.AddField(Const AFieldName: String): TExportFieldItem;
    begin
      Result:=(Add as TExportFieldItem);
      Result.FieldName:=AFieldName;
    end;
    
    { TCustomDatasetExporter }
    
    procedure TCustomDatasetExporter.SetDataset(const AValue: TDataset);
    begin
      if (FDataset<>AValue) then
        begin
        If (FDataset<>Nil) then
          FDataset.RemoveFreeNotification(Self);
        FDataset:=AValue;
        if (FDataset<>Nil) then
          FDataset.FreeNotification(Self);
        UnbindFields;
        end;
    end;
    
    procedure TCustomDatasetExporter.SetExportFields(const AValue: TExportFields);
    begin
      FExportFields.Assign(AValue);
    end;
    
    procedure TCustomDatasetExporter.SetFormatSettings(
      const AValue: TCustomExportFormatSettings);
    begin
      if FFormatSettings<>AValue then
        FFormatSettings.Assign(AValue);
    end;
    
    Function TCustomDatasetExporter.CreateFormatSettings : TCustomExportFormatSettings;
    begin
      Result:=TExportFormatSettings.Create(False);
    end;
    
    procedure TCustomDatasetExporter.CheckDataset(InBrowse : Boolean);
    begin
      If Not Assigned(Dataset) then
        Raise EDataExporter.Create(SErrNoDataset);
      If InBrowse and Not (Dataset.State=dsBrowse) then
        Raise EDataExporter.Create(SErrNoBrowse);
    end;
    
    function TCustomDatasetExporter.BindFields: Boolean;
    
    Var
      I : integer;
    
    begin
      Result:=(ExportFields.Count=0);
      If Result then
        BuildDefaultFieldMap(ExportFields);
      Try
        For I:=0 to ExportFields.Count-1 do
          ExportFields[i].BindField(Dataset);
      except
        UnbindFields;
        Raise;
      end;
    end;
    
    procedure TCustomDatasetExporter.UnbindFields;
    
    Var
      I : Integer;
    
    begin
      For I:=0 TO FExportFields.Count-1 do
        Fexportfields[i].FField:=Nil;
    end;
    
    Function TCustomDatasetExporter.CreateExportFields : TExportFields;
    begin
      Result:=TExportFields.Create(TExportFieldItem);
    end;
    
    procedure TCustomDatasetExporter.DoBeforeExecute;
    begin
      If Assigned(FBeforeExecute) then
        FBeforeExecute(Self)
    end;
    
    procedure TCustomDatasetExporter.DoAfterExecute;
    begin
      If Assigned(FAfterExecute) then
        FAfterExecute(Self)
    end;
    
    function TCustomDatasetExporter.DoDataRow: Boolean;
    begin
      Result:=True;
      If Assigned(FonExportRow) then
        FOnExportRow(Self,Result);
    end;
    
    procedure TCustomDatasetExporter.DoDataHeader;
    begin
      // Do nothing
    end;
    
    procedure TCustomDatasetExporter.DoDataFooter;
    begin
      // No nothing
    end;
    
    procedure TCustomDatasetExporter.DoDataRowStart;
    begin
      // Do nothing
    end;
    
    procedure TCustomDatasetExporter.ExportDataRow;
    
    Var
      I : Integer;
    
    begin
      For I:=0 to FExportFields.Count-1 do
        If FExportFields[I].Enabled then
          ExportField(FExportFields[i]);
    end;
    
    procedure TCustomDatasetExporter.DoDataRowEnd;
    begin
      // Do nothing
    end;
    
    procedure TCustomDatasetExporter.DoProgress(ItemNo: Integer);
    begin
      If Assigned(FOnProgress) then
        FOnProgress(Self,ItemNo);
    end;
    
    procedure TCustomDatasetExporter.ExportField(EF: TExportFieldItem);
    begin
      // Do nothing
    end;
    
    Function TCustomDatasetExporter.FormatField(F: TField) : UTF8String;
    
    Var
      FS : TFormatSettings;
    
    begin
      If (F.DataType in IntFieldTypes) then
        begin
        If (FormatSettings.IntegerFormat)<>'' then
          Result:=Format(FormatSettings.IntegerFormat,[F.AsInteger])
        else if FormatSettings.UseDisplayText then
          Result:=F.DisplayText
        else
          Result:=F.AsUTF8String;  
        end
      else if (F.DataType=ftBoolean) then
        begin
        If F.AsBoolean then
          Result:=FormatSettings.BooleanTrue
        else
          Result:=FormatSettings.BooleanFalse;
        If (Result='') then
          if FormatSettings.UseDisplayText then
            Result:=F.DisplayText
          else
            Result:=F.AsUTF8String;
        end
      else if (F.DataType=ftDate) then
        begin
        If (FormatSettings.DateFormat<>'') and ( not F.IsNull ) then
          Result:=FormatDateTime(FormatSettings.DateFormat,F.AsDateTime)
        else if FormatSettings.UseDisplayText then
          Result:=F.DisplayText
        else
          Result:=F.AsUTF8String;
        end
      else if (F.DataType=ftTime) then
        begin
        If (FormatSettings.TimeFormat<>'') and ( not F.IsNull ) then
          Result:=FormatDateTime(FormatSettings.TimeFormat,F.AsDateTime)
        else if FormatSettings.UseDisplayText then
          Result:=F.DisplayText
        else
          Result:=F.AsUTF8String;
        end
      else if (F.DataType in [ftDateTime,ftTimeStamp]) then
        begin
        If (FormatSettings.DateTimeFormat<>'') and ( not F.IsNull ) then
          Result:=FormatDateTime(FormatSettings.DateTimeFormat,F.AsDateTime)
        else if FormatSettings.UseDisplayText then
          Result:=F.DisplayText
        else
          Result:=F.AsUTF8String;
        end 
      else if (F.DataType=ftCurrency) then
        begin
        If (FormatSettings.CurrencySymbol<>'') then
          begin
          FS:=DefaultFormatSettings;
          FS.CurrencyString:=FormatSettings.CurrencySymbol;
          Result:=CurrToStrF(F.AsCurrency,ffCurrency,FormatSettings.CurrencyDigits,FS);
          end
        else  if FormatSettings.UseDisplayText then
          Result:=F.DisplayText
        else 
          Result:=F.AsUTF8String;
        end
      else if FormatSettings.UseDisplayText then
        Result:=F.DisplayText
      else
        Result:=F.AsUTF8String;
    end;
    
    procedure TCustomDatasetExporter.ExportError(Msg: String);
    begin
      Raise EDataExporter.Create(Msg);
    end;
    
    procedure TCustomDatasetExporter.ExportError(Fmt: String;
      Args: array of const);
    begin
      Raise EDataExporter.CreateFmt(Fmt,Args);
    end;
    
    
    constructor TCustomDatasetExporter.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FromCurrent:=True;
      FExportFields:=CreateExportFields;
      FExportFields.FExporter:=Self;
      FFormatSettings:=CreateFormatSettings;
    end;
    
    destructor TCustomDatasetExporter.Destroy;
    begin
      FreeAndNil(FExportFields);
      FreeAndNil(FFormatSettings);
      inherited Destroy;
    end;
    
    procedure TCustomDatasetExporter.BuildDefaultFieldMap(AMap : TExportFields);
    
    Var
      I : Integer;
      F : TField;
      
    begin
      CheckDataset(False);
      AMap.Clear;
      For I:=0 to FDataset.Fields.Count-1 do
        begin
        F:=FDataset.Fields[i];
        AMap.AddField(F.FieldName);
        end;
    end;
    
    
    
    Function TCustomDatasetExporter.Execute : Integer;
    
    Var
      B : Boolean;
      BM : TBookMark;
    
    begin
      Result:=0;
      FCanceled:=False;
      DoBeforeExecute;
      Try
        CheckDataset(True);
        B:=BindFields;
        try
          DoDataHeader;
          Dataset.DisableControls;
          Try
            BM:=Dataset.BookMark;
            try
              If not FromCurrent then
                Dataset.First;
              While not (Dataset.EOF or FCanceled) do
                begin
                if DoDataRow then
                  begin
                  Inc(Result);
                  DoDataRowStart;
                  ExportDataRow;
                  DoDataRowEnd;
                  DoProgress(Result);
                  end;
                Dataset.Next;
                end;
              DoDataFooter;
            finally
              If RestorePosition then
                Dataset.BookMark:=Bm;
            end;
          Finally
            Dataset.EnableControls;
          end;
        Finally
          If B then
            FExportFields.Clear;
        end;
      Finally
        DoAfterExecute;
      end;
    end;
    
    procedure TCustomDatasetExporter.Cancel;
    begin
      FCanceled:=True;
    end;
    
    function TCustomDatasetExporter.ShowConfigDialog: Boolean;
    begin
      Result:=ExportFormats.ConfigureExport(Self);
    end;
    
    procedure TCustomDatasetExporter.Notification(AComponent: TComponent;
      Operation: TOperation);
    begin
      If (Operation=opRemove) and (AComponent=FDataset) then
        FDataset:=Nil;
      inherited Notification(AComponent, Operation);
    end;
    
    { TStreamExporter }
    
    procedure TStreamExporter.CloseStream;
    begin
      FreeAndNil(FStream);
    end;
    
    procedure TStreamExporter.ExportToStream(AStream: TStream);
    begin
      FStream:=AStream;
      try
        Execute;
      Finally
        FStream:=Nil;
      end;
    end;
    
    { TCustomFileExporter }
    
    procedure TCustomFileExporter.SetFileName(const AValue: String);
    begin
      if FFileName=AValue then exit;
      FFileName:=AValue;
    end;
    
    procedure TCustomFileExporter.CheckFileName;
    begin
      If (FFileName='') then
        ExportError(SErrNoFileName);
    end;
    
    procedure TCustomFileExporter.OpenTextFile;
    
    begin
      CheckFileName;
      FOpenedStream:=(Stream=Nil);
      If FOpenedStream then
        OpenStream;
      AssignStream(FTextFile,Stream);
      Rewrite(FTextFile);
      FTextFileOpen:=True;
    end;
    
    procedure TCustomFileExporter.CloseTextFile;
    begin
      CloseFile(FTextFile);
      FTextFileOpen:=False;
      If FOpenedStream then
        CloseStream;
    end;
    
    procedure TCustomFileExporter.OpenStream;
    begin
      CheckFileName;
      FStream:=TFileStream.Create(FFileName,fmCreate);
    end;
    
    Destructor TCustomFileExporter.Destroy;
    begin
      If TextFileOpen then
        CloseTextFile;
      CloseStream;
      inherited Destroy;
    end;
    
    
    { TCustomExportFormatSettings }
    
    procedure TCustomExportFormatSettings.InitSettings;
    begin
      FIntegerFormat:='%d';
      FDateFormat:=ShortDateFormat;
      FTimeFormat:=ShortTimeFormat;
      FDateTimeFormat:=ShortDateFormat+' '+ShortTimeFormat;
      FBooleanTrue:='True';
      FBooleanFalse:='False';
      FDecimalSeparator:=sysutils.decimalseparator;
      FCurrencySymbol:=sysutils.CurrencyString;
    end;
    
    constructor TCustomExportFormatSettings.Create(DoInitSettings: Boolean);
    begin
      If DoInitSettings then
        InitSettings;
    end;
    
    procedure TCustomExportFormatSettings.Assign(Source: TPersistent);
    
    Var
      FS : TCustomExportFormatSettings;
    
    begin
      If (Source is TCustomExportFormatSettings) then
        begin
        FS:=Source as TCustomExportFormatSettings;
        FBooleanFalse:=FS.FBooleanFalse;
        FBooleanTrue:=FS.FBooleanTrue;
        FCurrencyDigits:=FS.FCurrencyDigits;
        FCurrencySymbol:=FS.FCurrencySymbol;
        FDateFormat:=FS.FDateFormat;
        FIntegerFormat:=FS.IntegerFormat;
        FTimeFormat:=FS.FTimeFormat;
        FDateTimeFormat:=FS.FDateTimeFormat;
        FDecimalSeparator:=FS.FDecimalSeparator;
        FUseDisplayText:=FS.FUseDisplayText;
        end
      else
        inherited Assign(Source);
    end;
    
    
    
    { TExportFormats }
    
    function TExportFormats.GetFormat(Index : Integer): TExportFormatItem;
    begin
      Result:=TExportFormatItem(Items[Index]);
    end;
    
    procedure TExportFormats.SetFormat(Index : Integer; const AValue: TExportFormatItem
      );
    begin
      Items[Index]:=AValue;
    end;
    
    function TExportFormats.RegisterExportFormat(Const AName, ADescription,
      AExtensions: String; AClass: TCustomDatasetExporterClass): TExportFormatItem;
    begin
      If (IndexOfFormat(AName)<>-1) then
        Raise EDataExporter.CreateFmt(SErrFormatExists,[AName]);
      Result:=Add as TExportFormatItem;
      Result.Name:=AName;
      Result.Description:=ADescription;
      Result.Extensions:=AExtensions;
      Result.ExportClass:=AClass;
    end;
    
    function TExportFormats.IndexOfFormat(const AName: String): Integer;
    begin
      Result:=Count-1;
      While (Result>=0) and (CompareText(GetFormat(Result).Name,AName)<>0) do
        Dec(Result);
    end;
    
    function TExportFormats.IndexOfExportClass(AClass: TCustomDataSetExporterClass
      ): Integer;
    begin
      Result:=Count-1;
      While (Result>=0) and (GetFormat(Result).ExportClass<>AClass) do
        Dec(Result);
    end;
    
    function TExportFormats.FindFormat(const AName: String): TExportFormatItem;
    
    Var
      I : Integer;
      
    begin
      I:=IndexOfFormat(AName);
      If (I=-1) then
        Result:=Nil
      else
        Result:=GetFormat(I);
    end;
    
    function TExportFormats.FindFormatByClass(AClass: TCustomDataSetExporterClass): TExportFormatItem;
      
    Var
      I : Integer;
    
    begin
      I:=IndexOfExportClass(AClass);
      If (I=-1) then
        Result:=Nil
      else
        Result:=GetFormat(I);
    end;
    
    function TExportFormats.ConfigureExport(AnExport: TCustomDatasetExporter
      ): Boolean;
      
    Var
      F : TExportFormatItem;
      
    begin
      Result:=True;
      F:=FindFormatByClass(TCustomDatasetExporterClass(AnExport.ClassType));
      If Assigned(F) and Assigned(F.OnConfigureDialog) then
        Result:=F.OnConfigureDialog(AnExport);
    end;
    
    function TExportFormats.FormatByName(const AName: String): TExportFormatItem;
    begin
      Result:=FindFormat(AName);
      If (Result=Nil) then
        Raise EDataExporter.CreateFmt(SUnknownExportFormat,[AName]);
    end;
    
    function TExportFormats.ConstructFilter(AnExport: TCustomDatasetExporter
      ): String;
      
      Procedure AddToResult(S : String);
      
      begin
        If (Result<>'') and (S<>'') then
          Result:=Result+'|';
        Result:=Result+S;
      end;
      
    Var
      F : TExportFormatItem;
      P : Integer;
      S,E : String;
      
    begin
      Result:='';
      F:=FindFormatByClass(TCustomDatasetExporterClass(AnExport.ClassType));
      If (F=Nil) then
        Exit;
      S:=F.Extensions;
      While (S<>'') do
        begin
        P:=Pos(';',S);
        If (P=0) then
          P:=Length(S)+1;
        E:=Copy(S,1,P-1);
        If (Length(E)>1) then // Make sure there actually is an extension
          begin
          If (E[1]='.') then
            system.Delete(E,1,1);
          AddToResult(Format(SExportFilter,[E])+Format('|*.%s',[E]));
          end;
        system.Delete(S,1,P);
        end;
      AddToResult(SAllFilesFilter+'|*');
    end;
    
    
    Procedure TExportFormats.UnRegisterExportFormat(AClass : TCustomDatasetExporterClass);
    
    begin
      FindFormatByClass(AClass).Free;
    end;
    
    Procedure TExportFormats.UnRegisterExportFormat(Const AName : String);
    
    begin
      FindFormat(AName).Free;
    end;
    
    
    { TExportFormatItem }
    
    procedure TExportFormatItem.SetName(const AValue: String);
    
    Var
      I : TExportFormatItem;
    
    begin
      if (FName=AValue) then
        exit;
      If (AValue<>'') then
        begin
        I:=TExportFormats(Collection).FindFormat(AValue);
        If (I<>Nil) and (I<>Self) then
          Raise EDataExporter.CreateFmt(SErrFormatExists,[AValue]);
        end;
      FName:=AValue;
    end;
    
    Var
      EF : TExportFormats;
    
    Procedure InitExportFormats;
    
    begin
      EF:=TExportFormats.Create(TExportFormatItem);
    end;
    
    Procedure DoneExportFormats;
    
    begin
      FreeAndNil(EF);
    end;
    
    Function ExportFormats : TExportFormats;
    
    begin
      If (EF=Nil) then
        InitExportFormats;
      Result:=EF;
    end;
    
    Function RegisterExportFormat(Const AName,ADescription,AExtensions : String; AClass : TCustomDatasetExporterClass) : TExportFormatItem;
    
    begin
      Result:=ExportFormats.RegisterExportFormat(AName,ADescription,AExtensions,AClass);
    end;
    
    Procedure UnRegisterExportFormat(AClass : TCustomDatasetExporterClass);
    
    begin
      ExportFormats.UnregisterExportFormat(AClass);
    end;
    
    Procedure UnRegisterExportFormat(Const AName : String);
    
    begin
      ExportFormats.UnregisterExportFormat(AName);
    end;
    
    Initialization
    
    Finalization
      DoneExportFormats;
    end.
    
    
    
    fpdbexport.pp (30,256 bytes)
  • fpfixedexport.pp (6,119 bytes)
    unit fpfixedexport;
    
    {$mode objfpc}{$H+}
    
    interface
    
    uses
      Classes, SysUtils, db, fpDBExport, LazUTF8, Math;
      
      { TFixedLengthExportFieldItem }
    
    Type
      TFixedLengthExportFieldItem = Class(TExportFieldItem)
      private
        FWidth: Integer;
        FAlignField: TAlignField;
      Public
        Procedure Assign(Source : TPersistent); override;
      Published
        Property Width : Integer Read FWidth Write FWidth;
        Property AlignField: TAlignField Read FAlignField write FAlignField;
      end;
    
      { TCustomFixedLengthExporter }
    
      TCustomFixedLengthExporter = Class(TCustomFileExporter)
      Private
        FCurrentRow : String;
        procedure InternalExportField(EF: TExportFieldItem; ExportCaption: Boolean);
        procedure OutputRow(const ARow: String);
      Protected
        Procedure BuildDefaultFieldMap(AMap : TExportFields); override;
        Function  CreateExportFields : TExportFields; override;
        Procedure DoBeforeExecute; override;
        Procedure DoAfterExecute; override;
        Procedure DoDataRowStart; override;
        Procedure DoDataHeader; override;
        Procedure ExportField(EF : TExportFieldItem); override;
        Procedure DoDataRowEnd; override;
      end;
    
      TFixedLengthExporter = Class(TCustomFixedLengthExporter)
      Published
        Property FileName;
        Property Dataset;
        Property ExportFields;
        Property FromCurrent;
        Property RestorePosition;
        Property FormatSettings;
        Property OnExportRow;
      end;
    
    Procedure RegisterFixedExportFormat;
    Procedure UnRegisterFixedExportFormat;
    
    Const
      SFixedLengthExport      = 'Fixed';
      SFixedLengthExtensions  = '.txt';
    
    Resourcestring
      SFixedLengthDescription = 'Text file with fixed length records';
    
    
    
    implementation
    
    { TFixedLengthExportFieldItem }
    
    procedure TFixedLengthExportFieldItem.Assign(Source: TPersistent);
    
    Var
      FL : TFixedLengthExportFieldItem;
    
    begin
      If Source is TFixedLengthExportFieldItem then
        begin
        FL:=Source as TFixedLengthExportFieldItem;
        Width:=FL.Width;
        AlignField:=FL.AlignFIeld;
        end;
      inherited Assign(Source);
    end;
    
    { TCustomFixedLengthExporter }
    
    procedure TCustomFixedLengthExporter.OutputRow(const ARow: String);
    begin
      Writeln(TextFile,ARow);
    end;
    
    procedure TCustomFixedLengthExporter.BuildDefaultFieldMap(AMap: TExportFields);
    
    Const
      // Mapping to TFieldType
      FieldWidths : Array[TFieldType] of integer =
        (
        {ftUnknown} -1,
        {ftString} 0,
        {ftSmallint} 3,
        {ftInteger} 10,
        {ftWord} 5,
        {ftBoolean} 1,
        {ftFloat} 20,
        {ftCurrency} 20,
        {ftBCD} 20,
        {ftDate} 10,
        {ftTime} 8,
        {ftDateTime} 20,
        {ftBytes} 0,
        {ftVarBytes} 0,
        {ftAutoInc} 10,
        {ftBlob} 0,
        {ftMemo} 0,
        {ftGraphic} 0,
        {ftFmtMemo} 0,
        {ftParadoxOle} 0,
        {ftDBaseOle} 0,
        {ftTypedBinary} 0,
        {ftCursor} 0,
        {ftFixedChar} 0,
        {ftWideString} 0,
        {ftLargeint} 0,
        {ftADT} 0,
        {ftArray} 0,
        {ftReference} 0,
        {ftDataSet} 0,
        {ftOraBlob} 0,
        {ftOraClob} 0,
        {ftVariant} 0,
        {ftInterface} 0,
        {ftIDispatch} 0,
        {ftGuid} 0,
        {ftTimeStamp} 0,
        {ftFMTBcd} 0,
        {ftFixedWideChar} 0,
        {ftWideMemo} 0
        );
    
    Var
      I,W : Integer;
      F : TField;
      FL : TFixedLengthExportFieldItem;
    
    begin
      inherited BuildDefaultFieldMap(AMap);
      For I:=0 to AMap.Count-1 do
        begin
        FL:=TFixedLengthExportFieldItem(AMAP[i]);
        F:=Dataset.Fields[i];
        W:= FieldWidths[F.DataType];
    
        if F.DataType = ftBoolean then
          W := Max( UTF8Length( TExportFormatSettings( FormatSettings).BooleanTrue ), UTF8Length( TExportFormatSettings( FormatSettings).BooleanFalse )  );
    
        If (W>0) then
          FL.Width:=W
        else if (W=0) then
          begin
          if (F.DataType in StringFieldTypes) then
            FL.Width:=F.Size;
          end;
        If (F.DataType in IntFieldTypes) or ( F.DataType in FloatFieldTypes) then
          Fl.AlignField:=afRight;
        end;
    end;
    
    function TCustomFixedLengthExporter.CreateExportFields: TExportFields;
    begin
      Result:=TExportFields.Create(TFixedLengthExportFieldItem);
    end;
    
    procedure TCustomFixedLengthExporter.DoBeforeExecute;
    begin
      inherited DoBeforeExecute;
      OpenTextFile;
    end;
    
    procedure TCustomFixedLengthExporter.DoAfterExecute;
    begin
      CloseTextFile;
      inherited DoAfterExecute;
    end;
    
    
    procedure TCustomFixedLengthExporter.DoDataRowStart;
    begin
      FCurrentRow:='';
    end;
    
    procedure TCustomFixedLengthExporter.DoDataHeader;
    Var
      I : Integer;
    
    begin
      FCurrentRow:='';
      For I:=0 to ExportFields.Count-1 do
        If ExportFields[I].Enabled then
          InternalExportField( ExportFields[i], True );
      DoDataRowEnd;
      inherited DoDataHeader;
    end;
    
    procedure TCustomFixedLengthExporter.ExportField(EF: TExportFieldItem);
    begin
      InternalExportField(EF, False );
    end;
    
    procedure TCustomFixedLengthExporter.InternalExportField(EF: TExportFieldItem;ExportCaption : Boolean );
    
    Var
      S,SS : String;
      W,L : Integer;
      FL : TFixedLengthExportFieldItem;
    
    begin
      if ExportCaption then
        S := Ef.ExportedName
      else
        S:=FormatField(EF.Field);
      If EF is TFixedLengthExportFieldItem then
        begin
        FL:=TFixedLengthExportFieldItem(EF);
        W:=FL.Width;
        end
      else
        W:=UTF8Length(S);
      L:=UTF8Length(S);
      If L>W then
        begin
        If (FL.AlignField=afLeft) then
          S:=UTF8Copy(S,1,W)
        else
          UTF8Delete(S,1,L-W);
        end
      else if (L<W) then
        begin
        SS:=StringOfChar(' ',W-L);
        If FL.AlignField=afRight then
          S:=SS+S
        else
          S:=S+SS;
        end;
      if FCurrentRow <> '' then
        S := ' ' + S;
      FCurrentRow:=FCurrentRow+S;
    end;
    
    procedure TCustomFixedLengthExporter.DoDataRowEnd;
    begin
      OutputRow(FCurrentRow);
      FCurrentRow:='';
    end;
    
    Procedure RegisterFixedExportFormat;
    
    begin
      ExportFormats.RegisterExportFormat(SFixedLengthExport,SFixedLengthDescription,SFixedLengthExtensions,TFixedLengthExporter);
    end;
    
    Procedure UnRegisterFixedExportFormat;
    
    begin
      Exportformats.UnregisterExportFormat(SFixedLengthExport);
    end;
    
    end.
    
    
    fpfixedexport.pp (6,119 bytes)
  • export.diff (4,658 bytes)
    Index: fpdbexport.pp
    ===================================================================
    --- fpdbexport.pp	(revision 43453)
    +++ fpdbexport.pp	(working copy)
    @@ -298,8 +298,8 @@
       OrdFieldTypes    = IntFieldTypes +[ftBoolean,ftLargeInt];
       DateFieldTypes   = [ftDate,ftTime,ftDateTime,ftTimeStamp];
       MemoFieldTypes   = [ftMemo,ftFmtMemo,ftWideMemo];
    -  BlobFieldTypes   =  [ftBlob,ftDBaseOLE,ftGraphic,ftOraBlob,ftOraClob,ftParadoxOLE];
    -  
    +  BlobFieldTypes   = [ftBlob,ftDBaseOLE,ftGraphic,ftOraBlob,ftOraClob,ftParadoxOLE];
    +  FloatFieldTypes  = [ftFloat, ftCurrency, ftFMTBcd, ftBCD];
     
     implementation
     
    @@ -610,7 +610,7 @@
         end
       else if (F.DataType=ftDate) then
         begin
    -    If (FormatSettings.DateFormat<>'') then
    +    If (FormatSettings.DateFormat<>'') and ( not F.IsNull ) then
           Result:=FormatDateTime(FormatSettings.DateFormat,F.AsDateTime)
         else if FormatSettings.UseDisplayText then
           Result:=F.DisplayText
    @@ -619,7 +619,7 @@
         end
       else if (F.DataType=ftTime) then
         begin
    -    If (FormatSettings.TimeFormat<>'') then
    +    If (FormatSettings.TimeFormat<>'') and ( not F.IsNull ) then
           Result:=FormatDateTime(FormatSettings.TimeFormat,F.AsDateTime)
         else if FormatSettings.UseDisplayText then
           Result:=F.DisplayText
    @@ -628,7 +628,7 @@
         end
       else if (F.DataType in [ftDateTime,ftTimeStamp]) then
         begin
    -    If (FormatSettings.DateTimeFormat<>'') then
    +    If (FormatSettings.DateTimeFormat<>'') and ( not F.IsNull ) then
           Result:=FormatDateTime(FormatSettings.DateTimeFormat,F.AsDateTime)
         else if FormatSettings.UseDisplayText then
           Result:=F.DisplayText
    Index: fpfixedexport.pp
    ===================================================================
    --- fpfixedexport.pp	(revision 43453)
    +++ fpfixedexport.pp	(working copy)
    @@ -5,7 +5,7 @@
     interface
     
     uses
    -  Classes, SysUtils, db, fpDBExport;
    +  Classes, SysUtils, db, fpDBExport, LazUTF8, Math;
       
       { TFixedLengthExportFieldItem }
     
    @@ -26,6 +26,7 @@
       TCustomFixedLengthExporter = Class(TCustomFileExporter)
       Private
         FCurrentRow : String;
    +    procedure InternalExportField(EF: TExportFieldItem; ExportCaption: Boolean);
         procedure OutputRow(const ARow: String);
       Protected
         Procedure BuildDefaultFieldMap(AMap : TExportFields); override;
    @@ -33,6 +34,7 @@
         Procedure DoBeforeExecute; override;
         Procedure DoAfterExecute; override;
         Procedure DoDataRowStart; override;
    +    Procedure DoDataHeader; override;
         Procedure ExportField(EF : TExportFieldItem); override;
         Procedure DoDataRowEnd; override;
       end;
    @@ -146,6 +148,10 @@
         FL:=TFixedLengthExportFieldItem(AMAP[i]);
         F:=Dataset.Fields[i];
         W:= FieldWidths[F.DataType];
    +
    +    if F.DataType = ftBoolean then
    +      W := Max( UTF8Length( TExportFormatSettings( FormatSettings).BooleanTrue ), UTF8Length( TExportFormatSettings( FormatSettings).BooleanFalse )  );
    +
         If (W>0) then
           FL.Width:=W
         else if (W=0) then
    @@ -153,7 +159,7 @@
           if (F.DataType in StringFieldTypes) then
             FL.Width:=F.Size;
           end;
    -    If (F.DataType in IntFieldTypes) then
    +    If (F.DataType in IntFieldTypes) or ( F.DataType in FloatFieldTypes) then
           Fl.AlignField:=afRight;
         end;
     end;
    @@ -181,8 +187,26 @@
       FCurrentRow:='';
     end;
     
    +procedure TCustomFixedLengthExporter.DoDataHeader;
    +Var
    +  I : Integer;
    +
    +begin
    +  FCurrentRow:='';
    +  For I:=0 to ExportFields.Count-1 do
    +    If ExportFields[I].Enabled then
    +      InternalExportField( ExportFields[i], True );
    +  DoDataRowEnd;
    +  inherited DoDataHeader;
    +end;
    +
     procedure TCustomFixedLengthExporter.ExportField(EF: TExportFieldItem);
    +begin
    +  InternalExportField(EF, False );
    +end;
     
    +procedure TCustomFixedLengthExporter.InternalExportField(EF: TExportFieldItem;ExportCaption : Boolean );
    +
     Var
       S,SS : String;
       W,L : Integer;
    @@ -189,7 +213,10 @@
       FL : TFixedLengthExportFieldItem;
     
     begin
    -  S:=FormatField(EF.Field);
    +  if ExportCaption then
    +    S := Ef.ExportedName
    +  else
    +    S:=FormatField(EF.Field);
       If EF is TFixedLengthExportFieldItem then
         begin
         FL:=TFixedLengthExportFieldItem(EF);
    @@ -196,14 +223,14 @@
         W:=FL.Width;
         end
       else
    -    W:=Length(S);
    -  L:=Length(S);
    +    W:=UTF8Length(S);
    +  L:=UTF8Length(S);
       If L>W then
         begin
         If (FL.AlignField=afLeft) then
    -      S:=Copy(S,1,W)
    +      S:=UTF8Copy(S,1,W)
         else
    -      Delete(S,1,L-W);
    +      UTF8Delete(S,1,L-W);
         end
       else if (L<W) then
         begin
    @@ -213,6 +240,8 @@
         else
           S:=S+SS;
         end;
    +  if FCurrentRow <> '' then
    +    S := ' ' + S;
       FCurrentRow:=FCurrentRow+S;
     end;
     
    
    export.diff (4,658 bytes)
  • BeforeFix.txt (24,432 bytes)
             1         1�1                   BGN30.12.189918.09.2019137                         15         1         3Нощувка                                             1Ползване на стая                    В брой                                                4103                           Администратор на системата                                                  Здравко Габровски                 137.00                0         0          
             1         4�1                   BGN30.12.189918.09.20192                           15         1         3Застраховка                                     1Ползване на стая                    В брой                                                4103                           Администратор на системата                                                  Здравко Габровски                 2.00                  0         0          
             1         3�1                   BGN30.12.189918.09.20191                           15         1         3Курортна такса                                1Ползване на стая                    В брой                                                4103                           Администратор на системата                                                  Здравко Габровски                 1.00                  0         0          
             1         1�0                   BGN17.09.201918.09.2019150                         15         1         3Нощувка                                             1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
             1         4�0                   BGN17.09.201918.09.20191                           15         1         3Застраховка                                     1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
             1         3�0                   BGN17.09.201918.09.20191                           15         1         3Курортна такса                                1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
             1         1�0                   BGN17.09.201918.09.2019180                         15         1         3Нощувка                                             1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
             1         3�0                   BGN17.09.201918.09.20190.5                         15         1         3Курортна такса                                1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
             1         4�0                   BGN17.09.201918.09.20192                           15         1         3Застраховка                                     1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
             1         1�0                   BGN17.09.201918.09.2019180                         15         1         3Нощувка                                             1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
             1         3�0                   BGN17.09.201918.09.20190.5                         15         1         3Курортна такса                                1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
             1         4�0                   BGN17.09.201918.09.20192                           15         1         3Застраховка                                     1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
             1         1�0                   BGN17.09.201918.09.2019150                         16         1         4Нощувка                                             1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Евелина Андонова                   0.00                  0         0          
             1         4�0                   BGN17.09.201918.09.20191                           16         1         4Застраховка                                     1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Евелина Андонова                   0.00                  0         0          
             1         3�0                   BGN17.09.201918.09.20191                           16         1         4Курортна такса                                1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Евелина Андонова                   0.00                  0         0          
             1         1�1                   BGN30.12.189918.09.20190                           16         1         4Нощувка                                             1Ползване на стая                    В брой                                                4103                           Администратор на системата                                                  Евелина Андонова                   0.00                  0         0          
             2         1�1                   BGN17.09.201918.09.2019180                         16         1         4Нощувка                                             1Ползване на стая                    С банкова карта                               3201                           Администратор на системата                                                  Евелина Андонова                   180.00                0        28       306
             2         3�1                   BGN17.09.201918.09.20190.5                         16         1         4Курортна такса                                1Ползване на стая                    С банкова карта                               3201                           Администратор на системата                                                  Евелина Андонова                   0.50                  0        28       306
             2         4�1                   BGN17.09.201918.09.20191                           16         1         4Застраховка                                     1Ползване на стая                    С банкова карта                               3201                           Администратор на системата                                                  Евелина Андонова                   1.00                  0        28       306
             2         4�1                   BGN17.09.201918.09.20191                           16         1         4Застраховка                                     1Ползване на стая                    С банкова карта                               4103                           Администратор на системата                                                  Евелина Андонова                   1.00                  0        28       306
             2         3�1                   BGN17.09.201918.09.20191                           16         1         4Курортна такса                                1Ползване на стая                    С банкова карта                               4103                           Администратор на системата                                                  Евелина Андонова                   1.00                  0        28       306
             2         1�1                   BGN17.09.201918.09.2019137                         16         1         4Нощувка                                             1Ползване на стая                    С банкова карта                               0                              Администратор на системата                                                  Евелина Андонова                   137.00                1        28       306
             2         4�1                   BGN17.09.201918.09.20192                           16         1         4Застраховка                                     1Ползване на стая                    С банкова карта                               0                              Администратор на системата                                                  Евелина Андонова                   2.00                  1        28       306
             2         3�1                   BGN17.09.201918.09.20191                           16         1         4Курортна такса                                1Ползване на стая                    С банкова карта                               0                              Администратор на системата                                                  Евелина Андонова                   1.00                  1        28       306
             2         1�-1                  BGN30.12.189918.09.2019137                         16         1         4Нощувка                                             1Ползване на стая                    С банкова карта                               0                              Администратор на системата                                                  Евелина Андонова                   -137.00               2         0          
             2         4�-1                  BGN30.12.189918.09.20192                           16         1         4Застраховка                                     1Ползване на стая                    С банкова карта                               0                              Администратор на системата                                                  Евелина Андонова                   -2.00                 2         0          
             2         3�-1                  BGN30.12.189918.09.20191                           16         1         4Курортна такса                                1Ползване на стая                    С банкова карта                               0                              Администратор на системата                                                  Евелина Андонова                   -1.00                 2         0          
             1         1�0                   BGN18.09.201918.09.2019180                         21         1         7Нощувка                                             1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Емил Чочев                               0.00                  0         0          
             1         3�0                   BGN18.09.201918.09.20190.5                         21         1         7Курортна такса                                1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Емил Чочев                               0.00                  0         0          
             1         4�0                   BGN18.09.201918.09.20192                           21         1         7Застраховка                                     1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Емил Чочев                               0.00                  0         0          
             3         1�1                   BGN30.12.189918.09.2019150                         31         1         6Нощувка                                             1Ползване на стая                    Превод по банкова сметка              9203                           Администратор на системата                                                  Борислав Гуляшки                   150.00                0         0          
             3         4�1                   BGN30.12.189918.09.20191                           31         1         6Застраховка                                     1Ползване на стая                    Превод по банкова сметка              9203                           Администратор на системата                                                  Борислав Гуляшки                   1.00                  0         0          
             3         3�1                   BGN30.12.189918.09.20191                           31         1         6Курортна такса                                1Ползване на стая                    Превод по банкова сметка              9203                           Администратор на системата                                                  Борислав Гуляшки                   1.00                  0         0          
             3         1�1                   BGN30.12.189918.09.2019180                         31         1         6Нощувка                                             1Ползване на стая                    Превод по банкова сметка             12206                           Администратор на системата                                                  Борислав Гуляшки                   180.00                0         0          
             3         3�1                   BGN30.12.189918.09.20190.5                         31         1         6Курортна такса                                1Ползване на стая                    Превод по банкова сметка             12206                           Администратор на системата                                                  Борислав Гуляшки                   0.50                  0         0          
             3         4�1                   BGN30.12.189918.09.20192                           31         1         6Застраховка                                     1Ползване на стая                    Превод по банкова сметка             12206                           Администратор на системата                                                  Борислав Гуляшки                   2.00                  0         0          
             1         1�0                   BGN18.09.201918.09.201970                          47         1        10Нощувка                                             1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Димитър Леванов                     0.00                  0         0          
             1         3�0                   BGN18.09.201918.09.20191                           47         1        10Курортна такса                                1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Димитър Леванов                     0.00                  0         0          
             1         4�0                   BGN18.09.201918.09.20191                           47         1        10Застраховка                                     1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Димитър Леванов                     0.00                  0         0          
             1         1�1                   BGN18.09.201918.09.201970                          47         1        10Нощувка                                             1Ползване на стая                    В брой                                               14208                           Администратор на системата                                                  Димитър Леванов                     70.00                 0        47       335
             1         3�1                   BGN18.09.201918.09.20191                           47         1        10Курортна такса                                1Ползване на стая                    В брой                                               14208                           Администратор на системата                                                  Димитър Леванов                     1.00                  0        47       335
             1         4�1                   BGN18.09.201918.09.20191                           47         1        10Застраховка                                     1Ползване на стая                    В брой                                               14208                           Администратор на системата                                                  Димитър Леванов                     1.00                  0        47       335
             1         1�1                   BGN18.09.201918.09.2019137                         47         1        10Нощувка                                             1Ползване на стая                    В брой                                               13207                           Администратор на системата                                                  Димитър Леванов                     137.00                0        44       332
             1         4�1                   BGN18.09.201918.09.20192                           47         1        10Застраховка                                     1Ползване на стая                    В брой                                               13207                           Администратор на системата                                                  Димитър Леванов                     2.00                  0        44       332
             1         3�1                   BGN18.09.201918.09.20191                           47         1        10Курортна такса                                1Ползване на стая                    В брой                                               13207                           Администратор на системата                                                  Димитър Леванов                     1.00                  0        44       332
             1         1�1                   BGN30.12.189918.09.20190                           47         1        10Нощувка                                             1Ползване на стая                    В брой                                               13207                           Администратор на системата                                                  Димитър Леванов                     0.00                  0         0          
             1         4�1                   BGN18.09.201918.09.20191                           47         1        10Застраховка                                     1Ползване на стая                    В брой                                               13207                           Администратор на системата                                                  Димитър Леванов                     1.00                  0        45       333
             1         3�1                   BGN18.09.201918.09.20191                           47         1        10Курортна такса                                1Ползване на стая                    В брой                                               13207                           Администратор на системата                                                  Димитър Леванов                     1.00                  0        45       333
    
    BeforeFix.txt (24,432 bytes)
  • AfterFix.txt (29,618 bytes)
          PWID      ITSID PI                   BR COD PAYDATE    SRDATE                    PRICE     CACCID      MAKER        CID ITNAME                                                    SID SNAME                                              PWNAME                                                    RID RNAME                          Оператор                                                                                             CNAME                                                              SUM1 TUS   ACCDETID       NBON
             1          1 Не                    1 BGN            18.09.2019                  137         15          1          3 Нощувка                                                     1 Ползване на стая                                   В брой                                                      4 103                            Администратор на системата                                                                           Здравко Габровски                                                137.00   0          0           
             1          4 Не                    1 BGN            18.09.2019                    2         15          1          3 Застраховка                                                 1 Ползване на стая                                   В брой                                                      4 103                            Администратор на системата                                                                           Здравко Габровски                                                  2.00   0          0           
             1          3 Не                    1 BGN            18.09.2019                    1         15          1          3 Курортна такса                                              1 Ползване на стая                                   В брой                                                      4 103                            Администратор на системата                                                                           Здравко Габровски                                                  1.00   0          0           
             1          1 Да                    0 BGN 17.09.2019 18.09.2019                  150         15          1          3 Нощувка                                                     1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
             1          4 Да                    0 BGN 17.09.2019 18.09.2019                    1         15          1          3 Застраховка                                                 1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
             1          3 Да                    0 BGN 17.09.2019 18.09.2019                    1         15          1          3 Курортна такса                                              1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
             1          1 Да                    0 BGN 17.09.2019 18.09.2019                  180         15          1          3 Нощувка                                                     1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
             1          3 Да                    0 BGN 17.09.2019 18.09.2019                  0.5         15          1          3 Курортна такса                                              1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
             1          4 Да                    0 BGN 17.09.2019 18.09.2019                    2         15          1          3 Застраховка                                                 1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
             1          1 Да                    0 BGN 17.09.2019 18.09.2019                  180         15          1          3 Нощувка                                                     1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
             1          3 Да                    0 BGN 17.09.2019 18.09.2019                  0.5         15          1          3 Курортна такса                                              1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
             1          4 Да                    0 BGN 17.09.2019 18.09.2019                    2         15          1          3 Застраховка                                                 1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
             1          1 Да                    0 BGN 17.09.2019 18.09.2019                  150         16          1          4 Нощувка                                                     1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Евелина Андонова                                                   0.00   0          0           
             1          4 Да                    0 BGN 17.09.2019 18.09.2019                    1         16          1          4 Застраховка                                                 1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Евелина Андонова                                                   0.00   0          0           
             1          3 Да                    0 BGN 17.09.2019 18.09.2019                    1         16          1          4 Курортна такса                                              1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Евелина Андонова                                                   0.00   0          0           
             1          1 Не                    1 BGN            18.09.2019                    0         16          1          4 Нощувка                                                     1 Ползване на стая                                   В брой                                                      4 103                            Администратор на системата                                                                           Евелина Андонова                                                   0.00   0          0           
             2          1 Да                    1 BGN 17.09.2019 18.09.2019                  180         16          1          4 Нощувка                                                     1 Ползване на стая                                   С банкова карта                                             3 201                            Администратор на системата                                                                           Евелина Андонова                                                 180.00   0         28        306
             2          3 Да                    1 BGN 17.09.2019 18.09.2019                  0.5         16          1          4 Курортна такса                                              1 Ползване на стая                                   С банкова карта                                             3 201                            Администратор на системата                                                                           Евелина Андонова                                                   0.50   0         28        306
             2          4 Да                    1 BGN 17.09.2019 18.09.2019                    1         16          1          4 Застраховка                                                 1 Ползване на стая                                   С банкова карта                                             3 201                            Администратор на системата                                                                           Евелина Андонова                                                   1.00   0         28        306
             2          4 Да                    1 BGN 17.09.2019 18.09.2019                    1         16          1          4 Застраховка                                                 1 Ползване на стая                                   С банкова карта                                             4 103                            Администратор на системата                                                                           Евелина Андонова                                                   1.00   0         28        306
             2          3 Да                    1 BGN 17.09.2019 18.09.2019                    1         16          1          4 Курортна такса                                              1 Ползване на стая                                   С банкова карта                                             4 103                            Администратор на системата                                                                           Евелина Андонова                                                   1.00   0         28        306
             2          1 Да                    1 BGN 17.09.2019 18.09.2019                  137         16          1          4 Нощувка                                                     1 Ползване на стая                                   С банкова карта                                             0                                Администратор на системата                                                                           Евелина Андонова                                                 137.00   1         28        306
             2          4 Да                    1 BGN 17.09.2019 18.09.2019                    2         16          1          4 Застраховка                                                 1 Ползване на стая                                   С банкова карта                                             0                                Администратор на системата                                                                           Евелина Андонова                                                   2.00   1         28        306
             2          3 Да                    1 BGN 17.09.2019 18.09.2019                    1         16          1          4 Курортна такса                                              1 Ползване на стая                                   С банкова карта                                             0                                Администратор на системата                                                                           Евелина Андонова                                                   1.00   1         28        306
             2          1 Не                   -1 BGN            18.09.2019                  137         16          1          4 Нощувка                                                     1 Ползване на стая                                   С банкова карта                                             0                                Администратор на системата                                                                           Евелина Андонова                                                -137.00   2          0           
             2          4 Не                   -1 BGN            18.09.2019                    2         16          1          4 Застраховка                                                 1 Ползване на стая                                   С банкова карта                                             0                                Администратор на системата                                                                           Евелина Андонова                                                  -2.00   2          0           
             2          3 Не                   -1 BGN            18.09.2019                    1         16          1          4 Курортна такса                                              1 Ползване на стая                                   С банкова карта                                             0                                Администратор на системата                                                                           Евелина Андонова                                                  -1.00   2          0           
             1          1 Да                    0 BGN 18.09.2019 18.09.2019                  180         21          1          7 Нощувка                                                     1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Емил Чочев                                                         0.00   0          0           
             1          3 Да                    0 BGN 18.09.2019 18.09.2019                  0.5         21          1          7 Курортна такса                                              1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Емил Чочев                                                         0.00   0          0           
             1          4 Да                    0 BGN 18.09.2019 18.09.2019                    2         21          1          7 Застраховка                                                 1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Емил Чочев                                                         0.00   0          0           
             3          1 Не                    1 BGN            18.09.2019                  150         31          1          6 Нощувка                                                     1 Ползване на стая                                   Превод по банкова сметка                                    9 203                            Администратор на системата                                                                           Борислав Гуляшки                                                 150.00   0          0           
             3          4 Не                    1 BGN            18.09.2019                    1         31          1          6 Застраховка                                                 1 Ползване на стая                                   Превод по банкова сметка                                    9 203                            Администратор на системата                                                                           Борислав Гуляшки                                                   1.00   0          0           
             3          3 Не                    1 BGN            18.09.2019                    1         31          1          6 Курортна такса                                              1 Ползване на стая                                   Превод по банкова сметка                                    9 203                            Администратор на системата                                                                           Борислав Гуляшки                                                   1.00   0          0           
             3          1 Не                    1 BGN            18.09.2019                  180         31          1          6 Нощувка                                                     1 Ползване на стая                                   Превод по банкова сметка                                   12 206                            Администратор на системата                                                                           Борислав Гуляшки                                                 180.00   0          0           
             3          3 Не                    1 BGN            18.09.2019                  0.5         31          1          6 Курортна такса                                              1 Ползване на стая                                   Превод по банкова сметка                                   12 206                            Администратор на системата                                                                           Борислав Гуляшки                                                   0.50   0          0           
             3          4 Не                    1 BGN            18.09.2019                    2         31          1          6 Застраховка                                                 1 Ползване на стая                                   Превод по банкова сметка                                   12 206                            Администратор на системата                                                                           Борислав Гуляшки                                                   2.00   0          0           
             1          1 Да                    0 BGN 18.09.2019 18.09.2019                   70         47          1         10 Нощувка                                                     1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Димитър Леванов                                                    0.00   0          0           
             1          3 Да                    0 BGN 18.09.2019 18.09.2019                    1         47          1         10 Курортна такса                                              1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Димитър Леванов                                                    0.00   0          0           
             1          4 Да                    0 BGN 18.09.2019 18.09.2019                    1         47          1         10 Застраховка                                                 1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Димитър Леванов                                                    0.00   0          0           
             1          1 Да                    1 BGN 18.09.2019 18.09.2019                   70         47          1         10 Нощувка                                                     1 Ползване на стая                                   В брой                                                     14 208                            Администратор на системата                                                                           Димитър Леванов                                                   70.00   0         47        335
             1          3 Да                    1 BGN 18.09.2019 18.09.2019                    1         47          1         10 Курортна такса                                              1 Ползване на стая                                   В брой                                                     14 208                            Администратор на системата                                                                           Димитър Леванов                                                    1.00   0         47        335
             1          4 Да                    1 BGN 18.09.2019 18.09.2019                    1         47          1         10 Застраховка                                                 1 Ползване на стая                                   В брой                                                     14 208                            Администратор на системата                                                                           Димитър Леванов                                                    1.00   0         47        335
             1          1 Да                    1 BGN 18.09.2019 18.09.2019                  137         47          1         10 Нощувка                                                     1 Ползване на стая                                   В брой                                                     13 207                            Администратор на системата                                                                           Димитър Леванов                                                  137.00   0         44        332
             1          4 Да                    1 BGN 18.09.2019 18.09.2019                    2         47          1         10 Застраховка                                                 1 Ползване на стая                                   В брой                                                     13 207                            Администратор на системата                                                                           Димитър Леванов                                                    2.00   0         44        332
             1          3 Да                    1 BGN 18.09.2019 18.09.2019                    1         47          1         10 Курортна такса                                              1 Ползване на стая                                   В брой                                                     13 207                            Администратор на системата                                                                           Димитър Леванов                                                    1.00   0         44        332
             1          1 Да                    1 BGN            18.09.2019                    0         47          1         10 Нощувка                                                     1 Ползване на стая                                   В брой                                                     13 207                            Администратор на системата                                                                           Димитър Леванов                                                    0.00   0          0           
             1          4 Да                    1 BGN 18.09.2019 18.09.2019                    1         47          1         10 Застраховка                                                 1 Ползване на стая                                   В брой                                                     13 207                            Администратор на системата                                                                           Димитър Леванов                                                    1.00   0         45        333
             1          3 Да                    1 BGN 18.09.2019 18.09.2019                    1         47          1         10 Курортна такса                                              1 Ползване на стая                                   В брой                                                     13 207                            Администратор на системата                                                                           Димитър Леванов                                                    1.00   0         45        333
    
    AfterFix.txt (29,618 bytes)
  • AfterNewFix.txt (27,926 bytes)
             1         1Н                   1BGN          18.09.2019                 137        15         1         3Нощувка                                                    1Ползване на стая                                  В брой                                                     4103                           Администратор на системата                                                                          Здравко Габровски                                               137.00  0         0          
             1         4Н                   1BGN          18.09.2019                   2        15         1         3Застраховка                                                1Ползване на стая                                  В брой                                                     4103                           Администратор на системата                                                                          Здравко Габровски                                                 2.00  0         0          
             1         3Н                   1BGN          18.09.2019                   1        15         1         3Курортна такса                                             1Ползване на стая                                  В брой                                                     4103                           Администратор на системата                                                                          Здравко Габровски                                                 1.00  0         0          
             1         1Д                   0BGN17.09.201918.09.2019                 150        15         1         3Нощувка                                                    1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
             1         4Д                   0BGN17.09.201918.09.2019                   1        15         1         3Застраховка                                                1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
             1         3Д                   0BGN17.09.201918.09.2019                   1        15         1         3Курортна такса                                             1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
             1         1Д                   0BGN17.09.201918.09.2019                 180        15         1         3Нощувка                                                    1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
             1         3Д                   0BGN17.09.201918.09.2019                 0.5        15         1         3Курортна такса                                             1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
             1         4Д                   0BGN17.09.201918.09.2019                   2        15         1         3Застраховка                                                1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
             1         1Д                   0BGN17.09.201918.09.2019                 180        15         1         3Нощувка                                                    1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
             1         3Д                   0BGN17.09.201918.09.2019                 0.5        15         1         3Курортна такса                                             1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
             1         4Д                   0BGN17.09.201918.09.2019                   2        15         1         3Застраховка                                                1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
             1         1Д                   0BGN17.09.201918.09.2019                 150        16         1         4Нощувка                                                    1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Евелина Андонова                                                  0.00  0         0          
             1         4Д                   0BGN17.09.201918.09.2019                   1        16         1         4Застраховка                                                1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Евелина Андонова                                                  0.00  0         0          
             1         3Д                   0BGN17.09.201918.09.2019                   1        16         1         4Курортна такса                                             1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Евелина Андонова                                                  0.00  0         0          
             1         1Н                   1BGN          18.09.2019                   0        16         1         4Нощувка                                                    1Ползване на стая                                  В брой                                                     4103                           Администратор на системата                                                                          Евелина Андонова                                                  0.00  0         0          
             2         1Д                   1BGN17.09.201918.09.2019                 180        16         1         4Нощувка                                                    1Ползване на стая                                  С банкова карта                                            3201                           Администратор на системата                                                                          Евелина Андонова                                                180.00  0        28       306
             2         3Д                   1BGN17.09.201918.09.2019                 0.5        16         1         4Курортна такса                                             1Ползване на стая                                  С банкова карта                                            3201                           Администратор на системата                                                                          Евелина Андонова                                                  0.50  0        28       306
             2         4Д                   1BGN17.09.201918.09.2019                   1        16         1         4Застраховка                                                1Ползване на стая                                  С банкова карта                                            3201                           Администратор на системата                                                                          Евелина Андонова                                                  1.00  0        28       306
             2         4Д                   1BGN17.09.201918.09.2019                   1        16         1         4Застраховка                                                1Ползване на стая                                  С банкова карта                                            4103                           Администратор на системата                                                                          Евелина Андонова                                                  1.00  0        28       306
             2         3Д                   1BGN17.09.201918.09.2019                   1        16         1         4Курортна такса                                             1Ползване на стая                                  С банкова карта                                            4103                           Администратор на системата                                                                          Евелина Андонова                                                  1.00  0        28       306
             2         1Д                   1BGN17.09.201918.09.2019                 137        16         1         4Нощувка                                                    1Ползване на стая                                  С банкова карта                                            0                              Администратор на системата                                                                          Евелина Андонова                                                137.00  1        28       306
             2         4Д                   1BGN17.09.201918.09.2019                   2        16         1         4Застраховка                                                1Ползване на стая                                  С банкова карта                                            0                              Администратор на системата                                                                          Евелина Андонова                                                  2.00  1        28       306
             2         3Д                   1BGN17.09.201918.09.2019                   1        16         1         4Курортна такса                                             1Ползване на стая                                  С банкова карта                                            0                              Администратор на системата                                                                          Евелина Андонова                                                  1.00  1        28       306
             2         1Н                  -1BGN          18.09.2019                 137        16         1         4Нощувка                                                    1Ползване на стая                                  С банкова карта                                            0                              Администратор на системата                                                                          Евелина Андонова                                               -137.00  2         0          
             2         4Н                  -1BGN          18.09.2019                   2        16         1         4Застраховка                                                1Ползване на стая                                  С банкова карта                                            0                              Администратор на системата                                                                          Евелина Андонова                                                 -2.00  2         0          
             2         3Н                  -1BGN          18.09.2019                   1        16         1         4Курортна такса                                             1Ползване на стая                                  С банкова карта                                            0                              Администратор на системата                                                                          Евелина Андонова                                                 -1.00  2         0          
             1         1Д                   0BGN18.09.201918.09.2019                 180        21         1         7Нощувка                                                    1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Емил Чочев                                                        0.00  0         0          
             1         3Д                   0BGN18.09.201918.09.2019                 0.5        21         1         7Курортна такса                                             1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Емил Чочев                                                        0.00  0         0          
             1         4Д                   0BGN18.09.201918.09.2019                   2        21         1         7Застраховка                                                1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Емил Чочев                                                        0.00  0         0          
             3         1Н                   1BGN          18.09.2019                 150        31         1         6Нощувка                                                    1Ползване на стая                                  Превод по банкова сметка                                   9203                           Администратор на системата                                                                          Борислав Гуляшки                                                150.00  0         0          
             3         4Н                   1BGN          18.09.2019                   1        31         1         6Застраховка                                                1Ползване на стая                                  Превод по банкова сметка                                   9203                           Администратор на системата                                                                          Борислав Гуляшки                                                  1.00  0         0          
             3         3Н                   1BGN          18.09.2019                   1        31         1         6Курортна такса                                             1Ползване на стая                                  Превод по банкова сметка                                   9203                           Администратор на системата                                                                          Борислав Гуляшки                                                  1.00  0         0          
             3         1Н                   1BGN          18.09.2019                 180        31         1         6Нощувка                                                    1Ползване на стая                                  Превод по банкова сметка                                  12206                           Администратор на системата                                                                          Борислав Гуляшки                                                180.00  0         0          
             3         3Н                   1BGN          18.09.2019                 0.5        31         1         6Курортна такса                                             1Ползване на стая                                  Превод по банкова сметка                                  12206                           Администратор на системата                                                                          Борислав Гуляшки                                                  0.50  0         0          
             3         4Н                   1BGN          18.09.2019                   2        31         1         6Застраховка                                                1Ползване на стая                                  Превод по банкова сметка                                  12206                           Администратор на системата                                                                          Борислав Гуляшки                                                  2.00  0         0          
             1         1Д                   0BGN18.09.201918.09.2019                  70        47         1        10Нощувка                                                    1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Димитър Леванов                                                   0.00  0         0          
             1         3Д                   0BGN18.09.201918.09.2019                   1        47         1        10Курортна такса                                             1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Димитър Леванов                                                   0.00  0         0          
             1         4Д                   0BGN18.09.201918.09.2019                   1        47         1        10Застраховка                                                1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Димитър Леванов                                                   0.00  0         0          
             1         1Д                   1BGN18.09.201918.09.2019                  70        47         1        10Нощувка                                                    1Ползване на стая                                  В брой                                                    14208                           Администратор на системата                                                                          Димитър Леванов                                                  70.00  0        47       335
             1         3Д                   1BGN18.09.201918.09.2019                   1        47         1        10Курортна такса                                             1Ползване на стая                                  В брой                                                    14208                           Администратор на системата                                                                          Димитър Леванов                                                   1.00  0        47       335
             1         4Д                   1BGN18.09.201918.09.2019                   1        47         1        10Застраховка                                                1Ползване на стая                                  В брой                                                    14208                           Администратор на системата                                                                          Димитър Леванов                                                   1.00  0        47       335
             1         1Д                   1BGN18.09.201918.09.2019                 137        47         1        10Нощувка                                                    1Ползване на стая                                  В брой                                                    13207                           Администратор на системата                                                                          Димитър Леванов                                                 137.00  0        44       332
             1         4Д                   1BGN18.09.201918.09.2019                   2        47         1        10Застраховка                                                1Ползване на стая                                  В брой                                                    13207                           Администратор на системата                                                                          Димитър Леванов                                                   2.00  0        44       332
             1         3Д                   1BGN18.09.201918.09.2019                   1        47         1        10Курортна такса                                             1Ползване на стая                                  В брой                                                    13207                           Администратор на системата                                                                          Димитър Леванов                                                   1.00  0        44       332
             1         1Д                   1BGN          18.09.2019                   0        47         1        10Нощувка                                                    1Ползване на стая                                  В брой                                                    13207                           Администратор на системата                                                                          Димитър Леванов                                                   0.00  0         0          
             1         4Д                   1BGN18.09.201918.09.2019                   1        47         1        10Застраховка                                                1Ползване на стая                                  В брой                                                    13207                           Администратор на системата                                                                          Димитър Леванов                                                   1.00  0        45       333
             1         3Д                   1BGN18.09.201918.09.2019                   1        47         1        10Курортна такса                                             1Ползване на стая                                  В брой                                                    13207                           Администратор на системата                                                                          Димитър Леванов                                                   1.00  0        45       333
    
    AfterNewFix.txt (27,926 bytes)

Activities

Zdravko Gabrovski

2019-11-13 00:01

reporter  

fpdbexport.pp (30,256 bytes)
unit fpDBExport;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, DB;
  
Type
  TCustomDatasetExporter = Class;

  // Quote string fields if value contains a space or delimiter char.
  TQuoteString = (qsAlways,qsSpace,qsDelimiter);
  TQuoteStrings = Set of TQuoteString;

  TAlignField = (afLeft,afRight);

  { TExportFieldItem }

  TExportFieldItem = Class(TCollectionItem)
  private
    FEnabled: Boolean;
    FField: TField;
    FFieldName: String;
    FExportedName: String;
    function GetExportedName: String;
    function GetExporter: TCustomDatasetExporter;
    procedure SetExportedName(const AValue: String);
  Protected
    Procedure BindField (ADataset : TDataset); virtual;
    procedure SetFieldName(const AValue: String); virtual;
  Public
    Constructor Create(ACollection : TCollection); override;
    Procedure Assign(Source : TPersistent); override;
    Property Field : TField Read FField;
    Property Exporter : TCustomDatasetExporter Read GetExporter;
  Published
    Property Enabled : Boolean Read FEnabled Write FEnabled default True;
    Property FieldName : String Read FFieldName Write SetFieldName;
    Property ExportedName : String Read GetExportedName Write SetExportedName;
  end;
  
  { TExportFields }

  TExportFields = Class(TCollection)
  private
    FExporter : TCustomDatasetExporter;
    function GetFieldItem(Index : Integer): TExportFieldItem;
    procedure SetFieldItem(Index : Integer; const AValue: TExportFieldItem);
  Public
    Function IndexOfField(Const AFieldName : String) : Integer;
    Function IndexOfExportedName(Const AFieldName : String) : Integer;
    Function FindExportField(Const AFieldName : String) : TExportFieldItem;
    Function FindExportName(Const AFieldName : String) : TExportFieldItem;
    Function AddField(Const AFieldName : String) : TExportFieldItem; virtual;
    Property Fields[Index : Integer] : TExportFieldItem Read GetFieldItem Write SetFieldItem; Default;
    Property Exporter : TCustomDatasetExporter Read FExporter;
  end;


  { TCustomExportFormatSettings }

  TCustomExportFormatSettings = Class(TPersistent)
  private
    FBooleanFalse : String;
    FBooleanTrue : String;
    FCurrencyDigits: Integer;
    FCurrencySymbol : String;
    FDateFormat : String;
    FIntegerFormat: String;
    FTimeFormat : String;
    FDateTimeFormat : String;
    FDecimalSeparator: Char;
    FUseDisplayText : Boolean;
  Protected
    Procedure InitSettings; virtual;
    Property UseDisplayText : Boolean Read FUseDisplayText Write FUseDisplayText;
    Property IntegerFormat : String Read FIntegerFormat Write FIntegerFormat;
    Property DecimalSeparator : Char Read FDecimalSeparator Write FDecimalSeparator;
    Property CurrencySymbol : String Read FCurrencySymbol Write FCurrencySymbol;
    Property CurrencyDigits : Integer Read FCurrencyDigits Write FCurrencyDigits;
    Property BooleanTrue : String Read FBooleanTrue Write FBooleanTrue;
    Property BooleanFalse : String Read FBooleanFalse Write FBooleanFalse;
    Property DateFormat : String Read FDateFormat Write FDateFormat;
    Property TimeFormat : String Read FTimeFormat Write FTimeFormat;
    Property DateTimeFormat : String Read FDateTimeFormat Write FDateTimeFormat;
  Public
    Constructor Create(DoInitSettings : Boolean); virtual;
    Procedure Assign(Source : TPersistent); override;
  end;
  TCustomExportFormatSettingsClass = Class of TCustomExportFormatSettings;
  
  { TExportFormatSettings }
  TExportFormatSettings = Class(TCustomExportFormatSettings)
  Published
    Property IntegerFormat;
    Property DecimalSeparator;
    Property CurrencySymbol;
    Property CurrencyDigits;
    Property BooleanTrue;
    Property BooleanFalse ;
    Property DateFormat;
    Property TimeFormat;
    Property DateTimeFormat;
  end;

  TOnExportRowEvent = Procedure(Sender : TObject; Var AllowExport : Boolean) of object;
  TExportProgressEvent = Procedure(Sender : TObject; Const ItemNo : Integer) of object;
  { TCustomDatasetExporter }

  TCustomDatasetExporter = Class(TComponent)
  private
    FAfterExecute: TNotifyEvent;
    FBeforeExecute: TNotifyEvent;
    FCanceled: Boolean;
    FDataset: TDataset;
    FFormatSettings: TCustomExportFormatSettings;
    FExportFields: TExportFields;
    FFromCurrent: Boolean;
    FOnExportRow: TOnExportRowEvent;
    FonProgress: TExportProgressEvent;
    FRestorePosition: Boolean;
    procedure SetDataset(const AValue: TDataset);
    procedure SetExportFields(const AValue: TExportFields);
    procedure SetFormatSettings(const AValue: TCustomExportFormatSettings);
  Protected
    // Override this if you need a descendent of TExportFormatSettings
    Function CreateFormatSettings : TCustomExportFormatSettings; virtual;
    // Checks if Dataset is assigned and whether it is in browse mode.
    Procedure CheckDataset(InBrowse : Boolean);
    // Allocate TField in TExportFieldItem
    Function BindFields : Boolean; virtual;
    // Nil out fields.
    Procedure UnbindFields;
    // Override if a descendent of TExportFieldItem is needed.
    Function CreateExportFields : TExportFields; Virtual;
    // Executes BeforeExecute event. Override (but call inherited)
    Procedure DoBeforeExecute; virtual;
    // Executes AfterExecute event. Override (but call inherited)
    // Note this is also executed in case of an exception !!
    Procedure DoAfterExecute; virtual;
    // Returns True if current row should be exported
    Function DoDataRow : Boolean; virtual;
    // Override to write data prior to data start.
    Procedure DoDataHeader; virtual;
    // Override to write data after data start.
    Procedure DoDataFooter; virtual;
    // Override to write something at row start.
    Procedure DoDataRowStart; virtual;
    // Override if a simple loop is not enough.
    Procedure ExportDataRow; virtual;
    // Override to write something at row end.
    Procedure DoDataRowEnd; virtual;
    // Called after row was exported
    Procedure DoProgress(ItemNo : Integer); Virtual;
    // Override if each field can be written as-is.
    Procedure ExportField(EF : TExportFieldItem); virtual;
    // Format field as UTF8 string, according to settings
    Function FormatField(F : TField) : UTF8String; virtual;
    // Raise EDataExporter error
    Procedure ExportError(Msg : String); overload;
    Procedure ExportError(Fmt : String; Args: Array of const); overload;
  Public
    Constructor Create(AOwner : TComponent); override;
    Destructor Destroy; override;
    // Build default fieldmap - adds all fields.
    Procedure BuildDefaultFieldMap(AMap : TExportFields); virtual;
    // Do export. Returns the number of records exported.
    Function Execute : Integer; virtual;
    // Call this to cancel the export
    Procedure Cancel;
    // Show the default configuration dialog, if one was assigned.
    // Returns false if the dialog was cancelled.
    Function ShowConfigDialog : Boolean;
    // Don't use. Needed for nil of dataset.
    Procedure Notification(AComponent: TComponent; Operation : TOperation); override;
    // True if export was canceled (using Cancel);
    Property Canceled : Boolean Read FCanceled;
  Public
    // Properties
    Property Dataset : TDataset Read FDataset Write SetDataset;
    Property ExportFields : TExportFields Read FExportFields Write SetExportFields;
    Property FromCurrent : Boolean Read FFromCurrent Write FFromCurrent Default True;
    Property RestorePosition : Boolean Read FRestorePosition Write FRestorePosition;
    Property FormatSettings : TCustomExportFormatSettings Read FFormatSettings Write SetFormatSettings;
    // Events
    Property AfterExecute : TNotifyEvent Read FAfterExecute Write FAfterExecute;
    Property BeforeExecute : TNotifyEvent Read FBeforeExecute Write FBeforeExecute;
    Property OnExportRow : TOnExportRowEvent Read FOnExportRow Write FOnExportRow;
    Property OnProgress : TExportProgressEvent Read FonProgress Write FOnProgress;
  end;
  
  TCustomDatasetExporterClass = Class of TCustomDatasetExporter;

  { TStreamExporter }

  TStreamExporter = Class(TCustomDatasetExporter)
  Private
    FStream: TStream;
  Protected
    Property Stream : TStream Read FStream;
    // Frees the stream.
    Procedure CloseStream;
  Public
    Procedure ExportToStream(AStream : TStream);
  end;
  
  { TCustomFileExporter }

  TCustomFileExporter = Class(TStreamExporter)
  private
    FFileName: String;
    FTextFile: Text;
    FTextFileOpen: Boolean;
    FopenedStream : Boolean;
  protected
    // Creates a file stream
    procedure OpenStream; virtual;
    // Override if some checking needs to be done on valid names
    procedure SetFileName(const AValue: String); virtual;
    // Override if some checking needs to be done prior to opening.
    Procedure CheckFileName; virtual;
    // Use to open textfile. Creates a file stream.
    Procedure OpenTextFile;
    // Use to close textfile.
    Procedure CloseTextFile;
    // Access to stream/file
    Property TextFile : Text Read FTextFile;
    Property TextFileOpen : Boolean Read FTextFileOpen;
  Public
    Destructor Destroy; override;
    // Publish in descendents.
    Property FileName : String Read FFileName Write SetFileName;
  end;
  




  EDataExporter = Class(Exception);
  
  { TExportFormatItem }

  TExportConfigureEvent = Function (Exporter : TCustomDatasetExporter) : Boolean of object;

  TExportFormatItem = Class(TCollectionItem)
  private
    FClass: TCustomDatasetExporterClass;
    FDescription: String;
    FExtensions: String;
    FName: String;
    FOnConfigure: TExportConfigureEvent;
    procedure SetName(const AValue: String);
  Public
    Property ExportClass : TCustomDatasetExporterClass Read FClass Write FClass;
  Published
    Property Name : String Read FName Write SetName;
    Property Description : String Read FDescription Write FDescription;
    Property Extensions : String Read FExtensions Write FExtensions;
    Property OnConfigureDialog : TExportConfigureEvent Read FOnConfigure Write FOnConfigure;
  end;
  
  TExportFormats = Class(TCollection)
  private
    function GetFormat(Index : Integer): TExportFormatItem;
    procedure SetFormat(Index : Integer; const AValue: TExportFormatItem);
  Public
    // Registration/Unregistration
    Function RegisterExportFormat(Const AName,ADescription,AExtensions : String; AClass : TCustomDatasetExporterClass) : TExportFormatItem;
    Procedure UnRegisterExportFormat(AClass : TCustomDatasetExporterClass);
    Procedure UnRegisterExportFormat(Const AName : String);
    // Searching
    Function IndexOfFormat(Const AName : String): Integer;
    Function IndexOfExportClass(AClass : TCustomDataSetExporterClass): Integer;
    Function FindFormat(Const AName : String) : TExportFormatItem;
    Function FindFormatByClass(AClass : TCustomDataSetExporterClass) : TExportFormatItem;
    // Shows configuration dialog, if one was configured for this class
    Function ConfigureExport(AnExport : TCustomDatasetExporter) : Boolean;
    Function FormatByName(Const AName : String) : TExportFormatItem;
    // Utilityfunctions
    Function ConstructFilter(AnExport : TCustomDatasetExporter) : String;
    Property Formats[Index : Integer] : TExportFormatItem Read GetFormat Write SetFormat; default;
  end;
  
Function ExportFormats : TExportFormats;

// Easy access functions

Function RegisterExportFormat(Const AName,ADescription,AExtensions : String; AClass : TCustomDatasetExporterClass) : TExportFormatItem;
Procedure UnRegisterExportFormat(AClass : TCustomDatasetExporterClass);
Procedure UnRegisterExportFormat(Const AName : String);


Const
  StringFieldTypes = [ftString,ftFixedChar,ftWidestring,ftFixedWideChar];
  IntFieldTypes    = [ftInteger,ftWord,ftSmallint,ftAutoinc];
  OrdFieldTypes    = IntFieldTypes +[ftBoolean,ftLargeInt];
  DateFieldTypes   = [ftDate,ftTime,ftDateTime,ftTimeStamp];
  MemoFieldTypes   = [ftMemo,ftFmtMemo,ftWideMemo];
  BlobFieldTypes   = [ftBlob,ftDBaseOLE,ftGraphic,ftOraBlob,ftOraClob,ftParadoxOLE];
  FloatFieldTypes  = [ftFloat, ftCurrency, ftFMTBcd, ftBCD];

implementation

uses streamio;

ResourceString
  SErrNoDataset           = 'Dataset not assigned';
  SErrNoBrowse            = 'Dataset not in browse mode';
  SErrNoFileName          = 'No filename set for export';
  SErrFormatExists        = 'An export format with name "%s" already exists.';
  SUnknownExportFormat    = 'Unknown export format "%s"';
  SExportFilter           = '%s files';
  SAllFilesFilter         = 'All files';
  SErrDuplicateExportName = 'Exported fieldname "%s" already exists';

{ TExportFieldItem }

procedure TExportFieldItem.SetFieldName(const AValue: String);
begin
  if (FFieldName<>AValue) then
    begin
    FField:=Nil;
    FFieldName:=AValue;
    end;
end;

constructor TExportFieldItem.Create(ACollection: TCollection);
begin
  inherited Create(ACollection);
  FEnabled:=True;
end;

function TExportFieldItem.GetExportedName: String;
begin
  Result:=FExportedName;
  If (Result='') then
    Result:=FFieldName;
end;

function TExportFieldItem.GetExporter: TCustomDatasetExporter;
begin
  If Collection is TExportFields then
    Result:=(Collection as TExportFields).Exporter;
end;

procedure TExportFieldItem.SetExportedName(const AValue: String);

Var
  I : TExportFieldItem;
  
begin
  If (FExportedName<>AValue) then
    begin
    If (AValue<>'') then
      begin
      I:=(Collection as TExportFields).FindExportName(AValue);
      If (I<>Nil) and (I<>Self) then
        Raise EDataExporter.CreateFmt(SErrDuplicateExportName,[AValue]);
      end;
    FExportedName:=AValue;
    end;
end;

procedure TExportFieldItem.BindField(ADataset: TDataset);
begin
  FField:=ADataSet.FieldByName(FieldName);
end;

procedure TExportFieldItem.Assign(Source: TPersistent);

Var
  EF : TExportFieldItem;

begin
  if (Source is TExportFieldItem) then
    begin
    EF:=Source as TExportFieldItem;
    FieldName:=EF.FieldName;
    Enabled:=EF.Enabled;
    FExportedName:=EF.FExportedName;
    end
  else
    Inherited;
end;

{ TExportFields }

function TExportFields.GetFieldItem(Index : Integer): TExportFieldItem;
begin
  Result:=TExportFieldItem(Items[Index]);
end;

procedure TExportFields.SetFieldItem(Index : Integer; const AValue: TExportFieldItem);

begin
  Items[Index]:=AValue;
end;

function TExportFields.IndexOfField(const AFieldName: String): Integer;

begin
  Result:=Count-1;
  While (Result>=0) and (CompareText(GetFieldItem(Result).FieldName,AFieldName)<>0) do
    Dec(Result);
end;

function TExportFields.IndexOfExportedName(const AFieldName: String): Integer;
begin
  Result:=Count-1;
  While (Result>=0) and (CompareText(GetFieldItem(Result).ExportedName,AFieldName)<>0) do
    Dec(Result);
end;

function TExportFields.FindExportField(const AFieldName: String
  ): TExportFieldItem;
  
Var
  I : Integer;
  
begin
  I:=IndexOfField(AFieldName);
  If (I<>-1) then
    Result:=GetFieldItem(I)
  else
    Result:=Nil;
end;

function TExportFields.FindExportName(const AFieldName: String
  ): TExportFieldItem;

Var
  I : Integer;

begin
  I:=IndexOfExportedName(AFieldName);
  If (I<>-1) then
    Result:=GetFieldItem(I)
  else
    Result:=Nil;
end;

function TExportFields.AddField(Const AFieldName: String): TExportFieldItem;
begin
  Result:=(Add as TExportFieldItem);
  Result.FieldName:=AFieldName;
end;

{ TCustomDatasetExporter }

procedure TCustomDatasetExporter.SetDataset(const AValue: TDataset);
begin
  if (FDataset<>AValue) then
    begin
    If (FDataset<>Nil) then
      FDataset.RemoveFreeNotification(Self);
    FDataset:=AValue;
    if (FDataset<>Nil) then
      FDataset.FreeNotification(Self);
    UnbindFields;
    end;
end;

procedure TCustomDatasetExporter.SetExportFields(const AValue: TExportFields);
begin
  FExportFields.Assign(AValue);
end;

procedure TCustomDatasetExporter.SetFormatSettings(
  const AValue: TCustomExportFormatSettings);
begin
  if FFormatSettings<>AValue then
    FFormatSettings.Assign(AValue);
end;

Function TCustomDatasetExporter.CreateFormatSettings : TCustomExportFormatSettings;
begin
  Result:=TExportFormatSettings.Create(False);
end;

procedure TCustomDatasetExporter.CheckDataset(InBrowse : Boolean);
begin
  If Not Assigned(Dataset) then
    Raise EDataExporter.Create(SErrNoDataset);
  If InBrowse and Not (Dataset.State=dsBrowse) then
    Raise EDataExporter.Create(SErrNoBrowse);
end;

function TCustomDatasetExporter.BindFields: Boolean;

Var
  I : integer;

begin
  Result:=(ExportFields.Count=0);
  If Result then
    BuildDefaultFieldMap(ExportFields);
  Try
    For I:=0 to ExportFields.Count-1 do
      ExportFields[i].BindField(Dataset);
  except
    UnbindFields;
    Raise;
  end;
end;

procedure TCustomDatasetExporter.UnbindFields;

Var
  I : Integer;

begin
  For I:=0 TO FExportFields.Count-1 do
    Fexportfields[i].FField:=Nil;
end;

Function TCustomDatasetExporter.CreateExportFields : TExportFields;
begin
  Result:=TExportFields.Create(TExportFieldItem);
end;

procedure TCustomDatasetExporter.DoBeforeExecute;
begin
  If Assigned(FBeforeExecute) then
    FBeforeExecute(Self)
end;

procedure TCustomDatasetExporter.DoAfterExecute;
begin
  If Assigned(FAfterExecute) then
    FAfterExecute(Self)
end;

function TCustomDatasetExporter.DoDataRow: Boolean;
begin
  Result:=True;
  If Assigned(FonExportRow) then
    FOnExportRow(Self,Result);
end;

procedure TCustomDatasetExporter.DoDataHeader;
begin
  // Do nothing
end;

procedure TCustomDatasetExporter.DoDataFooter;
begin
  // No nothing
end;

procedure TCustomDatasetExporter.DoDataRowStart;
begin
  // Do nothing
end;

procedure TCustomDatasetExporter.ExportDataRow;

Var
  I : Integer;

begin
  For I:=0 to FExportFields.Count-1 do
    If FExportFields[I].Enabled then
      ExportField(FExportFields[i]);
end;

procedure TCustomDatasetExporter.DoDataRowEnd;
begin
  // Do nothing
end;

procedure TCustomDatasetExporter.DoProgress(ItemNo: Integer);
begin
  If Assigned(FOnProgress) then
    FOnProgress(Self,ItemNo);
end;

procedure TCustomDatasetExporter.ExportField(EF: TExportFieldItem);
begin
  // Do nothing
end;

Function TCustomDatasetExporter.FormatField(F: TField) : UTF8String;

Var
  FS : TFormatSettings;

begin
  If (F.DataType in IntFieldTypes) then
    begin
    If (FormatSettings.IntegerFormat)<>'' then
      Result:=Format(FormatSettings.IntegerFormat,[F.AsInteger])
    else if FormatSettings.UseDisplayText then
      Result:=F.DisplayText
    else
      Result:=F.AsUTF8String;  
    end
  else if (F.DataType=ftBoolean) then
    begin
    If F.AsBoolean then
      Result:=FormatSettings.BooleanTrue
    else
      Result:=FormatSettings.BooleanFalse;
    If (Result='') then
      if FormatSettings.UseDisplayText then
        Result:=F.DisplayText
      else
        Result:=F.AsUTF8String;
    end
  else if (F.DataType=ftDate) then
    begin
    If (FormatSettings.DateFormat<>'') and ( not F.IsNull ) then
      Result:=FormatDateTime(FormatSettings.DateFormat,F.AsDateTime)
    else if FormatSettings.UseDisplayText then
      Result:=F.DisplayText
    else
      Result:=F.AsUTF8String;
    end
  else if (F.DataType=ftTime) then
    begin
    If (FormatSettings.TimeFormat<>'') and ( not F.IsNull ) then
      Result:=FormatDateTime(FormatSettings.TimeFormat,F.AsDateTime)
    else if FormatSettings.UseDisplayText then
      Result:=F.DisplayText
    else
      Result:=F.AsUTF8String;
    end
  else if (F.DataType in [ftDateTime,ftTimeStamp]) then
    begin
    If (FormatSettings.DateTimeFormat<>'') and ( not F.IsNull ) then
      Result:=FormatDateTime(FormatSettings.DateTimeFormat,F.AsDateTime)
    else if FormatSettings.UseDisplayText then
      Result:=F.DisplayText
    else
      Result:=F.AsUTF8String;
    end 
  else if (F.DataType=ftCurrency) then
    begin
    If (FormatSettings.CurrencySymbol<>'') then
      begin
      FS:=DefaultFormatSettings;
      FS.CurrencyString:=FormatSettings.CurrencySymbol;
      Result:=CurrToStrF(F.AsCurrency,ffCurrency,FormatSettings.CurrencyDigits,FS);
      end
    else  if FormatSettings.UseDisplayText then
      Result:=F.DisplayText
    else 
      Result:=F.AsUTF8String;
    end
  else if FormatSettings.UseDisplayText then
    Result:=F.DisplayText
  else
    Result:=F.AsUTF8String;
end;

procedure TCustomDatasetExporter.ExportError(Msg: String);
begin
  Raise EDataExporter.Create(Msg);
end;

procedure TCustomDatasetExporter.ExportError(Fmt: String;
  Args: array of const);
begin
  Raise EDataExporter.CreateFmt(Fmt,Args);
end;


constructor TCustomDatasetExporter.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FromCurrent:=True;
  FExportFields:=CreateExportFields;
  FExportFields.FExporter:=Self;
  FFormatSettings:=CreateFormatSettings;
end;

destructor TCustomDatasetExporter.Destroy;
begin
  FreeAndNil(FExportFields);
  FreeAndNil(FFormatSettings);
  inherited Destroy;
end;

procedure TCustomDatasetExporter.BuildDefaultFieldMap(AMap : TExportFields);

Var
  I : Integer;
  F : TField;
  
begin
  CheckDataset(False);
  AMap.Clear;
  For I:=0 to FDataset.Fields.Count-1 do
    begin
    F:=FDataset.Fields[i];
    AMap.AddField(F.FieldName);
    end;
end;



Function TCustomDatasetExporter.Execute : Integer;

Var
  B : Boolean;
  BM : TBookMark;

begin
  Result:=0;
  FCanceled:=False;
  DoBeforeExecute;
  Try
    CheckDataset(True);
    B:=BindFields;
    try
      DoDataHeader;
      Dataset.DisableControls;
      Try
        BM:=Dataset.BookMark;
        try
          If not FromCurrent then
            Dataset.First;
          While not (Dataset.EOF or FCanceled) do
            begin
            if DoDataRow then
              begin
              Inc(Result);
              DoDataRowStart;
              ExportDataRow;
              DoDataRowEnd;
              DoProgress(Result);
              end;
            Dataset.Next;
            end;
          DoDataFooter;
        finally
          If RestorePosition then
            Dataset.BookMark:=Bm;
        end;
      Finally
        Dataset.EnableControls;
      end;
    Finally
      If B then
        FExportFields.Clear;
    end;
  Finally
    DoAfterExecute;
  end;
end;

procedure TCustomDatasetExporter.Cancel;
begin
  FCanceled:=True;
end;

function TCustomDatasetExporter.ShowConfigDialog: Boolean;
begin
  Result:=ExportFormats.ConfigureExport(Self);
end;

procedure TCustomDatasetExporter.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  If (Operation=opRemove) and (AComponent=FDataset) then
    FDataset:=Nil;
  inherited Notification(AComponent, Operation);
end;

{ TStreamExporter }

procedure TStreamExporter.CloseStream;
begin
  FreeAndNil(FStream);
end;

procedure TStreamExporter.ExportToStream(AStream: TStream);
begin
  FStream:=AStream;
  try
    Execute;
  Finally
    FStream:=Nil;
  end;
end;

{ TCustomFileExporter }

procedure TCustomFileExporter.SetFileName(const AValue: String);
begin
  if FFileName=AValue then exit;
  FFileName:=AValue;
end;

procedure TCustomFileExporter.CheckFileName;
begin
  If (FFileName='') then
    ExportError(SErrNoFileName);
end;

procedure TCustomFileExporter.OpenTextFile;

begin
  CheckFileName;
  FOpenedStream:=(Stream=Nil);
  If FOpenedStream then
    OpenStream;
  AssignStream(FTextFile,Stream);
  Rewrite(FTextFile);
  FTextFileOpen:=True;
end;

procedure TCustomFileExporter.CloseTextFile;
begin
  CloseFile(FTextFile);
  FTextFileOpen:=False;
  If FOpenedStream then
    CloseStream;
end;

procedure TCustomFileExporter.OpenStream;
begin
  CheckFileName;
  FStream:=TFileStream.Create(FFileName,fmCreate);
end;

Destructor TCustomFileExporter.Destroy;
begin
  If TextFileOpen then
    CloseTextFile;
  CloseStream;
  inherited Destroy;
end;


{ TCustomExportFormatSettings }

procedure TCustomExportFormatSettings.InitSettings;
begin
  FIntegerFormat:='%d';
  FDateFormat:=ShortDateFormat;
  FTimeFormat:=ShortTimeFormat;
  FDateTimeFormat:=ShortDateFormat+' '+ShortTimeFormat;
  FBooleanTrue:='True';
  FBooleanFalse:='False';
  FDecimalSeparator:=sysutils.decimalseparator;
  FCurrencySymbol:=sysutils.CurrencyString;
end;

constructor TCustomExportFormatSettings.Create(DoInitSettings: Boolean);
begin
  If DoInitSettings then
    InitSettings;
end;

procedure TCustomExportFormatSettings.Assign(Source: TPersistent);

Var
  FS : TCustomExportFormatSettings;

begin
  If (Source is TCustomExportFormatSettings) then
    begin
    FS:=Source as TCustomExportFormatSettings;
    FBooleanFalse:=FS.FBooleanFalse;
    FBooleanTrue:=FS.FBooleanTrue;
    FCurrencyDigits:=FS.FCurrencyDigits;
    FCurrencySymbol:=FS.FCurrencySymbol;
    FDateFormat:=FS.FDateFormat;
    FIntegerFormat:=FS.IntegerFormat;
    FTimeFormat:=FS.FTimeFormat;
    FDateTimeFormat:=FS.FDateTimeFormat;
    FDecimalSeparator:=FS.FDecimalSeparator;
    FUseDisplayText:=FS.FUseDisplayText;
    end
  else
    inherited Assign(Source);
end;



{ TExportFormats }

function TExportFormats.GetFormat(Index : Integer): TExportFormatItem;
begin
  Result:=TExportFormatItem(Items[Index]);
end;

procedure TExportFormats.SetFormat(Index : Integer; const AValue: TExportFormatItem
  );
begin
  Items[Index]:=AValue;
end;

function TExportFormats.RegisterExportFormat(Const AName, ADescription,
  AExtensions: String; AClass: TCustomDatasetExporterClass): TExportFormatItem;
begin
  If (IndexOfFormat(AName)<>-1) then
    Raise EDataExporter.CreateFmt(SErrFormatExists,[AName]);
  Result:=Add as TExportFormatItem;
  Result.Name:=AName;
  Result.Description:=ADescription;
  Result.Extensions:=AExtensions;
  Result.ExportClass:=AClass;
end;

function TExportFormats.IndexOfFormat(const AName: String): Integer;
begin
  Result:=Count-1;
  While (Result>=0) and (CompareText(GetFormat(Result).Name,AName)<>0) do
    Dec(Result);
end;

function TExportFormats.IndexOfExportClass(AClass: TCustomDataSetExporterClass
  ): Integer;
begin
  Result:=Count-1;
  While (Result>=0) and (GetFormat(Result).ExportClass<>AClass) do
    Dec(Result);
end;

function TExportFormats.FindFormat(const AName: String): TExportFormatItem;

Var
  I : Integer;
  
begin
  I:=IndexOfFormat(AName);
  If (I=-1) then
    Result:=Nil
  else
    Result:=GetFormat(I);
end;

function TExportFormats.FindFormatByClass(AClass: TCustomDataSetExporterClass): TExportFormatItem;
  
Var
  I : Integer;

begin
  I:=IndexOfExportClass(AClass);
  If (I=-1) then
    Result:=Nil
  else
    Result:=GetFormat(I);
end;

function TExportFormats.ConfigureExport(AnExport: TCustomDatasetExporter
  ): Boolean;
  
Var
  F : TExportFormatItem;
  
begin
  Result:=True;
  F:=FindFormatByClass(TCustomDatasetExporterClass(AnExport.ClassType));
  If Assigned(F) and Assigned(F.OnConfigureDialog) then
    Result:=F.OnConfigureDialog(AnExport);
end;

function TExportFormats.FormatByName(const AName: String): TExportFormatItem;
begin
  Result:=FindFormat(AName);
  If (Result=Nil) then
    Raise EDataExporter.CreateFmt(SUnknownExportFormat,[AName]);
end;

function TExportFormats.ConstructFilter(AnExport: TCustomDatasetExporter
  ): String;
  
  Procedure AddToResult(S : String);
  
  begin
    If (Result<>'') and (S<>'') then
      Result:=Result+'|';
    Result:=Result+S;
  end;
  
Var
  F : TExportFormatItem;
  P : Integer;
  S,E : String;
  
begin
  Result:='';
  F:=FindFormatByClass(TCustomDatasetExporterClass(AnExport.ClassType));
  If (F=Nil) then
    Exit;
  S:=F.Extensions;
  While (S<>'') do
    begin
    P:=Pos(';',S);
    If (P=0) then
      P:=Length(S)+1;
    E:=Copy(S,1,P-1);
    If (Length(E)>1) then // Make sure there actually is an extension
      begin
      If (E[1]='.') then
        system.Delete(E,1,1);
      AddToResult(Format(SExportFilter,[E])+Format('|*.%s',[E]));
      end;
    system.Delete(S,1,P);
    end;
  AddToResult(SAllFilesFilter+'|*');
end;


Procedure TExportFormats.UnRegisterExportFormat(AClass : TCustomDatasetExporterClass);

begin
  FindFormatByClass(AClass).Free;
end;

Procedure TExportFormats.UnRegisterExportFormat(Const AName : String);

begin
  FindFormat(AName).Free;
end;


{ TExportFormatItem }

procedure TExportFormatItem.SetName(const AValue: String);

Var
  I : TExportFormatItem;

begin
  if (FName=AValue) then
    exit;
  If (AValue<>'') then
    begin
    I:=TExportFormats(Collection).FindFormat(AValue);
    If (I<>Nil) and (I<>Self) then
      Raise EDataExporter.CreateFmt(SErrFormatExists,[AValue]);
    end;
  FName:=AValue;
end;

Var
  EF : TExportFormats;

Procedure InitExportFormats;

begin
  EF:=TExportFormats.Create(TExportFormatItem);
end;

Procedure DoneExportFormats;

begin
  FreeAndNil(EF);
end;

Function ExportFormats : TExportFormats;

begin
  If (EF=Nil) then
    InitExportFormats;
  Result:=EF;
end;

Function RegisterExportFormat(Const AName,ADescription,AExtensions : String; AClass : TCustomDatasetExporterClass) : TExportFormatItem;

begin
  Result:=ExportFormats.RegisterExportFormat(AName,ADescription,AExtensions,AClass);
end;

Procedure UnRegisterExportFormat(AClass : TCustomDatasetExporterClass);

begin
  ExportFormats.UnregisterExportFormat(AClass);
end;

Procedure UnRegisterExportFormat(Const AName : String);

begin
  ExportFormats.UnregisterExportFormat(AName);
end;

Initialization

Finalization
  DoneExportFormats;
end.


fpdbexport.pp (30,256 bytes)
fpfixedexport.pp (6,119 bytes)
unit fpfixedexport;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, db, fpDBExport, LazUTF8, Math;
  
  { TFixedLengthExportFieldItem }

Type
  TFixedLengthExportFieldItem = Class(TExportFieldItem)
  private
    FWidth: Integer;
    FAlignField: TAlignField;
  Public
    Procedure Assign(Source : TPersistent); override;
  Published
    Property Width : Integer Read FWidth Write FWidth;
    Property AlignField: TAlignField Read FAlignField write FAlignField;
  end;

  { TCustomFixedLengthExporter }

  TCustomFixedLengthExporter = Class(TCustomFileExporter)
  Private
    FCurrentRow : String;
    procedure InternalExportField(EF: TExportFieldItem; ExportCaption: Boolean);
    procedure OutputRow(const ARow: String);
  Protected
    Procedure BuildDefaultFieldMap(AMap : TExportFields); override;
    Function  CreateExportFields : TExportFields; override;
    Procedure DoBeforeExecute; override;
    Procedure DoAfterExecute; override;
    Procedure DoDataRowStart; override;
    Procedure DoDataHeader; override;
    Procedure ExportField(EF : TExportFieldItem); override;
    Procedure DoDataRowEnd; override;
  end;

  TFixedLengthExporter = Class(TCustomFixedLengthExporter)
  Published
    Property FileName;
    Property Dataset;
    Property ExportFields;
    Property FromCurrent;
    Property RestorePosition;
    Property FormatSettings;
    Property OnExportRow;
  end;

Procedure RegisterFixedExportFormat;
Procedure UnRegisterFixedExportFormat;

Const
  SFixedLengthExport      = 'Fixed';
  SFixedLengthExtensions  = '.txt';

Resourcestring
  SFixedLengthDescription = 'Text file with fixed length records';



implementation

{ TFixedLengthExportFieldItem }

procedure TFixedLengthExportFieldItem.Assign(Source: TPersistent);

Var
  FL : TFixedLengthExportFieldItem;

begin
  If Source is TFixedLengthExportFieldItem then
    begin
    FL:=Source as TFixedLengthExportFieldItem;
    Width:=FL.Width;
    AlignField:=FL.AlignFIeld;
    end;
  inherited Assign(Source);
end;

{ TCustomFixedLengthExporter }

procedure TCustomFixedLengthExporter.OutputRow(const ARow: String);
begin
  Writeln(TextFile,ARow);
end;

procedure TCustomFixedLengthExporter.BuildDefaultFieldMap(AMap: TExportFields);

Const
  // Mapping to TFieldType
  FieldWidths : Array[TFieldType] of integer =
    (
    {ftUnknown} -1,
    {ftString} 0,
    {ftSmallint} 3,
    {ftInteger} 10,
    {ftWord} 5,
    {ftBoolean} 1,
    {ftFloat} 20,
    {ftCurrency} 20,
    {ftBCD} 20,
    {ftDate} 10,
    {ftTime} 8,
    {ftDateTime} 20,
    {ftBytes} 0,
    {ftVarBytes} 0,
    {ftAutoInc} 10,
    {ftBlob} 0,
    {ftMemo} 0,
    {ftGraphic} 0,
    {ftFmtMemo} 0,
    {ftParadoxOle} 0,
    {ftDBaseOle} 0,
    {ftTypedBinary} 0,
    {ftCursor} 0,
    {ftFixedChar} 0,
    {ftWideString} 0,
    {ftLargeint} 0,
    {ftADT} 0,
    {ftArray} 0,
    {ftReference} 0,
    {ftDataSet} 0,
    {ftOraBlob} 0,
    {ftOraClob} 0,
    {ftVariant} 0,
    {ftInterface} 0,
    {ftIDispatch} 0,
    {ftGuid} 0,
    {ftTimeStamp} 0,
    {ftFMTBcd} 0,
    {ftFixedWideChar} 0,
    {ftWideMemo} 0
    );

Var
  I,W : Integer;
  F : TField;
  FL : TFixedLengthExportFieldItem;

begin
  inherited BuildDefaultFieldMap(AMap);
  For I:=0 to AMap.Count-1 do
    begin
    FL:=TFixedLengthExportFieldItem(AMAP[i]);
    F:=Dataset.Fields[i];
    W:= FieldWidths[F.DataType];

    if F.DataType = ftBoolean then
      W := Max( UTF8Length( TExportFormatSettings( FormatSettings).BooleanTrue ), UTF8Length( TExportFormatSettings( FormatSettings).BooleanFalse )  );

    If (W>0) then
      FL.Width:=W
    else if (W=0) then
      begin
      if (F.DataType in StringFieldTypes) then
        FL.Width:=F.Size;
      end;
    If (F.DataType in IntFieldTypes) or ( F.DataType in FloatFieldTypes) then
      Fl.AlignField:=afRight;
    end;
end;

function TCustomFixedLengthExporter.CreateExportFields: TExportFields;
begin
  Result:=TExportFields.Create(TFixedLengthExportFieldItem);
end;

procedure TCustomFixedLengthExporter.DoBeforeExecute;
begin
  inherited DoBeforeExecute;
  OpenTextFile;
end;

procedure TCustomFixedLengthExporter.DoAfterExecute;
begin
  CloseTextFile;
  inherited DoAfterExecute;
end;


procedure TCustomFixedLengthExporter.DoDataRowStart;
begin
  FCurrentRow:='';
end;

procedure TCustomFixedLengthExporter.DoDataHeader;
Var
  I : Integer;

begin
  FCurrentRow:='';
  For I:=0 to ExportFields.Count-1 do
    If ExportFields[I].Enabled then
      InternalExportField( ExportFields[i], True );
  DoDataRowEnd;
  inherited DoDataHeader;
end;

procedure TCustomFixedLengthExporter.ExportField(EF: TExportFieldItem);
begin
  InternalExportField(EF, False );
end;

procedure TCustomFixedLengthExporter.InternalExportField(EF: TExportFieldItem;ExportCaption : Boolean );

Var
  S,SS : String;
  W,L : Integer;
  FL : TFixedLengthExportFieldItem;

begin
  if ExportCaption then
    S := Ef.ExportedName
  else
    S:=FormatField(EF.Field);
  If EF is TFixedLengthExportFieldItem then
    begin
    FL:=TFixedLengthExportFieldItem(EF);
    W:=FL.Width;
    end
  else
    W:=UTF8Length(S);
  L:=UTF8Length(S);
  If L>W then
    begin
    If (FL.AlignField=afLeft) then
      S:=UTF8Copy(S,1,W)
    else
      UTF8Delete(S,1,L-W);
    end
  else if (L<W) then
    begin
    SS:=StringOfChar(' ',W-L);
    If FL.AlignField=afRight then
      S:=SS+S
    else
      S:=S+SS;
    end;
  if FCurrentRow <> '' then
    S := ' ' + S;
  FCurrentRow:=FCurrentRow+S;
end;

procedure TCustomFixedLengthExporter.DoDataRowEnd;
begin
  OutputRow(FCurrentRow);
  FCurrentRow:='';
end;

Procedure RegisterFixedExportFormat;

begin
  ExportFormats.RegisterExportFormat(SFixedLengthExport,SFixedLengthDescription,SFixedLengthExtensions,TFixedLengthExporter);
end;

Procedure UnRegisterFixedExportFormat;

begin
  Exportformats.UnregisterExportFormat(SFixedLengthExport);
end;

end.

fpfixedexport.pp (6,119 bytes)
export.diff (4,658 bytes)
Index: fpdbexport.pp
===================================================================
--- fpdbexport.pp	(revision 43453)
+++ fpdbexport.pp	(working copy)
@@ -298,8 +298,8 @@
   OrdFieldTypes    = IntFieldTypes +[ftBoolean,ftLargeInt];
   DateFieldTypes   = [ftDate,ftTime,ftDateTime,ftTimeStamp];
   MemoFieldTypes   = [ftMemo,ftFmtMemo,ftWideMemo];
-  BlobFieldTypes   =  [ftBlob,ftDBaseOLE,ftGraphic,ftOraBlob,ftOraClob,ftParadoxOLE];
-  
+  BlobFieldTypes   = [ftBlob,ftDBaseOLE,ftGraphic,ftOraBlob,ftOraClob,ftParadoxOLE];
+  FloatFieldTypes  = [ftFloat, ftCurrency, ftFMTBcd, ftBCD];
 
 implementation
 
@@ -610,7 +610,7 @@
     end
   else if (F.DataType=ftDate) then
     begin
-    If (FormatSettings.DateFormat<>'') then
+    If (FormatSettings.DateFormat<>'') and ( not F.IsNull ) then
       Result:=FormatDateTime(FormatSettings.DateFormat,F.AsDateTime)
     else if FormatSettings.UseDisplayText then
       Result:=F.DisplayText
@@ -619,7 +619,7 @@
     end
   else if (F.DataType=ftTime) then
     begin
-    If (FormatSettings.TimeFormat<>'') then
+    If (FormatSettings.TimeFormat<>'') and ( not F.IsNull ) then
       Result:=FormatDateTime(FormatSettings.TimeFormat,F.AsDateTime)
     else if FormatSettings.UseDisplayText then
       Result:=F.DisplayText
@@ -628,7 +628,7 @@
     end
   else if (F.DataType in [ftDateTime,ftTimeStamp]) then
     begin
-    If (FormatSettings.DateTimeFormat<>'') then
+    If (FormatSettings.DateTimeFormat<>'') and ( not F.IsNull ) then
       Result:=FormatDateTime(FormatSettings.DateTimeFormat,F.AsDateTime)
     else if FormatSettings.UseDisplayText then
       Result:=F.DisplayText
Index: fpfixedexport.pp
===================================================================
--- fpfixedexport.pp	(revision 43453)
+++ fpfixedexport.pp	(working copy)
@@ -5,7 +5,7 @@
 interface
 
 uses
-  Classes, SysUtils, db, fpDBExport;
+  Classes, SysUtils, db, fpDBExport, LazUTF8, Math;
   
   { TFixedLengthExportFieldItem }
 
@@ -26,6 +26,7 @@
   TCustomFixedLengthExporter = Class(TCustomFileExporter)
   Private
     FCurrentRow : String;
+    procedure InternalExportField(EF: TExportFieldItem; ExportCaption: Boolean);
     procedure OutputRow(const ARow: String);
   Protected
     Procedure BuildDefaultFieldMap(AMap : TExportFields); override;
@@ -33,6 +34,7 @@
     Procedure DoBeforeExecute; override;
     Procedure DoAfterExecute; override;
     Procedure DoDataRowStart; override;
+    Procedure DoDataHeader; override;
     Procedure ExportField(EF : TExportFieldItem); override;
     Procedure DoDataRowEnd; override;
   end;
@@ -146,6 +148,10 @@
     FL:=TFixedLengthExportFieldItem(AMAP[i]);
     F:=Dataset.Fields[i];
     W:= FieldWidths[F.DataType];
+
+    if F.DataType = ftBoolean then
+      W := Max( UTF8Length( TExportFormatSettings( FormatSettings).BooleanTrue ), UTF8Length( TExportFormatSettings( FormatSettings).BooleanFalse )  );
+
     If (W>0) then
       FL.Width:=W
     else if (W=0) then
@@ -153,7 +159,7 @@
       if (F.DataType in StringFieldTypes) then
         FL.Width:=F.Size;
       end;
-    If (F.DataType in IntFieldTypes) then
+    If (F.DataType in IntFieldTypes) or ( F.DataType in FloatFieldTypes) then
       Fl.AlignField:=afRight;
     end;
 end;
@@ -181,8 +187,26 @@
   FCurrentRow:='';
 end;
 
+procedure TCustomFixedLengthExporter.DoDataHeader;
+Var
+  I : Integer;
+
+begin
+  FCurrentRow:='';
+  For I:=0 to ExportFields.Count-1 do
+    If ExportFields[I].Enabled then
+      InternalExportField( ExportFields[i], True );
+  DoDataRowEnd;
+  inherited DoDataHeader;
+end;
+
 procedure TCustomFixedLengthExporter.ExportField(EF: TExportFieldItem);
+begin
+  InternalExportField(EF, False );
+end;
 
+procedure TCustomFixedLengthExporter.InternalExportField(EF: TExportFieldItem;ExportCaption : Boolean );
+
 Var
   S,SS : String;
   W,L : Integer;
@@ -189,7 +213,10 @@
   FL : TFixedLengthExportFieldItem;
 
 begin
-  S:=FormatField(EF.Field);
+  if ExportCaption then
+    S := Ef.ExportedName
+  else
+    S:=FormatField(EF.Field);
   If EF is TFixedLengthExportFieldItem then
     begin
     FL:=TFixedLengthExportFieldItem(EF);
@@ -196,14 +223,14 @@
     W:=FL.Width;
     end
   else
-    W:=Length(S);
-  L:=Length(S);
+    W:=UTF8Length(S);
+  L:=UTF8Length(S);
   If L>W then
     begin
     If (FL.AlignField=afLeft) then
-      S:=Copy(S,1,W)
+      S:=UTF8Copy(S,1,W)
     else
-      Delete(S,1,L-W);
+      UTF8Delete(S,1,L-W);
     end
   else if (L<W) then
     begin
@@ -213,6 +240,8 @@
     else
       S:=S+SS;
     end;
+  if FCurrentRow <> '' then
+    S := ' ' + S;
   FCurrentRow:=FCurrentRow+S;
 end;
 
export.diff (4,658 bytes)

Michael Van Canneyt

2019-11-13 08:09

administrator   ~0119258

A nice problem.

I think fixed length and UTF8 are a contradiction in terms since a unicode character can be encoded in an arbitrary number (1-4) of bytes in UTF8.

If you need unicode support for fixed length, then I think it makes more sense to do everything in UTF16, not UTF8.
At the very least, the option to use UTF16 should be there, don't you agree ?

Zdravko Gabrovski

2019-11-13 08:29

reporter   ~0119259

I don't'need a Unicode support here, I need an export in UTF-8, but if you left code like it is, it breaks UTF8 sybols.
The problem comes from regular Copy, Legnth and Delete, wich breaks the UTF8 characters.
Please, see attached .txt file after the fix everything is OK. (there is bulgarian text inside, but you can see the difference).
Also, I forgot to desribe, that I fixed an export of boolean fields if it is defined a Boolean true and/or BooleanFalse in FormatSettings it exports only first letter, now it exports everything.

BeforeFix.txt (24,432 bytes)
         1         1�1                   BGN30.12.189918.09.2019137                         15         1         3Нощувка                                             1Ползване на стая                    В брой                                                4103                           Администратор на системата                                                  Здравко Габровски                 137.00                0         0          
         1         4�1                   BGN30.12.189918.09.20192                           15         1         3Застраховка                                     1Ползване на стая                    В брой                                                4103                           Администратор на системата                                                  Здравко Габровски                 2.00                  0         0          
         1         3�1                   BGN30.12.189918.09.20191                           15         1         3Курортна такса                                1Ползване на стая                    В брой                                                4103                           Администратор на системата                                                  Здравко Габровски                 1.00                  0         0          
         1         1�0                   BGN17.09.201918.09.2019150                         15         1         3Нощувка                                             1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
         1         4�0                   BGN17.09.201918.09.20191                           15         1         3Застраховка                                     1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
         1         3�0                   BGN17.09.201918.09.20191                           15         1         3Курортна такса                                1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
         1         1�0                   BGN17.09.201918.09.2019180                         15         1         3Нощувка                                             1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
         1         3�0                   BGN17.09.201918.09.20190.5                         15         1         3Курортна такса                                1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
         1         4�0                   BGN17.09.201918.09.20192                           15         1         3Застраховка                                     1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
         1         1�0                   BGN17.09.201918.09.2019180                         15         1         3Нощувка                                             1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
         1         3�0                   BGN17.09.201918.09.20190.5                         15         1         3Курортна такса                                1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
         1         4�0                   BGN17.09.201918.09.20192                           15         1         3Застраховка                                     1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Здравко Габровски                 0.00                  0         0          
         1         1�0                   BGN17.09.201918.09.2019150                         16         1         4Нощувка                                             1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Евелина Андонова                   0.00                  0         0          
         1         4�0                   BGN17.09.201918.09.20191                           16         1         4Застраховка                                     1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Евелина Андонова                   0.00                  0         0          
         1         3�0                   BGN17.09.201918.09.20191                           16         1         4Курортна такса                                1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Евелина Андонова                   0.00                  0         0          
         1         1�1                   BGN30.12.189918.09.20190                           16         1         4Нощувка                                             1Ползване на стая                    В брой                                                4103                           Администратор на системата                                                  Евелина Андонова                   0.00                  0         0          
         2         1�1                   BGN17.09.201918.09.2019180                         16         1         4Нощувка                                             1Ползване на стая                    С банкова карта                               3201                           Администратор на системата                                                  Евелина Андонова                   180.00                0        28       306
         2         3�1                   BGN17.09.201918.09.20190.5                         16         1         4Курортна такса                                1Ползване на стая                    С банкова карта                               3201                           Администратор на системата                                                  Евелина Андонова                   0.50                  0        28       306
         2         4�1                   BGN17.09.201918.09.20191                           16         1         4Застраховка                                     1Ползване на стая                    С банкова карта                               3201                           Администратор на системата                                                  Евелина Андонова                   1.00                  0        28       306
         2         4�1                   BGN17.09.201918.09.20191                           16         1         4Застраховка                                     1Ползване на стая                    С банкова карта                               4103                           Администратор на системата                                                  Евелина Андонова                   1.00                  0        28       306
         2         3�1                   BGN17.09.201918.09.20191                           16         1         4Курортна такса                                1Ползване на стая                    С банкова карта                               4103                           Администратор на системата                                                  Евелина Андонова                   1.00                  0        28       306
         2         1�1                   BGN17.09.201918.09.2019137                         16         1         4Нощувка                                             1Ползване на стая                    С банкова карта                               0                              Администратор на системата                                                  Евелина Андонова                   137.00                1        28       306
         2         4�1                   BGN17.09.201918.09.20192                           16         1         4Застраховка                                     1Ползване на стая                    С банкова карта                               0                              Администратор на системата                                                  Евелина Андонова                   2.00                  1        28       306
         2         3�1                   BGN17.09.201918.09.20191                           16         1         4Курортна такса                                1Ползване на стая                    С банкова карта                               0                              Администратор на системата                                                  Евелина Андонова                   1.00                  1        28       306
         2         1�-1                  BGN30.12.189918.09.2019137                         16         1         4Нощувка                                             1Ползване на стая                    С банкова карта                               0                              Администратор на системата                                                  Евелина Андонова                   -137.00               2         0          
         2         4�-1                  BGN30.12.189918.09.20192                           16         1         4Застраховка                                     1Ползване на стая                    С банкова карта                               0                              Администратор на системата                                                  Евелина Андонова                   -2.00                 2         0          
         2         3�-1                  BGN30.12.189918.09.20191                           16         1         4Курортна такса                                1Ползване на стая                    С банкова карта                               0                              Администратор на системата                                                  Евелина Андонова                   -1.00                 2         0          
         1         1�0                   BGN18.09.201918.09.2019180                         21         1         7Нощувка                                             1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Емил Чочев                               0.00                  0         0          
         1         3�0                   BGN18.09.201918.09.20190.5                         21         1         7Курортна такса                                1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Емил Чочев                               0.00                  0         0          
         1         4�0                   BGN18.09.201918.09.20192                           21         1         7Застраховка                                     1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Емил Чочев                               0.00                  0         0          
         3         1�1                   BGN30.12.189918.09.2019150                         31         1         6Нощувка                                             1Ползване на стая                    Превод по банкова сметка              9203                           Администратор на системата                                                  Борислав Гуляшки                   150.00                0         0          
         3         4�1                   BGN30.12.189918.09.20191                           31         1         6Застраховка                                     1Ползване на стая                    Превод по банкова сметка              9203                           Администратор на системата                                                  Борислав Гуляшки                   1.00                  0         0          
         3         3�1                   BGN30.12.189918.09.20191                           31         1         6Курортна такса                                1Ползване на стая                    Превод по банкова сметка              9203                           Администратор на системата                                                  Борислав Гуляшки                   1.00                  0         0          
         3         1�1                   BGN30.12.189918.09.2019180                         31         1         6Нощувка                                             1Ползване на стая                    Превод по банкова сметка             12206                           Администратор на системата                                                  Борислав Гуляшки                   180.00                0         0          
         3         3�1                   BGN30.12.189918.09.20190.5                         31         1         6Курортна такса                                1Ползване на стая                    Превод по банкова сметка             12206                           Администратор на системата                                                  Борислав Гуляшки                   0.50                  0         0          
         3         4�1                   BGN30.12.189918.09.20192                           31         1         6Застраховка                                     1Ползване на стая                    Превод по банкова сметка             12206                           Администратор на системата                                                  Борислав Гуляшки                   2.00                  0         0          
         1         1�0                   BGN18.09.201918.09.201970                          47         1        10Нощувка                                             1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Димитър Леванов                     0.00                  0         0          
         1         3�0                   BGN18.09.201918.09.20191                           47         1        10Курортна такса                                1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Димитър Леванов                     0.00                  0         0          
         1         4�0                   BGN18.09.201918.09.20191                           47         1        10Застраховка                                     1Ползване на стая                    В брой                                                0                              Администратор на системата                                                  Димитър Леванов                     0.00                  0         0          
         1         1�1                   BGN18.09.201918.09.201970                          47         1        10Нощувка                                             1Ползване на стая                    В брой                                               14208                           Администратор на системата                                                  Димитър Леванов                     70.00                 0        47       335
         1         3�1                   BGN18.09.201918.09.20191                           47         1        10Курортна такса                                1Ползване на стая                    В брой                                               14208                           Администратор на системата                                                  Димитър Леванов                     1.00                  0        47       335
         1         4�1                   BGN18.09.201918.09.20191                           47         1        10Застраховка                                     1Ползване на стая                    В брой                                               14208                           Администратор на системата                                                  Димитър Леванов                     1.00                  0        47       335
         1         1�1                   BGN18.09.201918.09.2019137                         47         1        10Нощувка                                             1Ползване на стая                    В брой                                               13207                           Администратор на системата                                                  Димитър Леванов                     137.00                0        44       332
         1         4�1                   BGN18.09.201918.09.20192                           47         1        10Застраховка                                     1Ползване на стая                    В брой                                               13207                           Администратор на системата                                                  Димитър Леванов                     2.00                  0        44       332
         1         3�1                   BGN18.09.201918.09.20191                           47         1        10Курортна такса                                1Ползване на стая                    В брой                                               13207                           Администратор на системата                                                  Димитър Леванов                     1.00                  0        44       332
         1         1�1                   BGN30.12.189918.09.20190                           47         1        10Нощувка                                             1Ползване на стая                    В брой                                               13207                           Администратор на системата                                                  Димитър Леванов                     0.00                  0         0          
         1         4�1                   BGN18.09.201918.09.20191                           47         1        10Застраховка                                     1Ползване на стая                    В брой                                               13207                           Администратор на системата                                                  Димитър Леванов                     1.00                  0        45       333
         1         3�1                   BGN18.09.201918.09.20191                           47         1        10Курортна такса                                1Ползване на стая                    В брой                                               13207                           Администратор на системата                                                  Димитър Леванов                     1.00                  0        45       333
BeforeFix.txt (24,432 bytes)
AfterFix.txt (29,618 bytes)
      PWID      ITSID PI                   BR COD PAYDATE    SRDATE                    PRICE     CACCID      MAKER        CID ITNAME                                                    SID SNAME                                              PWNAME                                                    RID RNAME                          Оператор                                                                                             CNAME                                                              SUM1 TUS   ACCDETID       NBON
         1          1 Не                    1 BGN            18.09.2019                  137         15          1          3 Нощувка                                                     1 Ползване на стая                                   В брой                                                      4 103                            Администратор на системата                                                                           Здравко Габровски                                                137.00   0          0           
         1          4 Не                    1 BGN            18.09.2019                    2         15          1          3 Застраховка                                                 1 Ползване на стая                                   В брой                                                      4 103                            Администратор на системата                                                                           Здравко Габровски                                                  2.00   0          0           
         1          3 Не                    1 BGN            18.09.2019                    1         15          1          3 Курортна такса                                              1 Ползване на стая                                   В брой                                                      4 103                            Администратор на системата                                                                           Здравко Габровски                                                  1.00   0          0           
         1          1 Да                    0 BGN 17.09.2019 18.09.2019                  150         15          1          3 Нощувка                                                     1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
         1          4 Да                    0 BGN 17.09.2019 18.09.2019                    1         15          1          3 Застраховка                                                 1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
         1          3 Да                    0 BGN 17.09.2019 18.09.2019                    1         15          1          3 Курортна такса                                              1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
         1          1 Да                    0 BGN 17.09.2019 18.09.2019                  180         15          1          3 Нощувка                                                     1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
         1          3 Да                    0 BGN 17.09.2019 18.09.2019                  0.5         15          1          3 Курортна такса                                              1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
         1          4 Да                    0 BGN 17.09.2019 18.09.2019                    2         15          1          3 Застраховка                                                 1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
         1          1 Да                    0 BGN 17.09.2019 18.09.2019                  180         15          1          3 Нощувка                                                     1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
         1          3 Да                    0 BGN 17.09.2019 18.09.2019                  0.5         15          1          3 Курортна такса                                              1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
         1          4 Да                    0 BGN 17.09.2019 18.09.2019                    2         15          1          3 Застраховка                                                 1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Здравко Габровски                                                  0.00   0          0           
         1          1 Да                    0 BGN 17.09.2019 18.09.2019                  150         16          1          4 Нощувка                                                     1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Евелина Андонова                                                   0.00   0          0           
         1          4 Да                    0 BGN 17.09.2019 18.09.2019                    1         16          1          4 Застраховка                                                 1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Евелина Андонова                                                   0.00   0          0           
         1          3 Да                    0 BGN 17.09.2019 18.09.2019                    1         16          1          4 Курортна такса                                              1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Евелина Андонова                                                   0.00   0          0           
         1          1 Не                    1 BGN            18.09.2019                    0         16          1          4 Нощувка                                                     1 Ползване на стая                                   В брой                                                      4 103                            Администратор на системата                                                                           Евелина Андонова                                                   0.00   0          0           
         2          1 Да                    1 BGN 17.09.2019 18.09.2019                  180         16          1          4 Нощувка                                                     1 Ползване на стая                                   С банкова карта                                             3 201                            Администратор на системата                                                                           Евелина Андонова                                                 180.00   0         28        306
         2          3 Да                    1 BGN 17.09.2019 18.09.2019                  0.5         16          1          4 Курортна такса                                              1 Ползване на стая                                   С банкова карта                                             3 201                            Администратор на системата                                                                           Евелина Андонова                                                   0.50   0         28        306
         2          4 Да                    1 BGN 17.09.2019 18.09.2019                    1         16          1          4 Застраховка                                                 1 Ползване на стая                                   С банкова карта                                             3 201                            Администратор на системата                                                                           Евелина Андонова                                                   1.00   0         28        306
         2          4 Да                    1 BGN 17.09.2019 18.09.2019                    1         16          1          4 Застраховка                                                 1 Ползване на стая                                   С банкова карта                                             4 103                            Администратор на системата                                                                           Евелина Андонова                                                   1.00   0         28        306
         2          3 Да                    1 BGN 17.09.2019 18.09.2019                    1         16          1          4 Курортна такса                                              1 Ползване на стая                                   С банкова карта                                             4 103                            Администратор на системата                                                                           Евелина Андонова                                                   1.00   0         28        306
         2          1 Да                    1 BGN 17.09.2019 18.09.2019                  137         16          1          4 Нощувка                                                     1 Ползване на стая                                   С банкова карта                                             0                                Администратор на системата                                                                           Евелина Андонова                                                 137.00   1         28        306
         2          4 Да                    1 BGN 17.09.2019 18.09.2019                    2         16          1          4 Застраховка                                                 1 Ползване на стая                                   С банкова карта                                             0                                Администратор на системата                                                                           Евелина Андонова                                                   2.00   1         28        306
         2          3 Да                    1 BGN 17.09.2019 18.09.2019                    1         16          1          4 Курортна такса                                              1 Ползване на стая                                   С банкова карта                                             0                                Администратор на системата                                                                           Евелина Андонова                                                   1.00   1         28        306
         2          1 Не                   -1 BGN            18.09.2019                  137         16          1          4 Нощувка                                                     1 Ползване на стая                                   С банкова карта                                             0                                Администратор на системата                                                                           Евелина Андонова                                                -137.00   2          0           
         2          4 Не                   -1 BGN            18.09.2019                    2         16          1          4 Застраховка                                                 1 Ползване на стая                                   С банкова карта                                             0                                Администратор на системата                                                                           Евелина Андонова                                                  -2.00   2          0           
         2          3 Не                   -1 BGN            18.09.2019                    1         16          1          4 Курортна такса                                              1 Ползване на стая                                   С банкова карта                                             0                                Администратор на системата                                                                           Евелина Андонова                                                  -1.00   2          0           
         1          1 Да                    0 BGN 18.09.2019 18.09.2019                  180         21          1          7 Нощувка                                                     1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Емил Чочев                                                         0.00   0          0           
         1          3 Да                    0 BGN 18.09.2019 18.09.2019                  0.5         21          1          7 Курортна такса                                              1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Емил Чочев                                                         0.00   0          0           
         1          4 Да                    0 BGN 18.09.2019 18.09.2019                    2         21          1          7 Застраховка                                                 1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Емил Чочев                                                         0.00   0          0           
         3          1 Не                    1 BGN            18.09.2019                  150         31          1          6 Нощувка                                                     1 Ползване на стая                                   Превод по банкова сметка                                    9 203                            Администратор на системата                                                                           Борислав Гуляшки                                                 150.00   0          0           
         3          4 Не                    1 BGN            18.09.2019                    1         31          1          6 Застраховка                                                 1 Ползване на стая                                   Превод по банкова сметка                                    9 203                            Администратор на системата                                                                           Борислав Гуляшки                                                   1.00   0          0           
         3          3 Не                    1 BGN            18.09.2019                    1         31          1          6 Курортна такса                                              1 Ползване на стая                                   Превод по банкова сметка                                    9 203                            Администратор на системата                                                                           Борислав Гуляшки                                                   1.00   0          0           
         3          1 Не                    1 BGN            18.09.2019                  180         31          1          6 Нощувка                                                     1 Ползване на стая                                   Превод по банкова сметка                                   12 206                            Администратор на системата                                                                           Борислав Гуляшки                                                 180.00   0          0           
         3          3 Не                    1 BGN            18.09.2019                  0.5         31          1          6 Курортна такса                                              1 Ползване на стая                                   Превод по банкова сметка                                   12 206                            Администратор на системата                                                                           Борислав Гуляшки                                                   0.50   0          0           
         3          4 Не                    1 BGN            18.09.2019                    2         31          1          6 Застраховка                                                 1 Ползване на стая                                   Превод по банкова сметка                                   12 206                            Администратор на системата                                                                           Борислав Гуляшки                                                   2.00   0          0           
         1          1 Да                    0 BGN 18.09.2019 18.09.2019                   70         47          1         10 Нощувка                                                     1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Димитър Леванов                                                    0.00   0          0           
         1          3 Да                    0 BGN 18.09.2019 18.09.2019                    1         47          1         10 Курортна такса                                              1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Димитър Леванов                                                    0.00   0          0           
         1          4 Да                    0 BGN 18.09.2019 18.09.2019                    1         47          1         10 Застраховка                                                 1 Ползване на стая                                   В брой                                                      0                                Администратор на системата                                                                           Димитър Леванов                                                    0.00   0          0           
         1          1 Да                    1 BGN 18.09.2019 18.09.2019                   70         47          1         10 Нощувка                                                     1 Ползване на стая                                   В брой                                                     14 208                            Администратор на системата                                                                           Димитър Леванов                                                   70.00   0         47        335
         1          3 Да                    1 BGN 18.09.2019 18.09.2019                    1         47          1         10 Курортна такса                                              1 Ползване на стая                                   В брой                                                     14 208                            Администратор на системата                                                                           Димитър Леванов                                                    1.00   0         47        335
         1          4 Да                    1 BGN 18.09.2019 18.09.2019                    1         47          1         10 Застраховка                                                 1 Ползване на стая                                   В брой                                                     14 208                            Администратор на системата                                                                           Димитър Леванов                                                    1.00   0         47        335
         1          1 Да                    1 BGN 18.09.2019 18.09.2019                  137         47          1         10 Нощувка                                                     1 Ползване на стая                                   В брой                                                     13 207                            Администратор на системата                                                                           Димитър Леванов                                                  137.00   0         44        332
         1          4 Да                    1 BGN 18.09.2019 18.09.2019                    2         47          1         10 Застраховка                                                 1 Ползване на стая                                   В брой                                                     13 207                            Администратор на системата                                                                           Димитър Леванов                                                    2.00   0         44        332
         1          3 Да                    1 BGN 18.09.2019 18.09.2019                    1         47          1         10 Курортна такса                                              1 Ползване на стая                                   В брой                                                     13 207                            Администратор на системата                                                                           Димитър Леванов                                                    1.00   0         44        332
         1          1 Да                    1 BGN            18.09.2019                    0         47          1         10 Нощувка                                                     1 Ползване на стая                                   В брой                                                     13 207                            Администратор на системата                                                                           Димитър Леванов                                                    0.00   0          0           
         1          4 Да                    1 BGN 18.09.2019 18.09.2019                    1         47          1         10 Застраховка                                                 1 Ползване на стая                                   В брой                                                     13 207                            Администратор на системата                                                                           Димитър Леванов                                                    1.00   0         45        333
         1          3 Да                    1 BGN 18.09.2019 18.09.2019                    1         47          1         10 Курортна такса                                              1 Ползване на стая                                   В брой                                                     13 207                            Администратор на системата                                                                           Димитър Леванов                                                    1.00   0         45        333
AfterFix.txt (29,618 bytes)

Marco van de Voort

2019-11-13 17:26

manager   ~0119272

You can't arbitrarily use UTF8 functions for a class that is specified as a generic string type. String might not be utf8

Zdravko Gabrovski

2019-11-13 17:56

reporter   ~0119273

I am sorry, but you are no right here.
Even now, the basic class TCustomDatasetExporter uses UTF8 string as a result of export of field data.
Please, check Function TCustomDatasetExporter.FormatField(F: TField) : UTF8String; <---------------------- in unit fpDBExport.
Through this function comes all field exports for all the inherited classes.
This fact proves, that all the exporters using UTF8 strings, it works perfect in TCSVExport and TTexExport, because in those two exporters there is no string manipulation code.
But here in the FixedText exporter this method Export field adjusts the text with copy string handliing functions (Copy and delete) and this not handle UTF8 string properly.
It works perfect if there is no unicode symbols in the string, because standart functions as Length, Copy and Delete will work OK, in the string contains only single-byte charactes.
But, for example - If you using some Cyrillic symbols function Lenght will return the physical size of the string of bytes instead of correct length of characters, which will return UTF8Lenght.
The same with UTF8copy and copy and UTF8Delete and Delete.

Michael Van Canneyt

2019-11-14 11:07

administrator   ~0119292

@Zdravko, UTF-8 *is* unicode, so you do need unicode support. UTF-8 is just an encoding of unicode characters.

I agree that the implementation with copy, length is wrong for UTF8 encoded characters (!)

But before we fix something: we must define what we mean with 'fixed length' format.
- Is this a fixed length in bytes.
- or is it a fixed length in characters.
because for UTF8 these are not the same (that's why there is a bug, after all). The solution of the problem depends on how we define fixed-length.

I am inclined to think that fixed-length means fixed-length in bytes, because that is the whole point of a fixed length format:
all lines will have equal length in bytes, for fast extraction of data. This feature of fixed-length is lost in UTF-8.

wp

2019-11-14 11:35

reporter   ~0119293

When you look at csv, the other type of text data files, you'll see that they are very difficult to read because column positions are not aligned. A reason to use fixed-length format is that they have the columns aligned. Therefore I think the term "fixed length" can only be understood in units of characters, not bytes. Although the term "character" in UTF8 has some kind of diffuse meaning...

In general, I think fixed-.length files are a relic of ANSI code pages where every character is 1 byte.

Suppose someone has an old CP1252 fixed-length file, uses some tool to convert it to UTF8 and reads it in Lazarus - it will be broken.

Maybe the schema concept should be generalized in a way that negative values are used for the byte-width of columns, while the character-width is given by positive values.

Michael Van Canneyt

2019-11-14 11:57

administrator   ~0119296

I agree that fixed length is a relic, but unfortunately still widely used.
(as far as I can see codepage is simply ignored in places where I came across it)

 I would simply add a WriteMode or Mode property:
- wmAnsi (as ansistring)
- wmUTF8 (as UTF8-String, using fixed character length)
- wmUTF16 (as UTF-16)
I don't think you will use different formats depending on the field.
It's theoretically possible but in practice most likely never used.

wp

2019-11-14 12:13

reporter   ~0119298

Why "Write"Mode? It is needed also for reading --> "Mode" is better.

Michael Van Canneyt

2019-11-14 13:24

administrator   ~0119301

No reading is done. We're talking about the exporter components.

Zdravko Gabrovski

2019-11-14 13:42

reporter   ~0119302

Last edited: 2019-11-14 17:40

View 3 revisions

@Michael
Sorry it if my fault. I know that Utf8 is unicode.
 I meant "unicodestring", when I wrote "unicode" :)

For me field length must be in characters not in bytes.

Zdravko Gabrovski

2019-11-14 13:45

reporter   ~0119303

Yes I always mean fixed length export
But also I fix a case that export wrong value for date and datetime fields with defined masks in format settings which is for all kinds of export please check fpdbexport different.

wp

2019-11-14 17:03

reporter   ~0119304

@Michael:
> No reading is done. We're talking about the exporter components.

Sorry. But my comment was meant in a more general sense: Doesn't TFixedFormatDataset have the same issue?

Michael Van Canneyt

2019-11-15 12:27

administrator   ~0119313

I added a CharMode : TCharMode = (cmANSI,cmUTF8,cmUTF16);

The meaning is as desribed in the comments. I added a test, it produces the correct results in both cases UTF8 and UTF16.

As for fixes in null handling, I added a HandeNullField property to the formatsettings. when set to True,
this will simply check for Null fields and return an empty string. (as opposed to 0, fase, and whatnot)

If the setting is false, then it will still check when doing custom formatting.

I changed the alignment so float fields are also aligned right by default.

Please test and close if OK.

Zdravko Gabrovski

2019-11-17 10:18

reporter   ~0119351

There is a problem with this implementation.

1. You remove all the export options in TFixedLenghExport, except the new one "Char mode". Now exists only new option Char Mode. The Bug comes from line 0000029, You put
 TFixedExportFormatSettings = Class (TCustomExportFormatSettings)
it must be a
FixedExportFormatSettings = Class(TExportFormatSettings)

2.
Still have a problem wit a boolean fields with pre-defined values for true and false; Still display only first symbol.
To fix this, I add into procedure TCustomFixedLengthExporter.BuildDefaultFieldMap(AMap: TExportFields);

Code
  F:=Dataset.Fields[i];
    W:= FieldWidths[F.DataType];

    if F.DataType = ftBoolean then <--------------------
      W := Max( UTF8Length( TExportFormatSettings( FormatSettings).BooleanTrue ), UTF8Length( TExportFormatSettings( FormatSettings).BooleanFalse ) ); <------------------

   With this code it will handle boolean predefined values with a right lenght instead of length "1" which is by default for boolean type.
I am using UTF8Lenght because this will return correct lenght in characters, not in bytes.
3.
You did not implement a fix for export a DataRowHeader, that I did.

Procedure DoDataHeader; override;

Still have no option to export headers. The only way is to insert as a fictive record with a headers before the data.
All other export components have an opition to export a headers.
3.
I implement a one more space to separate a columns,
  if FCurrentRow <> '' then
    S := ' ' + S;
In export row. This will be better to be a option "SeparationBetweenRows".




Zdravko Gabrovski

2019-11-17 10:40

reporter   ~0119352

You can still compare the results after all the bugfixes that I did and the result now.

Zdravko Gabrovski

2019-11-17 10:45

reporter   ~0119354

Here is the file "AfterNewFix.txt" Please compare it with file "AfterFix.txt" Which I provided before.
You will seee the difference: There is no header, there is no space separator between the columnts, and the export of the predefined boolean fields contains only first letter "Д" from "Да" which means "yes" on bulgarian and "Н" from "Не" which means "No", field "PI".
Only UTF8 export is OK.

AfterNewFix.txt (27,926 bytes)
         1         1Н                   1BGN          18.09.2019                 137        15         1         3Нощувка                                                    1Ползване на стая                                  В брой                                                     4103                           Администратор на системата                                                                          Здравко Габровски                                               137.00  0         0          
         1         4Н                   1BGN          18.09.2019                   2        15         1         3Застраховка                                                1Ползване на стая                                  В брой                                                     4103                           Администратор на системата                                                                          Здравко Габровски                                                 2.00  0         0          
         1         3Н                   1BGN          18.09.2019                   1        15         1         3Курортна такса                                             1Ползване на стая                                  В брой                                                     4103                           Администратор на системата                                                                          Здравко Габровски                                                 1.00  0         0          
         1         1Д                   0BGN17.09.201918.09.2019                 150        15         1         3Нощувка                                                    1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
         1         4Д                   0BGN17.09.201918.09.2019                   1        15         1         3Застраховка                                                1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
         1         3Д                   0BGN17.09.201918.09.2019                   1        15         1         3Курортна такса                                             1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
         1         1Д                   0BGN17.09.201918.09.2019                 180        15         1         3Нощувка                                                    1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
         1         3Д                   0BGN17.09.201918.09.2019                 0.5        15         1         3Курортна такса                                             1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
         1         4Д                   0BGN17.09.201918.09.2019                   2        15         1         3Застраховка                                                1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
         1         1Д                   0BGN17.09.201918.09.2019                 180        15         1         3Нощувка                                                    1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
         1         3Д                   0BGN17.09.201918.09.2019                 0.5        15         1         3Курортна такса                                             1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
         1         4Д                   0BGN17.09.201918.09.2019                   2        15         1         3Застраховка                                                1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Здравко Габровски                                                 0.00  0         0          
         1         1Д                   0BGN17.09.201918.09.2019                 150        16         1         4Нощувка                                                    1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Евелина Андонова                                                  0.00  0         0          
         1         4Д                   0BGN17.09.201918.09.2019                   1        16         1         4Застраховка                                                1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Евелина Андонова                                                  0.00  0         0          
         1         3Д                   0BGN17.09.201918.09.2019                   1        16         1         4Курортна такса                                             1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Евелина Андонова                                                  0.00  0         0          
         1         1Н                   1BGN          18.09.2019                   0        16         1         4Нощувка                                                    1Ползване на стая                                  В брой                                                     4103                           Администратор на системата                                                                          Евелина Андонова                                                  0.00  0         0          
         2         1Д                   1BGN17.09.201918.09.2019                 180        16         1         4Нощувка                                                    1Ползване на стая                                  С банкова карта                                            3201                           Администратор на системата                                                                          Евелина Андонова                                                180.00  0        28       306
         2         3Д                   1BGN17.09.201918.09.2019                 0.5        16         1         4Курортна такса                                             1Ползване на стая                                  С банкова карта                                            3201                           Администратор на системата                                                                          Евелина Андонова                                                  0.50  0        28       306
         2         4Д                   1BGN17.09.201918.09.2019                   1        16         1         4Застраховка                                                1Ползване на стая                                  С банкова карта                                            3201                           Администратор на системата                                                                          Евелина Андонова                                                  1.00  0        28       306
         2         4Д                   1BGN17.09.201918.09.2019                   1        16         1         4Застраховка                                                1Ползване на стая                                  С банкова карта                                            4103                           Администратор на системата                                                                          Евелина Андонова                                                  1.00  0        28       306
         2         3Д                   1BGN17.09.201918.09.2019                   1        16         1         4Курортна такса                                             1Ползване на стая                                  С банкова карта                                            4103                           Администратор на системата                                                                          Евелина Андонова                                                  1.00  0        28       306
         2         1Д                   1BGN17.09.201918.09.2019                 137        16         1         4Нощувка                                                    1Ползване на стая                                  С банкова карта                                            0                              Администратор на системата                                                                          Евелина Андонова                                                137.00  1        28       306
         2         4Д                   1BGN17.09.201918.09.2019                   2        16         1         4Застраховка                                                1Ползване на стая                                  С банкова карта                                            0                              Администратор на системата                                                                          Евелина Андонова                                                  2.00  1        28       306
         2         3Д                   1BGN17.09.201918.09.2019                   1        16         1         4Курортна такса                                             1Ползване на стая                                  С банкова карта                                            0                              Администратор на системата                                                                          Евелина Андонова                                                  1.00  1        28       306
         2         1Н                  -1BGN          18.09.2019                 137        16         1         4Нощувка                                                    1Ползване на стая                                  С банкова карта                                            0                              Администратор на системата                                                                          Евелина Андонова                                               -137.00  2         0          
         2         4Н                  -1BGN          18.09.2019                   2        16         1         4Застраховка                                                1Ползване на стая                                  С банкова карта                                            0                              Администратор на системата                                                                          Евелина Андонова                                                 -2.00  2         0          
         2         3Н                  -1BGN          18.09.2019                   1        16         1         4Курортна такса                                             1Ползване на стая                                  С банкова карта                                            0                              Администратор на системата                                                                          Евелина Андонова                                                 -1.00  2         0          
         1         1Д                   0BGN18.09.201918.09.2019                 180        21         1         7Нощувка                                                    1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Емил Чочев                                                        0.00  0         0          
         1         3Д                   0BGN18.09.201918.09.2019                 0.5        21         1         7Курортна такса                                             1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Емил Чочев                                                        0.00  0         0          
         1         4Д                   0BGN18.09.201918.09.2019                   2        21         1         7Застраховка                                                1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Емил Чочев                                                        0.00  0         0          
         3         1Н                   1BGN          18.09.2019                 150        31         1         6Нощувка                                                    1Ползване на стая                                  Превод по банкова сметка                                   9203                           Администратор на системата                                                                          Борислав Гуляшки                                                150.00  0         0          
         3         4Н                   1BGN          18.09.2019                   1        31         1         6Застраховка                                                1Ползване на стая                                  Превод по банкова сметка                                   9203                           Администратор на системата                                                                          Борислав Гуляшки                                                  1.00  0         0          
         3         3Н                   1BGN          18.09.2019                   1        31         1         6Курортна такса                                             1Ползване на стая                                  Превод по банкова сметка                                   9203                           Администратор на системата                                                                          Борислав Гуляшки                                                  1.00  0         0          
         3         1Н                   1BGN          18.09.2019                 180        31         1         6Нощувка                                                    1Ползване на стая                                  Превод по банкова сметка                                  12206                           Администратор на системата                                                                          Борислав Гуляшки                                                180.00  0         0          
         3         3Н                   1BGN          18.09.2019                 0.5        31         1         6Курортна такса                                             1Ползване на стая                                  Превод по банкова сметка                                  12206                           Администратор на системата                                                                          Борислав Гуляшки                                                  0.50  0         0          
         3         4Н                   1BGN          18.09.2019                   2        31         1         6Застраховка                                                1Ползване на стая                                  Превод по банкова сметка                                  12206                           Администратор на системата                                                                          Борислав Гуляшки                                                  2.00  0         0          
         1         1Д                   0BGN18.09.201918.09.2019                  70        47         1        10Нощувка                                                    1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Димитър Леванов                                                   0.00  0         0          
         1         3Д                   0BGN18.09.201918.09.2019                   1        47         1        10Курортна такса                                             1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Димитър Леванов                                                   0.00  0         0          
         1         4Д                   0BGN18.09.201918.09.2019                   1        47         1        10Застраховка                                                1Ползване на стая                                  В брой                                                     0                              Администратор на системата                                                                          Димитър Леванов                                                   0.00  0         0          
         1         1Д                   1BGN18.09.201918.09.2019                  70        47         1        10Нощувка                                                    1Ползване на стая                                  В брой                                                    14208                           Администратор на системата                                                                          Димитър Леванов                                                  70.00  0        47       335
         1         3Д                   1BGN18.09.201918.09.2019                   1        47         1        10Курортна такса                                             1Ползване на стая                                  В брой                                                    14208                           Администратор на системата                                                                          Димитър Леванов                                                   1.00  0        47       335
         1         4Д                   1BGN18.09.201918.09.2019                   1        47         1        10Застраховка                                                1Ползване на стая                                  В брой                                                    14208                           Администратор на системата                                                                          Димитър Леванов                                                   1.00  0        47       335
         1         1Д                   1BGN18.09.201918.09.2019                 137        47         1        10Нощувка                                                    1Ползване на стая                                  В брой                                                    13207                           Администратор на системата                                                                          Димитър Леванов                                                 137.00  0        44       332
         1         4Д                   1BGN18.09.201918.09.2019                   2        47         1        10Застраховка                                                1Ползване на стая                                  В брой                                                    13207                           Администратор на системата                                                                          Димитър Леванов                                                   2.00  0        44       332
         1         3Д                   1BGN18.09.201918.09.2019                   1        47         1        10Курортна такса                                             1Ползване на стая                                  В брой                                                    13207                           Администратор на системата                                                                          Димитър Леванов                                                   1.00  0        44       332
         1         1Д                   1BGN          18.09.2019                   0        47         1        10Нощувка                                                    1Ползване на стая                                  В брой                                                    13207                           Администратор на системата                                                                          Димитър Леванов                                                   0.00  0         0          
         1         4Д                   1BGN18.09.201918.09.2019                   1        47         1        10Застраховка                                                1Ползване на стая                                  В брой                                                    13207                           Администратор на системата                                                                          Димитър Леванов                                                   1.00  0        45       333
         1         3Д                   1BGN18.09.201918.09.2019                   1        47         1        10Курортна такса                                             1Ползване на стая                                  В брой                                                    13207                           Администратор на системата                                                                          Димитър Леванов                                                   1.00  0        45       333
AfterNewFix.txt (27,926 bytes)

Michael Van Canneyt

2019-11-17 11:19

administrator   ~0119357

The missing options thing is fixed, still working on the rest.

Michael Van Canneyt

2019-11-22 16:16

administrator   ~0119433

Resolved all issues. The format settings have 2 extra fields:

    // Whether or not the file should have a header row with field names
    Property HeaderRow : Boolean Read FHeaderRow Write FHeaderRow default true;
    // How to handle Unicode ?
    Property CharMode : TCharMode Read FCharMode Write FCharMode;
    // Number of separator spaces between columns. Default 0.
    Property ColumnSeparatorSpaceCount : Integer Read FColumnSeparatorSpaceCount Write FColumnSeparatorSpaceCount;

I opted for a count, this is more flexible.

Zdravko Gabrovski

2019-11-25 14:30

reporter   ~0119489

Works perfect, many thanks for the cooperation!

Issue History

Date Modified Username Field Change
2019-11-13 00:01 Zdravko Gabrovski New Issue
2019-11-13 00:01 Zdravko Gabrovski File Added: fpdbexport.pp
2019-11-13 00:01 Zdravko Gabrovski File Added: fpfixedexport.pp
2019-11-13 00:01 Zdravko Gabrovski File Added: export.diff
2019-11-13 08:09 Michael Van Canneyt Assigned To => Michael Van Canneyt
2019-11-13 08:09 Michael Van Canneyt Status new => feedback
2019-11-13 08:09 Michael Van Canneyt FPCTarget => -
2019-11-13 08:09 Michael Van Canneyt Note Added: 0119258
2019-11-13 08:29 Zdravko Gabrovski File Added: BeforeFix.txt
2019-11-13 08:29 Zdravko Gabrovski File Added: AfterFix.txt
2019-11-13 08:29 Zdravko Gabrovski Note Added: 0119259
2019-11-13 08:29 Zdravko Gabrovski Status feedback => assigned
2019-11-13 17:26 Marco van de Voort Note Added: 0119272
2019-11-13 17:56 Zdravko Gabrovski Note Added: 0119273
2019-11-14 11:07 Michael Van Canneyt Status assigned => feedback
2019-11-14 11:07 Michael Van Canneyt Note Added: 0119292
2019-11-14 11:35 wp Note Added: 0119293
2019-11-14 11:57 Michael Van Canneyt Note Added: 0119296
2019-11-14 12:13 wp Note Added: 0119298
2019-11-14 13:24 Michael Van Canneyt Note Added: 0119301
2019-11-14 13:42 Zdravko Gabrovski Note Added: 0119302
2019-11-14 13:42 Zdravko Gabrovski Status feedback => assigned
2019-11-14 13:45 Zdravko Gabrovski Note Added: 0119303
2019-11-14 17:03 wp Note Added: 0119304
2019-11-14 17:38 Zdravko Gabrovski Note Edited: 0119302 View Revisions
2019-11-14 17:40 Zdravko Gabrovski Note Edited: 0119302 View Revisions
2019-11-15 12:27 Michael Van Canneyt Status assigned => resolved
2019-11-15 12:27 Michael Van Canneyt Resolution open => fixed
2019-11-15 12:27 Michael Van Canneyt Fixed in Version => 3.3.1
2019-11-15 12:27 Michael Van Canneyt Fixed in Revision => 43467
2019-11-15 12:27 Michael Van Canneyt FPCTarget - => 3.2.0
2019-11-15 12:27 Michael Van Canneyt Note Added: 0119313
2019-11-17 10:18 Zdravko Gabrovski Status resolved => feedback
2019-11-17 10:18 Zdravko Gabrovski Resolution fixed => reopened
2019-11-17 10:18 Zdravko Gabrovski Note Added: 0119351
2019-11-17 10:40 Zdravko Gabrovski Note Added: 0119352
2019-11-17 10:40 Zdravko Gabrovski Status feedback => assigned
2019-11-17 10:45 Zdravko Gabrovski File Added: AfterNewFix.txt
2019-11-17 10:45 Zdravko Gabrovski Note Added: 0119354
2019-11-17 11:19 Michael Van Canneyt Note Added: 0119357
2019-11-22 16:16 Michael Van Canneyt Status assigned => resolved
2019-11-22 16:16 Michael Van Canneyt Resolution reopened => fixed
2019-11-22 16:16 Michael Van Canneyt Fixed in Revision 43467 => 46743558.
2019-11-22 16:16 Michael Van Canneyt Note Added: 0119433
2019-11-25 14:30 Zdravko Gabrovski Status resolved => closed
2019-11-25 14:30 Zdravko Gabrovski Note Added: 0119489