Q&A

  • DBGrid에서 지정 삭제하기
안녕하세요 고수님

새해 복 많이 받으세요..

며칠째 고민하고 물어도 보고 했는데 답이아나오네요..

전에도 한번 질문을 오렸는데 잘 안되네요…



DB : Paradox7, DBGrid사용, 버전 : 델파이 5



아래와 같이 프로그램을 했는데 장비이력을 등록 할 때는 잘 됩니다.

그런데 사용자가 지정한 이력을 삭제 할려고 하면 여러 개의 이력중에

첫번째로 등록된 이력이 먼저 삭제됩니다.

즉 지정한것과는 상관없이 등록된 순서에 따라 삭제된다는 거죠..

우찌 해야 할지 모르겠네요..고수님들의 도움을 부탁드립니다.



참고로 삭제 Procedure에서 Tabla1.Open;을 지워봤는데 에러가 뜨네요..

혹 Procedure 문제가 아닐 수 도 있다는 생각이 들긴 하는데 잘 모라서...히히히



즐거운 프로그램 하시고 새해 복 많이 받으세요…







//장비이력을 등록하는 이벤트(popup Menu)

procedure TForm1.N8Click(Sender: TObject);



var

CurDate : TDateTime;

Year, Month, Day, Hour, Min, Sec, MSec: Word;

StrID : string;



begin

CurDate := Now;

DecodeDate(CurDate, Year, Month, Day);

DecodeTime(CurDate, Hour, Min, Sec, MSec);

StrID := IntToStr(Year) + IntToStr(Month) + IntToStr(Day) +

IntToStr(Hour) + IntToStr(Min) + IntToStr(Sec);

Table1.Open;

Table1.Append;

if Form3.ShowModal = mrOK then

if Form1.Table1.FieldByName('SuperNo').Asstring ='' then

showmessage('관리번호를 입력 하세요')

else begin

Table1.FieldByName('id').AsString := StrID

end;

Table1.Post;

Query1.Close;

Query1.Open;

Table1.Close;

end;



// 등록된 이력을 삭제하는 이벤트 Procedure (Popup Menu)

procedure TForm1.N9Click(Sender: TObject);

begin

if Query1.FieldByName('Id').AsString = '' then exit;

if MessageDlg('확실합니까?',mtConfirmation, mbOKCanCel, 0) = mrOK then

begin

Table1.Open; // 맨 마지막 행을 지정한다는 말이 있어 지워봤는데

// Error가 뜹니다.

Table1.Delete;

Query1.Close;

Query1.Open;

end;



end;



1  COMMENTS
  • Profile
    2001.01.29 23:21
    아기코알라 wrote:

    > 안녕하세요 고수님

    > 새해 복 많이 받으세요..

    > 며칠째 고민하고 물어도 보고 했는데 답이아나오네요..

    > 전에도 한번 질문을 오렸는데 잘 안되네요…

    >

    > DB : Paradox7, DBGrid사용, 버전 : 델파이 5

    >

    > 아래와 같이 프로그램을 했는데 장비이력을 등록 할 때는 잘 됩니다.

    > 그런데 사용자가 지정한 이력을 삭제 할려고 하면 여러 개의 이력중에

    > 첫번째로 등록된 이력이 먼저 삭제됩니다.

    > 즉 지정한것과는 상관없이 등록된 순서에 따라 삭제된다는 거죠..

    > 우찌 해야 할지 모르겠네요..고수님들의 도움을 부탁드립니다.

    >

    > 참고로 삭제 Procedure에서 Tabla1.Open;을 지워봤는데 에러가 뜨네요..

    > 혹 Procedure 문제가 아닐 수 도 있다는 생각이 들긴 하는데 잘 모라서...히히히

    >

    > 즐거운 프로그램 하시고 새해 복 많이 받으세요…

    >

    >

    >

    > //장비이력을 등록하는 이벤트(popup Menu)

    > procedure TForm1.N8Click(Sender: TObject);

    >

    > var

    > CurDate : TDateTime;

    > Year, Month, Day, Hour, Min, Sec, MSec: Word;

    > StrID : string;

    >

    > begin

    > CurDate := Now;

    > DecodeDate(CurDate, Year, Month, Day);

    > DecodeTime(CurDate, Hour, Min, Sec, MSec);

    > StrID := IntToStr(Year) + IntToStr(Month) + IntToStr(Day) +

    > IntToStr(Hour) + IntToStr(Min) + IntToStr(Sec);

    > Table1.Open;

    > Table1.Append;

    > if Form3.ShowModal = mrOK then

    > if Form1.Table1.FieldByName('SuperNo').Asstring ='' then

    > showmessage('관리번호를 입력 하세요')

    > else begin

    > Table1.FieldByName('id').AsString := StrID

    > end;

    > Table1.Post;

    > Query1.Close;

    > Query1.Open;

    > Table1.Close;

    > end;

    >

    > // 등록된 이력을 삭제하는 이벤트 Procedure (Popup Menu)

    > procedure TForm1.N9Click(Sender: TObject);

    > begin

    > if Query1.FieldByName('Id').AsString = '' then exit;

    > if MessageDlg('확실합니까?',mtConfirmation, mbOKCanCel, 0) = mrOK then

    > begin

    > Table1.Open; // 맨 마지막 행을 지정한다는 말이 있어 지워봤는데

    > // Error가 뜹니다.

    > Table1.Delete;

    > Query1.Close;

    > Query1.Open;

    > end;

    >

    > end;

    >



    ----------------------------------------------------------------------------------

    답변

    ----------------------------------------------------------------------------------

    - DBGRID에서 테이블과 TABLE1을 이용한 테이블이 같다면

    TABLE1.OPEN;

    TABLE1.LOCATE(필드명, 값); //또는 FIND문을 이용해서 선택된 레코드로 이동후 삭제



    - 참고로 TABLE을 이용한 삽입이나 삭제는 참 어리석은 짓입니다.

    만약 등록된 데이타가 많다면 TABLE오픈시 ALL SELECT 하기되면에 많은 시간이

    지체됨(트라젝션이나 롤백시 테이블을 이용하면 불가능)

    - 쿼리 컴퍼넌트를 이용해서 DBGRID를 이용시는 UpdateSQL 컴퍼넌트를 이용하세요

    참편하게 코딩을 할수가 있습니다.

    - 마지막으로 가장많이 쓰는 방법은 쿼리를 이용해서 SQL문을 날려서 삭제나 삽입하는

    방법이 가장 안전한 방법입니다......



    열심히 해보시요.........노력하는 모습이 보이것같군요^_^