Q&A

  • TTable의 수정시 Edit;--> Post;아닌가요??
복잡하고, 어려운게 에러가 나면 이해나하겠는데,,

아주 간단한것 같은데 안되니..
아직도 내공이 초짜이다 보니...환장하겠습니다...


TabSheet(tcBookStore)내에서...수정탭(TabIndex=2)을 눌렀을때
왜 데이터가 수정이 안되지요??

입력탭에서 입력하는 것은 잘됩니다만,,,

아래처럼 수정할려면
Edit;
FieldbyName('....

Post;

하면 되는 거 아닌가요?
실행해보면,
ShowMessage('수정작업이 성공적으로 완료되었습니다');은 실행되는데,
왜 데이터는 업데이트가 안되는건지...

아무리 봐도 원인을 알 수가 없어서..
도움을 청합니다..





<!--CodeS-->
procedure TfrmBookStore.btnSaveClick(Sender: TObject);
var
  BSID: Integer;
begin
  case tcBookStore.TabIndex of
    1:begin // 입력
      if(edtBSContact.Text = '') and (edtBSName.Text ='') then begin
        ShowMessage('담당자와 서점명을 반드시 입력해야 합니다');
        exit;
      end;
      if not tblBookStore.Active then tblBookStore.Open;
      if tblBookStore.EOF then BSID := 1
      else begin
        tblBookStore.Last;
        BSID := tblBookStore.FieldByName('BSID').AsInteger + 1;
      end;

      try
        with tblBookStore do begin
          Insert;
          FieldByName('BSID').AsInteger := BSID;
          FieldByName('BSName').AsString := edtBSName.Text;
          FieldByName('BSContact').AsString := edtBSContact.Text;
          FieldByName('BSAddr1').AsString := edtBSAddr1.Text;
          FieldByName('BSAddr2').AsString := edtBSAddr2.Text;
          FieldByName('BSPost').AsString := Copy(meBSPost.Text,1,3)+Copy(meBSPost.Text,5,3);
          FieldByName('BSTel').AsString := edtBSTel.Text;
          FieldByName('BSEmail').AsString := edtBSEmail.Text;
          FieldByName('Etc').AsString := memEtc.Text;
          Post;
        end;//with
        ShowMessage('입력작업이 성공적으로 완료되었습니다');
        tblBookStore.Refresh; // 테이블의 Refresh메쏘드는 PK칼럼이 있는 테이블이어야 함.
      except
        ShowMessage('입력작업 중 에러 발생!!');
      end;

    end;

    2:begin // 수정
      try
        with tblBookStore do begin
          Edit;
          FieldByName('BSID').AsInteger := StrToInt(edtBSID.text);
          FieldByName('BSName').AsString := edtBSName.Text;
          FieldByName('BSContact').AsString := edtBSContact.Text;
          FieldByName('BSAddr1').AsString := edtBSAddr1.Text;
          FieldByName('BSAddr2').AsString := edtBSAddr2.Text;
          FieldByName('BSPost').AsString := Copy(meBSPost.Text,1,3)+Copy(meBSPost.Text,5,3);
          FieldByName('BSTel').AsString := edtBSTel.Text;
          FieldByName('BSEmail').AsString := edtBSEmail.Text;
          FieldByName('Etc').AsString := memEtc.Text;
          Post;

        end;
        ShowMessage('수정작업이 성공적으로 완료되었습니다');
        tblBookStore.Refresh;
      except on E: EDatabaseError do begin
        ShowMessage('수정작업 중 에러 발생!'+#13#10+E.Message);
        end;

      end;


    end;
  end; //case

end;
<!--CodeE-->
6  COMMENTS
  • Profile
    여수장우중문詩 2005.03.30 01:14
    원인분석이야 맞는지 안맞는 지 모르겠지만,,
    하여튼,,사후결과로 나타난 것으로는..

    실제 데이타베이스가 인터베이스 7.1이고,,
    이를 델파이에서 BDE의 TTable컴포넌트를 사용해서 하니...

    레코드삽입과..수정이 잘 안된다는 것입니다...

    Post;다음에..ApplyUPdates를 해도 안되고.
    CachedUPdates속성을 True로 해도..잘 안되고..


    해서..
    원래의 인터베이스용 컴포인.. 인터베이스 컴포넌트를 연결해서..
    TIBDatabase와  TIBTransaction, TIBTable을 해서 하니 제대로 되는군요...

    하여튼 이거하느라 하루삽질하고 느낀것은...

    "삽질도 센스가 필요하다"인 것입니다.

    원래되는것인데,,제가 제대로못한것인지는 몰라도..
    원래의 Interbase의 연결을 위해 델파이이에서 Interbase컴포넌트를 제공하는데,
    구태여..원래의 하던식대로...BDE를 고집할 필요는 없었는데...말입니다..

    과감하게..새로운것을 받아들여야 하는데,,
    하던식대로 BDE고집하다...책보기 삽질로 .Interbase를 사용하면 되는 것ㅇ르....


    쩝...
    "삽질도 돌아봐야할 필요가 있다"....

  • Profile
    김상경 2005.03.29 01:17
    혹시 cashedupdate 속성이 True 인가요?
  • Profile
    여수장우중문詩 2005.03.29 02:16


    TTable인  tblBookStore가...
    CachedUpdate => False,
    AutoRefresh = > True
    UpdateMode=> upWhereAll
    로 돼 있습니다
  • Profile
    Crazy™ 2005.03.29 06:30
    CachedUpdate => tRUE 로 바꾸시고
    POST 다음 WITH  문 바로 끝나기전에 COMMIT 을 해보세요.

  • Profile
    여수장우중문詩 2005.03.29 21:02



    디비는 Interbase
    BDE로 연결했습니다.

    그런대ㅔ,,
    인서트도 인서트된것이 아니었더군요..화면에서는 인서트된것으로 나오는데,
    디비에는 없습니다.
    그런데,
    INsert는 Post다음에 ApplyUpdates;를 추가하니..잘되는데요....

    Edit는 Post다음에 ApplyUpdates;를 추가해도 안되네요..
    CommitUpdates;도 안되고..
    왜 Update가 이리 문제가 있는건지....
  • Profile
    아폴론 2005.03.30 00:20
    수정을 하면 키값을 알아야 겠죠?
    위의 스스에는 수정을 하긴 하는데 어떤 레코드를 수정 할지 모르네요
    sqL의 where 절이 없군요
    Table이니까 FindKey 가 없네요...