ClientDataSetの更新

解決


Msun  2006-12-16 06:19:36  No: 24255  IP: 192.*.*.*

電話番号での顧客管理帳を考えています。
[電話番号] [名前] [住所]
    ・        ・    ・
    ・        ・    ・
    ・        ・    ・
こんな感じのDBGridです。電話番号Fieldを集合体にして新規登録の要否をinでチェックしたいのですがどうすればいいか教えて下さい。よろしくお願いします。

編集 削除
HOta  2006-12-16 06:25:31  No: 24256  IP: 192.*.*.*

「電話番号Fieldを集合体」とは何のことでしょうか?
レコードを追加変更の場合は、データーベースに行うことです。TDBGridは表示する機能ですから、TDataSet側で検査して判断すれば良いでしょう。

編集 削除
Msun  2006-12-16 13:39:24  No: 24257  IP: 192.*.*.*

HOtaさん早速のレスありがとうございます。
初心者なのでごめんなさい。「電話番号Fieldをソートしてその後各電話番号をStrToIntしてある集合型を作成」できれば、電話番号をキーワードinを使って登録済みかどうかをチェックでき、追記の要否を判定処理できるのではと考えたものですから投稿してみました。よろしくお願いします。

編集 削除
HOta  2006-12-16 15:34:10  No: 24258  IP: 192.*.*.*

新規登録か、更新かは、対象テーブルをキーで検索すれば、判断できます。
一般的なデーターベースなら、

TQueryのSQL文に

Select *
From 対象テーブル名
Where 電話番号 = :電話番号

としておいて、

Query1.ParamByName('電話番号').asinteger := StrToInt(電話番号);
Query1.Open;
if Query1.Eof then
  更新処理
else
  新規登録処理;

となります。
「電話番号Fieldをソートしてその後各電話番号をStrToIntしてある集合型を作成」はデーターベースの機能ですから、そちらに任せます。

編集 削除
Msun  2006-12-17 08:04:01  No: 24259  IP: 192.*.*.*

HOtaさんありがとうございます。TQueryは使っていません。
TClientDataSet -> TDataSouce -> TDBGrid
      |
   cust.XML
の構成ではダメですか?

編集 削除
HOta  2006-12-17 10:01:03  No: 24260  IP: 192.*.*.*

あっ。TDbGridを使っているんですね。ここで入力するときに、データーは登録されていませんか?
XMLはデーターベースとなりますから、同じ扱いでいけると思います。

編集 削除
Msun  2006-12-17 16:45:21  No: 24261  IP: 192.*.*.*

HOtaさんいろいろとアドバイスありがとうございました。
項目のソートもできDBGridでの表示もOKでした。
集合型は256までとゆうことも改めて再確認です。データは約7万ありますので他の方法でトライします。
ほんとうにありがとうございました。

編集 削除
HOta  2006-12-18 08:48:19  No: 24262  IP: 192.*.*.*

集合型の意味は、どのようになっていますか?XMLでも、データーベースと同じように扱えますから、項目数が256でレコード数は問題ないと思います。

編集 削除
Msun  2006-12-18 13:37:34  No: 24263  IP: 192.*.*.*

function TelNumberCheck(TelNo: String): Boolean;
begin
  Result := True;
  ClientDataSet.First;
  While not ClientDataSet.Eof do
  begin
    if TelNo = ClientDataSet.FieldByName('電話番号').AsString Then
    begin
        ・
        ・
      Result := False;
      break;
    end else
    begin
        ・
        ・
     ClientDataSet.Next;
    end;
  end;
end;
のような関数を作成して追加の可否を判別してOK,Running Testしていますが今のところ正常動作しています。なにかありましたら書込みしますのでよろしくお願いします。

編集 削除
HOta  2006-12-18 13:50:59  No: 24264  IP: 192.*.*.*

ClientDataSetのLocateを使った方が早いと思います。
  
  if ClientDataSet.Locate('電話番号',VarArrayOf([TelNo]),[]) then
  begin
    //登録済みの場合の処理
  end
  else
  begin
    //未登録の場合の処理
  end;

編集 削除
Msun  2006-12-20 13:45:35  No: 24265  IP: 192.*.*.*

HOtaさん度々のアドバイスありがとうございます。
早速 functionを使っているところをClientDataSet.Locateに置き換えてRUNしてみました。OKです。こちらの方がよさそうです。ありがとうございました。

編集 削除
小豚丸  2006-12-28 01:07:27  No: 24266  IP: 192.*.*.*

せっかくClientDataSetを使用しているので、ApplyUpdatesで自動更新できます。ループしていちいち更新の確認するのは効率がちょっと悪いかも。
例:
if ClientDataSet1.ChangeCount>0 then 
  ClientDataSet1.ApplyUpdates(-1);

編集 削除