dBASEで日付型を含む複合キーは無理?

解決


ジュウザ  2005-02-08 00:27:00  No: 13101

dBASEで日付型だけをキーにすると正しくApplyRangeで正しい結果が得られるのですが、文字列+日付型というように複合キーにすると正しい結果が得られません。
そういう使い方は無理なのでしょうか?
日付型を文字型に設計しなおすしかないのでしょうか?

よろしくお願いいたします。


大豆Z  2005-02-08 03:19:07  No: 13102

>Delphiヘルプファイルより引用
>dBASE テーブルは,(Visual dBASE 7 と組み合わせた状態で)
>テーブルレベルが 7 以上の場合は,一次添字および一意の添字だけを
>サポートします。
>dBASE テーブルは,大文字と小文字を区別しないインデックスを
>サポートしていません。ixCaseInsensitive
>インデックスが複数の項目を基に作成されたものか,
>または dBase データ操作言語機能(式インデックスの場合)を使用する場合は
> ixExpression 定数を使用します。ixExpression 定数は dBASE テーブルにのみ適用できます。


.  2005-02-08 04:22:47  No: 13103

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;


ジュウザ  2005-02-08 19:28:50  No: 13104

レスありがとうございます。

方法はあるみたいですね。
記載してもらったコーディングを元に勉強したいと思います。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加