안녕하세요 고수님
새해 복 많이 받으세요..
며칠째 고민하고 물어도 보고 했는데 답이아나오네요..
전에도 한번 질문을 오렸는데 잘 안되네요…
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;
> 안녕하세요 고수님
> 새해 복 많이 받으세요..
> 며칠째 고민하고 물어도 보고 했는데 답이아나오네요..
> 전에도 한번 질문을 오렸는데 잘 안되네요…
>
> 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문을 날려서 삭제나 삽입하는
방법이 가장 안전한 방법입니다......
열심히 해보시요.........노력하는 모습이 보이것같군요^_^