Q&A

  • 밑의 UpdateSQL 에러
>>Query.Edit
>>를 명시를 하고 ApplyUpdate 할때 Key Violation 오류가 떠버립니다.
>>물론 키로잡힌 필드의 값은 모두 넣어 줬구요...
>>아무래도 Edit가 아닌 Insert가 되는게 아닌지 모르겠네요...
>>이럴땐 상태를 체크해봐야하나요? 현제 State를?
>

답변해 주셔서 감사합니다.

우선 state를 체크해 본 결과 sdEdit로 정확히 되구요...
아무래도 키값이 중복되서 저장되는것 같습니다.
updateSql의 modifySQL을 확인해 보면

update baej
set
  BAEJ_YEAR = :BAEJ_YEAR,                <--- 키
  BAEJ_BUSEO = :BAEJ_BUSEO,            <---키
  BAEJ_YO_DATE = :BAEJ_YO_DATE,
  BAEJ_YO_NO = :BAEJ_YO_NO,
  BAEJ_BAE_DATE = :BAEJ_BAE_DATE,  <---키
  BAEJ_BAE_NO = :BAEJ_BAE_NO,         <---키
  BAEJ_BAE_AMT = :BAEJ_BAE_AMT,
  BAEJ_BIGO = :BAEJ_BIGO,
where
  BAEJ_YEAR = :OLD_BAEJ_YEAR and
  BAEJ_BUSEO = :OLD_BAEJ_BUSEO and
  BAEJ_BAE_DATE = :OLD_BAEJ_BAE_DATE and
  BAEJ_BAE_NO = :OLD_BAEJ_BAE_NO

이렇게 나타납니다.

소스 안에서는

QrInsert.Edit
With QrInsert do
begin
   try
     FieldByName('BAEJ_YEAR').AsInteger      := StrToInt(YearEdit.Text);
     FieldByName('BAEJ_BUSEO').AsString      := BuseoEdit.Text;
     FieldByName('BAEJ_YO_DATE').AsString    := YoDateMask.Text;
     FieldByName('BAEJ_YO_NO').AsInteger     := YoguSpin.Value;
     FieldByName('BAEJ_BAE_DATE').AsString   := BaeDateMask.Text;
     FieldByName('BAEJ_BAE_NO').AsInteger    := BaeNoSpin.Value;
     FieldByName('BAEJ_BAE_AMT').AsFloat     := GmBaeNum.Value
     FieldByName('BAEJ_BIGO').AsString       := BigoEdit.Text;
     Post;
     ApplyUpdates;
     CommitUpdates;
   except
     on e:EDBEngineError do
     begin
        CancelUpdates;
        exit;
     end;
   end;
end;

이런식으로 코딩했습니다.

테스트 하는데 이상한 점을 발견했는데
프로그램에서 바로 입력한 후 수정시에는 정상적으로 수정이 되는데
종료후 다시실행하여 수정할경우 Key Violation 에러가 나타납니다
3  COMMENTS
  • Profile
    김경록 2002.05.14 09:17
    아마도.. 님께서 하신 코딩을 보면..
    Post를 2번 타지 않을까 합니다..

    제가 알기로는 AfterPost 이벤트에서
    Query1.Database.ApplyUpdates([Query1]);
    을 해 놓아..
    해당 Record를 즉시 기록하면..
    또한 그 내용을 갱신하는걸로 알고 있습니다..

    님이 하신 코딩에 보면..
    Post후에
    ApplyUpdate;
    CommitUpdate를 하셨는데여..
    한번 체크해 보세여..

    Post이벤트를 몇번 타는지..
    아마도 2번 타서..
    하나는 Insert로 되기때문에..
    Key Violation이 날 겁니다..
    답이 되셨길..





  • Profile
    KDDG_ZZOM 2002.05.13 23:47
    프라이머리키를 업데이트시키면 중복이 나올수도 있지만...
    update baej set
      BAEJ_YEAR        = :BAEJ_YEAR,                <--- 키
      BAEJ_BUSEO      = :BAEJ_BUSEO,            <---키
      BAEJ_YO_DATE   = :BAEJ_YO_DATE,
      BAEJ_YO_NO      = :BAEJ_YO_NO,
      BAEJ_BAE_DATE = :BAEJ_BAE_DATE,  <---키
      BAEJ_BAE_NO     = :BAEJ_BAE_NO,         <---키
      BAEJ_BAE_AMT   = :BAEJ_BAE_AMT,
      BAEJ_BIGO          = :BAEJ_BIGO,
    맨뒤에
      BAEJ_BIGO          = :BAEJ_BIGO,
    요기서 , 빼야될것같은데... 잘못본건가???

  • Profile
    김경남 2002.05.14 01:25
    그건 저의 오타네요 ^^;;