dBASEで日付型だけをキーにすると正しくApplyRangeで正しい結果が得られるのですが、文字列+日付型というように複合キーにすると正しい結果が得られません。
そういう使い方は無理なのでしょうか?
日付型を文字型に設計しなおすしかないのでしょうか?
よろしくお願いいたします。
>Delphiヘルプファイルより引用
>dBASE テーブルは,(Visual dBASE 7 と組み合わせた状態で)
>テーブルレベルが 7 以上の場合は,一次添字および一意の添字だけを
>サポートします。
>dBASE テーブルは,大文字と小文字を区別しないインデックスを
>サポートしていません。ixCaseInsensitive
>インデックスが複数の項目を基に作成されたものか,
>または dBase データ操作言語機能(式インデックスの場合)を使用する場合は
> ixExpression 定数を使用します。ixExpression 定数は dBASE テーブルにのみ適用できます。
procedure TForm1.FormCreate(Sender: TObject);
begin
DataSource2.DataSet := Table2;
Table2.DatabaseName := 'dbdemos';
Table2.TableName := 'employee.db';
DataSource1.DataSet := Table_TestDBF1;
Table_TestDBF1.DatabaseName := '';
Table_TestDBF1.TableName := 'C:\WINDOWS\TEMP\testdb001.DBF';
Table_TestDBF1.TableType := ttDBase;
DBGrid1.DataSource := DataSource1;
Table_TestDBF1.Active := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
if not FileExists(Table_TestDBF1.TableName) then
begin
Table_TestDBF1.Active := False;
Table2.Active := True;
BatchMove1.Mappings.Text := '';
Table_TestDBF1.Active := False;
Table_TestDBF1.FieldDefs.Clear;
for i := 0 to Table2.FieldDefs.Count -1 do
with Table2.FieldDefs[i] do
Table_TestDBF1.FieldDefs.Add(
Name, DataType, Size, Required);
Table_TestDBF1.IndexDefs.Clear;
for i := 0 to Table2.IndexDefs.Count -1 do
with Table2.IndexDefs[i] do
begin
if ixCaseInsensitive in Options then
Table_TestDBF1.IndexDefs.Add(Name, Fields, [ixExpression])
else
Table_TestDBF1.IndexDefs.Add(Name, Fields, Options);
// Showmessage(Name+' '+Fields);
end;
Table_TestDBF1.CreateTable;
BatchMove1.Mappings.Clear;
for i := 0 to Table2.FieldDefs.Count -1 do
BatchMove1.Mappings.add(Table2.FieldDefs.Items[i].Name);
BatchMove1.Mode := batAppendUpdate ;
BatchMove1.Source := Table2;
BatchMove1.Destination := Table_TestDBF1;
BatchMove1.Execute;
Table2.Active := False;
Table_TestDBF1.Active := True;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Table_TestDBF1.Filter := '([Salary]>30000)and(Salary<50000) and(HireDate>''1992/01/01'')';//Edit1.Text;
Table_TestDBF1.Filtered := True;
end;
レスありがとうございます。
方法はあるみたいですね。
記載してもらったコーディングを元に勉強したいと思います。
ありがとうございました。
ツイート | ![]() |