Выпуск индекса Delphi 2006 TClientDataSet - PullRequest
1 голос
/ 20 сентября 2011

Я использую ClientDataSet с DataSetProvider, связанным с локальным набором данных. Когда я хочу редактировать данные в DataSet, я открываю ClientDataSet и добавляю в него некоторые индексы. После того, как я закончил редактирование данных, я закрываю ClientDataSet. Все работает нормально, за исключением того, что когда я снова открываю ClientDataSet и выбираю индекс, возникает исключение с сообщением "index 'xxx' not found". Что я делаю не так?

Вот код для открытия ClientDataSet:

 Application.CreateForm (TfrmCardDep, frmCardDep);
 try
  with DM.tblCCardDep do
   begin
    IndexDefs.Clear;
    if not Active then Open;
    AddIndex ('iDepID', 'DepID', []);
    AddIndex ('iDep', 'Dep', []);
    IndexName := 'iDep';
    FieldByName('Dep').DisplayLabel := 'Departament';
    FieldByName('Dep').DisplayWidth := 50;
    FieldByName('DepID').Visible := false;
   end;

  frmCardDep.ShowModal;
 finally
  if DM.tblCCardDep.Active then DM.tblCCardDep.Close;
  frmCardDep.Free; frmCardDep := nil;
 end;

DM.tblCCardDep - это клиентский набор данных

Ответы [ 2 ]

2 голосов
/ 20 сентября 2011

После первого раунда вы установили IndexName на ClientDataSet.Когда IndexDefs отбрасывается, индекс, на который он ссылается, становится недействительным.Очистите IndexName перед повторным открытием набора данных, т.е. измените ваш код следующим образом:

 [..]
 try
  with DM.tblCCardDep do
   begin
    IndexDefs.Clear;
    IndexName := '';      // <- here
    if not Active then Open;
    [..]

или используйте что-то вроде этого: [..]

 try
  with DM.tblCCardDep do
   begin
    if not Active then Open;
    if IndexDefs.Count = 0 then
     begin
      AddIndex ('iDepID', 'DepID', []);
      AddIndex ('iDep', 'Dep', []);
      IndexDefs.Update;             // Update IndexDefs
      IndexName := 'iDep';
     end;
    FieldByName('Dep').DisplayLabel := 'Departament';
    [..]
0 голосов
/ 20 сентября 2011

Индексы набора данных клиента всегда отбрасываются при закрытии набора данных клиента. «Постоянный индекс» в контексте набора данных клиента означает, что он остается в памяти до тех пор, пока набор данных клиента открыт:

Понимание индексов ClientDataSet

Индексы TClientDataset: временные или постоянные?

...