mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-26 09:29:09 +02:00
* Testcase for DBF export
git-svn-id: trunk@18986 -
This commit is contained in:
parent
aa4ab64ea5
commit
3cc6ac9e3b
3
.gitattributes
vendored
3
.gitattributes
vendored
@ -1978,6 +1978,9 @@ packages/fcl-db/tests/README.txt svneol=native#text/plain
|
||||
packages/fcl-db/tests/XMLXSDExportTest.lpi svneol=native#text/plain
|
||||
packages/fcl-db/tests/XMLXSDExportTest.lpr svneol=native#text/plain
|
||||
packages/fcl-db/tests/database.ini.txt svneol=native#text/plain
|
||||
packages/fcl-db/tests/dbfexporttest.lpi svneol=native#text/plain
|
||||
packages/fcl-db/tests/dbfexporttest.lpr svneol=native#text/plain
|
||||
packages/fcl-db/tests/dbfexporttestcase1.pas svneol=native#text/plain
|
||||
packages/fcl-db/tests/dbftoolsunit.pas svneol=native#text/plain
|
||||
packages/fcl-db/tests/dbtestframework.pas svneol=native#text/plain
|
||||
packages/fcl-db/tests/memdstoolsunit.pas svneol=native#text/plain
|
||||
|
113
packages/fcl-db/tests/dbfexporttest.lpi
Normal file
113
packages/fcl-db/tests/dbfexporttest.lpi
Normal file
@ -0,0 +1,113 @@
|
||||
<?xml version="1.0"?>
|
||||
<CONFIG>
|
||||
<ProjectOptions>
|
||||
<Version Value="9"/>
|
||||
<PathDelim Value="\"/>
|
||||
<General>
|
||||
<Flags>
|
||||
<SaveOnlyProjectUnits Value="True"/>
|
||||
</Flags>
|
||||
<SessionStorage Value="InProjectDir"/>
|
||||
<MainUnit Value="0"/>
|
||||
<Title Value="dbfexporttest"/>
|
||||
<ResourceType Value="res"/>
|
||||
</General>
|
||||
<i18n>
|
||||
<EnableI18N LFM="False"/>
|
||||
</i18n>
|
||||
<VersionInfo>
|
||||
<StringTable ProductVersion=""/>
|
||||
</VersionInfo>
|
||||
<BuildModes Count="2">
|
||||
<Item1 Name="Default" Default="True"/>
|
||||
<Item2 Name="Debug">
|
||||
<CompilerOptions>
|
||||
<Version Value="10"/>
|
||||
<PathDelim Value="\"/>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir)"/>
|
||||
</SearchPaths>
|
||||
<CodeGeneration>
|
||||
<Checks>
|
||||
<IOChecks Value="True"/>
|
||||
<RangeChecks Value="True"/>
|
||||
<OverflowChecks Value="True"/>
|
||||
<StackChecks Value="True"/>
|
||||
</Checks>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<GenerateDebugInfo Value="True"/>
|
||||
<GenerateDwarf Value="True"/>
|
||||
<UseHeaptrc Value="True"/>
|
||||
</Debugging>
|
||||
</Linking>
|
||||
<Other>
|
||||
<CompilerMessages>
|
||||
<UseMsgFile Value="True"/>
|
||||
</CompilerMessages>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
</Other>
|
||||
</CompilerOptions>
|
||||
</Item2>
|
||||
</BuildModes>
|
||||
<PublishOptions>
|
||||
<Version Value="2"/>
|
||||
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
|
||||
<ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
|
||||
</PublishOptions>
|
||||
<RunParams>
|
||||
<local>
|
||||
<FormatVersion Value="1"/>
|
||||
<CommandLineParams Value="-a --format=plain"/>
|
||||
<LaunchingApplication PathPlusParams="\usr\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
|
||||
</local>
|
||||
</RunParams>
|
||||
<RequiredPackages Count="2">
|
||||
<Item1>
|
||||
<PackageName Value="FPCUnitConsoleRunner"/>
|
||||
</Item1>
|
||||
<Item2>
|
||||
<PackageName Value="FCL"/>
|
||||
</Item2>
|
||||
</RequiredPackages>
|
||||
<Units Count="2">
|
||||
<Unit0>
|
||||
<Filename Value="dbfexporttest.lpr"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="dbfexporttest"/>
|
||||
</Unit0>
|
||||
<Unit1>
|
||||
<Filename Value="dbfexporttestcase1.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="dbfexporttestcase1"/>
|
||||
</Unit1>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
<Version Value="10"/>
|
||||
<PathDelim Value="\"/>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir)"/>
|
||||
</SearchPaths>
|
||||
<Other>
|
||||
<CompilerMessages>
|
||||
<UseMsgFile Value="True"/>
|
||||
</CompilerMessages>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
</Other>
|
||||
</CompilerOptions>
|
||||
<Debugging>
|
||||
<Exceptions Count="3">
|
||||
<Item1>
|
||||
<Name Value="EAbort"/>
|
||||
</Item1>
|
||||
<Item2>
|
||||
<Name Value="ECodetoolError"/>
|
||||
</Item2>
|
||||
<Item3>
|
||||
<Name Value="EFOpenError"/>
|
||||
</Item3>
|
||||
</Exceptions>
|
||||
</Debugging>
|
||||
</CONFIG>
|
28
packages/fcl-db/tests/dbfexporttest.lpr
Normal file
28
packages/fcl-db/tests/dbfexporttest.lpr
Normal file
@ -0,0 +1,28 @@
|
||||
program dbfexporttest;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
uses
|
||||
Classes,
|
||||
consoletestrunner,
|
||||
dbfexporttestcase1;
|
||||
|
||||
type
|
||||
|
||||
{ TLazTestRunner }
|
||||
|
||||
TMyTestRunner = class(TTestRunner)
|
||||
protected
|
||||
// override the protected methods of TTestRunner to customize its behavior
|
||||
end;
|
||||
|
||||
var
|
||||
Application: TMyTestRunner;
|
||||
|
||||
begin
|
||||
Application := TMyTestRunner.Create(nil);
|
||||
Application.Initialize;
|
||||
Application.Run;
|
||||
Application.Free;
|
||||
end.
|
||||
|
600
packages/fcl-db/tests/dbfexporttestcase1.pas
Normal file
600
packages/fcl-db/tests/dbfexporttestcase1.pas
Normal file
@ -0,0 +1,600 @@
|
||||
unit dbfexporttestcase1;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, Fpcunit, Testutils, Testregistry, DB, fpdbfexport,
|
||||
BufDataset, dateutils;
|
||||
|
||||
type
|
||||
|
||||
{ TTestDBFExport1 }
|
||||
|
||||
TTestDBFExport1 = class(Ttestcase)
|
||||
const
|
||||
KeepFilesAfterTest = false;
|
||||
//Change if you want to keep export files for further testing
|
||||
private
|
||||
procedure FillTestData;
|
||||
protected
|
||||
FTestDataset: TBufDataset;
|
||||
FExportTempDir: string; //where we store exported files in these tests
|
||||
procedure FillRecord(const RowNumber: integer; const Teststring: string;
|
||||
const TestGUID: string; const TestInteger: integer;
|
||||
const TestExtended: extended; const TestDatetime: Tdatetime;
|
||||
const TestBoolean: boolean);
|
||||
procedure Setup; override;
|
||||
procedure Teardown; override;
|
||||
published
|
||||
procedure TestDBExportRuns;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
function FileSize(FileName: string): integer;
|
||||
// LCL has similar function, but we don't want to depend on that.
|
||||
var
|
||||
SearchResult: TSearchRec;
|
||||
begin
|
||||
Result := 0;
|
||||
if FindFirst(FileName, faAnyFile, SearchResult) = 0 then
|
||||
begin
|
||||
try
|
||||
Result := SearchResult.Size;
|
||||
finally
|
||||
FindClose(SearchResult);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestDBFExport1.TestDBExportRuns;
|
||||
|
||||
var
|
||||
Export: TFPDBFExport;
|
||||
ExportSettings: TDBFExportFormatSettings;
|
||||
NumberExported: integer;
|
||||
begin
|
||||
Export := TFPDBFExport.Create(nil);
|
||||
ExportSettings:=TDBFExportFormatSettings.Create(true);
|
||||
try
|
||||
//Don't override decimal separator
|
||||
ExportSettings.TableFormat:=tfDBaseVII; //dbase IV seems to have a 10 character field name limit
|
||||
Export.FormatSettings:=ExportSettings;
|
||||
Export.Dataset := FTestDataset;
|
||||
Export.FileName := FExportTempDir + 'dbfexporttest.dbf';
|
||||
NumberExported := Export.Execute;
|
||||
FTestDataset.Close;
|
||||
AssertEquals('Number of records exported', NumberExported, FTestDataset.RecordCount);
|
||||
AssertTrue('Output file created', FileExists(Export.FileName));
|
||||
AssertTrue('Output file has contents', (FileSize(Export.FileName) > 0));
|
||||
finally
|
||||
if (KeepFilesAfterTest = False) then
|
||||
begin
|
||||
DeleteFile(Export.FileName);
|
||||
end;
|
||||
ExportSettings.Free;
|
||||
Export.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure TTestDBFExport1.FillTestData;
|
||||
var
|
||||
RowNumber: integer; //Keep track of how many rows we inserted
|
||||
TestBoolean: boolean;
|
||||
TestDateTime: TDateTime;
|
||||
TestExtended: extended;
|
||||
//yes, a lot of precision; we can convert to single/double if required
|
||||
TestInteger: integer;
|
||||
TestGuid: string;
|
||||
TestString: string;
|
||||
begin
|
||||
FTestDataset.Close;
|
||||
RowNumber := 0;
|
||||
//for memds:
|
||||
//FTestDataset.Clear(False); //memds: clear out any data
|
||||
//FTestDataset.Fields.Clear; //bufds: clear out any data, but also FIELDDEFS: don't use
|
||||
FTestDataset.Open;
|
||||
|
||||
// Fill some test data
|
||||
// First row: positive numerical values, late dates/times, strings with special chars (tab, linefeed, ; > <)
|
||||
FTestDataset.Append;
|
||||
TestBoolean := True;
|
||||
TestDateTime := EncodeDate(9999, 12, 31) + EncodeTime(23, 59, 59, 999);
|
||||
TestExtended := 42.424242424242424242424242424242;
|
||||
TestInteger := Round(TestExtended);
|
||||
TestGuid := '{21EC2020-3AEA-1069-A2DD-08002B30309D}';
|
||||
TestString := 'Douglas Adams less than: < greater than > tab:' +
|
||||
#9 + 'crlf:' + #13 + #10 +
|
||||
'國缺界广欠廣界界东缺. Haddock drinks rosé (ros, e accent aigu), водка (wodka cyrillic) and ούζο (ouzo Greek) but prefers Loch Lomond whiskey.';
|
||||
RowNumber := RowNumber + 1;
|
||||
FillRecord(RowNumber, Teststring, TestGUID, Testinteger, Testextended,
|
||||
Testdatetime, Testboolean);
|
||||
FTestDataset.Post;
|
||||
|
||||
// Second row: negative numerical values, early dates/times, strings with maximum field width and Greek, east asian (multibyte) characters
|
||||
FTestDataset.Append;
|
||||
TestBoolean := False;
|
||||
TestDateTime := EncodeDate(1, 1, 1) + EncodeTime(0, 0, 0, 1);
|
||||
TestExtended := -42.424242424242424242424242424242;
|
||||
TestInteger := Round(TestExtended);
|
||||
TestGuid := '{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}';
|
||||
TestString := 'ARMA virumque cano, Troiae qui primus ab oris' +
|
||||
#13 + #10 + 'Italiam, fato profugus, Laviniaque venit' + #13 +
|
||||
#10 + 'litora, multum ille et terris iactatus et alto' + #13 +
|
||||
#10 + 'vi superum saevae memorem Iunonis ob iram;' + #13 + #10 +
|
||||
'multa quoque et bello passus, dum conderet urbem,' + #13 + #10 +
|
||||
'inferretque deos Latio, genus unde Latinum,' + #13 + #10 +
|
||||
'Albanique patres, atque altae moenia Romae.' + #13 + #10 + #13 +
|
||||
#10 + 'Musa, mihi causas memora, quo numine laeso,' + #13 + #10 +
|
||||
'quidve dolens, regina deum tot volvere casus' + #13 + #10 +
|
||||
'insignem pietate virum, tot adire labores' + #13 + #10 +
|
||||
'impulerit. Tantaene animis caelestibus irae?' + #13 + #10 +
|
||||
#13 + #10 + 'Urbs antiqua fuit, Tyrii tenuere coloni,' + #13 +
|
||||
#10 + 'Karthago, Italiam contra Tiberinaque longe' + #13 + #10 +
|
||||
'ostia, dives opum studiisque asperrima belli;' + #13 + #10 +
|
||||
'quam Iuno fertur terris magis omnibus unam' + #13 + #10 +
|
||||
'posthabita coluisse Samo; hic illius arma,' + #13 + #10 +
|
||||
'hic currus fuit; hoc regnum dea gentibus esse,' + #13 + #10 +
|
||||
'si qua fata sinant, iam tum tenditque fovetque.' + #13 + #10 +
|
||||
'Progeniem sed enim Troiano a sanguine duci' + #13 + #10 +
|
||||
'audierat, Tyrias olim quae verteret arces;' + #13 + #10 +
|
||||
'hinc populum late regem belloque superbum' + #13 + #10 +
|
||||
'venturum excidio Libyae: sic volvere Parcas.' + #13 + #10 +
|
||||
'Id metuens, veterisque memor Saturnia belli,' + #13 + #10 +
|
||||
'prima quod ad Troiam pro caris gesserat Argis---' + #13 + #10 +
|
||||
'necdum etiam causae irarum saevique dolores' + #13 + #10 +
|
||||
'exciderant animo: manet alta mente repostum' + #13 + #10 +
|
||||
'iudicium Paridis spretaeque iniuria formae,' + #13 + #10 +
|
||||
'et genus invisum, et rapti Ganymedis honores.' + #13 + #10 +
|
||||
'His accensa super, iactatos aequore toto' + #13 + #10 +
|
||||
'Troas, reliquias Danaum atque immitis Achilli,' + #13 + #10 +
|
||||
'arcebat longe Latio, multosque per annos' + #13 + #10 +
|
||||
'errabant, acti fatis, maria omnia circum.' + #13 + #10 +
|
||||
'Tantae molis erat Romanam condere gentem!';
|
||||
RowNumber := RowNumber + 1;
|
||||
FillRecord(RowNumber, Teststring, TestGUID, Testinteger, Testextended,
|
||||
Testdatetime, Testboolean);
|
||||
FTestDataset.Post;
|
||||
|
||||
// Third row: empty/zero numerical values, dates/times, strings
|
||||
FTestDataset.Append;
|
||||
TestBoolean := False;
|
||||
TestDateTime := EncodeDate(1, 1, 1) + EncodeTime(0, 0, 0, 0);
|
||||
TestExtended := 0;
|
||||
TestInteger := Round(TestExtended);
|
||||
TestGuid := '{3F2504E0-4F89-11D3-9A0C-0305E82C3301}';
|
||||
TestString := '';
|
||||
RowNumber := RowNumber + 1;
|
||||
FillRecord(RowNumber, Teststring, TestGUID, Testinteger, Testextended,
|
||||
Testdatetime, Testboolean);
|
||||
FTestDataset.Post;
|
||||
|
||||
// Fourth row: plausible data
|
||||
FTestDataset.Append;
|
||||
TestBoolean := True;
|
||||
TestDateTime := EncodeDate(2005, 9, 10) + EncodeTime(13, 52, 18, 0);
|
||||
TestExtended := 42;
|
||||
TestInteger := Round(TestExtended);
|
||||
TestString := 'The answer to life, the universe, and everything';
|
||||
RowNumber := RowNumber + 1;
|
||||
FillRecord(RowNumber, Teststring, TestGUID, Testinteger, Testextended,
|
||||
Testdatetime, Testboolean);
|
||||
FTestDataset.Post;
|
||||
|
||||
// Make sure recordcount is correct:
|
||||
FTestDataset.Last;
|
||||
FTestDataset.First;
|
||||
AssertEquals('Number of records in test dataset', RowNumber, FTestDataset.RecordCount);
|
||||
end;
|
||||
|
||||
procedure TTestDBFExport1.Setup;
|
||||
const
|
||||
NumberOfDecimals = 2;
|
||||
NumberOfBytes = 10;
|
||||
var
|
||||
FieldDef: TFieldDef;
|
||||
begin
|
||||
FExportTempDir := GetTempDir(False);
|
||||
FTestDataset := TBufDataset.Create(nil);
|
||||
{Tweaked for dbf export}
|
||||
{We should cover all data types defined in FPC:
|
||||
|
||||
FPC maps "external" types such as ftOracleBlob to
|
||||
internal types, but that can be overridden, which is done
|
||||
by e.g. IBX and mseide.
|
||||
So it makes sense to keep as many datatypes in the exporter code as possible: it documents the mappings and allows other people to use these types without the exporter breaking.
|
||||
}
|
||||
{Sorted by datatype; commented out what doesn't work at the moment in bufdataset
|
||||
See http://docwiki.embarcadero.com/VCL/en/DB.TField.Size for overview of field sizes in the competition product ;)
|
||||
Apparently ftGuid also needs size...
|
||||
}
|
||||
|
||||
{
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftADT';
|
||||
FieldDef.DataType := ftADT;
|
||||
FieldDef.Size := 4096;//large but hopefully not too large for memory.
|
||||
}
|
||||
|
||||
{
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftArray';
|
||||
FieldDef.DataType := ftArray;
|
||||
FieldDef.Size := 10;//the number of elements in the array
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftAutoInc';
|
||||
FieldDef.DataType := ftAutoInc;
|
||||
}
|
||||
|
||||
{
|
||||
//Not supported by DBF:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftBCD';
|
||||
FieldDef.DataType := ftBCD;
|
||||
FieldDef.Size := NumberOfDecimals;
|
||||
//Size is the number of digits after the decimal place
|
||||
}
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
//Note dbf 3 has a 10 character field length limit
|
||||
FieldDef.Name := 'ftBlob_4096';
|
||||
FieldDef.DataType := ftBlob;
|
||||
FieldDef.Size := 4096;//large but hopefully not too large for memory.
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftBoolean';
|
||||
FieldDef.DataType := ftBoolean;
|
||||
|
||||
{
|
||||
//Not supported by DBF:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftBytes';
|
||||
FieldDef.DataType := ftBytes;
|
||||
FieldDef.Size := NumberOfBytes;
|
||||
}
|
||||
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftCurrency';
|
||||
FieldDef.DataType := ftCurrency;
|
||||
}
|
||||
|
||||
{
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftCursor';
|
||||
FieldDef.DataType := ftCursor;
|
||||
}
|
||||
|
||||
{
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftDataSet';
|
||||
FieldDef.DataType := ftDataSet;
|
||||
}
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftDate';
|
||||
FieldDef.DataType := ftDate;
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftDateTime';
|
||||
FieldDef.DataType := ftDateTime;
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftDBaseOle';
|
||||
FieldDef.DataType := ftDBaseOle;
|
||||
FieldDef.Size := 4096;//large but hopefully not too large for memory.
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftFixedChar_2';
|
||||
FieldDef.DataType := ftFixedChar;
|
||||
FieldDef.Size := NumberOfDecimals;
|
||||
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftFixedWideChar_2';
|
||||
FieldDef.DataType := ftFixedWideChar;
|
||||
FieldDef.Size := NumberOfBytes;
|
||||
}
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftFloat';
|
||||
FieldDef.DataType := ftFloat;
|
||||
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftFMTBcd';
|
||||
FieldDef.DataType := ftFMTBcd;
|
||||
FieldDef.Size := NumberOfDecimals; //the number of digits after the decimal place.
|
||||
}
|
||||
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftFmtMemo';
|
||||
FieldDef.DataType := ftFmtMemo;
|
||||
FieldDef.Size := 4096;//large but hopefully not too large for memory.
|
||||
}
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftGraphic';
|
||||
FieldDef.DataType := ftGraphic;
|
||||
FieldDef.Size := 4096;//large but hopefully not too large for memory.
|
||||
}
|
||||
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftGuid';
|
||||
FieldDef.DataType := ftGuid;
|
||||
FieldDef.Size := 38;
|
||||
//Apparently right answer is not 42; had to look up 38 in source code.
|
||||
}
|
||||
|
||||
{
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftIDispatch';
|
||||
FieldDef.DataType := ftIDispatch;
|
||||
}
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftInteger';
|
||||
FieldDef.DataType := ftInteger;
|
||||
|
||||
{
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftInterface';
|
||||
FieldDef.DataType := ftInterface;
|
||||
}
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftLargeint';
|
||||
FieldDef.DataType := ftLargeint;
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftMemo';
|
||||
FieldDef.DataType := ftMemo;
|
||||
FieldDef.Size := 4096;//large but hopefully not too large for memory.
|
||||
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftOraBlob';
|
||||
FieldDef.DataType := ftOraBlob;
|
||||
}
|
||||
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftOraClob';
|
||||
FieldDef.DataType := ftOraClob;
|
||||
}
|
||||
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftParadoxOle';
|
||||
FieldDef.DataType := ftParadoxOle;
|
||||
FieldDef.Size := 4096;//large but hopefully not too large for memory.
|
||||
}
|
||||
|
||||
{
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftReference';
|
||||
FieldDef.DataType := ftReference;
|
||||
}
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftSmallInt';
|
||||
FieldDef.DataType := ftInteger;
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftString_1';
|
||||
FieldDef.DataType := ftString;
|
||||
FieldDef.Size := 1;
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftString_256'; //1 character more than many db string types support
|
||||
FieldDef.DataType := ftString;
|
||||
FieldDef.Size := 256;
|
||||
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftTime';
|
||||
FieldDef.DataType := ftTime;
|
||||
}
|
||||
|
||||
{
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftTimeStamp';
|
||||
FieldDef.DataType := ftTimeStamp;
|
||||
}
|
||||
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftTypedBinary';
|
||||
FieldDef.DataType := ftTypedBinary;
|
||||
FieldDef.Size := 4096;//large but hopefully not too large for memory.
|
||||
}
|
||||
|
||||
{
|
||||
//Not supported by dbf: FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftVariant';
|
||||
FieldDef.DataType := ftVariant;
|
||||
FieldDef.Size := NumberOfBytes;
|
||||
}
|
||||
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftVarBytes';
|
||||
FieldDef.DataType := ftVarBytes;
|
||||
FieldDef.Size := NumberOfBytes;
|
||||
}
|
||||
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftWideMemo';
|
||||
FieldDef.DataType := ftWideMemo;
|
||||
}
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftWideString256';
|
||||
FieldDef.DataType := ftWideString;
|
||||
FieldDef.Size := 256;
|
||||
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'ftWord';
|
||||
FieldDef.DataType := ftWord;
|
||||
|
||||
//Finally, a long field name that should trigger
|
||||
//field renaming code in dbf export
|
||||
//(dbase VII supports up to 32 characters, others up to 10)
|
||||
FieldDef := FTestDataset.FieldDefs.AddFieldDef;
|
||||
FieldDef.Name := 'AVeryLongFieldDataTypeDoesNotMatter';
|
||||
FieldDef.DataType := ftString;
|
||||
FieldDef.Size := 256;
|
||||
|
||||
//Createtable is needed if you use a memds
|
||||
//FTestDataset.CreateTable;
|
||||
//CreateDataset is needed if you use a bufdataset
|
||||
FTestDataset.CreateDataSet;
|
||||
|
||||
// Fill dataset with test data
|
||||
FillTestData;
|
||||
end;
|
||||
|
||||
procedure TTestDBFExport1.FillRecord(const RowNumber: integer;
|
||||
const TestString: string; const TestGUID: string; const TestInteger: integer;
|
||||
const TestExtended: extended; const TestDatetime: Tdatetime;
|
||||
const TestBoolean: boolean);
|
||||
var
|
||||
FieldCounter: integer;
|
||||
begin
|
||||
writeln('*** Starting to fill row ' + IntToStr(RowNumber));
|
||||
{As our bufdataset doesn't support these datatypes, don't use them:
|
||||
ftAutoInc -> exists but doesn't seem to return any data.
|
||||
ftCursor
|
||||
ftDataSet
|
||||
ftInterface
|
||||
ftReference
|
||||
ftTimeStamp}
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataset.FieldByName('ftBCD').AsFloat := Testextended;
|
||||
}
|
||||
FTestDataset.FieldByName('ftBlob_4096').AsString := Teststring;
|
||||
FTestDataset.FieldByName('ftBoolean').AsBoolean := Testboolean;
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataset.FieldByName('ftBytes').AsString := Teststring;
|
||||
}
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataset.FieldByName('ftCurrency').Ascurrency := Testextended;
|
||||
}
|
||||
FTestDataset.FieldByName('ftDate').AsDateTime := Testdatetime;
|
||||
FTestDataset.FieldByName('ftDateTime').AsDateTime := Testdatetime;
|
||||
FTestDataset.FieldByName('ftDBaseOle').AsString := Teststring;
|
||||
FTestDataset.FieldByName('ftFixedChar_2').AsString := Teststring;
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataset.FieldByName('ftFixedWideChar_2').AsString := Teststring;
|
||||
}
|
||||
FTestDataset.FieldByName('ftFloat').AsFloat := Testextended;
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataset.FieldByName('ftFMTBcd').AsFloat := Testextended;
|
||||
}
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataset.FieldByName('ftFmtMemo').AsString := Teststring;
|
||||
}
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataset.FieldByName('ftGraphic').AsString := Teststring;
|
||||
}
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataset.FieldByName('ftGuid').AsString := TestGUID;
|
||||
}
|
||||
FTestDataset.FieldByName('ftInteger').AsInteger := Testinteger;
|
||||
FTestDataset.FieldByName('ftLargeint').AsInteger := Testinteger;
|
||||
FTestDataset.FieldByName('ftMemo').AsString := Teststring;
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataset.FieldByName('ftOraBlob').AsString := Teststring;
|
||||
}
|
||||
{
|
||||
FTestDataset.FieldByName('ftOraClob').AsString := Teststring;
|
||||
}
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataset.FieldByName('ftParadoxOle').AsString := Teststring;
|
||||
}
|
||||
FTestDataset.FieldByName('ftSmallInt').AsInteger := Testinteger;
|
||||
FTestDataset.FieldByName('ftString_1').AsString := Teststring;
|
||||
FTestDataset.FieldByName('ftString_256').AsString := Teststring;
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataset.FieldByName('ftTime').AsDateTime := Testdatetime;
|
||||
}
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataset.FieldByName('ftTypedBinary').AsString := Teststring;
|
||||
}
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataSet.FieldByName('ftVarBytes').AsString := TestString;
|
||||
}
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataSet.FieldByName('ftVariant').AsString := TestString;
|
||||
}
|
||||
{
|
||||
//Not supported by dbf:
|
||||
FTestDataset.FieldByName('ftWideMemo').AsString := Teststring;
|
||||
}
|
||||
FTestDataset.FieldByName('ftWideString256').AsString := Teststring;
|
||||
FTestDataset.FieldByName('ftWord').AsInteger := Abs(Testinteger);
|
||||
FTestDataset.FieldByName('AVeryLongFieldDataTypeDoesNotMatter').AsString := Teststring;
|
||||
{
|
||||
for Fieldcounter := 0 to FTestDataset.Fields.Count - 1 do
|
||||
begin
|
||||
try
|
||||
writeln('Field: ' + FTestDataset.Fields[FieldCounter].FieldName +
|
||||
' has value ' + FTestDataset.Fields[FieldCounter].AsString);
|
||||
{writeln('Field: ' + FTestDataset.Fields[FieldCounter].FieldName +
|
||||
' has displaytext ' + FTestDataset.Fields[FieldCounter].DisplayText);}
|
||||
except
|
||||
on E: Exception do
|
||||
begin
|
||||
writeln('Field: ' + FTestDataset.Fields[FieldCounter].FieldName +
|
||||
': error retrieving value: ');
|
||||
writeln(E.ClassName, '; detailed error message: ', E.message);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
}
|
||||
writeln('*** Finished filling row ' + IntToStr(RowNumber));
|
||||
end;
|
||||
|
||||
procedure TTestDBFExport1.Teardown;
|
||||
begin
|
||||
FTestDataset.Free;
|
||||
end;
|
||||
|
||||
initialization
|
||||
Registertest(TTestDBFExport1);
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user