Работа с кешированным датасетом

Daker
Дата: 10.12.2007 14:58:10
Стояла задача реализовать просмотр и редактирование данных из разных табличек БД, но представляющие собой одну выходную форму по сути. Решил использоваться кешированным датасетом. Данные считываются, пользователь с ними работает, потом или сохраняет или отменяет. Собственно кешированный датасет, использовал потому, что не смог придумать, как отображать данные в сетке по другому. Вставлять приходиться в разные таблицы, поэтому этим занимается ХП. То есть, когда человек заканчивает вставлять\редактировать , он наживает сохранить, мы бежим по датасету и значения каждой записи передаются как параметры в ХП, которая их уже вставляет. Чувствую, что это велосипед, но уже сделал и пока вставляли новые значения - проблем не было. Собственно код:
DM.fibPeople.First;
  DM.fibPeople.DisableControls;
  try
    while not DM.fibPeople.Eof do
      with DM.fibProc do
      begin
        StoredProcName := 'DOZES_IU';
        ParamByName('DOZE_DATE').AsDate := SetMyDate(StrToInt(cbYear.Value), cbKvr.ItemIndex+1);
        ParamByName('DOZE_TYPE').AsInteger := SetDozeType(DM.fibPeople.FN('Job1').AsInteger, DM.fibPeople.FN('LABARATORY_ID').AsInteger);
        ParamByName('FLAG').AsInteger := DM.fibPeople.FN('ReportFlag').AsInteger;
        ParamByName('PEOPLE_ID').AsInteger := DM.fibPeople.FN('ID_PEOPLE').AsInteger;
        ParamByName('DOZE').AsFloat := DM.fibPeople.FN('ReportDoze').AsFloat;
        ParamByName('WORKKOD_ID').AsInteger := DM.fibPeople.FN('WORKKOD_ID').AsInteger;
        DM.fibTransWrite.StartTransaction;
        try
          ExecProc
        except
          on e: Exception do
            begin
              DM.fibTransWrite.Rollback;
              ShowMessage('Ошибка при добавлении записей'+#13#10+e.Message);
              Break;  // работаем только со всем подразделением сразу
            end
        end;
        DM.fibPeople.Next;
      end;
      DM.fibTransWrite.Commit
  finally
    DM.fibPeople.EnableControls;
  end
проблемы начались при редактировании, если мы уже в готовых данных изменяем одну!!! запись, то после выполнения этого кода, она конечно меняется, но все остальное забивается нулями. Хотя по идеи старые значения должны просто переписываться .
Буду очень признателен за пинок в нужном направлении
Daker
Дата: 10.12.2007 15:04:58
Виноват
DM.fibTransWrite.StartTransaction;
конечно выносить из цикла
Petro123
Дата: 10.12.2007 15:15:29
не понял, вы написали велосипед-ClientDataSet и теперь справшиваете почему он неедет?
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
Johnmen
Дата: 10.12.2007 15:23:14
Всё это криво...
Надо использовать TfibDataSet, у которого в модифицирующем запросе, например, вызывается ХП с параметрами.
Daker
Дата: 10.12.2007 15:39:59
Johnmen
Всё это криво...
Надо использовать TfibDataSet, у которого в модифицирующем запросе, например, вызывается ХП с параметрами.

Да но так мы будем работать с каждой записью. На форме находятся еще пару компонент, значения которых передаются как параметры, та же дата. А мне хотелось что бы человек всех сначала отредактировал\ввел - потом сохранил. Но это конечно спорно. Просто одно из требований, что бы не было людей, у которых нет значений доз ... если вставить в модифицирующий запрос ... то будет возможность допустим ввести только половину, потом пойти на обед , потом забыть про это ... а ввод нужен только целым подразделением.
Самому не нравиться как все сделано, сейчас попробую переписать.
Johnmen
Дата: 10.12.2007 15:43:08
Daker
... то будет возможность допустим ввести только половину, потом пойти на обед , потом забыть про это ... а ввод нужен только целым подразделением.

Это будет говорить только о кривизне написанного приложения.
Почитай что-нибудь про транзакционный механизм.
Daker
Дата: 10.12.2007 16:19:11
Johnmen

Почитай что-нибудь про транзакционный механизм.

Да я знаю, что такое транзакция :(. Изменения нужны или всех или никого. Не могу же я растягивать пишущую транзакцию на время обеда, хотя может быть и ничего страшного конечно, но как то всегда старался что бы пищущие были максимально короткими.
Я не профессиональный программер, поэтому собственно и обращаюсь за советом.
Petro123
Дата: 10.12.2007 17:07:52
Daker
Johnmen

Почитай что-нибудь про транзакционный механизм.

Да я знаю, что такое транзакция :(. Изменения нужны или всех или никого. Не могу же я растягивать пишущую транзакцию на время обеда, хотя может быть и ничего страшного конечно, но как то всегда старался что бы пищущие были максимально короткими.
Я не профессиональный программер, поэтому собственно и обращаюсь за советом.

для максимальной короткой без велосипедов:
- читающая транзакция (ClientDataSet читает)
- до обеда правишь
- после обеда нажать кнопку "Применить"
- там одна строка ClientDataSet.ApplyUpdates - это и есть короткая транзакция
Daker
Дата: 10.12.2007 17:26:10
Если на то пошло, то
- Как в параметрах модифицируещего запроса передать значения компонент, которые на форме ?
. Собственно сейчас параметры ХП присваиваются по нажатию кнопки сохранить , сегодня понедельник, поэтому плохо себе предтавляю этот процесс в модифицируемом варианте
Manfred8
Дата: 10.12.2007 17:51:02
Daker

проблемы начались при редактировании, если мы уже в готовых данных изменяем одну!!! запись, то после выполнения этого кода, она конечно меняется, но все остальное забивается нулями. Хотя по идеи старые значения должны просто переписываться .

зачем их перезаписывать если они не менялись?
используй ClientDataSet. когда бежишь по нему можно выяснить модифицировалась ли запись или нет.