Q&A

  • 인서트와 업데이트의 차이 ? ?
제가 인서트와 업데이트의 차이점을 모르겠습니다.

무슨 말이냐면요.

그리드에서 데이타를 인서트 하고 난후  저장한다음.
인서트된 레코드를 수정하면. .  

record not found or change another user!!!

데이타 셋의 OnReconcileError 이벤트에서 위와 같은 메세지를 뿌리면서 업데이트가 되지 않습니다.
무슨 이유일까요 ?

근데. .신기한것은  기존에 저장되어 잇는 레코드에 대한 수정은 아무런 에러가 없거든요.

인서트 한후, applyupdate 하면 기존 저장되어 잇는 레코드랑 뭐가 틀린지.. ..

신기하게. . 인서트 한 레코드의 수정은 되지 않네요.
수정할라면. .다시 dataset 를 재 오픈( close, open) 을 해야지 수정할수가 잇네요.

무슨 이유 일까요 ?

아시는 분 답변 부탁드립니다.
아래는 제 저장 관련 소스입니다.



procedure Tmst1020pro.mstdpt_save;
begin
  with dm.mstdpt do
  begin
     if (ChangeCount > 0) then
     begin
        try
           ApplyUpdates(-1);
            
          
           except
           on E: EDatabaseError do
              ShowMessage('Database Apply Update Error - ' + E.Message);
        end;
     end;
  end;


end;


// 아래는 데이타셋의 OnReconcileError 이벤트 처리입니다.

procedure Tdm.mstdptReconcileError(DataSet: TCustomClientDataSet;
  E: EReconcileError; UpdateKind: TUpdateKind;
  var Action: TReconcileAction);
begin
  showmessage(e.Message);
  Action := raCancel;
end;
3  COMMENTS
  • Profile
    이희진 2003.08.27 23:02
    테이블의 필드 중에서 디폴트 값을 가지고 있는 필드가 있을 가능성이 매우 높습니다.
    그리드 상에서 인서트 해서 저장을 하면, 그리드 상에서는 디폴트 값을 가진 필드의 값은 널이죠.
    하지만, 디비에 저장되는 순간, 디비에는 필드의 디폴트값이 들어갑니다.
    이렇게 아무 처리를 해주지 않았다면, 디비와 그리드의 값은 틀려지는 겁니다.
    다시 불러와서 에디트 하면, 당연히 될 수 밖에 없구요...

    디비에서 필드 디폴트 값을 없애시던가, 인서트와 동시에 디폴트 값을 생성시켜주는 것이 방법이겠습니다. ^^
  • Profile
    김찬용 2003.08.28 00:07
    정말 감사드립니다.
    데이타 베이스의 디자인(디폴트값)을 지우니깐. 이 문제가 발행하지 않는군요.

    저는 이것도 모르고.. . ㅜㅜ

    정말 정말 감사드립니다.



  • Profile
    장태원 2003.08.27 22:35
    Database 가 무언지요?
    또 TDatabase 를 사용하신다면 Transaction 문장을 추가해보시던가요.
    또 아니면..
    TTable 의 Afterpost 이벤트에 table.close; table.open;  를 사용해보시던지요.