Что вы думаете по поводу такой процедуры редактирования

lbl
Дата: 13.05.2011 10:16:51
Написал процедуру для редактирования датасета, вроде бы работает как надо, а так как опыта у меня нету никакого, то что-то она мне кажется какой-то неказистой. Профессионалы, если не жалко, продемонстрируйте ваши решения. Или подскажите, что нужно улучшить.
procedure TfmMain.ActEditExecute(Sender: TObject);
begin
  if DM.REGISTR.IsEmpty then
    DM.REGISTR.Append
  else
    DM.REGISTR.Edit;
  with TfmTalon.Create(nil) do
  try
    if ShowModal = mrOK then
    begin
      try
        DM.REGISTR.UpdateTransaction.StartTransaction;
        DM.REGISTR.Post;
        DM.REGISTR.UpdateTransaction.Commit;
        DM.REGISTR.Refresh;
      except
        on E:Exception do
        begin
          ShowError(E.Message);
          DM.REGISTR.UpdateTransaction.Rollback;
        end;
      end;
    end;
  finally
    Free;
  end;
end;
defecator
Дата: 13.05.2011 10:36:29
Навскидку, все неправильно.
Но, для начала, вытащить весь код, не имеющий отношения к форме, в тот же DM (это DataModule, если я правильно понял ?):

procedure TDM.DoUpdateRegistr ;
begin
   try
     try
        DM.REGISTR.UpdateTransaction.StartTransaction;
        DM.REGISTR.Post;
        DM.REGISTR.UpdateTransaction.Commit;
     except
       ....
     end ;
   finally
     DM.REGISTR.Refresh; // ЗАЧЕМ ?
     ........
   end;
end ;

В форме TfmTalon определить:

class procedure TfmTalon.Execute ;
var
  fm : TfmTalon ;
begin
  fm := TfmTalon.Create(....) ;
  try
    if fm.ShowModal <> idOK then Exit ;
    DM.DoUpdateRegistr ;
  finally
    fm.Free ;
  end ; 
end ;

в котором будет все создание и реализация.

В обработчике в итоге останется:

procedure TfmMain.ActEditExecute(Sender: TObject);
begin
  TfmTalon.Execute ;
end ;

Вторым шагом я бы подумал, как перейти на использование SQL вместо Edit/Appent/Post
Кроик Семён
Дата: 13.05.2011 10:39:24
defecator,

procedure TDM.DoUpdateRegistr ;
begin
   try
     try
        DM.REGISTR.UpdateTransaction.StartTransaction;
        DM.REGISTR.Post;

выделенное: лишнее и криминально-неправильное.
надо или выкинуть, либо заменить на Self.
Evgen2010
Дата: 13.05.2011 10:42:20
defecator,

Да, правильно поняли, DM - DataModule. Использую FIBPlus. Я думал, что Append, Post и т.п. вызывают SQL коды (UpdateSQL, InsertSQL и т.д.), прописанные в свойствах датасета.
defecator
Дата: 13.05.2011 10:52:10
Кроик Семён
defecator,

procedure TDM.DoUpdateRegistr ;
begin
   try
     try
        DM.REGISTR.UpdateTransaction.StartTransaction;
        DM.REGISTR.Post;

выделенное: лишнее и криминально-неправильное.
надо или выкинуть, либо заменить на Self.


Конечно выкинуть. Это я копипастил и не вычистил
defecator
Дата: 13.05.2011 10:53:10
Evgen2010
defecator,

Да, правильно поняли, DM - DataModule. Использую FIBPlus. Я думал, что Append, Post и т.п. вызывают SQL коды (UpdateSQL, InsertSQL и т.д.), прописанные в свойствах датасета.


Ха ! Вот мы и узнали, кто скрывается под ником "lbl"

А под своим ником что, стыдно было вопрос задать ?
Evgen2010
Дата: 13.05.2011 11:02:26
defecator,

Нет не стыдно. Просто, если долго не растекаться мыслью по древу, скажу, что не разлогинился, когда в соседнюю ветку писал. lbl такой код взял у меня. Мне-то пофиг на код, это lbl у нас в программисты метит.
Ramin Hashimzade
Дата: 13.05.2011 11:18:42
такие вещи делают на стороне СУБД.
Johnmen
Дата: 13.05.2011 11:28:28
Ramin
такие вещи делают на стороне СУБД.

Какие "такие"?
И что это за "сторона СУБД"?
Ramin Hashimzade
Дата: 13.05.2011 11:33:43
Johnmen
Ramin
такие вещи делают на стороне СУБД.

Какие "такие"?
И что это за "сторона СУБД"?

на строне СУБД тоесть например написать процедуру апдейта что то такое :

create or replace myproc(p1....)
begin
   update.... p1 ... where ...
   exception
      when others....
       Raise_application_error
       rollback...
end;